From 0af59dd76d7f55b765d8a9d14894b4d70a0b5344 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Sun, 3 Mar 2019 01:08:39 +0300 Subject: [PATCH] #5373 Local folders move enhancements. Navigator drag-n-drop additions. Former-commit-id: 07ccaefde5c2e479550ab7d3503a4037364cbfeb --- .../dbeaver/registry/DataSourceFolder.java | 18 +++++- .../dbeaver/model/DBPDataSourceFolder.java | 4 ++ .../model/navigator/DBNDataSource.java | 5 +- .../model/navigator/DBNLocalFolder.java | 13 ++++- .../dbeaver/ui/navigator/NavigatorUtils.java | 57 +++++++++++++++---- 5 files changed, 79 insertions(+), 18 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DataSourceFolder.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DataSourceFolder.java index b14983a95b..034e204908 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DataSourceFolder.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DataSourceFolder.java @@ -67,11 +67,11 @@ public class DataSourceFolder implements DBPDataSourceFolder return parent; } - public void setParent(DataSourceFolder parent) { + public void setParent(DBPDataSourceFolder parent) { if (this.parent != null) { this.parent.children.remove(this); } - this.parent = parent; + this.parent = (DataSourceFolder) parent; if (this.parent != null) { this.parent.children.add(this); } @@ -87,6 +87,20 @@ public class DataSourceFolder implements DBPDataSourceFolder return registry; } + @Override + public boolean canMoveTo(DBPDataSourceFolder folder) { + return folder != this && !this.isParentOf(folder); + } + + private boolean isParentOf(DBPDataSourceFolder folder) { + for (DBPDataSourceFolder p = folder; p != null; p = p.getParent()) { + if (p == this) { + return true; + } + } + return false; + } + public DataSourceFolder getChild(String name) { for (DataSourceFolder child : children) { if (child.getName().equals(name)) { diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPDataSourceFolder.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPDataSourceFolder.java index 75c4da9359..0657f1524e 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPDataSourceFolder.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBPDataSourceFolder.java @@ -29,7 +29,11 @@ public interface DBPDataSourceFolder extends DBPNamedObject2 { DBPDataSourceFolder getParent(); + void setParent(DBPDataSourceFolder parent); + DBPDataSourceFolder[] getChildren(); DBPDataSourceRegistry getDataSourceRegistry(); + + boolean canMoveTo(DBPDataSourceFolder folder); } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDataSource.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDataSource.java index 24f3b8c5ed..5c960ecf7b 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDataSource.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDataSource.java @@ -232,7 +232,8 @@ public class DBNDataSource extends DBNDatabaseNode implements DBNContainer, IAda @Override public boolean supportsDrop(DBNNode otherNode) { - return otherNode == null || otherNode instanceof DBNDataSource; + return otherNode == null || otherNode instanceof DBNDataSource || + (otherNode instanceof DBNLocalFolder && ((DBNLocalFolder) otherNode).getFolder().canMoveTo(dataSource.getFolder())); } @Override @@ -244,6 +245,8 @@ public class DBNDataSource extends DBNDatabaseNode implements DBNContainer, IAda if (!((DBNDataSource) node).setFolder(folder)) { return; } + } else if (node instanceof DBNLocalFolder) { + ((DBNLocalFolder) node).getFolder().setParent(dataSource.getFolder()); } } DBNModel.updateConfigAndRefreshDatabases(this); diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNLocalFolder.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNLocalFolder.java index d119f80611..d85d0dc908 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNLocalFolder.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNLocalFolder.java @@ -53,6 +53,10 @@ public class DBNLocalFolder extends DBNNode implements DBNContainer return folder; } + public void setFolder(DBPDataSourceFolder folder) { + this.folder = folder; + } + public DBPDataSourceRegistry getDataSourceRegistry() { return ((DBNProjectDatabases)parentNode).getDataSourceRegistry(); } @@ -199,15 +203,17 @@ public class DBNLocalFolder extends DBNNode implements DBNContainer @Override public boolean supportsDrop(DBNNode otherNode) { - return otherNode == null || otherNode instanceof DBNDataSource; + return otherNode == null || otherNode instanceof DBNDataSource || + (otherNode instanceof DBNLocalFolder && ((DBNLocalFolder) otherNode).getFolder().canMoveTo(getFolder())); } @Override - public void dropNodes(Collection nodes) throws DBException - { + public void dropNodes(Collection nodes) throws DBException { for (DBNNode node : nodes) { if (node instanceof DBNDataSource) { ((DBNDataSource) node).setFolder(folder); + } else if (node instanceof DBNLocalFolder) { + ((DBNLocalFolder) node).getFolder().setParent(this.getFolder()); } } DBNModel.updateConfigAndRefreshDatabases(this); @@ -244,4 +250,5 @@ public class DBNLocalFolder extends DBNNode implements DBNContainer public String toString() { return folder.getFolderPath(); } + } diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java index 53d034b087..987aaef47d 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java @@ -23,10 +23,7 @@ import org.eclipse.jface.viewers.*; import org.eclipse.swt.dnd.*; import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.MenuListener; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; -import org.eclipse.swt.widgets.TreeItem; +import org.eclipse.swt.widgets.*; import org.eclipse.ui.*; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.handlers.HandlerUtil; @@ -61,6 +58,7 @@ import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; import java.util.*; +import java.util.List; /** * Navigator utils @@ -386,12 +384,16 @@ public class NavigatorUtils { private boolean isDropSupported(DropTargetEvent event) { - if (TreeNodeTransfer.getInstance().isSupportedType(event.currentDataType) && event.item instanceof TreeItem) { - TreeItem treeItem = (TreeItem)event.item; - Object curObject = treeItem.getData(); + if (TreeNodeTransfer.getInstance().isSupportedType(event.currentDataType)) { + Object curObject; + if (event.item instanceof Item) { + curObject = event.item.getData(); + } else { + curObject = null; + } + @SuppressWarnings("unchecked") + Collection nodesToDrop = (Collection) event.data; if (curObject instanceof DBNNode) { - @SuppressWarnings("unchecked") - Collection nodesToDrop = (Collection) event.data; if (!CommonUtils.isEmpty(nodesToDrop)) { for (DBNNode node : nodesToDrop) { if (!((DBNNode)curObject).supportsDrop(node)) { @@ -402,6 +404,22 @@ public class NavigatorUtils { } else { return ((DBNNode)curObject).supportsDrop(null); } + } else if (curObject == null) { + // Drop to empty area + if (!CommonUtils.isEmpty(nodesToDrop)) { + for (DBNNode node : nodesToDrop) { + if (!(node instanceof DBNDataSource)) { + return false; + } + } + return true; + } else { + Widget widget = event.widget; + if (widget instanceof DropTarget) { + widget = ((DropTarget) widget).getControl(); + } + return widget == viewer.getControl(); + } } } return false; @@ -409,9 +427,13 @@ public class NavigatorUtils { private void moveNodes(DropTargetEvent event) { - if (TreeNodeTransfer.getInstance().isSupportedType(event.currentDataType) && event.item instanceof TreeItem) { - TreeItem treeItem = (TreeItem)event.item; - Object curObject = treeItem.getData(); + if (TreeNodeTransfer.getInstance().isSupportedType(event.currentDataType)) { + Object curObject; + if (event.item instanceof Item) { + curObject = event.item.getData(); + } else { + curObject = null; + } if (curObject instanceof DBNNode) { Collection nodesToDrop = TreeNodeTransfer.getInstance().getObject(); try { @@ -419,6 +441,17 @@ public class NavigatorUtils { } catch (DBException e) { DBWorkbench.getPlatformUI().showError("Drop error", "Can't drop node", e); } + } else if (curObject == null) { + for (DBNNode node : TreeNodeTransfer.getInstance().getObject()) { + if (node instanceof DBNDataSource) { + ((DBNDataSource) node).setFolder(null); + } else if (node instanceof DBNLocalFolder) { + ((DBNLocalFolder) node).getFolder().setParent(null); + } else { + continue; + } + DBNModel.updateConfigAndRefreshDatabases(node); + } } } } -- GitLab