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 186672
Collapse All | Expand All

(-)a/spi.viewmodel/apichanges.xml (+15 lines)
Lines 384-389 Link Here
384
        <class package="org.netbeans.spi.viewmodel" name="ReorderableTreeModelFilter" />
384
        <class package="org.netbeans.spi.viewmodel" name="ReorderableTreeModelFilter" />
385
        <issue number="178301"/>
385
        <issue number="178301"/>
386
    </change>
386
    </change>
387
    <change>
388
        <api name="ViewModelAPI"/>
389
        <summary>Custom table cell renderers and editors.</summary>
390
        <version major="1" minor="28"/>
391
        <date day="7" month="6" year="2010"/>
392
        <author login="mentlicher"/>
393
        <compatibility binary="compatible" source="compatible" deletion="no" addition="yes" modification="no"/>
394
        <description>
395
            This API introduce TableRendererModel and TableRendererModelFilter
396
            that can be used to provide custom table cell renderers and cell editors.
397
        </description>
398
        <class package="org.netbeans.spi.viewmodel" name="TableRendererModel" />
399
        <class package="org.netbeans.spi.viewmodel" name="TableRendererModelFilter" />
400
        <issue number="186672"/>
401
    </change>
387
402
388
403
389
</changes>
404
</changes>
(-)a/spi.viewmodel/manifest.mf (-1 / +1 lines)
Lines 1-5 Link Here
1
Manifest-Version: 1.0
1
Manifest-Version: 1.0
2
OpenIDE-Module: org.netbeans.spi.viewmodel/2
2
OpenIDE-Module: org.netbeans.spi.viewmodel/2
3
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/viewmodel/Bundle.properties
3
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/viewmodel/Bundle.properties
4
OpenIDE-Module-Specification-Version: 1.27
4
OpenIDE-Module-Specification-Version: 1.28
5
5
(-)3659afb5fe5b (+190 lines)
Added Link Here
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
5
 *
6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
7
 * Other names may be trademarks of their respective owners.
8
 *
9
 * The contents of this file are subject to the terms of either the GNU
10
 * General Public License Version 2 only ("GPL") or the Common
11
 * Development and Distribution License("CDDL") (collectively, the
12
 * "License"). You may not use this file except in compliance with the
13
 * License. You can obtain a copy of the License at
14
 * http://www.netbeans.org/cddl-gplv2.html
15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
16
 * specific language governing permissions and limitations under the
17
 * License.  When distributing the software, include this License Header
18
 * Notice in each file and include the License file at
19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
20
 * particular file as subject to the "Classpath" exception as provided
21
 * by Oracle in the GPL Version 2 section of the License file that
22
 * accompanied this code. If applicable, add the following below the
23
 * License Header, with the fields enclosed by brackets [] replaced by
24
 * your own identifying information:
25
 * "Portions Copyrighted [year] [name of copyright owner]"
26
 *
27
 * Contributor(s):
28
 *
29
 * The Original Software is NetBeans. The Initial Developer of the Original
30
 * Software is Sun Microsystems, Inc. Portions Copyright 1997-2010 Sun
31
 * Microsystems, Inc. All Rights Reserved.
32
 *
33
 * If you wish your version of this file to be governed by only the CDDL
34
 * or only the GPL Version 2, indicate your decision by adding
35
 * "[Contributor] elects to include this software in this distribution
36
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
37
 * single choice of license, a recipient has the option to distribute
38
 * your version of this file under either the CDDL, the GPL Version 2 or
39
 * to extend the choice of license to its licensees as provided above.
40
 * However, if you add GPL Version 2 code and therefore, elected the GPL
41
 * Version 2 license, then the option applies only if the new code is
42
 * made subject to such option by the copyright holder.
43
 */
44
45
package org.netbeans.modules.viewmodel;
46
47
import java.awt.Component;
48
import java.awt.Point;
49
import java.awt.event.MouseEvent;
50
import java.util.EventObject;
51
import javax.swing.JTable;
52
import javax.swing.event.CellEditorListener;
53
import javax.swing.table.TableCellEditor;
54
import org.netbeans.spi.viewmodel.TableRendererModel;
55
import org.netbeans.spi.viewmodel.UnknownTypeException;
56
import org.netbeans.swing.outline.Outline;
57
import org.netbeans.swing.outline.OutlineModel;
58
import org.openide.util.Exceptions;
59
60
/**
61
 *
62
 * @author Martin Entlicher
63
 */
64
class DelegatingCellEditor implements TableCellEditor {
65
66
    private String columnID;
67
    private TableCellEditor defaultEditor;
68
    private TableCellEditor currentEditor;
69
70
    public DelegatingCellEditor(String columnID, TableCellEditor defaultEditor) {
71
        this.columnID = columnID;
72
        this.defaultEditor = defaultEditor;
73
    }
74
75
    @Override
76
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
77
        Outline outline = (Outline) table;
78
        OutlineModel om = (OutlineModel) outline.getModel();
79
        TreeModelNode tmn = (TreeModelNode) DelegatingCellRenderer.getNodeAt(om, row);
80
        TableRendererModel trm = tmn.getModel();
81
        try {
82
            if (trm.canEditCell(tmn.getObject(), columnID)) {
83
                TableCellEditor editor = trm.getCellEditor(tmn.getObject(), columnID);
84
                if (editor != null) {
85
                    currentEditor = editor;
86
                    return editor.getTableCellEditorComponent(table, value, isSelected, row, column);
87
                }
88
            }
89
        } catch (UnknownTypeException ex) {
90
        }
91
        // No specific editor
92
        currentEditor = defaultEditor;
93
        return defaultEditor.getTableCellEditorComponent(table, value, isSelected, row, column);
94
    }
95
96
    @Override
97
    public Object getCellEditorValue() {
98
        if (currentEditor != null) {
99
            return currentEditor.getCellEditorValue();
100
        }
101
        Exceptions.printStackTrace(new IllegalStateException("No current editor."));
102
        return null;
103
    }
104
105
    @Override
