diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreCommands.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreCommands.java index 29ad06376c517f01e35748269a00cedeecb5d522..c8a8fa3b4936264a55a9223f07e88f3ba29e8d51 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreCommands.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/CoreCommands.java @@ -70,4 +70,6 @@ public interface CoreCommands String CMD_LINK_EDITOR = "org.jkiss.dbeaver.core.navigator.linkeditor"; String CMD_SYNC_CONNECTION = "org.jkiss.dbeaver.ui.editors.sql.sync.connection"; + String CMD_SQL_RENAME = "org.jkiss.dbeaver.ui.editors.sql.rename"; + } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/e4/DBeaverStackRenderer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/e4/DBeaverStackRenderer.java index 7f05f0492b0684a1a51c25e9b42a242b6dd4d086..d485d1e9fd968845b2bb1570841d394157859e5f 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/e4/DBeaverStackRenderer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/e4/DBeaverStackRenderer.java @@ -1,10 +1,26 @@ package org.jkiss.dbeaver.ui.e4; +import org.eclipse.core.resources.IFile; import org.eclipse.e4.ui.model.application.ui.basic.MPart; import org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer; import org.eclipse.swt.SWT; +import org.eclipse.swt.dnd.TextTransfer; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.internal.e4.compatibility.CompatibilityPart; +import org.jkiss.dbeaver.core.CoreCommands; +import org.jkiss.dbeaver.ui.ActionUtils; +import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.dbeaver.ui.editors.EditorUtils; +import org.jkiss.dbeaver.ui.editors.sql.SQLEditor; +import org.jkiss.dbeaver.ui.editors.sql.handlers.RenameHandler; + +import java.io.File; public class DBeaverStackRenderer extends StackRenderer { @@ -12,7 +28,70 @@ public class DBeaverStackRenderer extends StackRenderer { protected void populateTabMenu(Menu menu, MPart part) { super.populateTabMenu(menu, part); + IWorkbenchPart workbenchPart = getWorkbenchPart(part); + if (workbenchPart instanceof IEditorPart) { + IFile inputFile = EditorUtils.getFileFromInput(((IEditorPart) workbenchPart).getEditorInput()); + if (inputFile != null) { + File localFile = inputFile.getLocation().toFile(); + if (localFile != null) { + populateFileMenu(menu, workbenchPart, inputFile, localFile); + } + } + } + } + + private void populateFileMenu(final Menu menu, final IWorkbenchPart workbenchPart, final IFile inputFile, final File file) { new MenuItem(menu, SWT.SEPARATOR); + + { + MenuItem menuItemOpenFolder = new MenuItem(menu, SWT.NONE); + menuItemOpenFolder.setText("Open file folder in explorer"); + menuItemOpenFolder.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if (file.getParentFile().isDirectory()) { + UIUtils.launchProgram(file.getParentFile().getAbsolutePath()); + } + } + }); + } + { + MenuItem menuItemOthers = new MenuItem(menu, SWT.NONE); + menuItemOthers.setText("Copy file path to clipboard"); + menuItemOthers.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + String filePath = file.getAbsolutePath(); + UIUtils.setClipboardContents(Display.getCurrent(), TextTransfer.getInstance(), filePath); + } + }); + } + + { + MenuItem menuItemOthers = new MenuItem(menu, SWT.NONE); + String renameText = "Rename file"; + if (workbenchPart instanceof SQLEditor) { + renameText += "\t" + ActionUtils.findCommandDescription(CoreCommands.CMD_SQL_RENAME, workbenchPart.getSite(), true); + } + menuItemOthers.setText(renameText); + menuItemOthers.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + RenameHandler.renameFile(workbenchPart, inputFile, "file"); + } + }); + } + + } + + private IWorkbenchPart getWorkbenchPart(MPart part) { + if (part != null) { + Object clientObject = part.getObject(); + if (clientObject instanceof CompatibilityPart) { + return ((CompatibilityPart) clientObject).getPart(); + } + } + return null; } } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/handlers/RenameHandler.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/handlers/RenameHandler.java index ff35f8b66ed8ed49dfd5c7b1d06f954254ed6ddc..7e7bcf2b222161d0af3e601f319cbbc1652f80ab 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/handlers/RenameHandler.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/handlers/RenameHandler.java @@ -23,33 +23,40 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.handlers.HandlerUtil; import org.jkiss.dbeaver.runtime.ui.DBUserInterface; import org.jkiss.dbeaver.ui.actions.AbstractDataSourceHandler; import org.jkiss.dbeaver.ui.dialogs.EnterNameDialog; import org.jkiss.dbeaver.ui.editors.EditorUtils; -import org.jkiss.dbeaver.ui.editors.sql.SQLEditor; import org.jkiss.dbeaver.utils.RuntimeUtils; public class RenameHandler extends AbstractDataSourceHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { - SQLEditor editor = RuntimeUtils.getObjectAdapter(HandlerUtil.getActivePart(event), SQLEditor.class); + IEditorPart editor = RuntimeUtils.getObjectAdapter(HandlerUtil.getActivePart(event), IEditorPart.class); if (editor == null) { log.error("No active SQL editor"); return null; } - Shell shell = HandlerUtil.getActiveShell(event); IFile file = EditorUtils.getFileFromInput(editor.getEditorInput()); if (file == null) { DBUserInterface.getInstance().showError("Rename", "Can't rename - no source file"); return null; } - String newName = EnterNameDialog.chooseName(shell, "Rename SQL script [" + file.getName() + "]", file.getName()); + renameFile(editor, file, "SQL script"); + //file.set + return null; + } + + public static void renameFile(IWorkbenchPart editor, IFile file, String fileTitle) { + Shell shell = editor.getSite().getShell(); + String newName = EnterNameDialog.chooseName(shell, "Rename " + fileTitle + " [" + file.getName() + "]", file.getName()); if (newName == null) { - return null; + return; } if (newName.indexOf('.') == -1) { int divPos = file.getName().lastIndexOf('.'); @@ -60,15 +67,15 @@ public class RenameHandler extends AbstractDataSourceHandler { if (!newName.equals(file.getName())) { NullProgressMonitor monitor = new NullProgressMonitor(); - editor.doSave(monitor); + if (editor instanceof IEditorPart) { + ((IEditorPart)editor).doSave(monitor); + } try { file.move(file.getParent().getFullPath().append(newName), true, monitor); } catch (CoreException e) { DBUserInterface.getInstance().showError("Rename", "Error renaming file '" + file.getName() + "'", e); } } - //file.set - return null; }