This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Lightweight peer implementation


On Tue, 2003-08-12 at 10:47, Scott Gilbertson wrote:
> > > Bryce wrote:
> > >> Yup, I agree. Lightweights should be implemented entirely in the
> > >> "generic" part of the code, not in the peer code.
> > > Thanks, guys.  I've been trying to get someone to express an opinion
> > > one way
> > > or the other on this issue for some time.  I look forward to getting
> > > the
> > > lightweight components issue off my "pending" list.
> > >
> > > I agree with all of what Bryce said:
> > >  - lightweights should be generic
> > >  - there should be no need to check for a null peer
> >
> > Well, I actually said there might be reason to check for null peer. In
> > the JRE implementation, creation of the peers doesn't happen until the
> > component is added to a container and/or its made visible. Just
> > guessing - but this might be because some windowing systems don't allow
> > the native widget to be created unless it already has a parent?
> 
> An alternative would be to have a single static instance of a "really
> lightweight" peer, which returns nulls for everything, and make that the
> Component's peer until the real one is set.  You'd get a slight performance
> boost, by eliminating a comparison statement in the common case where the
> peer has already been set up (at least on architectures where a virtual
> method call is faster than a conditional branch).
> 

OK, here is another patch that builds on Scott's.  I've left the
Component null checks alone for now.  The patch moves GLightweightPeer
to gnu.java.awt.peer and implements some of the missing ComponentPeer
methods.

Comments?

Thanks,
Tom

2003-08-13  Scott Gilbertson  <scottg@mantatest.com>
	    Thomas Fitzsimmons  <fitzsim@redhat.com>

	* Makefile.am (gtk_awt_peer_sources): Add
	gnu/java/awt/peer/GLightweightPeer.java.  Remove
	gnu/java/awt/GLightweightPeer.java.
	* gnu/java/awt/GLightweightPeer.java: Remove file.
	* gnu/java/awt/peer/GLightweightPeer.java: New file.
	* java/awt/Toolkit.java (createComponent): Return
	gnu.java.awt.peer.GLightweightPeer.

Index: Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v
retrieving revision 1.313
diff -u -b -B -r1.313 Makefile.am
--- Makefile.am	8 Aug 2003 16:25:57 -0000	1.313
+++ Makefile.am	13 Aug 2003 17:03:12 -0000
@@ -758,10 +758,10 @@
 gnu/java/awt/EmbeddedWindow.java \
 gnu/java/awt/EmbeddedWindowSupport.java \
 gnu/java/awt/EventModifier.java \
-gnu/java/awt/GLightweightPeer.java \
 gnu/java/awt/image/ImageDecoder.java \
 gnu/java/awt/image/XBMDecoder.java \
 gnu/java/awt/peer/EmbeddedWindowPeer.java \
+gnu/java/awt/peer/GLightweightPeer.java \
 gnu/java/beans/editors/ColorEditor.java	\
 gnu/java/beans/editors/FontEditor.java \
 gnu/java/beans/editors/NativeBooleanEditor.java	\
