diff options
| author | mark <mark@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-10 21:46:48 +0000 |
|---|---|---|
| committer | mark <mark@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-10 21:46:48 +0000 |
| commit | ce57ab760f69de6db452def7ffbf5b114a2d8694 (patch) | |
| tree | ea38c56431c5d4528fb54254c3f8e50f517bede3 /libjava/classpath/gnu/java/awt/peer/gtk | |
| parent | 50996fe55769882de3f410896032c887f0ff0d04 (diff) | |
| download | ppe42-gcc-ce57ab760f69de6db452def7ffbf5b114a2d8694.tar.gz ppe42-gcc-ce57ab760f69de6db452def7ffbf5b114a2d8694.zip | |
Imported GNU Classpath 0.90
* scripts/makemake.tcl: Set gnu/java/awt/peer/swing to ignore.
* gnu/classpath/jdwp/VMFrame.java (SIZE): New constant.
* java/lang/VMCompiler.java: Use gnu.java.security.hash.MD5.
* java/lang/Math.java: New override file.
* java/lang/Character.java: Merged from Classpath.
(start, end): Now 'int's.
(canonicalName): New field.
(CANONICAL_NAME, NO_SPACES_NAME, CONSTANT_NAME): New constants.
(UnicodeBlock): Added argument.
(of): New overload.
(forName): New method.
Updated unicode blocks.
(sets): Updated.
* sources.am: Regenerated.
* Makefile.in: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111942 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/classpath/gnu/java/awt/peer/gtk')
22 files changed, 546 insertions, 393 deletions
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkButtonPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkButtonPeer.java index 054ead6d601..63d9cd48715 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkButtonPeer.java +++ b/libjava/classpath/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/libjava/classpath/gnu/java/awt/peer/gtk/GtkCheckboxMenuItemPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkCheckboxMenuItemPeer.java index 01a6e3102d9..be9247e8d86 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkCheckboxMenuItemPeer.java +++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkCheckboxMenuItemPeer.java @@ -1,5 +1,5 @@ /* GtkCheckboxMenuItemPeer.java -- Implements CheckboxMenuItemPeer 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. @@ -46,7 +46,7 @@ import java.awt.peer.CheckboxMenuItemPeer; public class GtkCheckboxMenuItemPeer extends GtkMenuItemPeer implements CheckboxMenuItemPeer { - native void create (String label); + protected native void create (String label); public GtkCheckboxMenuItemPeer (CheckboxMenuItem menu) { @@ -56,6 +56,11 @@ public class GtkCheckboxMenuItemPeer extends GtkMenuItemPeer public native void setState(boolean t); + /** + * Called from the signal handler of the gtk widget. Posts a + * ItemEvent to indicate a state changed, then calls super to post + * an ActionEvent. + */ protected void postMenuActionEvent () { CheckboxMenuItem item = (CheckboxMenuItem)awtWidget; diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java index 3e05cf8ab07..094aa3c0391 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java +++ b/libjava/classpath/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. @@ -42,6 +42,8 @@ import java.awt.Checkbox; import java.awt.CheckboxGroup; import java.awt.peer.CheckboxPeer; +import java.awt.event.ItemEvent; + public class GtkCheckboxPeer extends GtkComponentPeer implements CheckboxPeer { @@ -49,12 +51,15 @@ public class GtkCheckboxPeer extends GtkComponentPeer public GtkCheckboxGroupPeer old_group; // The current state of the GTK checkbox. private boolean currentState; - private boolean changing = false; 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); @@ -71,23 +76,24 @@ public class GtkCheckboxPeer extends GtkComponentPeer CheckboxGroup g = checkbox.getCheckboxGroup (); old_group = GtkCheckboxGroupPeer.getCheckboxGroupPeer (g); create (old_group); - gtkToggleButtonSetActive (checkbox.getState ()); + currentState = checkbox.getState(); + gtkToggleButtonSetActive(currentState); gtkButtonSetLabel (checkbox.getLabel ()); } - public void setState (boolean state) + /** + * Sets native GtkCheckButton is state is different from current + * state. Will set currentState to state to prevent posting an + * event since events should only be posted for user initiated + * clicks on the GtkCheckButton. + */ + synchronized public void setState (boolean state) { - // prevent item_toggled_cb -> postItemEvent -> - // awtComponent.setState -> this.setState -> - // gtkToggleButtonSetActive self-deadlock on the GDK lock. - if (changing && Thread.currentThread() == GtkToolkit.mainThread) + if (currentState != state) { - changing = false; - return; + currentState = state; + gtkToggleButtonSetActive(state); } - - if (currentState != state) - gtkToggleButtonSetActive (state); } public void setLabel (String label) @@ -111,22 +117,15 @@ public class GtkCheckboxPeer extends GtkComponentPeer // Override the superclass postItemEvent so that the peer doesn't // need information that we have. // called back by native side: item_toggled_cb - public void postItemEvent (Object item, int stateChange) + synchronized public void postItemEvent(Object item, boolean state) { - Checkbox currentCheckBox = ((Checkbox)awtComponent); - // A firing of the event is only desired if the state has changed due to a - // button press. The currentCheckBox's state must be different from the - // one that the stateChange is changing to. - // stateChange = 1 if it goes from false -> true - // stateChange = 2 if it goes from true -> false - if (( !currentCheckBox.getState() && stateChange == 1) - || (currentCheckBox.getState() && stateChange == 2)) - { - super.postItemEvent (awtComponent, stateChange); - currentState = !currentCheckBox.getState(); - changing = true; - currentCheckBox.setState(currentState); - } + // Only fire event is state actually changed. + if (currentState != state) + { + currentState = state; + super.postItemEvent(awtComponent, + state ? ItemEvent.SELECTED : ItemEvent.DESELECTED); + } } public void dispose () diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkComponentPeer.java index fe0dae70dd0..821183927b0 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkComponentPeer.java +++ b/libjava/classpath/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 */ @@ -146,12 +145,7 @@ public class GtkComponentPeer extends GtkGenericPeer Component parent = awtComponent.getParent (); - // Only set our parent on the GTK side if our parent on the AWT - // side is not showing. Otherwise the gtk peer will be shown - // before we've had a chance to position and size it properly. - if (awtComponent instanceof Window - || (parent != null && ! parent.isShowing ())) - setParentAndBounds (); + setParentAndBounds (); setNativeEventMask (); @@ -202,11 +196,6 @@ public class GtkComponentPeer extends GtkGenericPeer void setComponentBounds () { Rectangle bounds = awtComponent.getBounds (); - - if (bounds.x == 0 && bounds.y == 0 - && bounds.width == 0 && bounds.height == 0) - return; - setBounds (bounds.x, bounds.y, bounds.width, bounds.height); } @@ -303,29 +292,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 +372,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 +403,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 () @@ -429,8 +435,7 @@ public class GtkComponentPeer extends GtkGenericPeer 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 @@ -441,33 +446,19 @@ public class GtkComponentPeer extends GtkGenericPeer // 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 ()) + Insets i; + while (parent.isLightweight()) { - lightweightChild = true; - - next_parent = parent.getParent (); - - i = ((Container) parent).getInsets (); - - 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; + i = ((Container) parent).getInsets(); + + new_x += parent.getX() + i.left; + new_y += parent.getY() + i.top; + + parent = parent.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 @@ -479,12 +470,17 @@ public class GtkComponentPeer extends GtkGenericPeer int menuBarHeight = 0; if (peer instanceof GtkFramePeer) menuBarHeight = ((GtkFramePeer) peer).getMenuBarHeight (); - - new_x = x - insets.left; - new_y = y - insets.top + menuBarHeight; + + new_x -= insets.left; + new_y -= insets.top; + new_y += menuBarHeight; } setNativeBounds (new_x, new_y, width, height); + + // If the height or width were (or are now) smaller than zero + // then we want to adjust the visibility. + setVisible(awtComponent.isVisible()); } void setCursor () @@ -535,6 +531,13 @@ public class GtkComponentPeer extends GtkGenericPeer public void setVisible (boolean b) { + // Only really set visible when component is bigger than zero pixels. + if (b) + { + Rectangle bounds = awtComponent.getBounds(); + b = (bounds.width > 0) && (bounds.height > 0); + } + if (Thread.currentThread() == GtkToolkit.mainThread) setVisibleNativeUnlocked (b); else @@ -571,6 +574,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 +584,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/libjava/classpath/gnu/java/awt/peer/gtk/GtkContainerPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkContainerPeer.java index b035a9814c7..23737b0b0a0 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkContainerPeer.java +++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkContainerPeer.java @@ -1,5 +1,5 @@ /* GtkContainerPeer.java -- Implements ContainerPeer 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. @@ -65,29 +65,6 @@ public class GtkContainerPeer extends GtkComponentPeer public void endValidate () { - Component parent = awtComponent.getParent (); - - // Only set our parent on the GTK side if our parent on the AWT - // side is not showing. Otherwise the gtk peer will be shown - // before we've had a chance to position and size it properly. - if (parent != null && parent.isShowing ()) - { - Component[] components = ((Container) awtComponent).getComponents (); - int ncomponents = components.length; - - for (int i = 0; i < ncomponents; i++) - { - ComponentPeer peer = components[i].getPeer (); - - // Skip lightweight peers. - if (peer instanceof GtkComponentPeer) - ((GtkComponentPeer) peer).setParentAndBounds (); - } - - // GTK windows don't have parents. - if (!(awtComponent instanceof Window)) - setParentAndBounds (); - } } public Insets getInsets() diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java index 333407b247f..a0ae9e9eef5 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java +++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java @@ -41,8 +41,6 @@ package gnu.java.awt.peer.gtk; import java.awt.Dialog; import java.awt.FileDialog; import java.awt.Graphics; -import java.awt.Window; -import java.awt.event.ComponentEvent; import java.awt.peer.FileDialogPeer; import java.io.File; import java.io.FilenameFilter; @@ -68,7 +66,8 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer ((FileDialog) awtComponent).getMode()); FileDialog fd = (FileDialog) awtComponent; - + + nativeSetDirectory(System.getProperty("user.dir")); setDirectory(fd.getDirectory()); setFile(fd.getFile()); @@ -117,13 +116,9 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer // is not absolute, let's construct it based on current directory. currentFile = fileName; if (fileName.indexOf(FS) == 0) - { - nativeSetFile (fileName); - } + nativeSetFile(fileName); else - { - nativeSetFile (nativeGetDirectory() + FS + fileName); - } + nativeSetFile(nativeGetDirectory() + FS + fileName); } public void setDirectory (String directory) @@ -132,18 +127,24 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer the only way we have to set the directory in FileDialog is by calling its setDirectory which will call us back. */ if ((directory == null && currentDirectory == null) - || (directory != null && directory.equals (currentDirectory))) + || (directory != null && directory.equals(currentDirectory))) return; - if (directory == null || directory.equals ("")) + if (directory == null || directory.equals("")) { currentDirectory = FS; - nativeSetFile (FS); - return; + nativeSetDirectory(FS); + return; } - + + // GtkFileChooser requires absolute directory names. If the given directory + // name is not absolute, construct it based on current directory if it is not + // null. Otherwise, use FS. currentDirectory = directory; - nativeSetDirectory (directory); + if (directory.indexOf(FS) == 0) + nativeSetDirectory(directory); + else + nativeSetDirectory(nativeGetDirectory() + FS + directory); } public void setFilenameFilter (FilenameFilter filter) diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkFramePeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkFramePeer.java index 99cca0cffa7..f59e781c2a4 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkFramePeer.java +++ b/libjava/classpath/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/libjava/classpath/gnu/java/awt/peer/gtk/GtkGenericPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkGenericPeer.java index 705eed2351b..468c46dc4af 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkGenericPeer.java +++ b/libjava/classpath/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/libjava/classpath/gnu/java/awt/peer/gtk/GtkImage.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkImage.java index 82a346304ea..b48a2049e27 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkImage.java +++ b/libjava/classpath/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/libjava/classpath/gnu/java/awt/peer/gtk/GtkLabelPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkLabelPeer.java index 3d099e9ca00..bbf4230b3ca 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkLabelPeer.java +++ b/libjava/classpath/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/libjava/classpath/gnu/java/awt/peer/gtk/GtkListPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkListPeer.java index ff12fe34bba..285f79416f3 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkListPeer.java +++ b/libjava/classpath/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/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java index a1a1cbd6d7c..d203b437f38 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java +++ b/libjava/classpath/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. @@ -48,38 +48,69 @@ import java.awt.peer.MenuPeer; public class GtkMenuBarPeer extends GtkMenuComponentPeer implements MenuBarPeer { - - native void create (); - native void addMenu (MenuPeer menu); - - public GtkMenuBarPeer (MenuBar target) + /** Whether we already have an help menu set on this peer. */ + private boolean hasHelpMenu; + + /** + * Creates the gtk+ widget for this peer and puts it in the nsa + * table. Called from the (super class) constructor. + */ + protected native void create(); + + /** + * Adds a new GtkMenuPeer to the end of the GtkMenuBarPeer. + */ + private native void addMenu(GtkMenuPeer menu); + + /** + * Creates a new GtkMenuBarPeer associated with the given MenuBar. + */ + public GtkMenuBarPeer(MenuBar menubar) { - super (target); + super(menubar); } - 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. */ - native void nativeSetHelpMenu(MenuPeer menuPeer); - + /** + * Adds a help menu to this MenuBar. Gnome styleguides say the help + * menu is just the last item in the menubar (they are NOT right + * justified). + */ public void addHelpMenu (Menu menu) { - // nativeSetHelpMenu((MenuPeer) menu.getPeer()); + if (hasHelpMenu) + { + // Remove the (help) menu, which is after all the other items. + delMenu(((MenuBar) awtWidget).getMenuCount()); + hasHelpMenu = false; + } + + if (menu != null) + { + addMenu(menu); + hasHelpMenu = true; + } } + /** + * Deletes the menu at (zero-based) index from this GtkMenuBar. + */ public native void delMenu(int index); - public void addMenu (Menu m) + /** + * Adds the GtkMenuPeer associated with the Menu to this + * GtkMenuBarPeer. Makes sure that any help menus keep the last menu + * on the bar. + */ + public void addMenu(Menu m) { - // FIXME: implement + // Make sure the help menu is the last one. + if (hasHelpMenu) + { + addHelpMenu(null); + addMenu((GtkMenuPeer) m.getPeer()); + addHelpMenu(((MenuBar) awtWidget).getHelpMenu()); + } + else + addMenu((GtkMenuPeer) m.getPeer()); } } diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java index 4c6335933a8..55b95a18d0f 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java +++ b/libjava/classpath/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,31 +39,66 @@ 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 (); - } + /** + * Creates the associated gtk+ widget and stores it in the nsa table + * for this peer. Called by the constructor. + */ + 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 (); + } + + setFont(f); } - public GtkMenuComponentPeer (Object awtWidget) + /** + * Will call the abstract <code>create()</code> that needs to be + * overridden by subclasses, to create the MenuComponent. It will + * then correctly setup the font for the component based on the + * component and/or its containing parent component. + */ + public GtkMenuComponentPeer(MenuComponent component) { - super (awtWidget); - create (); - setFont (); + super(component); + create(); + 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(); + /** + * Sets the font for this particular MenuComponent only (not any + * containing items, if any). + */ public void setFont(Font font) { - // FIXME: implement + if (font != null) + gtkWidgetModifyFont(font); } } diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java index 5728f262b13..251bab233d7 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java +++ b/libjava/classpath/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. @@ -49,70 +49,71 @@ import java.awt.peer.MenuPeer; public class GtkMenuItemPeer extends GtkMenuComponentPeer implements MenuItemPeer { - native void create (String label); - native void connectSignals (); - native void gtkWidgetModifyFont (String name, int style, int size); - - void create () + /** + * Creates the associated gtk+ widget and stores it in the nsa table + * for this peer. Called by the create() method with the label name + * of the associated MenuItem. Needs to be overridden my subclasses + * that want to create a different gtk+ widget. + */ + protected native void create (String label); + + /** + * Called from constructor to enable signals from an item. If a + * subclass needs different (or no) signals connected this method + * should be overridden. + */ + protected native void connectSignals (); + + /** + * Overridden to set font on menu item label. + */ + protected native void gtkWidgetModifyFont(String name, int style, int size); + + /** + * Creates the associated gtk+ widget and stores it in the nsa table + * for this peer. Called by the (super class) constructor. + * Overridden to get the label if the assiociated MenuItem and to + * call create(String). + */ + protected void create() { create (((MenuItem) awtWidget).getLabel()); } - public GtkMenuItemPeer (MenuItem item) - { - super (item); - setEnabled (item.isEnabled ()); - setParent (item); - - if (item.getParent() instanceof Menu && ! (item instanceof Menu)) - connectSignals(); - } - - void setFont () + /** + * Creates a new GtkMenuItemPeer associated with the given MenuItem. + * It will call create(), setFont(), setEnabled() and + * connectSignals() in that order. + */ + public GtkMenuItemPeer(MenuItem item) { - 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()); + super(item); + setEnabled (item.isEnabled()); + connectSignals(); } - void setParent (MenuItem item) + /** + * Calls setEnabled(false). + */ + public void disable() { - // add ourself differently, based on what type of parent we have - // yes, the typecasting here is nasty. - Object parent = item.getParent (); - if (parent instanceof MenuBar) - { - ((GtkMenuBarPeer)((MenuBar)parent).getPeer ()).addMenu ((MenuPeer) this); - } - else // parent instanceof Menu - { - ((GtkMenuPeer)((Menu)parent).getPeer ()).addItem (this, - item.getShortcut ()); - } + setEnabled(false); } - public void disable () + /** + * Calls setEnabled(true). + */ + public void enable() { - setEnabled (false); - } - - public void enable () - { - setEnabled (true); + setEnabled(true); } public native void setEnabled(boolean b); - public native void setLabel(String label); + /** + * Callback setup through connectSignals(). + */ protected void postMenuActionEvent () { postActionEvent (((MenuItem)awtWidget).getActionCommand (), 0); diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuPeer.java index fabcf1f090b..1d581c1a15c 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuPeer.java +++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkMenuPeer.java @@ -1,5 +1,5 @@ /* GtkMenuPeer.java -- Implements MenuPeer 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,10 +49,28 @@ import java.awt.peer.MenuPeer; public class GtkMenuPeer extends GtkMenuItemPeer implements MenuPeer { - native void create (String label); - native void addItem (MenuItemPeer item, int key, boolean shiftModifier); + /** + * Creates the associated gtk+ widget and stores it in the nsa table + * for this peer. Called by the create() method with the label name + * of the associated MenuItem. Overridden to greate a Menu widget. + */ + protected native void create (String label); + + private native void addItem(MenuItemPeer item, int key, + boolean shiftModifier); + + /** XXX - Document this and the override in GtkPopupMenuPeer. */ native void setupAccelGroup (GtkGenericPeer container); - native void addTearOff (); + + private native void addTearOff (); + + /** + * Overridden to not connect any signals. + */ + protected void connectSignals() + { + // No signals to connect. + } public GtkMenuPeer (Menu menu) { @@ -63,11 +81,11 @@ public class GtkMenuPeer extends GtkMenuItemPeer MenuContainer parent = menu.getParent (); if (parent instanceof Menu) - setupAccelGroup ((GtkGenericPeer)((Menu)parent).getPeer ()); + setupAccelGroup ((GtkMenuPeer)((Menu)parent).getPeer ()); else if (parent instanceof Component) - setupAccelGroup ((GtkGenericPeer)((Component)parent).getPeer ()); + setupAccelGroup ((GtkComponentPeer)((Component)parent).getPeer ()); else - setupAccelGroup (null); + setupAccelGroup (null); // XXX, should we warn about unknown parent? } public void addItem (MenuItem item) diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkPanelPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkPanelPeer.java index fb5addeb442..88bb715694d 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkPanelPeer.java +++ b/libjava/classpath/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/libjava/classpath/gnu/java/awt/peer/gtk/GtkPopupMenuPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkPopupMenuPeer.java index d14c16dd79d..525a910bc1b 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkPopupMenuPeer.java +++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkPopupMenuPeer.java @@ -1,5 +1,5 @@ /* GtkPopupMenuPeer.java -- Implements PopupMenuPeer with GTK+ - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 1999, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -55,11 +55,6 @@ public class GtkPopupMenuPeer extends GtkMenuPeer native void setupAccelGroup (GtkGenericPeer container); - void setParent (MenuItem item) - { - // we don't need to "add" ourselves to our parent - } - native void show (int x, int y, long time); public void show (Component origin, int x, int y) { diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java index aa3a26e34ad..9b31a7390e0 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java +++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java @@ -1,5 +1,5 @@ /* GtkScrollbarPeer.java -- Implements ScrollbarPeer 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. @@ -39,6 +39,7 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; import java.awt.Adjustable; +import java.awt.EventQueue; import java.awt.Scrollbar; import java.awt.event.AdjustmentEvent; import java.awt.peer.ScrollbarPeer; @@ -69,12 +70,25 @@ public class GtkScrollbarPeer extends GtkComponentPeer public native void setLineIncrement(int amount); public native void setPageIncrement(int amount); - public native void setValues(int value, int visible, int min, int max); + public void setValues(int value, int visible, int min, int max) + { + Scrollbar sb = (Scrollbar) awtComponent; + if (!sb.getValueIsAdjusting()) + setBarValues(value, visible, min, max); + } + + private native void setBarValues(int value, int visible, int min, int max); + + /** + * Called from the native site when the scrollbar changed. + * Posts a "user generated" AdjustmentEvent to the queue. + */ protected void postAdjustmentEvent (int type, int value) { - q().postEvent (new AdjustmentEvent ((Adjustable)awtComponent, + Scrollbar bar = (Scrollbar) awtComponent; + q().postEvent(new AdjustmentEvent(bar, AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, - type, value)); + type, value, true)); } } diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java index e6896c9136c..5d9be1aec63 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java +++ b/libjava/classpath/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/libjava/classpath/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java index 4afdae82e5e..763304864e0 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java +++ b/libjava/classpath/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/libjava/classpath/gnu/java/awt/peer/gtk/GtkToolkit.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkToolkit.java index 0889d85f4bc..70e25a31957 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkToolkit.java +++ b/libjava/classpath/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/libjava/classpath/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkWindowPeer.java index 57fb87f37bf..6cc1390ea39 100644 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/libjava/classpath/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); + } } |

