From 400a43fc2ca111b1a7753571dcaafd243c398931 Mon Sep 17 00:00:00 2001 From: Dinesh0723 Date: Wed, 20 Dec 2023 17:41:53 +0530 Subject: [PATCH] Copy Validation errors / suggest missing items to add #223 Introduced a new copy button for copying the validation errors. Fixes: https://github.com/eclipse-pde/eclipse.pde/issues/223 --- .../tests/launcher/ValidationDialogTest.java | 17 +++++++- .../pde/internal/ui/PDEUIMessages.java | 2 + .../ui/launcher/PluginStatusDialog.java | 40 ++++++++++++++++++- .../pde/internal/ui/pderesources.properties | 2 + 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/ValidationDialogTest.java b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/ValidationDialogTest.java index 294d04f377..93ed615961 100644 --- a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/ValidationDialogTest.java +++ b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/ValidationDialogTest.java @@ -14,11 +14,13 @@ package org.eclipse.pde.ui.tests.launcher; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import org.eclipse.jface.window.IShellProvider; +import org.eclipse.pde.internal.ui.PDEUIMessages; import org.eclipse.pde.internal.ui.launcher.PluginStatusDialog; import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; @@ -55,6 +57,10 @@ private void checkEditConfigurationLink(Control[] element) { } else if ((control instanceof Link)) { isEditLaunchConfigurationLinkAvilable(element, control); break; + } else if ((control instanceof Button) && (control.getToolTipText() != null) && (control.getToolTipText() + .equals(PDEUIMessages.PluginStatusDialog_copyValidationError_Tooltip))) { + isCopyValidationButtonAvilable(element, control); + break; } } } @@ -62,6 +68,13 @@ private void checkEditConfigurationLink(Control[] element) { private void isEditLaunchConfigurationLinkAvilable(Control[] element, Control control) { Control editConfigLink = element[0]; ((Link) control).notifyListeners(SWT.Selection, new Event()); - assertNotNull(editConfigLink.isVisible()); + assertTrue(editConfigLink.isVisible()); + } + + private void isCopyValidationButtonAvilable(Control[] element, Control control) { + Control copyValidationError = element[1]; + ((Button) control).notifyListeners(SWT.Selection, new Event()); + assertTrue(copyValidationError.isVisible()); + } } \ No newline at end of file diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java index fbf66eab27..f4edf88aaf 100644 --- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java +++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java @@ -1792,6 +1792,8 @@ public class PDEUIMessages extends NLS { public static String PluginWorkingSet_noPluginsChecked; public static String PluginStatusDialog_pluginValidation; public static String PluginStatusDialog_validationLink; + public static String PluginStatusDialog_copyValidationError_Button; + public static String PluginStatusDialog_copyValidationError_Tooltip; public static String PluginsView_openWith; public static String PluginsView_import; public static String PluginsView_select; diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/PluginStatusDialog.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/PluginStatusDialog.java index 2b07f5f689..3ce5f43530 100644 --- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/PluginStatusDialog.java +++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/PluginStatusDialog.java @@ -11,10 +11,13 @@ * Contributors: * IBM Corporation - initial API and implementation * Lars Vogel - Bug 487943 - * Dinesh Palanisamy (ETAS GmbH) - Issue 305 + * Dinesh Palanisamy (ETAS GmbH) - Issue 305, 223 *******************************************************************************/ package org.eclipse.pde.internal.ui.launcher; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.util.Map; import org.eclipse.core.runtime.MultiStatus; @@ -32,6 +35,7 @@ import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.osgi.service.resolver.BundleDescription; import org.eclipse.pde.internal.ui.IHelpContextIds; +import org.eclipse.pde.internal.ui.PDELabelProvider; import org.eclipse.pde.internal.ui.PDEPlugin; import org.eclipse.pde.internal.ui.PDEUIMessages; import org.eclipse.swt.SWT; @@ -39,6 +43,7 @@ import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; @@ -137,6 +142,8 @@ protected int getDialogBoundsStrategy() { protected void createButtonsForButtonBar(Composite parent) { if (fShowLink) { createLink(parent, IDialogConstants.YES_ID, PDEUIMessages.PluginStatusDialog_validationLink, true); + createCopyValidationButton(parent, IDialogConstants.YES_ID, + PDEUIMessages.PluginStatusDialog_copyValidationError_Button, true); } createButton(parent, IDialogConstants.OK_ID, PDEUIMessages.PluginStatusDialog_continueButtonLabel, true); if (fShowCancelButton) { @@ -169,6 +176,34 @@ public void widgetSelected(SelectionEvent e) { } } + private void createCopyValidationButton(Composite parent, int yesId, + String pluginStatusDialog_copyValidationErrorButton, boolean b) { + Button copyValidationError = new Button(parent, SWT.PUSH); + copyValidationError.setText(PDEUIMessages.PluginStatusDialog_copyValidationError_Button); + copyValidationError.setToolTipText(PDEUIMessages.PluginStatusDialog_copyValidationError_Tooltip); + setButtonLayoutData(copyValidationError); + copyValidationError.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + StringBuilder validationError = new StringBuilder(); + PDELabelProvider pdeLabelProvider = new PDELabelProvider(); + for (Map.Entry validationEntry : fInput.entrySet()) { + if (validationEntry.getKey() != null) { + validationError + .append(pdeLabelProvider.getText(validationEntry.getKey()) + System.lineSeparator()); + Object[] valueObject = (Object[]) validationEntry.getValue(); + for (Object valueString : valueObject) { + validationError.append(" " + valueString.toString() + System.lineSeparator()); //$NON-NLS-1$ + } + } + } + StringSelection strSelection = new StringSelection(validationError.toString()); + Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + systemClipboard.setContents(strSelection, null); + } + }); + } + @Override protected void configureShell(Shell shell) { super.configureShell(shell); @@ -179,7 +214,7 @@ protected void configureShell(Shell shell) { protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); GridData gd = new GridData(GridData.FILL_BOTH); - gd.widthHint = 400; + gd.widthHint = 700; gd.heightHint = 300; container.setLayoutData(gd); @@ -191,6 +226,7 @@ protected Control createDialogArea(Composite parent) { treeViewer.setLabelProvider(PDEPlugin.getDefault().getLabelProvider()); treeViewer.setComparator(new ViewerComparator()); treeViewer.setInput(fInput); + treeViewer.expandAll(); treeViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); getShell().setText(PDEUIMessages.PluginStatusDialog_pluginValidation); diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties index 1e2ae5e188..fcb0ff4e5f 100644 --- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties +++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties @@ -1514,6 +1514,8 @@ PluginEditor_exportTooltip=Export deployable plug-ins and fragments PluginWorkingSet_noPluginsChecked=At least one plug-in must be checked PluginStatusDialog_pluginValidation=Validation PluginStatusDialog_validationLink=Edit Launch Configuration +PluginStatusDialog_copyValidationError_Button=Copy Errors +PluginStatusDialog_copyValidationError_Tooltip=Copy Validation Error PluginsView_openWith=Open &With PluginsView_import=I&mport As PluginsView_select=Se&lect