106
    public boolean isCellEditable(EventObject anEvent) {
107
        if (!(anEvent.getSource() instanceof Outline)) {
108
            return false;
109
        }
110
        Outline outline = (Outline) anEvent.getSource();
111
        if (!(anEvent instanceof MouseEvent)) {
112
            return false;
113
        }
114
        MouseEvent event = (MouseEvent) anEvent;
115
        Point p = event.getPoint();
116
117
        // Locate the editor under the event location
118
        //int column = outline.columnAtPoint(p);
119
        int row = outline.rowAtPoint(p);
120
        OutlineModel om = (OutlineModel) outline.getModel();
121
        TreeModelNode tmn = (TreeModelNode) DelegatingCellRenderer.getNodeAt(om, row);
122
        TableRendererModel trm = tmn.getModel();
123
        try {
124
            return trm.canEditCell(tmn.getObject(), columnID);
125
        } catch (UnknownTypeException ex) {
126
        }
127
        return defaultEditor.isCellEditable(anEvent);
128
    }
129
130
    @Override
131
    public boolean shouldSelectCell(EventObject anEvent) {
132
        if (!(anEvent.getSource() instanceof Outline)) {
133
            return false;
134
        }
135
        Outline outline = (Outline) anEvent.getSource();
136
        if (!(anEvent instanceof MouseEvent)) {
137
            return false;
138
        }
139
        MouseEvent event = (MouseEvent) anEvent;
140
        Point p = event.getPoint();
141
142
        // Locate the editor under the event location
143
        //int column = outline.columnAtPoint(p);
144
        int row = outline.rowAtPoint(p);
145
        OutlineModel om = (OutlineModel) outline.getModel();
146
        TreeModelNode tmn = (TreeModelNode) DelegatingCellRenderer.getNodeAt(om, row);
147
        TableRendererModel trm = tmn.getModel();
148
        try {
149
            if (trm.canEditCell(tmn.getObject(), columnID)) {
150
                TableCellEditor editor = trm.getCellEditor(tmn.getObject(), columnID);
151
                if (editor != null) {
152
                    return editor.shouldSelectCell(anEvent);
153
                }
154
            }
155
        } catch (UnknownTypeException ex) {
156
        }
157
        return defaultEditor.shouldSelectCell(anEvent);
158
    }
159
160
    @Override
161
    public boolean stopCellEditing() {
162
        if (currentEditor != null) {
163
            boolean status = currentEditor.stopCellEditing();
164
            currentEditor = null;
165
            return status;
166
        }
167
        Exceptions.printStackTrace(new IllegalStateException("No current editor."));
168
        return true;
169
    }
170
171
    @Override
172
    public void cancelCellEditing() {
173
        if (currentEditor != null) {
174
            currentEditor.cancelCellEditing();
175
            currentEditor = null;
176
        }
177
        Exceptions.printStackTrace(new IllegalStateException("No current editor."));
178
    }
179
180
    @Override
181
    public void addCellEditorListener(CellEditorListener l) {
182
        currentEditor.addCellEditorListener(l);
183
    }
184
185
    @Override
186
    public void removeCellEditorListener(CellEditorListener l) {
187
        currentEditor.removeCellEditorListener(l);
188
    }
189
190
}
(-)3659afb5fe5b (+100 lines)
Added Link Here
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
5
 *
6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
7
 * Other names may be trademarks of their respective owners.
8
 *
9
 * The contents of this file are subject to the terms of either the GNU
10
 * General Public License Version 2 only ("GPL") or the Common
11
 * Development and Distribution License("CDDL") (collectively, the
12
 * "License"). You may not use this file except in compliance with the
13
 * License. You can obtain a copy of the License at
14
 * http://www.netbeans.org/cddl-gplv2.html
15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
16
 * specific language governing permissions and limitations under the
17
 * License.  When distributing the software, include this License Header
18
 * Notice in each file and include the License file at
19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
20
 * particular file as subject to the "Classpath" exception as provided
21
 * by Oracle in the GPL Version 2 section of the License file that
22
 * accompanied this code. If applicable, add the following below the
23
 * License Header, with the fields enclosed by brackets [] replaced by
24
 * your own identifying information:
25
 * "Portions Copyrighted [year] [name of copyright owner]"
26
 *
27
 * Contributor(s):
28
 *
29
 * The Original Software is NetBeans. The Initial Developer of the Original
30
 * Software is Sun Microsystems, Inc. Portions Copyright 1997-2010 Sun
31
 * Microsystems, Inc. All Rights Reserved.
32
 *
33
 * If you wish your version of this file to be governed by only the CDDL
34
 * or only the GPL Version 2, indicate your decision by adding
35
 * "[Contributor] elects to include this software in this distribution
36
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
37
 * single choice of license, a recipient has the option to distribute
38
 * your version of this file under either the CDDL, the GPL Version 2 or
39
 * to extend the choice of license to its licensees as provided above.
40
 * However, if you add GPL Version 2 code and therefore, elected the GPL
41
 * Version 2 license, then the option applies only if the new code is
42
 * made subject to such option by the copyright holder.
43
 */
44
45
package org.netbeans.modules.viewmodel;
46
47
import java.awt.Component;
48
import javax.swing.JTable;
49
import javax.swing.table.TableCellRenderer;
50
import javax.swing.tree.TreePath;
51
import org.netbeans.spi.viewmodel.TableRendererModel;
52
import org.netbeans.spi.viewmodel.UnknownTypeException;
53
import org.netbeans.swing.outline.Outline;
54
import org.netbeans.swing.outline.OutlineModel;
55
import org.openide.explorer.view.Visualizer;
56
import org.openide.nodes.Node;
57
import org.openide.util.Exceptions;
58
59
/**
60
 *
61
 * @author Martin Entlicher
62
 */
63
class DelegatingCellRenderer implements TableCellRenderer {
64
65
    private String columnID;
66
    private TableCellRenderer defaultRenderer;
67
68
    public DelegatingCellRenderer(String columnID, TableCellRenderer defaultRenderer) {
69
        this.columnID = columnID;
70
        this.defaultRenderer = defaultRenderer;
71
    }
72
73
    @Override
74
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
75
        Outline outline = (Outline) table;
76
        OutlineModel om = (OutlineModel) outline.getModel();
77
        TreeModelNode tmn = (TreeModelNode) getNodeAt(om, row);
78
        TableRendererModel trm = tmn.getModel();
79
        try {
80
            if (trm.canRenderCell(tmn.getObject(), columnID)) {
81
                TableCellRenderer renderer = trm.getCellRenderer(tmn.getObject(), columnID);
82
                if (renderer != null) {
83
                    return renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
84
                }
85
            }
86
        } catch (UnknownTypeException ex) {
87
        }
88
        // No specific renderer
89
        return defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
90
    }
