On Wed, 2006-02-22 at 11:39 -0500, Scott Gilbertson wrote: > Looking back, I see the ambiguity in my previous email. > The structure I had in mind was: > > class LightweightComponentPeer > implements LightweightPeer, ComponentPeer > { > // (as now, including the repaint implementation) > } > > // New class: > class LightweightContainerPeer > extends LightweightComponentPeer > implements ContainerPeer > { > // ContainerPeer-specific methods that used > // to be in GLightweightPeer > } > > // Base java.awt.Toolkit creates generic lightweight peers for > // both Containers and non-Containers, restoring the > // functionality that used to be there. > // (overridden for GTK, but not for QT or XLIB) > class Toolkit > { > protected LightweightPeer createComponent(Component target) > { > if (target instanceof Container) > return new LightweightContainerPeer(target); > return new LightweightComponentPeer(target); > } > } > >
I agree with Scott that we need to add a LightweightContainerPeer class. I fixed up Toolkit, as well. I also added the painting methods to GtkLightweightContainerPeer (those that override ComponentPeer). This is the updated ChangeLog. The newest patch is attached. 2006-02-22 Lillian Angel <[EMAIL PROTECTED]> * gnu/java/awt/peer/gtk/GtkLightweightContainerPeer.java: New class to handle Container Lightweights. This class implements ContainerPeer and overrides the painting methods from ComponentPeer. * gnu/java/awt/peer/gtk/GtkToolkit.java: Fixed imports. (createComponent): Added comment. (createComponent): New method to override Toolkit's createComponent. Returns an instance of GtkLightweightPeer if the target is a container, and a LightweightComponentPeer if the target is a Component. * include/Makefile.am: Added gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.h. * include/gnu_java_awt_peer_gtk_GtkLightweightContainterPeer.h: New header file. * java/awt/Toolkit.java (createComponent): Changed to return an instance of LightweightComponentPeer or LightweightContainerPeer. * native/jni/gtk-peer/Makefile.am: Added gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.c. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_ GtkLightweightContainerPeer.c: New class. * gnu/java/awt/peer/GLightweightPeer.java: Removed class, replaced with LightweightComponentPeer. * gnu/java/awt/peer/LightweightComponentPeer.java: New class. Replaces GLightweightPeer, but only implements ComponentPeer now. Updated comments. * gnu/java/awt/peer/LightweightContainerPeer.java: New class. Replaces GLightweightPeer, but only implements ContainerPeer now. (repaint): Incorporate Scott's patch. Sends event to parent. * gnu/java/awt/peer/gtk/GtkComponentPeer.java (setParent): Removed check for LightweightPeer. The parent should be set for all components. (setBounds): Removed code for lightweights. The placement of the lightweight containers is now handled by GtkLightweightContainerPeer. * gnu/java/awt/peer/gtk/GtkContainerPeer.java (endValidate): Removed comment. * java/awt/Graphics.java (hitClip): Incorporates Scott's patch to handle null clip.
Index: gnu/java/awt/peer/GLightweightPeer.java =================================================================== RCS file: gnu/java/awt/peer/GLightweightPeer.java diff -N gnu/java/awt/peer/GLightweightPeer.java --- gnu/java/awt/peer/GLightweightPeer.java 19 Aug 2005 01:29:26 -0000 1.6 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,339 +0,0 @@ -/* GLightweightPeer.java -- - Copyright (C) 2003, 2004 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., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 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.FontMetrics; -import java.awt.Graphics; -import java.awt.GraphicsConfiguration; -import java.awt.Image; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -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; - -/* - * Another possible implementation strategy for lightweight peers is - * to make GLightweightPeer a placeholder class that implements - * LightweightPeer. Then the Component and Container classes could - * identify a peer as lightweight and handle it specially. The - * current approach is probably more clear but less efficient. - */ - -/** - * A stub class that implements the ComponentPeer and ContainerPeer - * interfaces using callbacks into the Component and Container - * classes. GLightweightPeer allows the Component and Container - * classes to treat lightweight and heavyweight peers in the same way. - * - * Lightweight components are painted directly onto their parent - * containers through an Image object provided by the toolkit. - */ -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() { } - - public boolean isRestackSupported() - { - return false; - } - - public void cancelPendingPaint(int x, int y, int width, int height) - { - - } - - public void restack() - { - - } - - public Rectangle getBounds() - { - return null; - } - - public void reparent(ContainerPeer parent) - { - - } - - public void setBounds(int x, int y, int z, int width, int height) - { - - } - - public boolean isReparentSupported() - { - return false; - } - - public void layout() - { - - } -} Index: gnu/java/awt/peer/LightweightComponentPeer.java =================================================================== RCS file: gnu/java/awt/peer/LightweightComponentPeer.java diff -N gnu/java/awt/peer/LightweightComponentPeer.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/java/awt/peer/LightweightComponentPeer.java 22 Feb 2006 18:27:22 -0000 @@ -0,0 +1,331 @@ +/* LightweightComponentPeer.java -- + Copyright (C) 2003, 2004 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., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 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.FontMetrics; +import java.awt.Graphics; +import java.awt.GraphicsConfiguration; +import java.awt.Image; +import java.awt.Point; +import java.awt.Rectangle; +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.ComponentPeer; +import java.awt.peer.ContainerPeer; +import java.awt.peer.LightweightPeer; + +/** + * A stub class that implements the ComponentPeer + * interface using callbacks into the Component classes. + * LightweightComponentPeer allows the Component + * classes to treat lightweight and heavyweight peers in the same way. + * + * Lightweight components are painted directly onto their parent + * containers through an Image object provided by the toolkit. + */ +public class LightweightComponentPeer + implements LightweightPeer, ComponentPeer +{ + private Component comp; + + public LightweightComponentPeer(Component comp) + { + this.comp = comp; + } + + 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) + { + Component p = comp.getParent(); + if (p != null) + p.repaint(tm, x + comp.getX(), y + comp.getY(), width, 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() + { + } + + public Rectangle getBounds() + { + return null; + } + + public void reparent(ContainerPeer parent) + { + } + + public void setBounds(int x, int y, int z, int width, int height) + { + } + + public boolean isReparentSupported() + { + return false; + } + + public void layout() + { + } +} Index: gnu/java/awt/peer/LightweightContainerPeer.java =================================================================== RCS file: gnu/java/awt/peer/LightweightContainerPeer.java diff -N gnu/java/awt/peer/LightweightContainerPeer.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/java/awt/peer/LightweightContainerPeer.java 22 Feb 2006 18:27:22 -0000 @@ -0,0 +1,102 @@ +/* LightweightContainerPeer.java -- + Copyright (C) 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 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.Component; +import java.awt.Insets; +import java.awt.peer.ContainerPeer; + +public class LightweightContainerPeer + extends LightweightComponentPeer + implements ContainerPeer +{ + + private Insets containerInsets; + + public LightweightContainerPeer(Component target) + { + super(target); + } + + 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; + } + + public void restack() + { + } + + public boolean isRestackSupported() + { + return false; + } + + public void cancelPendingPaint(int x, int y, int width, int height) + { + } +} Index: gnu/java/awt/peer/gtk/GtkComponentPeer.java =================================================================== RCS file: /sources/classpath/classpath/gnu/java/awt/peer/gtk/GtkComponentPeer.java,v retrieving revision 1.105 diff -u -r1.105 GtkComponentPeer.java --- gnu/java/awt/peer/gtk/GtkComponentPeer.java 17 Feb 2006 19:53:06 -0000 1.105 +++ gnu/java/awt/peer/gtk/GtkComponentPeer.java 22 Feb 2006 18:27:22 -0000 @@ -44,7 +44,6 @@ import java.awt.BufferCapabilities; import java.awt.Color; import java.awt.Component; -import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.EventQueue; @@ -166,19 +165,16 @@ setVisibleAndEnabled (); } - void setParent () + void setParent() { ComponentPeer p; Component component = awtComponent; - do - { - component = component.getParent (); - p = component.getPeer (); - } - while (p instanceof java.awt.peer.LightweightPeer); + + component = component.getParent(); + p = component.getPeer(); if (p != null) - gtkWidgetSetParent (p); + gtkWidgetSetParent(p); } void beginNativeRepaint () @@ -443,38 +439,11 @@ { int new_x = x; int new_y = y; - - Component parent = awtComponent.getParent (); - Component next_parent; - - // Heavyweight components that are children of one or more - // lightweight containers have to be handled specially. Because - // calls to GLightweightPeer.setBounds do nothing, GTK has no - // knowledge of the lightweight containers' positions. So we have - // to add the offsets manually when placing a heavyweight - // component within a lightweight container. The lightweight - // container may itself be in a lightweight container and so on, - // so we need to continue adding offsets until we reach a - // container whose position GTK knows -- that is, the first - // non-lightweight. - boolean lightweightChild = false; - Insets i; - while (parent.isLightweight()) - { - lightweightChild = true; - - next_parent = parent.getParent(); - - i = ((Container) parent).getInsets(); - new_x += parent.getX() + i.left; - new_y += parent.getY() + i.top; - - parent = next_parent; - } + Component parent = awtComponent.getParent(); // We only need to convert from Java to GTK coordinates if we're // placing a heavyweight component in a Window. - if (parent instanceof Window && !lightweightChild) + if (parent instanceof Window) { GtkWindowPeer peer = (GtkWindowPeer) parent.getPeer (); // important: we want the window peer's insets here, not the Index: gnu/java/awt/peer/gtk/GtkLightweightContainerPeer.java =================================================================== RCS file: gnu/java/awt/peer/gtk/GtkLightweightContainerPeer.java diff -N gnu/java/awt/peer/gtk/GtkLightweightContainerPeer.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/java/awt/peer/gtk/GtkLightweightContainerPeer.java 22 Feb 2006 18:27:22 -0000 @@ -0,0 +1,158 @@ +/* GtkLightweightContainerPeer.java -- + Copyright (C) 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 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.gtk; + +import java.awt.AWTEvent; +import java.awt.Component; +import java.awt.Container; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.Point; +import java.awt.peer.ContainerPeer; +import java.awt.peer.LightweightPeer; + +/** + * A stub class that implements the ContainerPeer + * interface using callbacks into the Container classes. + * LightweightComponentPeer allows the Container + * classes to treat lightweight and heavyweight peers in the same way. + * LightweightComponentPeer is used for Components. + */ +public class GtkLightweightContainerPeer + extends GtkContainerPeer + implements LightweightPeer, ContainerPeer +{ + + private Container cont; + private Insets containerInsets; + + native void create(); + native void connectSignals(); + + public GtkLightweightContainerPeer(Container c) + { + super(c); + cont = c; + } + + /** + * Returns null here so the Component object that called this, uses its + * parent's Graphics. + */ + public Graphics getGraphics() + { + return null; + } + + public Point getLocationOnScreen() + { + Point parentLocation = cont.getParent().getLocationOnScreen(); + return new Point (parentLocation.x + cont.getX(), + parentLocation.y + cont.getY()); + } + + protected void postExposeEvent (int x, int y, int width, int height) + { + } + + public void print(Graphics graphics) + { + } + + public void paint(Graphics graphics) + { + } + + public void handleEvent (AWTEvent event) + { + } + + public void repaint(long tm, int x, int y, int width, int height) + { + Component p = cont.getParent(); + if (p != null) + p.repaint(tm, x + cont.getX(), y + cont.getY(), width, height); + } + + 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; + } + + public void restack() + { + } + + public boolean isRestackSupported() + { + return false; + } + + public void cancelPendingPaint(int x, int y, int width, int height) + { + } +} Index: gnu/java/awt/peer/gtk/GtkToolkit.java =================================================================== RCS file: /sources/classpath/classpath/gnu/java/awt/peer/gtk/GtkToolkit.java,v retrieving revision 1.81 diff -u -r1.81 GtkToolkit.java --- gnu/java/awt/peer/gtk/GtkToolkit.java 14 Feb 2006 22:49:18 -0000 1.81 +++ gnu/java/awt/peer/gtk/GtkToolkit.java 22 Feb 2006 18:27:22 -0000 @@ -44,27 +44,77 @@ import gnu.java.awt.peer.ClasspathFontPeer; import gnu.java.awt.peer.ClasspathTextLayoutPeer; import gnu.java.awt.peer.EmbeddedWindowPeer; +import gnu.java.awt.peer.LightweightComponentPeer; -import java.awt.*; +import java.awt.AWTException; +import java.awt.Button; +import java.awt.Canvas; +import java.awt.Checkbox; +import java.awt.CheckboxMenuItem; +import java.awt.Choice; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.FileDialog; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Frame; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Image; +import java.awt.Label; +import java.awt.List; +import java.awt.Menu; +import java.awt.MenuBar; +import java.awt.MenuItem; +import java.awt.Panel; +import java.awt.PopupMenu; +import java.awt.PrintJob; +import java.awt.Rectangle; +import java.awt.ScrollPane; +import java.awt.Scrollbar; +import java.awt.TextArea; +import java.awt.TextField; +import java.awt.Window; import java.awt.datatransfer.Clipboard; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.peer.DragSourceContextPeer; import java.awt.font.FontRenderContext; import java.awt.im.InputMethodHighlight; -import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.DirectColorModel; -import java.awt.image.ImageConsumer; import java.awt.image.ImageObserver; import java.awt.image.ImageProducer; -import java.awt.peer.*; +import java.awt.peer.ButtonPeer; +import java.awt.peer.CanvasPeer; +import java.awt.peer.CheckboxMenuItemPeer; +import java.awt.peer.CheckboxPeer; +import java.awt.peer.ChoicePeer; +import java.awt.peer.DialogPeer; +import java.awt.peer.FileDialogPeer; +import java.awt.peer.FontPeer; +import java.awt.peer.FramePeer; +import java.awt.peer.LabelPeer; +import java.awt.peer.LightweightPeer; +import java.awt.peer.ListPeer; +import java.awt.peer.MenuBarPeer; +import java.awt.peer.MenuItemPeer; +import java.awt.peer.MenuPeer; +import java.awt.peer.PanelPeer; +import java.awt.peer.PopupMenuPeer; +import java.awt.peer.RobotPeer; +import java.awt.peer.ScrollPanePeer; +import java.awt.peer.ScrollbarPeer; +import java.awt.peer.TextAreaPeer; +import java.awt.peer.TextFieldPeer; +import java.awt.peer.WindowPeer; import java.io.InputStream; import java.net.URL; import java.text.AttributedString; import java.util.HashMap; -import java.util.HashSet; import java.util.Hashtable; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; @@ -610,6 +660,33 @@ { GdkPixbufDecoder.registerSpis(reg); } - + + /** + * Creates a peer object for the specified <code>Component</code>. The + * peer returned by this method is not a native windowing system peer + * with its own native window. Instead, this method allows the component + * to draw on its parent window as a "lightweight" widget. + * + * @param target The <code>Component</code> to create the peer for. + * + * @return The peer for the specified <code>Component</code> object. + */ + protected LightweightPeer createComponent(Component target) + { + // If target is an instance of Container, then a GtkLightweightContainerPeer + // should be returned. Otherwise, an instance of LightweightComponentPeer is + // returned for Components. This is because, all the properties of a + // Container should be accessible (bounds, location etc). + // LightweightComponentPeers really are lightweight, but a + // GtkLightweightContainerPeer is different because it still + // has a backing widget that tracks its bounds/location for use + // by the native side. A GtkLightweightContainerPeer is lightweight as + // well because it does not allocate screen resources. + + if (target instanceof Container) + return new GtkLightweightContainerPeer((Container) target); + return new LightweightComponentPeer(target); + } + public static native void gtkMain(); } // class GtkToolkit Index: include/Makefile.am =================================================================== RCS file: /sources/classpath/classpath/include/Makefile.am,v retrieving revision 1.53 diff -u -r1.53 Makefile.am --- include/Makefile.am 13 Feb 2006 16:12:53 -0000 1.53 +++ include/Makefile.am 22 Feb 2006 18:27:22 -0000 @@ -59,6 +59,7 @@ $(top_srcdir)/include/gnu_java_awt_peer_gtk_GtkImage.h \ $(top_srcdir)/include/gnu_java_awt_peer_gtk_GtkLabelPeer.h \ $(top_srcdir)/include/gnu_java_awt_peer_gtk_GtkListPeer.h \ +$(top_srcdir)/include/gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.h \ $(top_srcdir)/include/gnu_java_awt_peer_gtk_GtkMenuBarPeer.h \ $(top_srcdir)/include/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.h \ $(top_srcdir)/include/gnu_java_awt_peer_gtk_GtkMenuItemPeer.h \ Index: include/gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.h =================================================================== RCS file: include/gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.h diff -N include/gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ include/gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.h 22 Feb 2006 18:27:22 -0000 @@ -0,0 +1,20 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ + +#ifndef __gnu_java_awt_peer_gtk_GtkLightweightContainerPeer__ +#define __gnu_java_awt_peer_gtk_GtkLightweightContainerPeer__ + +#include <jni.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkLightweightContainerPeer_create (JNIEnv *env, jobject); +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkLightweightContainerPeer_connectSignals (JNIEnv *env, jobject); + +#ifdef __cplusplus +} +#endif + +#endif /* __gnu_java_awt_peer_gtk_GtkLightweightContainerPeer__ */ Index: java/awt/Graphics.java =================================================================== RCS file: /sources/classpath/classpath/java/awt/Graphics.java,v retrieving revision 1.15 diff -u -r1.15 Graphics.java --- java/awt/Graphics.java 10 Oct 2005 12:18:05 -0000 1.15 +++ java/awt/Graphics.java 22 Feb 2006 18:27:22 -0000 @@ -617,6 +617,9 @@ */ public boolean hitClip(int x, int y, int width, int height) { + Shape clip = getClip(); + if (clip == null) + return true; return getClip().intersects(x, y, width, height); } Index: java/awt/Toolkit.java =================================================================== RCS file: /sources/classpath/classpath/java/awt/Toolkit.java,v retrieving revision 1.31 diff -u -r1.31 Toolkit.java --- java/awt/Toolkit.java 2 Aug 2005 15:29:25 -0000 1.31 +++ java/awt/Toolkit.java 22 Feb 2006 18:27:22 -0000 @@ -39,6 +39,9 @@ package java.awt; +import gnu.java.awt.peer.LightweightComponentPeer; +import gnu.java.awt.peer.LightweightContainerPeer; + import java.awt.datatransfer.Clipboard; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.DragGestureListener; @@ -349,7 +352,9 @@ */ protected LightweightPeer createComponent(Component target) { - return new gnu.java.awt.peer.GLightweightPeer (target); + if (target instanceof Container) + return new LightweightContainerPeer(target); + return new LightweightComponentPeer(target); } /** Index: native/jni/gtk-peer/Makefile.am =================================================================== RCS file: /sources/classpath/classpath/native/jni/gtk-peer/Makefile.am,v retrieving revision 1.34 diff -u -r1.34 Makefile.am --- native/jni/gtk-peer/Makefile.am 25 Jan 2006 10:40:12 -0000 1.34 +++ native/jni/gtk-peer/Makefile.am 22 Feb 2006 18:27:23 -0000 @@ -31,6 +31,7 @@ gnu_java_awt_peer_gtk_GtkImage.c \ gnu_java_awt_peer_gtk_GtkLabelPeer.c \ gnu_java_awt_peer_gtk_GtkListPeer.c \ + gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.c \ gnu_java_awt_peer_gtk_GtkMenuBarPeer.c \ gnu_java_awt_peer_gtk_GtkMenuComponentPeer.c \ gnu_java_awt_peer_gtk_GtkMenuItemPeer.c \ Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.c =================================================================== RCS file: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.c diff -N native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.c 22 Feb 2006 18:27:23 -0000 @@ -0,0 +1,110 @@ +/* GtkLightweightContainerPeer.c -- Native implementation of GtkLightweightPeer + Copyright (C) 1998, 1999, 2002 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., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 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. */ + + +#include "gtkpeer.h" +#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" +#include "gnu_java_awt_peer_gtk_GtkLightweightContainerPeer.h" + +static gboolean panel_focus_in_cb (GtkWidget * widget, + GdkEventFocus *event, + jobject peer); +static gboolean panel_focus_out_cb (GtkWidget * widget, + GdkEventFocus *event, + jobject peer); + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkLightweightContainerPeer_create + (JNIEnv *env, jobject obj) +{ + GtkWidget *widget; + + gdk_threads_enter (); + + NSA_SET_GLOBAL_REF (env, obj); + + widget = gtk_fixed_new (); + + gtk_fixed_set_has_window (GTK_FIXED (widget), FALSE); + + NSA_SET_PTR (env, obj, widget); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkLightweightContainerPeer_connectSignals + (JNIEnv *env, jobject obj) +{ + void *ptr; + jobject *gref; + + gdk_threads_enter (); + + ptr = NSA_GET_PTR (env, obj); + gref = NSA_GET_GLOBAL_REF (env, obj); + + /* Panel signals. These callbacks prevent expose events being + delivered to the panel when it is focused. */ + g_signal_connect (G_OBJECT (ptr), "focus-in-event", + G_CALLBACK (panel_focus_in_cb), *gref); + + g_signal_connect (G_OBJECT (ptr), "focus-out-event", + G_CALLBACK (panel_focus_out_cb), *gref); + + /* Component signals. Exclude focus signals. */ + cp_gtk_component_connect_expose_signals (ptr, gref); + cp_gtk_component_connect_mouse_signals (ptr, gref); + + gdk_threads_leave (); +} + +static gboolean +panel_focus_in_cb (GtkWidget * widget __attribute__((unused)), + GdkEventFocus *event __attribute__((unused)), + jobject peer __attribute__((unused))) +{ + return TRUE; +} + +static gboolean +panel_focus_out_cb (GtkWidget * widget __attribute__((unused)), + GdkEventFocus *event __attribute__((unused)), + jobject peer __attribute__((unused))) +{ + return TRUE; +}