Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   *
   * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
   *
   * The contents of this file are subject to the terms of either the GNU
   * General Public License Version 2 only ("GPL") or the Common
   * Development and Distribution License("CDDL") (collectively, the
   * "License"). You may not use this file except in compliance with the
  * License. You can obtain a copy of the License at
  * http://www.netbeans.org/cddl-gplv2.html
  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
  * specific language governing permissions and limitations under the
  * License.  When distributing the software, include this License Header
  * Notice in each file and include the License file at
  * nbbuild/licenses/CDDL-GPL-2-CP.  Sun designates this
  * particular file as subject to the "Classpath" exception as provided
  * by Sun in the GPL Version 2 section of the License file that
  * accompanied this code. If applicable, add the following below the
  * License Header, with the fields enclosed by brackets [] replaced by
  * your own identifying information:
  * "Portions Copyrighted [year] [name of copyright owner]"
  *
  * If you wish your version of this file to be governed by only the CDDL
  * or only the GPL Version 2, indicate your decision by adding
  * "[Contributor] elects to include this software in this distribution
  * under the [CDDL or GPL Version 2] license." If you do not indicate a
  * single choice of license, a recipient has the option to distribute
  * your version of this file under either the CDDL, the GPL Version 2 or
  * to extend the choice of license to its licensees as provided above.
  * However, if you add GPL Version 2 code and therefore, elected the GPL
  * Version 2 license, then the option applies only if the new code is
  * made subject to such option by the copyright holder.
  *
  * Contributor(s):
  *
  * Portions Copyrighted 2009 Sun Microsystems, Inc.
  */
 
 package org.netbeans.modules.kenai.ui.treelist;
 
 import java.util.List;
List model which allows adding and removing of nodes to simulate tree-like expand/collapse actions.

Author(s):
S. Aubrecht
 
 public class TreeListModel extends AbstractListModel implements TreeListListener {
 
     private final ArrayList<TreeListNodenodes = new ArrayList<TreeListNode>(500);
 
     public int getSize() {
         synchronized ) {
             return .size();
         }
     }
 
     public Object getElementAt(int index) {
         synchronized ) {
             ifindex < 0 || index >= .size() )
                 return null;
             return .get(index);
         }
     }

    
Add given node at root position. If the node is expanded then its children are also added to the model.

Parameters:
index Index into the list of all current nodes (including non-root ones).
root Node to be added
 
     public void addRootint indexTreeListNode root ) {
         int firstIndex = -1;
         int lastIndex = -1;
         synchronized ) {
             ifindex < 0 || index >= .size() )
                 .add(root);
             else
                 .add(indexroot);
             int parentIndex = .indexOf(root);
             firstIndex = parentIndex;
             ifroot.isExpanded() )
                 lastIndex = addNodesparentIndex+1, root.getChildren() )-1;
             root.setListener(this);
         }
         iffirstIndex >= 0 ) {
             iflastIndex < firstIndex )
                 lastIndex = firstIndex;
             fireIntervalAdded(thisfirstIndexlastIndex);
         }
     }

    
Remove given node from the model, also removes all its children.

Parameters:
root
    public void removeRootTreeListNode root ) {
        int firstIndex = -1;
        int lastIndex = -1;
        synchronized ) {
            firstIndex = .indexOf(root);
            iffirstIndex < 0 ) {
                root.dispose();
                return;
            }
            ArrayList<TreeListNodetoRemove = findDescendantsroot );
            ifnull == toRemove ) {
                toRemove = new ArrayList<TreeListNode>(1);
            }
            toRemove.add(0, root);
            lastIndex = .indexOf(toRemove.get(toRemove.size()-1));
            forTreeListNode node : toRemove ) {
                node.dispose();
            }
            .removeAll(toRemove);
        }
        iffirstIndex >= 0 ) {
            fireIntervalRemoved(thisfirstIndexlastIndex);
        }
    }

    
Remove all nodes from the model.
    public void clear() {
        synchronized ) {
            forTreeListNode node :  ) {
                node.dispose();
            }
            .clear();
        }
        fireIntervalRemoved(this, 0, -1);
    }

    