91
92
    static final Node getNodeAt(OutlineModel om, int row) {
93
        Node result = null;
94
        TreePath path = om.getLayout().getPathForRow(row);
95
        if (path != null) {
96
            result = Visualizer.findNode(path.getLastPathComponent());
97
        }
98
        return result;
99
    }
100
}
(-)a/spi.viewmodel/src/org/netbeans/modules/viewmodel/OutlineTable.java (-1 / +15 lines)
Lines 652-657 Link Here
652
            if (ci < columnsToSet.length && columns[i] == columnsToSet[ci]) {
652
            if (ci < columnsToSet.length && columns[i] == columnsToSet[ci]) {
653
                TableColumn tc = tcm.getColumn(tci);
653
                TableColumn tc = tcm.getColumn(tci);
654
                tableColumns[i] = tc;
654
                tableColumns[i] = tc;
655
                if (columns[i] instanceof Column) {
656
                    tableColumns[i].setCellEditor(new DelegatingCellEditor(
657
                            ((Column) columns[i]).getName(),
658
                            treeTable.getTable().getCellEditor(0, tci)));
659
                    tableColumns[i].setCellRenderer(new DelegatingCellRenderer(
660
                            ((Column) columns[i]).getName(),
661
                            treeTable.getTable().getCellRenderer(0, tci)));
662
                }
655
                if (columns[i].isHidden()) {
663
                if (columns[i].isHidden()) {
656
                    ecm.setColumnHidden(tc, true);
664
                    ecm.setColumnHidden(tc, true);
657
                } else {
665
                } else {
Lines 662-667 Link Here
662
                tableColumns[i] = tcm.getColumn(0);
670
                tableColumns[i] = tcm.getColumn(0);
663
                if (columns[i] instanceof Column) {
671
                if (columns[i] instanceof Column) {
664
                    tableColumns[i].setCellEditor(((Column)columns[i]).getTableCellEditor());
672
                    tableColumns[i].setCellEditor(((Column)columns[i]).getTableCellEditor());
673
                    tableColumns[i].setCellEditor(new DelegatingCellEditor(
674
                            ((Column) columns[i]).getName(),
675
                            treeTable.getTable().getCellEditor(0, 0)));
676
                    tableColumns[i].setCellRenderer(new DelegatingCellRenderer(
677
                            ((Column) columns[i]).getName(),
678
                            treeTable.getTable().getCellRenderer(0, 0)));
665
                }
679
                }
666
            }
680
            }
667
        }
681
        }
Lines 910-916 Link Here
910
                ((DefaultOutlineModel) m).setNodesColumnLabel(name);
924
                ((DefaultOutlineModel) m).setNodesColumnLabel(name);
911
            }
925
            }
912
        }
926
        }
913
        
927
914
        /*
928
        /*
915
        public List getExpandedPaths () {
929
        public List getExpandedPaths () {
916
            List result = new ArrayList ();
930
            List result = new ArrayList ();
(-)a/spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java (+7 lines)
Lines 44-49 Link Here
44
44
45
package org.netbeans.modules.viewmodel;
45
package org.netbeans.modules.viewmodel;
46
46
47
import java.awt.Component;
47
import java.awt.Image;
48
import java.awt.Image;
48
import java.awt.datatransfer.Transferable;
49
import java.awt.datatransfer.Transferable;
49
import java.awt.event.ActionEvent;
50
import java.awt.event.ActionEvent;
Lines 70-80 Link Here
70
import java.util.logging.Logger;
71
import java.util.logging.Logger;
71
import javax.swing.AbstractAction;
72
import javax.swing.AbstractAction;
72
import javax.swing.Action;
73
import javax.swing.Action;
74
import javax.swing.JTable;
73
import javax.swing.KeyStroke;
75
import javax.swing.KeyStroke;
74
import javax.swing.SwingUtilities;
76
import javax.swing.SwingUtilities;
75
77
76
import javax.swing.event.ChangeEvent;
78
import javax.swing.event.ChangeEvent;
77
import javax.swing.event.ChangeListener;
79
import javax.swing.event.ChangeListener;
80
import javax.swing.table.TableCellRenderer;
78
import javax.swing.table.TableColumn;
81
import javax.swing.table.TableColumn;
79
import javax.swing.table.TableColumnModel;
82
import javax.swing.table.TableColumnModel;
80
import org.netbeans.spi.viewmodel.AsynchronousModelFilter;
83
import org.netbeans.spi.viewmodel.AsynchronousModelFilter;
Lines 504-509 Link Here
504
    
507
    
505
    public Object getObject () {
508
    public Object getObject () {
506
        return object;
509
        return object;
510
    }
511
512
    Models.CompoundModel getModel() {
513
        return model;
507
    }
514
    }
508
515
509
    private Task refreshTask;
516
    private Task refreshTask;
(-)a/spi.viewmodel/src/org/netbeans/spi/viewmodel/Models.java (-17 / +396 lines)
Lines 69-74 Link Here
69
import javax.swing.Action;
69
import javax.swing.Action;
70
import javax.swing.JComponent;
70
import javax.swing.JComponent;
71
import javax.swing.SwingUtilities;
71
import javax.swing.SwingUtilities;
72
import javax.swing.table.TableCellEditor;
73
import javax.swing.table.TableCellRenderer;
72
74
73
import org.netbeans.modules.viewmodel.AsynchronousModel;
75
import org.netbeans.modules.viewmodel.AsynchronousModel;
74
import org.netbeans.modules.viewmodel.DefaultTreeExpansionManager;
76
import org.netbeans.modules.viewmodel.DefaultTreeExpansionManager;
Lines 241-247 Link Here
241
        // ; or the models directly
243
        // ; or the models directly
242
        boolean hasLists = false;
244
        boolean hasLists = false;
243
        int modelsSize = models.size();
245
        int modelsSize = models.size();
244
        if (11 <= modelsSize && modelsSize <= 14) {
246
        if (11 <= modelsSize && modelsSize <= 15) {
245
            Iterator it = models.iterator ();
247
            Iterator it = models.iterator ();
246
            boolean failure = false;
248
            boolean failure = false;
247
            while (it.hasNext ()) {
249
            while (it.hasNext ()) {
Lines 277-302 Link Here
277
                //    ml.asynchModels = (List<AsynchronousModel>) models.get(12);
279
                //    ml.asynchModels = (List<AsynchronousModel>) models.get(12);
278
                    if (modelsSize > 12) { // AsynchronousModelFilter
280
                    if (modelsSize > 12) { // AsynchronousModelFilter
279
                        ml.asynchModelFilters = (List<AsynchronousModelFilter>) models.get(12);
281
                        ml.asynchModelFilters = (List<AsynchronousModelFilter>) models.get(12);
282
                        if (modelsSize > 13) {
283
                            ml.tableRendererModels = (List<TableRendererModel>) models.get(13);
284
                            if (modelsSize > 14) {
285
                                ml.tableRendererModelFilters = (List<TableRendererModelFilter>) models.get(14);
286
                            }
287
                        }
280
                    }
288
                    }
281
                //}
289
                //}
282
            } else {
283
                ml.treeExpansionModelFilters = Collections.emptyList();
284
            }
290
            }
285
            //treeExpansionModelFilters = (models.size() > 11) ? (List<TreeExpansionModelFilter>) models.get(11) : (List<TreeExpansionModelFilter>) Collections.EMPTY_LIST;
291
            //treeExpansionModelFilters = (models.size() > 11) ? (List<TreeExpansionModelFilter>) models.get(11) : (List<TreeExpansionModelFilter>) Collections.EMPTY_LIST;
286
        } else { // We have the models, need to find out what they implement
292
        } else { // We have the models, need to find out what they implement
287
            ml.treeModels =           new LinkedList<TreeModel> ();
288
            ml.treeModelFilters =     new LinkedList<TreeModelFilter> ();
289
            ml.treeExpansionModels =  new LinkedList<TreeExpansionModel> ();
290
            ml.treeExpansionModelFilters = new LinkedList<TreeExpansionModelFilter> ();
291
            ml.nodeModels =           new LinkedList<NodeModel> ();
292
            ml.nodeModelFilters =     new LinkedList<NodeModelFilter> ();
293
            ml.tableModels =          new LinkedList<TableModel> ();
294
            ml.tableModelFilters =    new LinkedList<TableModelFilter> ();
295
            ml.nodeActionsProviders = new LinkedList<NodeActionsProvider> ();
296
            ml.nodeActionsProviderFilters = new LinkedList<NodeActionsProviderFilter> ();
297
            //ml.asynchModels =         new LinkedList<AsynchronousModel> ();
298
            ml.asynchModelFilters =   new LinkedList<AsynchronousModelFilter> ();
299
            ml.columnModels =         new LinkedList<ColumnModel> ();
300
            otherModels =          (List<? extends Model>) models;
293
            otherModels =          (List<? extends Model>) models;
301
        }
294
        }
302
295
Lines 381-386 Link Here
381
                new DefaultAsynchronousModel(),//new DelegatingAsynchronousModel (ml.asynchModels),
374
                new DefaultAsynchronousModel(),//new DelegatingAsynchronousModel (ml.asynchModels),
382
                ml.asynchModelFilters
375
                ml.asynchModelFilters
383
            ),
376
            ),
377
            createCompoundTableRendererModel (
378
                new DelegatingTableRendererModel(ml.tableRendererModels),
379
                ml.tableRendererModelFilters
380
            ),
384
            propertiesHelpID
381
            propertiesHelpID
385
        );
382
        );
386
        if (defaultExpansionModel != null) {
383
        if (defaultExpansionModel != null) {
Lines 515-520 Link Here
515
        return tm;
512
        return tm;
516
    }
513
    }
517
    
514
    
515
    /**
516
     * Creates {@link org.netbeans.spi.viewmodel.TableModel} for given TableModel and
517
     * {@link org.netbeans.spi.viewmodel.TableModelFilter}.
518
     *
519
     * @param originalTableModel a original table model
520
     * @param tableModelFilters a list of table model filters
521
     *
522
     * @returns compund table model
523
     */
