OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [classpath/] [gnu/] [java/] [awt/] [peer/] [swing/] [SwingComponentPeer.java] - Blame information for rev 769

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 769 jeremybenn
/* SwingComponentPeer.java -- An abstract base class for Swing based peers
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.AWTEvent;
41
import java.awt.AWTException;
42
import java.awt.BufferCapabilities;
43
import java.awt.Color;
44
import java.awt.Component;
45
import java.awt.Container;
46
import java.awt.Cursor;
47
import java.awt.Dimension;
48
import java.awt.EventQueue;
49
import java.awt.Font;
50
import java.awt.FontMetrics;
51
import java.awt.Graphics;
52
import java.awt.GraphicsConfiguration;
53
import java.awt.Image;
54
import java.awt.Point;
55
import java.awt.Rectangle;
56
import java.awt.Toolkit;
57
import java.awt.BufferCapabilities.FlipContents;
58
import java.awt.event.FocusEvent;
59
import java.awt.event.KeyEvent;
60
import java.awt.event.MouseEvent;
61
import java.awt.event.PaintEvent;
62
import java.awt.image.ColorModel;
63
import java.awt.image.ImageObserver;
64
import java.awt.image.ImageProducer;
65
import java.awt.image.VolatileImage;
66
import java.awt.peer.ComponentPeer;
67
import java.awt.peer.ContainerPeer;
68
import java.awt.peer.LightweightPeer;
69
 
70
import javax.swing.JComponent;
71
import javax.swing.RepaintManager;
72
 
73
/**
74
 * The base class for Swing based component peers. This provides the basic
75
 * functionality needed for Swing based component peers. Many methods are
76
 * implemented to forward to the Swing component. Others however forward
77
 * to the component's parent and expect the toplevel component peer to provide
78
 * a real implementation of it. These are for example the key methods
79
 * {@link #getGraphics()} and {@link #createImage(int, int)}, as well as
80
 * {@link #getLocationOnScreen()}.
81
 *
82
 * This class also provides the necesary hooks into the Swing painting and
83
 * event handling system. In order to achieve this, it traps paint, mouse and
84
 * key events in {@link #handleEvent(AWTEvent)} and calls some special methods
85
 * ({@link #peerPaint(Graphics)}, {@link #handleKeyEvent(KeyEvent)},
86
 * {@link #handleMouseEvent(MouseEvent)} and
87
 * {@link #handleMouseMotionEvent(MouseEvent)}) that call the corresponding
88
 * Swing methods.
89
 *
90
 * @author Roman Kennke (kennke@aicas.com)
91
 */
92
public class SwingComponentPeer
93
  implements ComponentPeer
