diff --git a/spi.viewmodel/apichanges.xml b/spi.viewmodel/apichanges.xml --- a/spi.viewmodel/apichanges.xml +++ b/spi.viewmodel/apichanges.xml @@ -351,6 +351,21 @@ + + + Drag and Drop support. + + + + + + This API introduce DnDNodeModel and DnDNodeModelFilter that + can be used by clients to implement Drag and Drop. + + + + + diff --git a/spi.viewmodel/manifest.mf b/spi.viewmodel/manifest.mf --- a/spi.viewmodel/manifest.mf +++ b/spi.viewmodel/manifest.mf @@ -1,5 +1,5 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.spi.viewmodel/2 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/viewmodel/Bundle.properties -OpenIDE-Module-Specification-Version: 1.23 +OpenIDE-Module-Specification-Version: 1.24 diff --git a/spi.viewmodel/src/org/netbeans/modules/viewmodel/OutlineTable.java b/spi.viewmodel/src/org/netbeans/modules/viewmodel/OutlineTable.java --- a/spi.viewmodel/src/org/netbeans/modules/viewmodel/OutlineTable.java +++ b/spi.viewmodel/src/org/netbeans/modules/viewmodel/OutlineTable.java @@ -43,9 +43,13 @@ import java.awt.BorderLayout; import java.awt.Rectangle; +import java.awt.datatransfer.Transferable; +import java.awt.dnd.DnDConstants; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; @@ -71,6 +75,7 @@ import org.netbeans.spi.viewmodel.Models; import org.netbeans.spi.viewmodel.ColumnModel; +import org.netbeans.spi.viewmodel.DnDNodeModel; import org.netbeans.swing.etable.ETableColumn; import org.netbeans.swing.etable.ETableColumnModel; import org.netbeans.swing.outline.DefaultOutlineModel; @@ -353,6 +358,10 @@ // The root node must be ready when setting the columns treeTable.setProperties (columnsToSet); updateTableColumns(columnsToSet); + treeTable.setAllowedDragActions(model.getAllowedDragActions()); + treeTable.setAllowedDropActions(model.getAllowedDropActions(null)); + treeTable.setDynamicDropActions(model); + //treeTable.getTable().tableChanged(new TableModelEvent(treeTable.getOutline().getModel())); //getExplorerManager ().setRootContext (rootNode); @@ -855,6 +864,9 @@ } private static class MyTreeTable extends OutlineView { + + private Reference dndModelRef = new WeakReference(null); + MyTreeTable () { super (); Outline outline = getOutline(); @@ -942,6 +954,21 @@ return null; } } + + void setDynamicDropActions(DnDNodeModel model) { + dndModelRef = new WeakReference(model); + } + + @Override + protected int getAllowedDropActions(Transferable t) { + DnDNodeModel model = dndModelRef.get(); + if (model != null) { + return model.getAllowedDropActions(t); + } else { + return super.getAllowedDropActions(); + } + } + } private static final class F8FilterComponentInputMap extends ComponentInputMap { diff --git a/spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java b/spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java --- a/spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java +++ b/spi.viewmodel/src/org/netbeans/modules/viewmodel/TreeModelNode.java @@ -764,7 +764,7 @@ } } - /* + @Override public Transferable drag() throws IOException { Transferable t; try { @@ -779,7 +779,6 @@ return t; } } - */ @Override public void createPasteTypes(Transferable t, List l) { @@ -797,7 +796,7 @@ } } - /* + @Override public PasteType getDropType(Transferable t, int action, int index) { PasteType p; try { @@ -812,7 +811,6 @@ return p; } } - */ private final void expandIfSetToExpanded() { try { diff --git a/spi.viewmodel/src/org/netbeans/spi/viewmodel/Models.java b/spi.viewmodel/src/org/netbeans/spi/viewmodel/Models.java --- a/spi.viewmodel/src/org/netbeans/spi/viewmodel/Models.java +++ b/spi.viewmodel/src/org/netbeans/spi/viewmodel/Models.java @@ -42,6 +42,7 @@ package org.netbeans.spi.viewmodel; import java.awt.datatransfer.Transferable; +import java.awt.dnd.DnDConstants; import java.awt.event.ActionEvent; import java.io.IOException; import java.lang.ref.Reference; @@ -101,6 +102,8 @@ public static int MULTISELECTION_TYPE_EXACTLY_ONE = 1; public static int MULTISELECTION_TYPE_ALL = 2; public static int MULTISELECTION_TYPE_ANY = 3; + + private static final int DEFAULT_DRAG_DROP_ALLOWED_ACTIONS = DnDConstants.ACTION_NONE; private static boolean verbose = System.getProperty ("netbeans.debugger.models") != null; @@ -470,11 +473,11 @@ * * @returns compund tree model */ - private static ExtendedNodeModel createCompoundNodeModel ( - ExtendedNodeModel originalNodeModel, + private static SuperNodeModel createCompoundNodeModel ( + SuperNodeModel originalNodeModel, List treeNodeModelFilters ) { - ExtendedNodeModel nm = originalNodeModel; + SuperNodeModel nm = originalNodeModel; int i, k = treeNodeModelFilters.size (); for (i = 0; i < k; i++) nm = new CompoundNodeModel ( @@ -843,13 +846,14 @@ * * @author Jan Jancura */ - private final static class CompoundNodeModel implements ExtendedNodeModel, CheckNodeModel, ModelListener { + private final static class CompoundNodeModel implements SuperNodeModel, + ModelListener { - private ExtendedNodeModel model; + private SuperNodeModel model; private NodeModelFilter filter; - private CheckNodeModel cmodel; private CheckNodeModelFilter cfilter; + private DnDNodeModelFilter dndfilter; private final Collection modelListeners = new HashSet(); @@ -858,14 +862,14 @@ * Creates {@link org.netbeans.spi.viewmodel.TreeModel} for given TreeModel and * {@link org.netbeans.spi.viewmodel.TreeModelFilter}. */ - CompoundNodeModel (ExtendedNodeModel model, NodeModelFilter filter) { + CompoundNodeModel (SuperNodeModel model, NodeModelFilter filter) { this.model = model; this.filter = filter; - if (model instanceof CheckNodeModel) { - this.cmodel = (CheckNodeModel) model; - } if (filter instanceof CheckNodeModelFilter) { this.cfilter = (CheckNodeModelFilter) filter; + } + if (filter instanceof DnDNodeModelFilter) { + this.dndfilter = (DnDNodeModelFilter) filter; } } @@ -1015,14 +1019,30 @@ } } - /*public Transferable drag(Object node) throws IOException, + public int getAllowedDragActions() { + if (dndfilter != null) { + return dndfilter.getAllowedDragActions(model); + } else { + return model.getAllowedDragActions(); + } + } + + public int getAllowedDropActions(Transferable t) { + if (dndfilter != null) { + return dndfilter.getAllowedDropActions(model, t); + } else { + return model.getAllowedDropActions(t); + } + } + + public Transferable drag(Object node) throws IOException, UnknownTypeException { - if (filter instanceof ExtendedNodeModelFilter) { - return ((ExtendedNodeModelFilter) filter).drag(model, node); + if (dndfilter != null) { + return dndfilter.drag(model, node); } else { return model.drag(node); } - }*/ + } public PasteType[] getPasteTypes(Object node, Transferable t) throws UnknownTypeException { if (filter instanceof ExtendedNodeModelFilter) { @@ -1032,14 +1052,14 @@ } } - /*public PasteType getDropType(Object node, Transferable t, int action, + public PasteType getDropType(Object node, Transferable t, int action, int index) throws UnknownTypeException { - if (filter instanceof ExtendedNodeModelFilter) { - return ((ExtendedNodeModelFilter) filter).getDropType(model, node, t, action, index); + if (dndfilter != null) { + return dndfilter.getDropType(model, node, t, action, index); } else { return model.getDropType(node, t, action, index); } - }*/ + } public void setName(Object node, String name) throws UnknownTypeException { if (filter instanceof ExtendedNodeModelFilter) { @@ -1076,40 +1096,32 @@ public boolean isCheckable(Object node) throws UnknownTypeException { if (cfilter != null) { return cfilter.isCheckable(model, node); - } else if (cmodel != null) { - return cmodel.isCheckable(node); } else { - return false; + return model.isCheckable(node); } } public boolean isCheckEnabled(Object node) throws UnknownTypeException { if (cfilter != null) { return cfilter.isCheckEnabled(model, node); - } else if (cmodel != null) { - return cmodel.isCheckEnabled(node); } else { - return true; + return model.isCheckEnabled(node); } } public Boolean isSelected(Object node) throws UnknownTypeException { if (cfilter != null) { return cfilter.isSelected(model, node); - } else if (cmodel != null) { - return cmodel.isSelected(node); } else { - return false; + return model.isSelected(node); } } public void setSelected(Object node, Boolean selected) throws UnknownTypeException { if (cfilter != null) { cfilter.setSelected(model, node, selected); - } else if (cmodel != null) { - cmodel.setSelected(node, selected); } else { - Exceptions.printStackTrace(new IllegalStateException("Can not set selected state to model "+this)); + model.setSelected(node, selected); } } @@ -2023,7 +2035,7 @@ * * @author Jan Jancura */ - private static final class DelegatingNodeModel implements ExtendedNodeModel, CheckNodeModel { + private static final class DelegatingNodeModel implements SuperNodeModel { private NodeModel[] models; private HashMap classNameToModel = new HashMap(); @@ -2233,22 +2245,18 @@ return null; } - /* private Transferable defaultDrag() throws IOException { return null; } - */ private PasteType[] defaultGetPasteTypes(Transferable t) { return null; } - /* private PasteType defaultGetDropType(Transferable t, int action, int index) { return null; } - */ private void defaultSetName(String name) { // nothing @@ -2456,7 +2464,26 @@ } } - /* + public int getAllowedDragActions() { + int i, k = models.length; + for (i = 0; i < k; i++) { + if (models[i] instanceof DnDNodeModel) { + return ((DnDNodeModel) models[i]).getAllowedDragActions(); + } + } + return DEFAULT_DRAG_DROP_ALLOWED_ACTIONS; + } + + public int getAllowedDropActions(Transferable t) { + int i, k = models.length; + for (i = 0; i < k; i++) { + if (models[i] instanceof DnDNodeModel) { + return ((DnDNodeModel) models[i]).getAllowedDropActions(t); + } + } + return DEFAULT_DRAG_DROP_ALLOWED_ACTIONS; + } + public Transferable drag(Object node) throws IOException, UnknownTypeException { UnknownTypeException uex = null; @@ -2464,9 +2491,9 @@ node.getClass ().getName () ); if (model != null) { - if (model instanceof ExtendedNodeModel) { + if (model instanceof DnDNodeModel) { try { - return ((ExtendedNodeModel) model).drag (node); + return ((DnDNodeModel) model).drag (node); } catch (UnknownTypeException e) { uex = e; } @@ -2477,9 +2504,9 @@ int i, k = models.length; boolean isExtended = false; for (i = 0; i < k; i++) { - if (models[i] instanceof ExtendedNodeModel) { + if (models[i] instanceof DnDNodeModel) { try { - Transferable t = ((ExtendedNodeModel) models [i]).drag (node); + Transferable t = ((DnDNodeModel) models [i]).drag (node); classNameToModel.put (node.getClass ().getName (), models [i]); return t; } catch (UnknownTypeException e) { @@ -2497,7 +2524,6 @@ throw new UnknownTypeException (node); } } - */ public PasteType[] getPasteTypes(Object node, Transferable t) throws UnknownTypeException { UnknownTypeException uex = null; @@ -2539,7 +2565,6 @@ } } - /* public PasteType getDropType(Object node, Transferable t, int action, int index) throws UnknownTypeException { UnknownTypeException uex = null; @@ -2547,9 +2572,9 @@ node.getClass ().getName () ); if (model != null) { - if (model instanceof ExtendedNodeModel) { + if (model instanceof DnDNodeModel) { try { - return ((ExtendedNodeModel) model).getDropType (node, t, action, index); + return ((DnDNodeModel) model).getDropType (node, t, action, index); } catch (UnknownTypeException e) { uex = e; } @@ -2560,9 +2585,9 @@ int i, k = models.length; boolean isExtended = false; for (i = 0; i < k; i++) { - if (models[i] instanceof ExtendedNodeModel) { + if (models[i] instanceof DnDNodeModel) { try { - PasteType p = ((ExtendedNodeModel) models [i]).getDropType (node, t, action, index); + PasteType p = ((DnDNodeModel) models [i]).getDropType (node, t, action, index); classNameToModel.put (node.getClass ().getName (), models [i]); return p; } catch (UnknownTypeException e) { @@ -2580,7 +2605,6 @@ throw new UnknownTypeException (node); } } - */ public void setName(Object node, String name) throws UnknownTypeException { UnknownTypeException uex = null; @@ -3213,11 +3237,12 @@ * @author Jan Jancura */ public static final class CompoundModel implements TreeModel, - ExtendedNodeModel, CheckNodeModel, NodeActionsProvider, TableModel, TreeExpansionModel { + ExtendedNodeModel, CheckNodeModel, DnDNodeModel, NodeActionsProvider, TableModel, TreeExpansionModel { private TreeModel treeModel; private ExtendedNodeModel nodeModel; private CheckNodeModel cnodeModel; + private DnDNodeModel dndNodeModel; private NodeActionsProvider nodeActionsProvider; private ColumnModel[] columnModels; private TableModel tableModel; @@ -3265,6 +3290,9 @@ this.nodeModel = nodeModel; if (nodeModel instanceof CheckNodeModel) { this.cnodeModel = (CheckNodeModel) nodeModel; + } + if (nodeModel instanceof DnDNodeModel) { + this.dndNodeModel = (DnDNodeModel) nodeModel; } this.tableModel = tableModel; this.nodeActionsProvider = nodeActionsProvider; @@ -3635,23 +3663,43 @@ return nodeModel.clipboardCut(node); } - /* + public int getAllowedDragActions() { + if (dndNodeModel != null) { + return dndNodeModel.getAllowedDragActions(); + } else { + return DEFAULT_DRAG_DROP_ALLOWED_ACTIONS; + } + } + + public int getAllowedDropActions(Transferable t) { + if (dndNodeModel != null) { + return dndNodeModel.getAllowedDropActions(t); + } else { + return DEFAULT_DRAG_DROP_ALLOWED_ACTIONS; + } + } + public Transferable drag(Object node) throws IOException, UnknownTypeException { - return nodeModel.drag(node); + if (dndNodeModel != null) { + return dndNodeModel.drag(node); + } else { + return null; + } } - */ public PasteType[] getPasteTypes(Object node, Transferable t) throws UnknownTypeException { return nodeModel.getPasteTypes(node, t); } - /* public PasteType getDropType(Object node, Transferable t, int action, int index) throws UnknownTypeException { - return nodeModel.getDropType(node, t, action, index); + if (dndNodeModel != null) { + return dndNodeModel.getDropType(node, t, action, index); + } else { + return null; + } } - */ public void setName(Object node, String name) throws UnknownTypeException { nodeModel.setName(node, name);