This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 46167
Collapse All | Expand All

(-)debuggercore/src/org/netbeans/modules/debugger/ui/models/SessionsTableModel.java (-6 / +6 lines)
Lines 36-47 Link Here
36
36
37
    
37
    
38
    public SessionsTableModel () {
38
    public SessionsTableModel () {
39
        Session session = DebuggerManager.getDebuggerManager ().
39
//        Session session = DebuggerManager.getDebuggerManager ().
40
            getCurrentSession ();
40
//            getCurrentSession ();
41
        session.addPropertyChangeListener (
41
//        session.addPropertyChangeListener (
42
            Session.PROP_CURRENT_LANGUAGE, 
42
//            Session.PROP_CURRENT_LANGUAGE, 
43
            this
43
//            this
44
        );
44
//        );
45
    }
45
    }
46
    
46
    
47
    public Object getValueAt (Object row, String columnID) throws 
47
    public Object getValueAt (Object row, String columnID) throws 
(-)debuggercore/src/org/netbeans/modules/debugger/ui/views/BreakpointsView.java (-4 / +5 lines)
Lines 46-53 Link Here
46
            return;
46
            return;
47
        if (tree == null) {
47
        if (tree == null) {
48
            setLayout (new BorderLayout ());
48
            setLayout (new BorderLayout ());
49
            tree = Models.createView 
49
            tree = Models.createView (Models.EMPTY_MODEL);
50
                (null, null, null, null, new ArrayList ());
51
            tree.setName ("BreakpointsView");
50
            tree.setName ("BreakpointsView");
52
            add (tree, "Center");  //NOI18N
51
            add (tree, "Center");  //NOI18N
53
        }
52
        }
Lines 76-85 Link Here
76
    }
75
    }
77
    
76
    
78
    public String getName () {
77
    public String getName () {
79
        return NbBundle.getMessage (BreakpointsView.class, "CTL_Breakpoints_view");
78
        return NbBundle.getMessage 
79
            (BreakpointsView.class, "CTL_Breakpoints_view");
80
    }
80
    }
81
    
81
    
82
    public String getToolTipText () {
82
    public String getToolTipText () {
83
        return NbBundle.getMessage (BreakpointsView.class, "CTL_Breakpoints_view_tooltip");// NOI18N
83
        return NbBundle.getMessage 
84
            (BreakpointsView.class, "CTL_Breakpoints_view_tooltip");// NOI18N
84
    }
85
    }
85
}
86
}
(-)debuggercore/src/org/netbeans/modules/debugger/ui/views/CallStackView.java (-2 / +1 lines)
Lines 46-53 Link Here
46
            return;
46
            return;
47
        if (tree == null) {
47
        if (tree == null) {
48
            setLayout (new BorderLayout ());
48
            setLayout (new BorderLayout ());
49
            tree = Models.createView 
49
            tree = Models.createView (Models.EMPTY_MODEL);
50
                (null, null, null, null, new ArrayList ());
51
            tree.setName ("CallStackView");
50
            tree.setName ("CallStackView");
52
            add (tree, "Center");  //NOI18N
51
            add (tree, "Center");  //NOI18N
53
        }
52
        }
(-)debuggercore/src/org/netbeans/modules/debugger/ui/views/LocalsView.java (-2 / +1 lines)
Lines 46-53 Link Here
46
            return;
46
            return;
47
        if (tree == null) {
47
        if (tree == null) {
48
            setLayout (new BorderLayout ());
48
            setLayout (new BorderLayout ());
49
            tree = Models.createView 
49
            tree = Models.createView (Models.EMPTY_MODEL);
50
                (null, null, null, null, new ArrayList ());
51
            tree.setName ("LocalsView");
50
            tree.setName ("LocalsView");
52
            add (tree, "Center");  //NOI18N
51
            add (tree, "Center");  //NOI18N
53
        }
52
        }
(-)debuggercore/src/org/netbeans/modules/debugger/ui/views/SessionsView.java (-2 / +1 lines)
Lines 49-56 Link Here
49
            return;
49
            return;
50
        if (tree == null) {
50
        if (tree == null) {
51
            setLayout (new BorderLayout ());
51
            setLayout (new BorderLayout ());
52
            tree = Models.createView
52
            tree = Models.createView (Models.EMPTY_MODEL);
53
                (null, null, null, null, new ArrayList ());
54
            tree.setName ("SessionsView");
53
            tree.setName ("SessionsView");
55
            add (tree, "Center");  //NOI18N
54
            add (tree, "Center");  //NOI18N
56
        }
55
        }
(-)debuggercore/src/org/netbeans/modules/debugger/ui/views/ThreadsView.java (-2 / +1 lines)
Lines 47-54 Link Here
47
            return;
47
            return;
48
        if (tree == null) {
48
        if (tree == null) {
49
            setLayout (new BorderLayout ());
49
            setLayout (new BorderLayout ());
50
            tree = Models.createView 
50
            tree = Models.createView (Models.EMPTY_MODEL);
51
                (null, null, null, null, new ArrayList ());
52
            tree.setName ("ThreadsView");
51
            tree.setName ("ThreadsView");
53
            add (tree, "Center");  //NOI18N
52
            add (tree, "Center");  //NOI18N
54
        }
53
        }
(-)debuggercore/src/org/netbeans/modules/debugger/ui/views/ViewModelListener.java (-64 / +30 lines)
Lines 27-32 Link Here
27
import org.netbeans.api.debugger.DebuggerEngine;
27
import org.netbeans.api.debugger.DebuggerEngine;
28
import org.netbeans.api.debugger.DebuggerManager;
28
import org.netbeans.api.debugger.DebuggerManager;
29
import org.netbeans.api.debugger.DebuggerManagerAdapter;
29
import org.netbeans.api.debugger.DebuggerManagerAdapter;
30
import org.netbeans.spi.viewmodel.Model;
30
import org.netbeans.spi.viewmodel.Models;
31
import org.netbeans.spi.viewmodel.Models;
31
import org.netbeans.spi.viewmodel.ColumnModel;
32
import org.netbeans.spi.viewmodel.ColumnModel;
32
import org.netbeans.spi.viewmodel.TableModelFilter;
33
import org.netbeans.spi.viewmodel.TableModelFilter;
Lines 35-40 Link Here
35
import org.netbeans.spi.viewmodel.NodeModel;
36
import org.netbeans.spi.viewmodel.NodeModel;
36
import org.netbeans.spi.viewmodel.NodeModelFilter;
37
import org.netbeans.spi.viewmodel.NodeModelFilter;
37
import org.netbeans.spi.viewmodel.TableModel;
38
import org.netbeans.spi.viewmodel.TableModel;
39
import org.netbeans.spi.viewmodel.TreeExpansionModel;
38
import org.netbeans.spi.viewmodel.TreeModel;
40
import org.netbeans.spi.viewmodel.TreeModel;
39
import org.netbeans.spi.viewmodel.TreeModelFilter;
41
import org.netbeans.spi.viewmodel.TreeModelFilter;
40
import org.netbeans.spi.viewmodel.TreeModelListener;
42
import org.netbeans.spi.viewmodel.TreeModelListener;
Lines 76-86 Link Here
76
        );
78
        );
77
        Models.setModelsToView (
79
        Models.setModelsToView (
78
            view, 
80
            view, 
79
            Models.EMPTY_TREE_MODEL, 
81
            Models.EMPTY_MODEL
80
            Models.EMPTY_NODE_MODEL, 
81
            Models.EMPTY_TABLE_MODEL, 
82
            Models.EMPTY_NODE_ACTIONS_PROVIDER, 
83
            Collections.EMPTY_LIST
84
        );
82
        );
85
    }
83
    }
86
84
Lines 89-155 Link Here
89
    }
87
    }
90
    
88
    
91
    private void updateModel () {
89
    private void updateModel () {
92
        TreeModel tm = (TreeModel) loadModel (TreeModel.class);
90
        DebuggerManager dm = DebuggerManager.getDebuggerManager ();
93
        if (tm == null)
91
        DebuggerEngine e = dm.getCurrentEngine ();
94
            tm = Models.EMPTY_TREE_MODEL;
92
        ArrayList l = new ArrayList ();
95
        List l = loadModels (NodeModel.class);
93
        if (e != null) {
96
        l.add (new EmptyModel ());
94
            l.addAll (e.lookup (viewType, TreeModel.class));
97
        
95
            l.addAll (e.lookup (viewType, TreeModelFilter.class));
98
        if (verbose) {
96
            l.addAll (e.lookup (viewType, TreeExpansionModel.class));
99
            System.out.println ("");
97
            l.addAll (e.lookup (viewType, NodeModel.class));
100
            System.out.println (viewType + " models:");
98
            l.addAll (e.lookup (viewType, NodeModelFilter.class));
99
            l.addAll (e.lookup (viewType, TableModel.class));
100
            l.addAll (e.lookup (viewType, TableModelFilter.class));
101
            l.addAll (e.lookup (viewType, NodeActionsProvider.class));
102
            l.addAll (e.lookup (viewType, NodeActionsProviderFilter.class));
103
            l.addAll (e.lookup (viewType, ColumnModel.class));
104
            l.addAll (e.lookup (viewType, Model.class));
101
        }
105
        }
106
        l.addAll (dm.lookup (viewType, TreeModel.class));
107
        l.addAll (dm.lookup (viewType, TreeModelFilter.class));
108
        l.addAll (dm.lookup (viewType, TreeExpansionModel.class));
109
        l.addAll (dm.lookup (viewType, NodeModel.class));
110
        l.addAll (dm.lookup (viewType, NodeModelFilter.class));
111
        l.addAll (dm.lookup (viewType, TableModel.class));
112
        l.addAll (dm.lookup (viewType, TableModelFilter.class));
113
        l.addAll (dm.lookup (viewType, NodeActionsProvider.class));
114
        l.addAll (dm.lookup (viewType, NodeActionsProviderFilter.class));
115
        l.addAll (dm.lookup (viewType, ColumnModel.class));
116
        l.addAll (dm.lookup (viewType, Model.class));
102
        
117
        
103
        Models.setModelsToView (
118
        Models.setModelsToView (view, Models.createCompoundModel (l));
104
            view, 
105
            Models.createCompoundTreeModel (
106
                tm, 
107
                loadModels (TreeModelFilter.class)
108
            ),
109
            Models.createCompoundNodeModel (
110
                Models.createCompoundNodeModel (
111
                    l
112
                ),
113
                loadModels (NodeModelFilter.class)
114
            ),
115
            Models.createCompoundTableModel (
116
                Models.createCompoundTableModel (
117
                    loadModels (TableModel.class)
118
                ),
119
                loadModels (TableModelFilter.class)
120
            ),
121
            Models.createCompoundNodeActionsProvider (
122
                Models.createCompoundNodeActionsProvider (
123
                    loadModels (NodeActionsProvider.class)
124
                ),
125
                loadModels (NodeActionsProviderFilter.class)
126
            ),
127
            loadModels (ColumnModel.class)
128
        );
129
                    
130
    }
131
    
132
    private Object loadModel (Class modelType) {
133
        DebuggerEngine e = DebuggerManager.getDebuggerManager ().
134
            getCurrentEngine ();
135
        Object m = null;
136
        if (e != null)
137
            m = e.lookupFirst (viewType, modelType);
138
        if (m == null)
139
            m = DebuggerManager.getDebuggerManager ().
140
                lookupFirst (viewType, modelType);
141
        return m;
142
    }
143
144
    private List loadModels (Class modelType) {
145
        DebuggerEngine e = DebuggerManager.getDebuggerManager ().
146
            getCurrentEngine ();
147
        List l = new ArrayList ();
148
        if (e != null)
149
            l.addAll (e.lookup (viewType, modelType));
150
        l.addAll (DebuggerManager.getDebuggerManager ().
151
            lookup (viewType, modelType));
152
        return l;
153
    }
119
    }
154
120
155
    
121
    
(-)debuggercore/src/org/netbeans/modules/debugger/ui/views/WatchesView.java (-2 / +1 lines)
Lines 46-53 Link Here
46
            return;
46
            return;