94
{
95
 
96
  /**
97
   * The AWT component for this peer.
98
   */
99
  protected Component awtComponent;
100
 
101
  /**
102
   * The Swing component for this peer.
103
   */
104
  protected SwingComponent swingComponent;
105
 
106
  /**
107
   * The font that is set for this peer.
108
   */
109
  protected Font peerFont;
110
 
111
  /**
112
   * The current repaint area.
113
   */
114
  protected Rectangle paintArea;
115
 
116
 /**
117
   * Creates a SwingComponentPeer instance. Subclasses are expected to call
118
   * this constructor and thereafter call {@link #init(Component, JComponent)}
119
   * in order to setup the AWT and Swing components properly.
120
   */
121
  protected SwingComponentPeer()
122
  {
123
    // Nothing to do here.
124
  }
125
 
126
  /**
127
   * Initializes the AWT and Swing component for this peer. It is expected that
128
   * subclasses call this from within their constructor.
129
   *
130
   * @param awtComp the AWT component for this peer
131
   * @param swingComp the Swing component for this peer
132
   */
133
  protected void init(Component awtComp, SwingComponent swingComp)
134
  {
135
    awtComponent = awtComp;
136
    swingComponent = swingComp;
137
    if (swingComponent != null)
138
      {
139
        JComponent c = swingComponent.getJComponent();
140
        if (c != null)
141
          {
142
            c.addNotify();
143
            RepaintManager.currentManager(c).setDoubleBufferingEnabled(false);
144
            System.setProperty("gnu.awt.swing.doublebuffering", "true");
145
          }
146
      }
147
 
148
    // Register this heavyweight component with the nearest heavyweight
149
    // container, so we get peerPaint() triggered by that container.
150
    if (! (this instanceof LightweightPeer))
151
      {
152
        Component comp = awtComponent;
153
        Container parent = comp.getParent();
154
        while (parent != null &&
155
               ! (parent.getPeer() instanceof SwingContainerPeer))
156
          {
157
            comp = parent;
158
            parent = comp.getParent();
159
          }
160
 
161
        // At this point we have the ancestor with a SwingContainerPeer
162
        // (or null peer).
163
        if (parent != null && parent.getPeer() instanceof SwingContainerPeer)
164
          {
165
            SwingContainerPeer p = (SwingContainerPeer) parent.getPeer();
166
            p.addHeavyweightDescendent(awtComponent);
167
          }
168
      }
169
  }
170
 
171
  /**
172
   * Returns the construction status of the specified image. This is called
173
   * by {@link Component#checkImage(Image, int, int, ImageObserver)}.
174
   *
175
   * @param img the image
176
   * @param width the width of the image
177
   * @param height the height of the image
178
   * @param ob the image observer to be notified of updates of the status
179
   *
180
   * @return a bitwise ORed set of ImageObserver flags
181
   */
182
  public int checkImage(Image img, int width, int height, ImageObserver ob)
183
  {
184
    return Toolkit.getDefaultToolkit().checkImage(img, width, height, ob);
185
  }
186
 
187
  /**
188
   * Creates an image by starting the specified image producer. This is called
189
   * by {@link Component#createImage(ImageProducer)}.
190
   *
191
   * @param prod the image producer to be used to create the image
192
   *
193
   * @return the created image
194
   */
195
  public Image createImage(ImageProducer prod)
196
  {
197
    Image image = Toolkit.getDefaultToolkit().createImage(prod);
198
        return image;
199
  }
200
 
201
  /**
202
   * Creates an empty image with the specified <code>width</code> and
203
   * <code>height</code>.
204
   *
205
   * This is implemented to let the parent component create the image. This
206
   * eventually goes up to the top-level component peer, which is then expected
207
   * to deliver the image.
208
   *
209
   * @param width the width of the image to be created
210
   * @param height the height of the image to be created
211
   *
212
   * @return the created image
213
   */
214
  public Image createImage(int width, int height)
215
  {
216
    Component parent = awtComponent.getParent();
217
    ComponentPeer parentPeer = parent.getPeer();
218
    return parentPeer.createImage(width, height);
219
  }
220
 
221
  /**
222
   * Disables the component. This is called by {@link Component#disable()}.
223
   */
224
  public void disable()
225
  {
226
    if (swingComponent != null)
227
      swingComponent.getJComponent().setEnabled(false);
228
  }
229
 
230
  /**
231
   * Disposes the component peer. This should release all resources held by the
232
   * peer. This is called when the component is no longer in use.
233
   */
234
  public void dispose()
235
  {
236
    // Unregister this heavyweight component from the nearest heavyweight
237
    // container.
238
    if (! (this instanceof LightweightPeer))
239
      {
240
        Component comp = awtComponent;
241
        Container parent = comp.getParent();
242
        while (parent != null &&
243
               ! (parent.getPeer() instanceof SwingContainerPeer))
244
          {
245
            comp = parent;
246
            parent = comp.getParent();
247
          }
248
 
249
        // At this point we have the ancestor with a SwingContainerPeer
250
        // (or null peer).
251
        if (parent != null && parent.getPeer() instanceof SwingContainerPeer)
252
          {
253
            SwingContainerPeer p = (SwingContainerPeer) parent.getPeer();
254
            p.removeHeavyweightDescendent(awtComponent);
255
          }
256
      }
257
 
258
    awtComponent = null;
259
    swingComponent = null;
260
  }
261
 
262
  /**
263
   * Enables the component. This is called by {@link Component#enable()}.
264
   */
265
  public void enable()
266
  {
267
    if (swingComponent != null)
268
      swingComponent.getJComponent().setEnabled(true);
269
  }
270
 
271
  /**
272
   * Returns the color model of the component. This is currently not used.
273
   *
274
   * @return the color model of the component
275
   */
276
  public ColorModel getColorModel()
277
  {
278
    // FIXME: When this peer method will be used, we need to provide an
279
    // implementation of this, probably forwarding to the toplevel peer, like
280
    // in the other methods.
281
    return null;
282
  }
283
 
284
  /**
285
   * Returns the font metrics for the specified font. This is called by
286
   * {@link Component#getFontMetrics(Font)}.
287
   *
288
   * This is implemented to query the font metrics from the parent component.
289
   * This will eventually call the top-level component peer, which is then
290
   * expected to deliver a font metrics object.
291
   *
292
   * @param f the font for which to query the font metrics
293
   *
294
   * @return the font metrics for the specified font
295
   */
296
  public FontMetrics getFontMetrics(Font f)
297
  {
298
    Component parent = awtComponent.getParent();
299
    ComponentPeer parentPeer = parent.getPeer();
300
    return parentPeer.getFontMetrics(f);
301
  }
302
 
303
  /**
304
   * Returns a {@link Graphics} object suitable for drawing on this component.
305
   * This is called by {@link Component#getGraphics()}.
306
   *
307
   * This is implemented to query the graphics from the parent component and
308
   * adjust the clip and translation to match this component.
309
   * This will eventually call the top-level component peer, which is then
310
   * expected to deliver a graphics object.
311
   *
312
   * @return a graphics object suitable for drawing on this component
313
   */
314
  public Graphics getGraphics()
315
  {
316
    Component parent = awtComponent.getParent();
317
    Graphics g = parent.getGraphics();
318
    g.translate(awtComponent.getX(), awtComponent.getY());
319
    g.setClip(0, 0, awtComponent.getWidth(), awtComponent.getHeight());
320
    return g;
321
  }
322
 
323
  /**
324
   * Returns the location of this component in screen coordinates. This is
325
   * called by {@link Component#getLocationOnScreen()}.
326
   *
327
   * This is implemented to query the parent component peer for its screen
328
   * location and adds the offset of this component to it. This will eventually
329
   * call the top-level component's peer, which is then expected to provide
330
   * it's screen location.
331
   *
332
   * @return the location of this component in screen coordinates
333
   */
334
  public Point getLocationOnScreen()
335
  {
336
    Component parent = awtComponent.getParent();
337
    ComponentPeer parentPeer = parent.getPeer();
338
    Point location = parentPeer.getLocationOnScreen();
339
    location.x += awtComponent.getX();
340
    location.y += awtComponent.getY();
341
    return location;
342
  }
343
 
344
  /**
345
   * Returns the minimum size for the component. This is called by
346
   * {@link Component#getMinimumSize()}.
347
   *
348
   * This is implemented to return the Swing component's minimum size.
349
   *
350
   * @return the minimum size for the component
351
   */
352
  public Dimension getMinimumSize()
353
  {
354
    return minimumSize();
355
  }
356
 
357
  /**
358
   * Returns the preferred size for the component. This is called by
359
   * {@link Component#getPreferredSize()}.
360
   *
361
   * This is implemented to return the Swing component's preferred size.
362
   *
363
   * @return the preferred size for the component
364
   */
365
  public Dimension getPreferredSize()
366
  {
367
    return preferredSize();
368
  }
369
 
370
  /**
371
   * Returns the toolkit that created this peer.
372
   *
373
   * @return the toolkit that created this peer
374
   */
375
  public Toolkit getToolkit()
376
  {
377
    return Toolkit.getDefaultToolkit();
378
  }
379
 
380
  /**
381
   * Handles the given event. This is called from
382
   * {@link Component#dispatchEvent(AWTEvent)} to give the peer a chance to
383
   * react to events for the component.
384
   *
385
   * @param e the event
386
   */
387
  public void handleEvent(AWTEvent e)
388
  {
389
    switch (e.getID())
390
      {
391
      case PaintEvent.UPDATE:
392
      case PaintEvent.PAINT:
393
        if (awtComponent.isShowing())
394
          {
395
            Rectangle clip ;
396
            synchronized (this)
397
              {
398
                coalescePaintEvent((PaintEvent) e);
399
                assert paintArea != null;
400
                clip = paintArea;
401
                paintArea = null;
402
              }
403
            Graphics g = awtComponent.getGraphics();
404
            try
405
              {
406
                g.clipRect(clip.x, clip.y, clip.width, clip.height);
407
                peerPaint(g, e.getID() == PaintEvent.UPDATE);
408
              }
409
            finally
410
              {
411
                g.dispose();
412
              }
413
          }
414
        break;
415
      case MouseEvent.MOUSE_PRESSED:
416
      case MouseEvent.MOUSE_RELEASED:
417
      case MouseEvent.MOUSE_CLICKED:
418
      case MouseEvent.MOUSE_ENTERED:
419
      case MouseEvent.MOUSE_EXITED:
420
        handleMouseEvent((MouseEvent) e);
421
        break;
422
      case MouseEvent.MOUSE_MOVED:
423
      case MouseEvent.MOUSE_DRAGGED:
424
        handleMouseMotionEvent((MouseEvent) e);
425
        break;
426
      case KeyEvent.KEY_PRESSED:
427
      case KeyEvent.KEY_RELEASED:
428
      case KeyEvent.KEY_TYPED:
429
        handleKeyEvent((KeyEvent) e);
430
        break;
431
      case FocusEvent.FOCUS_GAINED:
432
      case FocusEvent.FOCUS_LOST:
433
        handleFocusEvent((FocusEvent)e);
434
        break;
435
      default:
436
        // Other event types are not handled here.
437
        break;
438
      }
439
  }
440
 
441
  /**
442
   * Makes the component invisible. This is called from
443
   * {@link Component#hide()}.
444
   *
445
   * This is implemented to call setVisible(false) on the Swing component.
446
   */
447
  public void hide()
448
  {
449
    if (swingComponent != null)
450
      swingComponent.getJComponent().setVisible(false);
451
 
452
    Component parent = awtComponent.getParent();
453
    if (parent != null)
454
      parent.repaint(awtComponent.getX(), awtComponent.getY(),
455
                     awtComponent.getWidth(), awtComponent.getHeight());
456
  }
457
 
458
  /**
459
   * Returns <code>true</code> if the component can receive keyboard input
460
   * focus. This is called from {@link Component#isFocusTraversable()}.
461
   *
462
   * This is implemented to return isFocusable() from the Swing component.
463
   *
464
   * @specnote Part of the earlier 1.1 API, replaced by isFocusable().
465
   */
466
  public boolean isFocusTraversable()
467
  {
468
    return swingComponent != null ?
469
             swingComponent.getJComponent().isFocusable() : false;
470
  }
471
 
472
  /**
473
   * Returns <code>true</code> if the component can receive keyboard input
474
   * focus. This is called from {@link Component#isFocusable()}.
475
   *
476
   * This is implemented to return isFocusable() from the Swing component.
477
   */
478
  public boolean isFocusable()
479
  {
480
    return swingComponent != null ?
481
             swingComponent.getJComponent().isFocusable() : false;
482
  }
483
 
484
  /**
485
   * Returns the minimum size for the component. This is called by
486
   * {@link Component#minimumSize()}.
487
   *
488
   * This is implemented to return the Swing component's minimum size.
489
   *
490
   * @return the minimum size for the component
491
   */
492
  public Dimension minimumSize()
493
  {
494
    Dimension retVal;
495
    if (swingComponent != null)
496
      retVal = swingComponent.getJComponent().getMinimumSize();
497
    else
498
      retVal = new Dimension(0, 0);
499
    return retVal;
500
  }
501
 
502
  /**
503
   * Returns the preferred size for the component. This is called by
504
   * {@link Component#getPreferredSize()}.
505
   *
506
   * This is implemented to return the Swing component's preferred size.
507
   *
508
   * @return the preferred size for the component
509
   */
510
  public Dimension preferredSize()
511
  {
512
    Dimension retVal;
513
    if (swingComponent != null)
514
      retVal = swingComponent.getJComponent().getPreferredSize();
515
    else
516
      retVal = new Dimension(0, 0);
517
    return retVal;
518
  }
519
 
520
  /**
521
   * Paints the component. This is triggered by
522
   * {@link Component#paintAll(Graphics)}.
523
   *
524
   * @param graphics the graphics to paint with
525
   */
526
  public void paint(Graphics graphics)
527
  {
528
    peerPaint(graphics, false);
529
  }
530
 
531
  /**
532
   * Prepares an image for rendering on this component. This is called by
533
   * {@link Component#prepareImage(Image, int, int, ImageObserver)}.
534
   *
535
   * @param img the image to prepare
536
   * @param width the desired width of the rendered image
537
   * @param height the desired height of the rendered image
538
   * @param ob the image observer to be notified of updates in the preparation
539
   *        process
540
   *
541
   * @return <code>true</code> if the image has been fully prepared,
542
   *         <code>false</code> otherwise (in which case the image observer
543
   *         receives updates)
544
   */
545
  public boolean prepareImage(Image img, int width, int height, ImageObserver ob)
546
  {
547
    Component parent = awtComponent.getParent();
548
    if(parent != null)
549
    {
550
      ComponentPeer parentPeer = parent.getPeer();
551
      return parentPeer.prepareImage(img, width, height, ob);
552
    }
553
    else
554
    {
555
      return Toolkit.getDefaultToolkit().prepareImage(img, width, height, ob);
556
    }
557
  }
558
 
559
  public void print(Graphics graphics)
560
  {
561
    // FIXME: I don't know what this method is supposed to do.
562
  }
563
 
564
  /**
565
   * Repaints the specified rectangle of this component. This is called from
566
   * {@link Component#repaint(long, int, int, int, int)}.
567
   *
568
   * This is implemented to call repaint() on the Swing component.
569
   *
570
   * @param tm number of milliseconds to wait with repainting
571
   * @param x the X coordinate of the upper left corner of the damaged
572
   *        rectangle
573
   * @param y the Y coordinate of the upper left corner of the damaged
574
   *        rectangle
575
   * @param width the width of the damaged rectangle
576
   * @param height the height of the damaged rectangle
577
   */
578
  public void repaint(long tm, int x, int y, int width, int height)
579
  {
580
    // NOTE: This is never called by AWT but is mandated by the peer interface.
581
    if (swingComponent != null)
582
      swingComponent.getJComponent().repaint(tm, x, y, width, height);
583
    else
584
      {
585
        PaintEvent ev = new PaintEvent(awtComponent, PaintEvent.UPDATE,
586
                                       new Rectangle(x, y, width, height));
587
        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ev);
588
      }
589
  }
