2003-10-08 Thomas Fitzsimmons <fitzsim@redhat.com>
authorThomas Fitzsimmons <fitzsim@redhat.com>
Wed, 8 Oct 2003 23:38:45 +0000 (23:38 +0000)
committerThomas Fitzsimmons <fitzsim@gcc.gnu.org>
Wed, 8 Oct 2003 23:38:45 +0000 (23:38 +0000)
* gnu/java/awt/peer/gtk/GtkButtonPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
(gtkSetFont): Handle BOLD and ITALIC style specifiers.
(gtkWidgetSetForeground): New method.
* gnu/java/awt/peer/gtk/GtkComponentPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(gtkWidgetSetBackground, gtkWidgetSetForeground): New methods.
(setBackground, setForeground): Implement.
* gnu/java/awt/peer/gtk/GtkTextAreaPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
(gtkSetFont): Handle BOLD and ITALIC style specifiers.
* gnu/java/awt/peer/gtk/GtkTextFieldPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c: Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c (drawString):
Position PangoLayout relative to text's baseline.
* jni/gtk-peer/gtkpeer.h: Define AWT font style constants.

* java/awt/FlowLayout.java (layoutContainer): Fix offset problem
for CENTER and RIGHT alignments.

From-SVN: r72246

12 files changed:
libjava/ChangeLog
libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java
libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java
libjava/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java
libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java
libjava/java/awt/FlowLayout.java
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
libjava/jni/gtk-peer/gtkpeer.h

index 8d4b6ab719829320462e98ff7275760c29a98a60..322cbf28e9224d150c247c2a5f39c0530e3bfd99 100644 (file)
@@ -1,3 +1,25 @@
+2003-10-08  Thomas Fitzsimmons  <fitzsim@redhat.com>
+
+       * gnu/java/awt/peer/gtk/GtkButtonPeer.java,
+       jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
+       (gtkSetFont): Handle BOLD and ITALIC style specifiers.
+       (gtkWidgetSetForeground): New method.
+       * gnu/java/awt/peer/gtk/GtkComponentPeer.java,
+       jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
+       (gtkWidgetSetBackground, gtkWidgetSetForeground): New methods.
+       (setBackground, setForeground): Implement.
+       * gnu/java/awt/peer/gtk/GtkTextAreaPeer.java,
+       jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
+       (gtkSetFont): Handle BOLD and ITALIC style specifiers.
+       * gnu/java/awt/peer/gtk/GtkTextFieldPeer.java,
+       jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c: Likewise.
+       * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c (drawString):
+       Position PangoLayout relative to text's baseline.
+       * jni/gtk-peer/gtkpeer.h: Define AWT font style constants.
+
+       * java/awt/FlowLayout.java (layoutContainer): Fix offset problem
+       for CENTER and RIGHT alignments.
+
 2003-10-08  Michael Koch  <konqueror@gmx.de>
 
        * java/security/Security.java: Reformated.
