diff -r 56bcd6cdfc36 spi.viewmodel/apichanges.xml --- a/spi.viewmodel/apichanges.xml Thu May 29 16:35:41 2008 +0400 +++ b/spi.viewmodel/apichanges.xml Fri May 30 16:36:15 2008 +0200 @@ -267,6 +267,38 @@ made subject to such option by the copyr + + + Extension to NodeModel. + + + + + + This API change is necessary for the redesign of the debugger UI and + to be able to better control node expansions. +

+ Added classes:
+ org.netbeans.spi.viewmodel.TreeExpansionModelFilter +

+

+ Changed classes:
+ Models.TreeFeatures - final class with a private + constructor changed to an interface. +

+

+ Added methods:
+ Models.createNodes(), +

+

+ Added fields:
+ ModelEvent.EXPANSION_MASK +

+
+ + + +
diff -r 56bcd6cdfc36 spi.viewmodel/manifest.mf --- a/spi.viewmodel/manifest.mf Thu May 29 16:35:41 2008 +0400 +++ b/spi.viewmodel/manifest.mf Fri May 30 16:36:15 2008 +0200 @@ -1,5 +1,5 @@ Manifest-Version: 1.0 Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.spi.viewmodel/2 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/viewmodel/Bundle.properties -OpenIDE-Module-Specification-Version: 1.14 +OpenIDE-Module-Specification-Version: 1.15 diff -r 56bcd6cdfc36 spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java --- a/spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java Thu May 29 16:35:41 2008 +0400 +++ b/spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java Fri May 30 16:36:15 2008 +0200 @@ -65,6 +65,7 @@ import org.netbeans.spi.viewmodel.Column import org.netbeans.spi.viewmodel.ColumnModel; import org.netbeans.spi.viewmodel.ModelEvent; import org.netbeans.spi.viewmodel.Models; +import org.netbeans.spi.viewmodel.Models.TreeFeatures; import org.netbeans.spi.viewmodel.TreeModel; import org.netbeans.spi.viewmodel.UnknownTypeException; import org.openide.ErrorManager; @@ -318,6 +319,7 @@ public class TreeModelNode extends Abstr refresh(); return ; } + boolean refreshed = false; if ((ModelEvent.NodeChanged.DISPLAY_NAME_MASK & changeMask) != 0) { try { String name = model.getDisplayName (object); @@ -334,7 +336,9 @@ public class TreeModelNode extends Abstr Throwable t = ErrorManager.getDefault().annotate(e, "Model: "+model); ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, t); } - } else if ((ModelEvent.NodeChanged.ICON_MASK & changeMask) != 0) { + refreshed = true; + } + if ((ModelEvent.NodeChanged.ICON_MASK & changeMask) != 0) { try { String iconBase = model.getIconBaseWithExtension (object); if (iconBase != null) @@ -345,15 +349,28 @@ public class TreeModelNode extends Abstr Throwable t = ErrorManager.getDefault().annotate(e, "Model: "+model); ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, t); } - } else if ((ModelEvent.NodeChanged.SHORT_DESCRIPTION_MASK & changeMask) != 0) { + refreshed = true; + } + if ((ModelEvent.NodeChanged.SHORT_DESCRIPTION_MASK & changeMask) != 0) { fireShortDescriptionChange(null, null); - } else if ((ModelEvent.NodeChanged.CHILDREN_MASK & changeMask) != 0) { + refreshed = true; + } + if ((ModelEvent.NodeChanged.CHILDREN_MASK & changeMask) != 0) { getRequestProcessor ().post (new Runnable () { public void run () { refreshTheChildren(false); } }); - } else { + refreshed = true; + } + if ((ModelEvent.NodeChanged.EXPANSION_MASK & changeMask) != 0) { + SwingUtilities.invokeLater (new Runnable () { + public void run () { + expandIfSetToExpanded(); + } + }); + } + if (!refreshed) { refresh(); } } @@ -646,6 +663,35 @@ public class TreeModelNode extends Abstr } */ + private final void expandIfSetToExpanded() { + try { + DefaultTreeExpansionManager.get(model).setChildrenToActOn(getTreeDepth()); + if (model.isExpanded (object)) { + TreeFeatures treeTable = treeModelRoot.getTreeFeatures (); + if (treeTable != null) { + treeTable.expandNode (object); + } + } + } catch (UnknownTypeException ex) { + } + } + + private Integer depth; + + private Integer getTreeDepth() { + Node p = getParentNode(); + if (p == null) { + return 0; + } else if (depth != null) { + return depth; + } else { + int d = 1; + while ((p = p.getParentNode()) != null) d++; + depth = new Integer(d); + return depth; + } + } + // innerclasses ............................................................ /** Special locals subnodes (children) */ @@ -802,19 +848,23 @@ public class TreeModelNode extends Abstr public void run () { int i, k = ch.length; for (i = 0; i < k; i++) - try { - DefaultTreeExpansionManager.get(model).setChildrenToActOn(getTreeDepth()); - if (model.isExpanded (ch [i])) { - TreeTable treeTable = treeModelRoot.getTreeTable (); - if (treeTable.isExpanded(object)) { - // Expand the child only if the parent is expanded - treeTable.expandNode (ch [i]); - } - } - } catch (UnknownTypeException ex) { - } + expandIfSetToExpanded(ch[i]); } }); + } + + private final void expandIfSetToExpanded(Object child) { + try { + DefaultTreeExpansionManager.get(model).setChildrenToActOn(getTreeDepth()); + if (model.isExpanded (child)) { + TreeFeatures treeTable = treeModelRoot.getTreeFeatures (); + if (treeTable != null && treeTable.isExpanded(object)) { + // Expand the child only if the parent is expanded + treeTable.expandNode (child); + } + } + } catch (UnknownTypeException ex) { + } } private Integer depth; diff -r 56bcd6cdfc36 spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeModelRoot.java --- a/spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeModelRoot.java Thu May 29 16:35:41 2008 +0400 +++ b/spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeModelRoot.java Fri May 30 16:36:15 2008 +0200 @@ -45,14 +45,22 @@ import java.util.HashSet; import java.util.HashSet; import java.util.Iterator; import java.util.WeakHashMap; +import javax.swing.JTree; import javax.swing.SwingUtilities; +import javax.swing.event.TreeExpansionEvent; +import javax.swing.event.TreeExpansionListener; import org.netbeans.spi.viewmodel.Models; import org.netbeans.spi.viewmodel.TreeModel; import org.netbeans.spi.viewmodel.ModelEvent; import org.netbeans.spi.viewmodel.ModelListener; +import org.netbeans.spi.viewmodel.Models.TreeFeatures; +import org.openide.explorer.view.TreeView; +import org.openide.explorer.view.Visualizer; +import org.openide.nodes.Children; import org.openide.nodes.Node; +import org.openide.util.Exceptions; import org.openide.util.HelpCtx; import org.openide.util.RequestProcessor; @@ -72,7 +80,7 @@ public class TreeModelRoot implements Mo private Models.CompoundModel model; private TreeModelNode rootNode; private WeakHashMap> objectToNode = new WeakHashMap>(); - private TreeTable treeTable; + private DefaultTreeFeatures treeFeatures; /** The children evaluator for view if this root. */ private TreeModelNode.LazyEvaluator childrenEvaluator; @@ -80,14 +88,14 @@ public class TreeModelRoot implements Mo private TreeModelNode.LazyEvaluator valuesEvaluator; - public TreeModelRoot (Models.CompoundModel model, TreeTable treeTable) { + public TreeModelRoot (Models.CompoundModel model, TreeView treeView) { this.model = model; - this.treeTable = treeTable; + this.treeFeatures = new DefaultTreeFeatures(treeView); model.addModelListener (this); } - public TreeTable getTreeTable () { - return treeTable; + public TreeFeatures getTreeFeatures () { + return treeFeatures; } public TreeModelNode getRootNode () { @@ -176,10 +184,124 @@ public class TreeModelRoot implements Mo } public void destroy () { - if (model != null) + if (model != null) { model.removeModelListener (this); + treeFeatures.destroy(); + treeFeatures = null; + } model = null; objectToNode = new WeakHashMap>(); } + + /** + * Implements set of tree view features. + */ + private final class DefaultTreeFeatures implements TreeFeatures, TreeExpansionListener { + + private TreeView view; + + private DefaultTreeFeatures (TreeView view) { + this.view = view; + JTree tree; + try { + java.lang.reflect.Field treeField = TreeView.class.getDeclaredField("tree"); + treeField.setAccessible(true); + tree = (JTree) treeField.get(view); + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + return ; + } + tree.addTreeExpansionListener(this); + } + + public void destroy() { + JTree tree; + try { + java.lang.reflect.Field treeField = TreeView.class.getDeclaredField("tree"); + treeField.setAccessible(true); + tree = (JTree) treeField.get(view); + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + return ; + } + tree.removeTreeExpansionListener(this); + } + + /** + * Returns true if given node is expanded. + * + * @param node a node to be checked + * @return true if given node is expanded + */ + public boolean isExpanded ( + Object node + ) { + Node n = findNode (node); + if (n == null) return false; // Something what does not exist is not expanded ;-) + return view.isExpanded (n); + } + + /** + * Expands given list of nodes. + * + * @param node a list of nodes to be expanded + */ + public void expandNode ( + Object node + ) { + Node n = findNode (node); + if (n != null) + view.expandNode (n); + + } + + /** + * Collapses given node. + * + * @param node a node to be expanded + */ + public void collapseNode ( + Object node + ) { + Node n = findNode (node); + if (n != null) + view.collapseNode (n); + } + + /** + * Called whenever an item in the tree has been expanded. + */ + public void treeExpanded (TreeExpansionEvent event) { + model.nodeExpanded (initExpandCollapseNotify(event)); + } + + /** + * Called whenever an item in the tree has been collapsed. + */ + public void treeCollapsed (TreeExpansionEvent event) { + model.nodeCollapsed (initExpandCollapseNotify(event)); + } + + private Object initExpandCollapseNotify(TreeExpansionEvent event) { + Node node = Visualizer.findNode(event.getPath ().getLastPathComponent()); + Object obj = node.getLookup().lookup(Object.class); + Object actOn; + node = node.getParentNode(); + if (node == null) { + actOn = new Integer(0); + } else { + Children ch = node.getChildren(); + if (ch instanceof TreeModelNode.TreeModelChildren) { + actOn = ((TreeModelNode.TreeModelChildren) ch).getTreeDepth(); + } else { + actOn = ch; + } + } + DefaultTreeExpansionManager.get(model).setChildrenToActOn(actOn); + return obj; + } + + } + } diff -r 56bcd6cdfc36 spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeTable.java --- a/spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeTable.java Thu May 29 16:35:41 2008 +0400 +++ b/spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeTable.java Fri May 30 16:36:15 2008 +0200 @@ -100,7 +100,7 @@ import org.openide.windows.TopComponent; * @author Jan Jancura */ public class TreeTable extends JPanel implements -ExplorerManager.Provider, PropertyChangeListener, TreeExpansionListener { +ExplorerManager.Provider, PropertyChangeListener { private ExplorerManager explorerManager; private MyTreeTable treeTable; @@ -121,7 +121,6 @@ ExplorerManager.Provider, PropertyChange treeTable.setHorizontalScrollBarPolicy (JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); add (treeTable, "Center"); //NOI18N - treeTable.getTree ().addTreeExpansionListener (this); ActionMap map = getActionMap(); ExplorerManager manager = getExplorerManager(); map.put(DefaultEditorKit.copyAction, ExplorerUtils.actionCopy(manager)); @@ -151,7 +150,7 @@ ExplorerManager.Provider, PropertyChange // 4) set columns for given model columns = createColumns (model); - currentTreeModelRoot = new TreeModelRoot (model, this); + currentTreeModelRoot = new TreeModelRoot (model, treeTable); TreeModelNode rootNode = currentTreeModelRoot.getRootNode (); getExplorerManager ().setRootContext (rootNode); // The root node must be ready when setting the columns @@ -209,39 +208,6 @@ ExplorerManager.Provider, PropertyChange if (propertyName.equals (ExplorerManager.PROP_SELECTED_NODES)) { tc.setActivatedNodes ((Node[]) evt.getNewValue ()); } - } - - /** - * Called whenever an item in the tree has been expanded. - */ - public void treeExpanded (TreeExpansionEvent event) { - model.nodeExpanded (initExpandCollapseNotify(event)); - } - - /** - * Called whenever an item in the tree has been collapsed. - */ - public void treeCollapsed (TreeExpansionEvent event) { - model.nodeCollapsed (initExpandCollapseNotify(event)); - } - - private Object initExpandCollapseNotify(TreeExpansionEvent event) { - Node node = Visualizer.findNode(event.getPath ().getLastPathComponent()); - Object obj = node.getLookup().lookup(Object.class); - Object actOn; - node = node.getParentNode(); - if (node == null) { - actOn = new Integer(0); - } else { - Children ch = node.getChildren(); - if (ch instanceof TreeModelNode.TreeModelChildren) { - actOn = ((TreeModelNode.TreeModelChildren) ch).getTreeDepth(); - } else { - actOn = ch; - } - } - DefaultTreeExpansionManager.get(model).setChildrenToActOn(actOn); - return obj; } private boolean equalNodes () { diff -r 56bcd6cdfc36 spi.viewmodel/src/org/netbeans/spi/viewmodel/ModelEvent.java --- a/spi.viewmodel/src/org/netbeans/spi/viewmodel/ModelEvent.java Thu May 29 16:35:41 2008 +0400 +++ b/spi.viewmodel/src/org/netbeans/spi/viewmodel/ModelEvent.java Fri May 30 16:36:15 2008 +0200 @@ -156,6 +156,11 @@ public class ModelEvent extends EventObj * @since 1.6 */ public static final int CHILDREN_MASK = 8; + /** + * The mask for expansion change. + * @since 1.15 + */ + public static final int EXPANSION_MASK = 16; private Object node; private int change; diff -r 56bcd6cdfc36 spi.viewmodel/src/org/netbeans/spi/viewmodel/Models.java --- a/spi.viewmodel/src/org/netbeans/spi/viewmodel/Models.java Thu May 29 16:35:41 2008 +0400 +++ b/spi.viewmodel/src/org/netbeans/spi/viewmodel/Models.java Fri May 30 16:36:15 2008 +0200 @@ -65,6 +65,7 @@ import javax.swing.SwingUtilities; import javax.swing.SwingUtilities; import org.netbeans.modules.viewmodel.DefaultTreeExpansionManager; +import org.netbeans.modules.viewmodel.TreeModelRoot; import org.netbeans.modules.viewmodel.TreeTable; import org.netbeans.spi.viewmodel.ColumnModel; @@ -82,6 +83,7 @@ import org.netbeans.spi.viewmodel.Unknow import org.netbeans.spi.viewmodel.UnknownTypeException; import org.openide.ErrorManager; +import org.openide.explorer.view.TreeView; import org.openide.nodes.Node; import org.openide.util.Exceptions; import org.openide.util.WeakSet; @@ -127,6 +129,23 @@ public final class Models { TreeTable tt = new TreeTable (); tt.setModel (compoundModel); return tt; + } + + /** + * Creates a root node of the nodes tree structure + * for given {@link org.netbeans.spi.viewmodel.Models.CompoundModel}. + * + * @param compoundModel a compound model instance + * @param treeView The tree view component where nodes are going to be displayed. + * + * @return new instance root node + * @since 1.15 + */ + public static Node createNodes ( + CompoundModel compoundModel, + TreeView treeView + ) { + return new TreeModelRoot (compoundModel, treeView).getRootNode(); } /** @@ -184,6 +203,7 @@ public final class Models { List treeModels; List treeModelFilters; List treeExpansionModels; + List treeExpansionModelFilters; List nodeModels; List nodeModelFilters; List tableModels; @@ -195,7 +215,7 @@ public final class Models { // Either the list contains 10 lists of individual models + one list of mixed models; or the models directly boolean hasLists = false; - if (models.size() == 11) { + if (models.size() == 11 || models.size() == 12) { Iterator it = models.iterator (); while (it.hasNext ()) { if (!(it.next() instanceof List)) break; @@ -204,7 +224,7 @@ public final class Models { hasLists = true; } } - if (hasLists) { // We have 11 lists of individual models + if (hasLists) { // We have 11 or 12 lists of individual models treeModels = (List) models.get(0); treeModelFilters = (List) models.get(1); revertOrder(treeModelFilters); @@ -220,10 +240,12 @@ public final class Models { revertOrder(nodeActionsProviderFilters); columnModels = (List) models.get(9); otherModels = (List) models.get(10); + treeExpansionModelFilters = (models.size() > 11) ? (List) models.get(11) : (List) Collections.EMPTY_LIST; } else { // We have the models, need to find out what they implement treeModels = new LinkedList (); treeModelFilters = new LinkedList (); treeExpansionModels = new LinkedList (); + treeExpansionModelFilters = new LinkedList (); nodeModels = new LinkedList (); nodeModelFilters = new LinkedList (); tableModels = new LinkedList (); @@ -247,6 +269,11 @@ public final class Models { treeModelFilters.add(0, (TreeModelFilter) model); if (model instanceof TreeExpansionModel) treeExpansionModels.add((TreeExpansionModel) model); + if (model instanceof TreeExpansionModelFilter) + if (first) + treeExpansionModelFilters.add((TreeExpansionModelFilter) model); + else + treeExpansionModelFilters.add(0, (TreeExpansionModelFilter) model); if (model instanceof NodeModel) nodeModels.add((NodeModel) model); if (model instanceof NodeModelFilter) @@ -304,7 +331,10 @@ public final class Models { new DelegatingTreeModel (treeModels), treeModelFilters ), - new DelegatingTreeExpansionModel (treeExpansionModels), + createCompoundTreeExpansionModel( + new DelegatingTreeExpansionModel (treeExpansionModels), + treeExpansionModelFilters + ), createCompoundNodeModel ( new DelegatingNodeModel (nodeModels), nodeModelFilters @@ -374,7 +404,7 @@ public final class Models { */ public static TreeFeatures treeFeatures (JComponent view) throws UnsupportedOperationException { - return new TreeFeatures (view); + return new DefaultTreeFeatures (view); } @@ -472,6 +502,16 @@ public final class Models { return nap; } + private static TreeExpansionModel createCompoundTreeExpansionModel ( + TreeExpansionModel expansionModel, + List filters + ) { + for (TreeExpansionModelFilter filter : filters) { + expansionModel = new CompoundTreeExpansionModel (expansionModel, filter); + } + return expansionModel; + } + // innerclasses ............................................................ @@ -584,7 +624,7 @@ public final class Models { * * @author Jan Jancura */ - final static class CompoundTreeModel implements TreeModel, ModelListener { + private final static class CompoundTreeModel implements TreeModel, ModelListener { private TreeModel model; @@ -733,7 +773,7 @@ public final class Models { * * @author Jan Jancura */ - final static class CompoundNodeModel implements ExtendedNodeModel, ModelListener { + private final static class CompoundNodeModel implements ExtendedNodeModel, ModelListener { private ExtendedNodeModel model; @@ -951,7 +991,7 @@ public final class Models { * * @author Jan Jancura */ - final static class CompoundTableModel implements TableModel, ModelListener { + private final static class CompoundTableModel implements TableModel, ModelListener { private TableModel model; @@ -1086,7 +1126,7 @@ public final class Models { * * @author Jan Jancura */ - final static class DelegatingTreeModel implements TreeModel { + private final static class DelegatingTreeModel implements TreeModel { private TreeModel[] models; private HashMap classNameToModel = new HashMap(); @@ -1268,7 +1308,7 @@ public final class Models { * * @author Jan Jancura */ - final static class CompoundNodeActionsProvider + private final static class CompoundNodeActionsProvider implements NodeActionsProvider { @@ -1329,6 +1369,75 @@ public final class Models { n + " " + model; } } + + private final static class CompoundTreeExpansionModel implements TreeExpansionModel, ModelListener { + + private TreeExpansionModel expansionModel; + private TreeExpansionModelFilter expansionFilter; + + private Collection modelListeners = new HashSet(); + + CompoundTreeExpansionModel(TreeExpansionModel expansionModel, TreeExpansionModelFilter expansionFilter) { + this.expansionModel = expansionModel; + this.expansionFilter = expansionFilter; + } + + public boolean isExpanded(Object node) throws UnknownTypeException { + return expansionFilter.isExpanded(expansionModel, node); + } + + public void nodeExpanded(Object node) { + expansionModel.nodeExpanded(node); + expansionFilter.nodeExpanded(node); + } + + public void nodeCollapsed(Object node) { + expansionModel.nodeCollapsed(node); + expansionFilter.nodeCollapsed(node); + } + + /** + * Registers given listener. + * + * @param l the listener to add + */ + public void addModelListener (ModelListener l) { + synchronized (modelListeners) { + if (modelListeners.size() == 0) { + expansionFilter.addModelListener (this); + //model.addModelListener (this); + } + modelListeners.add(l); + } + } + + /** + * Unregisters given listener. + * + * @param l the listener to remove + */ + public void removeModelListener (ModelListener l) { + synchronized (modelListeners) { + modelListeners.remove(l); + if (modelListeners.size() == 0) { + expansionFilter.removeModelListener (this); + //model.removeModelListener (this); + } + } + } + + public void modelChanged(ModelEvent event) { + ModelEvent newEvent = translateEvent(event, this); + Collection listeners; + synchronized (modelListeners) { + listeners = new ArrayList(modelListeners); + } + for (Iterator it = listeners.iterator(); it.hasNext(); ) { + it.next().modelChanged(newEvent); + } + } + + } /** * Creates one {@link org.netbeans.spi.viewmodel.TableModel} @@ -1337,7 +1446,7 @@ public final class Models { * * @author Jan Jancura */ - final static class DelegatingTableModel implements TableModel { + private final static class DelegatingTableModel implements TableModel { private TableModel[] models; private HashMap classNameToModel = new HashMap(); @@ -1521,8 +1630,7 @@ public final class Models { * * @author Jan Jancura */ - final static class DelegatingTreeExpansionModel - implements TreeExpansionModel { + private final static class DelegatingTreeExpansionModel implements TreeExpansionModel { private TreeExpansionModel[] models; private HashMap classNameToModel = new HashMap(); @@ -1694,7 +1802,7 @@ public final class Models { * * @author Jan Jancura */ - static final class DelegatingNodeModel implements ExtendedNodeModel { + private static final class DelegatingNodeModel implements ExtendedNodeModel { private NodeModel[] models; private HashMap classNameToModel = new HashMap(); @@ -2679,13 +2787,43 @@ public final class Models { } /** + * Tree expansion control. + * @since 1.15 + */ + public static interface TreeFeatures { + + /** + * Returns true if given node is expanded. + * + * @param node a node to be checked + * @return true if given node is expanded + */ + public boolean isExpanded (Object node); + + /** + * Expands given list of nodes. + * + * @param node a list of nodes to be expanded + */ + public void expandNode (Object node); + + /** + * Collapses given node. + * + * @param node a node to be expanded + */ + public void collapseNode (Object node); + + } + + /** * Implements set of tree view features. */ - public static final class TreeFeatures { + private static final class DefaultTreeFeatures implements TreeFeatures { private JComponent view; - private TreeFeatures (JComponent view) { + private DefaultTreeFeatures (JComponent view) { this.view = view; } @@ -3020,6 +3158,9 @@ public final class Models { if (tableModel != treeModel && tableModel != nodeModel) { tableModel.addModelListener (l); } + if (treeExpansionModel instanceof CompoundTreeExpansionModel) { + ((CompoundTreeExpansionModel) treeExpansionModel).addModelListener(l); + } } /** @@ -3034,6 +3175,9 @@ public final class Models { } if (tableModel != treeModel && tableModel != nodeModel) { tableModel.removeModelListener (l); + } + if (treeExpansionModel instanceof CompoundTreeExpansionModel) { + ((CompoundTreeExpansionModel) treeExpansionModel).removeModelListener(l); } } diff -r 56bcd6cdfc36 spi.viewmodel/src/org/netbeans/spi/viewmodel/TreeExpansionModelFilter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spi.viewmodel/src/org/netbeans/spi/viewmodel/TreeExpansionModelFilter.java Fri May 30 16:36:15 2008 +0200 @@ -0,0 +1,91 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2007 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]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun + * Microsystems, Inc. All Rights Reserved. + * + * 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. + */ + +package org.netbeans.spi.viewmodel; + + +/** + * This model filter controlls expansion, collapsion of nodes in tree view, and + * defindes default expand state for all node in it. It may delegate to the supplied + * TreeExpansionModel. + * + * @author Martin Entlicher + * @since 1.15 + */ +public interface TreeExpansionModelFilter extends Model { + + /** + * Defines default state (collapsed, expanded) of given node. + * + * @param node a node + * @return default state (collapsed, expanded) of given node + */ + public abstract boolean isExpanded (TreeExpansionModel original, Object node) + throws UnknownTypeException; + + /** + * Called when given node is expanded. + * + * @param node a expanded node + */ + public abstract void nodeExpanded (Object node); + + /** + * Called when given node is collapsed. + * + * @param node a collapsed node + */ + public abstract void nodeCollapsed (Object node); + + /** + * Registers given listener. + * + * @param l the listener to add + */ + public abstract void addModelListener (ModelListener l); + + /** + * Unregisters given listener. + * + * @param l the listener to remove + */ + public abstract void removeModelListener (ModelListener l); +}