Index: gnu/java/awt/peer/GLightweightPeer.java
===================================================================
RCS file: gnu/java/awt/peer/GLightweightPeer.java
diff -N gnu/java/awt/peer/GLightweightPeer.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gnu/java/awt/peer/GLightweightPeer.java	13 Aug 2003 17:03:14 -0000
@@ -0,0 +1,281 @@
+/* GLightweightPeer.java --
+   Copyright (C) 2003 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.peer;
+
+import java.awt.AWTEvent;
+import java.awt.AWTException;
+import java.awt.BufferCapabilities;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.GraphicsConfiguration;
+import java.awt.Image;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Toolkit;
+import java.awt.event.PaintEvent;
+import java.awt.image.ColorModel;
+import java.awt.image.ImageObserver;
+import java.awt.image.ImageProducer;
+import java.awt.image.VolatileImage;
+import java.awt.peer.ContainerPeer;
+import java.awt.peer.LightweightPeer;
+
+public class GLightweightPeer
+  implements LightweightPeer, ContainerPeer
+{
+  private Component comp;
+
+  private Insets containerInsets;
+
+  public GLightweightPeer(Component comp)
+  {
+    this.comp = comp;
+  }
+
+  // -------- java.awt.peer.ContainerPeer implementation:
+  
+  public Insets insets()
+  {
+    return getInsets ();
+  }
+  
+  public Insets getInsets()
+  {
+    if (containerInsets == null)
+      containerInsets = new Insets (0,0,0,0);
+    return containerInsets;
+  }
+  
+  public void beginValidate()
+  {
+  }
+  
+  public void endValidate()
+  {
+  }
+  
+  public void beginLayout()
+  {
+  }
+  
+  public void endLayout()
+  {
+  }
+  
+  public boolean isPaintPending()
+  {
+    return false;
+  }
+
+  // -------- java.awt.peer.ComponentPeer implementation:
+
+  public int checkImage(Image img, int width, int height, ImageObserver o)
+  {
+    return comp.getToolkit().checkImage(img, width, height, o);
+  }
+
+  public Image createImage(ImageProducer prod)
+  {
+    return comp.getToolkit().createImage(prod);
+  }
+
+  /* This method is not called. */
+  public Image createImage(int width, int height)
+  {
+    return null;
+  }
+
+  public void disable() {}
+
+  public void dispose() {}
+
+  public void enable() {}
+
+  public GraphicsConfiguration getGraphicsConfiguration()
+  {
+    return null;
+  }
+
+  public FontMetrics getFontMetrics(Font f)
+  {
+    return comp.getToolkit().getFontMetrics(f);
+  }
+
+  /* Returning null here tells the Component object that called us to
+   * use its parent's Graphics. */
+  public Graphics getGraphics()
+  {
+    return null;
+  }
+
+  public Point getLocationOnScreen()
+  {
+    Point parentLocation = comp.getParent().getLocationOnScreen();
+    return new Point (parentLocation.x + comp.getX(),
+                      parentLocation.y + comp.getY());
+  }
+
+  public Dimension getMinimumSize()
+  {
+    return new Dimension(comp.getWidth(), comp.getHeight());
+  }
+
+  /* A lightweight component's preferred size is equivalent to its
+   * Component width and height values. */
+  public Dimension getPreferredSize()
+  {
+    return new Dimension(comp.getWidth(), comp.getHeight());
+  }
+
+  /* Returning null here tells the Component object that called us to
+   * use its parent's Toolkit. */
+  public Toolkit getToolkit()
+  {
+    return null;
+  }
+
+  public void handleEvent(AWTEvent e) {}
+
+  public void hide() {}
+
+  public boolean isFocusable() 
+  {
+    return false;
+  }
+
+  public boolean isFocusTraversable()
+  {
+    return false;
+  }
+
+  public Dimension minimumSize()
+  {
+    return getMinimumSize();
+  }
+
+  public Dimension preferredSize()
+  {
+    return getPreferredSize();
+  }
+
+  public void paint(Graphics graphics) {}
+
+  public boolean prepareImage(Image img, int width, int height,
+			      ImageObserver o)
+  {
+    return comp.getToolkit().prepareImage(img, width, height, o);
+  }
+
+  public void print(Graphics graphics) {}
+
+  public void repaint(long tm, int x, int y, int width, int height) {}
+
+  public void requestFocus() {}
+
+  public boolean requestFocus(Component source, boolean bool1, boolean bool2, long x)
+  {
+    return false;
+  }
+
+  public void reshape(int x, int y, int width, int height) {}
+
+  public void setBackground(Color color) {}
+
+  public void setBounds(int x, int y, int width, int height) { }
+
+  public void setCursor(Cursor cursor) {}
+
+  public void setEnabled(boolean enabled) {}
+
+  public void setEventMask(long eventMask) {}
+
+  public void setFont(Font font) {}
+
+  public void setForeground(Color color) {}
+
+  public void setVisible(boolean visible) {}
+
+  public void show() {}
+
+  public ColorModel getColorModel ()
+  {
+    return comp.getColorModel ();
+  }
+
+  public boolean isObscured()
+  {
+    return false;
+  }
+
+  public boolean canDetermineObscurity()
+  {
+    return false;
+  }
+
+  public void coalescePaintEvent(PaintEvent e) { }
+
+  public void updateCursorImmediately() { }
+
+  public VolatileImage createVolatileImage(int width, int height) 
+  { 
+    return null; 
+  }
+
+  public boolean handlesWheelScrolling()
+  {
+    return false;
+  }
+
+  public void createBuffers(int x, BufferCapabilities capabilities) 
+    throws AWTException { }
+
+  public Image getBackBuffer()
+  {
+    return null;
+  }
+
+  public void flip(BufferCapabilities.FlipContents contents) { }
+
+  public void destroyBuffers() { }
+}
Index: java/awt/Component.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Component.java,v
retrieving revision 1.26
diff -u -b -B -r1.26 Component.java
--- java/awt/Component.java	25 Jul 2003 12:50:44 -0000	1.26
+++ java/awt/Component.java	13 Aug 2003 17:03:15 -0000
@@ -677,6 +677,7 @@
         if (tk != null)
           return tk;
       }
+    // Get toolkit for lightweight component.
     if (parent != null)
       return parent.getToolkit();
     return Toolkit.getDefaultToolkit();
Index: java/awt/Toolkit.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Toolkit.java,v
retrieving revision 1.22
diff -u -b -B -r1.22 Toolkit.java
--- java/awt/Toolkit.java	6 Jun 2003 13:12:46 -0000	1.22
+++ java/awt/Toolkit.java	13 Aug 2003 17:03:15 -0000
@@ -348,9 +348,9 @@
    *
    * @return The peer for the specified <code>Component</code> object.
    */
-  protected LightweightPeer createComponent(Component target)
+  protected LightweightPeer createComponent(Component component)
   {
-    return null;
+    return new gnu.java.awt.peer.GLightweightPeer (component);
   }
 
   /**

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]