From fc2543362190076be37843e4f7f556e2f25fe538 Mon Sep 17 00:00:00 2001 From: Marco Stornelli Date: Sat, 13 Apr 2019 13:20:09 +0200 Subject: [PATCH] Bug 546395 - Added "copy qualified name" feature Change-Id: I66b544cf7d9b05fcf1e9d5641cfd5d6060fa802c Signed-off-by: Marco Stornelli --- core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF | 2 +- .../icons/dlcl16/cpyqual_menu.png | Bin 0 -> 433 bytes .../icons/elcl16/cpyqual_menu.png | Bin 0 -> 543 bytes core/org.eclipse.cdt.ui/plugin.properties | 7 +- core/org.eclipse.cdt.ui/plugin.xml | 19 ++ .../cdt/internal/ui/CPluginImages.java | 2 + .../cdt/internal/ui/ICHelpContextIds.java | 1 + .../internal/ui/actions/ActionMessages.java | 6 + .../ui/actions/ActionMessages.properties | 7 + .../ui/actions/CopyQualifiedNameAction.java | 179 ++++++++++++++++++ .../editor/ICEditorActionDefinitionIds.java | 6 + .../cdt/ui/actions/CdtActionConstants.java | 7 + .../cdt/ui/actions/GenerateActionGroup.java | 18 +- 13 files changed, 246 insertions(+), 8 deletions(-) create mode 100644 core/org.eclipse.cdt.ui/icons/dlcl16/cpyqual_menu.png create mode 100644 core/org.eclipse.cdt.ui/icons/elcl16/cpyqual_menu.png create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/actions/CopyQualifiedNameAction.java diff --git a/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF index 30b6fc52ed8..689e852e668 100644 --- a/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.ui; singleton:=true -Bundle-Version: 6.4.200.qualifier +Bundle-Version: 6.5.0.qualifier Bundle-Activator: org.eclipse.cdt.ui.CUIPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/core/org.eclipse.cdt.ui/icons/dlcl16/cpyqual_menu.png b/core/org.eclipse.cdt.ui/icons/dlcl16/cpyqual_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..f11e70bb4b98e402c77727d0eff37c5bfc7f3090 GIT binary patch literal 433 zcmV;i0Z#sjP)HMdSWMY*< z7hhmzPQLTcfyw3b`P_ftPru)PKEu;sFu4AUfY$4^n`Jm0euy(qNN!NK-|ue^hr`{8 zz_Kig<5*%m9+UWy8I4AtV*QRi;QRi)B0!rqd~js}ZifSS%h`&}=rT-EK=H(sU}UXR{eiCKHy3CT}dj z;byau=ytob-EKKe7={eiX;8z0a=FaW)7_A&)oLBdCIqNufublF3c0RJj^mJR+f=XD zrQu~0VqU0WL7`BfMx!B7sZ@@sl5W^XIwZ!`P{RUU*D+CvQmG`RNyaZ~_zB0^3-~!Pg_~Atm3L?WW bUQzP})b{yH0k81600000NkvXXu0mjfRBFev literal 0 HcmV?d00001 diff --git a/core/org.eclipse.cdt.ui/icons/elcl16/cpyqual_menu.png b/core/org.eclipse.cdt.ui/icons/elcl16/cpyqual_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..7cb025686dd9ea989c146551dc57ea054be7b210 GIT binary patch literal 543 zcmV+)0^t3LP)W5y;bLxDt@BW#WibjxI=C2C?~beOeFSy;k8Ko-SCZ*;&M zj3IPD!^fZuedQb+%PDi-*yOor^XAEulhdK0|M5g6!|qwcq~Wh|$$0Uff{mq7RMkRO z&$fKy=jPJLel$3IiR?5Dm)q_3l>tHIjS)?)!?3ktM@+tnSa1yQ-&%gfL-#u5+g8Ym z+;03jBM2|vLcQ4m_bdwg{3>ogltHAbstm9lG$JbB#eODX?h8V%OsF0mMr^bA zcyNTxw2F;n1#3HH*j+pdYO9aFFkfz9-1SFrb&SJ(&kF{dbFN?I6xQfDSUm6OSr{e) zNGVOap#s4>jxQ;N!DN4QT9vBMvh`${) + + + + + null if no selection can be obtained or the + * editor is null. + * + * @return the selection of the action's editor, or null + */ + protected ITextSelection getCurrentSelection() { + if (fEditor != null) { + ISelectionProvider provider = fEditor.getSelectionProvider(); + if (provider != null) { + ISelection selection = provider.getSelection(); + if (selection instanceof ITextSelection) + return (ITextSelection) selection; + } + } + return null; + } + + @Override + public void run() { + ITextSelection textSelection = getCurrentSelection(); + + if (textSelection == null || !isValidSelection(textSelection)) { + return; + } + + final int offset = textSelection.getOffset(); + final int length = textSelection.getLength(); + ITranslationUnit translationUnit = (ITranslationUnit) CDTUITools + .getEditorInputCElement(fEditor.getEditorInput()); + String qualName = null; + try { + IASTTranslationUnit ast = translationUnit.getAST(null, 0); + if (ast != null) { + IASTNode enclosingNode = ast.getNodeSelector(null).findEnclosingNode(offset, length); + NameVisitor n = new NameVisitor(); + enclosingNode.accept(n); + qualName = n.getQualifiedName(); + } + } catch (CoreException e) { + CUIPlugin.log(e); + } + + final Shell shell = fEditor.getEditorSite().getShell(); + + if (qualName == null) { + MessageDialog.openInformation(shell, ActionMessages.CopyQualifiedNameAction_InfoDialogTitel, + ActionMessages.CopyQualifiedNameAction_NoElementToQualify); + return; + } + + Clipboard clipboard = new Clipboard(shell.getDisplay()); + try { + clipboard.setContents(new String[] { qualName }, new Transfer[] { TextTransfer.getInstance() }); + } catch (SWTError e) { + if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) { + throw e; + } + if (MessageDialog.openQuestion(shell, ActionMessages.CopyQualifiedNameAction_ErrorTitle, + ActionMessages.CopyQualifiedNameAction_ErrorDescription)) { + clipboard.setContents(new String[] { qualName }, new Transfer[] { TextTransfer.getInstance() }); + } + } finally { + clipboard.dispose(); + } + } + +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ICEditorActionDefinitionIds.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ICEditorActionDefinitionIds.java index 7a46b6df4ec..81d8b31c120 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ICEditorActionDefinitionIds.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ICEditorActionDefinitionIds.java @@ -315,4 +315,10 @@ public interface ICEditorActionDefinitionIds extends ITextEditorActionDefinition * (value "org.eclipse.cdt.ui.edit.text.c.select.last"). */ public static final String SELECT_LAST = "org.eclipse.cdt.ui.edit.text.c.select.last"; //$NON-NLS-1$ + + /** + * Action definition ID of the edit -> copy qualified name + * (value "org.eclipse.cdt.ui.edit.text.c.copy.qualified.name"). + */ + public static final String COPY_QUALIFIED_NAME = "org.eclipse.cdt.ui.edit.text.c.copy.qualified.name"; //$NON-NLS-1$ } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/CdtActionConstants.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/CdtActionConstants.java index e9aa791452d..6a3dfbfcbf4 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/CdtActionConstants.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/CdtActionConstants.java @@ -494,4 +494,11 @@ public class CdtActionConstants { * "org.eclipse.cdt.ui.actions.ExceptionOccurrences"). */ public static final String FIND_EXCEPTION_OCCURRENCES = "org.eclipse.cdt.ui.actions.ExceptionOccurrences"; //$NON-NLS-1$ + + /** + * Source menu: name of standard action to copy fully qualified names (value + * "org.eclipse.cdt.ui.actions.CopyQualifiedName"). + * @since 6.5 + */ + public static final String COPY_QUALIFIED_NAME = "org.eclipse.cdt.ui.actions.CopyQualifiedName"; //$NON-NLS-1$ } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/GenerateActionGroup.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/GenerateActionGroup.java index 9039ada687d..933b70e474b 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/GenerateActionGroup.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/GenerateActionGroup.java @@ -23,6 +23,7 @@ import org.eclipse.cdt.core.model.ISourceReference; import org.eclipse.cdt.internal.ui.IContextMenuConstants; import org.eclipse.cdt.internal.ui.actions.ActionMessages; import org.eclipse.cdt.internal.ui.actions.CDTQuickMenuCreator; +import org.eclipse.cdt.internal.ui.actions.CopyQualifiedNameAction; import org.eclipse.cdt.internal.ui.editor.AddIncludeAction; import org.eclipse.cdt.internal.ui.editor.CEditor; import org.eclipse.cdt.internal.ui.editor.ICEditorActionDefinitionIds; @@ -134,7 +135,7 @@ public class GenerateActionGroup extends ActionGroup implements ISelectionChange // private SortMembersAction fSortMembers; private SortLinesAction fSortLines; private FormatAllAction fFormatAll; - // private CopyQualifiedNameAction fCopyQualifiedNameAction; + private CopyQualifiedNameAction fCopyQualifiedNameAction; // private static final String QUICK_MENU_ID = "org.eclipse.cdt.ui.edit.text.c.source.quickMenu"; //$NON-NLS-1$ @@ -172,10 +173,10 @@ public class GenerateActionGroup extends ActionGroup implements ISelectionChange fSortLines.setActionDefinitionId(ICEditorActionDefinitionIds.SORT_LINES); editor.setAction("SortLines", fSortLines); //$NON-NLS-1$ - // IAction pastAction= editor.getAction(ITextEditorActionConstants.PASTE);//IWorkbenchActionDefinitionIds.PASTE); - // fCopyQualifiedNameAction= new CopyQualifiedNameAction(editor, null, pastAction); - // fCopyQualifiedNameAction.setActionDefinitionId(CopyQualifiedNameAction.JAVA_EDITOR_ACTION_DEFINITIONS_ID); - // editor.setAction("CopyQualifiedName", fCopyQualifiedNameAction); //$NON-NLS-1$ + fCopyQualifiedNameAction = new CopyQualifiedNameAction(editor); + fCopyQualifiedNameAction.setActionDefinitionId(ICEditorActionDefinitionIds.COPY_QUALIFIED_NAME); + editor.setAction("CopyQualifiedName", fCopyQualifiedNameAction); //$NON-NLS-1$ + editor.markAsSelectionDependentAction("CopyQualifiedName", true); //$NON-NLS-1$ // // fOverrideMethods= new OverrideMethodsAction(editor); // fOverrideMethods.setActionDefinitionId(ICEditorActionDefinitionIds.OVERRIDE_METHODS); @@ -307,6 +308,8 @@ public class GenerateActionGroup extends ActionGroup implements ISelectionChange // fFormatAll = new FormatAllAction(site); fFormatAll.setActionDefinitionId(ICEditorActionDefinitionIds.FORMAT); + // fCopyQualifiedNameAction = new CopyQualifiedNameAction(site); + // fCopyQualifiedNameAction.setActionDefinitionId(ICEditorActionDefinitionIds.COPY_QUALIFIED_NAME); // // fCleanUp= new CleanUpAction(site); // fCleanUp.setActionDefinitionId(ICEditorActionDefinitionIds.CLEAN_UP); @@ -346,6 +349,7 @@ public class GenerateActionGroup extends ActionGroup implements ISelectionChange // registerSelectionListener(fSelectionProvider, fSortMembers); registerSelectionListener(fSelectionProvider, fAddTaskAction); // registerSelectionListener(fSelectionProvider, fCleanUp); + // registerSelectionListener(fSelectionProvider, fCopyQualifiedNameAction); selectionChanged(new SelectionChangedEvent(fSelectionProvider, selection)); registerSelectionListener(fSelectionProvider, this); @@ -430,6 +434,7 @@ public class GenerateActionGroup extends ActionGroup implements ISelectionChange added += addEditorAction(source, ITextEditorActionConstants.SHIFT_LEFT); added += addEditorAction(source, "Indent"); //$NON-NLS-1$ added += addEditorAction(source, "Format"); //$NON-NLS-1$ + added += addAction(source, fCopyQualifiedNameAction); source.add(new Separator(GROUP_ORGANIZE)); added += addAction(source, fAddInclude); added += addAction(source, fOrganizeIncludes); @@ -456,6 +461,7 @@ public class GenerateActionGroup extends ActionGroup implements ISelectionChange // added+= addAction(source, fAddCppDocStub); source.add(new Separator(GROUP_EDIT)); added += addAction(source, fFormatAll); + added += addAction(source, fCopyQualifiedNameAction); source.add(new Separator(GROUP_ORGANIZE)); added += addAction(source, fAddInclude); added += addAction(source, fOrganizeIncludes); @@ -515,7 +521,7 @@ public class GenerateActionGroup extends ActionGroup implements ISelectionChange actionBar.setGlobalActionHandler(IDEActionFactory.ADD_TASK.getId(), fAddTaskAction); actionBar.setGlobalActionHandler(CdtActionConstants.FORMAT, fFormatAll); } else { - // actionBar.setGlobalActionHandler(CopyQualifiedNameAction.ACTION_HANDLER_ID, fCopyQualifiedNameAction); + actionBar.setGlobalActionHandler(CdtActionConstants.COPY_QUALIFIED_NAME, fCopyQualifiedNameAction); } }