? debuggercore/viewmodel/src/examples ? debuggerjpda/prototypes Index: debuggercore/src/org/netbeans/modules/debugger/ui/models/SessionsTableModel.java =================================================================== RCS file: /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/models/SessionsTableModel.java,v retrieving revision 1.1 diff -u -r1.1 SessionsTableModel.java --- debuggercore/src/org/netbeans/modules/debugger/ui/models/SessionsTableModel.java 22 Dec 2004 14:48:43 -0000 1.1 +++ debuggercore/src/org/netbeans/modules/debugger/ui/models/SessionsTableModel.java 18 Jan 2005 10:32:17 -0000 @@ -36,12 +36,12 @@ public SessionsTableModel () { - Session session = DebuggerManager.getDebuggerManager (). - getCurrentSession (); - session.addPropertyChangeListener ( - Session.PROP_CURRENT_LANGUAGE, - this - ); +// Session session = DebuggerManager.getDebuggerManager (). +// getCurrentSession (); +// session.addPropertyChangeListener ( +// Session.PROP_CURRENT_LANGUAGE, +// this +// ); } public Object getValueAt (Object row, String columnID) throws Index: debuggercore/src/org/netbeans/modules/debugger/ui/views/BreakpointsView.java =================================================================== RCS file: /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/BreakpointsView.java,v retrieving revision 1.6 diff -u -r1.6 BreakpointsView.java --- debuggercore/src/org/netbeans/modules/debugger/ui/views/BreakpointsView.java 4 Aug 2004 11:53:42 -0000 1.6 +++ debuggercore/src/org/netbeans/modules/debugger/ui/views/BreakpointsView.java 18 Jan 2005 10:32:17 -0000 @@ -46,8 +46,7 @@ return; if (tree == null) { setLayout (new BorderLayout ()); - tree = Models.createView - (null, null, null, null, new ArrayList ()); + tree = Models.createView (Models.EMPTY_MODEL); tree.setName ("BreakpointsView"); add (tree, "Center"); //NOI18N } @@ -76,10 +75,12 @@ } public String getName () { - return NbBundle.getMessage (BreakpointsView.class, "CTL_Breakpoints_view"); + return NbBundle.getMessage + (BreakpointsView.class, "CTL_Breakpoints_view"); } public String getToolTipText () { - return NbBundle.getMessage (BreakpointsView.class, "CTL_Breakpoints_view_tooltip");// NOI18N + return NbBundle.getMessage + (BreakpointsView.class, "CTL_Breakpoints_view_tooltip");// NOI18N } } Index: debuggercore/src/org/netbeans/modules/debugger/ui/views/CallStackView.java =================================================================== RCS file: /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/CallStackView.java,v retrieving revision 1.6 diff -u -r1.6 CallStackView.java --- debuggercore/src/org/netbeans/modules/debugger/ui/views/CallStackView.java 4 Aug 2004 11:53:42 -0000 1.6 +++ debuggercore/src/org/netbeans/modules/debugger/ui/views/CallStackView.java 18 Jan 2005 10:32:17 -0000 @@ -46,8 +46,7 @@ return; if (tree == null) { setLayout (new BorderLayout ()); - tree = Models.createView - (null, null, null, null, new ArrayList ()); + tree = Models.createView (Models.EMPTY_MODEL); tree.setName ("CallStackView"); add (tree, "Center"); //NOI18N } Index: debuggercore/src/org/netbeans/modules/debugger/ui/views/LocalsView.java =================================================================== RCS file: /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/LocalsView.java,v retrieving revision 1.6 diff -u -r1.6 LocalsView.java --- debuggercore/src/org/netbeans/modules/debugger/ui/views/LocalsView.java 4 Aug 2004 11:53:42 -0000 1.6 +++ debuggercore/src/org/netbeans/modules/debugger/ui/views/LocalsView.java 18 Jan 2005 10:32:17 -0000 @@ -46,8 +46,7 @@ return; if (tree == null) { setLayout (new BorderLayout ()); - tree = Models.createView - (null, null, null, null, new ArrayList ()); + tree = Models.createView (Models.EMPTY_MODEL); tree.setName ("LocalsView"); add (tree, "Center"); //NOI18N } Index: debuggercore/src/org/netbeans/modules/debugger/ui/views/SessionsView.java =================================================================== RCS file: /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/SessionsView.java,v retrieving revision 1.6 diff -u -r1.6 SessionsView.java --- debuggercore/src/org/netbeans/modules/debugger/ui/views/SessionsView.java 4 Aug 2004 11:53:42 -0000 1.6 +++ debuggercore/src/org/netbeans/modules/debugger/ui/views/SessionsView.java 18 Jan 2005 10:32:17 -0000 @@ -49,8 +49,7 @@ return; if (tree == null) { setLayout (new BorderLayout ()); - tree = Models.createView - (null, null, null, null, new ArrayList ()); + tree = Models.createView (Models.EMPTY_MODEL); tree.setName ("SessionsView"); add (tree, "Center"); //NOI18N } Index: debuggercore/src/org/netbeans/modules/debugger/ui/views/ThreadsView.java =================================================================== RCS file: /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/ThreadsView.java,v retrieving revision 1.6 diff -u -r1.6 ThreadsView.java --- debuggercore/src/org/netbeans/modules/debugger/ui/views/ThreadsView.java 4 Aug 2004 11:53:42 -0000 1.6 +++ debuggercore/src/org/netbeans/modules/debugger/ui/views/ThreadsView.java 18 Jan 2005 10:32:17 -0000 @@ -47,8 +47,7 @@ return; if (tree == null) { setLayout (new BorderLayout ()); - tree = Models.createView - (null, null, null, null, new ArrayList ()); + tree = Models.createView (Models.EMPTY_MODEL); tree.setName ("ThreadsView"); add (tree, "Center"); //NOI18N } Index: debuggercore/src/org/netbeans/modules/debugger/ui/views/ViewModelListener.java =================================================================== RCS file: /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/ViewModelListener.java,v retrieving revision 1.4 diff -u -r1.4 ViewModelListener.java --- debuggercore/src/org/netbeans/modules/debugger/ui/views/ViewModelListener.java 7 Jan 2005 09:33:05 -0000 1.4 +++ debuggercore/src/org/netbeans/modules/debugger/ui/views/ViewModelListener.java 18 Jan 2005 10:32:17 -0000 @@ -27,6 +27,7 @@ import org.netbeans.api.debugger.DebuggerEngine; import org.netbeans.api.debugger.DebuggerManager; import org.netbeans.api.debugger.DebuggerManagerAdapter; +import org.netbeans.spi.viewmodel.Model; import org.netbeans.spi.viewmodel.Models; import org.netbeans.spi.viewmodel.ColumnModel; import org.netbeans.spi.viewmodel.TableModelFilter; @@ -35,6 +36,7 @@ import org.netbeans.spi.viewmodel.NodeModel; import org.netbeans.spi.viewmodel.NodeModelFilter; import org.netbeans.spi.viewmodel.TableModel; +import org.netbeans.spi.viewmodel.TreeExpansionModel; import org.netbeans.spi.viewmodel.TreeModel; import org.netbeans.spi.viewmodel.TreeModelFilter; import org.netbeans.spi.viewmodel.TreeModelListener; @@ -76,11 +78,7 @@ ); Models.setModelsToView ( view, - Models.EMPTY_TREE_MODEL, - Models.EMPTY_NODE_MODEL, - Models.EMPTY_TABLE_MODEL, - Models.EMPTY_NODE_ACTIONS_PROVIDER, - Collections.EMPTY_LIST + Models.EMPTY_MODEL ); } @@ -89,67 +87,35 @@ } private void updateModel () { - TreeModel tm = (TreeModel) loadModel (TreeModel.class); - if (tm == null) - tm = Models.EMPTY_TREE_MODEL; - List l = loadModels (NodeModel.class); - l.add (new EmptyModel ()); - - if (verbose) { - System.out.println (""); - System.out.println (viewType + " models:"); + DebuggerManager dm = DebuggerManager.getDebuggerManager (); + DebuggerEngine e = dm.getCurrentEngine (); + ArrayList l = new ArrayList (); + if (e != null) { + l.addAll (e.lookup (viewType, TreeModel.class)); + l.addAll (e.lookup (viewType, TreeModelFilter.class)); + l.addAll (e.lookup (viewType, TreeExpansionModel.class)); + l.addAll (e.lookup (viewType, NodeModel.class)); + l.addAll (e.lookup (viewType, NodeModelFilter.class)); + l.addAll (e.lookup (viewType, TableModel.class)); + l.addAll (e.lookup (viewType, TableModelFilter.class)); + l.addAll (e.lookup (viewType, NodeActionsProvider.class)); + l.addAll (e.lookup (viewType, NodeActionsProviderFilter.class)); + l.addAll (e.lookup (viewType, ColumnModel.class)); + l.addAll (e.lookup (viewType, Model.class)); } + l.addAll (dm.lookup (viewType, TreeModel.class)); + l.addAll (dm.lookup (viewType, TreeModelFilter.class)); + l.addAll (dm.lookup (viewType, TreeExpansionModel.class)); + l.addAll (dm.lookup (viewType, NodeModel.class)); + l.addAll (dm.lookup (viewType, NodeModelFilter.class)); + l.addAll (dm.lookup (viewType, TableModel.class)); + l.addAll (dm.lookup (viewType, TableModelFilter.class)); + l.addAll (dm.lookup (viewType, NodeActionsProvider.class)); + l.addAll (dm.lookup (viewType, NodeActionsProviderFilter.class)); + l.addAll (dm.lookup (viewType, ColumnModel.class)); + l.addAll (dm.lookup (viewType, Model.class)); - Models.setModelsToView ( - view, - Models.createCompoundTreeModel ( - tm, - loadModels (TreeModelFilter.class) - ), - Models.createCompoundNodeModel ( - Models.createCompoundNodeModel ( - l - ), - loadModels (NodeModelFilter.class) - ), - Models.createCompoundTableModel ( - Models.createCompoundTableModel ( - loadModels (TableModel.class) - ), - loadModels (TableModelFilter.class) - ), - Models.createCompoundNodeActionsProvider ( - Models.createCompoundNodeActionsProvider ( - loadModels (NodeActionsProvider.class) - ), - loadModels (NodeActionsProviderFilter.class) - ), - loadModels (ColumnModel.class) - ); - - } - - private Object loadModel (Class modelType) { - DebuggerEngine e = DebuggerManager.getDebuggerManager (). - getCurrentEngine (); - Object m = null; - if (e != null) - m = e.lookupFirst (viewType, modelType); - if (m == null) - m = DebuggerManager.getDebuggerManager (). - lookupFirst (viewType, modelType); - return m; - } - - private List loadModels (Class modelType) { - DebuggerEngine e = DebuggerManager.getDebuggerManager (). - getCurrentEngine (); - List l = new ArrayList (); - if (e != null) - l.addAll (e.lookup (viewType, modelType)); - l.addAll (DebuggerManager.getDebuggerManager (). - lookup (viewType, modelType)); - return l; + Models.setModelsToView (view, Models.createCompoundModel (l)); } Index: debuggercore/src/org/netbeans/modules/debugger/ui/views/WatchesView.java =================================================================== RCS file: /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/WatchesView.java,v retrieving revision 1.6 diff -u -r1.6 WatchesView.java --- debuggercore/src/org/netbeans/modules/debugger/ui/views/WatchesView.java 4 Aug 2004 11:53:42 -0000 1.6 +++ debuggercore/src/org/netbeans/modules/debugger/ui/views/WatchesView.java 18 Jan 2005 10:32:17 -0000 @@ -46,8 +46,7 @@ return; if (tree == null) { setLayout (new BorderLayout ()); - tree = Models.createView - (null, null, null, null, new ArrayList ()); + tree = Models.createView (Models.EMPTY_MODEL); tree.setName ("WatchesView"); add (tree, "Center"); //NOI18N } Index: debuggercore/viewmodel/apichanges.xml =================================================================== RCS file: /cvs/debuggercore/viewmodel/apichanges.xml,v retrieving revision 1.6 diff -u -r1.6 apichanges.xml --- debuggercore/viewmodel/apichanges.xml 10 Jan 2005 12:27:02 -0000 1.6 +++ debuggercore/viewmodel/apichanges.xml 18 Jan 2005 10:32:17 -0000 @@ -103,6 +103,38 @@ + + + Access to tree node expansion added. + + + + + This change has been done to cover user requirement #46167. + List of changes: + 1) new TreeExpansionModel introduced + 2) new class Models.TreeFeatures contains tree expansion methods. + During implementation of this user requirement I have discovered important problem in ViewModel API. + There is no possibility to add a new model to it. List of changes fixing this problem: + 1) Models.createView (...) and Models.setModelsToView (...) methods do not use fixed set of models as parameters, + but they use Models.CompoundModel. + 2) Models.CompoundModel is final class implementing all currently supported models. The only way how to create + a new instance of it is Models.createCompoundModel (List listOfModels). It allows future additions of new + models. + 3) Methods Models.createCompoundTreeModel (...), Models.createCompoundNodeModel (...), + Models.createCompoundTableModel (...), Models.createCompoundNodeActionsProvider (...), and field + Models.EMPTY_TREE_MODEL has been removed as useless. + How to update your code using these exceptions: + No changes required for most of clients. You should change your code only if you are providing some + new view based on ViewModel. In this case you should put all your model instances to one list, + and call Models.createCompountModel (list), in place of calling create*Model* methods. + + + + + + + Index: debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java,v retrieving revision 1.15 diff -u -r1.15 TreeModelNode.java --- debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java 7 Jan 2005 09:33:05 -0000 1.15 +++ debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java 18 Jan 2005 10:32:17 -0000 @@ -18,6 +18,7 @@ import java.beans.PropertyEditor; import java.lang.IllegalAccessException; import java.lang.ref.WeakReference; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -25,8 +26,10 @@ import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; import org.netbeans.spi.viewmodel.ColumnModel; +import org.netbeans.spi.viewmodel.Models; import org.netbeans.spi.viewmodel.UnknownTypeException; import org.openide.nodes.AbstractNode; @@ -47,7 +50,7 @@ // variables ............................................................... - private CompoundModel model; + private Models.CompoundModel model; private TreeModelRoot treeModelRoot; private Object object; @@ -63,9 +66,9 @@ * Creates root of call stack for given producer. */ public TreeModelNode ( - CompoundModel model, - TreeModelRoot treeModelRoot, - Object object + final Models.CompoundModel model, + final TreeModelRoot treeModelRoot, + final Object object ) { super ( createChildren (model, treeModelRoot, object), @@ -94,7 +97,7 @@ } private static Children createChildren ( - CompoundModel model, + Models.CompoundModel model, TreeModelRoot treeModelRoot, Object object ) { @@ -114,46 +117,6 @@ } } -// public String getName () { -// try { -// if (name == null) { -// name = model.getDisplayName (object); -// if (name == null) -// throw new NullPointerException ( -// "Model: " + model + ".getDisplayName (" + object + -// ") = null!" -// ); -// } -// return name; -// } catch (UnknownTypeException e) { -// e.printStackTrace (); -// System.out.println (model); -// System.out.println (); -// return object.toString (); -// } catch (final ComputingException ex) { -// name = ""; -// RequestProcessor.getDefault ().post (new Runnable () { -// public void run () { -// name = (String) ex.getValue (); -// if (name == null) { -// name = "?"; -// throw new NullPointerException ( -// "Model: " + model + ".getDisplayName (" + object + -// ") = null!" -// ); -// } -// setName (name); -// setDisplayName (name); -// } -// }); -// return ""; -// } -// } -// -// public String getDisplayName () { -// return getName (); -// } - public String getShortDescription () { if (shortDescription == null) { RequestProcessor.getDefault ().post (new Runnable () { @@ -289,7 +252,7 @@ name = (String) object; setName (name); setDisplayName (name); - setIconBase ("org/openide/resources/actions/empty"); +// setIconBase ("org/openide/resources/actions/empty"); } else { e.printStackTrace (); System.out.println (model); @@ -312,14 +275,14 @@ private static final class TreeModelChildren extends Children.Keys { private boolean initialezed = false; - private CompoundModel model; + private Models.CompoundModel model; private TreeModelRoot treeModelRoot; private Object object; private WeakHashMap objectToNode = new WeakHashMap (); TreeModelChildren ( - CompoundModel model, + Models.CompoundModel model, TreeModelRoot treeModelRoot, Object object ) { @@ -352,6 +315,7 @@ System.out.println (); } setKeys (new Object [0]); + return; } } }); @@ -359,7 +323,7 @@ void refreshChildren (int count) { try { - Object[] ch = model.getChildren ( + final Object[] ch = model.getChildren ( object, 0, count @@ -382,6 +346,18 @@ } objectToNode = newObjectToNode; setKeys (ch); + + SwingUtilities.invokeLater (new Runnable () { + public void run () { + int i, k = ch.length; + for (i = 0; i < k; i++) + try { + if (model.isExpanded (ch [i])) + treeModelRoot.getTreeTable ().expandNode (ch [i]); + } catch (UnknownTypeException ex) { + } + } + }); } catch (UnknownTypeException e) { setKeys (new Object [0]); if (!(object instanceof String)) { Index: debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeModelRoot.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeModelRoot.java,v retrieving revision 1.7 diff -u -r1.7 TreeModelRoot.java --- debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeModelRoot.java 26 Dec 2004 21:06:31 -0000 1.7 +++ debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeModelRoot.java 18 Jan 2005 10:32:17 -0000 @@ -18,6 +18,7 @@ import java.util.Iterator; import java.util.WeakHashMap; import javax.swing.SwingUtilities; +import org.netbeans.spi.viewmodel.Models; import org.netbeans.spi.viewmodel.TreeModel; import org.netbeans.spi.viewmodel.TreeModelListener; @@ -38,15 +39,21 @@ // variables ............................................................... - private CompoundModel model; + private Models.CompoundModel model; private TreeModelNode rootNode; private WeakHashMap objectToNode = new WeakHashMap (); + private TreeTable treeTable; - public TreeModelRoot (CompoundModel model) { + public TreeModelRoot (Models.CompoundModel model, TreeTable treeTable) { this.model = model; + this.treeTable = treeTable; model.addTreeModelListener (this); } + + public TreeTable getTreeTable () { + return treeTable; + } public TreeModelNode getRootNode () { if (rootNode == null) @@ -58,7 +65,7 @@ objectToNode.put (o, new WeakReference (n)); } - private TreeModelNode findNode (Object o) { + TreeModelNode findNode (Object o) { WeakReference wr = (WeakReference) objectToNode.get (o); if (wr == null) return null; return (TreeModelNode) wr.get (); Index: debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeTable.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeTable.java,v retrieving revision 1.12 diff -u -r1.12 TreeTable.java --- debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeTable.java 7 Jan 2005 09:33:06 -0000 1.12 +++ debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeTable.java 18 Jan 2005 10:32:17 -0000 @@ -23,6 +23,7 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; +import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.event.TreeExpansionListener; import javax.swing.event.TreeExpansionEvent; @@ -35,6 +36,7 @@ import org.netbeans.spi.viewmodel.Models; import org.netbeans.spi.viewmodel.ColumnModel; +import org.netbeans.spi.viewmodel.UnknownTypeException; import org.openide.explorer.ExplorerActions; import org.openide.explorer.ExplorerManager; @@ -61,13 +63,15 @@ * @author Jan Jancura */ public class TreeTable extends JPanel implements -ExplorerManager.Provider, PropertyChangeListener { +ExplorerManager.Provider, PropertyChangeListener, TreeExpansionListener { private ExplorerManager explorerManager; private MyTreeTable treeTable; private Node.Property[] columns; private List expandedPaths = new ArrayList (); private TreeModelRoot currentTreeModelRoot; + private Models.CompoundModel model; + private ExplorerActions explorerActions = new ExplorerActions (); {explorerActions.setConfirmDelete (false);} @@ -83,9 +87,11 @@ treeTable.setHorizontalScrollBarPolicy (JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); add (treeTable, "Center"); //NOI18N + treeTable.getTree ().addTreeExpansionListener (this); } - public void setModel (CompoundModel model) { + public void setModel (Models.CompoundModel model) { + this.model = model; // 1) destroy old model if (currentTreeModelRoot != null) @@ -107,7 +113,8 @@ columns = createColumns (model); treeTable.setProperties (columns); - + treeTable.setToolTipText ("tttttttttttttttttttttttt"); + setToolTipText ("aaaaaaaaaaaaaaaaaaaaa"); // try { // treeTable.setToolTipText (model.getShortDescription ( // model.getRoot () @@ -118,7 +125,7 @@ // } // 5) set root node for given model - currentTreeModelRoot = new TreeModelRoot (model); + currentTreeModelRoot = new TreeModelRoot (model, this); getExplorerManager ().setRootContext ( currentTreeModelRoot.getRootNode () ); @@ -130,7 +137,16 @@ final List backupPath = new ArrayList(expandedPaths); SwingUtilities.invokeLater(new Runnable() { public void run() { - treeTable.expandNodes (backupPath); + if (backupPath.size () == 0) + try { + expandDefault ( + TreeTable.this.model.getChildren + (TreeTable.this.model.getRoot (), 0, 0)); + } catch (UnknownTypeException ex) { + + } + else + treeTable.expandNodes (backupPath); } }); if (ep.size () > 0) expandedPaths = ep; @@ -159,6 +175,24 @@ } } + /** + * Called whenever an item in the tree has been expanded. + */ + public void treeExpanded (TreeExpansionEvent event) { + TreeModelNode tmn = (TreeModelNode) Visualizer.findNode + (event.getPath ().getLastPathComponent ()); + model.nodeExpanded (tmn.getObject ()); + } + + /** + * Called whenever an item in the tree has been collapsed. + */ + public void treeCollapsed (TreeExpansionEvent event) { + TreeModelNode tmn = (TreeModelNode) Visualizer.findNode + (event.getPath ().getLastPathComponent ()); + model.nodeCollapsed (tmn.getObject ()); + } + private boolean equalNodes () { Node[] ns1 = TopComponent.getRegistry ().getCurrentNodes (); Node[] ns2 = getExplorerManager ().getSelectedNodes (); @@ -171,7 +205,7 @@ return true; } - private Node.Property[] createColumns (CompoundModel model) { + private Node.Property[] createColumns (Models.CompoundModel model) { ColumnModel[] cs = model.getColumns (); int i, k = cs.length; Node.Property[] columns = new Column [k]; @@ -240,6 +274,16 @@ } } + private void expandDefault (Object[] nodes) { + int i, k = nodes.length; + for (i = 0; i < k; i++) + try { + if (model.isExpanded (nodes [i])) + expandNode (nodes [i]); + } catch (UnknownTypeException ex) { + } + } + /** Requests focus for the tree component. Overrides superclass method. */ public boolean requestFocusInWindow () { super.requestFocusInWindow (); @@ -257,7 +301,21 @@ TopComponent.getRegistry ().removePropertyChangeListener (this); getExplorerManager ().removePropertyChangeListener (this); } + + public boolean isExpanded (Object node) { + Node n = currentTreeModelRoot.findNode (node); + return treeTable.isExpanded (n); + } + + public void expandNode (Object node) { + Node n = currentTreeModelRoot.findNode (node); + treeTable.expandNode (n); + } + public void collapseNode (Object node) { + Node n = currentTreeModelRoot.findNode (node); + treeTable.collapseNode (n); + } private static class MyTreeTable extends TreeTableView { MyTreeTable () { @@ -268,6 +326,10 @@ JTable getTable () { return treeTable; + } + + JTree getTree () { + return tree; } public List getExpandedPaths () { Index: debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/ColumnModel.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/ColumnModel.java,v retrieving revision 1.4 diff -u -r1.4 ColumnModel.java --- debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/ColumnModel.java 13 Jul 2004 15:38:30 -0000 1.4 +++ debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/ColumnModel.java 18 Jan 2005 10:32:17 -0000 @@ -24,7 +24,7 @@ * * @author Jan Jancura */ -public abstract class ColumnModel { +public abstract class ColumnModel implements Model { /** Index: debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/Models.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/Models.java,v retrieving revision 1.10 diff -u -r1.10 Models.java --- debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/Models.java 7 Jan 2005 09:33:06 -0000 1.10 +++ debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/Models.java 18 Jan 2005 10:32:18 -0000 @@ -27,7 +27,6 @@ import javax.swing.JComponent; import javax.swing.SwingUtilities; -import org.netbeans.modules.viewmodel.CompoundModel; import org.netbeans.modules.viewmodel.TreeModelNode; import org.netbeans.modules.viewmodel.TreeTable; @@ -54,11 +53,12 @@ */ public final class Models { - public static final TreeModel EMPTY_TREE_MODEL = new EmptyTreeModel (); - public static final NodeModel EMPTY_NODE_MODEL = new EmptyNodeModel (); - public static final TableModel EMPTY_TABLE_MODEL = new EmptyTableModel (); - public static final NodeActionsProvider EMPTY_NODE_ACTIONS_PROVIDER = - new EmptyNodeActionsProvider (); + /** + * Empty model - returns default root node with no children. + */ + public static CompoundModel EMPTY_MODEL = createCompoundModel + (new ArrayList ()); + public static int MULTISELECTION_TYPE_EXACTLY_ONE = 1; public static int MULTISELECTION_TYPE_ALL = 2; @@ -85,23 +85,10 @@ * @return new instance of complete model */ public static JComponent createView ( - TreeModel treeModel, - NodeModel nodeModel, - TableModel tableModel, - NodeActionsProvider nodeActionsProvider, - List columnModels + CompoundModel compoundModel ) { TreeTable tt = new TreeTable (); - if (treeModel != null) { - CompoundModel cm = new CompoundModel ( - treeModel, - nodeModel, - nodeActionsProvider, - columnModels, - tableModel - ); - tt.setModel (cm); - } + tt.setModel (compoundModel); return tt; } @@ -117,66 +104,123 @@ */ public static void setModelsToView ( final JComponent view, - TreeModel treeModel, - NodeModel nodeModel, - TableModel tableModel, - NodeActionsProvider nodeActionsProvider, - List columnModels + final CompoundModel compoundModel ) { - if (verbose) { - System.out.println (" TreeModel:"); - if (treeModel instanceof CompoundTreeModel) - System.out.println (((CompoundTreeModel) treeModel).toString (" ")); - else - System.out.println (" " + treeModel); - - System.out.println (" NodeModel:"); - if (nodeModel instanceof CompoundNodeModel) - System.out.println (((CompoundNodeModel) nodeModel).toString (" ")); - else - if (nodeModel instanceof DelegatingNodeModel) - System.out.println (((DelegatingNodeModel) nodeModel).toString (" ")); - else - System.out.println (" " + nodeModel); - - System.out.println (" NodeActionsProvider:"); - if (nodeActionsProvider instanceof CompoundNodeActionsProvider) - System.out.println (((CompoundNodeActionsProvider) nodeActionsProvider).toString (" ")); - else - if (nodeActionsProvider instanceof DelegatingNodeActionsProvider) - System.out.println (((DelegatingNodeActionsProvider) nodeActionsProvider).toString (" ")); - else - System.out.println (" " + nodeActionsProvider); - - System.out.println (" ColumnModels:"); - int i, k = columnModels.size (); - for (i = 0; i < k; i++) - System.out.println (" " + columnModels.get (i)); - - System.out.println (" TableModel:"); - if (tableModel instanceof CompoundTableModel) - System.out.println (((CompoundTableModel) tableModel).toString (" ")); - else - if (tableModel instanceof DelegatingTableModel) - System.out.println (((DelegatingTableModel) tableModel).toString (" ")); - else - System.out.println (" " + tableModel); - } - final CompoundModel cm = new CompoundModel ( - treeModel, - nodeModel, - nodeActionsProvider, - columnModels, - tableModel - ); + if (verbose) + System.out.println (compoundModel); SwingUtilities.invokeLater (new Runnable () { public void run () { - ((TreeTable) view).setModel (cm); + ((TreeTable) view).setModel (compoundModel); } }); } /** + * Creates one {@link CompoundModel} from given list of models. + * + * @param models a list of models + * @return {@link CompoundModel} encapsulating given list of models + */ + public static CompoundModel createCompoundModel (List models) { + List treeModels = new ArrayList (); + List treeModelFilters = new ArrayList (); + List treeExpansionModels = new ArrayList (); + List nodeModels = new ArrayList (); + List nodeModelFilters = new ArrayList (); + List tableModels = new ArrayList (); + List tableModelFilters = new ArrayList (); + List nodeActionsProviders = new ArrayList (); + List nodeActionsProviderFilters = new ArrayList (); + List columnModels = new ArrayList (); + + // 1) sort models + Iterator it = models.iterator (); + while (it.hasNext ()) { + Object model = it.next (); + if (model instanceof TreeModel) + treeModels.add (model); + if (model instanceof TreeModelFilter) + treeModelFilters.add (model); + if (model instanceof TreeExpansionModel) + treeExpansionModels.add (model); + if (model instanceof NodeModel) + nodeModels.add (model); + if (model instanceof NodeModelFilter) + nodeModelFilters.add (model); + if (model instanceof TableModel) + tableModels.add (model); + if (model instanceof TableModelFilter) + tableModelFilters.add (model); + if (model instanceof NodeActionsProvider) + nodeActionsProviders.add (model); + if (model instanceof NodeActionsProviderFilter) + nodeActionsProviderFilters.add (model); + if (model instanceof ColumnModel) + columnModels.add (model); + } + + if (treeModels.isEmpty ()) treeModels.add (new EmptyTreeModel ()); + + return new CompoundModel ( + createCompoundTreeModel ( + new DelegatingTreeModel (treeModels), + treeModelFilters + ), + new DelegatingTreeExpansionModel (treeExpansionModels), + createCompoundNodeModel ( + new DelegatingNodeModel (nodeModels), + nodeModelFilters + ), + createCompoundNodeActionsProvider ( + new DelegatingNodeActionsProvider (nodeActionsProviders), + nodeActionsProviderFilters + ), + columnModels, + createCompoundTableModel ( + new DelegatingTableModel (tableModels), + tableModelFilters + ) + ); + } + + /** + * Returns {@link javax.swing.Action} for given parameters. + * + * @param displayName a display name for action + * @param node a node the action should by applied to + * @param performer a performer for action + * + * @return a new instance of {@link javax.swing.Action} for given parameters + */ + public static Action createAction ( + String displayName, + ActionPerformer performer, + int multiselectionType + ) { + return new ActionSupport ( + displayName, + performer, + multiselectionType + ); + } + + /** + * Returns implementation of tree view features for given view. + * + * @param view a view created by this Models class + * @throws UnsupportedOperationException in the case that given + * view is not tree view + * @return implementation of tree view features + */ + public static TreeFeatures treeFeatures (JComponent view) + throws UnsupportedOperationException { + return new TreeFeatures (view); + } + + + // private methods ......................................................... + + /** * Creates {@link org.netbeans.spi.viewmodel.TreeModel} for given TreeModel and * {@link org.netbeans.spi.viewmodel.TreeModelFilter}. * @@ -185,7 +229,7 @@ * * @returns compund tree model */ - public static TreeModel createCompoundTreeModel ( + private static TreeModel createCompoundTreeModel ( TreeModel originalTreeModel, List treeModelFilters ) { @@ -208,7 +252,7 @@ * * @returns compund tree model */ - public static NodeModel createCompoundNodeModel ( + private static NodeModel createCompoundNodeModel ( NodeModel originalNodeModel, List treeNodeModelFilters ) { @@ -231,7 +275,7 @@ * * @returns compund table model */ - public static TableModel createCompoundTableModel ( + private static TableModel createCompoundTableModel ( TableModel originalTableModel, List tableModelFilters ) { @@ -254,7 +298,7 @@ * * @returns compund node actions provider */ - public static NodeActionsProvider createCompoundNodeActionsProvider ( + private static NodeActionsProvider createCompoundNodeActionsProvider ( NodeActionsProvider originalNodeActionsProvider, List nodeActionsProviderFilters ) { @@ -268,117 +312,6 @@ return nap; } -// /** -// * Creates one {@link org.netbeans.spi.viewmodel.TableModel} -// * from given array of TableModels. TableModel asks all underlaying -// * models for each concrete parameter, and returns first returned value. -// * -// * @param originalTableModels a array of original table models -// */ -// public static TableModel createCompoundTableModel ( -// TableModel[] originalTableModels -// ) { -// return new DelegatingTableModel ( -// originalTableModels -// ); -// } - - /** - * Creates one {@link org.netbeans.spi.viewmodel.TableModel} - * from given list of TableModels. TableModel asks all underlaying - * models for each concrete parameter, and returns first returned value. - * - * @param originalTableModels a list of original table models - */ - public static TableModel createCompoundTableModel ( - List originalTableModels - ) { - return new DelegatingTableModel ( - originalTableModels - ); - } - -// /** -// * Creates one {@link org.netbeans.spi.viewmodel.NodeModel} -// * from given array of NodeModels. NodeModel asks all underlaying -// * models for each concrete parameter, and returns first returned value. -// * -// * @param originalNodeModels a array of original node models -// */ -// public static NodeModel createCompoundNodeModel ( -// NodeModel[] originalNodeModels -// ) { -// return new DelegatingNodeModel ( -// originalNodeModels -// ); -// } - - /** - * Creates one {@link org.netbeans.spi.viewmodel.NodeModel} - * from given list of NodeModels. NodeModel asks all underlaying - * models for each concrete parameter, and returns first returned value. - * - * @param originalNodeModels a list of original node models - */ - public static NodeModel createCompoundNodeModel ( - List originalNodeModels - ) { - return new DelegatingNodeModel ( - originalNodeModels - ); - } - -// /** -// * Creates one {@link org.netbeans.spi.viewmodel.NodeActionsProvider} -// * from given array of NodeActionsProviders. NodeActionsProvider asks all underlaying -// * models for each concrete parameter, and returns first returned value. -// * -// * @param originalNodeActionsProviders a array of original node action providers -// */ -// public static NodeActionsProvider createCompoundNodeActionsProvider ( -// NodeActionsProvider[] originalNodeActionsProviders -// ) { -// return new DelegatingNodeActionsProvider ( -// originalNodeActionsProviders -// ); -// } - - /** - * Creates one {@link org.netbeans.spi.viewmodel.NodeActionsProvider} - * from given list of NodeActionsProviders. NodeActionsProvider asks all underlaying - * models for each concrete parameter, and returns first returned value. - * - * @param originalNodeActionsProviders a list of original node action providers - */ - public static NodeActionsProvider createCompoundNodeActionsProvider ( - List originalNodeActionsProviders - ) { - return new DelegatingNodeActionsProvider ( - originalNodeActionsProviders - ); - } - - /** - * Returns {@link javax.swing.Action} for given parameters. - * - * @param displayName a display name for action - * @param node a node the action should by applied to - * @param performer a performer for action - * - * @return a new instance of {@link javax.swing.Action} for given parameters - */ - public static Action createAction ( - String displayName, - ActionPerformer performer, - int multiselectionType - ) { - return new ActionSupport ( - displayName, - performer, - multiselectionType - ); - } - // innerclasses ............................................................ @@ -809,6 +742,188 @@ n + " " + model; } } + + /** + * Creates one {@link org.netbeans.spi.viewmodel.TreeModel} + * from given list of TreeModels. DelegatingTreeModel asks all underlaying + * models for each concrete parameter, and returns first returned value. + * + * @author Jan Jancura + */ + final static class DelegatingTreeModel implements TreeModel { + + private TreeModel[] models; + private HashMap classNameToModel = new HashMap (); + + + /** + * Creates new instance of DelegatingTreeModel for given list of + * TableModels. + * + * @param models a list of TableModels + */ + DelegatingTreeModel (List models) { + this (convert (models)); + } + + private static TreeModel[] convert (List l) { + TreeModel[] models = new TreeModel [l.size ()]; + return (TreeModel[]) l.toArray (models); + } + + /** + * Creates new instance of DelegatingTreeModel for given array of + * TableModels. + * + * @param models a array of TreeModel + */ + DelegatingTreeModel (TreeModel[] models) { + this.models = models; + } + + /** + * Returns the root node of the tree or null, if the tree is empty. + * + * @return the root node of the tree or null + */ + public Object getRoot () { + return models [0].getRoot (); + } + + /** + * Returns children for given parent on given indexes. + * + * @param parent a parent of returned nodes + * @param from a start index + * @param to a end index + * + * @throws UnknownTypeException if this TreeModel implementation is not + * able to resolve children for given node type + * + * @return children for given parent on given indexes + */ + public Object[] getChildren (Object node, int from, int to) + throws UnknownTypeException { + TreeModel model = (TreeModel) classNameToModel.get ( + node.getClass ().getName () + ); + if (model != null) + try { + return model.getChildren (node, from, to); + } catch (UnknownTypeException e) { + } + int i, k = models.length; + for (i = 0; i < k; i++) { + try { + Object[] v = models [i].getChildren (node, from, to); + classNameToModel.put (node.getClass ().getName (), models [i]); + return v; + } catch (UnknownTypeException e) { + } + } + throw new UnknownTypeException (node); + } + + /** + * Returns number of children for given node. + * + * @param node the parent node + * @throws UnknownTypeException if this TreeModel implementation is not + * able to resolve children for given node type + * + * @return true if node is leaf + * @since 1.1 + */ + public int getChildrenCount (Object node) + throws UnknownTypeException { + TreeModel model = (TreeModel) classNameToModel.get ( + node.getClass ().getName () + ); + if (model != null) + try { + return model.getChildrenCount (node); + } catch (UnknownTypeException e) { + } + int i, k = models.length; + for (i = 0; i < k; i++) { + try { + int result = models [i].getChildrenCount (node); + classNameToModel.put (node.getClass ().getName (), models [i]); + return result; + } catch (UnknownTypeException e) { + } + } + throw new UnknownTypeException (node); + } + + /** + * Returns true if node is leaf. + * + * @throws UnknownTypeException if this TreeModel implementation is not + * able to resolve dchildren for given node type + * @return true if node is leaf + */ + public boolean isLeaf (Object node) throws UnknownTypeException { + TreeModel model = (TreeModel) classNameToModel.get ( + node.getClass ().getName () + ); + if (model != null) + try { + return model.isLeaf (node); + } catch (UnknownTypeException e) { + } + int i, k = models.length; + for (i = 0; i < k; i++) { + try { + boolean result = models [i].isLeaf (node); + classNameToModel.put (node.getClass ().getName (), models [i]); + return result; + } catch (UnknownTypeException e) { + } + } + throw new UnknownTypeException (node); + } + + /** + * Registers given listener. + * + * @param l the listener to add + */ + public void addTreeModelListener (TreeModelListener l) { + int i, k = models.length; + for (i = 0; i < k; i++) + models [i].addTreeModelListener (l); + } + + /** + * Unregisters given listener. + * + * @param l the listener to remove + */ + public void removeTreeModelListener (TreeModelListener l) { + int i, k = models.length; + for (i = 0; i < k; i++) + models [i].removeTreeModelListener (l); + } + + public String toString () { + return super.toString () + "\n" + toString (" "); + } + + public String toString (String n) { + int i, k = models.length - 1; + if (k == -1) return ""; + StringBuffer sb = new StringBuffer (); + for (i = 0; i < k; i++) { + sb.append (n); + sb.append (models [i]); + sb.append ('\n'); + } + sb.append (n); + sb.append (models [i]); + return new String (sb); + } + } /** * Creates {@link org.netbeans.spi.viewmodel.NodeActionsProvider} @@ -1086,8 +1201,120 @@ } /** - * Creates one {@link org.netbeans.spi.viewmodel.NodeModel} - * from given list of NodeModels. DelegatingNodeModel asks all underlaying + * Creates one {@link org.netbeans.spi.viewmodel.TableModel} + * from given list of TableModels. DelegatingTableModel asks all underlaying + * models for each concrete parameter, and returns first returned value. + * + * @author Jan Jancura + */ + final static class DelegatingTreeExpansionModel + implements TreeExpansionModel { + + private TreeExpansionModel[] models; + private HashMap classNameToModel = new HashMap (); + + + /** + * Creates new instance of DelegatingTableModel for given list of + * TableModels. + * + * @param models a list of TableModels + */ + DelegatingTreeExpansionModel (List models) { + this (convert (models)); + } + + private static TreeExpansionModel[] convert (List l) { + TreeExpansionModel[] models = new TreeExpansionModel [l.size ()]; + return (TreeExpansionModel[]) l.toArray (models); + } + + /** + * Creates new instance of DelegatingTableModel for given array of + * TableModels. + * + * @param models a array of TableModels + */ + DelegatingTreeExpansionModel (TreeExpansionModel[] models) { + this.models = models; + } + + /** + * Defines default state (collapsed, expanded) of given node. + * + * @param node a node + * @return default state (collapsed, expanded) of given node + */ + public boolean isExpanded (Object node) + throws UnknownTypeException { + TreeExpansionModel model = (TreeExpansionModel) + classNameToModel.get ( + node.getClass ().getName () + ); + if (model != null) + try { + return model.isExpanded (node); + } catch (UnknownTypeException e) { + } + int i, k = models.length; + for (i = 0; i < k; i++) { + try { + boolean result = models [i].isExpanded (node); + classNameToModel.put (node.getClass ().getName (), models [i]); + return result; + } catch (UnknownTypeException e) { + } + } + throw new UnknownTypeException (node); + } + + + /** + * Called when given node is expanded. + * + * @param node a expanded node + */ + public void nodeExpanded (Object node) { + int i, k = models.length; + for (i = 0; i < k; i++) { + models [i].nodeExpanded (node); + } + } + + /** + * Called when given node is collapsed. + * + * @param node a collapsed node + */ + public void nodeCollapsed (Object node) { + int i, k = models.length; + for (i = 0; i < k; i++) { + models [i].nodeCollapsed (node); + } + } + + public String toString () { + return super.toString () + "\n" + toString (" "); + } + + public String toString (String n) { + int i, k = models.length - 1; + if (k == -1) return ""; + StringBuffer sb = new StringBuffer (); + for (i = 0; i < k; i++) { + sb.append (n); + sb.append (models [i]); + sb.append ('\n'); + } + sb.append (n); + sb.append (models [i]); + return new String (sb); + } + } + + /** + * Creates one {@link org.netbeans.spi.viewmodel.NodeModel} + * from given list of NodeModels. DelegatingNodeModel asks all underlaying * models for each concrete parameter, and returns first returned value. * * @author Jan Jancura @@ -1662,6 +1889,323 @@ int i, k = models.length; for (i = 0; i < k; i++) models [i].removeTreeModelListener (l); + } + } + + /** + * Implements set of tree view features. + */ + public static final class TreeFeatures { + + private JComponent view; + + private TreeFeatures (JComponent view) { + this.view = view; + } + + /** + * Returns true if given node is expanded in given view. + * + * @param view a view created by this Models class + * @param node a node to be checked + * @return true if given node is expanded in given view + */ + public boolean isExpanded ( + Object node + ) { + return ((TreeTable) view).isExpanded (node); + } + + /** + * Expands given list of nodes in given view. + * + * @param view a view created by this Models class + * @param node a list of nodes to be expanded + */ + public void expandNode ( + Object node + ) { + ((TreeTable) view).expandNode (node); + } + + /** + * Collapses given node in given view. + * + * @param view a view created by this Models class + * @param node a node to be expanded + */ + public void collapseNode ( + Object node + ) { + ((TreeTable) view).collapseNode (node); + } + } + + /** + * This model encapsulates all currently supported models. + * + * @see Models#createCompoundModel + * @author Jan Jancura + */ + public static final class CompoundModel implements TreeModel, + NodeModel, NodeActionsProvider, TableModel, TreeExpansionModel { + + private TreeModel treeModel; + private NodeModel nodeModel; + private NodeActionsProvider nodeActionsProvider; + private ColumnModel[] columnModels; + private TableModel tableModel; + private TreeExpansionModel treeExpansionModel; + + + // init .................................................................... + + /** + * Creates a new instance of {@link CompoundModel} for given models. + * + * @param treeModel a tree model to delegate on + * @param nodeModel a node model to delegate on + * @param nodeActionsProvider a node actions provider to delegate on + * @param nodeActionsProvider a columns modeol to delegate on + */ + private CompoundModel ( + TreeModel treeModel, + TreeExpansionModel treeExpansionModel, + NodeModel nodeModel, + NodeActionsProvider nodeActionsProvider, + List columnModels, + TableModel tableModel + ) { + if (treeModel == null) throw new NullPointerException (); + if (treeModel == null) throw new NullPointerException (); + if (nodeModel == null) throw new NullPointerException (); + if (tableModel == null) throw new NullPointerException (); + if (nodeActionsProvider == null) throw new NullPointerException (); + + this.treeModel = treeModel; + this.treeExpansionModel = treeExpansionModel; + this.nodeModel = nodeModel; + this.tableModel = tableModel; + this.nodeActionsProvider = nodeActionsProvider; + this.columnModels = (ColumnModel[]) columnModels.toArray ( + new ColumnModel [columnModels.size ()] + ); + } + + + // TreeModel ............................................................... + + /** + * Returns the root node of the tree or null, if the tree is empty. + * + * @return the root node of the tree or null + */ + public Object getRoot () { + return treeModel.getRoot (); + } + + /** + * Returns children for given parent on given indexes. + * + * @param parent a parent of returned nodes + * @throws UnknownTypeException if this TreeModel implementation is not + * able to resolve dchildren for given node type + * + * @return children for given parent on given indexes + */ + public Object[] getChildren (Object parent, int from, int to) + throws UnknownTypeException { + return treeModel.getChildren (parent, from, to); + } + + /** + * Returns number of children for given node. + * + * @param node the parent node + * @throws UnknownTypeException if this TreeModel implementation is not + * able to resolve children for given node type + * + * @return true if node is leaf + */ + public int getChildrenCount (Object node) throws UnknownTypeException { + return treeModel.getChildrenCount (node); + } + + /** + * Returns true if node is leaf. + * + * @throws UnknownTypeException if this TreeModel implementation is not + * able to resolve dchildren for given node type + * @return true if node is leaf + */ + public boolean isLeaf (Object node) throws UnknownTypeException { + return treeModel.isLeaf (node); + } + + + // NodeModel ............................................................... + + /** + * Returns display name for given node. + * + * @throws UnknownTypeException if this NodeModel implementation is not + * able to resolve display name for given node type + * @return display name for given node + */ + public String getDisplayName (Object node) throws UnknownTypeException { + return nodeModel.getDisplayName (node); + } + + /** + * Returns tooltip for given node. + * + * @throws UnknownTypeException if this NodeModel implementation is not + * able to resolve tooltip for given node type + * @return tooltip for given node + */ + public String getShortDescription (Object node) + throws UnknownTypeException { + return nodeModel.getShortDescription (node); + } + + /** + * Returns icon for given node. + * + * @throws ComputingException if the icon resolving process + * is time consuming, and the value will be updated later + * @throws UnknownTypeException if this NodeModel implementation is not + * able to resolve icon for given node type + * @return icon for given node + */ + public String getIconBase (Object node) + throws UnknownTypeException { + return nodeModel.getIconBase (node); + } + + + // NodeActionsProvider ..................................................... + + /** + * Performs default action for given node. + * + * @throws UnknownTypeException if this NodeActionsProvider implementation + * is not able to resolve actions for given node type + * @return display name for given node + */ + public void performDefaultAction (Object node) throws UnknownTypeException { + nodeActionsProvider.performDefaultAction (node); + } + + /** + * Returns set of actions for given node. + * + * @throws UnknownTypeException if this NodeActionsProvider implementation + * is not able to resolve actions for given node type + * @return display name for given node + */ + public Action[] getActions (Object node) throws UnknownTypeException { + return nodeActionsProvider.getActions (node); + } + + + // ColumnsModel ............................................................ + + /** + * Returns sorted array of + * {@link org.netbeans.spi.viewmodel.ColumnModel}s. + * + * @return sorted array of ColumnModels + */ + public ColumnModel[] getColumns () { + return columnModels; + } + + + // TableModel .............................................................. + + public Object getValueAt (Object node, String columnID) throws + UnknownTypeException { + return tableModel.getValueAt (node, columnID); + } + + public boolean isReadOnly (Object node, String columnID) throws + UnknownTypeException { + return tableModel.isReadOnly (node, columnID); + } + + public void setValueAt (Object node, String columnID, Object value) throws + UnknownTypeException { + tableModel.setValueAt (node, columnID, value); + } + + + // TreeExpansionModel ...................................................... + + /** + * Defines default state (collapsed, expanded) of given node. + * + * @param node a node + * @return default state (collapsed, expanded) of given node + */ + public boolean isExpanded (Object node) throws UnknownTypeException { + if (treeExpansionModel == null) return false; + return treeExpansionModel.isExpanded (node); + } + + /** + * Called when given node is expanded. + * + * @param node a expanded node + */ + public void nodeExpanded (Object node) { + if (treeExpansionModel != null) + treeExpansionModel.nodeExpanded (node); + } + + /** + * Called when given node is collapsed. + * + * @param node a collapsed node + */ + public void nodeCollapsed (Object node) { + if (treeExpansionModel != null) + treeExpansionModel.nodeCollapsed (node); + } + + + // listeners ............................................................... + + /** + * Registers given listener. + * + * @param l the listener to add + */ + public void addTreeModelListener (TreeModelListener l) { + treeModel.addTreeModelListener (l); + nodeModel.addTreeModelListener (l); + nodeActionsProvider.addTreeModelListener (l); + tableModel.addTreeModelListener (l); + } + + /** + * Unregisters given listener. + * + * @param l the listener to remove + */ + public void removeTreeModelListener (TreeModelListener l) { + treeModel.removeTreeModelListener (l); + nodeModel.removeTreeModelListener (l); + nodeActionsProvider.removeTreeModelListener (l); + tableModel.removeTreeModelListener (l); + } + + public String toString () { + return super.toString () + + "\n TreeModel = " + treeModel + + "\n NodeModel = " + nodeModel + + "\n TableModel = " + tableModel + + "\n NodeActionsProvider = " + nodeActionsProvider + + "\n ColumnsModel = " + columnModels; } } } Index: debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeActionsProvider.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeActionsProvider.java,v retrieving revision 1.2 diff -u -r1.2 NodeActionsProvider.java --- debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeActionsProvider.java 31 Mar 2004 07:26:33 -0000 1.2 +++ debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeActionsProvider.java 18 Jan 2005 10:32:18 -0000 @@ -22,7 +22,7 @@ * * @author Jan Jancura */ -public interface NodeActionsProvider { +public interface NodeActionsProvider extends Model { /** Index: debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeActionsProviderFilter.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeActionsProviderFilter.java,v retrieving revision 1.3 diff -u -r1.3 NodeActionsProviderFilter.java --- debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeActionsProviderFilter.java 11 Jun 2004 11:48:30 -0000 1.3 +++ debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeActionsProviderFilter.java 18 Jan 2005 10:32:18 -0000 @@ -23,7 +23,7 @@ * * @author Jan Jancura */ -public interface NodeActionsProviderFilter { +public interface NodeActionsProviderFilter extends Model { /** Index: debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeModel.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeModel.java,v retrieving revision 1.3 diff -u -r1.3 NodeModel.java --- debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeModel.java 7 Jan 2005 09:33:07 -0000 1.3 +++ debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeModel.java 18 Jan 2005 10:32:18 -0000 @@ -20,7 +20,7 @@ * * @author Jan Jancura */ -public interface NodeModel { +public interface NodeModel extends Model { /** * Returns display name for given node. Index: debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeModelFilter.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeModelFilter.java,v retrieving revision 1.4 diff -u -r1.4 NodeModelFilter.java --- debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeModelFilter.java 7 Jan 2005 09:33:07 -0000 1.4 +++ debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeModelFilter.java 18 Jan 2005 10:32:18 -0000 @@ -20,7 +20,7 @@ * * @author Jan Jancura */ -public interface NodeModelFilter { +public interface NodeModelFilter extends Model { /** * Returns filterred display name for given node. You should not Index: debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TableModel.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TableModel.java,v retrieving revision 1.3 diff -u -r1.3 TableModel.java --- debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TableModel.java 7 Jan 2005 09:33:07 -0000 1.3 +++ debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TableModel.java 18 Jan 2005 10:32:19 -0000 @@ -23,7 +23,7 @@ * * @author Jan Jancura */ -public interface TableModel { +public interface TableModel extends Model { /** Index: debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TableModelFilter.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TableModelFilter.java,v retrieving revision 1.4 diff -u -r1.4 TableModelFilter.java --- debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TableModelFilter.java 7 Jan 2005 09:33:07 -0000 1.4 +++ debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TableModelFilter.java 18 Jan 2005 10:32:19 -0000 @@ -25,7 +25,7 @@ * * @author Jan Jancura */ -public interface TableModelFilter { +public interface TableModelFilter extends Model { /** Index: debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TreeModel.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TreeModel.java,v retrieving revision 1.5 diff -u -r1.5 TreeModel.java --- debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TreeModel.java 7 Jan 2005 09:33:07 -0000 1.5 +++ debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TreeModel.java 18 Jan 2005 10:32:19 -0000 @@ -20,7 +20,7 @@ * * @author Jan Jancura */ -public interface TreeModel { +public interface TreeModel extends Model { /** * Constant for root node. This root node should be used if root node Index: debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TreeModelFilter.java =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TreeModelFilter.java,v retrieving revision 1.5 diff -u -r1.5 TreeModelFilter.java --- debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TreeModelFilter.java 7 Jan 2005 09:33:07 -0000 1.5 +++ debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TreeModelFilter.java 18 Jan 2005 10:32:19 -0000 @@ -21,7 +21,7 @@ * * @author Jan Jancura */ -public interface TreeModelFilter { +public interface TreeModelFilter extends Model { /** Index: debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/package.html =================================================================== RCS file: /cvs/debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/package.html,v retrieving revision 1.2 diff -u -r1.2 package.html --- debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/package.html 31 Mar 2004 07:26:37 -0000 1.2 +++ debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/package.html 18 Jan 2005 10:32:19 -0000 @@ -5,7 +5,7 @@ content="text/html; charset=iso-8859-1"> - package + View Model API + @@ -48,7 +49,7 @@ alt="Tree Model Example 1" style="width: 401px; height: 355px;" align="right">
public Object getRoot () {
return ROOT;
}

public Object[] getChildren (Object parent, int from, int to) {
if (parent == ROOT)
return File.listRoots ();
return ((File) parent).listFiles ();
}

public boolean isLeaf (Object node) {
if (node == ROOT)
return false;
return ((File) node).isFile ();
}
}
And create a TreeView for this model: -
    JComponent treeView = Models.createView (
new TreeModelImpl (), // TreeModel
null, // NodeModel
null, // TableModel
null, // NodeActionsProvider
new ArrayList () // list of ColumnModel s
);
+
    JComponent treeView = Models.createView (
Models.createCompoundModel (
Arrays.asList (new Model[] {
new TreeModelImpl (), // TreeModel
new ArrayList () // list of ColumnModel s
})
)
);
See TreeModelExample1.