524
    private static TableRendererModel createCompoundTableRendererModel (
525
        TableRendererModel originalTableModel,
526
        List tableModelFilters
527
    ) {
528
        TableRendererModel tm = originalTableModel;
529
        int i, k = tableModelFilters.size ();
530
        for (i = 0; i < k; i++)
531
            tm = new CompoundTableRendererModel (
532
                tm,
533
                (TableRendererModelFilter) tableModelFilters.get (i)
534
            );
535
        return tm;
536
    }
537
518
    /**
538
    /**
519
     * Creates {@link org.netbeans.spi.viewmodel.NodeActionsProvider} for given NodeActionsProvider and
539
     * Creates {@link org.netbeans.spi.viewmodel.NodeActionsProvider} for given NodeActionsProvider and
520
     * {@link org.netbeans.spi.viewmodel.NodeActionsProviderFilter}.
540
     * {@link org.netbeans.spi.viewmodel.NodeActionsProviderFilter}.
Lines 1312-1317 Link Here
1312
    }
1332
    }
1313
1333
1314
    /**
1334
    /**
1335
     * Creates {@link org.netbeans.spi.viewmodel.TableRendererModel} for given TableRendererModel and
1336
     * {@link org.netbeans.spi.viewmodel.TableRendererModelFilter}.
1337
     */
