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/apichanges.xml (+32 lines)
Lines 103-108 Link Here
103
        <class package="org.netbeans.spi.viewmodel" name="NoInformationException" />
103
        <class package="org.netbeans.spi.viewmodel" name="NoInformationException" />
104
        <issue number="53073"/>
104
        <issue number="53073"/>
105
    </change>
105
    </change>
106
    <change>
107
        <api name="ViewModelAPI"/>
108
        <summary>Access to tree node expansion added.</summary>
109
        <date day="13" month="1" year="2005"/>
110
        <author login="jjancura"/>
111
        <compatibility binary="incompatible" source="incompatible" deletion="yes" addition="yes" modification="yes"/>
112
        <description>
113
                This change has been done to cover user requirement #46167.
114
                List of changes:
115
                    1) new TreeExpansionModel introduced
116
                    2) new class Models.TreeFeatures contains tree expansion methods.
117
                During implementation of this user requirement I have discovered important problem in ViewModel API. 
118
                There is no possibility to add a new model to it. List of changes fixing this problem:
119
                    1) Models.createView (...) and Models.setModelsToView (...) methods do not use fixed set of models as parameters,
120
                       but they use Models.CompoundModel.
121
                    2) Models.CompoundModel is final class implementing all currently supported models. The only way how to create
122
                       a new instance of it is Models.createCompoundModel (List listOfModels). It allows future additions of new
123
                       models.
124
                    3) Methods Models.createCompoundTreeModel (...), Models.createCompoundNodeModel (...), 
125
                       Models.createCompoundTableModel (...), Models.createCompoundNodeActionsProvider (...), and field
126
                       Models.EMPTY_TREE_MODEL has been removed as useless.
127
                How to update your code using these exceptions:
128
                    No changes required for most of clients. You should change your code only if you are providing some 
129
                    new view based on ViewModel. In this case you should put all your model instances to one list, 
130
                    and call Models.createCompountModel (list), in place of calling create*Model* methods.
131
        </description>
132
        <class package="org.netbeans.spi.viewmodel" name="Models" />
133
        <class package="org.netbeans.spi.viewmodel" name="Models.CompoundModel" />
134
        <class package="org.netbeans.spi.viewmodel" name="Models.TreeFeatures" />
135
        <class package="org.netbeans.spi.viewmodel" name="TreeExpansionModel" />
136
        <issue number="46167"/>
137
    </change>