590
 
591
  /**
592
   * Requests that this component receives the focus. This is called from
593
   * {@link Component#requestFocus()}.
594
   *
595
   * This calls requestFocus() on the Swing component.
596
   *
597
   * @specnote Part of the earlier 1.1 API, apparently replaced by argument
598
   *           form of the same method.
599
   */
600
  public void requestFocus()
601
  {
602
    // NOTE: This is never called by AWT but is mandated by the peer interface.
603
    Toolkit tk = Toolkit.getDefaultToolkit();
604
    EventQueue q = tk.getSystemEventQueue();
605
    q.postEvent(new FocusEvent(awtComponent, FocusEvent.FOCUS_GAINED, false));
606
  }
607
 
608
  /**
609
   * Requests that this component receives the focus. This is called from
610
   * {@link Component#requestFocus()}.
611
   *
612
   * This calls requestFocus() on the Swing component.
613
   *
614
   * @param source the actual component that requests focus (may be a
615
   *        lightweight descendant of the heavyweight container)
616
   * @param tmp true when the change is temporary
617
   * @param allowWindowFocus
618
   * @param tm the timestamp of the focus change
619
   *
620
   * @return true when the focus change is guaranteed to be granted, false
621
   *         otherwise
622
   */
623
  public boolean requestFocus(Component source, boolean tmp,
624
                              boolean allowWindowFocus, long tm)