1338
    private final static class CompoundTableRendererModel implements TableRendererModel, ModelListener {
1339
1340
1341
        private TableRendererModel model;
1342
        private TableRendererModelFilter filter;
1343
1344
        private final Collection<ModelListener> modelListeners = new HashSet<ModelListener>();
1345
1346
1347
        /**
1348
         * Creates {@link org.netbeans.spi.viewmodel.TableRendererModel} for given TableRendererModel and
1349
         * {@link org.netbeans.spi.viewmodel.TableRendererModelFilter}.
1350
         */
1351
        CompoundTableRendererModel (TableRendererModel model, TableRendererModelFilter filter) {
1352
            this.model = model;
1353
            this.filter = filter;
1354
        }
1355
1356
        @Override
1357
        public boolean canRenderCell(Object node, String columnID) throws UnknownTypeException {
1358
            return filter.canRenderCell(model, node, columnID);
1359
        }
1360
1361
        @Override
1362
        public TableCellRenderer getCellRenderer(Object node, String columnID) throws UnknownTypeException {
1363
            return filter.getCellRenderer(model, node, columnID);
1364
        }
1365
1366
        @Override
1367
        public boolean canEditCell(Object node, String columnID) throws UnknownTypeException {
1368
            return filter.canEditCell(model, node, columnID);
1369
        }
1370
1371
        @Override
1372
        public TableCellEditor getCellEditor(Object node, String columnID) throws UnknownTypeException {
1373
            return filter.getCellEditor(model, node, columnID);
1374
        }
1375
        
1376
        /**
1377
         * Registers given listener.
1378
         *
1379
         * @param l the listener to add
1380
         */
1381
        public void addModelListener (ModelListener l) {
1382
            synchronized (modelListeners) {
1383
                if (modelListeners.size() == 0) {
1384
                    filter.addModelListener (this);
1385
                    model.addModelListener (this);
1386
                }
1387
                modelListeners.add(l);
1388
            }
1389
        }
1390
1391
        /**
1392
         * Unregisters given listener.
1393
         *
1394
         * @param l the listener to remove
1395
         */
1396
        public void removeModelListener (ModelListener l) {
1397
            synchronized (modelListeners) {
1398
                modelListeners.remove(l);
1399
                if (modelListeners.size() == 0) {
1400
                    filter.removeModelListener (this);
1401
                    model.removeModelListener (this);
1402
                }
1403
            }
1404
        }
1405
1406
        public void modelChanged(ModelEvent event) {
1407
            if (event instanceof ModelEvent.NodeChanged && (event.getSource() instanceof NodeModel || event.getSource() instanceof NodeModelFilter)) {
1408
                // CompoundNodeModel.modelChanged() takes this.
1409
                return ;
1410
            }
1411
            if (event instanceof ModelEvent.TreeChanged &&
1412
                    (event.getSource() instanceof TreeModel || event.getSource() instanceof TreeModelFilter)) {
1413
                // CompoundTreeModel.modelChanged() takes this.
1414
                return ;
1415
            }
1416
            ModelEvent newEvent = translateEvent(event, this);
1417
            Collection<ModelListener> listeners;
1418
            synchronized (modelListeners) {
1419
                listeners = new ArrayList<ModelListener>(modelListeners);
1420
            }
1421
            for (Iterator<ModelListener> it = listeners.iterator(); it.hasNext(); ) {
1422
                it.next().modelChanged(newEvent);
1423
            }
1424
        }
1425
1426
        @Override
1427
        public String toString () {
1428
            return super.toString () + "\n" + toString ("    ");
1429
        }
1430
1431
        public String toString (String n) {
1432
            if (model instanceof CompoundTableRendererModel)
1433
                return n + filter + "\n" +
1434
                    ((CompoundTableRendererModel) model).toString (n + "  ");
1435
            if (model instanceof DelegatingTableRendererModel)
1436
                return n + filter + "\n" +
1437
                    ((DelegatingTableRendererModel) model).toString (n + "  ");
1438
            return n + filter + "\n" +
1439
                   n + "  " + model;
1440
        }
1441
1442
    }
1443
1444
    /**
1315
     * Creates one {@link org.netbeans.spi.viewmodel.TreeModel}
1445
     * Creates one {@link org.netbeans.spi.viewmodel.TreeModel}
1316
     * from given list of TreeModels. DelegatingTreeModel asks all underlaying 
1446
     * from given list of TreeModels. DelegatingTreeModel asks all underlaying 
1317
     * models for each concrete parameter, and returns first returned value.
1447
     * models for each concrete parameter, and returns first returned value.
Lines 1943-1948 Link Here
1943
            sb.append (models [i]);
2073
            sb.append (models [i]);
1944
            return new String (sb);
2074
            return new String (sb);
1945
        }
2075
        }
2076
    }
2077
2078
    /**
2079
     * Creates one {@link org.netbeans.spi.viewmodel.TableRendererModel}
2080
     * from given list of TableRendererModel. DelegatingTableRendererModel asks all underlaying
2081
     * models for each concrete parameter, and returns first returned value.
2082
     */
