swingx-master/swingx-demos/swingx-demos-content/src/main/java/org/jdesktop/swingx/demos/search/Contributors.java
/*
 * Created on 06.12.2008
 *
 */
package org.jdesktop.swingx.demos.search;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import javax.swing.AbstractListModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ListModel;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;

import org.jdesktop.swingx.treetable.NodeModel;
import org.jdesktop.swingx.treetable.TreeTableNode;



public class Contributors {

    private String dataSource = "resources/contributors.txt";
    private List<Contributor> contributors;
    private ListModel listModel;
    private TableModel tableModel;
    private DefaultMutableTreeNode rootNode;
    private NodeModel contributorNodeModel;
    private int columnCount;

    public Contributors() {
        this(4);
    }
    
    public Contributors(int columnCount) {
        this.columnCount = columnCount;
        try {
            initData();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public TableModel getTableModel() {
        return tableModel;
    }
    
    public ListModel getListModel() {
        return listModel;
    }
    
    public TreeNode getRootNode() {
        return rootNode;
    }
    
    public static List<Contributor> getContributors() {
        return new Contributors().contributors;
    }
    
    public static ListModel getContributorListModel() {
        List<Contributor> list = getContributors();
        DefaultComboBoxModel model = new DefaultComboBoxModel();
        for (Contributor contributor : list) {
            model.addElement(contributor);
        }
        return model;
    }
    
    /**
     * Create and fill a list of contributors from a resource and 
     * wrap view models around.
     * @throws IOException 
     * 
     */
    private void initData() throws IOException {
        contributors = new ArrayList<Contributor>();
        // fill the list from the resources
        readDataSource(contributors);
        // wrap a listModel around
        listModel = new AbstractListModel() {
            
            public Object getElementAt(int index) {
                if (index == 0) {
                    return "-- Contributors --";
                }
                return contributors.get(index - 1);
            }
            
            public int getSize() {
                return contributors.size() + 1;
            }
            
        };

        
        // create NodeModel: returns a Contributor for each column
        contributorNodeModel = new NodeModel() {
            public int getColumnCount() {
                // defined on init
                return columnCount;
            }
            public Class<?> getColumnClass(int columnIndex) {
                return Contributor.class;
            }
            
            public String getColumnName(int column) {
                return "Display " + column;
            }
            
            public boolean isCellEditable(Object node, int columnIndex) {
                return false;
            }
            
            public Object getValueAt(Object node, int columnIndex) {
                return getContributor(node);
            }
            
            private Contributor getContributor(Object node) {
                if (node instanceof DefaultMutableTreeNode) {
                    node = ((DefaultMutableTreeNode) node).getUserObject();
                } else if (node instanceof TreeTableNode) {
                    node =  ((TreeTableNode) node).getUserObject();
                }
                return (node instanceof Contributor) ? (Contributor) node : null;
            }
            
            public int getHierarchicalColumn() {
                return 0;
            }
            public void setValueAt(Object value, Object node, int column) {
                // noop - not editable
            }
            
            
        };
        // wrap a TableModel around
        tableModel = new AbstractTableModel() {
            
            public int getColumnCount() {
                return contributorNodeModel.getColumnCount();
            }
            
            public int getRowCount() {
                return contributors.size();
            }
            
            public Object getValueAt(int rowIndex, int columnIndex) {
                return contributorNodeModel.getValueAt(contributors.get(rowIndex), columnIndex);
            }
            
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                return contributorNodeModel.getColumnClass(columnIndex);
            }
            
            @Override
            public String getColumnName(int column) {
                return contributorNodeModel.getColumnName(column);
            }
            
            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return false;
            }
            
            
        };
        // fill DefaultTreeNodes with the elements 
        rootNode = new DefaultMutableTreeNode("Contributors");
        for (int i = 0; i < contributors.size(); i++) {
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(contributors.get(i));
            rootNode.add(node);
        }
        
    }
    
    private void readDataSource(List<Contributor> list) throws IOException {
        InputStream is = getClass().getResourceAsStream(dataSource);
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        String line;
        try {
            while ((line = reader.readLine()) != null) {
                list.add(new Contributor(line));
            }
        } finally {
            // do our best to close
            reader.close();
        }
    }

    public NodeModel getContributorNodeModel() {
        return contributorNodeModel;
        
    }

}