Returns:
List of root nodes.
    public List<TreeListNodegetRootNodes() {
        ArrayList<TreeListNoderes = new ArrayList<TreeListNode>(getSize());
        synchronized ) {
            forTreeListNode n :  ) {
                ifnull == n.getParent() )
                    res.add(n);
            }
        }
        return res;
    }
    private void removeChildrenOfTreeListNode parent ) {
        int firstIndex = -1;
        int lastIndex = -1;
        synchronized ) {
            ArrayList<TreeListNodetoRemove = findDescendantsparent );
            ifnull == toRemove )
                return;
            firstIndex = .indexOf(toRemove.get(0));
            lastIndex = .indexOf(toRemove.get(toRemove.size()-1));
            forTreeListNode node : toRemove ) {
                node.dispose();
            }
            .removeAll(toRemove);
        }
        iffirstIndex >= 0 ) {
            fireIntervalRemoved(thisfirstIndexlastIndex);
        }
    }
    private ArrayList<TreeListNodefindDescendantsTreeListNode parent ) {
        ArrayList<TreeListNodedescendants = null;
        int parentIndex = .indexOf(parent);
        ifparentIndex < 0 )
            return null//nothing to remove
        forint i=parentIndex+1; i<.size(); i++ ) {
            TreeListNode child = .get(i);
            ifchild.isDescendantOfparent ) ) {
                ifnull == descendants )
                    descendants = new ArrayList<TreeListNode>(20);
                descendants.add(child);
            } else {
                break;
            }
        }
        return descendants;
    }
    private void addChildrenOfTreeListNode parent ) {
        int firstIndex = -1;
        int lastIndex = -1;
        synchronized ) {
            firstIndex = .indexOf(parent);
            iffirstIndex < 0 )
                return//the parent isn't visible in the model, so don't bother
            firstIndex++;
            lastIndex = addNodesfirstIndexparent.getChildren() )-1;
        }
        iffirstIndex >= 0 ) {
            iflastIndex < firstIndex )
                lastIndex = firstIndex;
            fireIntervalAdded(thisfirstIndexlastIndex);
        }
    }
    private int addNodes(int insertPointList<TreeListNodenewNodes) {
        forint i=0; i<newNodes.size(); i++ ) {
            TreeListNode node = newNodes.get(i);
            if.contains(node) )
                continue;
            node.setListener(this);
            .add(insertPoint++, node);
            ifnode.isExpanded() ) {
                insertPoint = addNodes(insertPointnode.getChildren());
            }
        }
        return insertPoint;
    }
    public void childrenRemoved(TreeListNode parent) {
        removeChildrenOf(parent);
    }
    public void childrenAdded(TreeListNode parent) {
        addChildrenOf(parent);
    }
    public void contentChanged(TreeListNode node) {
        int index = -1;
        synchronized ) {
            index = .indexOf(node);
        }
        ifindex >= 0 ) {
            fireContentsChanged(thisindexindex);
        }
    }
    @Override
    protected void fireContentsChanged(final Object sourcefinal int index0final int index1) {
        if( !SwingUtilities.isEventDispatchThread() ) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    TreeListModel.super.fireContentsChanged(sourceindex0index1);
                }
            });
        } else {
            super.fireContentsChanged(sourceindex0index1);
        }
    }
    @Override
    protected void fireIntervalAdded(final Object sourcefinal int index0final int index1) {
        if( !SwingUtilities.isEventDispatchThread() ) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    TreeListModel.super.fireIntervalAdded(sourceindex0index1);
                }
            });
        } else {
            super.fireIntervalAdded(sourceindex0index1);
        }
    }
    @Override
    protected void fireIntervalRemoved(final Object sourcefinal int index0final int index1) {
        if( !SwingUtilities.isEventDispatchThread() ) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    TreeListModel.super.fireIntervalRemoved(sourceindex0index1);
                }
            });
        } else {
            super.fireIntervalRemoved(sourceindex0index1);
        }
    }
New to GrepCode? Check out our FAQ X