2083
    private final static class DelegatingTableRendererModel implements TableRendererModel {
2084
2085
        private TableRendererModel[] models;
2086
        private HashMap<String, TableRendererModel> classNameToModel = new HashMap<String, TableRendererModel>();
2087
2088
2089
        /**
2090
         * Creates new instance of DelegatingTableModel for given list of
2091
         * TableModels.
2092
         *
2093
         * @param models a list of TableModels
2094
         */
2095
        DelegatingTableRendererModel (List<TableRendererModel> models) {
2096
            this (convert (models));
2097
        }
2098
2099
        private static TableRendererModel[] convert (List<TableRendererModel> l) {
2100
            TableRendererModel[] models = new TableRendererModel [l.size ()];
2101
            return l.toArray (models);
2102
        }
2103
2104
        /**
2105
         * Creates new instance of DelegatingTableModel for given array of
2106
         * TableModels.
2107
         *
2108
         * @param models a array of TableModels
2109
         */
2110
        DelegatingTableRendererModel (TableRendererModel[] models) {
2111
            this.models = models;
2112
        }
2113
2114
        @Override
2115
        public boolean canRenderCell(Object node, String columnID) throws UnknownTypeException {
2116
            TableRendererModel model = classNameToModel.get (
2117
                node.getClass ().getName ()
2118
            );
2119
            if (model != null)
2120
                try {
2121
                    return model.canRenderCell (node, columnID);
2122
                } catch (UnknownTypeException e) {
2123
                }
2124
            int i, k = models.length;
2125
            for (i = 0; i < k; i++) {
2126
                try {
2127
                    boolean cr = models [i].canRenderCell (node, columnID);
2128
                    classNameToModel.put (node.getClass ().getName (), models [i]);
2129
                    return cr;
2130
                } catch (UnknownTypeException e) {
2131
                }
2132
            }
2133
            throw new UnknownTypeException (node);
2134
        }
2135
2136
        @Override
2137
        public TableCellRenderer getCellRenderer(Object node, String columnID) throws UnknownTypeException {
2138
            TableRendererModel model = classNameToModel.get (
2139
                node.getClass ().getName ()
2140
            );
2141
            if (model != null)
2142
                try {
2143
                    return model.getCellRenderer (node, columnID);
2144
                } catch (UnknownTypeException e) {
2145
                }
2146
            int i, k = models.length;
2147
            for (i = 0; i < k; i++) {
2148
                try {
2149
                    TableCellRenderer cr = models [i].getCellRenderer (node, columnID);
2150
                    classNameToModel.put (node.getClass ().getName (), models [i]);
2151
                    return cr;
2152
                } catch (UnknownTypeException e) {
2153
                }
2154
            }
2155
            throw new UnknownTypeException (node);
2156
        }
2157
2158
        @Override
2159
        public boolean canEditCell(Object node, String columnID) throws UnknownTypeException {
2160
            TableRendererModel model = classNameToModel.get (
2161
                node.getClass ().getName ()
2162
            );
2163
            if (model != null)
2164
                try {
2165
                    return model.canEditCell (node, columnID);
2166
                } catch (UnknownTypeException e) {
2167
                }
2168
            int i, k = models.length;
2169
            for (i = 0; i < k; i++) {
2170
                try {
2171
                    boolean ce = models [i].canEditCell (node, columnID);
2172
                    classNameToModel.put (node.getClass ().getName (), models [i]);
2173
                    return ce;
2174
                } catch (UnknownTypeException e) {
2175
                }
2176
            }
2177
            throw new UnknownTypeException (node);
2178
        }
2179
2180
        @Override
2181
        public TableCellEditor getCellEditor(Object node, String columnID) throws UnknownTypeException {
2182
            TableRendererModel model = classNameToModel.get (
2183
                node.getClass ().getName ()
2184
            );
2185
            if (model != null)
2186
                try {
2187
                    return model.getCellEditor (node, columnID);
2188
                } catch (UnknownTypeException e) {
2189
                }
2190
            int i, k = models.length;
2191
            for (i = 0; i < k; i++) {
2192
                try {
2193
                    TableCellEditor ce = models [i].getCellEditor (node, columnID);
2194
                    classNameToModel.put (node.getClass ().getName (), models [i]);
2195
                    return ce;
2196
                } catch (UnknownTypeException e) {
2197
                }
2198
            }
2199
            throw new UnknownTypeException (node);
2200
        }
2201
        
2202
        /**
2203
         * Registers given listener.
2204
         *
2205
         * @param l the listener to add
2206
         */
2207
        @Override
2208
        public void addModelListener (ModelListener l) {
2209
            int i, k = models.length;
2210
            for (i = 0; i < k; i++)
2211
                models [i].addModelListener (l);
2212
        }
2213
2214
        /**
2215
         * Registers given listener.
2216
         *
2217
         * @param l the listener to add
2218
         */
2219
        void addModelListener (ModelListener l, Set<Model> modelsListenersAddedTo) {
2220
            int i, k = models.length;
2221
            for (i = 0; i < k; i++) {
2222
                TableRendererModel m = models [i];
2223
                if (!modelsListenersAddedTo.add(m)) {
2224
                    continue;
2225
                }
2226
                if (m instanceof DelegatingTableRendererModel) {
2227
                    ((DelegatingTableRendererModel) m).addModelListener(l, modelsListenersAddedTo);
2228
                } else {
2229
                    m.addModelListener (l);
2230
                }
2231
            }
2232
        }
2233
2234
        /**
2235
         * Unregisters given listener.
2236
         *
2237
         * @param l the listener to remove
2238
         */
2239
        @Override
2240
        public void removeModelListener (ModelListener l) {
2241
            int i, k = models.length;
2242
            for (i = 0; i < k; i++)
2243
                models [i].removeModelListener (l);
2244
        }
2245
2246
        @Override
2247
        public String toString () {
2248
            return super.toString () + "\n" + toString ("    ");
2249
        }
2250
2251
        public String toString (String n) {
2252
            int i, k = models.length - 1;
2253
            if (k == -1) return "";
2254
            StringBuffer sb = new StringBuffer ();
2255
            for (i = 0; i < k; i++) {
2256
                sb.append (n);
2257
                sb.append (models [i]);
2258
                sb.append ('\n');
2259
            }
2260
            sb.append (n);
2261
            sb.append (models [i]);
2262
            return new String (sb);
2263
        }
2264
1946
    }
2265
    }
1947
2266
1948
    /**
2267
    /**
Lines 3340-3346 Link Here
3340
     * @author   Jan Jancura
3659
     * @author   Jan Jancura
3341
     */
3660
     */
3342
    public static final class CompoundModel implements ReorderableTreeModel,
3661
    public static final class CompoundModel implements ReorderableTreeModel,
3343
    ExtendedNodeModel, CheckNodeModel, DnDNodeModel, NodeActionsProvider, TableModel, TreeExpansionModel {
3662
                                                       ExtendedNodeModel,
3663
                                                       CheckNodeModel,
3664
                                                       DnDNodeModel,
3665
                                                       NodeActionsProvider,
3666
                                                       TableModel,
3667
                                                       TreeExpansionModel,
3668
                                                       TableRendererModel {
3344
3669
3345
        private ReorderableTreeModel treeModel;
3670
        private ReorderableTreeModel treeModel;
3346
        private ExtendedNodeModel nodeModel;
3671
        private ExtendedNodeModel nodeModel;
Lines 3349-3354 Link Here
3349
        private NodeActionsProvider nodeActionsProvider;
3674
        private NodeActionsProvider nodeActionsProvider;
3350
        private ColumnModel[]   columnModels;
3675
        private ColumnModel[]   columnModels;
3351
        private TableModel      tableModel;
3676
        private TableModel      tableModel;
3677
        private TableRendererModel tableRendererModel;
3352
        private TreeExpansionModel treeExpansionModel;
3678
        private TreeExpansionModel treeExpansionModel;
3353
        private AsynchronousModel asynchModel;
3679
        private AsynchronousModel asynchModel;
3354
3680
Lines 3380-3385 Link Here
3380
            List<ColumnModel> columnModels,
3706
            List<ColumnModel> columnModels,
3381
            TableModel tableModel,
3707
            TableModel tableModel,
3382
            AsynchronousModel asynchModel,
3708
            AsynchronousModel asynchModel,
3709
            TableRendererModel tableRendererModel,
3383
            String propertiesHelpID
3710
            String propertiesHelpID
3384
        ) {
3711
        ) {
3385
            if (treeModel == null) throw new NullPointerException ();
3712
            if (treeModel == null) throw new NullPointerException ();
Lines 3398-3403 Link Here
3398
                this.dndNodeModel = (DnDNodeModel) nodeModel;
3725
                this.dndNodeModel = (DnDNodeModel) nodeModel;
3399
            }
3726
            }
3400
            this.tableModel = tableModel;
3727
            this.tableModel = tableModel;
3728
            this.tableRendererModel = tableRendererModel;
3401
            this.nodeActionsProvider = nodeActionsProvider;
3729
            this.nodeActionsProvider = nodeActionsProvider;