47
        if (tree == null) {
47
        if (tree == null) {
48
            setLayout (new BorderLayout ());
48
            setLayout (new BorderLayout ());
49
            tree = Models.createView 
49
            tree = Models.createView (Models.EMPTY_MODEL);
50
                (null, null, null, null, new ArrayList ());
51
            tree.setName ("WatchesView");
50
            tree.setName ("WatchesView");
52
            add (tree, "Center");  //NOI18N
51
            add (tree, "Center");  //NOI18N
53
        }
52
        }
(-)debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java (-48 / +24 lines)
Lines 18-23 Link Here
18
import java.beans.PropertyEditor;
18
import java.beans.PropertyEditor;
19
import java.lang.IllegalAccessException;
19
import java.lang.IllegalAccessException;
20
import java.lang.ref.WeakReference;
20
import java.lang.ref.WeakReference;
21
import java.util.Arrays;
21
import java.util.Collections;
22
import java.util.Collections;
22
import java.util.HashMap;
23
import java.util.HashMap;
23
import java.util.Map;
24
import java.util.Map;
Lines 25-32 Link Here
25
import javax.swing.AbstractAction;
26
import javax.swing.AbstractAction;
26
import javax.swing.Action;
27
import javax.swing.Action;
27
import javax.swing.KeyStroke;
28
import javax.swing.KeyStroke;
29
import javax.swing.SwingUtilities;
28
30
29
import org.netbeans.spi.viewmodel.ColumnModel;
31
import org.netbeans.spi.viewmodel.ColumnModel;
32
import org.netbeans.spi.viewmodel.Models;
30
import org.netbeans.spi.viewmodel.UnknownTypeException;
33
import org.netbeans.spi.viewmodel.UnknownTypeException;
31
34
32
import org.openide.nodes.AbstractNode;
35
import org.openide.nodes.AbstractNode;
Lines 47-53 Link Here
47
    
50
    
48
    // variables ...............................................................
51
    // variables ...............................................................
49
52
50
    private CompoundModel       model;
53
    private Models.CompoundModel model;
51
    private TreeModelRoot       treeModelRoot;
54
    private TreeModelRoot       treeModelRoot;
52
    private Object              object;
55
    private Object              object;
53
    
56
    
Lines 63-71 Link Here
63
    * Creates root of call stack for given producer.
66
    * Creates root of call stack for given producer.
64
    */
67
    */
65
    public TreeModelNode ( 
68
    public TreeModelNode ( 
66
        CompoundModel model, 
69
        final Models.CompoundModel model, 
67
        TreeModelRoot treeModelRoot,
70
        final TreeModelRoot treeModelRoot,
68
        Object object
71
        final Object object
69
    ) {
72
    ) {
70
        super (
73
        super (
71
            createChildren (model, treeModelRoot, object),
74
            createChildren (model, treeModelRoot, object),
Lines 94-100 Link Here
94
    }
97
    }
95
    
98
    
96
    private static Children createChildren (
99
    private static Children createChildren (
97
        CompoundModel model, 
100
        Models.CompoundModel model, 
98
        TreeModelRoot treeModelRoot,
101
        TreeModelRoot treeModelRoot,
99
        Object object
102
        Object object
100
    ) {
103
    ) {
Lines 114-159 Link Here
114
        }
117
        }
115
    }
118
    }
116
    
119
    
117
//    public String getName () {
118
//        try {
119
//            if (name == null) {
120
//                name = model.getDisplayName (object);
121
//                if (name == null) 
122
//                    throw new NullPointerException (
123
//                        "Model: " + model + ".getDisplayName (" + object + 
124
//                        ") = null!"
125
//                    );
126
//            }
127
//            return name;
128
//        } catch (UnknownTypeException e) {
129
//            e.printStackTrace ();
130
//            System.out.println (model);
131
//            System.out.println ();
132
//            return object.toString ();
133
//        } catch (final ComputingException ex) {
134
//            name = "";
135
//            RequestProcessor.getDefault ().post (new Runnable () {
136
//                public void run () {
137
//                    name = (String) ex.getValue ();
138
//                    if (name == null) {
139
//                        name = "?";
140
//                        throw new NullPointerException (
141
//                            "Model: " + model + ".getDisplayName (" + object + 
142
//                            ") = null!"
143
//                        );
144
//                    }
145
//                    setName (name);
146
//                    setDisplayName (name);
147
//                }
148
//            });
149
//            return "";
150
//        }
151
//    }
152
//    
153
//    public String getDisplayName () {
154
//        return getName ();
155
//    }
156
    