Step 2.

NodeModel implementation can define name, icon and tooltip for tree @@ -64,8 +65,10 @@
public class NodeActionsProviderImpl implements NodeActionsProvider {

public Action[] getActions (final Object node) {
return new Action [] {
new AbstractAction ("Open") {
public void actionPerformed (ActionEvent e) {
performDefaultAction (node);
}
},
new AbstractAction ("Delete") {
public void actionPerformed (ActionEvent e) {
((File) node).delete ();
}
}
};
}

public void performDefaultAction (Object node) {
try {
JFrame f = new JFrame ("View");
f.getContentPane ().add (new JEditorPane (((File) node).toURL ()));
f.pack ();
f.show ();
} catch (Exception e) {
e.printStackTrace();
}
}
}
See TreeModelExample3.

-Tree Model Example 3
+

Step 4.

TableModel and ColumnModel adds support for additional columns to tree view.
@@ -74,7 +77,7 @@
    ArrayList columns = new ArrayList ();Tree Model Example 4
columns.add (new ColumnModel () {
public String getID () { return "sizeID"; }
public String getDisplayName () { return "size"; }
public Class getType () { return String.class; }
});
JComponent treeTableView = Models.createView (
new TreeModelImpl (), // TreeModel
new NodeModelImpl (), // NodeModel
new TableModelImpl (), // TableModel
new NodeActionsProviderImpl (), // NodeActionsProvider
columns // list of ColumnModel s
);

