/* GtkComponentPeer.java -- Implements ComponentPeer with GTK Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of the peer AWT libraries of GNU Classpath. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later verion. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA. */ package gnu.awt.gtk; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.awt.peer.ComponentPeer; public abstract class GtkComponentPeer implements ComponentPeer { // We need to put a reference to the Event Queue somewhere. This seems like // a convenient place. static EventQueue eventQueue = new EventQueue(); Component awtComponent; gnu.gcj.RawData ptr; // Actual gtk object. static { // This will start the main toolkit thread. GtkToolkit.instance.init(); } public int checkImage (Image image, int width, int height, ImageObserver observer) { return -1; /* GtkImage i = (GtkImage) image; return i.checkImage (); */ } public Image createImage (ImageProducer producer) { return null; //return new GtkImage (producer, null); } public Image createImage (int width, int height) { return null; /* GdkGraphics g = new GdkGraphics (width, height); return new GtkOffScreenImage (null, g, width, height); */ } public void disable () { setEnabled (false); } native public void dispose (); public void enable () { setEnabled (true); } /** * Get the graphics configuration of the component. The color model * of the component can be derived from the configuration. */ public GraphicsConfiguration getGraphicsConfiguration () { return null; } public FontMetrics getFontMetrics (Font font) { return null; //return new GdkFontMetrics (font); } public Graphics getGraphics () { throw new InternalError (); } public native Point getLocationOnScreen (); public native Dimension getMinimumSize(); public native Dimension getPreferredSize(); public Toolkit getToolkit () { return GtkToolkit.instance; } public void handleEvent(AWTEvent e) { } public void hide () { setVisible (false); } public void show () { setVisible (true); } public boolean isFocusTraversable () { return true; } public Dimension minimumSize () { return getMinimumSize(); } public Dimension preferredSize() { return getPreferredSize(); } public void paint (Graphics g) { awtComponent.paint (g); // ??? } 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; this.observer = observer; } public void run () { // XXX: need to return data to image observer image.source.startProduction (null); } } new PrepareImage (i, observer).start (); */ return false; } public void print (Graphics g) { throw new RuntimeException (); } native public void requestFocus (); public void repaint (long tm, int x, int y, int width, int height) { // ??? eventQueue.postEvent (new PaintEvent ( awtComponent, PaintEvent.UPDATE, new Rectangle (x, y, width, height))); } public void reshape (int x, int y, int width, int height) { setBounds (x, y, width, height); } public native void setBounds (int x, int y, int width, int height); public native void setCursor (Cursor cursor); public native void setEnabled (boolean b); public native void setEventMask(long eventMask); public native void setFont(Font font); public native void setForeground(Color color); public native void setBackground (Color c); public native void setVisible(boolean visible); native void realize(); protected GtkComponentPeer (Component awtComponent) { this.awtComponent = awtComponent; create(); // TODO: Each of these calls will currently perform a separate native lock. // It may be desirable to use our own, recusive mutex implementation by // passing our threads implementation to g_threads_init(). // This would greatly reduce locking calls in the peer code, and allow us // to aquire the lock from java code. Rectangle r = awtComponent.getBounds(); setBounds (r.x, r.y, r.width, r.height); Color c = awtComponent.getForeground(); if (c != null) setForeground (c); c = awtComponent.getBackground(); if (c != null) setBackground (c); setEnabled (awtComponent.isEnabled()); Font f = awtComponent.getFont(); if (f != null) setFont (awtComponent.getFont()); realize(); } protected native void create (); // FIXME: It may make sense to do the following directly from the native // code. protected void postMouseEvent(int id, long when, int mods, int x, int y, int clickCount, boolean popupTrigger) { eventQueue.postEvent(new MouseEvent(awtComponent, id, when, mods, x, y, clickCount, popupTrigger)); } protected void postExposeEvent (int x, int y, int width, int height) { eventQueue.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) { eventQueue.postEvent (new KeyEvent (awtComponent, id, when, mods, keyCode, keyChar)); } protected void postFocusEvent (int id, boolean temporary) { eventQueue.postEvent (new FocusEvent (awtComponent, id, temporary)); } protected void postItemEvent (Object item, int stateChange) { eventQueue.postEvent (new ItemEvent ((ItemSelectable)awtComponent, ItemEvent.ITEM_STATE_CHANGED, item, stateChange)); } }