blob: ec374f0ad395738d153300bd0d0753279d5bfc14 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2005 IBM Corporation 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.browser;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.graphics.Point;
import org.eclipse.jface.action.Action;
/**
* Text actions (cut, copy, paste) for the Web browser.
*/
public class TextAction extends Action {
protected BrowserViewer browser;
protected byte type;
public static final byte CUT = 0;
public static final byte COPY = 1;
public static final byte PASTE = 2;
/**
* TextAction constructor comment.
*/
protected TextAction(BrowserViewer browser, byte type) {
super(type + "!"); //$NON-NLS-1$
this.browser = browser;
this.type = type;
}
/**
* Copies the selected text to the clipboard. The text will be put in the
* clipboard in plain text format.
* <p>
*
* @exception SWTException <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
* </ul>
*/
public void copy() {
Point selection = browser.combo.getSelection();
int length = selection.y - selection.x;
if (length > 0) {
TextTransfer plainTextTransfer = TextTransfer.getInstance();
try {
browser.clipboard.setContents(
new String[] { browser.combo.getText().substring(selection.x, selection.y) },
new Transfer[] { plainTextTransfer });
} catch (SWTError error) {
// Copy to clipboard failed. This happens when another application
// is accessing the clipboard while we copy. Ignore the error.
// Fixes 1GDQAVN
}
}
}
/**
* Moves the selected text to the clipboard. The text will be put in the
* clipboard in plain text format and RTF format.
* <p>
*
* @exception SWTException <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
* </ul>
*/
public void cut(){
Point selection = browser.combo.getSelection();
if (selection.y > selection.x) {
copy();
delete();
}
}
/**
* Deletes the character to the right of the caret. Delete the selected text if any.
*/
public void delete() {
Point selection = browser.combo.getSelection();
String text = browser.combo.getText();
if (selection.x != selection.y) {
text = text.substring(0, selection.x) + text.substring(selection.y);
browser.combo.setText(text);
browser.combo.setSelection(new Point(selection.x, selection.x));
}
}
/**
* Replaces the selection with the clipboard text or insert the text at
* the current caret offset if there is no selection.
* If the widget has the SWT.SINGLE style and the clipboard text contains
* more than one line, only the first line without line delimiters is
* inserted in the widget.
* <p>
*
* @exception SWTException <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
* </ul>
*/
public void paste() {
TextTransfer transfer = TextTransfer.getInstance();
Point selection = browser.combo.getSelection();
String text = browser.combo.getText();
String newText = (String) browser.clipboard.getContents(transfer);
if (newText != null && newText.length() > 0) {
text = text.substring(0, selection.x) + newText + text.substring(selection.y);
browser.combo.setText(text);
// set the selection to the end of the paste
int x = selection.x + newText.length();
browser.combo.setSelection(new Point(x, x));
}
}
/**
* Implementation of method defined on <code>IAction</code>.
*/
public void run() {
if (browser == null || browser.combo == null)
return;
if (type == CUT)
cut();
else if (type == COPY)
copy();
else if (type == PASTE)
paste();
}
}