001: /*
002: * SystemSelection.java
003: *
004: * Copyright (C) 2002-2003 Peter Graves
005: * $Id: SystemSelection.java,v 1.3 2003/06/28 01:49:39 piso Exp $
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * as published by the Free Software Foundation; either version 2
010: * of the License, or (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
020: */
021:
022: package org.armedbear.j;
023:
024: import java.awt.AWTEvent;
025: import java.awt.Toolkit;
026: import java.awt.datatransfer.Clipboard;
027: import java.awt.datatransfer.ClipboardOwner;
028: import java.awt.datatransfer.DataFlavor;
029: import java.awt.datatransfer.StringSelection;
030: import java.awt.datatransfer.Transferable;
031: import java.awt.event.MouseEvent;
032: import javax.swing.undo.CompoundEdit;
033:
034: public final class SystemSelection implements ClipboardOwner, Constants {
035: private static SystemSelection systemSelection = getSystemSelection();
036:
037: private final Clipboard clipboard;
038: private String primarySelection;
039:
040: private SystemSelection(Clipboard clipboard) {
041: this .clipboard = clipboard;
042: }
043:
044: private static SystemSelection getSystemSelection() {
045: try {
046: Clipboard clipboard = Toolkit.getDefaultToolkit()
047: .getSystemSelection();
048: return new SystemSelection(clipboard);
049: } catch (Exception e) {
050: return null;
051: }
052: }
053:
054: public void lostOwnership(Clipboard clipboard, Transferable contents) {
055: primarySelection = null;
056: }
057:
058: public void update(Editor editor) {
059: try {
060: if (clipboard != null) {
061: StringSelection ss = null;
062: if (editor.getMark() != null
063: && !editor.isColumnSelection()) {
064: primarySelection = new Region(editor).toString();
065: ss = new StringSelection(primarySelection);
066: } else if (primarySelection != null) {
067: // We own the primary selection.
068: ss = new StringSelection("");
069: }
070: if (ss != null)
071: clipboard.setContents(ss, this );
072: }
073: } catch (OutOfMemoryError e) {
074: Log.error("SystemSelection.update() OutOfMemoryError");
075: }
076: }
077:
078: public String getPrimarySelection() {
079: if (primarySelection != null) {
080: // We own the primary selection.
081: return primarySelection;
082: }
083: Transferable t = clipboard.getContents(this );
084: if (t != null) {
085: try {
086: return (String) t
087: .getTransferData(DataFlavor.stringFlavor);
088: } catch (Exception e) {
089: }
090: }
091: return null;
092: }
093:
094: public static void updateSystemSelection(Editor editor) {
095: if (systemSelection != null)
096: systemSelection.update(editor);
097: }
098:
099: public static void pastePrimarySelection() {
100: final Editor editor = Editor.currentEditor();
101: if (!editor.checkReadOnly())
102: return;
103: if (systemSelection == null) {
104: Log.debug("pastePrimarySelection systemSelection is null");
105: return;
106: }
107: String s = systemSelection.getPrimarySelection();
108: if (s == null || s.length() == 0) {
109: Log.debug("pastePrimarySelection no selection");
110: return;
111: }
112: KillRing killRing = Editor.getKillRing();
113: killRing.appendNew(s);
114: // We MUST call killRing.pop() here so that killRing.indexOfNextPop
115: // and killRing.lastPaste are set correctly.
116: killRing.pop();
117: AWTEvent e = editor.getDispatcher().getLastEvent();
118: if (e instanceof MouseEvent) {
119: CompoundEdit compoundEdit = editor.beginCompoundEdit();
120: editor.mouseMoveDotToPoint((MouseEvent) e);
121: editor.paste(s);
122: editor.endCompoundEdit(compoundEdit);
123: } else
124: editor.paste(s);
125: editor.setCurrentCommand(COMMAND_PASTE);
126: }
127: }
|