+ align="right">
columns.add (new ColumnModel () {
public String getID () { return "sizeID"; }
public String getDisplayName () { return "size"; }
public Class getType () { return String.class; }
});
JComponent treeTableView = Models.createView (
Models.createCompoundModel (
Arrays.asList (new Model[] {
new TreeModelImpl (), // TreeModel
new NodeModelImpl (), // NodeModel
new TableModelImpl (), // TableModel
new NodeActionsProviderImpl (), // NodeActionsProvider
columns // list of ColumnModel s
})
)
);

See TreeModelExample4.


Index: debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeActionsProvider =================================================================== RCS file: /cvs/debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeActionsProvider,v retrieving revision 1.8 diff -u -r1.8 org.netbeans.spi.viewmodel.NodeActionsProvider --- debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeActionsProvider 3 Jan 2005 15:33:50 -0000 1.8 +++ debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeActionsProvider 18 Jan 2005 10:32:19 -0000 @@ -1,4 +1,3 @@ org.netbeans.modules.debugger.jpda.ui.models.WatchesActionsProvider -org.netbeans.modules.debugger.jpda.ui.FixedWatchesManager org.netbeans.modules.debugger.jpda.ui.models.VariablesActionsProvider org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilterSI Index: debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeModel =================================================================== RCS file: /cvs/debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeModel,v retrieving revision 1.5 diff -u -r1.5 org.netbeans.spi.viewmodel.NodeModel --- debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeModel 3 Jan 2005 15:33:50 -0000 1.5 +++ debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeModel 18 Jan 2005 10:32:19 -0000 @@ -1,3 +1,2 @@ org.netbeans.modules.debugger.jpda.ui.models.WatchesNodeModel -org.netbeans.modules.debugger.jpda.ui.FixedWatchesManager org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilterSI Index: debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeModelFilter =================================================================== RCS file: /cvs/debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeModelFilter,v retrieving revision 1.3 diff -u -r1.3 org.netbeans.spi.viewmodel.NodeModelFilter --- debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeModelFilter 1 Apr 2004 13:49:50 -0000 1.3 +++ debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeModelFilter 18 Jan 2005 10:32:19 -0000 @@ -1 +1,2 @@ org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilter +org.netbeans.modules.debugger.jpda.ui.FixedWatchesManager \ No newline at end of file Index: debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.TableModel =================================================================== RCS file: /cvs/debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.TableModel,v retrieving revision 1.6 diff -u -r1.6 org.netbeans.spi.viewmodel.TableModel --- debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.TableModel 3 Jan 2005 15:33:50 -0000 1.6 +++ debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.TableModel 18 Jan 2005 10:32:19 -0000 @@ -1,3 +1,2 @@ org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilterSI -org.netbeans.modules.debugger.jpda.ui.models.VariablesTableModel -org.netbeans.modules.debugger.jpda.ui.FixedWatchesManager \ No newline at end of file +org.netbeans.modules.debugger.jpda.ui.models.VariablesTableModel \ No newline at end of file Index: debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/FixedWatchesManager.java =================================================================== RCS file: /cvs/debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/FixedWatchesManager.java,v retrieving revision 1.11 diff -u -r1.11 FixedWatchesManager.java --- debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/FixedWatchesManager.java 7 Jan 2005 09:33:24 -0000 1.11 +++ debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/FixedWatchesManager.java 18 Jan 2005 10:32:20 -0000 @@ -26,18 +26,20 @@ import java.util.*; /** - * Manages lifecycle and presentation of fixed watches. Should be registered as an action provider in both + * Manages lifecycle and presentation of fixed watches. Should be + * registered as an action provider in both * locals and watches views and as a tree model filter in the watches view. * * @author Jan Jancura, Maros Sandor */ public class FixedWatchesManager implements TreeModelFilter, -NodeActionsProvider, NodeActionsProviderFilter, TableModel, NodeModel { +NodeActionsProviderFilter, NodeModelFilter { public static final String FIXED_WATCH = "org/netbeans/modules/debugger/resources/watchesView/FixedWatch"; private final Action DELETE_ACTION = Models.createAction ( - loc("CTL_DeleteFixedWatch_Label"), + NbBundle.getBundle (FixedWatchesManager.class).getString + ("CTL_DeleteFixedWatch_Label"), new Models.ActionPerformer () { public boolean isEnabled (Object node) { return true; @@ -58,7 +60,8 @@ ); }; private final Action CREATE_FIXED_WATCH_ACTION = Models.createAction ( - loc("CTL_CreateFixedWatch_Label"), + NbBundle.getBundle (FixedWatchesManager.class).getString + ("CTL_CreateFixedWatch_Label"), new Models.ActionPerformer () { public boolean isEnabled (Object node) { return true; @@ -73,59 +76,14 @@ ); - private List fixedWatches; + private Map fixedWatches = new HashMap (); private HashSet listeners; - private ContextProvider contextProvider; // not used at the moment + private ContextProvider contextProvider; public FixedWatchesManager (ContextProvider contextProvider) { this.contextProvider = contextProvider; } - - private static String loc(String key) { - return NbBundle.getBundle(FixedWatchesManager.class).getString(key); - } - - // NodeActionsProvider ..................................................... - - public void performDefaultAction (Object node) throws UnknownTypeException { - if (!(node instanceof FixedWatch)) - throw new UnknownTypeException (node); - } - - public Action[] getActions (Object node) throws UnknownTypeException { - if (node instanceof FixedWatch) { - return new Action[] { - DELETE_ACTION - }; - } - throw new UnknownTypeException(node); - } - - - // NodeActionsProviderFilter ............................................... - - public void performDefaultAction (NodeActionsProvider original, Object node) - throws UnknownTypeException { - original.performDefaultAction (node); - } - - public Action[] getActions (NodeActionsProvider original, Object node) - throws UnknownTypeException { - Action [] actions = original.getActions(node); - List myActions = new ArrayList(); - if (node instanceof Variable) { - myActions.add (CREATE_FIXED_WATCH_ACTION); - } else if (node instanceof JPDAWatch) { - myActions.add (CREATE_FIXED_WATCH_ACTION); - } else if (node instanceof FixedWatch) { - myActions.add (DELETE_ACTION); - } else { - return actions; - } - myActions.addAll(Arrays.asList(actions)); - return (Action[]) myActions.toArray(new Action[myActions.size()]); - } // TreeModelFilter ......................................................... @@ -141,16 +99,15 @@ int to ) throws UnknownTypeException { if (parent == TreeModel.ROOT) { - if (fixedWatches == null || fixedWatches.size - () == 0) + if (fixedWatches.size () == 0) return original.getChildren (parent, from, to); - int fixedSize = fixedWatches.size(); + int fixedSize = fixedWatches.size (); int originalFrom = from - fixedSize; int originalTo = to - fixedSize; if (originalFrom < 0) originalFrom = 0; - Object [] children; + Object[] children; if (originalTo > originalFrom) { children = original.getChildren (parent, originalFrom, originalTo); @@ -159,7 +116,7 @@ } Object [] allChildren = new Object [children.length + fixedSize]; - fixedWatches.toArray (allChildren); + fixedWatches.keySet ().toArray (allChildren); System.arraycopy ( children, 0, @@ -171,12 +128,6 @@ System.arraycopy (allChildren, from, fallChildren, 0, to - from); return fallChildren; } - if (parent instanceof FixedWatch) { - Variable v = ((FixedWatch) parent).getVariable (); - return (v != null) ? - original.getChildren (v, from, to) : - new Object [0]; - } return original.getChildren (parent, from, to); } @@ -186,24 +137,13 @@ ) throws UnknownTypeException { if (parent == TreeModel.ROOT) { int chc = original.getChildrenCount (parent); - if (fixedWatches == null) return chc; return chc + fixedWatches.size (); } - if (parent instanceof FixedWatch) { - Variable v = ((FixedWatch) parent).getVariable (); - return (v != null) ? original.getChildrenCount (v) : 0; - } return original.getChildrenCount (parent); } public boolean isLeaf (TreeModel original, Object node) throws UnknownTypeException { - if (node instanceof FixedWatch) { - FixedWatch fw = (FixedWatch) node; - if (fw.getVariable () == null) - return true; - return original.isLeaf (fw.getVariable ()); - } return original.isLeaf (node); } @@ -220,65 +160,63 @@ newListeners.remove (l); listeners = newListeners; } + - - // TableModel .............................................................. - - public Object getValueAt (Object row, String columnID) throws - UnknownTypeException { - if (row instanceof FixedWatch) - return getOriginalModel ().getValueAt ( - ((FixedWatch) row).getVariable (), - columnID - ); - throw new UnknownTypeException (row); - } - - public boolean isReadOnly (Object row, String columnID) throws - UnknownTypeException { - if (row instanceof FixedWatch) - return getOriginalModel ().isReadOnly ( - ((FixedWatch) row).getVariable (), - columnID - ); - throw new UnknownTypeException (row); + // NodeActionsProviderFilter ............................................... + + public void performDefaultAction ( + NodeActionsProvider original, + Object node + ) throws UnknownTypeException { + original.performDefaultAction (node); } - - public void setValueAt (Object row, String columnID, Object value) + + public Action[] getActions (NodeActionsProvider original, Object node) throws UnknownTypeException { - if (row instanceof FixedWatch) { - getOriginalModel ().setValueAt ( - ((FixedWatch) row).getVariable (), - columnID, - value - ); - return; + Action [] actions = original.getActions (node); + List myActions = new ArrayList(); + if (fixedWatches.containsKey (node)) { + return new Action[] { + DELETE_ACTION + }; } - throw new UnknownTypeException (row); + if (node instanceof Variable) { + myActions.add (CREATE_FIXED_WATCH_ACTION); + } else + if (node instanceof JPDAWatch) { + myActions.add (CREATE_FIXED_WATCH_ACTION); + } else + return actions; + myActions.addAll (Arrays.asList (actions)); + return (Action[]) myActions.toArray (new Action [myActions.size ()]); } // NodeModel ............................................................... - public String getDisplayName (Object o) throws UnknownTypeException { - if (o instanceof FixedWatch) - return ((FixedWatch) o).getName(); - throw new UnknownTypeException (o); + public String getDisplayName (NodeModel original, Object node) + throws UnknownTypeException { + if (fixedWatches.containsKey (node)) + return (String) fixedWatches.get (node); + return original.getDisplayName (node); } - public String getShortDescription (Object o) throws UnknownTypeException { - if (o instanceof FixedWatch) { - FixedWatch fw = (FixedWatch) o; - return fw.getName () + " = (" + fw.getType () + ") " + - fw.getValue (); + public String getShortDescription (NodeModel original, Object node) + throws UnknownTypeException { + if (fixedWatches.containsKey (node)) { + Variable v = (Variable) node; + return ((String) fixedWatches.get (node)) + + " = (" + v.getType () + ") " + + v.getValue (); } - throw new UnknownTypeException (o); + return original.getShortDescription (node); } - public String getIconBase (Object node) throws UnknownTypeException { - if (node instanceof FixedWatch) + public String getIconBase (NodeModel original, Object node) + throws UnknownTypeException { + if (fixedWatches.containsKey (node)) return FIXED_WATCH; - throw new UnknownTypeException (node); + return original.getIconBase (node); } @@ -287,7 +225,7 @@ private void createFixedWatch (Object node) { if (node instanceof JPDAWatch) { JPDAWatch jw = (JPDAWatch) node; - createFixedWatch (jw.getExpression (), jw); + addFixedWatch (jw.getExpression (), jw); } else { Variable variable = (Variable) node; String name = null; @@ -302,15 +240,13 @@ } else { name = "unnamed"; } - createFixedWatch(name, variable); + addFixedWatch (name, variable); } } - private void createFixedWatch (String name, Variable variable) { - if (fixedWatches == null) fixedWatches = new ArrayList(); - FixedWatch fw = new FixedWatch(name, variable); - fixedWatches.add(fw); - fireModelChanged(); + private void addFixedWatch (String name, Variable variable) { + fixedWatches.put (variable, name); + fireModelChanged (); } private void fireModelChanged () { @@ -319,17 +255,5 @@ TreeModelListener listener = (TreeModelListener) i.next(); listener.treeChanged();; } - } - - private TableModel original; - private TableModel getOriginalModel () { - if (original == null) - original = Models.createCompoundTableModel ( - Models.createCompoundTableModel ( - contextProvider.lookup ("WatchesView", TableModel.class) - ), - contextProvider.lookup ("WatchesView", TableModelFilter.class) - ); - return original; } } Index: debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/models/VariablesTableModel.java =================================================================== RCS file: /cvs/debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/models/VariablesTableModel.java,v retrieving revision 1.2 diff -u -r1.2 VariablesTableModel.java --- debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/models/VariablesTableModel.java 7 Jan 2005 09:33:26 -0000 1.2 +++ debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/models/VariablesTableModel.java 18 Jan 2005 10:32:20 -0000 @@ -58,8 +58,6 @@ if ( columnID.equals (LOCALS_TYPE_COLUMN_ID) || columnID.equals (WATCH_TYPE_COLUMN_ID) ) { - if (row instanceof JPDAWatch) - Thread.dumpStack(); if (row instanceof Variable) return getShort (((Variable) row).getType ()); } else Index: debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/ClassesView.java =================================================================== RCS file: /cvs/debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/ClassesView.java,v retrieving revision 1.6 diff -u -r1.6 ClassesView.java --- debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/ClassesView.java 4 Aug 2004 11:53:54 -0000 1.6 +++ debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/ClassesView.java 18 Jan 2005 10:32:20 -0000 @@ -44,8 +44,7 @@ return; if (tree == null) { setLayout (new BorderLayout ()); - tree = Models.createView - (null, null, null, null, new ArrayList ()); + tree = Models.createView (Models.EMPTY_MODEL); tree.setName ("ClassesView"); add (tree, "Center"); //NOI18N } Index: debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/SourcesView.java =================================================================== RCS file: /cvs/debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/SourcesView.java,v retrieving revision 1.6 diff -u -r1.6 SourcesView.java --- debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/SourcesView.java 4 Aug 2004 11:53:54 -0000 1.6 +++ debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/SourcesView.java 18 Jan 2005 10:32:20 -0000 @@ -41,8 +41,7 @@ return; if (tree == null) { setLayout (new BorderLayout ()); - tree = Models.createView - (null, null, null, null, new ArrayList ()); + tree = Models.createView (Models.EMPTY_MODEL); tree.setName ("SourcesView"); add (tree, "Center"); //NOI18N } Index: debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/ViewModelListener.java =================================================================== RCS file: /cvs/debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/ViewModelListener.java,v retrieving revision 1.3 diff -u -r1.3 ViewModelListener.java --- debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/ViewModelListener.java 7 Jan 2005 09:33:27 -0000 1.3 +++ debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/ViewModelListener.java 18 Jan 2005 10:32:20 -0000 @@ -22,6 +22,7 @@ import org.netbeans.api.debugger.DebuggerEngine; import org.netbeans.api.debugger.DebuggerManager; import org.netbeans.api.debugger.DebuggerManagerAdapter; +import org.netbeans.spi.viewmodel.Model; import org.netbeans.spi.viewmodel.Models; import org.netbeans.spi.viewmodel.ColumnModel; import org.netbeans.spi.viewmodel.TableModelFilter; @@ -30,6 +31,7 @@ import org.netbeans.spi.viewmodel.NodeModel; import org.netbeans.spi.viewmodel.NodeModelFilter; import org.netbeans.spi.viewmodel.TableModel; +import org.netbeans.spi.viewmodel.TreeExpansionModel; import org.netbeans.spi.viewmodel.TreeModel; import org.netbeans.spi.viewmodel.TreeModelFilter; import org.netbeans.spi.viewmodel.TreeModelListener; @@ -69,9 +71,7 @@ DebuggerManager.PROP_CURRENT_ENGINE, this ); - Models.setModelsToView ( - view, null, null, null, null, Collections.EMPTY_LIST - ); + Models.setModelsToView (view, Models.EMPTY_MODEL); } public void propertyChange (PropertyChangeEvent e) { @@ -79,67 +79,35 @@ } private void updateModel () { - TreeModel tm = (TreeModel) loadModel (TreeModel.class); - if (tm == null) - tm = Models.EMPTY_TREE_MODEL; - List l = loadModels (NodeModel.class); - l.add (new EmptyModel ()); - - if (verbose) { - System.out.println (""); - System.out.println (viewType + " models:"); + DebuggerManager dm = DebuggerManager.getDebuggerManager (); + DebuggerEngine e = dm.getCurrentEngine (); + ArrayList l = new ArrayList (); + if (e != null) { + l.addAll (e.lookup (viewType, TreeModel.class)); + l.addAll (e.lookup (viewType, TreeModelFilter.class)); + l.addAll (e.lookup (viewType, TreeExpansionModel.class)); + l.addAll (e.lookup (viewType, NodeModel.class)); + l.addAll (e.lookup (viewType, NodeModelFilter.class)); + l.addAll (e.lookup (viewType, TableModel.class)); + l.addAll (e.lookup (viewType, TableModelFilter.class)); + l.addAll (e.lookup (viewType, NodeActionsProvider.class)); + l.addAll (e.lookup (viewType, NodeActionsProviderFilter.class)); + l.addAll (e.lookup (viewType, ColumnModel.class)); + l.addAll (e.lookup (viewType, Model.class)); } + l.addAll (dm.lookup (viewType, TreeModel.class)); + l.addAll (dm.lookup (viewType, TreeModelFilter.class)); + l.addAll (dm.lookup (viewType, TreeExpansionModel.class)); + l.addAll (dm.lookup (viewType, NodeModel.class)); + l.addAll (dm.lookup (viewType, NodeModelFilter.class)); + l.addAll (dm.lookup (viewType, TableModel.class)); + l.addAll (dm.lookup (viewType, TableModelFilter.class)); + l.addAll (dm.lookup (viewType, NodeActionsProvider.class)); + l.addAll (dm.lookup (viewType, NodeActionsProviderFilter.class)); + l.addAll (dm.lookup (viewType, ColumnModel.class)); + l.addAll (dm.lookup (viewType, Model.class)); - Models.setModelsToView ( - view, - Models.createCompoundTreeModel ( - tm, - loadModels (TreeModelFilter.class) - ), - Models.createCompoundNodeModel ( - Models.createCompoundNodeModel ( - l - ), - loadModels (NodeModelFilter.class) - ), - Models.createCompoundTableModel ( - Models.createCompoundTableModel ( - loadModels (TableModel.class) - ), - loadModels (TableModelFilter.class) - ), - Models.createCompoundNodeActionsProvider ( - Models.createCompoundNodeActionsProvider ( - loadModels (NodeActionsProvider.class) - ), - loadModels (NodeActionsProviderFilter.class) - ), - loadModels (ColumnModel.class) - ); - - } - - private Object loadModel (Class modelType) { - DebuggerEngine e = DebuggerManager.getDebuggerManager (). - getCurrentEngine (); - Object m = null; - if (e != null) - m = e.lookupFirst (viewType, modelType); - if (m == null) - m = DebuggerManager.getDebuggerManager (). - lookupFirst (viewType, modelType); - return m; - } - - private List loadModels (Class modelType) { - DebuggerEngine e = DebuggerManager.getDebuggerManager (). - getCurrentEngine (); - List l = new ArrayList (); - if (e != null) - l.addAll (e.lookup (viewType, modelType)); - l.addAll (DebuggerManager.getDebuggerManager (). - lookup (viewType, modelType)); - return l; + Models.setModelsToView (view, Models.createCompoundModel (l)); }