1 /*******************************************************************************
2 * Copyright (c) 2006, 2011 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.callhierarchy;
13 import java.util.Iterator;
15 import org.eclipse.swt.SWTError;
16 import org.eclipse.swt.dnd.Clipboard;
17 import org.eclipse.swt.dnd.DND;
18 import org.eclipse.swt.dnd.TextTransfer;
19 import org.eclipse.swt.dnd.Transfer;
21 import org.eclipse.jface.action.Action;
22 import org.eclipse.jface.dialogs.MessageDialog;
23 import org.eclipse.jface.viewers.ISelectionChangedListener;
24 import org.eclipse.jface.viewers.IStructuredSelection;
25 import org.eclipse.jface.viewers.SelectionChangedEvent;
27 import org.eclipse.ui.IViewSite;
28 import org.eclipse.ui.IWorkbenchCommandConstants;
31 import org.eclipse.jdt.internal.corext.callhierarchy.CallLocation;
34 * Copies the selection from the location viewer.
36 class LocationCopyAction extends Action {
37 private final Clipboard fClipboard;
38 private final IViewSite fViewSite;
39 private final LocationViewer fLocationViewer;
41 LocationCopyAction(IViewSite viewSite, Clipboard clipboard, LocationViewer locationViewer) {
42 fClipboard= clipboard;
44 fLocationViewer= locationViewer;
46 setText(CallHierarchyMessages.LocationCopyAction_copy);
47 setActionDefinitionId(IWorkbenchCommandConstants.EDIT_COPY);
48 setEnabled(!fLocationViewer.getSelection().isEmpty());
50 locationViewer.addSelectionChangedListener(new ISelectionChangedListener() {
51 public void selectionChanged(SelectionChangedEvent event) {
52 setEnabled(! event.getSelection().isEmpty());
59 IStructuredSelection selection= (IStructuredSelection) fLocationViewer.getSelection();
60 StringBuffer buf= new StringBuffer();
61 for (Iterator<?> iterator= selection.iterator(); iterator.hasNext();) {
62 CallLocation location= (CallLocation) iterator.next();
63 buf.append(location.getLineNumber()).append('\t').append(location.getCallText());
66 TextTransfer plainTextTransfer = TextTransfer.getInstance();
68 fClipboard.setContents(
69 new String[]{ CopyCallHierarchyAction.convertLineTerminators(buf.toString()) },
70 new Transfer[]{ plainTextTransfer });
72 if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD)
74 if (MessageDialog.openQuestion(fViewSite.getShell(), CallHierarchyMessages.CopyCallHierarchyAction_problem, CallHierarchyMessages.CopyCallHierarchyAction_clipboard_busy))