625
  {
626
    Toolkit tk = Toolkit.getDefaultToolkit();
627
    EventQueue q = tk.getSystemEventQueue();
628
    q.postEvent(new FocusEvent(source, FocusEvent.FOCUS_GAINED, tmp));
629
    return true;
630
  }
631
 
632
  /**
633
   * Notifies the peer that the bounds of this component have changed. This
634
   * is called by {@link Component#reshape(int, int, int, int)}.
635
   *
636
   * This is implemented to call setBounds() on the Swing component.
637
   *
638
   * @param x the X coordinate of the upper left corner of the component
639
   * @param y the Y coordinate of the upper left corner of the component
640
   * @param width the width of the component
641
   * @param height the height of the component
642
   */
643
  public void reshape(int x, int y, int width, int height)
644
  {
645
    if (swingComponent != null)
646
      swingComponent.getJComponent().setBounds(x, y, width, height);
647
  }
648
 
649
  /**
650
   * Sets the background color of the component. This is called by
651
   * {@link Component#setBackground(Color)}.
652
   *
653
   * This is implemented to call setBackground() on the Swing component.
654
   *
655
   * @param color the background color to set
656
   */
657
  public void setBackground(Color color)
658
  {
659
    if (swingComponent != null)
660
      swingComponent.getJComponent().setBackground(color);
661
  }
