1 /**
2  * Copyright (c) 2003 IBM Corporation and others.
3  * All rights reserved. � This program and the accompanying materials
4  * are made available under the terms of the Common Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/cpl-v10.html
7  �*
8  * Contributors:
9  *    IBM - Initial API and implementation
10  */
11 package net.sourceforge.phpeclipse.webbrowser.internal;
12 
13 import org.eclipse.jface.action.Action;
14 import org.eclipse.swt.SWTError;
15 import org.eclipse.swt.SWTException;
16 import org.eclipse.swt.dnd.TextTransfer;
17 import org.eclipse.swt.dnd.Transfer;
18 import org.eclipse.swt.graphics.Point;
19 
20 /**
21  * Text actions (cut, copy, paste) for the Web browser.
22  */
23 public class TextAction extends Action {
24 	protected WebBrowser browser;
25 
26 	protected byte type;
27 
28 	public static final byte CUT = 0;
29 
30 	public static final byte COPY = 1;
31 
32 	public static final byte PASTE = 2;
33 
34 	/**
35 	 * TextAction constructor comment.
36 	 */
TextAction(WebBrowser browser, byte type)37 	protected TextAction(WebBrowser browser, byte type) {
38 		super(type + "!");
39 		this.browser = browser;
40 		this.type = type;
41 	}
42 
43 	/**
44 	 * Copies the selected text to the clipboard. The text will be put in the
45 	 * clipboard in plain text format.
46 	 * <p>
47 	 *
48 	 * @exception SWTException
49 	 *                <ul>
50 	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
51 	 *                disposed</li>
52 	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
53 	 *                thread that created the receiver</li>
54 	 *                </ul>
55 	 */
copy()56 	public void copy() {
57 		Point selection = browser.combo.getSelection();
58 
59 		int length = selection.y - selection.x;
60 		if (length > 0) {
61 			TextTransfer plainTextTransfer = TextTransfer.getInstance();
62 			try {
63 				browser.clipboard.setContents(new String[] { browser.combo
64 						.getText().substring(selection.x, selection.y) },
65 						new Transfer[] { plainTextTransfer });
66 			} catch (SWTError error) {
67 				// Copy to clipboard failed. This happens when another
68 				// application
69 				// is accessing the clipboard while we copy. Ignore the error.
70 				// Fixes 1GDQAVN
71 			}
72 		}
73 	}
74 
75 	/**
76 	 * Moves the selected text to the clipboard. The text will be put in the
77 	 * clipboard in plain text format and RTF format.
78 	 * <p>
79 	 *
80 	 * @exception SWTException
81 	 *                <ul>
82 	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
83 	 *                disposed</li>
84 	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
85 	 *                thread that created the receiver</li>
86 	 *                </ul>
87 	 */
cut()88 	public void cut() {
89 		Point selection = browser.combo.getSelection();
90 
91 		if (selection.y > selection.x) {
92 			copy();
93 			delete();
94 		}
95 	}
96 
97 	/**
98 	 * Deletes the character to the right of the caret. Delete the selected text
99 	 * if any.
100 	 */
delete()101 	public void delete() {
102 		Point selection = browser.combo.getSelection();
103 		String text = browser.combo.getText();
104 
105 		if (selection.x != selection.y) {
106 			text = text.substring(0, selection.x) + text.substring(selection.y);
107 			browser.combo.setText(text);
108 			browser.combo.setSelection(new Point(selection.x, selection.x));
109 		}
110 	}
111 
112 	/**
113 	 * Replaces the selection with the clipboard text or insert the text at the
114 	 * current caret offset if there is no selection. If the widget has the
115 	 * SWT.SINGLE style and the clipboard text contains more than one line, only
116 	 * the first line without line delimiters is inserted in the widget.
117 	 * <p>
118 	 *
119 	 * @exception SWTException
120 	 *                <ul>
121 	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
122 	 *                disposed</li>
123 	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
124 	 *                thread that created the receiver</li>
125 	 *                </ul>
126 	 */
paste()127 	public void paste() {
128 		TextTransfer transfer = TextTransfer.getInstance();
129 		Point selection = browser.combo.getSelection();
130 		String text = browser.combo.getText();
131 
132 		String newText = (String) browser.clipboard.getContents(transfer);
133 		if (newText != null && newText.length() > 0) {
134 			text = text.substring(0, selection.x) + newText
135 					+ text.substring(selection.y);
136 			browser.combo.setText(text);
137 
138 			// set the selection to the end of the paste
139 			int x = selection.x + newText.length();
140 			browser.combo.setSelection(new Point(x, x));
141 		}
142 	}
143 
144 	/**
145 	 * Implementation of method defined on <code>IAction</code>.
146 	 */
run()147 	public void run() {
148 		if (browser == null || browser.combo == null)
149 			return;
150 		if (type == CUT)
151 			cut();
152 		else if (type == COPY)
153 			copy();
154 		else if (type == PASTE)
155 			paste();
156 	}
157 
158 	/**
159 	 *
160 	 */
update()161 	protected void update() {
162 	}
163 }