diff options
author | Guilhem Lavaux <guilhem@kaffe.org> | 2006-02-18 18:33:27 +0000 |
---|---|---|
committer | Guilhem Lavaux <guilhem@kaffe.org> | 2006-02-18 18:33:27 +0000 |
commit | cc0db4315db5e0550da9a4a13f4b5e502e58a5c2 (patch) | |
tree | 25a49d0fc9588fae44f8e5edfc496f612a316931 /gnu/java/awt/peer | |
parent | 5093bf804963cd90f1c6c6053c0417f78b945ca6 (diff) | |
download | classpath-cc0db4315db5e0550da9a4a13f4b5e502e58a5c2.tar.gz |
Merged with HEAD.
Diffstat (limited to 'gnu/java/awt/peer')
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkButtonPeer.java | 7 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkCheckboxPeer.java | 8 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkComponentPeer.java | 115 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkFramePeer.java | 13 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkGenericPeer.java | 39 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkImage.java | 20 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkLabelPeer.java | 9 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkListPeer.java | 9 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkMenuBarPeer.java | 13 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java | 38 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkMenuItemPeer.java | 25 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkPanelPeer.java | 33 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkTextAreaPeer.java | 6 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkTextFieldPeer.java | 2 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkToolkit.java | 170 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkWindowPeer.java | 54 |
16 files changed, 324 insertions, 237 deletions
diff --git a/gnu/java/awt/peer/gtk/GtkButtonPeer.java b/gnu/java/awt/peer/gtk/GtkButtonPeer.java index 054ead6d6..63d9cd487 100644 --- a/gnu/java/awt/peer/gtk/GtkButtonPeer.java +++ b/gnu/java/awt/peer/gtk/GtkButtonPeer.java @@ -1,5 +1,5 @@ /* GtkButtonPeer.java -- Implements ButtonPeer with GTK - Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2004, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -57,7 +57,10 @@ public class GtkButtonPeer extends GtkComponentPeer public native void connectSignals (); - native void gtkWidgetModifyFont (String name, int style, int size); + /** + * Overridden to set Font of Label inside Button inside EventBox. + */ + protected native void gtkWidgetModifyFont(String name, int style, int size); native void gtkSetLabel (String label); native void gtkWidgetSetForeground (int red, int green, int blue); native void gtkWidgetSetBackground (int red, int green, int blue); diff --git a/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java b/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java index 3e05cf8ab..7b573256b 100644 --- a/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java +++ b/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java @@ -1,5 +1,5 @@ /* GtkCheckboxPeer.java -- Implements CheckboxPeer with GTK - Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2002, 2003, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -54,7 +54,11 @@ public class GtkCheckboxPeer extends GtkComponentPeer public native void create (GtkCheckboxGroupPeer group); public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group); public native void connectSignals (); - native void gtkWidgetModifyFont (String name, int style, int size); + + /** + * Overridden to set Font of label inside button. + */ + protected native void gtkWidgetModifyFont(String name, int style, int size); native void gtkButtonSetLabel (String label); native void gtkToggleButtonSetActive (boolean is_active); diff --git a/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/gnu/java/awt/peer/gtk/GtkComponentPeer.java index fe0dae70d..9c23fa30a 100644 --- a/gnu/java/awt/peer/gtk/GtkComponentPeer.java +++ b/gnu/java/awt/peer/gtk/GtkComponentPeer.java @@ -1,5 +1,6 @@ /* GtkComponentPeer.java -- Implements ComponentPeer with GTK - Copyright (C) 1998, 1999, 2002, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2002, 2004, 2005, 2006 + Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -46,10 +47,10 @@ import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; +import java.awt.EventQueue; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.Image; import java.awt.Insets; @@ -87,8 +88,6 @@ public class GtkComponentPeer extends GtkGenericPeer boolean isInRepaint; - static final Timer repaintTimer = new Timer (true); - /* 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 */ @@ -303,29 +302,29 @@ public class GtkComponentPeer extends GtkGenericPeer { case PaintEvent.PAINT: case PaintEvent.UPDATE: - { - try - { - Graphics g = getGraphics (); - - // Some peers like GtkFileDialogPeer are repainted by Gtk itself - if (g == null) - break; - - g.setClip (((PaintEvent) event).getUpdateRect()); - - if (id == PaintEvent.PAINT) - awtComponent.paint (g); - else - awtComponent.update (g); - - g.dispose (); - } - catch (InternalError e) - { - System.err.println (e); - } - } + { + try + { + Graphics g = getGraphics(); + + if (!awtComponent.isShowing() || awtComponent.getWidth() < 1 + || awtComponent.getHeight() < 1 || g == null) + break; + + g.setClip(((PaintEvent) event).getUpdateRect()); + + if (id == PaintEvent.PAINT) + awtComponent.paint(g); + else + awtComponent.update(g); + + g.dispose(); + } + catch (InternalError e) + { + System.err.println(e); + } + } break; case KeyEvent.KEY_PRESSED: ke = (KeyEvent) event; @@ -383,19 +382,30 @@ public class GtkComponentPeer extends GtkGenericPeer if (x == 0 && y == 0 && width == 0 && height == 0) return; - repaintTimer.schedule(new RepaintTimerTask(x, y, width, height), tm); + if (tm <= 0) + q().postEvent(new PaintEvent(awtComponent, PaintEvent.UPDATE, + new Rectangle(x, y, width, height))); + else + RepaintTimerTask.schedule(tm, x, y, width, height, awtComponent); } - private class RepaintTimerTask extends TimerTask + /** + * Used for scheduling delayed paint updates on the event queue. + */ + private static class RepaintTimerTask extends TimerTask { + private static final Timer repaintTimer = new Timer(true); + private int x, y, width, height; + private Component awtComponent; - RepaintTimerTask(int x, int y, int width, int height) + RepaintTimerTask(Component c, int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; + this.awtComponent = c; } public void run() @@ -403,6 +413,12 @@ public class GtkComponentPeer extends GtkGenericPeer q().postEvent (new PaintEvent (awtComponent, PaintEvent.UPDATE, new Rectangle (x, y, width, height))); } + + static void schedule(long tm, int x, int y, int width, int height, + Component c) + { + repaintTimer.schedule(new RepaintTimerTask(c, x, y, width, height), tm); + } } public void requestFocus () @@ -443,26 +459,17 @@ public class GtkComponentPeer extends GtkGenericPeer // non-lightweight. boolean lightweightChild = false; Insets i; - while (parent.isLightweight ()) + while (parent.isLightweight()) { - lightweightChild = true; + lightweightChild = true; - next_parent = parent.getParent (); + next_parent = parent.getParent(); - i = ((Container) parent).getInsets (); + i = ((Container) parent).getInsets(); + new_x += parent.getX() + i.left; + new_y += parent.getY() + i.top; - if (next_parent instanceof Window) - { - new_x += i.left; - new_y += i.top; - } - else - { - new_x += parent.getX () + i.left; - new_y += parent.getY () + i.top; - } - - parent = next_parent; + parent = next_parent; } // We only need to convert from Java to GTK coordinates if we're @@ -571,6 +578,8 @@ public class GtkComponentPeer extends GtkGenericPeer KeyEvent keyEvent = new KeyEvent (awtComponent, id, when, mods, keyCode, keyChar, keyLocation); + EventQueue q = q(); + // Also post a KEY_TYPED event if keyEvent is a key press that // doesn't represent an action or modifier key. if (keyEvent.getID () == KeyEvent.KEY_PRESSED @@ -579,15 +588,17 @@ public class GtkComponentPeer extends GtkGenericPeer && keyCode != KeyEvent.VK_CONTROL && keyCode != KeyEvent.VK_ALT)) { - synchronized (q) - { - q().postEvent (keyEvent); - q().postEvent (new KeyEvent (awtComponent, KeyEvent.KEY_TYPED, when, mods, - KeyEvent.VK_UNDEFINED, keyChar, keyLocation)); + synchronized(q) + { + q.postEvent(keyEvent); + keyEvent = new KeyEvent(awtComponent, KeyEvent.KEY_TYPED, when, + mods, KeyEvent.VK_UNDEFINED, keyChar, + keyLocation); + q.postEvent(keyEvent); } } else - q().postEvent (keyEvent); + q.postEvent(keyEvent); } protected void postFocusEvent (int id, boolean temporary) diff --git a/gnu/java/awt/peer/gtk/GtkFramePeer.java b/gnu/java/awt/peer/gtk/GtkFramePeer.java index 99cca0cff..f59e781c2 100644 --- a/gnu/java/awt/peer/gtk/GtkFramePeer.java +++ b/gnu/java/awt/peer/gtk/GtkFramePeer.java @@ -43,10 +43,7 @@ import java.awt.Graphics; import java.awt.Image; import java.awt.MenuBar; import java.awt.Rectangle; -import java.awt.Window; -import java.awt.event.ComponentEvent; import java.awt.event.PaintEvent; -import java.awt.image.ColorModel; import java.awt.peer.FramePeer; import java.awt.peer.MenuBarPeer; @@ -77,7 +74,10 @@ public class GtkFramePeer extends GtkWindowPeer removeMenuBarPeer (); insets.top -= menuBarHeight; menuBarHeight = 0; - awtComponent.validate (); + // if component has already been validated, we need to revalidate. + // otherwise, it will be validated when it is shown. + if (awtComponent.isValid()) + awtComponent.validate (); gtkFixedSetVisible (true); } else if (bar != null && menuBar == null) @@ -92,7 +92,10 @@ public class GtkFramePeer extends GtkWindowPeer setMenuBarWidth (menuBar, menuBarWidth); menuBarHeight = getMenuBarHeight (); insets.top += menuBarHeight; - awtComponent.validate (); + // if component has already been validated, we need to revalidate. + // otherwise, it will be validated when it is shown. + if (awtComponent.isValid()) + awtComponent.validate (); gtkFixedSetVisible (true); } else if (bar != null && menuBar != null) diff --git a/gnu/java/awt/peer/gtk/GtkGenericPeer.java b/gnu/java/awt/peer/gtk/GtkGenericPeer.java index 705eed235..468c46dc4 100644 --- a/gnu/java/awt/peer/gtk/GtkGenericPeer.java +++ b/gnu/java/awt/peer/gtk/GtkGenericPeer.java @@ -1,5 +1,5 @@ /* GtkGenericPeer.java - Has a hashcode. Yuck. - Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2002, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -39,23 +39,28 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; import java.awt.EventQueue; +import java.awt.Font; import java.awt.Toolkit; import java.awt.event.ActionEvent; public class GtkGenericPeer { + // Used by Native State Association (NSA) functions to map + // gtk_widget to peer object. final int native_state = getUniqueInteger (); // Next native state value we will assign. private static int next_native_state = 0; // The widget or other java-side object we wrap. - protected Object awtWidget; - - // Global event queue. - protected static EventQueue q = null; - - // Dispose of our native state. + protected final Object awtWidget; + + /** + * Dispose of our native state. Calls gtk_widget_destroy on the + * native widget and removes the awtWidget from the native state + * tables. Should be overridden by subclasses if this is not (all) + * that needs to be done. + */ public native void dispose (); static EventQueue q () @@ -68,12 +73,6 @@ public class GtkGenericPeer this.awtWidget = awtWidget; } - public static void enableQueue (EventQueue sq) - { - if (q == null) - q = sq; - } - protected void postActionEvent (String command, int mods) { q().postEvent (new ActionEvent (awtWidget, ActionEvent.ACTION_PERFORMED, @@ -88,8 +87,20 @@ public class GtkGenericPeer // Let's assume this will never wrap. return next_native_state++; } + + /** + * Helper method to set Font for Gtk Widget. + */ + protected void gtkWidgetModifyFont(Font f) + { + gtkWidgetModifyFont(f.getName(), f.getStyle(), f.getSize()); + } - native void gtkWidgetModifyFont (String name, int style, int size); + /** + * Sets font for this Gtk Widget. Should be overridden by peers which + * are composed of different widgets or are contained in bins. + */ + protected native void gtkWidgetModifyFont(String name, int style, int size); static void printCurrentThread () { diff --git a/gnu/java/awt/peer/gtk/GtkImage.java b/gnu/java/awt/peer/gtk/GtkImage.java index 82a346304..b48a2049e 100644 --- a/gnu/java/awt/peer/gtk/GtkImage.java +++ b/gnu/java/awt/peer/gtk/GtkImage.java @@ -1,5 +1,5 @@ /* GtkImage.java - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -329,6 +329,24 @@ public class GtkImage extends Image props = new Hashtable(); } + // The singleton GtkImage that is returned on errors by GtkToolkit. + private static GtkImage errorImage; + + /** + * Returns an empty GtkImage with the errorLoading flag set. + * Called from GtkToolKit when some error occured, but an image needs + * to be returned anyway. + */ + static synchronized GtkImage getErrorImage() + { + if (errorImage == null) + { + errorImage = new GtkImage(); + errorImage.errorLoading = true; + } + return errorImage; + } + /** * Native helper function for constructor that takes a pixbuf Pointer. */ diff --git a/gnu/java/awt/peer/gtk/GtkLabelPeer.java b/gnu/java/awt/peer/gtk/GtkLabelPeer.java index 3d099e9ca..bbf4230b3 100644 --- a/gnu/java/awt/peer/gtk/GtkLabelPeer.java +++ b/gnu/java/awt/peer/gtk/GtkLabelPeer.java @@ -1,5 +1,5 @@ /* GtkLabelPeer.java -- Implements LabelPeer with GTK - Copyright (C) 1998, 1999, 2005 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -48,7 +48,12 @@ public class GtkLabelPeer extends GtkComponentPeer implements LabelPeer { native void create (String text, float alignment); - native void gtkWidgetModifyFont (String name, int style, int size); + + /** + * Overridden to set the Font of the label inside the gtk_event_box. + */ + protected native void gtkWidgetModifyFont(String name, int style, int size); + native void nativeSetAlignment (float alignment); public native void setText(String text); diff --git a/gnu/java/awt/peer/gtk/GtkListPeer.java b/gnu/java/awt/peer/gtk/GtkListPeer.java index ff12fe34b..285f79416 100644 --- a/gnu/java/awt/peer/gtk/GtkListPeer.java +++ b/gnu/java/awt/peer/gtk/GtkListPeer.java @@ -1,5 +1,5 @@ /* GtkListPeer.java -- Implements ListPeer with GTK - Copyright (C) 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -59,7 +59,12 @@ public class GtkListPeer extends GtkComponentPeer native void create (int rows); native void connectSignals (); - native void gtkWidgetModifyFont (String name, int style, int size); + + /** + * Overridden to set the Font of the text insode the gtk_scrolled_window. + */ + protected native void gtkWidgetModifyFont (String name, int style, int size); + native void gtkWidgetRequestFocus (); native void getSize (int rows, int visibleRows, int dims[]); diff --git a/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java b/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java index a1a1cbd6d..13debbf5c 100644 --- a/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java +++ b/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java @@ -1,5 +1,5 @@ /* GtkMenuBarPeer.java -- Implements MenuBarPeer with GTK+ - Copyright (C) 1999, 2005 Free Software Foundation, Inc. + Copyright (C) 1999, 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -49,7 +49,7 @@ public class GtkMenuBarPeer extends GtkMenuComponentPeer implements MenuBarPeer { - native void create (); + protected native void create (); native void addMenu (MenuPeer menu); public GtkMenuBarPeer (MenuBar target) @@ -57,15 +57,6 @@ public class GtkMenuBarPeer extends GtkMenuComponentPeer super (target); } - void setFont () - { - MenuComponent mc = (MenuComponent) awtWidget; - Font f = mc.getFont (); - - if (f == null) - mc.setFont (new Font ("Dialog", Font.PLAIN, 12)); - } - // FIXME: remove this method or replace it with one that does // something useful. /* In Gnome, help menus are no longer right flushed. */ diff --git a/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java b/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java index 4c6335933..a2b993b60 100644 --- a/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java +++ b/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java @@ -1,5 +1,5 @@ /* GtkMenuComponentPeer.java -- Implements MenuComponentPeer with GTK+ - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 1999, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -39,18 +39,35 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; import java.awt.Font; +import java.awt.MenuComponent; +import java.awt.MenuContainer; import java.awt.peer.MenuComponentPeer; -public class GtkMenuComponentPeer extends GtkGenericPeer +public abstract class GtkMenuComponentPeer extends GtkGenericPeer implements MenuComponentPeer { - void create () - { - throw new RuntimeException (); - } + protected abstract void create (); - void setFont () + /** + * Sets font based on MenuComponent font, or containing menu(bar) + * parent font. + */ + private void setFont() { + MenuComponent mc = ((MenuComponent) awtWidget); + Font f = mc.getFont (); + + if (f == null) + { + MenuContainer parent = mc.getParent (); + // Submenus inherit the font of their containing Menu(Bar). + if (parent instanceof MenuComponent) + f = parent.getFont (); + } + if (f != null) + { + gtkWidgetModifyFont(f); + } } public GtkMenuComponentPeer (Object awtWidget) @@ -60,10 +77,15 @@ public class GtkMenuComponentPeer extends GtkGenericPeer setFont (); } + /** + * Removes the awtWidget components from the native state tables. + * Subclasses should call <code>super.dispose()</code> if they don't + * remove these themselves. + */ public native void dispose(); public void setFont(Font font) { - // FIXME: implement + gtkWidgetModifyFont(font); } } diff --git a/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java b/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java index 5728f262b..3d6738ba0 100644 --- a/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java +++ b/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java @@ -1,5 +1,5 @@ /* GtkMenuItemPeer.java -- Implements MenuItemPeer with GTK+ - Copyright (C) 1999, 2005 Free Software Foundation, Inc. + Copyright (C) 1999, 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -51,9 +51,13 @@ public class GtkMenuItemPeer extends GtkMenuComponentPeer { native void create (String label); native void connectSignals (); - native void gtkWidgetModifyFont (String name, int style, int size); - void create () + /** + * Overridden to set font on menu item label. + */ + protected native void gtkWidgetModifyFont(String name, int style, int size); + + protected void create() { create (((MenuItem) awtWidget).getLabel()); } @@ -68,21 +72,6 @@ public class GtkMenuItemPeer extends GtkMenuComponentPeer connectSignals(); } - void setFont () - { - MenuComponent mc = ((MenuComponent) awtWidget); - Font f = mc.getFont (); - - if (f == null) - { - MenuComponent parent = (MenuComponent) mc.getParent (); - Font pf = parent.getFont (); - gtkWidgetModifyFont (pf.getName (), pf.getStyle (), pf.getSize ()); - } - else - gtkWidgetModifyFont(f.getName(), f.getStyle(), f.getSize()); - } - void setParent (MenuItem item) { // add ourself differently, based on what type of parent we have diff --git a/gnu/java/awt/peer/gtk/GtkPanelPeer.java b/gnu/java/awt/peer/gtk/GtkPanelPeer.java index fb5addeb4..88bb71569 100644 --- a/gnu/java/awt/peer/gtk/GtkPanelPeer.java +++ b/gnu/java/awt/peer/gtk/GtkPanelPeer.java @@ -39,8 +39,11 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; import java.awt.AWTEvent; +import java.awt.Graphics; import java.awt.Panel; +import java.awt.event.ComponentEvent; import java.awt.event.MouseEvent; +import java.awt.event.PaintEvent; import java.awt.peer.PanelPeer; public class GtkPanelPeer extends GtkContainerPeer @@ -53,17 +56,39 @@ public class GtkPanelPeer extends GtkContainerPeer super (p); } - public void handleEvent (AWTEvent event) + public void handleEvent(AWTEvent event) { int id = event.getID(); - switch (id) { case MouseEvent.MOUSE_PRESSED: - awtComponent.requestFocusInWindow (); + awtComponent.requestFocusInWindow(); break; + case PaintEvent.UPDATE: + case PaintEvent.PAINT: + { + try + { + Graphics g = getGraphics(); + if (! awtComponent.isShowing() || awtComponent.getWidth() < 1 + || awtComponent.getHeight() < 1 || g == null) + return; + + g.setClip(((PaintEvent) event).getUpdateRect()); + + // Do not want to clear anything before painting.); + awtComponent.paint(g); + + g.dispose(); + return; + } + catch (InternalError e) + { + System.err.println(e); + } + } } - super.handleEvent (event); + super.handleEvent(event); } native void connectSignals (); diff --git a/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java b/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java index e6896c913..5d9be1aec 100644 --- a/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java +++ b/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java @@ -55,7 +55,11 @@ public class GtkTextAreaPeer extends GtkComponentPeer native void create (int width, int height, int scrollbarVisibility); - native void gtkWidgetModifyFont (String name, int style, int size); + /** + * Overridden to set Font for text widget inside scrolled window. + */ + protected native void gtkWidgetModifyFont(String name, int style, int size); + native void gtkWidgetRequestFocus (); public native void connectSignals (); diff --git a/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java b/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java index 4afdae82e..763304864 100644 --- a/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java +++ b/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java @@ -112,8 +112,6 @@ public class GtkTextFieldPeer extends GtkComponentPeer native int gtkEntryGetBorderWidth (); - native void gtkWidgetModifyFont (String name, int style, int size); - public GtkTextFieldPeer (TextField tf) { super (tf); diff --git a/gnu/java/awt/peer/gtk/GtkToolkit.java b/gnu/java/awt/peer/gtk/GtkToolkit.java index 0889d85f4..70e25a319 100644 --- a/gnu/java/awt/peer/gtk/GtkToolkit.java +++ b/gnu/java/awt/peer/gtk/GtkToolkit.java @@ -1,5 +1,6 @@ /* GtkToolkit.java -- Implements an AWT Toolkit using GTK for peers - Copyright (C) 1998, 1999, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -159,137 +160,93 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit } /** - * A helper class to return to clients in cases where a BufferedImage is - * desired but its construction fails. + * Helper to return either a Image -- the argument -- or a + * GtkImage with the errorLoading flag set if the argument is null. */ - private class GtkErrorImage extends Image - { - public GtkErrorImage() - { - } - - public int getWidth(ImageObserver observer) - { - return -1; - } - - public int getHeight(ImageObserver observer) - { - return -1; - } - - public ImageProducer getSource() - { - - return new ImageProducer() - { - HashSet consumers = new HashSet(); - public void addConsumer(ImageConsumer ic) - { - consumers.add(ic); - } - - public boolean isConsumer(ImageConsumer ic) - { - return consumers.contains(ic); - } - - public void removeConsumer(ImageConsumer ic) - { - consumers.remove(ic); - } - - public void startProduction(ImageConsumer ic) - { - consumers.add(ic); - Iterator i = consumers.iterator(); - while(i.hasNext()) - { - ImageConsumer c = (ImageConsumer) i.next(); - c.imageComplete(ImageConsumer.IMAGEERROR); - } - } - public void requestTopDownLeftRightResend(ImageConsumer ic) - { - startProduction(ic); - } - }; - } - - public Graphics getGraphics() - { - return null; - } - - public Object getProperty(String name, ImageObserver observer) - { - return null; - } - public Image getScaledInstance(int width, int height, int flags) - { - return new GtkErrorImage(); - } - - public void flush() - { - } - } - - - /** - * Helper to return either a BufferedImage -- the argument -- or a - * GtkErrorImage if the argument is null. - */ - - private Image bufferedImageOrError(BufferedImage b) + private Image imageOrError(Image b) { if (b == null) - return new GtkErrorImage(); + return GtkImage.getErrorImage(); else return b; } - public Image createImage (String filename) { if (filename.length() == 0) return new GtkImage (); - - if (useGraphics2D()) - return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (filename)); - else - return new GtkImage (filename); + + Image image; + try + { + if (useGraphics2D()) + image = GdkPixbufDecoder.createBufferedImage(filename); + else + image = new GtkImage(filename); + } + catch (IllegalArgumentException iae) + { + image = null; + } + return imageOrError(image); } public Image createImage (URL url) { - if (useGraphics2D()) - return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (url)); - else - return new GtkImage (url); + Image image; + try + { + if (useGraphics2D()) + image = GdkPixbufDecoder.createBufferedImage(url); + else + image = new GtkImage(url); + } + catch (IllegalArgumentException iae) + { + image = null; + } + return imageOrError(image); } public Image createImage (ImageProducer producer) { - if (useGraphics2D()) - return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (producer)); - else - return new GtkImage (producer); + Image image; + try + { + if (useGraphics2D()) + image = GdkPixbufDecoder.createBufferedImage(producer); + else + image = new GtkImage(producer); + } + catch (IllegalArgumentException iae) + { + image = null; + } + return imageOrError(image); } public Image createImage (byte[] imagedata, int imageoffset, int imagelength) { - if (useGraphics2D()) - return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (imagedata, - imageoffset, - imagelength)); - else + Image image; + try + { + if (useGraphics2D()) + image = GdkPixbufDecoder.createBufferedImage(imagedata, + imageoffset, + imagelength); + else + { + byte[] datacopy = new byte[imagelength]; + System.arraycopy(imagedata, imageoffset, datacopy, 0, imagelength); + return new GtkImage(datacopy); + } + } + catch (IllegalArgumentException iae) { - byte[] datacopy = new byte[imagelength]; - System.arraycopy (imagedata, imageoffset, datacopy, 0, imagelength); - return new GtkImage (datacopy); + image = null; } + return imageOrError(image); } /** @@ -608,7 +565,6 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit if (q == null) { q = new EventQueue(); - GtkGenericPeer.enableQueue (q); } } return q; diff --git a/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/gnu/java/awt/peer/gtk/GtkWindowPeer.java index 57fb87f37..6cc1390ea 100644 --- a/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/gnu/java/awt/peer/gtk/GtkWindowPeer.java @@ -38,9 +38,12 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; +import java.awt.AWTEvent; import java.awt.Component; import java.awt.Frame; +import java.awt.Graphics; import java.awt.Window; +import java.awt.event.PaintEvent; import java.awt.event.WindowEvent; import java.awt.peer.WindowPeer; @@ -123,7 +126,23 @@ public class GtkWindowPeer extends GtkContainerPeer native void nativeSetBounds (int x, int y, int width, int height); native void nativeSetBoundsUnlocked (int x, int y, int width, int height); + native void nativeSetLocation (int x, int y); + native void nativeSetLocationUnlocked (int x, int y); + public void setLocation (int x, int y) + { + // prevent window_configure_cb -> awtComponent.setSize -> + // peer.setBounds -> nativeSetBounds self-deadlock on GDK lock. + if (Thread.currentThread() == GtkToolkit.mainThread) + return; + nativeSetLocation (x, y); + } + + public void setLocationUnlocked (int x, int y) + { + nativeSetLocationUnlocked (x, y); + } + public void setBounds (int x, int y, int width, int height) { // prevent window_configure_cb -> awtComponent.setSize -> @@ -192,12 +211,7 @@ public class GtkWindowPeer extends GtkContainerPeer public void show () { - // Prevent the window manager from automatically placing this - // window when it is shown. - setBounds (awtComponent.getX(), - awtComponent.getY(), - awtComponent.getWidth(), - awtComponent.getHeight()); + setLocation(awtComponent.getX(), awtComponent.getY()); setVisible (true); } @@ -235,4 +249,32 @@ public class GtkWindowPeer extends GtkContainerPeer // TODO Auto-generated method stub return false; } + + public void handleEvent(AWTEvent event) + { + int id = event.getID(); + if (id == PaintEvent.UPDATE || id == PaintEvent.PAINT) + { + try + { + Graphics g = getGraphics(); + if (! awtComponent.isShowing() || awtComponent.getWidth() < 1 + || awtComponent.getHeight() < 1 || g == null) + return; + + g.setClip(((PaintEvent) event).getUpdateRect()); + + // Do not want to clear anything before painting. + awtComponent.paint(g); + + g.dispose(); + return; + } + catch (InternalError e) + { + System.err.println(e); + } + } + super.handleEvent(event); + } } |