Frames | No Frames |
1: /* TextAction.java -- 2: Copyright (C) 2002, 2004 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: 39: package javax.swing.text; 40: 41: import java.awt.Point; 42: import java.awt.event.ActionEvent; 43: import java.util.ArrayList; 44: import java.util.HashSet; 45: 46: import javax.swing.AbstractAction; 47: import javax.swing.Action; 48: import javax.swing.SwingConstants; 49: 50: /** 51: * TextAction 52: * @author Andrew Selkirk 53: */ 54: public abstract class TextAction extends AbstractAction 55: { 56: /** 57: * Constructor TextAction 58: * @param name TODO 59: */ 60: public TextAction(String name) 61: { 62: super(name); 63: } 64: 65: /** 66: * Returns the <code>JTextComponent</code> object associated with the given 67: * <code>ActionEvent</code>. If the source of the event is not a 68: * <code>JTextComponent</code> the currently focused text component is returned. 69: * 70: * @param event the action event 71: * 72: * @return the <code>JTextComponent</code> 73: */ 74: protected final JTextComponent getTextComponent(ActionEvent event) 75: { 76: if (event.getSource() instanceof JTextComponent) 77: return (JTextComponent) event.getSource(); 78: 79: return getFocusedComponent(); 80: } 81: 82: /** 83: * Creates a new array of <code>Action</code> containing both given arrays. 84: * 85: * @param list1 the first action array 86: * @param list2 the second action array 87: * 88: * @return the augmented array of actions 89: */ 90: public static final Action[] augmentList(Action[] list1, Action[] list2) 91: { 92: HashSet actionSet = new HashSet(); 93: 94: for (int i = 0; i < list1.length; ++i) 95: actionSet.add(list1[i]); 96: 97: for (int i = 0; i < list2.length; ++i) 98: actionSet.add(list2[i]); 99: 100: ArrayList list = new ArrayList(actionSet); 101: return (Action[]) list.toArray(new Action[actionSet.size()]); 102: } 103: 104: /** 105: * Returns the current focused <code>JTextComponent</code> object. 106: * 107: * @return the <code>JTextComponent</code> 108: */ 109: protected final JTextComponent getFocusedComponent() 110: { 111: return null; // TODO 112: } 113: 114: /** Abstract helper class which implements everything needed for an 115: * Action implementation in <code>DefaultEditorKit</code> which 116: * does horizontal movement (and selection). 117: */ 118: abstract static class HorizontalMovementAction extends TextAction 119: { 120: int dir; 121: 122: HorizontalMovementAction(String name, int direction) 123: { 124: super(name); 125: dir = direction; 126: } 127: 128: public void actionPerformed(ActionEvent event) 129: { 130: JTextComponent t = getTextComponent(event); 131: try 132: { 133: if (t != null) 134: { 135: int offs 136: = Utilities.getNextVisualPositionFrom(t, 137: t.getCaretPosition(), 138: dir); 139: 140: Caret c = t.getCaret(); 141: 142: actionPerformedImpl(c, offs); 143: 144: c.setMagicCaretPosition(t.modelToView(offs).getLocation()); 145: } 146: } 147: catch(BadLocationException ble) 148: { 149: throw 150: (InternalError) new InternalError("Illegal offset").initCause(ble); 151: } 152: 153: } 154: 155: protected abstract void actionPerformedImpl(Caret c, int offs) 156: throws BadLocationException; 157: } 158: 159: /** Abstract helper class which implements everything needed for an 160: * Action implementation in <code>DefaultEditorKit</code> which 161: * does vertical movement (and selection). 162: */ 163: abstract static class VerticalMovementAction extends TextAction 164: { 165: int dir; 166: 167: VerticalMovementAction(String name, int direction) 168: { 169: super(name); 170: dir = direction; 171: } 172: 173: public void actionPerformed(ActionEvent event) 174: { 175: JTextComponent t = getTextComponent(event); 176: try 177: { 178: if (t != null) 179: { 180: Caret c = t.getCaret(); 181: // The magic caret position may be null when the caret 182: // has not moved yet. 183: Point mcp = c.getMagicCaretPosition(); 184: 185: int pos; 186: if (mcp != null) 187: { 188: mcp.y = t.modelToView(c.getDot()).y; 189: pos = t.viewToModel(mcp); 190: } 191: else 192: pos = c.getDot(); 193: 194: pos = Utilities.getNextVisualPositionFrom(t, 195: t.getCaretPosition(), 196: dir); 197: 198: if (pos > -1) 199: actionPerformedImpl(c, pos); 200: } 201: } 202: catch(BadLocationException ble) 203: { 204: throw 205: (InternalError) new InternalError("Illegal offset").initCause(ble); 206: } 207: } 208: 209: protected abstract void actionPerformedImpl(Caret c, int offs) 210: throws BadLocationException; 211: 212: } 213: 214: 215: }