OSDN Git Service

2006-06-09 Thomas Fitzsimmons <fitzsim@redhat.com>
[pf3gnuchains/gcc-fork.git] / libjava / classpath / javax / swing / text / TextAction.java
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 }