/* * Copyright (c) 2012, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.ui.actions; import com.google.dart.tools.ui.instrumentation.UIInstrumentationBuilder; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTError; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; /** * Helper class for adding basic copy/paste support to controls. */ public class CopyDetailsToClipboardAction extends InstrumentedAction { public static interface DetailsProvider { String getDetails(); } //max clipboard access retries private final static int MAX_REPEAT_COUNT = 10; public static void addCopyDetailsPopup(Control control, final DetailsProvider detailsProvider) { final Shell shell = control.getShell(); Menu popUpMenu = new Menu(shell, SWT.POP_UP); MenuItem copyItem = new MenuItem(popUpMenu, SWT.PUSH); copyItem.setText("Copy Details"); copyItem.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(SelectionEvent e) { new CopyDetailsToClipboardAction(shell, detailsProvider) { }.run(); } }); control.setMenu(popUpMenu); } private final Shell shell; private final DetailsProvider detailsProvider; public CopyDetailsToClipboardAction(Shell shell, DetailsProvider detailsProvider) { this.shell = shell; this.detailsProvider = detailsProvider; } @Override protected void doRun(Event event, UIInstrumentationBuilder instrumentation) { Clipboard clipboard = new Clipboard(getShell().getDisplay()); try { copyToClipboard(clipboard, detailsProvider.getDetails(), 0); instrumentation.data("text", detailsProvider.getDetails()); } finally { clipboard.dispose(); } } private void copyToClipboard(Clipboard clipboard, String text, int repeatCount) { try { clipboard.setContents(new String[] {text}, new Transfer[] {TextTransfer.getInstance()}); } catch (SWTError e) { if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD || repeatCount >= MAX_REPEAT_COUNT) { throw e; } if (MessageDialog.openQuestion( getShell(), "Problem Copying to Clipboard", "There was a problem when accessing the system clipboard.\nRetry?")) { copyToClipboard(clipboard, text, repeatCount + 1); } } } private Shell getShell() { return shell; } }