diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/ContentLabelProviderWrapper.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/ContentLabelProviderWrapper.java index d322b096fd7..9ff0840da3c 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/ContentLabelProviderWrapper.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/ContentLabelProviderWrapper.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011, 2012 Mentor Graphics and others. + * Copyright (c) 2011, 2016 Mentor Graphics and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -44,6 +44,11 @@ implements ITableLabelProvider, IStructuredContentProvider this.realProvider = realProvider; } + public U getData() + { + return realProvider; + } + @Override public Image getColumnImage(Object obj, int index) { return realProvider.getColumnImage(obj, index); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/Messages.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/Messages.java index 80402abc0c5..1f8e1e67620 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/Messages.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/Messages.java @@ -32,6 +32,7 @@ public class Messages extends NLS { public static String OSView_15; public static String OSView_AttachJobName; public static String OSView_AttachTask; + public static String OSView_CopyAction; static { // initialize resource bundle NLS.initializeMessages(Messages.class.getName(), Messages.class); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/Messages.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/Messages.properties index 64429f1856d..c333af8486e 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/Messages.properties +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/Messages.properties @@ -23,3 +23,4 @@ OSView_14=Objects from different debug sessions are selected. OSView_15=No debug session is selected. OSView_AttachJobName=Connecting debug session to processes OSView_AttachTask=Connecting to process {0} +OSView_CopyAction=Copy diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/OSResourcesView.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/OSResourcesView.java index ea2918539b7..7e0992faeaf 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/OSResourcesView.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/osview/OSResourcesView.java @@ -26,6 +26,7 @@ import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext; import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch; +import org.eclipse.cdt.dsf.gdb.service.IGDBHardwareAndOS2.IResourcesInformation; import org.eclipse.cdt.dsf.service.DsfServicesTracker; import org.eclipse.cdt.dsf.service.DsfSession; import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext; @@ -53,11 +54,15 @@ import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; +import org.eclipse.swt.dnd.Clipboard; +import org.eclipse.swt.dnd.TextTransfer; +import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Listener; @@ -65,7 +70,10 @@ import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IActionBars; +import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchActionConstants; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.progress.UIJob; import org.osgi.framework.Bundle; @@ -189,6 +197,7 @@ public class OSResourcesView extends ViewPart implements DsfSession.SessionEnded } catch (Exception e) { } bars.getToolBarManager().add(fRefreshAction); + bars.setGlobalActionHandler(ActionFactory.COPY.getId(), new CopyAction()); bars.updateActionBars(); createContextMenu(); @@ -209,6 +218,7 @@ public class OSResourcesView extends ViewPart implements DsfSession.SessionEnded menuMgr.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(IMenuManager manager) { + manager.add(new CopyAction()); manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } }); @@ -717,4 +727,50 @@ public class OSResourcesView extends ViewPart implements DsfSession.SessionEnded public ICommandControlDMContext getSessionContext() { return fSessionData != null ? fSessionData.getContext() : null; } + + /** + * Retargetted copy to clipboard action + */ + private final class CopyAction extends Action { + private static final char COLUMN_SEPARATOR = ','; + private final String EOL_CHAR = System.getProperty("line.separator"); //$NON-NLS-1$ + + private CopyAction() { + setText(Messages.OSView_CopyAction); + setImageDescriptor( + PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_COPY)); + } + + @Override + public boolean isEnabled() { + return !fViewer.getSelection().isEmpty(); + } + + @Override + public void run() { + ISelection selection = fViewer.getSelection(); + if (selection.isEmpty()) + return; + + if (selection instanceof IStructuredSelection) { + @SuppressWarnings("unchecked") + OSData data = ((ContentLabelProviderWrapper) fViewer.getContentProvider()).getData(); + StringBuilder exportStr = new StringBuilder(); + for (Object elmnt : ((IStructuredSelection) selection).toList()) { + assert elmnt instanceof IResourcesInformation; + if (elmnt instanceof IResourcesInformation) { + IResourcesInformation ri = (IResourcesInformation) elmnt; + exportStr.append(data.getColumnText(ri, 0)); + for (int i = 1; i < data.getColumnCount(); i++) { + exportStr.append(COLUMN_SEPARATOR).append(data.getColumnText(ri, i)); + } + exportStr.append(EOL_CHAR); + } + } + Clipboard cb = new Clipboard(Display.getDefault()); + TextTransfer textTransfer = TextTransfer.getInstance(); + cb.setContents(new Object[] { exportStr.toString() }, new Transfer[] { textTransfer }); + } + } + } }