提交 0af59dd7 编写于 作者: S serge-rider

#5373 Local folders move enhancements. Navigator drag-n-drop additions.


Former-commit-id: 07ccaefd
上级 b7d002fb
......@@ -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)) {
......
......@@ -29,7 +29,11 @@ public interface DBPDataSourceFolder extends DBPNamedObject2 {
DBPDataSourceFolder getParent();
void setParent(DBPDataSourceFolder parent);
DBPDataSourceFolder[] getChildren();
DBPDataSourceRegistry getDataSourceRegistry();
boolean canMoveTo(DBPDataSourceFolder folder);
}
......@@ -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);
......
......@@ -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<DBNNode> nodes) throws DBException
{
public void dropNodes(Collection<DBNNode> 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();
}
}
......@@ -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<DBNNode> nodesToDrop = (Collection<DBNNode>) event.data;
if (curObject instanceof DBNNode) {
@SuppressWarnings("unchecked")
Collection<DBNNode> nodesToDrop = (Collection<DBNNode>) 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<DBNNode> 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);
}
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册