1 /* SwingTextAreaPeer.java -- A Swing based peer for AWT textareas
2    Copyright (C)  2006, 2007  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 package gnu.java.awt.peer.swing;
39 
40 import java.awt.Container;
41 import java.awt.Dimension;
42 import java.awt.Graphics;
43 import java.awt.Image;
44 import java.awt.Point;
45 import java.awt.Rectangle;
46 import java.awt.TextArea;
47 import java.awt.event.ComponentEvent;
48 import java.awt.event.FocusEvent;
49 import java.awt.event.HierarchyEvent;
50 import java.awt.event.InputMethodEvent;
51 import java.awt.event.KeyEvent;
52 import java.awt.event.MouseEvent;
53 import java.awt.event.MouseWheelEvent;
54 import java.awt.im.InputMethodRequests;
55 import java.awt.peer.TextAreaPeer;
56 
57 import javax.swing.JComponent;
58 import javax.swing.JScrollPane;
59 import javax.swing.JTextArea;
60 import javax.swing.JViewport;
61 import javax.swing.text.BadLocationException;
62 
63 public class SwingTextAreaPeer
64     extends SwingComponentPeer
65     implements TextAreaPeer
66 {
67 
68   /**
69    * A spezialized Swing scroller used to hold the textarea.
70    *
71    * @author Roman Kennke (kennke@aicas.com)
72    */
73   private class SwingScrollPane
74     extends JScrollPane
75     implements SwingComponent
76   {
77 
78     SwingTextArea textArea;
79 
SwingScrollPane(SwingTextArea textArea)80     SwingScrollPane(SwingTextArea textArea)
81     {
82       super(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
83             JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
84 
85       this.textArea = textArea;
86     }
87 
88     /**
89      * Returns this label.
90      *
91      * @return <code>this</code>
92      */
getJComponent()93     public JComponent getJComponent()
94     {
95       return this;
96     }
97 
98     /**
99      * Handles mouse events by forwarding it to
100      * <code>processMouseEvent()</code>.
101      *
102      * @param ev the mouse event
103      */
handleMouseEvent(MouseEvent ev)104     public void handleMouseEvent(MouseEvent ev)
105     {
106       JViewport viewPort = getViewport();
107       if(viewPort.contains(ev.getPoint()))
108         {
109           ev.setSource(textArea);
110           textArea.dispatchEvent(ev);
111         }
112       else
113         {
114           ev.setSource(this);
115           this.dispatchEvent(ev);
116         }
117     }
118 
119     /**
120      * Force lightweight mouse dispatching.
121      */
isLightweight()122     public boolean isLightweight()
123     {
124       return false;
125     }
126 
127     /**
128      * Handles mouse motion events by forwarding it to
129      * <code>processMouseMotionEvent()</code>.
130      *
131      * @param ev the mouse motion event
132      */
handleMouseMotionEvent(MouseEvent ev)133     public void handleMouseMotionEvent(MouseEvent ev)
134     {
135       textArea.processMouseMotionEvent(ev);
136     }
137 
138     /**
139      * Handles key events by forwarding it to <code>processKeyEvent()</code>.
140      *
141      * @param ev the mouse event
142      */
handleKeyEvent(KeyEvent ev)143     public void handleKeyEvent(KeyEvent ev)
144     {
145       textArea.processKeyEvent(ev);
146     }
147 
148     /**
149      * Handles focus events by forwarding it to
150      * <code>processFocusEvent()</code>.
151      *
152      * @param ev the Focus event
153      */
handleFocusEvent(FocusEvent ev)154     public void handleFocusEvent(FocusEvent ev)
155     {
156       textArea.processFocusEvent(ev);
157     }
158 
159     /**
160      * Overridden so that this method returns the correct value even without a
161      * peer.
162      *
163      * @return the screen location of the button
164      */
getLocationOnScreen()165     public Point getLocationOnScreen()
166     {
167       return SwingTextAreaPeer.this.getLocationOnScreen();
168     }
169 
170     /**
171      * Overridden so that the isShowing method returns the correct value for the
172      * swing button, even if it has no peer on its own.
173      *
174      * @return <code>true</code> if the button is currently showing,
175      *         <code>false</code> otherwise
176      */
isShowing()177     public boolean isShowing()
178     {
179       boolean retVal = false;
180       if (SwingTextAreaPeer.this.awtComponent != null)
181         retVal = SwingTextAreaPeer.this.awtComponent.isShowing();
182       return retVal;
183     }
184 
185     /**
186      * Overridden, so that the Swing button can create an Image without its
187      * own peer.
188      *
189      * @param w the width of the image
190      * @param h the height of the image
191      *
192      * @return an image
193      */
createImage(int w, int h)194     public Image createImage(int w, int h)
195     {
196       return SwingTextAreaPeer.this.createImage(w, h);
197     }
198 
getGraphics()199     public Graphics getGraphics()
200     {
201       return SwingTextAreaPeer.this.getGraphics();
202     }
203 
getParent()204     public Container getParent()
205     {
206       Container par = null;
207       if (SwingTextAreaPeer.this.awtComponent != null)
208         par = SwingTextAreaPeer.this.awtComponent.getParent();
209       return par;
210     }
211 
requestFocus()212     public void requestFocus() {
213         SwingTextAreaPeer.this.requestFocus(awtComponent, false, true, 0);
214     }
215 
requestFocus(boolean temporary)216     public boolean requestFocus(boolean temporary) {
217         return SwingTextAreaPeer.this.requestFocus(awtComponent, temporary,
218                                                    true, 0);
219     }
220 
221   }
222 
223   private class SwingTextArea extends JTextArea
224   {
225     /**
226      * Make this method accessible in this Package.
227      */
processComponentKeyEvent(KeyEvent e)228     protected final void processComponentKeyEvent(KeyEvent e)
229     {
230       super.processComponentKeyEvent(e);
231     }
232 
233     /**
234      * Make this method accessible in this Package.
235      */
processMouseMotionEvent(MouseEvent ev)236     protected final void processMouseMotionEvent(MouseEvent ev)
237     {
238       super.processMouseMotionEvent(ev);
239     }
240 
241     /**
242      * Make this method accessible in this Package.
243      */
processComponentEvent(ComponentEvent e)244     protected final void processComponentEvent(ComponentEvent e)
245     {
246       super.processComponentEvent(e);
247     }
248 
249     /**
250      * Make this method accessible in this Package.
251      */
processFocusEvent(FocusEvent e)252     protected final void processFocusEvent(FocusEvent e)
253     {
254       super.processFocusEvent(e);
255     }
256 
257     /**
258      * Make this method accessible in this Package.
259      */
processHierarchyBoundsEvent(HierarchyEvent e)260     protected final void processHierarchyBoundsEvent(HierarchyEvent e)
261     {
262       super.processHierarchyBoundsEvent(e);
263     }
264 
265     /**
266      * Make this method accessible in this Package.
267      */
processHierarchyEvent(HierarchyEvent e)268     protected final void processHierarchyEvent(HierarchyEvent e)
269     {
270       super.processHierarchyEvent(e);
271     }
272 
273     /**
274      * Make this method accessible in this Package.
275      */
processInputMethodEvent(InputMethodEvent e)276     protected final void processInputMethodEvent(InputMethodEvent e)
277     {
278       super.processInputMethodEvent(e);
279     }
280 
281     /**
282      * Make this method accessible in this Package.
283      */
processMouseEvent(MouseEvent e)284     protected final void processMouseEvent(MouseEvent e)
285     {
286       super.processMouseEvent(e);
287     }
288 
289     /**
290      * Make this method accessible in this Package.
291      */
processMouseWheelEvent(MouseWheelEvent e)292     protected final void processMouseWheelEvent(MouseWheelEvent e)
293     {
294       super.processMouseWheelEvent(e);
295     }
296 
297     /**
298      * Make this method accessible in this Package.
299      */
processKeyEvent(KeyEvent e)300     protected final void processKeyEvent(KeyEvent e)
301     {
302       super.processKeyEvent(e);
303     }
304 
requestFocus()305     public void requestFocus() {
306       SwingTextAreaPeer.this.requestFocus(awtComponent, false, true, 0);
307     }
308 
requestFocus(boolean temporary)309     public boolean requestFocus(boolean temporary) {
310       return SwingTextAreaPeer.this.requestFocus(awtComponent, temporary,
311                                                  true, 0);
312     }
313   }
314 
315   /**
316    * The actual JTextArea.
317    */
318   private SwingTextArea jTextArea;
319 
SwingTextAreaPeer(TextArea textArea)320   public SwingTextAreaPeer(TextArea textArea)
321   {
322     super();
323     jTextArea = new SwingTextArea();
324     SwingScrollPane swingArea = new SwingScrollPane(jTextArea);
325     init(textArea, swingArea);
326 
327     JViewport viewport = new JViewport()
328       {
329         public Image createImage(int width, int height)
330         {
331           return awtComponent.createImage(width, height);
332         }
333       };
334 
335     viewport.setView(jTextArea);
336     swingArea.setViewport(viewport);
337     // Pull over the text from the text area.
338     setText(textArea.getText());
339 
340     // Pull over the number of rows and columns
341     // if non were set use default values
342     int columns = textArea.getColumns();
343     int rows = textArea.getRows();
344 
345     if(columns == 0 && rows == 0)
346       {
347         columns = 25;
348         textArea.setColumns(columns);
349         rows = 5;
350         textArea.setRows(rows);
351       }
352 
353     jTextArea.setColumns(columns);
354     jTextArea.setRows(rows);
355   }
356 
getMinimumSize(int rows, int cols)357   public Dimension getMinimumSize(int rows, int cols)
358   {
359     return jTextArea.getMinimumSize();
360   }
361 
getPreferredSize(int rows, int cols)362   public Dimension getPreferredSize(int rows, int cols)
363   {
364     return jTextArea.getPreferredSize();
365   }
366 
insert(String text, int pos)367   public void insert(String text, int pos)
368   {
369     jTextArea.insert(text, pos);
370   }
371 
insertText(String text, int pos)372   public void insertText(String text, int pos)
373   {
374     jTextArea.insert(text, pos);
375   }
376 
minimumSize()377   public Dimension minimumSize()
378   {
379     return jTextArea.getMinimumSize();
380   }
381 
preferredSize()382   public Dimension preferredSize()
383   {
384     return jTextArea.getPreferredSize();
385   }
386 
minimumSize(int rows, int cols)387   public Dimension minimumSize(int rows, int cols)
388   {
389       return jTextArea.getMinimumSize();
390   }
391 
preferredSize(int rows, int cols)392   public Dimension preferredSize(int rows, int cols)
393   {
394       return jTextArea.getPreferredSize();
395   }
396 
replaceRange(String text, int start, int end)397   public void replaceRange(String text, int start, int end)
398   {
399     jTextArea.replaceRange(text, start, end);
400   }
401 
replaceText(String text, int start, int end)402   public void replaceText(String text, int start, int end)
403   {
404     jTextArea.replaceRange(text, start, end);
405   }
406 
filterEvents(long filter)407   public long filterEvents(long filter)
408   {
409     // TODO Auto-generated method stub
410     return 0;
411   }
412 
getCaretPosition()413   public int getCaretPosition()
414   {
415     return jTextArea.getCaretPosition();
416   }
417 
getCharacterBounds(int pos)418   public Rectangle getCharacterBounds(int pos)
419   {
420     Rectangle r;
421     try
422       {
423         return jTextArea.modelToView(pos);
424       }
425     catch (BadLocationException ex)
426       {
427         r = null;
428       }
429     return r;
430   }
431 
getIndexAtPoint(int x, int y)432   public int getIndexAtPoint(int x, int y)
433   {
434     return jTextArea.viewToModel(new Point(x, y));
435   }
436 
getInputMethodRequests()437   public InputMethodRequests getInputMethodRequests()
438   {
439     // TODO Auto-generated method stub
440     return null;
441   }
442 
getSelectionEnd()443   public int getSelectionEnd()
444   {
445     return jTextArea.getSelectionEnd();
446   }
447 
getSelectionStart()448   public int getSelectionStart()
449   {
450     return jTextArea.getSelectionStart();
451   }
452 
getText()453   public String getText()
454   {
455     return jTextArea.getText();
456   }
457 
select(int start, int end)458   public void select(int start, int end)
459   {
460     jTextArea.select(start, end);
461   }
462 
setCaretPosition(int pos)463   public void setCaretPosition(int pos)
464   {
465     jTextArea.setCaretPosition(pos);
466   }
467 
setEditable(boolean editable)468   public void setEditable(boolean editable)
469   {
470     jTextArea.setEditable(editable);
471   }
472 
setText(String text)473   public void setText(String text)
474   {
475     jTextArea.setText(text);
476   }
477 
reshape(int x, int y, int width, int height)478   public void reshape(int x, int y, int width, int height)
479   {
480     if (swingComponent != null)
481       {
482         swingComponent.getJComponent().setBounds(x, y, width, height);
483         swingComponent.getJComponent().validate();
484       }
485   }
486 
487 }
488