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