662
 
663
  /**
664
   * Notifies the peer that the bounds of this component have changed. This
665
   * is called by {@link Component#setBounds(int, int, int, int)}.
666
   *
667
   * This is implemented to call setBounds() on the Swing component.
668
   *
669
   * @param x the X coordinate of the upper left corner of the component
670
   * @param y the Y coordinate of the upper left corner of the component
671
   * @param width the width of the component
672
   * @param height the height of the component
673
   */
674
  public void setBounds(int x, int y, int width, int height)
675
  {
676
    reshape(x, y, width, height);
677
  }
678
 
679
  /**
680
   * Sets the cursor of the component. This is called by
681
   * {@link Component#setCursor(Cursor)}.
682
   *
683
   * This is implemented to call setCursor() on the Swing component.
684
   *
685
   * @specnote Part of the earlier 1.1 API, apparently no longer needed.
686
   */
687
  public void setCursor(Cursor cursor)
688
  {
689
    if (swingComponent != null)
690
      swingComponent.getJComponent().setCursor(cursor);
691
  }
692
 
693
  /**
694
   * Sets the enabled/disabled state of this component. This is called by
695
   * {@link Component#setEnabled(boolean)}.
696
   *
697
   * This is implemented to call setEnabled() on the Swing component.
698
   *
699
   * @param enabled <code>true</code> to enable the component,
700
   *        <code>false</code> to disable it
701
   */