106
138
107
</changes>
139
</changes>
108
140
(-)debuggercore/viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java (-49 / +25 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 289-295 Link Here
289
                        name = (String) object;
252
                        name = (String) object;
290
                        setName (name);
253
                        setName (name);
291
                        setDisplayName (name);
254
                        setDisplayName (name);
292
                        setIconBase ("org/openide/resources/actions/empty");
255
//                        setIconBase ("org/openide/resources/actions/empty");
293
                    } else {
256
                    } else {
294
                        e.printStackTrace ();
257
                        e.printStackTrace ();
295
                        System.out.println (model);
258
                        System.out.println (model);
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 (-190 / +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-182 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
    
179
    /**
118
    /**
119
     * Creates one {@link CompoundModel} from given list of models.
120
     * 
121
     * @param models a list of models
122
     * @return {@link CompoundModel} encapsulating given list of models
123
     */
124
    public static CompoundModel createCompoundModel (List models) {
125
        List treeModels =           new ArrayList ();
126
        List treeModelFilters =     new ArrayList ();
127
        List treeExpansionModels =  new ArrayList ();
128
        List nodeModels =           new ArrayList ();
129
        List nodeModelFilters =     new ArrayList ();
130
        List tableModels =          new ArrayList ();
131
        List tableModelFilters =    new ArrayList ();
132
        List nodeActionsProviders = new ArrayList ();
133
        List nodeActionsProviderFilters = new ArrayList ();
134
        List columnModels =         new ArrayList ();
135
        
136
        // 1) sort models
137
        Iterator it = models.iterator ();
138
        while (it.hasNext ()) {
139
            Object model = it.next ();
140
            if (model instanceof TreeModel)
141
                treeModels.add (model);
142
            if (model instanceof TreeModelFilter)
143
                treeModelFilters.add (model);
144
            if (model instanceof TreeExpansionModel)
145
                treeExpansionModels.add (model);
146
            if (model instanceof NodeModel)
147
                nodeModels.add (model);
148
            if (model instanceof NodeModelFilter)
149
                nodeModelFilters.add (model);
150
            if (model instanceof TableModel)
151
                tableModels.add (model);
152
            if (model instanceof TableModelFilter)
153
                tableModelFilters.add (model);
154
            if (model instanceof NodeActionsProvider)
155
                nodeActionsProviders.add (model);
156
            if (model instanceof NodeActionsProviderFilter)
157
                nodeActionsProviderFilters.add (model);
158
            if (model instanceof ColumnModel)
159
                columnModels.add (model);
160
        }
161
        
162
        if (treeModels.isEmpty ()) treeModels.add (new EmptyTreeModel ());
163
        
164
        return new CompoundModel (
165
            createCompoundTreeModel (
166
                new DelegatingTreeModel (treeModels),
167
                treeModelFilters
168
            ),
169
            new DelegatingTreeExpansionModel (treeExpansionModels),
170
            createCompoundNodeModel (
171
                new DelegatingNodeModel (nodeModels),
172
                nodeModelFilters
173
            ),
174
            createCompoundNodeActionsProvider (
175
                new DelegatingNodeActionsProvider (nodeActionsProviders),
176
                nodeActionsProviderFilters
177
            ),
178
            columnModels,
179
            createCompoundTableModel (
180
                new DelegatingTableModel (tableModels),
181
                tableModelFilters
182
            )
183
        );
184
    }
185
    
186
    /**
187
     * Returns {@link javax.swing.Action} for given parameters.
188
     *
189
     * @param displayName a display name for action
190
     * @param node a node the action should by applied to
191
     * @param performer a performer for action
192
     *
193
     * @return a new instance of {@link javax.swing.Action} for given parameters
194
     */
195
    public static Action createAction (
196
        String displayName, 
197
        ActionPerformer performer,
198
        int multiselectionType
199
    ) {
200
        return new ActionSupport (
201
            displayName, 
202
            performer, 
203
            multiselectionType
204
        );
205
    }
206
    
207
    /**
208
     * Returns implementation of tree view features for given view.
209
     *
210
     * @param view a view created by this Models class
211
     * @throws UnsupportedOperationException in the case that given 
212
     *        view is not tree view
213
     * @return implementation of tree view features
214
     */
215
    public static TreeFeatures treeFeatures (JComponent view) 
216
    throws UnsupportedOperationException {
217
        return new TreeFeatures (view);
218
    }
219
    
220
    
221
    // private methods .........................................................
222
    
223
    /**
180
     * Creates {@link org.netbeans.spi.viewmodel.TreeModel} for given TreeModel and
224
     * Creates {@link org.netbeans.spi.viewmodel.TreeModel} for given TreeModel and
181
     * {@link org.netbeans.spi.viewmodel.TreeModelFilter}.
225
     * {@link org.netbeans.spi.viewmodel.TreeModelFilter}.
182
     * 
226
     * 
Lines 185-191 Link Here
185
     *
229
     *
186
     * @returns compund tree model
230
     * @returns compund tree model
187
     */
231
     */
188
    public static TreeModel createCompoundTreeModel (
232
    private static TreeModel createCompoundTreeModel (
189
        TreeModel originalTreeModel,
233
        TreeModel originalTreeModel,
190
        List treeModelFilters
234
        List treeModelFilters
191
    ) {
235
    ) {
Lines 208-214 Link Here
208
     *
252
     *
209
     * @returns compund tree model
253
     * @returns compund tree model
210
     */
254
     */
211
    public static NodeModel createCompoundNodeModel (
255
    private static NodeModel createCompoundNodeModel (
212
        NodeModel originalNodeModel,
256
        NodeModel originalNodeModel,
213
        List treeNodeModelFilters
257
        List treeNodeModelFilters
214
    ) {
258
    ) {
Lines 231-237 Link Here
231
     *
275
     *
232
     * @returns compund table model
276
     * @returns compund table model
233
     */
277
     */
234
    public static TableModel createCompoundTableModel (
278
    private static TableModel createCompoundTableModel (
235
        TableModel originalTableModel,
279
        TableModel originalTableModel,
236
        List tableModelFilters
280
        List tableModelFilters
237
    ) {
281
    ) {
Lines 254-260 Link Here
254
     *
298
     *
255
     * @returns compund node actions provider
299
     * @returns compund node actions provider
256
     */
300
     */
257
    public static NodeActionsProvider createCompoundNodeActionsProvider (
301
    private static NodeActionsProvider createCompoundNodeActionsProvider (
258
        NodeActionsProvider originalNodeActionsProvider,
302
        NodeActionsProvider originalNodeActionsProvider,
259
        List nodeActionsProviderFilters
303
        List nodeActionsProviderFilters
260
    ) {
304
    ) {
Lines 268-384 Link Here
268
        return nap;
312
        return nap;
269
    }
313
    }
270
    
314
    
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
    
315
    
383
    // innerclasses ............................................................
316
    // innerclasses ............................................................
384
    
317
    
Lines 809-814 Link Here
809
                   n + "  " + model;
742
                   n + "  " + model;
810
        }
743
        }
811
    }
744
    }
745
746
    /**
747
     * Creates one {@link org.netbeans.spi.viewmodel.TreeModel}
748
     * from given list of TreeModels. DelegatingTreeModel asks all underlaying 
749
     * models for each concrete parameter, and returns first returned value.
750
     *
751
     * @author   Jan Jancura
752
     */
753
    final static class DelegatingTreeModel implements TreeModel {
754
755
        private TreeModel[] models;
756
        private HashMap classNameToModel = new HashMap ();
757
758
759
        /**
760
         * Creates new instance of DelegatingTreeModel for given list of 
761
         * TableModels.
762
         *
763
         * @param models a list of TableModels
764
         */
765
        DelegatingTreeModel (List models) {
766
            this (convert (models));
767
        }
768
769
        private static TreeModel[] convert (List l) {
770
            TreeModel[] models = new TreeModel [l.size ()];
771
            return (TreeModel[]) l.toArray (models);
772
        }
773
774
        /**
775
         * Creates new instance of DelegatingTreeModel for given array of 
776
         * TableModels.
777
         *
778
         * @param models a array of TreeModel
779
         */
780
        DelegatingTreeModel (TreeModel[] models) {
781
            this.models = models;        
782
        }
783
        
784
        /** 
785
         * Returns the root node of the tree or null, if the tree is empty.
786
         *
787
         * @return the root node of the tree or null
788
         */
789
        public Object getRoot () {
790
            return models [0].getRoot ();
791
        }
792
793
        /** 
794
         * Returns children for given parent on given indexes.
795
         *
796
         * @param   parent a parent of returned nodes
797
         * @param   from a start index
798
         * @param   to a end index
799
         *
800
         * @throws  UnknownTypeException if this TreeModel implementation is not
801
         *          able to resolve children for given node type
802
         *
803
         * @return  children for given parent on given indexes
804
         */
805
        public Object[] getChildren (Object node, int from, int to)
806
        throws UnknownTypeException {
807
            TreeModel model = (TreeModel) classNameToModel.get (
808
                node.getClass ().getName ()
809
            );
810
            if (model != null) 
811
                try {
812
                    return model.getChildren (node, from, to);
813
                } catch (UnknownTypeException e) {
814
                }
815
            int i, k = models.length;
816
            for (i = 0; i < k; i++) {
817
                try {
818
                    Object[] v = models [i].getChildren (node, from, to);
819
                    classNameToModel.put (node.getClass ().getName (), models [i]);
820
                    return v;
821
                } catch (UnknownTypeException e) {
822
                }
823
            }
824
            throw new UnknownTypeException (node);
825
        }    
826
827
        /**
828
         * Returns number of children for given node.
829
         * 
830
         * @param   node the parent node
831
         * @throws  UnknownTypeException if this TreeModel implementation is not
832
         *          able to resolve children for given node type
833
         *
834
         * @return  true if node is leaf
835
         * @since 1.1
836
         */
837
        public int getChildrenCount (Object node) 
838
        throws UnknownTypeException {
839
            TreeModel model = (TreeModel) classNameToModel.get (
840
                node.getClass ().getName ()
841
            );
842
            if (model != null) 
843
                try {
844
                    return model.getChildrenCount (node);
845
                } catch (UnknownTypeException e) {
846
                }
847
            int i, k = models.length;
848
            for (i = 0; i < k; i++) {
849
                try {
850
                    int result = models [i].getChildrenCount (node);
851
                    classNameToModel.put (node.getClass ().getName (), models [i]);
852
                    return result;
853
                } catch (UnknownTypeException e) {
854
                }
855
            }
856
            throw new UnknownTypeException (node);
857
        }    
858
859
        /**
860
         * Returns true if node is leaf.
861
         * 
862
         * @throws  UnknownTypeException if this TreeModel implementation is not
863
         *          able to resolve dchildren for given node type
864
         * @return  true if node is leaf
865
         */
866
        public boolean isLeaf (Object node) throws UnknownTypeException {
867
            TreeModel model = (TreeModel) classNameToModel.get (
868
                node.getClass ().getName ()
869
            );
870
            if (model != null) 
871
                try {
872
                    return model.isLeaf (node);
873
                } catch (UnknownTypeException e) {
874
                }
875
            int i, k = models.length;
876
            for (i = 0; i < k; i++) {
877
                try {
878
                    boolean result = models [i].isLeaf (node);
879
                    classNameToModel.put (node.getClass ().getName (), models [i]);
880
                    return result;
881
                } catch (UnknownTypeException e) {
882
                }
883
            }
884
            throw new UnknownTypeException (node);
885
        }    
886
887
        /** 
888
         * Registers given listener.
889
         * 
890
         * @param l the listener to add
891
         */
892
        public void addTreeModelListener (TreeModelListener l) {
893
            int i, k = models.length;
894
            for (i = 0; i < k; i++)
895
                models [i].addTreeModelListener (l);
896
        }
897
898
        /** 
899
         * Unregisters given listener.
900
         *
901
         * @param l the listener to remove
902
         */
903
        public void removeTreeModelListener (TreeModelListener l) {
904
            int i, k = models.length;
905
            for (i = 0; i < k; i++)
906
                models [i].removeTreeModelListener (l);
907
        }
908
909
        public String toString () {
910
            return super.toString () + "\n" + toString ("    ");
911
        }
912
        
913
        public String toString (String n) {
914
            int i, k = models.length - 1;
915
            if (k == -1) return "";
916
            StringBuffer sb = new StringBuffer ();
917
            for (i = 0; i < k; i++) {
918
                sb.append (n);
919
                sb.append (models [i]);
920
                sb.append ('\n');
921
            }
922
            sb.append (n);
923
            sb.append (models [i]);
924
            return new String (sb);
925
        }
926
    }
812
    
927
    
813
    /**
928
    /**
814
     * Creates {@link org.netbeans.spi.viewmodel.NodeActionsProvider} 
929
     * Creates {@link org.netbeans.spi.viewmodel.NodeActionsProvider} 
Lines 1086-1093 Link Here
1086
    }
1201
    }
1087
1202
1088
    /**
1203
    /**
1089
     * Creates one {@link org.netbeans.spi.viewmodel.NodeModel}
1204
     * Creates one {@link org.netbeans.spi.viewmodel.TableModel}
1090
     * from given list of NodeModels. DelegatingNodeModel asks all underlaying 
1205
     * from given list of TableModels. DelegatingTableModel asks all underlaying 
1206
     * models for each concrete parameter, and returns first returned value.
1207
     *
1208
     * @author   Jan Jancura
1209
     */
1210
    final static class DelegatingTreeExpansionModel 
1211
    implements TreeExpansionModel {
1212
1213
        private TreeExpansionModel[] models;
1214
        private HashMap classNameToModel = new HashMap ();
1215
1216
1217
        /**
1218
         * Creates new instance of DelegatingTableModel for given list of 
1219
         * TableModels.
1220
         *
1221
         * @param models a list of TableModels
1222
         */
1223
        DelegatingTreeExpansionModel (List models) {
1224
            this (convert (models));
1225
        }
1226
1227
        private static TreeExpansionModel[] convert (List l) {
1228
            TreeExpansionModel[] models = new TreeExpansionModel [l.size ()];
1229
            return (TreeExpansionModel[]) l.toArray (models);
1230
        }
1231
1232
        /**
1233
         * Creates new instance of DelegatingTableModel for given array of 
1234
         * TableModels.
1235
         *
1236
         * @param models a array of TableModels
1237
         */
1238
        DelegatingTreeExpansionModel (TreeExpansionModel[] models) {
1239
            this.models = models;        
1240
        }
1241
1242
        /**
1243
         * Defines default state (collapsed, expanded) of given node.
1244
         *
1245
         * @param node a node
1246
         * @return default state (collapsed, expanded) of given node
1247
         */
1248
        public boolean isExpanded (Object node) 
1249
        throws UnknownTypeException {
1250
            TreeExpansionModel model = (TreeExpansionModel) 
1251
                classNameToModel.get (
1252
                    node.getClass ().getName ()
1253
                );
1254
            if (model != null) 
1255
                try {
1256
                    return model.isExpanded (node);
1257
                } catch (UnknownTypeException e) {
1258
                }
1259
            int i, k = models.length;
1260
            for (i = 0; i < k; i++) {
1261
                try {
1262
                    boolean result = models [i].isExpanded (node);
1263
                    classNameToModel.put (node.getClass ().getName (), models [i]);
1264
                    return result;
1265
                } catch (UnknownTypeException e) {
1266
                }
1267
            }
1268
            throw new UnknownTypeException (node);
1269
        }    
1270
1271
1272
        /**
1273
         * Called when given node is expanded.
1274
         *
1275
         * @param node a expanded node
1276
         */
1277
        public void nodeExpanded (Object node) {
1278
            int i, k = models.length;
1279
            for (i = 0; i < k; i++) {
1280
                models [i].nodeExpanded (node);
1281
            }
1282
        }    
1283
1284
        /**
1285
         * Called when given node is collapsed.
1286
         *
1287
         * @param node a collapsed node
1288
         */
1289
        public void nodeCollapsed (Object node) {
1290
            int i, k = models.length;
1291
            for (i = 0; i < k; i++) {
1292
                models [i].nodeCollapsed (node);
1293
            }
1294
        }    
1295
1296
        public String toString () {
1297
            return super.toString () + "\n" + toString ("    ");
1298
        }
1299
        
1300
        public String toString (String n) {
1301
            int i, k = models.length - 1;
1302
            if (k == -1) return "";
1303
            StringBuffer sb = new StringBuffer ();
1304
            for (i = 0; i < k; i++) {
1305
                sb.append (n);
1306
                sb.append (models [i]);
1307
                sb.append ('\n');
1308
            }
1309
            sb.append (n);
1310
            sb.append (models [i]);
1311
            return new String (sb);
1312
        }
1313
    }
1314
1315
    /**
1316
     * Creates one {@link org.netbeans.spi.viewmodel.NodeModel}
1317
     * from given list of NodeModels. DelegatingNodeModel asks all underlaying 
1091
     * models for each concrete parameter, and returns first returned value.
1318
     * models for each concrete parameter, and returns first returned value.
1092
     *
1319
     *
1093
     * @author   Jan Jancura
1320
     * @author   Jan Jancura
Lines 1662-1667 Link Here
1662
            int i, k = models.length;
1889
            int i, k = models.length;
1663
            for (i = 0; i < k; i++)
1890
            for (i = 0; i < k; i++)
1664
                models [i].removeTreeModelListener (l);
1891
                models [i].removeTreeModelListener (l);
1892
        }
1893
    }
1894
    
1895
    /**
1896
     * Implements set of tree view features.
1897
     */
1898
    public static final class TreeFeatures {
1899
        
1900
        private JComponent view;
1901
        
1902
        private TreeFeatures (JComponent view) {
1903
            this.view = view;
1904
        }
1905
        
1906
        /**
1907
         * Returns <code>true</code> if given node is expanded in given view.
1908
         *
1909
         * @param view a view created by this Models class
1910
         * @param node a node to be checked
1911
         * @return <code>true</code> if given node is expanded in given view
1912
         */
1913
        public boolean isExpanded (
1914
            Object node
1915
        ) {
1916
            return ((TreeTable) view).isExpanded (node);
1917
        }
1918
1919
        /**
1920
         * Expands given list of nodes in given view.
1921
         *
1922
         * @param view a view created by this Models class
1923
         * @param node a list of nodes to be expanded
1924
         */
1925
        public void expandNode (
1926
            Object node
1927
        ) {
1928
            ((TreeTable) view).expandNode (node);
1929
        }
1930
1931
        /**
1932
         * Collapses given node in given view.
1933
         *
1934
         * @param view a view created by this Models class
1935
         * @param node a node to be expanded
1936
         */
1937
        public void collapseNode (
1938
            Object node
1939
        ) {
1940
            ((TreeTable) view).collapseNode (node);
1941
        }
1942
    }
1943
1944
    /**
1945
     * This model encapsulates all currently supported models.
1946
     *
1947
     * @see Models#createCompoundModel
1948
     * @author   Jan Jancura
1949
     */
1950
    public static final class CompoundModel implements TreeModel, 
1951
    NodeModel, NodeActionsProvider, TableModel, TreeExpansionModel {
1952
1953
        private TreeModel       treeModel;
1954
        private NodeModel       nodeModel;
1955
        private NodeActionsProvider nodeActionsProvider;
1956
        private ColumnModel[]   columnModels;
1957
        private TableModel      tableModel;
1958
        private TreeExpansionModel treeExpansionModel;
1959
1960
1961
        // init ....................................................................
1962
1963
        /**
1964
         * Creates a new instance of {@link CompoundModel} for given models.
1965
         *
1966
         * @param treeModel a tree model to delegate on
1967
         * @param nodeModel a node model to delegate on
1968
         * @param nodeActionsProvider a node actions provider to delegate on
1969
         * @param nodeActionsProvider a columns modeol to delegate on
1970
         */
1971
        private CompoundModel (
1972
            TreeModel treeModel, 
1973
            TreeExpansionModel treeExpansionModel,
1974
            NodeModel nodeModel, 
1975
            NodeActionsProvider nodeActionsProvider,
1976
            List columnModels,
1977
            TableModel tableModel
1978
        ) {
1979
            if (treeModel == null) throw new NullPointerException ();
1980
            if (treeModel == null) throw new NullPointerException ();
1981
            if (nodeModel == null) throw new NullPointerException ();
1982
            if (tableModel == null) throw new NullPointerException ();
1983
            if (nodeActionsProvider == null) throw new NullPointerException ();
1984
1985
            this.treeModel = treeModel;
1986
            this.treeExpansionModel = treeExpansionModel;
1987
            this.nodeModel = nodeModel;
1988
            this.tableModel = tableModel;
1989
            this.nodeActionsProvider = nodeActionsProvider;
1990
            this.columnModels = (ColumnModel[]) columnModels.toArray (
1991
                new ColumnModel [columnModels.size ()]
1992
            );
1993
        }
1994
1995
1996
        // TreeModel ...............................................................
1997
1998
        /** 
1999
         * Returns the root node of the tree or null, if the tree is empty.
2000
         *
2001
         * @return the root node of the tree or null
2002
         */
2003
        public Object getRoot () {
2004
            return treeModel.getRoot ();
2005
        }
2006
2007
        /** 
2008
         * Returns children for given parent on given indexes.
2009
         *
2010
         * @param   parent a parent of returned nodes
2011
         * @throws  UnknownTypeException if this TreeModel implementation is not
2012
         *          able to resolve dchildren for given node type
2013
         *
2014
         * @return  children for given parent on given indexes
2015
         */
2016
        public Object[] getChildren (Object parent, int from, int to) 
2017
        throws UnknownTypeException {
2018
            return treeModel.getChildren (parent, from, to);
2019
        }
2020
2021
        /**
2022
         * Returns number of children for given node.
2023
         * 
2024
         * @param   node the parent node
2025
         * @throws  UnknownTypeException if this TreeModel implementation is not
2026
         *          able to resolve children for given node type
2027
         *
2028
         * @return  true if node is leaf
2029
         */
2030
        public int getChildrenCount (Object node) throws UnknownTypeException {
2031
            return treeModel.getChildrenCount (node);
2032
        }
2033
2034
        /**
2035
         * Returns true if node is leaf.
2036
         * 
2037
         * @throws  UnknownTypeException if this TreeModel implementation is not
2038
         *          able to resolve dchildren for given node type
2039
         * @return  true if node is leaf
2040
         */
2041
        public boolean isLeaf (Object node) throws UnknownTypeException {
2042
            return treeModel.isLeaf (node);
2043
        }
2044
2045
2046
        // NodeModel ...............................................................
2047
2048
        /**
2049
         * Returns display name for given node.
2050
         *
2051
         * @throws  UnknownTypeException if this NodeModel implementation is not
2052
         *          able to resolve display name for given node type
2053
         * @return  display name for given node
2054
         */
2055
        public String getDisplayName (Object node) throws UnknownTypeException {
2056
            return nodeModel.getDisplayName (node);
2057
        }
2058
2059
        /**
2060
         * Returns tooltip for given node.
2061
         *
2062
         * @throws  UnknownTypeException if this NodeModel implementation is not
2063
         *          able to resolve tooltip for given node type
2064
         * @return  tooltip for given node
2065
         */
2066
        public String getShortDescription (Object node) 
2067
        throws UnknownTypeException {
2068
            return nodeModel.getShortDescription (node);
2069
        }
2070
2071
        /**
2072
         * Returns icon for given node.
2073
         *
2074
         * @throws  ComputingException if the icon resolving process 
2075
         *          is time consuming, and the value will be updated later
2076
         * @throws  UnknownTypeException if this NodeModel implementation is not
2077
         *          able to resolve icon for given node type
2078
         * @return  icon for given node
2079
         */
2080
        public String getIconBase (Object node) 
2081
        throws UnknownTypeException {
2082
            return nodeModel.getIconBase (node);
2083
        }
2084
2085
2086
        // NodeActionsProvider .....................................................
2087
2088
        /**
2089
         * Performs default action for given node.
2090
         *
2091
         * @throws  UnknownTypeException if this NodeActionsProvider implementation 
2092
         *          is not able to resolve actions for given node type
2093
         * @return  display name for given node
2094
         */
2095
        public void performDefaultAction (Object node) throws UnknownTypeException {
2096
            nodeActionsProvider.performDefaultAction (node);
2097
        }
2098
2099
        /**
2100
         * Returns set of actions for given node.
2101
         *
2102
         * @throws  UnknownTypeException if this NodeActionsProvider implementation 
2103
         *          is not able to resolve actions for given node type
2104
         * @return  display name for given node
2105
         */
2106
        public Action[] getActions (Object node) throws UnknownTypeException {
2107
            return nodeActionsProvider.getActions (node);
2108
        }
2109
2110
2111
        // ColumnsModel ............................................................
2112
2113
        /**
2114
         * Returns sorted array of 
2115
         * {@link org.netbeans.spi.viewmodel.ColumnModel}s.
2116
         *
2117
         * @return sorted array of ColumnModels
2118
         */
2119
        public ColumnModel[] getColumns () {
2120
            return columnModels;
2121
        }
2122
2123
2124
        // TableModel ..............................................................
2125
2126
        public Object getValueAt (Object node, String columnID) throws 
2127
        UnknownTypeException {
2128
            return tableModel.getValueAt (node, columnID);
2129
        }
2130
2131
        public boolean isReadOnly (Object node, String columnID) throws 
2132
        UnknownTypeException {
2133
            return tableModel.isReadOnly (node, columnID);
2134
        }
2135
2136
        public void setValueAt (Object node, String columnID, Object value) throws 
2137
        UnknownTypeException {
2138
            tableModel.setValueAt (node, columnID, value);
2139
        }
2140
2141
2142
        // TreeExpansionModel ......................................................
2143
2144
        /**
2145
         * Defines default state (collapsed, expanded) of given node.
2146
         *
2147
         * @param node a node
2148
         * @return default state (collapsed, expanded) of given node
2149
         */
2150
        public boolean isExpanded (Object node) throws UnknownTypeException {
2151
            if (treeExpansionModel == null) return false;
2152
            return treeExpansionModel.isExpanded (node);
2153
        }
2154
2155
        /**
2156
         * Called when given node is expanded.
2157
         *
2158
         * @param node a expanded node
2159
         */
2160
        public void nodeExpanded (Object node) {
2161
            if (treeExpansionModel != null)
2162
                treeExpansionModel.nodeExpanded (node);
2163
        }
2164
2165
        /**
2166
         * Called when given node is collapsed.
2167
         *
2168
         * @param node a collapsed node
2169
         */
2170
        public void nodeCollapsed (Object node) {
2171
            if (treeExpansionModel != null)
2172
                treeExpansionModel.nodeCollapsed (node);
2173
        }
2174
2175
2176
        // listeners ...............................................................
2177
2178
        /** 
2179
         * Registers given listener.
2180
         * 
2181
         * @param l the listener to add
2182
         */
2183
        public void addTreeModelListener (TreeModelListener l) {
2184
            treeModel.addTreeModelListener (l);
2185
            nodeModel.addTreeModelListener (l);
2186
            nodeActionsProvider.addTreeModelListener (l);
2187
            tableModel.addTreeModelListener (l);
2188
        }
2189
2190
        /** 
2191
         * Unregisters given listener.
2192
         *
2193
         * @param l the listener to remove
2194
         */
2195
        public void removeTreeModelListener (TreeModelListener l) {
2196
            treeModel.removeTreeModelListener (l);
2197
            nodeModel.removeTreeModelListener (l);
2198
            nodeActionsProvider.removeTreeModelListener (l);
2199
            tableModel.removeTreeModelListener (l);
2200
        }
2201
2202
        public String toString () {
2203
            return super.toString () + 
2204
                   "\n  TreeModel = " + treeModel +
2205
                   "\n  NodeModel = " + nodeModel +
2206
                   "\n  TableModel = " + tableModel +
2207
                   "\n  NodeActionsProvider = " + nodeActionsProvider +
2208
                   "\n  ColumnsModel = " + columnModels;
1665
        }
2209
        }
1666
    }
2210
    }
1667
}
2211
}
(-)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
    /** 
(-)debuggercore/viewmodel/src/org/netbeans/spi/viewmodel/package.html (-4 / +7 lines)
Lines 5-11 Link Here
5
 content="text/html; charset=iso-8859-1">
5
 content="text/html; charset=iso-8859-1">
6
  <meta name="GENERATOR"
6
  <meta name="GENERATOR"
7
 content="Mozilla/4.76 [en] (Windows NT 5.0; U) [Netscape]">
7
 content="Mozilla/4.76 [en] (Windows NT 5.0; U) [Netscape]">
8
  <title>package</title>
8
  <title>View Model API</title>
9
<!--
9
<!--
10
  --                 Sun Public License Notice
10
  --                 Sun Public License Notice
11
  -- 
11
  -- 
Lines 18-23 Link Here
18
  -- Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
18
  -- Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
19
  -- Microsystems, Inc. All Rights Reserved.
19
  -- Microsystems, Inc. All Rights Reserved.
20
  -->
20
  -->
21
  <meta content="Jan Jancura" name="author">
21
</head>
22
</head>
22
<body style="color: rgb(0, 0, 0);" link="#0000ee" alink="#0000ee"
23
<body style="color: rgb(0, 0, 0);" link="#0000ee" alink="#0000ee"
23
 vlink="#551a8b">
24
 vlink="#551a8b">
Lines 48-54 Link Here
48
 alt="Tree Model Example 1" style="width: 401px; height: 355px;"
49
 alt="Tree Model Example 1" style="width: 401px; height: 355px;"
49
 align="right"><br>    public Object getRoot () {<br>        return ROOT;<br>    }<br>    <br>    public Object[] getChildren (Object parent, int from, int to) {<br>        if (parent == ROOT)<br>            return File.listRoots ();<br>        return ((File) parent).listFiles ();<br>    }<br>    <br>    public boolean isLeaf (Object node) {<br>        if (node == ROOT)<br>            return false;<br>        return ((File) node).isFile ();<br>    }<br>}<br></pre>
50
 align="right"><br>    public Object getRoot () {<br>        return ROOT;<br>    }<br>    <br>    public Object[] getChildren (Object parent, int from, int to) {<br>        if (parent == ROOT)<br>            return File.listRoots ();<br>        return ((File) parent).listFiles ();<br>    }<br>    <br>    public boolean isLeaf (Object node) {<br>        if (node == ROOT)<br>            return false;<br>        return ((File) node).isFile ();<br>    }<br>}<br></pre>
50
And create a TreeView for this model:
51
And create a TreeView for this model:
51
<pre style="background-color: rgb(255, 255, 102);">    JComponent treeView = Models.createView (<br>        new TreeModelImpl (),      // TreeModel<br>        null,                      // NodeModel<br>        null,                      // TableModel<br>        null,                      // NodeActionsProvider<br>        new ArrayList ()           // list of ColumnModel s<br>    );</pre>
52
<pre style="background-color: rgb(255, 255, 102);">    JComponent treeView = Models.createView (<br>        Models.createCompoundModel (<br>	    Arrays.asList (new Model[] {<br>                new TreeModelImpl (),      // TreeModel<br>                new ArrayList ()           // list of ColumnModel s<br>            })<br>        )<br>    );</pre>
52
See <a href="../../../../examples/TreeModelExample1.java">TreeModelExample1</a>.<br>
53
See <a href="../../../../examples/TreeModelExample1.java">TreeModelExample1</a>.<br>
53
<h3>Step 2.</h3>
54
<h3>Step 2.</h3>
54
NodeModel implementation can define name, icon and tooltip for tree
55
NodeModel implementation can define name, icon and tooltip for tree
Lines 64-71 Link Here
64
<pre style="background-color: rgb(255, 255, 102);">public class NodeActionsProviderImpl implements NodeActionsProvider {<br><br>    public Action[] getActions (final Object node) {<br>        return new Action [] {<br>            new AbstractAction ("Open") {<br>                public void actionPerformed (ActionEvent e) {<br>                    performDefaultAction (node);<br>                }<br>            },<br>            new AbstractAction ("Delete") {<br>                public void actionPerformed (ActionEvent e) {<br>                    ((File) node).delete ();<br>                }<br>            }<br>        };<br>    }<br>    <br>    public void performDefaultAction (Object node) {<br>        try {<br>            JFrame f = new JFrame ("View");<br>            f.getContentPane ().add (new JEditorPane (((File) node).toURL ()));<br>            f.pack ();<br>            f.show ();<br>        } catch (Exception e) {<br>            e.printStackTrace();<br>        }<br>    }<br>}</pre>
65
<pre style="background-color: rgb(255, 255, 102);">public class NodeActionsProviderImpl implements NodeActionsProvider {<br><br>    public Action[] getActions (final Object node) {<br>        return new Action [] {<br>            new AbstractAction ("Open") {<br>                public void actionPerformed (ActionEvent e) {<br>                    performDefaultAction (node);<br>                }<br>            },<br>            new AbstractAction ("Delete") {<br>                public void actionPerformed (ActionEvent e) {<br>                    ((File) node).delete ();<br>                }<br>            }<br>        };<br>    }<br>    <br>    public void performDefaultAction (Object node) {<br>        try {<br>            JFrame f = new JFrame ("View");<br>            f.getContentPane ().add (new JEditorPane (((File) node).toURL ()));<br>            f.pack ();<br>            f.show ();<br>        } catch (Exception e) {<br>            e.printStackTrace();<br>        }<br>    }<br>}</pre>
65
See <a href="../../../../examples/TreeModelExample3.java">TreeModelExample3</a>.<br>
66
See <a href="../../../../examples/TreeModelExample3.java">TreeModelExample3</a>.<br>
66
<br>
67
<br>
67
<img src="../../../../examples/TreeModelExample3.JPG" title=""
68
<div style="text-align: center;"><img
69
 src="../../../../examples/TreeModelExample3.JPG" title=""
68
 alt="Tree Model Example 3" style="width: 642px; height: 438px;"><br>
70
 alt="Tree Model Example 3" style="width: 642px; height: 438px;"><br>
71
</div>
69
<h3>Step 4.</h3>
72
<h3>Step 4.</h3>
70
TableModel and ColumnModel adds support for additional columns to tree
73
TableModel and ColumnModel adds support for additional columns to tree
71
view.<br>
74
view.<br>
Lines 74-80 Link Here
74
<pre style="background-color: rgb(255, 255, 102);">    ArrayList columns = new ArrayList ();<img
77
<pre style="background-color: rgb(255, 255, 102);">    ArrayList columns = new ArrayList ();<img
75
 src="../../../../examples/TreeModelExample4.JPG" title=""
78
 src="../../../../examples/TreeModelExample4.JPG" title=""
76
 alt="Tree Model Example 4" style="width: 384px; height: 278px;"
79
 alt="Tree Model Example 4" style="width: 384px; height: 278px;"
77
 align="right"><br>    columns.add (new ColumnModel () {<br>        public String getID () { return "sizeID"; }<br>        public String getDisplayName () { return "size"; }<br>        public Class getType () { return String.class; }<br>    });<br>    JComponent treeTableView = Models.createView (<br>        new TreeModelImpl (),           // TreeModel<br>        new NodeModelImpl (),           // NodeModel<br>        new TableModelImpl (),          // TableModel<br>        new NodeActionsProviderImpl (), // NodeActionsProvider<br>        columns                         // list of ColumnModel s<br>    );<br><br></pre>
80
 align="right"><br>    columns.add (new ColumnModel () {<br>        public String getID () { return "sizeID"; }<br>        public String getDisplayName () { return "size"; }<br>        public Class getType () { return String.class; }<br>    });<br>    JComponent treeTableView = Models.createView (<br>        Models.createCompoundModel (<br>            Arrays.asList (new Model[] {<br>                new TreeModelImpl (),           // TreeModel<br>                new NodeModelImpl (),           // NodeModel<br>                new TableModelImpl (),          // TableModel<br>                new NodeActionsProviderImpl (), // NodeActionsProvider<br>                columns                         // list of ColumnModel s<br>            })<br>        )<br>    );<br><br></pre>
78
See <a href="../../../../examples/TreeModelExample4.java">TreeModelExample4</a>.<br>
81
See <a href="../../../../examples/TreeModelExample4.java">TreeModelExample4</a>.<br>
79
<br>
82
<br>
80
<br>
83
<br>
(-)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