| /* GtkComponentPeer.java -- Implements ComponentPeer with GTK | |
| 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., 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.gtk; | |
| import java.awt.AWTEvent; | |
| 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.Frame; | |
| import java.awt.Graphics; | |
| import java.awt.Graphics2D; | |
| import java.awt.GraphicsConfiguration; | |
| import java.awt.Image; | |
| import java.awt.Insets; | |
| import java.awt.ItemSelectable; | |
| import java.awt.Point; | |
| import java.awt.Rectangle; | |
| import java.awt.Toolkit; | |
| import java.awt.Window; | |
| import java.awt.event.FocusEvent; | |
| import java.awt.event.ItemEvent; | |
| import java.awt.event.KeyEvent; | |
| import java.awt.event.MouseEvent; | |
| 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; | |
| public class GtkComponentPeer extends GtkGenericPeer | |
| implements ComponentPeer | |
| { | |
| Component awtComponent; | |
| Insets insets; | |
| /* this isEnabled differs from Component.isEnabled, in that it | |
| knows if a parent is disabled. In that case Component.isEnabled | |
| may return true, but our isEnabled will always return false */ | |
| native boolean isEnabled (); | |
| native static boolean modalHasGrab (); | |
| native int[] gtkWidgetGetForeground (); | |
| native int[] gtkWidgetGetBackground (); | |
| native void gtkWidgetSetVisible (boolean b); | |
| native void gtkWidgetGetDimensions (int[] dim); | |
| native void gtkWidgetGetPreferredDimensions (int[] dim); | |
| native void gtkWidgetGetLocationOnScreen (int[] point); | |
| native void gtkWidgetSetCursor (int type); | |
| native void gtkWidgetSetBackground (int red, int green, int blue); | |
| native void gtkWidgetSetForeground (int red, int green, int blue); | |
| void create () | |
| { | |
| throw new RuntimeException (); | |
| } | |
| native void connectJObject (); | |
| native void connectSignals (); | |
| protected GtkComponentPeer (Component awtComponent) | |
| { | |
| super (awtComponent); | |
| this.awtComponent = awtComponent; | |
| insets = new Insets (0, 0, 0, 0); | |
| /* temporary try/catch block until all peers use this creation method */ | |
| try { | |
| create (); | |
| GtkArgList args = new GtkArgList (); | |
| getArgs (awtComponent, args); | |
| args.setArgs (this); | |
| connectJObject (); | |
| connectSignals (); | |
| if (awtComponent.getForeground () != null) | |
| setForeground (awtComponent.getForeground ()); | |
| if (awtComponent.getBackground () != null) | |
| setBackground (awtComponent.getBackground ()); | |
| if (awtComponent.getFont() != null) | |
| setFont(awtComponent.getFont()); | |
| setCursor (awtComponent.getCursor ()); | |
| Rectangle bounds = awtComponent.getBounds (); | |
| setBounds (bounds.x, bounds.y, bounds.width, bounds.height); | |
| } catch (RuntimeException ex) { ; } | |
| } | |
| public int checkImage (Image image, int width, int height, | |
| ImageObserver observer) | |
| { | |
| GtkImage i = (GtkImage) image; | |
| return i.checkImage (); | |
| } | |
| public Image createImage (ImageProducer producer) | |
| { | |
| return new GtkImage (producer, null); | |
| } | |
| public Image createImage (int width, int height) | |
| { | |
| Graphics g; | |
| if (GtkToolkit.useGraphics2D ()) | |
| { | |
| Graphics2D g2 = new GdkGraphics2D (width, height); | |
| g2.setBackground (getBackground ()); | |
| g = g2; | |
| } | |
| else | |
| g = new GdkGraphics (width, height); | |
| return new GtkOffScreenImage (null, g, width, height); | |
| } | |
| public void disable () | |
| { | |
| setEnabled (false); | |
| } | |
| public void enable () | |
| { | |
| setEnabled (true); | |
| } | |
| public ColorModel getColorModel () | |
| { | |
| return ColorModel.getRGBdefault (); | |
| } | |
| public FontMetrics getFontMetrics (Font font) | |
| { | |
| return new GdkFontMetrics (font); | |
| } | |
| public Graphics getGraphics () | |
| { | |
| return null; | |
| } | |
| public Point getLocationOnScreen () | |
| { | |
| int point[] = new int[2]; | |
| gtkWidgetGetLocationOnScreen (point); | |
| return new Point (point[0], point[1]); | |
| } | |
| public Dimension getMinimumSize () | |
| { | |
| return minimumSize (); | |
| } | |
| public Dimension getPreferredSize () | |
| { | |
| return preferredSize (); | |
| } | |
| public Toolkit getToolkit () | |
| { | |
| return Toolkit.getDefaultToolkit(); | |
| } | |
| public void handleEvent (AWTEvent event) | |
| { | |
| } | |
| public boolean isFocusTraversable () | |
| { | |
| return true; | |
| } | |
| public Dimension minimumSize () | |
| { | |
| int dim[] = new int[2]; | |
| gtkWidgetGetPreferredDimensions (dim); | |
| return new Dimension (dim[0], dim[1]); | |
| } | |
| public void paint (Graphics g) | |
| { | |
| awtComponent.paint (g); | |
| } | |
| public Dimension preferredSize () | |
| { | |
| int dim[] = new int[2]; | |
| gtkWidgetGetPreferredDimensions (dim); | |
| return new Dimension (dim[0], dim[1]); | |
| } | |
| public boolean prepareImage (Image image, int width, int height, | |
| ImageObserver observer) | |
| { | |
| GtkImage i = (GtkImage) image; | |
| if (i.isLoaded ()) return true; | |
| class PrepareImage extends Thread | |
| { | |
| GtkImage image; | |
| ImageObserver observer; | |
| PrepareImage (GtkImage image, ImageObserver observer) | |
| { | |
| this.image = image; | |
| image.setObserver (observer); | |
| } | |
| public void run () | |
| { | |
| image.source.startProduction (image); | |
| } | |
| } | |
| new PrepareImage (i, observer).start (); | |
| return false; | |
| } | |
| public void print (Graphics g) | |
| { | |
| throw new RuntimeException (); | |
| } | |
| public void repaint (long tm, int x, int y, int width, int height) | |
| { | |
| q.postEvent (new PaintEvent (awtComponent, PaintEvent.UPDATE, | |
| new Rectangle (x, y, width, height))); | |
| } | |
| native public void requestFocus (); | |
| public void reshape (int x, int y, int width, int height) | |
| { | |
| setBounds (x, y, width, height); | |
| } | |
| public void setBackground (Color c) | |
| { | |
| gtkWidgetSetBackground (c.getRed(), c.getGreen(), c.getBlue()); | |
| } | |
| native public void setNativeBounds (int x, int y, int width, int height); | |
| public void setBounds (int x, int y, int width, int height) | |
| { | |
| Component parent = awtComponent.getParent (); | |
| if (parent instanceof Window) | |
| { | |
| Insets insets = ((Window) parent).getInsets (); | |
| // Convert from Java coordinates to GTK coordinates. | |
| setNativeBounds (x - insets.left, y - insets.top, width, height); | |
| } | |
| else | |
| setNativeBounds (x, y, width, height); | |
| } | |
| public void setCursor (Cursor cursor) | |
| { | |
| gtkWidgetSetCursor (cursor.getType ()); | |
| } | |
| public void setEnabled (boolean b) | |
| { | |
| set ("sensitive", b); | |
| } | |
| public void setFont (Font f) | |
| { | |
| // FIXME: This should really affect the widget tree below me. | |
| // Currently this is only handled if the call is made directly on | |
| // a text widget, which implements setFont() itself. | |
| } | |
| public void setForeground (Color c) | |
| { | |
| gtkWidgetSetForeground (c.getRed(), c.getGreen(), c.getBlue()); | |
| } | |
| public Color getForeground () | |
| { | |
| int rgb[] = gtkWidgetGetForeground (); | |
| return new Color (rgb[0], rgb[1], rgb[2]); | |
| } | |
| public Color getBackground () | |
| { | |
| int rgb[] = gtkWidgetGetBackground (); | |
| return new Color (rgb[0], rgb[1], rgb[2]); | |
| } | |
| public void setVisible (boolean b) | |
| { | |
| set ("visible", b); | |
| } | |
| public void hide () | |
| { | |
| setVisible (false); | |
| } | |
| public void show () | |
| { | |
| setVisible (true); | |
| } | |
| protected void postMouseEvent(int id, long when, int mods, int x, int y, | |
| int clickCount, boolean popupTrigger) | |
| { | |
| q.postEvent(new MouseEvent(awtComponent, id, when, mods, x, y, | |
| clickCount, popupTrigger)); | |
| } | |
| protected void postExposeEvent (int x, int y, int width, int height) | |
| { | |
| q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, | |
| new Rectangle (x, y, width, height))); | |
| } | |
| protected void postKeyEvent (int id, long when, int mods, | |
| int keyCode, char keyChar, int keyLocation) | |
| { | |
| q.postEvent (new KeyEvent (awtComponent, id, when, mods, | |
| keyCode, keyChar, keyLocation)); | |
| } | |
| protected void postFocusEvent (int id, boolean temporary) | |
| { | |
| q.postEvent (new FocusEvent (awtComponent, id, temporary)); | |
| } | |
| protected void postItemEvent (Object item, int stateChange) | |
| { | |
| q.postEvent (new ItemEvent ((ItemSelectable)awtComponent, | |
| ItemEvent.ITEM_STATE_CHANGED, | |
| item, stateChange)); | |
| } | |
| public void getArgs (Component component, GtkArgList args) | |
| { | |
| args.add ("visible", component.isVisible ()); | |
| args.add ("sensitive", component.isEnabled ()); | |
| ComponentPeer p; | |
| do | |
| { | |
| component = component.getParent (); | |
| p = component.getPeer (); | |
| } while (p instanceof java.awt.peer.LightweightPeer); | |
| if (p != null) | |
| args.add ("parent", p); | |
| } | |
| native void set (String name, String value); | |
| native void set (String name, boolean value); | |
| native void set (String name, int value); | |
| native void set (String name, float value); | |
| native void set (String name, Object value); | |
| void set (GtkArg arg) | |
| { | |
| String name = arg.getName (); | |
| Object value = arg.getValue (); | |
| if (value instanceof Boolean) | |
| set (name, ((Boolean)value).booleanValue ()); | |
| else if (value instanceof Integer) | |
| set (name, ((Integer)value).intValue ()); | |
| else if (value instanceof Float) | |
| set (name, ((Float)value).floatValue ()); | |
| else if (value instanceof String) | |
| set (name, ((String) value)); | |
| else | |
| set (name, value); | |
| } | |
| public GraphicsConfiguration getGraphicsConfiguration () | |
| { | |
| // FIXME: just a stub for now. | |
| return null; | |
| } | |
| public void setEventMask (long mask) | |
| { | |
| // FIXME: just a stub for now. | |
| } | |
| public boolean isFocusable () | |
| { | |
| return false; | |
| } | |
| public boolean requestFocus (Component source, boolean b1, | |
| boolean b2, long x) | |
| { | |
| return false; | |
| } | |
| 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 java.awt.AWTException | |
| { | |
| } | |
| public Image getBackBuffer () | |
| { | |
| return null; | |
| } | |
| public void flip (BufferCapabilities.FlipContents contents) | |
| { | |
| } | |
| public void destroyBuffers () | |
| { | |
| } | |
| } |