702
  public void setEnabled(boolean enabled)
703
  {
704
    if (swingComponent != null)
705
      swingComponent.getJComponent().setEnabled(enabled);
706
  }
707
 
708
  /**
709
   * Sets the font of the component. This is called by
710
   * {@link Component#setFont(Font)}.
711
   *
712
   * This is implemented to call setFont() on the Swing component.
713
   *
714
   * @param font the font to set
715
   */
716
  public void setFont(Font font)
717
  {
718
    peerFont = font;
719
    if (swingComponent != null)
720
      swingComponent.getJComponent().setFont(font);
721
  }
722
 
723
  /**
724
   * Sets the foreground color of the component. This is called by
725
   * {@link Component#setForeground(Color)}.
726
   *
727
   * This is implemented to call setForeground() on the Swing component.
728
   *
729
   * @param color the foreground color to set
730
   */
731
  public void setForeground(Color color)
732
  {
733
    if (swingComponent != null)
734
      swingComponent.getJComponent().setForeground(color);
735
  }
736
 
737
  /**
738
   * Sets the visibility state of the component. This is called by
739
   * {@link Component#setVisible(boolean)}.
740
   *
741
   * This is implemented to call setVisible() on the Swing component.
742
   *
743
   * @param visible <code>true</code> to make the component visible,
744
   *        <code>false</code> to make it invisible
745
   */
746
  public void setVisible(boolean visible)
747
  {
748
    if (visible)
749
      show();
750
    else
751
      hide();
752
  }
753
 
754
  /**
755
   * Makes the component visible. This is called by {@link Component#show()}.
756
   *
757
   * This is implemented to call setVisible(true) on the Swing component.
758
   */
759
  public void show()
760
  {
761
    if (swingComponent != null)
762
      swingComponent.getJComponent().setVisible(true);
763
  }
764
 
765
  /**
766
   * Get the graphics configuration of the component. The color model
767
   * of the component can be derived from the configuration.
768
   *
769
   * This is implemented to return the GraphicsConfiguration of the parent
770
   * component. This will eventually call the toplevel component peer, which
771
   * is expected to provide a real implementation.
772
   *
773
   * @return the graphics configuration of the component
774
   */
775
  public GraphicsConfiguration getGraphicsConfiguration()
776
  {
777
    Component parent = awtComponent.getParent();
778
    ComponentPeer parentPeer = parent.getPeer();
779
    return parentPeer.getGraphicsConfiguration();
780
  }
781
 
782
  /**
783
   * Part of an older API, no longer needed.
784
   */
785
  public void setEventMask(long mask)
786
  {
787
    // Nothing to do here.
788
  }
789
 
790
  /**
791
   * Returns <code>true</code> if this component has been obscured,
792
   * <code>false</code> otherwise. This will only work if
793
   * {@link #canDetermineObscurity()} also returns <code>true</code>.
794
   *
795
   * This is not yet implemented.
796
   *
797
   * @return <code>true</code> if this component has been obscured,
798
   *         <code>false</code> otherwise.
799
   */
800
  public boolean isObscured()
801
  {
802
    return false;
803
  }
804
 
805
  /**
806
   * Returns <code>true</code> if this component peer can determine if the
807
   * component has been obscured, <code>false</code> otherwise.
808
   *
809
   * This is not yet implemented.
810
   *
811
   * @return <code>true</code> if this component peer can determine if the
812
   *         component has been obscured, <code>false</code> otherwise
813
   */
814
  public boolean canDetermineObscurity()
815
  {
816
    return false;
817
  }
818
 
819
  /**
820
   * Coalesces the specified paint event.
821
   *
822
   * @param e the paint event
823
   */
824
  public void coalescePaintEvent(PaintEvent e)
825
  {
826
    synchronized (this)
827
      {
828
        Rectangle newRect = e.getUpdateRect();
829
        if (paintArea == null)
830
          paintArea = newRect;
831
        else
832
          Rectangle.union(paintArea, newRect, paintArea);
833
      }
834
  }
835
 
836
  /**
837
   * Updates the cursor. This is not yet implemented.
838
   */
839
  public void updateCursorImmediately()
840
  {
841
    // Nothing to do here yet.
842
  }