157
    public String getShortDescription () {
120
    public String getShortDescription () {
158
        if (shortDescription == null) {
121
        if (shortDescription == null) {
159
            RequestProcessor.getDefault ().post (new Runnable () {
122
            RequestProcessor.getDefault ().post (new Runnable () {
Lines 312-325 Link Here
312
    private static final class TreeModelChildren extends Children.Keys {
275
    private static final class TreeModelChildren extends Children.Keys {
313
            
276
            
314
        private boolean             initialezed = false;
277
        private boolean             initialezed = false;
315
        private CompoundModel       model;
278
        private Models.CompoundModel model;
316
        private TreeModelRoot       treeModelRoot;
279
        private TreeModelRoot       treeModelRoot;
317
        private Object              object;
280
        private Object              object;
318
        private WeakHashMap         objectToNode = new WeakHashMap ();
281
        private WeakHashMap         objectToNode = new WeakHashMap ();
319
        
282
        
320
        
283
        
321
        TreeModelChildren (
284
        TreeModelChildren (
322
            CompoundModel   model,
285
            Models.CompoundModel model,
323
            TreeModelRoot   treeModelRoot,
286
            TreeModelRoot   treeModelRoot,
324
            Object          object
287
            Object          object
325
        ) {
288
        ) {
Lines 352-357 Link Here
352
                            System.out.println ();
315
                            System.out.println ();
353
                        }
316
                        }
354
                        setKeys (new Object [0]);
317
                        setKeys (new Object [0]);
318
                        return;
355
                    }
319
                    }
356
                }
320
                }
357
            });
321
            });
Lines 359-365 Link Here
359
        
323
        
360
        void refreshChildren (int count) {
324
        void refreshChildren (int count) {
361
            try {
325
            try {
362
                Object[] ch = model.getChildren (
326
                final Object[] ch = model.getChildren (
363
                    object, 
327
                    object, 
364
                    0, 
328
                    0, 
365
                    count
329
                    count
Lines 382-387 Link Here
382
                }
346
                }
383
                objectToNode = newObjectToNode;
347
                objectToNode = newObjectToNode;
384
                setKeys (ch);
348
                setKeys (ch);
349
                
350
                SwingUtilities.invokeLater (new Runnable () {
351
                    public void run () {
352
                        int i, k = ch.length;
353
                        for (i = 0; i < k; i++)
354
                            try {
355
                                if (model.isExpanded (ch [i]))
356
                                    treeModelRoot.getTreeTable ().expandNode (ch [i]);
357
                            } catch (UnknownTypeException ex) {
358
                            }
359
                    }
360
                });
385
            } catch (UnknownTypeException e) {
361
            } catch (UnknownTypeException e) {
386
                setKeys (new Object [0]);
362
                setKeys (new Object [0]);
387
                if (!(object instanceof String)) {
363
                if (!(object instanceof String)) {
(-)debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeModelRoot.java (-3 / +10 lines)
Lines 18-23 Link Here
18
import java.util.Iterator;
18
import java.util.Iterator;
19
import java.util.WeakHashMap;
19
import java.util.WeakHashMap;
20
import javax.swing.SwingUtilities;
20
import javax.swing.SwingUtilities;
21
import org.netbeans.spi.viewmodel.Models;
21
22
22
import org.netbeans.spi.viewmodel.TreeModel;
23
import org.netbeans.spi.viewmodel.TreeModel;
23
import org.netbeans.spi.viewmodel.TreeModelListener;
24
import org.netbeans.spi.viewmodel.TreeModelListener;
Lines 38-52 Link Here
38
    
39
    
39
    // variables ...............................................................
40
    // variables ...............................................................
40
41
41
    private CompoundModel model;
42
    private Models.CompoundModel model;
42
    private TreeModelNode rootNode;
43
    private TreeModelNode rootNode;
43
    private WeakHashMap objectToNode = new WeakHashMap ();
44
    private WeakHashMap objectToNode = new WeakHashMap ();
45
    private TreeTable treeTable;
44
46
45
47
46
    public TreeModelRoot (CompoundModel model) {
48
    public TreeModelRoot (Models.CompoundModel model, TreeTable treeTable) {
47
        this.model = model;
49
        this.model = model;
50
        this.treeTable = treeTable;
48
        model.addTreeModelListener (this);
51
        model.addTreeModelListener (this);
49
    }
52
    }
53
    
54
    public TreeTable getTreeTable () {
55
        return treeTable;
56
    }
50
57
51
    public TreeModelNode getRootNode () {
58
    public TreeModelNode getRootNode () {
52
        if (rootNode == null)
59
        if (rootNode == null)
Lines 58-64 Link Here
58
        objectToNode.put (o, new WeakReference (n));
65
        objectToNode.put (o, new WeakReference (n));
59
    }
66
    }
60
    
67
    
61
    private TreeModelNode findNode (Object o) {
68
    TreeModelNode findNode (Object o) {
62
        WeakReference wr = (WeakReference) objectToNode.get (o);
69
        WeakReference wr = (WeakReference) objectToNode.get (o);
63
        if (wr == null) return null;
70
        if (wr == null) return null;
64
        return (TreeModelNode) wr.get ();
71
        return (TreeModelNode) wr.get ();
(-)debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeTable.java (-6 / +68 lines)
Lines 23-28 Link Here
23
import javax.swing.JPanel;
23
import javax.swing.JPanel;
24
import javax.swing.JScrollPane;
24
import javax.swing.JScrollPane;
25
import javax.swing.JTable;
25
import javax.swing.JTable;
26
import javax.swing.JTree;
26
import javax.swing.SwingUtilities;
27
import javax.swing.SwingUtilities;
27
import javax.swing.event.TreeExpansionListener;
28
import javax.swing.event.TreeExpansionListener;
28
import javax.swing.event.TreeExpansionEvent;
29
import javax.swing.event.TreeExpansionEvent;
Lines 35-40 Link Here
35
36
36
import org.netbeans.spi.viewmodel.Models;
37
import org.netbeans.spi.viewmodel.Models;
37
import org.netbeans.spi.viewmodel.ColumnModel;
38
import org.netbeans.spi.viewmodel.ColumnModel;
39
import org.netbeans.spi.viewmodel.UnknownTypeException;
38
import org.openide.explorer.ExplorerActions;
40
import org.openide.explorer.ExplorerActions;
39
41
40
import org.openide.explorer.ExplorerManager;
42
import org.openide.explorer.ExplorerManager;
Lines 61-73 Link Here
61
 * @author   Jan Jancura
63
 * @author   Jan Jancura
62
 */
64
 */
63
public class TreeTable extends JPanel implements 
65
public class TreeTable extends JPanel implements 
64
ExplorerManager.Provider, PropertyChangeListener {
66
ExplorerManager.Provider, PropertyChangeListener, TreeExpansionListener {
65
    
67
    
66
    private ExplorerManager     explorerManager;
68
    private ExplorerManager     explorerManager;
67
    private MyTreeTable         treeTable;
69
    private MyTreeTable         treeTable;
68
    private Node.Property[]     columns;
70
    private Node.Property[]     columns;
69
    private List                expandedPaths = new ArrayList ();
71
    private List                expandedPaths = new ArrayList ();
70
    private TreeModelRoot       currentTreeModelRoot;
72
    private TreeModelRoot       currentTreeModelRoot;
73
    private Models.CompoundModel model;
74
    
71
    
75
    
72
    private ExplorerActions     explorerActions = new ExplorerActions ();
76
    private ExplorerActions     explorerActions = new ExplorerActions ();
73
    {explorerActions.setConfirmDelete (false);}
77
    {explorerActions.setConfirmDelete (false);}
Lines 83-91 Link Here
83
            treeTable.setHorizontalScrollBarPolicy 
87
            treeTable.setHorizontalScrollBarPolicy 
84
                (JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
88
                (JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
85
        add (treeTable, "Center");  //NOI18N
89
        add (treeTable, "Center");  //NOI18N
90
        treeTable.getTree ().addTreeExpansionListener (this);
86
    }
91
    }
87
    
92
    
88
    public void setModel (CompoundModel model) {
93
    public void setModel (Models.CompoundModel model) {
94
        this.model = model;
89
        
95
        
90
        // 1) destroy old model
96
        // 1) destroy old model
91
        if (currentTreeModelRoot != null) 
97
        if (currentTreeModelRoot != null) 
Lines 107-113 Link Here
107
        columns = createColumns (model);
113
        columns = createColumns (model);
108
        treeTable.setProperties (columns);
114
        treeTable.setProperties (columns);
109
        
115
        
110
        
116
        treeTable.setToolTipText ("tttttttttttttttttttttttt");
117
        setToolTipText ("aaaaaaaaaaaaaaaaaaaaa");
111
//        try {
118
//        try {
112
//            treeTable.setToolTipText (model.getShortDescription (
119
//            treeTable.setToolTipText (model.getShortDescription (
113
//                model.getRoot ()
120
//                model.getRoot ()
Lines 118-124 Link Here
118
//        }
125
//        }
119
        
126
        
120
        // 5) set root node for given model
127
        // 5) set root node for given model
121
        currentTreeModelRoot = new TreeModelRoot (model);
128
        currentTreeModelRoot = new TreeModelRoot (model, this);
122
        getExplorerManager ().setRootContext (
129
        getExplorerManager ().setRootContext (
123
            currentTreeModelRoot.getRootNode ()
130
            currentTreeModelRoot.getRootNode ()
124
        );
131
        );
Lines 130-136 Link Here
130
        final List backupPath = new ArrayList(expandedPaths);
137
        final List backupPath = new ArrayList(expandedPaths);
131
        SwingUtilities.invokeLater(new Runnable() {
138
        SwingUtilities.invokeLater(new Runnable() {
132
            public void run() {
139
            public void run() {
133
                treeTable.expandNodes (backupPath);
140
                if (backupPath.size () == 0)
141
                    try {
142
                        expandDefault (
143
                            TreeTable.this.model.getChildren 
144
                            (TreeTable.this.model.getRoot (), 0, 0));
145
                    } catch (UnknownTypeException ex) {
146
                        
147
                    }
148
                else
149
                    treeTable.expandNodes (backupPath);
134
            }
150
            }
135
        });
151
        });
136
        if (ep.size () > 0) expandedPaths = ep;
152
        if (ep.size () > 0) expandedPaths = ep;
Lines 159-164 Link Here
159
        }
175
        }
160
    }
176
    }
161
    
177
    
178
    /**
179
      * Called whenever an item in the tree has been expanded.
180
      */
181
    public void treeExpanded (TreeExpansionEvent event) {
182
        TreeModelNode tmn = (TreeModelNode) Visualizer.findNode 
183
            (event.getPath ().getLastPathComponent ());
184
        model.nodeExpanded (tmn.getObject ());
185
    }
186
187
    /**
188
      * Called whenever an item in the tree has been collapsed.
189
      */
190
    public void treeCollapsed (TreeExpansionEvent event) {
191
        TreeModelNode tmn = (TreeModelNode) Visualizer.findNode 
192
            (event.getPath ().getLastPathComponent ());
193
        model.nodeCollapsed (tmn.getObject ());
194
    }
195
    
162
    private boolean equalNodes () {
196
    private boolean equalNodes () {
163
        Node[] ns1 = TopComponent.getRegistry ().getCurrentNodes ();
197
        Node[] ns1 = TopComponent.getRegistry ().getCurrentNodes ();
164
        Node[] ns2 = getExplorerManager ().getSelectedNodes ();
198
        Node[] ns2 = getExplorerManager ().getSelectedNodes ();
Lines 171-177 Link Here
171
        return true;
205
        return true;
172
    }
206
    }
173
    
207
    
174
    private Node.Property[] createColumns (CompoundModel model) {
208
    private Node.Property[] createColumns (Models.CompoundModel model) {
175
        ColumnModel[] cs = model.getColumns ();
209
        ColumnModel[] cs = model.getColumns ();
176
        int i, k = cs.length;
210
        int i, k = cs.length;
177
        Node.Property[] columns = new Column [k];
211
        Node.Property[] columns = new Column [k];
Lines 240-245 Link Here
240
        }
274
        }
241
    }
275
    }
242
    
276
    
277
    private void expandDefault (Object[] nodes) {
278
        int i, k = nodes.length;
279
        for (i = 0; i < k; i++)
280
            try {
281
                if (model.isExpanded (nodes [i]))
282
                    expandNode (nodes [i]);
283
            } catch (UnknownTypeException ex) {
284
            }
285
    }
286
    
243
    /** Requests focus for the tree component. Overrides superclass method. */
287
    /** Requests focus for the tree component. Overrides superclass method. */
244
    public boolean requestFocusInWindow () {
288
    public boolean requestFocusInWindow () {
245
        super.requestFocusInWindow ();
289
        super.requestFocusInWindow ();
Lines 257-263 Link Here
257
        TopComponent.getRegistry ().removePropertyChangeListener (this);
301
        TopComponent.getRegistry ().removePropertyChangeListener (this);
258
        getExplorerManager ().removePropertyChangeListener (this);
302
        getExplorerManager ().removePropertyChangeListener (this);
259
    }
303
    }
304
    
305
    public boolean isExpanded (Object node) {
306
        Node n = currentTreeModelRoot.findNode (node);
307
        return treeTable.isExpanded (n);
308
    }
309
310
    public void expandNode (Object node) {
311
        Node n = currentTreeModelRoot.findNode (node);
312
        treeTable.expandNode (n);
313
    }
260
314
315
    public void collapseNode (Object node) {
316
        Node n = currentTreeModelRoot.findNode (node);
317
        treeTable.collapseNode (n);
318
    }
261
    
319
    
262
    private static class MyTreeTable extends TreeTableView {
320
    private static class MyTreeTable extends TreeTableView {
263
        MyTreeTable () {
321
        MyTreeTable () {
Lines 268-273 Link Here
268
        
326
        
269
        JTable getTable () {
327
        JTable getTable () {
270
            return treeTable;
328
            return treeTable;
329
        }
330
        
331
        JTree getTree () {
332
            return tree;
271
        }
333
        }
272
334
273
        public List getExpandedPaths () {
335
        public List getExpandedPaths () {
(-)debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/ColumnModel.java (-1 / +1 lines)
Lines 24-30 Link Here
24
 *
24
 *
25
 * @author   Jan Jancura
25
 * @author   Jan Jancura
26
 */
26
 */
27
public abstract class ColumnModel {
27
public abstract class ColumnModel implements Model {
28
    
28
    
29
    
29
    
30
    /**
30
    /**
(-)debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/Models.java (-193 / +734 lines)
Lines 27-33 Link Here
27
import javax.swing.JComponent;
27
import javax.swing.JComponent;
28
import javax.swing.SwingUtilities;
28
import javax.swing.SwingUtilities;
29
29
30
import org.netbeans.modules.viewmodel.CompoundModel;
31
import org.netbeans.modules.viewmodel.TreeModelNode;
30
import org.netbeans.modules.viewmodel.TreeModelNode;
32
import org.netbeans.modules.viewmodel.TreeTable;
31
import org.netbeans.modules.viewmodel.TreeTable;
33
32
Lines 54-64 Link Here
54
 */
53
 */
55
public final class Models {
54
public final class Models {
56
55
57
    public static final TreeModel EMPTY_TREE_MODEL = new EmptyTreeModel ();
56
    /**
58
    public static final NodeModel EMPTY_NODE_MODEL = new EmptyNodeModel ();
57
     * Empty model - returns default root node with no children.
59
    public static final TableModel EMPTY_TABLE_MODEL = new EmptyTableModel ();
58
     */
60
    public static final NodeActionsProvider EMPTY_NODE_ACTIONS_PROVIDER = 
59
    public static CompoundModel EMPTY_MODEL = createCompoundModel 
61
        new EmptyNodeActionsProvider ();
60
        (new ArrayList ());
61
    
62
    
62
    
63
    public static int MULTISELECTION_TYPE_EXACTLY_ONE = 1;
63
    public static int MULTISELECTION_TYPE_EXACTLY_ONE = 1;
64
    public static int MULTISELECTION_TYPE_ALL = 2;
64
    public static int MULTISELECTION_TYPE_ALL = 2;
Lines 85-107 Link Here
85
     * @return new instance of complete model
85
     * @return new instance of complete model
86
     */
86
     */
87
    public static JComponent createView (
87
    public static JComponent createView (
88
        TreeModel treeModel, 
88
        CompoundModel compoundModel
89
        NodeModel nodeModel, 
90
        TableModel tableModel,
91
        NodeActionsProvider nodeActionsProvider,
92
        List columnModels
93
    ) {
89
    ) {
94
        TreeTable tt = new TreeTable ();
90
        TreeTable tt = new TreeTable ();
95
        if (treeModel != null) {
91
        tt.setModel (compoundModel);
96
            CompoundModel cm = new CompoundModel (
97
                treeModel,
98
                nodeModel,
99
                nodeActionsProvider,
100
                columnModels,
101
                tableModel
102
            );
103
            tt.setModel (cm);
104
        }
105
        return tt;
92
        return tt;
106
    }
93
    }
107
    
94
    
Lines 117-181 Link Here
117
     */
104
     */
118
    public static void setModelsToView (
105
    public static void setModelsToView (
119
        final JComponent view,
106
        final JComponent view,
120
        TreeModel treeModel, 
107
        final CompoundModel compoundModel
121
        NodeModel nodeModel, 
122
        TableModel tableModel,
123
        NodeActionsProvider nodeActionsProvider,
124
        List columnModels
125
    ) {
108
    ) {
126
        if (verbose) {
109
        if (verbose)
127
            System.out.println ("  TreeModel:");
110
            System.out.println (compoundModel);
128
            if (treeModel instanceof CompoundTreeModel)
129
                System.out.println (((CompoundTreeModel) treeModel).toString ("    "));
130
            else
131
                System.out.println ("    " + treeModel);
132
            
133
            System.out.println ("  NodeModel:");
134
            if (nodeModel instanceof CompoundNodeModel)
135
                System.out.println (((CompoundNodeModel) nodeModel).toString ("    "));
136
            else
137
            if (nodeModel instanceof DelegatingNodeModel)
138
                System.out.println (((DelegatingNodeModel) nodeModel).toString ("    "));
139
            else
140
                System.out.println ("    " + nodeModel);
141
            
142
            System.out.println ("  NodeActionsProvider:");
143
            if (nodeActionsProvider instanceof CompoundNodeActionsProvider)
144
                System.out.println (((CompoundNodeActionsProvider) nodeActionsProvider).toString ("    "));
145
            else
146
            if (nodeActionsProvider instanceof DelegatingNodeActionsProvider)
147
                System.out.println (((DelegatingNodeActionsProvider) nodeActionsProvider).toString ("    "));
148
            else
149
                System.out.println ("    " + nodeActionsProvider);
150
151
            System.out.println ("  ColumnModels:");
152
            int i, k = columnModels.size ();
153
            for (i = 0; i < k; i++)
154
                System.out.println ("    " + columnModels.get (i));
155
            
156
            System.out.println ("  TableModel:");
157
            if (tableModel instanceof CompoundTableModel)
158
                System.out.println (((CompoundTableModel) tableModel).toString ("    "));
159
            else
160
            if (tableModel instanceof DelegatingTableModel)
161
                System.out.println (((DelegatingTableModel) tableModel).toString ("    "));
162
            else
163
                System.out.println ("    " + tableModel);
164
        }
165
        final CompoundModel cm = new CompoundModel (
166
            treeModel,
167
            nodeModel,
168
            nodeActionsProvider,
169
            columnModels,
170
            tableModel
171
        );
172
        SwingUtilities.invokeLater (new Runnable () {
111
        SwingUtilities.invokeLater (new Runnable () {
173
            public void run () {
112
            public void run () {
174
                ((TreeTable) view).setModel (cm);
113
                ((TreeTable) view).setModel (compoundModel);
175
            }
114
            }
176
        });
115
        });
177
    }
116
    }
178
    
117
    
118
    public static CompoundModel createCompoundModel (List models) {
119
        List treeModels =           new ArrayList ();
120
        List treeModelFilters =     new ArrayList ();
121
        List treeExpansionModels =  new ArrayList ();
122
        List nodeModels =           new ArrayList ();
123
        List nodeModelFilters =     new ArrayList ();
124
        List tableModels =          new ArrayList ();
125
        List tableModelFilters =    new ArrayList ();
126
        List nodeActionsProviders = new ArrayList ();
127
        List nodeActionsProviderFilters = new ArrayList ();
128
        List columnModels =         new ArrayList ();
129
        
130
        // 1) sort models
131
        Iterator it = models.iterator ();
132
        while (it.hasNext ()) {
133
            Object model = it.next ();
134
            if (model instanceof TreeModel)
135
                treeModels.add (model);
136
            if (model instanceof TreeModelFilter)
137
                treeModelFilters.add (model);
138
            if (model instanceof TreeExpansionModel)
139
                treeExpansionModels.add (model);
140
            if (model instanceof NodeModel)
141
                nodeModels.add (model);
142
            if (model instanceof NodeModelFilter)
143
                nodeModelFilters.add (model);
144
            if (model instanceof TableModel)
145
                tableModels.add (model);
146
            if (model instanceof TableModelFilter)
147
                tableModelFilters.add (model);
148
            if (model instanceof NodeActionsProvider)
149
                nodeActionsProviders.add (model);
150
            if (model instanceof NodeActionsProviderFilter)
151
                nodeActionsProviderFilters.add (model);
152
            if (model instanceof ColumnModel)
153
                columnModels.add (model);
154
        }
155
        
156
        if (treeModels.isEmpty ()) treeModels.add (new EmptyTreeModel ());
157
        
158
        return new CompoundModel (
159
            createCompoundTreeModel (
160
                new DelegatingTreeModel (treeModels),
161
                treeModelFilters
162
            ),
163
            new DelegatingTreeExpansionModel (treeExpansionModels),
164
            createCompoundNodeModel (
165
                new DelegatingNodeModel (nodeModels),
166
                nodeModelFilters
167
            ),
168
            createCompoundNodeActionsProvider (
169
                new DelegatingNodeActionsProvider (nodeActionsProviders),
170
                nodeActionsProviderFilters
171
            ),
172
            columnModels,
173
            createCompoundTableModel (
174
                new DelegatingTableModel (tableModels),
175
                tableModelFilters
176
            )
177
        );
178
    }
179
    
180
    /**
181
     * Returns {@link javax.swing.Action} for given parameters.
182
     *
183
     * @param displayName a display name for action
184
     * @param node a node the action should by applied to
185
     * @param performer a performer for action
186
     *
187
     * @return a new instance of {@link javax.swing.Action} for given parameters
188
     */
189
    public static Action createAction (
190
        String displayName, 
191
        ActionPerformer performer,
192
        int multiselectionType
193
    ) {
194
        return new ActionSupport (
195
            displayName, 
196
            performer, 
197
            multiselectionType
198
        );
199
    }
200
    
201
    /**
202
     * Returns implementation of tree view features for given view.
203
     *
204
     * @param view a view created by this Models class
205
     * @throws UnsupportedOperationException in the case that given 
206
     *        view is not tree view
207
     * @return implementation of tree view features
208
     */
209
    public static TreeFeatures treeFeatures (JComponent view) 
210
    throws UnsupportedOperationException {
211
        return new TreeFeatures (view);
212
    }
213
    
214
    
215
    // private methods .........................................................
216
    
179
    /**
217
    /**
180
     * Creates {@link org.netbeans.spi.viewmodel.TreeModel} for given TreeModel and
218
     * Creates {@link org.netbeans.spi.viewmodel.TreeModel} for given TreeModel and
181
     * {@link org.netbeans.spi.viewmodel.TreeModelFilter}.
219
     * {@link org.netbeans.spi.viewmodel.TreeModelFilter}.
Lines 185-191 Link Here
185
     *
223
     *
186
     * @returns compund tree model
224
     * @returns compund tree model
187
     */
225
     */
188
    public static TreeModel createCompoundTreeModel (
226
    private static TreeModel createCompoundTreeModel (
189
        TreeModel originalTreeModel,
227
        TreeModel originalTreeModel,
190
        List treeModelFilters
228
        List treeModelFilters
191
    ) {
229
    ) {
Lines 208-214 Link Here
208
     *
246
     *
209
     * @returns compund tree model
247
     * @returns compund tree model
210
     */
248
     */
211
    public static NodeModel createCompoundNodeModel (
249
    private static NodeModel createCompoundNodeModel (
212
        NodeModel originalNodeModel,
250
        NodeModel originalNodeModel,
213
        List treeNodeModelFilters
251
        List treeNodeModelFilters
214
    ) {
252
    ) {
Lines 231-237 Link Here
231
     *
269
     *
232
     * @returns compund table model
270
     * @returns compund table model
233
     */
271
     */
234
    public static TableModel createCompoundTableModel (
272
    private static TableModel createCompoundTableModel (
235
        TableModel originalTableModel,
273
        TableModel originalTableModel,
236
        List tableModelFilters
274
        List tableModelFilters
237
    ) {
275
    ) {
Lines 254-260 Link Here
254
     *
292
     *
255
     * @returns compund node actions provider
293
     * @returns compund node actions provider
256
     */
294
     */
257
    public static NodeActionsProvider createCompoundNodeActionsProvider (
295
    private static NodeActionsProvider createCompoundNodeActionsProvider (
258
        NodeActionsProvider originalNodeActionsProvider,
296
        NodeActionsProvider originalNodeActionsProvider,
259
        List nodeActionsProviderFilters
297
        List nodeActionsProviderFilters
260
    ) {
298
    ) {
Lines 268-384 Link Here
268
        return nap;
306
        return nap;
269
    }
307
    }
270
    
308
    
271
//    /**
272
//     * Creates one {@link org.netbeans.spi.viewmodel.TableModel}
273
//     * from given array of TableModels. TableModel asks all underlaying 
274
//     * models for each concrete parameter, and returns first returned value.
275
//     *
276
//     * @param originalTableModels a array of original table models
277
//     */
278
//    public static TableModel createCompoundTableModel (
279
//        TableModel[] originalTableModels
280
//    ) {
281
//        return new DelegatingTableModel (
282
//            originalTableModels
283
//        );
284
//    }
285
    
286
    /**
287
     * Creates one {@link org.netbeans.spi.viewmodel.TableModel}
288
     * from given list of TableModels. TableModel asks all underlaying 
289
     * models for each concrete parameter, and returns first returned value.
290
     *
291
     * @param originalTableModels a list of original table models
292
     */
293
    public static TableModel createCompoundTableModel (
294
        List originalTableModels
295
    ) {
296
        return new DelegatingTableModel (
297
            originalTableModels
298
        );
299
    }
300
    
301
//    /**
302
//     * Creates one {@link org.netbeans.spi.viewmodel.NodeModel}
303
//     * from given array of NodeModels. NodeModel asks all underlaying 
304
//     * models for each concrete parameter, and returns first returned value.
305
//     *
306
//     * @param originalNodeModels a array of original node models
307
//     */
308
//    public static NodeModel createCompoundNodeModel (
309
//        NodeModel[] originalNodeModels
310
//    ) {
311
//        return new DelegatingNodeModel (
312
//            originalNodeModels
313
//        );
314
//    }
315
    
316
    /**
317
     * Creates one {@link org.netbeans.spi.viewmodel.NodeModel}
318
     * from given list of NodeModels. NodeModel asks all underlaying 
319
     * models for each concrete parameter, and returns first returned value.
320
     *
321
     * @param originalNodeModels a list of original node models
322
     */
323
    public static NodeModel createCompoundNodeModel (
324
        List originalNodeModels
325
    ) {
326
        return new DelegatingNodeModel (
327
            originalNodeModels
328
        );
329
    }
330
    
331
//    /**
332
//     * Creates one {@link org.netbeans.spi.viewmodel.NodeActionsProvider}
333
//     * from given array of NodeActionsProviders. NodeActionsProvider asks all underlaying 
334
//     * models for each concrete parameter, and returns first returned value.
335
//     *
336
//     * @param originalNodeActionsProviders a array of original node action providers
337
//     */
338
//    public static NodeActionsProvider createCompoundNodeActionsProvider (
339
//        NodeActionsProvider[] originalNodeActionsProviders
340
//    ) {
341
//        return new DelegatingNodeActionsProvider (
342
//            originalNodeActionsProviders
343
//        );
344
//    }
345
    
346
    /**
347
     * Creates one {@link org.netbeans.spi.viewmodel.NodeActionsProvider}
348
     * from given list of NodeActionsProviders. NodeActionsProvider asks all underlaying 
349
     * models for each concrete parameter, and returns first returned value.
350
     *
351
     * @param originalNodeActionsProviders a list of original node action providers
352
     */
353
    public static NodeActionsProvider createCompoundNodeActionsProvider (
354
        List originalNodeActionsProviders
355
    ) {
356
        return new DelegatingNodeActionsProvider (
357
            originalNodeActionsProviders
358
        );
359
    }
360
    
361
    /**
362
     * Returns {@link javax.swing.Action} for given parameters.
363
     *
364
     * @param displayName a display name for action
365
     * @param node a node the action should by applied to
366
     * @param performer a performer for action
367
     *
368
     * @return a new instance of {@link javax.swing.Action} for given parameters
369
     */
370
    public static Action createAction (
371
        String displayName, 
372
        ActionPerformer performer,
373
        int multiselectionType
374
    ) {
375
        return new ActionSupport (
376
            displayName, 
377
            performer, 
378
            multiselectionType
379
        );
380
    }
381
    
382
    
309
    
383
    // innerclasses ............................................................
310
    // innerclasses ............................................................
384
    
311
    
Lines 809-814 Link Here
809
                   n + "  " + model;
736
                   n + "  " + model;
810
        }
737
        }
811
    }
738
    }
739
740
    /**
741
     * Creates one {@link org.netbeans.spi.viewmodel.TreeModel}
742
     * from given list of TreeModels. DelegatingTreeModel asks all underlaying 
743
     * models for each concrete parameter, and returns first returned value.
744
     *
745
     * @author   Jan Jancura
746
     */
747
    final static class DelegatingTreeModel implements TreeModel {
748
749
        private TreeModel[] models;
750
        private HashMap classNameToModel = new HashMap ();
751
752
753
        /**
754
         * Creates new instance of DelegatingTreeModel for given list of 
755
         * TableModels.
756
         *
757
         * @param models a list of TableModels
758
         */
759
        DelegatingTreeModel (List models) {
760
            this (convert (models));
761
        }
762
763
        private static TreeModel[] convert (List l) {
764
            TreeModel[] models = new TreeModel [l.size ()];
765
            return (TreeModel[]) l.toArray (models);
766
        }
767
768
        /**
769
         * Creates new instance of DelegatingTreeModel for given array of 
770
         * TableModels.
771
         *
772
         * @param models a array of TreeModel
773
         */
774
        DelegatingTreeModel (TreeModel[] models) {
775
            this.models = models;        
776
        }
777
        
778
        /** 
779
         * Returns the root node of the tree or null, if the tree is empty.
780
         *
781
         * @return the root node of the tree or null
782
         */
783
        public Object getRoot () {
784
            return models [0].getRoot ();
785
        }
786
787
        /** 
788
         * Returns children for given parent on given indexes.
789
         *
790
         * @param   parent a parent of returned nodes
791
         * @param   from a start index
792
         * @param   to a end index
793
         *
794
         * @throws  UnknownTypeException if this TreeModel implementation is not
795
         *          able to resolve children for given node type
796
         *
797
         * @return  children for given parent on given indexes
798
         */
799
        public Object[] getChildren (Object node, int from, int to)
800
        throws UnknownTypeException {
801
            TreeModel model = (TreeModel) classNameToModel.get (
802
                node.getClass ().getName ()
803
            );
804
            if (model != null) 
805
                try {
806
                    return model.getChildren (node, from, to);
807
                } catch (UnknownTypeException e) {
808
                }
809
            int i, k = models.length;
810
            for (i = 0; i < k; i++) {
811
                try {
812
                    Object[] v = models [i].getChildren (node, from, to);
813
                    classNameToModel.put (node.getClass ().getName (), models [i]);
814
                    return v;
815
                } catch (UnknownTypeException e) {
816
                }
817
            }
818
            throw new UnknownTypeException (node);
819
        }    
820
821
        /**
822
         * Returns number of children for given node.
823
         * 
824
         * @param   node the parent node
825
         * @throws  UnknownTypeException if this TreeModel implementation is not
826
         *          able to resolve children for given node type
827
         *
828
         * @return  true if node is leaf
829
         * @since 1.1
830
         */
831
        public int getChildrenCount (Object node) 
832
        throws UnknownTypeException {
833
            TreeModel model = (TreeModel) classNameToModel.get (
834
                node.getClass ().getName ()
835
            );
836
            if (model != null) 
837
                try {
838
                    return model.getChildrenCount (node);
839
                } catch (UnknownTypeException e) {
840
                }
841
            int i, k = models.length;
842
            for (i = 0; i < k; i++) {
843
                try {
844
                    int result = models [i].getChildrenCount (node);
845
                    classNameToModel.put (node.getClass ().getName (), models [i]);
846
                    return result;
847
                } catch (UnknownTypeException e) {
848
                }
849
            }
850
            throw new UnknownTypeException (node);
851
        }    
852
853
        /**
854
         * Returns true if node is leaf.
855
         * 
856
         * @throws  UnknownTypeException if this TreeModel implementation is not
857
         *          able to resolve dchildren for given node type
858
         * @return  true if node is leaf
859
         */
860
        public boolean isLeaf (Object node) throws UnknownTypeException {
861
            TreeModel model = (TreeModel) classNameToModel.get (
862
                node.getClass ().getName ()
863
            );
864
            if (model != null) 
865
                try {
866
                    return model.isLeaf (node);
867
                } catch (UnknownTypeException e) {
868
                }
869
            int i, k = models.length;
870
            for (i = 0; i < k; i++) {
871
                try {
872
                    boolean result = models [i].isLeaf (node);
873
                    classNameToModel.put (node.getClass ().getName (), models [i]);
874
                    return result;
875
                } catch (UnknownTypeException e) {
876
                }
877
            }
878
            throw new UnknownTypeException (node);
879
        }    
880
881
        /** 
882
         * Registers given listener.
883
         * 
884
         * @param l the listener to add
885
         */
886
        public void addTreeModelListener (TreeModelListener l) {
887
            int i, k = models.length;
888
            for (i = 0; i < k; i++)
889
                models [i].addTreeModelListener (l);
890
        }
891
892
        /** 
893
         * Unregisters given listener.
894
         *
895
         * @param l the listener to remove
896
         */
897
        public void removeTreeModelListener (TreeModelListener l) {
898
            int i, k = models.length;
899
            for (i = 0; i < k; i++)
900
                models [i].removeTreeModelListener (l);
901
        }
902
903
        public String toString () {
904
            return super.toString () + "\n" + toString ("    ");
905
        }
906
        
907
        public String toString (String n) {
908
            int i, k = models.length - 1;
909
            if (k == -1) return "";
910
            StringBuffer sb = new StringBuffer ();
911
            for (i = 0; i < k; i++) {
912
                sb.append (n);
913
                sb.append (models [i]);
914
                sb.append ('\n');
915
            }
916
            sb.append (n);
917
            sb.append (models [i]);
918
            return new String (sb);
919
        }
920
    }
812
    
921
    
813
    /**
922
    /**
814
     * Creates {@link org.netbeans.spi.viewmodel.NodeActionsProvider} 
923
     * Creates {@link org.netbeans.spi.viewmodel.NodeActionsProvider} 
Lines 1086-1105 Link Here
1086
    }
1195
    }
1087
1196
1088
    /**
1197
    /**
1089
     * Creates one {@link org.netbeans.spi.viewmodel.NodeModel}
1198
     * Creates one {@link org.netbeans.spi.viewmodel.TableModel}
1090
     * from given list of NodeModels. DelegatingNodeModel asks all underlaying 
1199
     * from given list of TableModels. DelegatingTableModel asks all underlaying 
1091
     * models for each concrete parameter, and returns first returned value.
1200
     * models for each concrete parameter, and returns first returned value.
1092
     *
1201
     *
1093
     * @author   Jan Jancura
1202
     * @author   Jan Jancura
1094
     */
1203
     */
1095
    static final class DelegatingNodeModel implements NodeModel {
1204
    final static class DelegatingTreeExpansionModel 
1205
    implements TreeExpansionModel {
1096
1206
1097
        private NodeModel[] models;
1207
        private TreeExpansionModel[] models;
1098
        private HashMap classNameToModel = new HashMap ();
1208
        private HashMap classNameToModel = new HashMap ();
1099
1209
1100
1210
1101
        /**
1211
        /**
1102
         * Creates new instance of DelegatingNodeModel for given list of 
1212
         * Creates new instance of DelegatingTableModel for given list of 
1213
         * TableModels.
1214
         *
1215
         * @param models a list of TableModels
1216
         */
1217
        DelegatingTreeExpansionModel (List models) {
1218
            this (convert (models));
1219
        }
1220
1221
        private static TreeExpansionModel[] convert (List l) {
1222
            TreeExpansionModel[] models = new TreeExpansionModel [l.size ()];
1223
            return (TreeExpansionModel[]) l.toArray (models);
1224
        }
1225
1226
        /**
1227
         * Creates new instance of DelegatingTableModel for given array of 
1228
         * TableModels.
1229
         *
1230
         * @param models a array of TableModels
1231
         */
1232
        DelegatingTreeExpansionModel (TreeExpansionModel[] models) {
1233
            this.models = models;        
1234
        }
1235
1236
        /**
1237
         * Defines default state (collapsed, expanded) of given node.
1238
         *
1239
         * @param node a node
1240
         * @return default state (collapsed, expanded) of given node
1241
         */
1242
        public boolean isExpanded (Object node) 
1243
        throws UnknownTypeException {
1244
            TreeExpansionModel model = (TreeExpansionModel) 
1245
                classNameToModel.get (
1246
                    node.getClass ().getName ()
1247
                );
1248
            if (model != null) 
1249
                try {
1250
                    return model.isExpanded (node);
1251
                } catch (UnknownTypeException e) {
1252
                }
1253
            int i, k = models.length;
1254
            for (i = 0; i < k; i++) {
1255
                try {
1256
                    boolean result = models [i].isExpanded (node);
1257
                    classNameToModel.put (node.getClass ().getName (), models [i]);
1258
                    return result;
1259
                } catch (UnknownTypeException e) {
1260
                }
1261
            }
1262
            throw new UnknownTypeException (node);
1263
        }    
1264
1265
1266
        /**
1267
         * Called when given node is expanded.
1268
         *
1269
         * @param node a expanded node
1270
         */
1271
        public void nodeExpanded (Object node) {
1272
            int i, k = models.length;
1273
            for (i = 0; i < k; i++) {
1274
                models [i].nodeExpanded (node);
1275
            }
1276
        }    
1277
1278
        /**
1279
         * Called when given node is collapsed.
1280
         *
1281
         * @param node a collapsed node
1282
         */
1283
        public void nodeCollapsed (Object node) {
1284
            int i, k = models.length;
1285
            for (i = 0; i < k; i++) {
1286
                models [i].nodeCollapsed (node);
1287
            }
1288
        }    
1289
1290
        public String toString () {
1291
            return super.toString () + "\n" + toString ("    ");
1292
        }
1293
        
1294
        public String toString (String n) {
1295
            int i, k = models.length - 1;
1296
            if (k == -1) return "";
1297
            StringBuffer sb = new StringBuffer ();
1298
            for (i = 0; i < k; i++) {
1299
                sb.append (n);
1300
                sb.append (models [i]);
1301
                sb.append ('\n');
1302
            }
1303
            sb.append (n);
1304
            sb.append (models [i]);
1305
            return new String (sb);
1306
        }
1307
    }
1308
1309
    /**
1310
     * Creates one {@link org.netbeans.spi.viewmodel.NodeModel}
1311
     * from given list of NodeModels. DelegatingNodeModel asks all underlaying 
1312
     * models for each concrete parameter, and returns first returned value.
1313
     *
1314
     * @author   Jan Jancura
1315
     */
1316
    static final class DelegatingNodeModel implements NodeModel {
1317
1318
        private NodeModel[] models;
1319
        private HashMap classNameToModel = new HashMap ();
1320
1321
1322
        /**
1323
         * Creates new instance of DelegatingNodeModel for given list of 
1103
         * NodeModels.
1324
         * NodeModels.
1104
         *
1325
         *
1105
         * @param models a list of NodeModels
1326
         * @param models a list of NodeModels
Lines 1662-1667 Link Here
1662
            int i, k = models.length;
1883
            int i, k = models.length;
1663
            for (i = 0; i < k; i++)
1884
            for (i = 0; i < k; i++)
1664
                models [i].removeTreeModelListener (l);
1885
                models [i].removeTreeModelListener (l);
1886
        }
1887
    }
1888
    
1889
    /**
1890
     * Implements set of tree view features.
1891
     */
1892
    public static class TreeFeatures {
1893
        
1894
        private JComponent view;
1895
        
1896
        private TreeFeatures (JComponent view) {
1897
            this.view = view;
1898
        }
1899
        
1900
        /**
1901
         * Returns <code>true</code> if given node is expanded in given view.
1902
         *
1903
         * @param view a view created by this Models class
1904
         * @param node a node to be checked
1905
         * @return <code>true</code> if given node is expanded in given view
1906
         */
1907
        public boolean isExpanded (
1908
            Object node
1909
        ) {
1910
            return ((TreeTable) view).isExpanded (node);
1911
        }
1912
1913
        /**
1914
         * Expands given list of nodes in given view.
1915
         *
1916
         * @param view a view created by this Models class
1917
         * @param node a list of nodes to be expanded
1918
         */
1919
        public void expandNode (
1920
            Object node
1921
        ) {
1922
            ((TreeTable) view).expandNode (node);
1923
        }
1924
1925
        /**
1926
         * Collapses given node in given view.
1927
         *
1928
         * @param view a view created by this Models class
1929
         * @param node a node to be expanded
1930
         */
1931
        public void collapseNode (
1932
            Object node
1933
        ) {
1934
            ((TreeTable) view).collapseNode (node);
1935
        }
1936
    }
1937
1938
    /**
1939
     * Default implemetation of {@link CompoundModel}. It delegates all 
1940
     * functionality to given instanceo of 
1941
     * {@link org.netbeans.spi.viewmodel.TreeModel},
1942
     * {@link org.netbeans.spi.viewmodel.NodeModel} and
1943
     * {@link org.netbeans.spi.viewmodel.NodeActionsProvider}.
1944
     *
1945
     * @author   Jan Jancura
1946
     */
1947
    public static final class CompoundModel implements TreeModel, 
1948
    NodeModel, NodeActionsProvider, TableModel, TreeExpansionModel {
1949
1950
        private TreeModel       treeModel;
1951
        private NodeModel       nodeModel;
1952
        private NodeActionsProvider nodeActionsProvider;
1953
        private ColumnModel[]   columnModels;
1954
        private TableModel      tableModel;
1955
        private TreeExpansionModel treeExpansionModel;
1956
1957
1958
        // init ....................................................................
1959
1960
        /**
1961
         * Creates a new instance of {@link CompoundModel} for given models.
1962
         *
1963
         * @param treeModel a tree model to delegate on
1964
         * @param nodeModel a node model to delegate on
1965
         * @param nodeActionsProvider a node actions provider to delegate on
1966
         * @param nodeActionsProvider a columns modeol to delegate on
1967
         */
1968
        public CompoundModel (
1969
            TreeModel treeModel, 
1970
            TreeExpansionModel treeExpansionModel,
1971
            NodeModel nodeModel, 
1972
            NodeActionsProvider nodeActionsProvider,
1973
            List columnModels,
1974
            TableModel tableModel
1975
        ) {
1976
            if (treeModel == null) throw new NullPointerException ();
1977
            if (treeModel == null) throw new NullPointerException ();
1978
            if (nodeModel == null) throw new NullPointerException ();
1979
            if (tableModel == null) throw new NullPointerException ();
1980
            if (nodeActionsProvider == null) throw new NullPointerException ();
1981
1982
            this.treeModel = treeModel;
1983
            this.treeExpansionModel = treeExpansionModel;
1984
            this.nodeModel = nodeModel;
1985
            this.tableModel = tableModel;
1986
            this.nodeActionsProvider = nodeActionsProvider;
1987
            this.columnModels = (ColumnModel[]) columnModels.toArray (
1988
                new ColumnModel [columnModels.size ()]
1989
            );
1990
        }
1991
1992
1993
        // TreeModel ...............................................................
1994
1995
        /** 
1996
         * Returns the root node of the tree or null, if the tree is empty.
1997
         *
1998
         * @return the root node of the tree or null
1999
         */
2000
        public Object getRoot () {
2001
            return treeModel.getRoot ();
2002
        }
2003
2004
        /** 
2005
         * Returns children for given parent on given indexes.
2006
         *
2007
         * @param   parent a parent of returned nodes
2008
         * @throws  UnknownTypeException if this TreeModel implementation is not
2009
         *          able to resolve dchildren for given node type
2010
         *
2011
         * @return  children for given parent on given indexes
2012
         */
2013
        public Object[] getChildren (Object parent, int from, int to) 
2014
        throws UnknownTypeException {
2015
            return treeModel.getChildren (parent, from, to);
2016
        }
2017
2018
        /**
2019
         * Returns number of children for given node.
2020
         * 
2021
         * @param   node the parent node
2022
         * @throws  UnknownTypeException if this TreeModel implementation is not
2023
         *          able to resolve children for given node type
2024
         *
2025
         * @return  true if node is leaf
2026
         */
2027
        public int getChildrenCount (Object node) throws UnknownTypeException {
2028
            return treeModel.getChildrenCount (node);
2029
        }
2030
2031
        /**
2032
         * Returns true if node is leaf.
2033
         * 
2034
         * @throws  UnknownTypeException if this TreeModel implementation is not
2035
         *          able to resolve dchildren for given node type
2036
         * @return  true if node is leaf
2037
         */
2038
        public boolean isLeaf (Object node) throws UnknownTypeException {
2039
            return treeModel.isLeaf (node);
2040
        }
2041
2042
2043
        // NodeModel ...............................................................
2044
2045
        /**
2046
         * Returns display name for given node.
2047
         *
2048
         * @throws  UnknownTypeException if this NodeModel implementation is not
2049
         *          able to resolve display name for given node type
2050
         * @return  display name for given node
2051
         */
2052
        public String getDisplayName (Object node) throws UnknownTypeException {
2053
            return nodeModel.getDisplayName (node);
2054
        }
2055
2056
        /**
2057
         * Returns tooltip for given node.
2058
         *
2059
         * @throws  UnknownTypeException if this NodeModel implementation is not
2060
         *          able to resolve tooltip for given node type
2061
         * @return  tooltip for given node
2062
         */
2063
        public String getShortDescription (Object node) 
2064
        throws UnknownTypeException {
2065
            return nodeModel.getShortDescription (node);
2066
        }
2067
2068
        /**
2069
         * Returns icon for given node.
2070
         *
2071
         * @throws  ComputingException if the icon resolving process 
2072
         *          is time consuming, and the value will be updated later
2073
         * @throws  UnknownTypeException if this NodeModel implementation is not
2074
         *          able to resolve icon for given node type
2075
         * @return  icon for given node
2076
         */
2077
        public String getIconBase (Object node) 
2078
        throws UnknownTypeException {
2079
            return nodeModel.getIconBase (node);
2080
        }
2081
2082
2083
        // NodeActionsProvider .....................................................
2084
2085
        /**
2086
         * Performs default action for given node.
2087
         *
2088
         * @throws  UnknownTypeException if this NodeActionsProvider implementation 
2089
         *          is not able to resolve actions for given node type
2090
         * @return  display name for given node
2091
         */
2092
        public void performDefaultAction (Object node) throws UnknownTypeException {
2093
            nodeActionsProvider.performDefaultAction (node);
2094
        }
2095
2096
        /**
2097
         * Returns set of actions for given node.
2098
         *
2099
         * @throws  UnknownTypeException if this NodeActionsProvider implementation 
2100
         *          is not able to resolve actions for given node type
2101
         * @return  display name for given node
2102
         */
2103
        public Action[] getActions (Object node) throws UnknownTypeException {
2104
            return nodeActionsProvider.getActions (node);
2105
        }
2106
2107
2108
        // ColumnsModel ............................................................
2109
2110
        /**
2111
         * Returns sorted array of 
2112
         * {@link org.netbeans.spi.viewmodel.ColumnModel}s.
2113
         *
2114
         * @return sorted array of ColumnModels
2115
         */
2116
        public ColumnModel[] getColumns () {
2117
            return columnModels;
2118
        }
2119
2120
2121
        // TableModel ..............................................................
2122
2123
        public Object getValueAt (Object node, String columnID) throws 
2124
        UnknownTypeException {
2125
            return tableModel.getValueAt (node, columnID);
2126
        }
2127
2128
        public boolean isReadOnly (Object node, String columnID) throws 
2129
        UnknownTypeException {
2130
            return tableModel.isReadOnly (node, columnID);
2131
        }
2132
2133
        public void setValueAt (Object node, String columnID, Object value) throws 
2134
        UnknownTypeException {
2135
            tableModel.setValueAt (node, columnID, value);
2136
        }
2137
2138
2139
        // TreeExpansionModel ......................................................
2140
2141
        /**
2142
         * Defines default state (collapsed, expanded) of given node.
2143
         *
2144
         * @param node a node
2145
         * @return default state (collapsed, expanded) of given node
2146
         */
2147
        public boolean isExpanded (Object node) throws UnknownTypeException {
2148
            if (treeExpansionModel == null) return false;
2149
            return treeExpansionModel.isExpanded (node);
2150
        }
2151
2152
        /**
2153
         * Called when given node is expanded.
2154
         *
2155
         * @param node a expanded node
2156
         */
2157
        public void nodeExpanded (Object node) {
2158
            if (treeExpansionModel != null)
2159
                treeExpansionModel.nodeExpanded (node);
2160
        }
2161
2162
        /**
2163
         * Called when given node is collapsed.
2164
         *
2165
         * @param node a collapsed node
2166
         */
2167
        public void nodeCollapsed (Object node) {
2168
            if (treeExpansionModel != null)
2169
                treeExpansionModel.nodeCollapsed (node);
2170
        }
2171
2172
2173
        // listeners ...............................................................
2174
2175
        /** 
2176
         * Registers given listener.
2177
         * 
2178
         * @param l the listener to add
2179
         */
2180
        public void addTreeModelListener (TreeModelListener l) {
2181
            treeModel.addTreeModelListener (l);
2182
            nodeModel.addTreeModelListener (l);
2183
            nodeActionsProvider.addTreeModelListener (l);
2184
            tableModel.addTreeModelListener (l);
2185
        }
2186
2187
        /** 
2188
         * Unregisters given listener.
2189
         *
2190
         * @param l the listener to remove
2191
         */
2192
        public void removeTreeModelListener (TreeModelListener l) {
2193
            treeModel.removeTreeModelListener (l);
2194
            nodeModel.removeTreeModelListener (l);
2195
            nodeActionsProvider.removeTreeModelListener (l);
2196
            tableModel.removeTreeModelListener (l);
2197
        }
2198
2199
        public String toString () {
2200
            return super.toString () + 
2201
                   "\n  TreeModel = " + treeModel +
2202
                   "\n  NodeModel = " + nodeModel +
2203
                   "\n  TableModel = " + tableModel +
2204
                   "\n  NodeActionsProvider = " + nodeActionsProvider +
2205
                   "\n  ColumnsModel = " + columnModels;
1665
        }
2206
        }
1666
    }
2207
    }
1667
}
2208
}
(-)debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeActionsProvider.java (-1 / +1 lines)
Lines 22-28 Link Here
22
 *
22
 *
23
 * @author   Jan Jancura
23
 * @author   Jan Jancura
24
 */
24
 */
25
public interface NodeActionsProvider {
25
public interface NodeActionsProvider extends Model {
26
    
26
    
27
    
27
    
28
    /**
28
    /**
(-)debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeActionsProviderFilter.java (-1 / +1 lines)
Lines 23-29 Link Here
23
 *
23
 *
24
 * @author   Jan Jancura
24
 * @author   Jan Jancura
25
 */
25
 */
26
public interface NodeActionsProviderFilter {
26
public interface NodeActionsProviderFilter extends Model {
27
    
27
    
28
    
28
    
29
    /**
29
    /**
(-)debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeModel.java (-1 / +1 lines)
Lines 20-26 Link Here
20
 *
20
 *
21
 * @author   Jan Jancura
21
 * @author   Jan Jancura
22
 */
22
 */
23
public interface NodeModel {
23
public interface NodeModel extends Model {
24
    
24
    
25
    /**
25
    /**
26
     * Returns display name for given node.
26
     * Returns display name for given node.
(-)debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/NodeModelFilter.java (-1 / +1 lines)
Lines 20-26 Link Here
20
 *
20
 *
21
 * @author   Jan Jancura
21
 * @author   Jan Jancura
22
 */
22
 */
23
public interface NodeModelFilter {
23
public interface NodeModelFilter extends Model {
24
    
24
    
25
    /**
25
    /**
26
     * Returns filterred display name for given node. You should not 
26
     * Returns filterred display name for given node. You should not 
(-)debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TableModel.java (-1 / +1 lines)
Lines 23-29 Link Here
23
 *
23
 *
24
 * @author   Jan Jancura
24
 * @author   Jan Jancura
25
 */
25
 */
26
public interface TableModel {
26
public interface TableModel extends Model {
27
    
27
    
28
    
28
    
29
    /**
29
    /**
(-)debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TableModelFilter.java (-1 / +1 lines)
Lines 25-31 Link Here
25
 *
25
 *
26
 * @author   Jan Jancura
26
 * @author   Jan Jancura
27
 */
27
 */
28
public interface TableModelFilter {
28
public interface TableModelFilter extends Model {
29
    
29
    
30
    
30
    
31
    /**
31
    /**
(-)debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TreeModel.java (-1 / +1 lines)
Lines 20-26 Link Here
20
 *
20
 *
21
 * @author   Jan Jancura
21
 * @author   Jan Jancura
22
 */
22
 */
23
public interface TreeModel {
23
public interface TreeModel extends Model {
24
    
24
    
25
    /** 
25
    /** 
26
     * Constant for root node. This root node should be used if root node
26
     * Constant for root node. This root node should be used if root node
(-)debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/TreeModelFilter.java (-1 / +1 lines)
Lines 21-27 Link Here
21
 *
21
 *
22
 * @author   Jan Jancura
22
 * @author   Jan Jancura
23
 */
23
 */
24
public interface TreeModelFilter {
24
public interface TreeModelFilter extends Model {
25
    
25
    
26
26
27
    /** 
27
    /** 
(-)debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeActionsProvider (-1 lines)
Lines 1-4 Link Here
1
org.netbeans.modules.debugger.jpda.ui.models.WatchesActionsProvider
1
org.netbeans.modules.debugger.jpda.ui.models.WatchesActionsProvider
2
org.netbeans.modules.debugger.jpda.ui.FixedWatchesManager
3
org.netbeans.modules.debugger.jpda.ui.models.VariablesActionsProvider
2
org.netbeans.modules.debugger.jpda.ui.models.VariablesActionsProvider
4
org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilterSI
3
org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilterSI
(-)debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeModel (-1 lines)
Lines 1-3 Link Here
1
org.netbeans.modules.debugger.jpda.ui.models.WatchesNodeModel
1
org.netbeans.modules.debugger.jpda.ui.models.WatchesNodeModel
2
org.netbeans.modules.debugger.jpda.ui.FixedWatchesManager
3
org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilterSI
2
org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilterSI
(-)debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.NodeModelFilter (+1 lines)
Line 1 Link Here
1
org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilter
1
org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilter
2
org.netbeans.modules.debugger.jpda.ui.FixedWatchesManager
(-)debuggerjpda/ui/src/META-INF/debugger/netbeans-JPDASession/WatchesView/org.netbeans.spi.viewmodel.TableModel (-2 / +1 lines)
Lines 1-3 Link Here
1
org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilterSI
1
org.netbeans.modules.debugger.jpda.ui.models.VariablesTreeModelFilterSI
2
org.netbeans.modules.debugger.jpda.ui.models.VariablesTableModel
2
org.netbeans.modules.debugger.jpda.ui.models.VariablesTableModel
3
org.netbeans.modules.debugger.jpda.ui.FixedWatchesManager
(-)debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/FixedWatchesManager.java (-136 / +60 lines)
Lines 26-43 Link Here
26
import java.util.*;
26
import java.util.*;
27
27
28
/**
28
/**
29
 * Manages lifecycle and presentation of fixed watches. Should be registered as an action provider in both
29
 * Manages lifecycle and presentation of fixed watches. Should be 
30
 * registered as an action provider in both
30
 * locals and watches views and as a tree model filter in the watches view.
31
 * locals and watches views and as a tree model filter in the watches view.
31
 *
32
 *
32
 * @author Jan Jancura, Maros Sandor
33
 * @author Jan Jancura, Maros Sandor
33
 */
34
 */
34
public class FixedWatchesManager implements TreeModelFilter, 
35
public class FixedWatchesManager implements TreeModelFilter, 
35
NodeActionsProvider, NodeActionsProviderFilter, TableModel, NodeModel {
36
NodeActionsProviderFilter, NodeModelFilter {
36
            
37
            
37
    public static final String FIXED_WATCH =
38
    public static final String FIXED_WATCH =
38
        "org/netbeans/modules/debugger/resources/watchesView/FixedWatch";
39
        "org/netbeans/modules/debugger/resources/watchesView/FixedWatch";
39
    private final Action DELETE_ACTION = Models.createAction (
40
    private final Action DELETE_ACTION = Models.createAction (
40
        loc("CTL_DeleteFixedWatch_Label"),
41
        NbBundle.getBundle (FixedWatchesManager.class).getString 
42
            ("CTL_DeleteFixedWatch_Label"),
41
        new Models.ActionPerformer () {
43
        new Models.ActionPerformer () {
42
            public boolean isEnabled (Object node) {
44
            public boolean isEnabled (Object node) {
43
                return true;
45
                return true;
Lines 58-64 Link Here
58
        );
60
        );
59
    };
61
    };
60
    private final Action CREATE_FIXED_WATCH_ACTION = Models.createAction (
62
    private final Action CREATE_FIXED_WATCH_ACTION = Models.createAction (
61
        loc("CTL_CreateFixedWatch_Label"),
63
        NbBundle.getBundle (FixedWatchesManager.class).getString 
64
            ("CTL_CreateFixedWatch_Label"),
62
        new Models.ActionPerformer () {
65
        new Models.ActionPerformer () {
63
            public boolean isEnabled (Object node) {
66
            public boolean isEnabled (Object node) {
64
                return true;
67
                return true;
Lines 73-131 Link Here
73
    );
76
    );
74
        
77
        
75
        
78
        
76
    private List            fixedWatches;
79
    private Map             fixedWatches = new HashMap ();
77
    private HashSet         listeners;
80
    private HashSet         listeners;
78
    private ContextProvider  contextProvider; // not used at the moment
81
    private ContextProvider contextProvider;
79
82
80
    
83
    
81
    public FixedWatchesManager (ContextProvider contextProvider) {
84
    public FixedWatchesManager (ContextProvider contextProvider) {
82
        this.contextProvider = contextProvider;
85
        this.contextProvider = contextProvider;
83
    }
86
    }
84
85
    private static String loc(String key) {
86
        return NbBundle.getBundle(FixedWatchesManager.class).getString(key);
87
    }
88
    
89
    // NodeActionsProvider .....................................................
90
91
    public void performDefaultAction (Object node) throws UnknownTypeException {
92
        if (!(node instanceof FixedWatch)) 
93
            throw new UnknownTypeException (node);
94
    }
95
96
    public Action[] getActions (Object node) throws UnknownTypeException {
97
        if (node instanceof FixedWatch) {
98
            return new Action[] {
99
                DELETE_ACTION
100
            };
101
        }
102
        throw new UnknownTypeException(node);
103
    }
104
105
    
106
    // NodeActionsProviderFilter ...............................................
107
    
108
    public void performDefaultAction (NodeActionsProvider original, Object node) 
109
    throws UnknownTypeException {
110
        original.performDefaultAction (node);
111
    }
112
113
    public Action[] getActions (NodeActionsProvider original, Object node) 
114
    throws UnknownTypeException {
115
        Action [] actions = original.getActions(node);
116
        List myActions = new ArrayList();
117
        if (node instanceof Variable) {
118
            myActions.add (CREATE_FIXED_WATCH_ACTION);
119
        } else if (node instanceof JPDAWatch) {
120
            myActions.add (CREATE_FIXED_WATCH_ACTION);
121
        } else if (node instanceof FixedWatch) {
122
            myActions.add (DELETE_ACTION);
123
        } else {
124
            return actions;
125
        }
126
        myActions.addAll(Arrays.asList(actions));
127
        return (Action[]) myActions.toArray(new Action[myActions.size()]);
128
    }
129
    
87
    
130
88
131
    // TreeModelFilter .........................................................
89
    // TreeModelFilter .........................................................
Lines 141-156 Link Here
141
        int to
99
        int to
142
    ) throws UnknownTypeException {
100
    ) throws UnknownTypeException {
143
        if (parent == TreeModel.ROOT) {
101
        if (parent == TreeModel.ROOT) {
144
            if (fixedWatches == null || fixedWatches.size
102
            if (fixedWatches.size () == 0) 
145
                () == 0) 
146
                return original.getChildren (parent, from, to);
103
                return original.getChildren (parent, from, to);
147
104
148
            int fixedSize = fixedWatches.size();
105
            int fixedSize = fixedWatches.size ();
149
            int originalFrom = from - fixedSize;
106
            int originalFrom = from - fixedSize;
150
            int originalTo = to - fixedSize;
107
            int originalTo = to - fixedSize;
151
            if (originalFrom < 0) originalFrom = 0;
108
            if (originalFrom < 0) originalFrom = 0;
152
109
153
            Object [] children;
110
            Object[] children;
154
            if (originalTo > originalFrom) {
111
            if (originalTo > originalFrom) {
155
                children = original.getChildren
112
                children = original.getChildren
156
                    (parent, originalFrom, originalTo);
113
                    (parent, originalFrom, originalTo);
Lines 159-165 Link Here
159
            }
116
            }
160
            Object [] allChildren = new Object [children.length + fixedSize];
117
            Object [] allChildren = new Object [children.length + fixedSize];
161
118
162
            fixedWatches.toArray (allChildren);
119
            fixedWatches.keySet ().toArray (allChildren);
163
            System.arraycopy (
120
            System.arraycopy (
164
                children, 
121
                children, 
165
                0, 
122
                0, 
Lines 171-182 Link Here
171
            System.arraycopy (allChildren, from, fallChildren, 0, to - from);
128
            System.arraycopy (allChildren, from, fallChildren, 0, to - from);
172
            return fallChildren;
129
            return fallChildren;
173
        }
130
        }
174
        if (parent instanceof FixedWatch) {
175
            Variable v = ((FixedWatch) parent).getVariable ();
176
            return (v != null) ? 
177
                original.getChildren (v, from, to) : 
178
                new Object [0];
179
        }
180
        return original.getChildren (parent, from, to);
131
        return original.getChildren (parent, from, to);
181
    }
132
    }
182
133
Lines 186-209 Link Here
186
    ) throws UnknownTypeException {
137
    ) throws UnknownTypeException {
187
        if (parent == TreeModel.ROOT) {
138
        if (parent == TreeModel.ROOT) {
188
            int chc = original.getChildrenCount (parent);
139
            int chc = original.getChildrenCount (parent);
189
            if (fixedWatches == null) return chc;
190
            return chc + fixedWatches.size ();
140
            return chc + fixedWatches.size ();
191
        }
141
        }
192
        if (parent instanceof FixedWatch) {
193
            Variable v = ((FixedWatch) parent).getVariable ();
194
            return (v != null) ? original.getChildrenCount (v) : 0;
195
        }
196
        return original.getChildrenCount (parent);
142
        return original.getChildrenCount (parent);
197
    }
143
    }
198
144
199
    public boolean isLeaf (TreeModel original, Object node) 
145
    public boolean isLeaf (TreeModel original, Object node) 
200
    throws UnknownTypeException {
146
    throws UnknownTypeException {
201
        if (node instanceof FixedWatch) {
202
            FixedWatch fw = (FixedWatch) node;
203
            if (fw.getVariable () == null) 
204
                return true;
205
            return original.isLeaf (fw.getVariable ());
206
        }
207
        return original.isLeaf (node);
147
        return original.isLeaf (node);
208
    }
148
    }
209
149
Lines 220-284 Link Here
220
        newListeners.remove (l);
160
        newListeners.remove (l);
221
        listeners = newListeners;
161
        listeners = newListeners;
222
    }
162
    }
163
223
    
164
    
224
    
165
    // NodeActionsProviderFilter ...............................................
225
    // TableModel ..............................................................
166
226
    
167
    public void performDefaultAction (
227
    public Object getValueAt (Object row, String columnID) throws 
168
        NodeActionsProvider original, 
228
    UnknownTypeException {
169
        Object node
229
        if (row instanceof FixedWatch)
170
    ) throws UnknownTypeException {
230
            return getOriginalModel ().getValueAt (
171
        original.performDefaultAction (node);
231
                ((FixedWatch) row).getVariable (),
232
                columnID
233
            );
234
        throw new UnknownTypeException (row);
235
    }
236
    
237
    public boolean isReadOnly (Object row, String columnID) throws 
238
    UnknownTypeException {
239
        if (row instanceof FixedWatch)
240
            return getOriginalModel ().isReadOnly (
241
                ((FixedWatch) row).getVariable (),
242
                columnID
243
            );
244
        throw new UnknownTypeException (row);
245
    }
172
    }
246
    
173
247
    public void setValueAt (Object row, String columnID, Object value) 
174
    public Action[] getActions (NodeActionsProvider original, Object node) 
248
    throws UnknownTypeException {
175
    throws UnknownTypeException {
249
        if (row instanceof FixedWatch) {
176
        Action [] actions = original.getActions (node);
250
            getOriginalModel ().setValueAt (
177
        List myActions = new ArrayList();
251
                ((FixedWatch) row).getVariable (),
178
        if (fixedWatches.containsKey (node)) {
252
                columnID,
179
            return new Action[] {
253
                value
180
                DELETE_ACTION
254
            );
181
            };
255
            return;
256
        }
182
        }
257
        throw new UnknownTypeException (row);
183
        if (node instanceof Variable) {
184
            myActions.add (CREATE_FIXED_WATCH_ACTION);
185
        } else 
186
        if (node instanceof JPDAWatch) {
187
            myActions.add (CREATE_FIXED_WATCH_ACTION);
188
        } else 
189
            return actions;
190
        myActions.addAll (Arrays.asList (actions));
191
        return (Action[]) myActions.toArray (new Action [myActions.size ()]);
258
    }
192
    }
259
    
193
    
260
    
194
    
261
    // NodeModel ...............................................................
195
    // NodeModel ...............................................................
262
    
196
    
263
    public String getDisplayName (Object o) throws UnknownTypeException {
197
    public String getDisplayName (NodeModel original, Object node) 
264
        if (o instanceof FixedWatch)
198
    throws UnknownTypeException {
265
            return ((FixedWatch) o).getName();
199
        if (fixedWatches.containsKey (node))
266
        throw new UnknownTypeException (o);
200
            return (String) fixedWatches.get (node);
201
        return original.getDisplayName (node);
267
    }
202
    }
268
    
203
    
269
    public String getShortDescription (Object o) throws UnknownTypeException {
204
    public String getShortDescription (NodeModel original, Object node) 
270
        if (o instanceof FixedWatch) {
205
    throws UnknownTypeException {
271
            FixedWatch fw = (FixedWatch) o;
206
        if (fixedWatches.containsKey (node)) {
272
            return fw.getName () + " = (" + fw.getType () + ") " + 
207
            Variable v = (Variable) node;
273
                fw.getValue ();
208
            return ((String) fixedWatches.get (node)) + 
209
                " = (" + v.getType () + ") " + 
210
                v.getValue ();
274
        }
211
        }
275
        throw new UnknownTypeException (o);
212
        return original.getShortDescription (node);
276
    }
213
    }
277
    
214
    
278
    public String getIconBase (Object node) throws UnknownTypeException {
215
    public String getIconBase (NodeModel original, Object node) 
279
        if (node instanceof FixedWatch)
216
    throws UnknownTypeException {
217
        if (fixedWatches.containsKey (node))
280
            return FIXED_WATCH;
218
            return FIXED_WATCH;
281
        throw new UnknownTypeException (node);
219
        return original.getIconBase (node);
282
    }
220
    }
283
    
221
    
284
    
222
    
Lines 287-293 Link Here
287
    private void createFixedWatch (Object node) {
225
    private void createFixedWatch (Object node) {
288
        if (node instanceof JPDAWatch) {
226
        if (node instanceof JPDAWatch) {
289
            JPDAWatch jw = (JPDAWatch) node;
227
            JPDAWatch jw = (JPDAWatch) node;
290
            createFixedWatch (jw.getExpression (), jw);
228
            addFixedWatch (jw.getExpression (), jw);
291
        } else {
229
        } else {
292
            Variable variable = (Variable) node;
230
            Variable variable = (Variable) node;
293
            String name = null;
231
            String name = null;
Lines 302-316 Link Here
302
            } else {
240
            } else {
303
                name = "unnamed";
241
                name = "unnamed";
304
            }
242
            }
305
            createFixedWatch(name, variable);
243
            addFixedWatch (name, variable);
306
        }
244
        }
307
    }
245
    }
308
246
309
    private void createFixedWatch (String name, Variable variable) {
247
    private void addFixedWatch (String name, Variable variable) {
310
        if (fixedWatches == null) fixedWatches = new ArrayList();
248
        fixedWatches.put (variable, name);
311
        FixedWatch fw = new FixedWatch(name, variable);
249
        fireModelChanged ();
312
        fixedWatches.add(fw);
313
        fireModelChanged();
314
    }
250
    }
315
251
316
    private void fireModelChanged () {
252
    private void fireModelChanged () {
Lines 319-335 Link Here
319
            TreeModelListener listener = (TreeModelListener) i.next();
255
            TreeModelListener listener = (TreeModelListener) i.next();
320
            listener.treeChanged();;
256
            listener.treeChanged();;
321
        }
257
        }
322
    }
323
    
324
    private TableModel original;
325
    private TableModel getOriginalModel () {
326
        if (original == null)
327
            original = Models.createCompoundTableModel (
328
                Models.createCompoundTableModel (
329
                    contextProvider.lookup ("WatchesView", TableModel.class)
330
                ),
331
                contextProvider.lookup ("WatchesView", TableModelFilter.class)
332
            );
333
        return original;
334
    }
258
    }
335
}
259
}
(-)debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/models/VariablesTableModel.java (-2 lines)
Lines 58-65 Link Here
58
        if ( columnID.equals (LOCALS_TYPE_COLUMN_ID) ||
58
        if ( columnID.equals (LOCALS_TYPE_COLUMN_ID) ||
59
             columnID.equals (WATCH_TYPE_COLUMN_ID)
59
             columnID.equals (WATCH_TYPE_COLUMN_ID)
60
        ) {
60
        ) {
61
            if (row instanceof JPDAWatch)
62
                Thread.dumpStack();
63
            if (row instanceof Variable)
61
            if (row instanceof Variable)
64
                return getShort (((Variable) row).getType ());
62
                return getShort (((Variable) row).getType ());
65
        } else
63
        } else
(-)debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/ClassesView.java (-2 / +1 lines)
Lines 44-51 Link Here
44
            return;
44
            return;
45
        if (tree == null) {
45
        if (tree == null) {
46
            setLayout (new BorderLayout ());
46
            setLayout (new BorderLayout ());
47
            tree = Models.createView 
47
            tree = Models.createView  (Models.EMPTY_MODEL);
48
                (null, null, null, null, new ArrayList ());
49
            tree.setName ("ClassesView");
48
            tree.setName ("ClassesView");
50
            add (tree, "Center");  //NOI18N
49
            add (tree, "Center");  //NOI18N
51
        }
50
        }
(-)debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/SourcesView.java (-2 / +1 lines)
Lines 41-48 Link Here
41
            return;
41
            return;
42
        if (tree == null) {
42
        if (tree == null) {
43
            setLayout (new BorderLayout ());
43
            setLayout (new BorderLayout ());
44
            tree = Models.createView 
44
            tree = Models.createView (Models.EMPTY_MODEL);
45
                (null, null, null, null, new ArrayList ());
46
            tree.setName ("SourcesView");
45
            tree.setName ("SourcesView");
47
            add (tree, "Center");  //NOI18N
46
            add (tree, "Center");  //NOI18N
48
        }
47
        }
(-)debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/ui/views/ViewModelListener.java (-62 / +30 lines)
Lines 22-27 Link Here
22
import org.netbeans.api.debugger.DebuggerEngine;
22
import org.netbeans.api.debugger.DebuggerEngine;
23
import org.netbeans.api.debugger.DebuggerManager;
23
import org.netbeans.api.debugger.DebuggerManager;
24
import org.netbeans.api.debugger.DebuggerManagerAdapter;
24
import org.netbeans.api.debugger.DebuggerManagerAdapter;
25
import org.netbeans.spi.viewmodel.Model;
25
import org.netbeans.spi.viewmodel.Models;
26
import org.netbeans.spi.viewmodel.Models;
26
import org.netbeans.spi.viewmodel.ColumnModel;
27
import org.netbeans.spi.viewmodel.ColumnModel;
27
import org.netbeans.spi.viewmodel.TableModelFilter;
28
import org.netbeans.spi.viewmodel.TableModelFilter;
Lines 30-35 Link Here
30
import org.netbeans.spi.viewmodel.NodeModel;
31
import org.netbeans.spi.viewmodel.NodeModel;
31
import org.netbeans.spi.viewmodel.NodeModelFilter;
32
import org.netbeans.spi.viewmodel.NodeModelFilter;
32
import org.netbeans.spi.viewmodel.TableModel;
33
import org.netbeans.spi.viewmodel.TableModel;
34
import org.netbeans.spi.viewmodel.TreeExpansionModel;
33
import org.netbeans.spi.viewmodel.TreeModel;
35
import org.netbeans.spi.viewmodel.TreeModel;
34
import org.netbeans.spi.viewmodel.TreeModelFilter;
36
import org.netbeans.spi.viewmodel.TreeModelFilter;
35
import org.netbeans.spi.viewmodel.TreeModelListener;
37
import org.netbeans.spi.viewmodel.TreeModelListener;
Lines 69-77 Link Here
69
            DebuggerManager.PROP_CURRENT_ENGINE,
71
            DebuggerManager.PROP_CURRENT_ENGINE,
70
            this
72
            this
71
        );
73
        );
72
        Models.setModelsToView (
74
        Models.setModelsToView (view, Models.EMPTY_MODEL);
73
            view, null, null, null, null, Collections.EMPTY_LIST
74
        );
75
    }
75
    }
76
76
77
    public void propertyChange (PropertyChangeEvent e) {
77
    public void propertyChange (PropertyChangeEvent e) {
Lines 79-145 Link Here
79
    }
79
    }
80
    
80
    
81
    private void updateModel () {
81
    private void updateModel () {
82
        TreeModel tm = (TreeModel) loadModel (TreeModel.class);
82
        DebuggerManager dm = DebuggerManager.getDebuggerManager ();
83
        if (tm == null)
83
        DebuggerEngine e = dm.getCurrentEngine ();
84
            tm = Models.EMPTY_TREE_MODEL;
84
        ArrayList l = new ArrayList ();
85
        List l = loadModels (NodeModel.class);
85
        if (e != null) {
86
        l.add (new EmptyModel ());
86
            l.addAll (e.lookup (viewType, TreeModel.class));
87
        
87
            l.addAll (e.lookup (viewType, TreeModelFilter.class));
88
        if (verbose) {
88
            l.addAll (e.lookup (viewType, TreeExpansionModel.class));
89
            System.out.println ("");
89
            l.addAll (e.lookup (viewType, NodeModel.class));
90
            System.out.println (viewType + " models:");
90
            l.addAll (e.lookup (viewType, NodeModelFilter.class));
91
            l.addAll (e.lookup (viewType, TableModel.class));
92
            l.addAll (e.lookup (viewType, TableModelFilter.class));
93
            l.addAll (e.lookup (viewType, NodeActionsProvider.class));
94
            l.addAll (e.lookup (viewType, NodeActionsProviderFilter.class));
95
            l.addAll (e.lookup (viewType, ColumnModel.class));
96
            l.addAll (e.lookup (viewType, Model.class));
91
        }
97
        }
98
        l.addAll (dm.lookup (viewType, TreeModel.class));
99
        l.addAll (dm.lookup (viewType, TreeModelFilter.class));
100
        l.addAll (dm.lookup (viewType, TreeExpansionModel.class));
101
        l.addAll (dm.lookup (viewType, NodeModel.class));
102
        l.addAll (dm.lookup (viewType, NodeModelFilter.class));
103
        l.addAll (dm.lookup (viewType, TableModel.class));
104
        l.addAll (dm.lookup (viewType, TableModelFilter.class));
105
        l.addAll (dm.lookup (viewType, NodeActionsProvider.class));
106
        l.addAll (dm.lookup (viewType, NodeActionsProviderFilter.class));
107
        l.addAll (dm.lookup (viewType, ColumnModel.class));
108
        l.addAll (dm.lookup (viewType, Model.class));
92
        
109
        
93
        Models.setModelsToView (
110
        Models.setModelsToView (view, Models.createCompoundModel (l));
94
            view, 
95
            Models.createCompoundTreeModel (
96
                tm, 
97
                loadModels (TreeModelFilter.class)
98
            ),
99
            Models.createCompoundNodeModel (
100
                Models.createCompoundNodeModel (
101
                    l
102
                ),
103
                loadModels (NodeModelFilter.class)
104
            ),
105
            Models.createCompoundTableModel (
106
                Models.createCompoundTableModel (
107
                    loadModels (TableModel.class)
108
                ),
109
                loadModels (TableModelFilter.class)
110
            ),
111
            Models.createCompoundNodeActionsProvider (
112
                Models.createCompoundNodeActionsProvider (
113
                    loadModels (NodeActionsProvider.class)
114
                ),
115
                loadModels (NodeActionsProviderFilter.class)
116
            ),
117
            loadModels (ColumnModel.class)
118
        );
119
                    
120
    }
121
    
122
    private Object loadModel (Class modelType) {
123
        DebuggerEngine e = DebuggerManager.getDebuggerManager ().
124
            getCurrentEngine ();
125
        Object m = null;
126
        if (e != null)
127
            m = e.lookupFirst (viewType, modelType);
128
        if (m == null)
129
            m = DebuggerManager.getDebuggerManager ().
130
                lookupFirst (viewType, modelType);
131
        return m;
132
    }
133
134
    private List loadModels (Class modelType) {
135
        DebuggerEngine e = DebuggerManager.getDebuggerManager ().
136
            getCurrentEngine ();
137
        List l = new ArrayList ();
138
        if (e != null)
139
            l.addAll (e.lookup (viewType, modelType));
140
        l.addAll (DebuggerManager.getDebuggerManager ().
141
            lookup (viewType, modelType));
142
        return l;
143
    }
111
    }
144
112
145
    
113
    

Return to bug 46167