3402
            this.columnModels = columnModels.toArray (
3730
            this.columnModels = columnModels.toArray (
3403
                new ColumnModel [columnModels.size ()]
3731
                new ColumnModel [columnModels.size ()]
Lines 3860-3865 Link Here
3860
4188
3861
        public Executor asynchronous(CALL asynchCall, Object node) throws UnknownTypeException {
4189
        public Executor asynchronous(CALL asynchCall, Object node) throws UnknownTypeException {
3862
            return asynchModel.asynchronous(asynchCall, node);
4190
            return asynchModel.asynchronous(asynchCall, node);
4191
        }
4192
4193
        // TableRendererModel
4194
4195
        @Override
4196
        public boolean canRenderCell(Object node, String columnID) throws UnknownTypeException {
4197
            if (tableRendererModel != null) {
4198
                return tableRendererModel.canRenderCell(node, columnID);
4199
            } else {
4200
                return false;
4201
            }
4202
        }
4203
4204
        @Override
4205
        public TableCellRenderer getCellRenderer(Object node, String columnID) throws UnknownTypeException {
4206
            if (tableRendererModel != null) {
4207
                return tableRendererModel.getCellRenderer(node, columnID);
4208
            } else {
4209
                return null;
4210
            }
4211
        }
4212
4213
        @Override
4214
        public boolean canEditCell(Object node, String columnID) throws UnknownTypeException {
4215
            if (tableRendererModel != null) {
4216
                return tableRendererModel.canEditCell(node, columnID);
4217
            } else {
4218
                return false;
4219
            }
4220
        }
4221
4222
        @Override
4223
        public TableCellEditor getCellEditor(Object node, String columnID) throws UnknownTypeException {
4224
            if (tableRendererModel != null) {
4225
                return tableRendererModel.getCellEditor(node, columnID);
4226
            } else {
4227
                return null;
4228
            }
3863
        }
4229
        }
3864
4230
3865
    }
4231
    }
Lines 3879-3884 Link Here
3879
        public List<ColumnModel>               columnModels = Collections.emptyList();
4245
        public List<ColumnModel>               columnModels = Collections.emptyList();
3880
        //public List<AsynchronousModel>         asynchModels = Collections.emptyList();
4246
        //public List<AsynchronousModel>         asynchModels = Collections.emptyList();
3881
        public List<AsynchronousModelFilter>   asynchModelFilters = Collections.emptyList();
4247
        public List<AsynchronousModelFilter>   asynchModelFilters = Collections.emptyList();
4248
        public List<TableRendererModel>        tableRendererModels = Collections.emptyList();
4249
        public List<TableRendererModelFilter>  tableRendererModelFilters = Collections.emptyList();
3882
4250
3883
        public void addOtherModels(List<? extends Model> otherModels) {
4251
        public void addOtherModels(List<? extends Model> otherModels) {
3884
            Iterator it = otherModels.iterator ();
4252
            Iterator it = otherModels.iterator ();
Lines 3929-3934 Link Here
3929
                    else
4297
                    else
3930
                        tableModelFilters.add(0, (TableModelFilter) model);
4298
                        tableModelFilters.add(0, (TableModelFilter) model);
3931
                }
4299
                }
4300
                if (model instanceof TableRendererModel && !tableRendererModels.contains((TableRendererModel) model)) {
4301
                    tableRendererModels = new ArrayList<TableRendererModel>(tableRendererModels);
4302
                    tableRendererModels.add((TableRendererModel) model);
4303
                }
4304
                if (model instanceof TableRendererModelFilter && !tableRendererModelFilters.contains((TableRendererModelFilter) model)) {
4305
                    tableRendererModelFilters = new ArrayList<TableRendererModelFilter>(tableRendererModelFilters);
4306
                    if (first)
4307
                        tableRendererModelFilters.add((TableRendererModelFilter) model);
4308
                    else
4309
                        tableRendererModelFilters.add(0, (TableRendererModelFilter) model);
4310
                }