843
 
844
  /**
845
   * Returns true, if this component can handle wheel scrolling,
846
   * <code>false</code> otherwise.
847
   *
848
   * This is not yet implemented and returns <code>false</code>.
849
   *
850
   * @return true, if this component can handle wheel scrolling,
851
   *         <code>false</code> otherwise
852
   */
853
  public boolean handlesWheelScrolling()
854
  {
855
    return false;
856
  }
857
 
858
  /**
859
   * A convenience method that creates a volatile image.  The volatile
860
   * image is created on the screen device on which this component is
861
   * displayed, in the device's current graphics configuration.
862
   *
863
   * This is implemented to let the parent component peer create an image.
864
   * This eventually ends up in the toplevel component peer, which is then
865
   * responsible for creating the real image.
866
   *
867
   * @param width width of the image
868
   * @param height height of the image
869
   *
870
   * @see VolatileImage
871
   *
872
   * @since 1.2
873
   */
874
  public VolatileImage createVolatileImage(int width, int height)
875
  {
876
    Component parent = awtComponent.getParent();
877
    VolatileImage im = null;
878
    if (parent != null)
879
      {
880
        ComponentPeer parentPeer = parent.getPeer();
881
        im = parentPeer.createVolatileImage(width, height);
882
      }
883
    return im;
884
  }
885
 
886
  /**
887
   * Create a number of image buffers that implement a buffering
888
   * strategy according to the given capabilities.
889
   *
890
   * This is implemented to forward to the parent component peer. Eventually
891
   * this ends up in the top level component peer, which is then responsible
892
   * for doing the real work.
893
   *
894
   * @param numBuffers the number of buffers
895
   * @param caps the buffering capabilities
896
   *
897
   * @throws AWTException if the specified buffering strategy is not
898
   * implemented
899
   *
900
   * @since 1.2
901
   */
902
  public void createBuffers(int numBuffers, BufferCapabilities caps) throws AWTException
903
  {
904
    Component parent = awtComponent.getParent();
905
    ComponentPeer parentPeer = parent.getPeer();
906
    parentPeer.createBuffers(numBuffers, caps);
907
  }
908
 
909
  /**
910
   * Return the back buffer of this component.
911
   *
912
   * This is implemented to forward to the parent. Eventually this ends
913
   * up in the toplevel component, which is then responsible for providing
914
   * a back buffer.
915
   *
916
   * @return the back buffer of this component.
917
   *
918
   * @since 1.2
919
   */
920
  public Image getBackBuffer()
921
  {
922
    Component parent = awtComponent.getParent();
923
    ComponentPeer parentPeer = parent.getPeer();
924
    return parentPeer.getBackBuffer();
925
  }
926
 
927
  /**
928
   * Perform a page flip, leaving the contents of the back buffer in
929
   * the specified state.
930
   *
931
   * This is implemented to forward to the parent. Eventually this ends
932
   * up in the toplevel component, which is then responsible for doing the real
933
   * work.
934
   *
935
   * @param contents the state in which to leave the back buffer
936
   *
937
   * @since 1.2
938
   */
939
  public void flip(FlipContents contents)
940
  {
941
    Component parent = awtComponent.getParent();
942
    ComponentPeer parentPeer = parent.getPeer();
943
    parentPeer.flip(contents);
944
  }
945
 
946
  /**
947
   * Destroy the resources created by createBuffers.
948
   *
949
   * This is implemented to forward to the parent component peer. Eventually
950
   * this ends up in the top level component peer, which is then responsible
951
   * for doing the real work.
952
   *
953
   * @since 1.2
954
   */
955
  public void destroyBuffers()
956
  {
957
    Component parent = awtComponent.getParent();
958
    ComponentPeer parentPeer = parent.getPeer();
959
    parentPeer.destroyBuffers();
960
  }
961
 
962
  /**
963
   * Get the bounds of this component peer.
964
   *
965
   * This is implemented to forward to the Swing component.
966
   *
967
   * @return component peer bounds
968
   * @since 1.5
969
   */
970
  public Rectangle getBounds()
971
  {
972
    Rectangle retVal;
973
    if (swingComponent != null)
974
      retVal = swingComponent.getJComponent().getBounds();
975
    else
976
      retVal = new Rectangle();
977
    return retVal;
978
  }
979
 
980
  /**
981
   * Reparent this component under another container.
982
   *
983
   * @param parent
984
   * @since 1.5
985
   */
986
  public void reparent(ContainerPeer parent)
987
  {
988
    // Nothing to do here.
989
  }
990
 
