diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/ClipboardData.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/ClipboardData.java new file mode 100644 index 0000000000000000000000000000000000000000..7aea31b7698e96826bbafeb84b0d07376b8e5834 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/ClipboardData.java @@ -0,0 +1,64 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License (version 2) + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jkiss.dbeaver.ui; + +import org.eclipse.swt.dnd.Clipboard; +import org.eclipse.swt.dnd.Transfer; +import org.eclipse.swt.widgets.Display; + +import java.util.IdentityHashMap; +import java.util.Map; + +/** + * Clipboard data + */ +public class ClipboardData +{ + private final Map formats = new IdentityHashMap<>(); + + public ClipboardData() { + + } + + public boolean hasData() { + return !formats.isEmpty(); + } + + public void addTransfer(Transfer transfer, Object data) { + formats.put(transfer, data); + } + + public boolean hasTransfer(Transfer transfer) { + return formats.containsKey(transfer); + } + + public void pushToClipboard(Display display) { + final int size = formats.size(); + final Transfer[] transfers = formats.keySet().toArray(new Transfer[size]); + final Object[] objects = formats.values().toArray(new Object[size]); + + Clipboard clipboard = new Clipboard(display); + try { + clipboard.setContents(objects, transfers); + } finally { + clipboard.dispose(); + } + } + +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/IClipboardSource.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/IClipboardSource.java new file mode 100644 index 0000000000000000000000000000000000000000..7abf3a4577b3ee094749a27c58f654bd19d3efa5 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/IClipboardSource.java @@ -0,0 +1,28 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License (version 2) + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jkiss.dbeaver.ui; + +/** + * IClipboardSource + */ +public interface IClipboardSource { + + void addClipboardData(ClipboardData clipboardData); + +} diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerCopyAbstract.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerCopyAbstract.java index 8e5388feec0cca4b5b58d7ee4a384d7fe795be85..2502117b1778c5d6abc6d0c670cf7b478389b000 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerCopyAbstract.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/navigator/NavigatorHandlerCopyAbstract.java @@ -23,10 +23,9 @@ import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.TextTransfer; -import org.eclipse.swt.dnd.Transfer; +import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.commands.IElementUpdater; import org.eclipse.ui.handlers.HandlerUtil; @@ -36,6 +35,8 @@ import org.jkiss.dbeaver.model.DBPNamedObject; import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.navigator.DBNResource; +import org.jkiss.dbeaver.ui.ClipboardData; +import org.jkiss.dbeaver.ui.IClipboardSource; import org.jkiss.dbeaver.ui.actions.ObjectPropertyTester; import org.jkiss.dbeaver.ui.dnd.DatabaseObjectTransfer; import org.jkiss.dbeaver.ui.dnd.TreeNodeTransfer; @@ -57,77 +58,84 @@ public abstract class NavigatorHandlerCopyAbstract extends AbstractHandler imple public Object execute(ExecutionEvent event) throws ExecutionException { final ISelection selection = HandlerUtil.getCurrentSelection(event); final IWorkbenchWindow workbenchWindow = HandlerUtil.getActiveWorkbenchWindow(event); - if (selection instanceof IStructuredSelection) { - final IStructuredSelection structSelection = (IStructuredSelection)selection; + final IWorkbenchPart activePart = HandlerUtil.getActivePart(event); - DBeaverUI.syncExec(new Runnable() { - @Override - public void run() { - List selectedNodes = new ArrayList<>(); - List selectedObjects = new ArrayList<>(); - List selectedFiles = new ArrayList<>(); - StringBuilder buf = new StringBuilder(); - for (Iterator iter = structSelection.iterator(); iter.hasNext(); ) { - Object object = iter.next(); - String objectValue = getObjectDisplayString(object); - if (objectValue == null) { - continue; - } - DBNNode node = RuntimeUtils.getObjectAdapter(object, DBNNode.class); - DBPNamedObject dbObject = null; - if (node instanceof DBNDatabaseNode) { - dbObject = ((DBNDatabaseNode) node).getObject(); - } - if (dbObject == null) { - dbObject = RuntimeUtils.getObjectAdapter(object, DBPNamedObject.class); - } - if (node != null) { - selectedNodes.add(node); - } - if (node instanceof DBNResource && ((DBNResource) node).getResource() instanceof IFile) { - final IFile file = (IFile) ((DBNResource) node).getResource(); - selectedFiles.add(file.getLocation().makeAbsolute().toFile().getAbsolutePath()); - } - if (dbObject != null) { - selectedObjects.add(dbObject); - } - if (buf.length() > 0) { - buf.append(GeneralUtils.getDefaultLineSeparator()); - } - buf.append(objectValue); - } - { - List dataList = new ArrayList<>(); - List dataTypeList = new ArrayList<>(); - if (buf.length() > 0) { - dataList.add(buf.toString()); - dataTypeList.add(TextTransfer.getInstance()); - } - if (!selectedNodes.isEmpty()) { - dataList.add(selectedNodes); - dataTypeList.add(TreeNodeTransfer.getInstance()); - } - if (!selectedObjects.isEmpty()) { - dataList.add(selectedObjects); - dataTypeList.add(DatabaseObjectTransfer.getInstance()); - } - if (!selectedFiles.isEmpty()) { - dataList.add(selectedFiles.toArray(new String[selectedFiles.size()])); - dataTypeList.add(FileTransfer.getInstance()); - } - if (!dataList.isEmpty()) { - Clipboard clipboard = new Clipboard(workbenchWindow.getShell().getDisplay()); - clipboard.setContents( - dataList.toArray(), - dataTypeList.toArray(new Transfer[dataTypeList.size()])); - clipboard.dispose(); - ObjectPropertyTester.firePropertyChange(ObjectPropertyTester.PROP_CAN_PASTE); - } + DBeaverUI.syncExec(new Runnable() { + @Override + public void run() { + copySelection(workbenchWindow, activePart, selection); + } + }); + + return null; + } + + private void copySelection(IWorkbenchWindow workbenchWindow, IWorkbenchPart activePart, ISelection selection) { + ClipboardData clipboardData = new ClipboardData(); + + { + IClipboardSource clipboardSource = activePart.getAdapter(IClipboardSource.class); + if (clipboardSource != null) { + clipboardSource.addClipboardData(clipboardData); + } + } + + if (selection instanceof IStructuredSelection && !selection.isEmpty()) { + final IStructuredSelection structSelection = (IStructuredSelection)selection; + List selectedNodes = new ArrayList<>(); + List selectedObjects = new ArrayList<>(); + List selectedFiles = new ArrayList<>(); + StringBuilder buf = new StringBuilder(); + for (Iterator iter = structSelection.iterator(); iter.hasNext(); ) { + Object object = iter.next(); + String objectValue = getObjectDisplayString(object); + if (objectValue == null) { + continue; + } + DBNNode node = RuntimeUtils.getObjectAdapter(object, DBNNode.class); + DBPNamedObject dbObject = null; + if (node instanceof DBNDatabaseNode) { + dbObject = ((DBNDatabaseNode) node).getObject(); + } + if (dbObject == null) { + dbObject = RuntimeUtils.getObjectAdapter(object, DBPNamedObject.class); + } + if (node != null) { + selectedNodes.add(node); + } + if (node instanceof DBNResource && ((DBNResource) node).getResource() instanceof IFile) { + final IFile file = (IFile) ((DBNResource) node).getResource(); + if (file != null) { + selectedFiles.add(file.getLocation().makeAbsolute().toFile().getAbsolutePath()); } } - }); + if (dbObject != null) { + selectedObjects.add(dbObject); + } + if (buf.length() > 0) { + buf.append(GeneralUtils.getDefaultLineSeparator()); + } + buf.append(objectValue); + } + { + if (buf.length() > 0 && !clipboardData.hasTransfer(TextTransfer.getInstance())) { + clipboardData.addTransfer(TextTransfer.getInstance(), buf.toString()); + } + if (!selectedNodes.isEmpty() && !clipboardData.hasTransfer(TreeNodeTransfer.getInstance())) { + clipboardData.addTransfer(TreeNodeTransfer.getInstance(), selectedNodes); + } + if (!selectedObjects.isEmpty() && !clipboardData.hasTransfer(DatabaseObjectTransfer.getInstance())) { + clipboardData.addTransfer(DatabaseObjectTransfer.getInstance(), selectedObjects); + } + if (!selectedFiles.isEmpty() && !clipboardData.hasTransfer(FileTransfer.getInstance())) { + clipboardData.addTransfer(FileTransfer.getInstance(), selectedFiles.toArray(new String[selectedFiles.size()])); + } + } + } + if (clipboardData.hasData()) { + clipboardData.pushToClipboard(workbenchWindow.getShell().getDisplay()); + ObjectPropertyTester.firePropertyChange(ObjectPropertyTester.PROP_CAN_PASTE); } - return null; } protected abstract String getObjectDisplayString(Object object); @@ -135,23 +143,10 @@ public abstract class NavigatorHandlerCopyAbstract extends AbstractHandler imple protected abstract String getSelectionTitle(IStructuredSelection selection); @Override - public void updateElement(UIElement element, Map parameters) - { + public void updateElement(UIElement element, Map parameters) { if (!NavigatorHandlerObjectBase.updateUI) { return; } -/* - final ISelectionProvider selectionProvider = UIUtils.getSelectionProvider(element.getServiceLocator()); - if (selectionProvider != null) { - ISelection selection = selectionProvider.getSelection(); - if (selection instanceof IStructuredSelection) { - String label = getSelectionTitle((IStructuredSelection)selection); - if (label != null) { - element.setText(label); - } - } - } -*/ } } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectListControl.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectListControl.java index 07cea05a129dabd3c3626b4b9d1136252afb390f..4a5a24ffcf6e9bd4a5097b5ac8115f6426e8f788 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectListControl.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectListControl.java @@ -45,9 +45,7 @@ import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor; import org.jkiss.dbeaver.model.runtime.AbstractJob; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.runtime.properties.*; -import org.jkiss.dbeaver.ui.DBeaverIcons; -import org.jkiss.dbeaver.ui.LoadingJob; -import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.dbeaver.ui.*; import org.jkiss.dbeaver.ui.controls.ViewerColumnController; import org.jkiss.dbeaver.ui.controls.ObjectViewerRenderer; import org.jkiss.dbeaver.ui.controls.ProgressPageControl; @@ -62,7 +60,7 @@ import java.util.List; /** * ObjectListControl */ -public abstract class ObjectListControl extends ProgressPageControl { +public abstract class ObjectListControl extends ProgressPageControl implements IClipboardSource { private static final Log log = Log.getLog(ObjectListControl.class); private final static LazyValue DEF_LAZY_VALUE = new LazyValue("..."); //$NON-NLS-1$ @@ -784,6 +782,14 @@ public abstract class ObjectListControl extends ProgressPageControl this.focusColumn = objectColumn; } + ////////////////////////////////////////////////////// + // Clipboard + + @Override + public void addClipboardData(ClipboardData clipboardData) { + // Cope selected cells + } + ////////////////////////////////////////////////////// // Editor activation