3932
                if (model instanceof NodeActionsProvider && !nodeActionsProviders.contains((NodeActionsProvider) model)) {
4311
                if (model instanceof NodeActionsProvider && !nodeActionsProviders.contains((NodeActionsProvider) model)) {
3933
                    nodeActionsProviders = new ArrayList<NodeActionsProvider>(nodeActionsProviders);
4312
                    nodeActionsProviders = new ArrayList<NodeActionsProvider>(nodeActionsProviders);
3934
                    nodeActionsProviders.add((NodeActionsProvider) model);
4313
                    nodeActionsProviders.add((NodeActionsProvider) model);
(-)3659afb5fe5b (+107 lines)
Added Link Here
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
5
 *
6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
7
 * Other names may be trademarks of their respective owners.
8
 *
9
 * The contents of this file are subject to the terms of either the GNU
10
 * General Public License Version 2 only ("GPL") or the Common
11
 * Development and Distribution License("CDDL") (collectively, the
12
 * "License"). You may not use this file except in compliance with the
13
 * License. You can obtain a copy of the License at
14
 * http://www.netbeans.org/cddl-gplv2.html
15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
16
 * specific language governing permissions and limitations under the
17
 * License.  When distributing the software, include this License Header
18
 * Notice in each file and include the License file at
19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
20
 * particular file as subject to the "Classpath" exception as provided
21
 * by Oracle in the GPL Version 2 section of the License file that
22
 * accompanied this code. If applicable, add the following below the
23
 * License Header, with the fields enclosed by brackets [] replaced by
24
 * your own identifying information:
25
 * "Portions Copyrighted [year] [name of copyright owner]"
26
 *
27
 * Contributor(s):
28
 *
29
 * The Original Software is NetBeans. The Initial Developer of the Original
30
 * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
31
 * Microsystems, Inc. All Rights Reserved.
32
 *
33
 * If you wish your version of this file to be governed by only the CDDL
34
 * or only the GPL Version 2, indicate your decision by adding
35
 * "[Contributor] elects to include this software in this distribution
36
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
37
 * single choice of license, a recipient has the option to distribute
38
 * your version of this file under either the CDDL, the GPL Version 2 or
39
 * to extend the choice of license to its licensees as provided above.
40
 * However, if you add GPL Version 2 code and therefore, elected the GPL
41
 * Version 2 license, then the option applies only if the new code is
42
 * made subject to such option by the copyright holder.
43
 */
44
45
package org.netbeans.spi.viewmodel;
46
47
import javax.swing.table.TableCellEditor;
48
import javax.swing.table.TableCellRenderer;
49
50
/**
51
 * Model that provides custom cell renderer and cell editor for table cells.
52
 * 
53
 * @author Martin Entlicher
54
 * @since 1.28
55
 */
56
public interface TableRendererModel extends Model {
57
58
    /**
59
     * Test whether this renderer can render the given cell.
60
     * @param node Tree node representing the row
61
     * @param columnID The column name
62
     * @return <code>true</code> if the implementation can render the given cell, <code>false</code> otherwise
63
     * @throws UnknownTypeException If the implementation can not decide whether to render the given cell.
64
     */
65
    public boolean canRenderCell(Object node, String columnID) throws UnknownTypeException;
66
67
    /**
68
     * Get the renderer of the given cell
69
     * @param node Tree node representing the row
70
     * @param columnID The column name
71
     * @return The cell renderer
72
     * @throws UnknownTypeException If the implementation can not render the given cell.
73
     */
74
    public TableCellRenderer getCellRenderer(Object node, String columnID) throws UnknownTypeException;
75
76
    /**
77
     * Test whether this renderer can edit the given cell.
78
     * @param node Tree node representing the row
79
     * @param columnID The column name
80
     * @return <code>true</code> if the implementation can edit the given cell, <code>false</code> otherwise
81
     * @throws UnknownTypeException If the implementation can not decide whether to edit the given cell.
82
     */
83
    public boolean canEditCell(Object node, String columnID) throws UnknownTypeException;
84
85
    /**
86
     * Get the editor of the given cell
87
     * @param node Tree node representing the row
88
     * @param columnID The column name
89
     * @return The cell editor
90
     * @throws UnknownTypeException If the implementation can not edit the given cell.
91
     */
92
    public TableCellEditor getCellEditor(Object node, String columnID) throws UnknownTypeException;
93
94
    /**
95
     * Registers given listener.
96
     *
97
     * @param l the listener to add
98
     */
99
    public abstract void addModelListener (ModelListener l);
100
101
    /**
102
     * Unregisters given listener.
103
     *
104
     * @param l the listener to remove
105
     */
106
    public abstract void removeModelListener (ModelListener l);
107
}
(-)3659afb5fe5b (+115 lines)
Added Link Here
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
5
 *
6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
7
 * Other names may be trademarks of their respective owners.
8
 *
9
 * The contents of this file are subject to the terms of either the GNU
10
 * General Public License Version 2 only ("GPL") or the Common
11
 * Development and Distribution License("CDDL") (collectively, the
12
 * "License"). You may not use this file except in compliance with the
13
 * License. You can obtain a copy of the License at
14
 * http://www.netbeans.org/cddl-gplv2.html
15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
16
 * specific language governing permissions and limitations under the
17
 * License.  When distributing the software, include this License Header
18
 * Notice in each file and include the License file at
19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
20
 * particular file as subject to the "Classpath" exception as provided
21
 * by Oracle in the GPL Version 2 section of the License file that
22
 * accompanied this code. If applicable, add the following below the
23
 * License Header, with the fields enclosed by brackets [] replaced by
24
 * your own identifying information:
25
 * "Portions Copyrighted [year] [name of copyright owner]"
26
 *
27
 * Contributor(s):
28
 *
29
 * The Original Software is NetBeans. The Initial Developer of the Original
30
 * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
31
 * Microsystems, Inc. All Rights Reserved.
32
 *
33
 * If you wish your version of this file to be governed by only the CDDL
34
 * or only the GPL Version 2, indicate your decision by adding
35
 * "[Contributor] elects to include this software in this distribution
36
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
37
 * single choice of license, a recipient has the option to distribute
38
 * your version of this file under either the CDDL, the GPL Version 2 or
39
 * to extend the choice of license to its licensees as provided above.
40
 * However, if you add GPL Version 2 code and therefore, elected the GPL
41
 * Version 2 license, then the option applies only if the new code is
42
 * made subject to such option by the copyright holder.
43
 */
44
45
package org.netbeans.spi.viewmodel;
46
47
import javax.swing.table.TableCellEditor;
48
import javax.swing.table.TableCellRenderer;
49
50
/**
51
 * Model filter that can override custom cell renderer and cell editor for table cells.
52
 * 
53
 * @author Martin Entlicher
54
 * @since 1.28
55
 */
56
public interface TableRendererModelFilter extends Model {
57
58
    /**
59
     * Test whether this renderer can render the given cell.
60
     * @param original The original table cell renderer implementation
61
     * @param node Tree node representing the row
62
     * @param columnID The column name
63
     * @return <code>true</code> if the implementation can render the given cell, <code>false</code> otherwise
64
     * @throws UnknownTypeException If the implementation can not decide whether to render the given cell.
65
     */
66
    public boolean canRenderCell(TableRendererModel original, Object node, String columnID)
67
            throws UnknownTypeException;
68
69
    /**
70
     * Get the renderer of the given cell
71
     * @param original The original table cell renderer implementation
72
     * @param node Tree node representing the row
73
     * @param columnID The column name
74
     * @return The cell renderer
75
     * @throws UnknownTypeException If the implementation can not render the given cell.
76
     */
77
    public TableCellRenderer getCellRenderer(TableRendererModel original, Object node, String columnID)
78
            throws UnknownTypeException;
79
80
    /**
81
     * Test whether this renderer can edit the given cell.
82
     * @param original The original table cell renderer implementation
83
     * @param node Tree node representing the row
84
     * @param columnID The column name
85
     * @return <code>true</code> if the implementation can edit the given cell, <code>false</code> otherwise
86
     * @throws UnknownTypeException If the implementation can not decide whether to edit the given cell.
87
     */
88
    public boolean canEditCell(TableRendererModel original, Object node, String columnID)
89
            throws UnknownTypeException;
90
91
    /**
92
     * Get the editor of the given cell
93
     * @param original The original table cell renderer implementation
94
     * @param node Tree node representing the row
95
     * @param columnID The column name
96
     * @return The cell editor
97
     * @throws UnknownTypeException If the implementation can not edit the given cell.
98
     */
99
    public TableCellEditor getCellEditor(TableRendererModel original, Object node, String columnID)
100
            throws UnknownTypeException;
101
102
    /**
103
     * Registers given listener.
104
     *
105
     * @param l the listener to add
106
     */
107
    public abstract void addModelListener (ModelListener l);
108
109
    /**
110
     * Unregisters given listener.
111
     *
112
     * @param l the listener to remove
113
     */
114
    public abstract void removeModelListener (ModelListener l);
115
}

Return to bug 186672