991
  /**
992
   * Set the bounds of this component peer.
993
   *
994
   * This is implemented to forward to the swing component.
995
   *
996
   * @param x the new x co-ordinate
997
   * @param y the new y co-ordinate
998
   * @param width the new width
999
   * @param height the new height
1000
   * @param z the new stacking level
1001
   * @since 1.5
1002
   */
1003
  public void setBounds(int x, int y, int width, int height, int z)
1004
  {
1005
    if (swingComponent != null)
1006
      swingComponent.getJComponent().setBounds(x, y, width, height);
1007
    // FIXME: Somehow handle the Z order.
1008
  }
1009
 
1010
  /**
1011
   * Check if this component supports being reparented.
1012
   *
1013
   * @return true if this component can be reparented,
1014
   * false otherwise.
1015
   * @since 1.5
1016
   */
1017
  public boolean isReparentSupported()
1018
  {
1019
    return true;
1020
  }
1021
 
1022
 
1023
  /**
1024
   * Layout this component peer.
1025
   *
1026
   * @since 1.5
1027
   */
1028
  public void layout()
1029
  {
1030
    if (swingComponent != null)
1031
      swingComponent.getJComponent().doLayout();
1032
  }
1033
 
1034
  /**
1035
   * Triggers 'heavyweight' painting of the components. This usually calls
1036
   * paint() on the Swing component.
1037
   *
1038
   * @param g the graphics context to use for painting
1039
   * @param update wether we need to call update or paint on the AWT component
1040
   */
1041
  protected void peerPaint(Graphics g, boolean update)
1042
  {
1043
    peerPaintComponent(g);
1044
 
1045
    Graphics userGraphics = g.create();
1046
    try{
1047
    if (update)
1048
      awtComponent.update(userGraphics);
1049
    else
1050
      awtComponent.paint(userGraphics);
1051
    } finally {
1052
        userGraphics.dispose();
1053
    }
1054
 
1055
  }
1056
 
1057
  /**
1058
   * Paints the actual 'heavyweight' swing component, if there is one
1059
   * associated to this peer.
1060
   *
1061
   * @param g the graphics to paint the component with
1062
   */
1063
  protected void peerPaintComponent(Graphics g)
1064
  {
1065
    // Paint the actual Swing component if this peer has one.
1066
    if (swingComponent != null)
1067
      swingComponent.getJComponent().paint(g);
1068
  }
1069
 
1070
  /**
1071
   * Handles mouse events on the component. This is usually forwarded to the
1072
   * SwingComponent's processMouseEvent() method.
1073
   *
1074
   * @param e the mouse event
1075
   */
1076
  protected void handleMouseEvent(MouseEvent e)
1077
  {
1078
    if (swingComponent != null)
1079
      swingComponent.handleMouseEvent(e);
1080
  }
1081
 
1082
  /**
1083
   * Handles mouse motion events on the component. This is usually forwarded
1084
   * to the SwingComponent's processMouseMotionEvent() method.
1085
   *
1086
   * @param e the mouse motion event
1087
   */
1088
  protected void handleMouseMotionEvent(MouseEvent e)
1089
  {
1090
    if (swingComponent != null)
1091
      swingComponent.handleMouseMotionEvent(e);
1092
  }
1093
 
1094
  /**
1095
   * Handles key events on the component. This is usually forwarded to the
1096
   * SwingComponent's processKeyEvent() method.
1097
   *
1098
   * @param e the key event
1099
   */
1100
  protected void handleKeyEvent(KeyEvent e)
1101
  {
1102
    if (swingComponent != null)
1103
      swingComponent.handleKeyEvent(e);
1104
  }
1105
 
1106
  /**
1107
   * Handles focus events on the component. This is usually forwarded to the
1108
   * SwingComponent's processFocusEvent() method.
1109
   *
1110
   * @param e the key event
1111
   */
1112
  protected void handleFocusEvent(FocusEvent e)
1113
  {
1114
    if (swingComponent != null)
1115
      swingComponent.handleFocusEvent(e);
1116
  }
1117
 
1118
 
1119
  /**
1120
   * Returns the AWT component for this peer.
1121
   *
1122
   * @return the AWT component for this peer
1123
   */
1124
  public Component getComponent()
1125
  {
1126
    return awtComponent;
1127
  }
1128
 
1129
  public boolean requestFocus(Component lightweightChild, boolean temporary,
1130
                              boolean focusedWindowChangeAllowed,
1131
                              long time, sun.awt.CausedFocusEvent.Cause cause)
1132
  {
1133
    return true;
1134
  }
1135
 
1136
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.