index 830b9f08f8b498658e41ca3713423488b45f2769..1b057507b02d615c0db78dadd547af0c558a5b75 100644 (file)
@@ -51,7 +51,8 @@ public class GtkButtonPeer extends GtkComponentPeer
 {
   native void create ();
 
-  native void gtkSetFont(String xlfd, int size);
+  native void gtkSetFont(String name, int style, int size);
+  native void gtkWidgetSetForeground (int red, int green, int blue);
 
   public GtkButtonPeer (Button b)
   {
@@ -95,6 +96,6 @@ public class GtkButtonPeer extends GtkComponentPeer
 
   public void setFont (Font f)
   {
-    gtkSetFont(f.getName(), f.getSize());
+    gtkSetFont(f.getName(), f.getStyle(), f.getSize());
   }
 }
index 0f97d533cf76f6488561041f225668bf58178068..f3676f3a7aaff7924fb967959bb87762a418dfa8 100644 (file)
@@ -86,6 +86,8 @@ public class GtkComponentPeer extends GtkGenericPeer
   native void gtkWidgetGetDimensions(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 ()
   {
@@ -114,12 +116,10 @@ public class GtkComponentPeer extends GtkGenericPeer
 
       connectHooks ();
 
-      if (awtComponent.getForeground () == null)
-       awtComponent.setForeground (getForeground ());
-      if (awtComponent.getBackground () == null)
-       awtComponent.setBackground (getBackground ());
-      //        if (c.getFont () == null)
-      //       c.setFont (cp.getFont ());
+      if (awtComponent.getForeground () != null)
+       setForeground (awtComponent.getForeground ());
+      if (awtComponent.getBackground () != null)
+       setBackground (awtComponent.getBackground ());
       if (awtComponent.getFont() != null)
        setFont(awtComponent.getFont());
 
@@ -276,7 +276,7 @@ public class GtkComponentPeer extends GtkGenericPeer
 
   public void setBackground (Color c) 
   {
-    // System.out.println ("setBackground [UNIMPLEMENTED");
+    gtkWidgetSetBackground (c.getRed(), c.getGreen(), c.getBlue());
   }
 
   native public void setNativeBounds (int x, int y, int width, int height);
@@ -314,7 +314,7 @@ public class GtkComponentPeer extends GtkGenericPeer
 
   public void setForeground (Color c) 
   {
-    // System.out.println ("setForeground [UNIMPLEMENTED");
+    gtkWidgetSetForeground (c.getRed(), c.getGreen(), c.getBlue());
   }
 
   public Color getForeground ()
index ef48a4a670176e56f4e60d372cccb9b997489fbc..c38207c90cb39d1d90c016bba8e35bbb912a775d 100644 (file)
@@ -48,7 +48,7 @@ public class GtkTextAreaPeer extends GtkTextComponentPeer
 {
   native void create (int scrollbarVisibility);
 
-  native void gtkSetFont(String xlfd, int size);
+  native void gtkSetFont(String name, int style, int size);
 
   void create ()
   {
@@ -106,6 +106,6 @@ public class GtkTextAreaPeer extends GtkTextComponentPeer
 
   public void setFont (Font f)
   {
-    gtkSetFont(f.getName(), f.getSize());
+    gtkSetFont(f.getName(), f.getStyle(), f.getSize());
   }
 }
index b65354b449579e14544f5e014bc54fc946e71ef9..98f55d0717c42ba7d0d8cd23d0cb226b375c9b27 100644 (file)
@@ -55,7 +55,7 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer
 
   native void gtkEntryGetSize (int dims[]);
 
-  native void gtkSetFont(String xlfd, int size);
+  native void gtkSetFont(String name, int style, int size);
 
   public GtkTextFieldPeer (TextField tf)
   {
@@ -104,7 +104,7 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer
 
   public void setFont (Font f)
   {
-    gtkSetFont(f.getName(), f.getSize());
+    gtkSetFont(f.getName(), f.getStyle(), f.getSize());
   }
 
   public void handleEvent (AWTEvent e)
index 795dfd8e61ff8962c04bfde8bf771f81630d216f..d26b8d13c2bc5215427ff1cfc570e8ebe050e7ab 100644 (file)
@@ -205,9 +205,9 @@ public class FlowLayout implements LayoutManager, Serializable
            if (myalign == LEFT)
              x = ins.left + hgap;
            else if (myalign == CENTER)
-             x = (d.width - new_w) / 2;
+             x = ins.left + (d.width - new_w) / 2 + hgap;
            else
-             x = d.width - new_w;
+             x = ins.left + (d.width - new_w) + hgap;
 
            for (int k = i; k < j; ++k)
              {
index 24b8f4e8c07d47aab8f53601d35e10b762841316..713d594ccd78edc54a4a81aea4515de0b6c58f7b 100644 (file)
@@ -193,9 +193,11 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawString
   struct graphics *g;
   const char *cstr;
   const char *font_name;
+  int baseline_y;
   PangoFontDescription *font_desc;
   PangoContext *context;
   PangoLayout *layout;
+  PangoLayoutIter *iter;
 
   g = (struct graphics *) NSA_GET_PTR (env, obj);
 
@@ -213,11 +215,15 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawString
   layout = pango_layout_new (context);
 
   pango_layout_set_text (layout, cstr, -1);
+  iter = pango_layout_get_iter (layout);
+
+  baseline_y = pango_layout_iter_get_baseline (iter);
 
   gdk_draw_layout (g->drawable, g->gc, 
-                  x + g->x_offset, y + g->y_offset, layout);
+                  x + g->x_offset, y + g->y_offset - (baseline_y / PANGO_SCALE), layout);
 
   pango_font_description_free (font_desc);
+  pango_layout_iter_free (iter);
 
   gdk_threads_leave ();
 
index 110b01974d9437a3c2e0ae3ab37a6d17af50c8a4..a52f54ce35ffb39d367b6a93b5d86403e7e8b0d4 100644 (file)
@@ -53,7 +53,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create
 
 JNIEXPORT void JNICALL 
 Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont
-  (JNIEnv *env, jobject obj, jstring jname, jint size)
+  (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
 {
   const char *font_name;
   void *ptr;
@@ -69,18 +69,52 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont
   if (!label)
       return;
 
-  font_name = (*env)->GetStringUTFChars (env, jname, NULL);
+  font_name = (*env)->GetStringUTFChars (env, name, NULL);
 
   gdk_threads_enter();
 
   font_desc = pango_font_description_from_string (font_name);
   pango_font_description_set_size (font_desc, size * PANGO_SCALE);
 
+  if (style & AWT_STYLE_BOLD)
+    pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
+
+  if (style & AWT_STYLE_ITALIC)
+    pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
+
   gtk_widget_modify_font (GTK_WIDGET(label), font_desc);
 
   pango_font_description_free (font_desc);
 
   gdk_threads_leave();
 
-  (*env)->ReleaseStringUTFChars (env, jname, font_name);
+  (*env)->ReleaseStringUTFChars (env, name, font_name);
+}
+
+JNIEXPORT void JNICALL 
+Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetSetForeground
+  (JNIEnv *env, jobject obj, jint red, jint green, jint blue)
+{
+  GdkColor color;
+  GtkWidget *label;
+  void *ptr;
+
+  ptr = NSA_GET_PTR (env, obj);
+
+  color.red = (red / 255.0) * 65535;
+  color.green = (green / 255.0) * 65535;
+  color.blue = (blue / 255.0) * 65535;
+
+  gdk_threads_enter ();
+
+  label = gtk_bin_get_child (GTK_BIN(ptr));
+
+  if (!label)
+      return;
+
+  gtk_widget_modify_fg (label, GTK_STATE_NORMAL, &color);
+  gtk_widget_modify_fg (label, GTK_STATE_ACTIVE, &color);
+  gtk_widget_modify_fg (label, GTK_STATE_PRELIGHT, &color);
+
+  gdk_threads_leave ();
 }
index 0499b27363879877abe5be3aae9f9b9e17c46e5e..98e8e8cbe9f290723fdb21686a117848b68f4bdd 100644 (file)
@@ -276,6 +276,61 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetForeground
   return array;
 }
 
+JNIEXPORT void JNICALL 
+Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetBackground
+  (JNIEnv *env, jobject obj, jint red, jint green, jint blue)
+{
+  GdkColor normal_color;
+  GdkColor active_color;
+  GtkWidget *widget;
+  void *ptr;
+
+  ptr = NSA_GET_PTR (env, obj);
+
+  normal_color.red = (red / 255.0) * 65535;
+  normal_color.green = (green / 255.0) * 65535;
+  normal_color.blue = (blue / 255.0) * 65535;
+
+  /* This calculation only approximates the active colors produced by
+     Sun's AWT. */
+  active_color.red = 0.85 * (red / 255.0) * 65535;
+  active_color.green = 0.85 * (green / 255.0) * 65535;
+  active_color.blue = 0.85 * (blue / 255.0) * 65535;
+
+  gdk_threads_enter ();
+
+  widget = GTK_WIDGET (ptr);
+
+  gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, &normal_color);
+  gtk_widget_modify_bg (widget, GTK_STATE_ACTIVE, &active_color);
+  gtk_widget_modify_bg (widget, GTK_STATE_PRELIGHT, &normal_color);
+
+  gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL 
+Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetForeground
+  (JNIEnv *env, jobject obj, jint red, jint green, jint blue)
+{
+  GdkColor color;
+  GtkWidget *widget;
+  void *ptr;
+
+  ptr = NSA_GET_PTR (env, obj);
+
+  color.red = (red / 255.0) * 65535;
+  color.green = (green / 255.0) * 65535;
+  color.blue = (blue / 255.0) * 65535;
+
+  gdk_threads_enter ();
+
+  widget = GTK_WIDGET (ptr);
+
+  gtk_widget_modify_fg (widget, GTK_STATE_NORMAL, &color);
+
+  gdk_threads_leave ();
+}
+
 void
 set_visible (GtkWidget *widget, jboolean visible)
 {
index 77b4ae735244463188a7fd9b087be07c17d82c0b..2964dc377012445bb3e56a90b944541864ed692f 100644 (file)
@@ -158,7 +158,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_replaceRange
 
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkSetFont
-  (JNIEnv *env, jobject obj, jstring jname, jint size)
+  (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
 {
   const char *font_name;
   void *ptr;
@@ -169,18 +169,24 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkSetFont
 
   text = GTK_WIDGET (TEXT_FROM_SW (ptr));
 
-  font_name = (*env)->GetStringUTFChars (env, jname, NULL);
+  font_name = (*env)->GetStringUTFChars (env, name, NULL);
 
   gdk_threads_enter();
 
   font_desc = pango_font_description_from_string (font_name);
   pango_font_description_set_size (font_desc, size * PANGO_SCALE);
 
+  if (style & AWT_STYLE_BOLD)
+    pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
+
+  if (style & AWT_STYLE_ITALIC)
+    pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
+
   gtk_widget_modify_font (GTK_WIDGET(text), font_desc);
 
   pango_font_description_free (font_desc);
 
   gdk_threads_leave();
 
-  (*env)->ReleaseStringUTFChars (env, jname, font_name);
+  (*env)->ReleaseStringUTFChars (env, name, font_name);
 }
index b075a693b346fdc15a846970508b2e45f707e92e..a7bbb02f8a943a6bdf31295d6e5f524465a61946 100644 (file)
@@ -102,7 +102,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEchoChar
 
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkSetFont
-  (JNIEnv *env, jobject obj, jstring jname, jint size)
+  (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
 {
   const char *font_name;
   void *ptr;
@@ -112,18 +112,24 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkSetFont
   ptr = NSA_GET_PTR (env, obj);
 
   entry = GTK_WIDGET (ptr);
-  font_name = (*env)->GetStringUTFChars (env, jname, NULL);
+  font_name = (*env)->GetStringUTFChars (env, name, NULL);
 
   gdk_threads_enter();
 
   font_desc = pango_font_description_from_string (font_name);
   pango_font_description_set_size (font_desc, size * PANGO_SCALE);
 
+  if (style & AWT_STYLE_BOLD)
+    pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
+
+  if (style & AWT_STYLE_ITALIC)
+    pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
+
   gtk_widget_modify_font (GTK_WIDGET(entry), font_desc);
 
   pango_font_description_free (font_desc);
 
   gdk_threads_leave();
 
-  (*env)->ReleaseStringUTFChars (env, jname, font_name);
+  (*env)->ReleaseStringUTFChars (env, name, font_name);
 }
index 5f9d215f1d5904b5589405b34b8e43f590328550..b76de30a4417f0cf2bdfd0436acf13b8409dbb28 100644 (file)
@@ -347,6 +347,10 @@ struct graphics
 #define AWT_FOCUS_LOST 1004
 #define AWT_FOCUS_GAINED 1005
 
+#define AWT_STYLE_PLAIN  0
+#define AWT_STYLE_BOLD   1
+#define AWT_STYLE_ITALIC 2
+
 extern jmethodID setBoundsCallbackID;
 
 extern jmethodID postActionEventID;