GtkTextFieldPeer.java, [...] (native create): Add width parameter.
authorThomas Fitzsimmons <fitzsim@redhat.com>
Tue, 20 Jan 2004 21:05:39 +0000 (21:05 +0000)
committerThomas Fitzsimmons <fitzsim@gcc.gnu.org>
Tue, 20 Jan 2004 21:05:39 +0000 (21:05 +0000)
2004-01-20  Thomas Fitzsimmons  <fitzsim@redhat.com>

* gnu/java/awt/peer/gtk/GtkTextFieldPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
(native create): Add width parameter.
(create): Calculate text entry width based on current font's
metrics and number of columns.  Set TextField's font if not
already set.  Call native create.
(gtkEntryGetBorderWidth): New native method.
(gtkEntryGetSize): Remove method.
(getMinimumSize): Call minimumSize.
(getPreferredSize): Call preferredSize.
(minimumSize): Calculate minimum size based on backing
GtkEntry's borders, font metrics and number of columns.
(preferredSize): Likewise for preferred size.
(get_border_width): New static function.

From-SVN: r76228

libjava/ChangeLog
libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c

index f31d8080ec686db566555074ecc25c63d189e7c9..98b849770543e6a41b442226fd0625b02d590536 100644 (file)
@@ -1,5 +1,20 @@
 2004-01-20  Thomas Fitzsimmons  <fitzsim@redhat.com>
 
+       * gnu/java/awt/peer/gtk/GtkTextFieldPeer.java,
+       jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
+       (native create): Add width parameter.
+       (create): Calculate text entry width based on current font's
+       metrics and number of columns.  Set TextField's font if not
+       already set.  Call native create.
+       (gtkEntryGetBorderWidth): New native method.
+       (gtkEntryGetSize): Remove method.
+       (getMinimumSize): Call minimumSize.
+       (getPreferredSize): Call preferredSize.
+       (minimumSize): Calculate minimum size based on backing
+       GtkEntry's borders, font metrics and number of columns.
+       (preferredSize): Likewise for preferred size.
+       (get_border_width): New static function.
+
        * gnu/java/awt/peer/gtk/GtkFramePeer.java (setResizable):
        Override GtkWindowPeer's setResizable method to account for menu
        bar height when setting the frame's size.
index 98f55d0717c42ba7d0d8cd23d0cb226b375c9b27..8ee06d6f2b3546c6fa03c78678855d4c312b4693 100644 (file)
@@ -41,6 +41,7 @@ package gnu.java.awt.peer.gtk;
 import java.awt.AWTEvent;
 import java.awt.Dimension;
 import java.awt.Font;
+import java.awt.FontMetrics;
 import java.awt.TextField;
 import java.awt.event.KeyEvent;
 import java.awt.peer.TextFieldPeer;
@@ -48,14 +49,38 @@ import java.awt.peer.TextFieldPeer;
 public class GtkTextFieldPeer extends GtkTextComponentPeer
   implements TextFieldPeer
 {
+  native void create (int width);
 
-//    native void create (ComponentPeer parent, String text);
+  void create ()
+  {
+    Font f = awtComponent.getFont ();
+
+    // By default, Sun sets a TextField's font when its peer is
+    // created.  If f != null then the peer's font is set by
+    // GtkComponent.create.
+    if (f == null)
+      {
+       f = new Font ("Fixed", Font.PLAIN, 12);
+       awtComponent.setFont (f);
+      }
 
-  native void create ();
+    FontMetrics fm;
+    if (GtkToolkit.useGraphics2D ())
+      fm = new GdkClasspathFontPeerMetrics (f);
+    else
+      fm = new GdkFontMetrics (f);
 
-  native void gtkEntryGetSize (int dims[]);
+    TextField tf = ((TextField) awtComponent);
+    int cols = tf.getColumns ();
+
+    int text_width = cols * fm.getMaxAdvance ();
+
+    create (text_width);
+  }
 
-  native void gtkSetFont(String name, int style, int size);
+  native int gtkEntryGetBorderWidth ();
+
+  native void gtkSetFont (String name, int style, int size);
 
   public GtkTextFieldPeer (TextField tf)
   {
@@ -67,34 +92,61 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer
 
   public Dimension getMinimumSize (int cols)
   {
-    int dims[] = new int[2];
-
-    gtkEntryGetSize (dims);
-
-    return (new Dimension (dims[0], dims[1]));
+    return minimumSize (cols);
   }
 
   public Dimension getPreferredSize (int cols)
   {
-    int dims[] = new int[2];
-
-    gtkEntryGetSize (dims);
-
-    return (new Dimension (dims[0], dims[1]));
+    return preferredSize (cols);
   }
-  
-  public native void setEchoChar (char c);
 
-  /* Deprecated */
+  public native void setEchoChar (char c);
 
+  // Deprecated
   public Dimension minimumSize (int cols)
   {
-    return getMinimumSize (cols);
+    int dim[] = new int[2];
+
+    gtkWidgetGetPreferredDimensions (dim);
+
+    Font f = awtComponent.getFont ();
+    if (f == null)
+      return new Dimension (2 * gtkEntryGetBorderWidth (), dim[1]);
+
+    FontMetrics fm;
+    if (GtkToolkit.useGraphics2D ())
+      fm = new GdkClasspathFontPeerMetrics (f);
+    else
+      fm = new GdkFontMetrics (f);
+
+    int text_width = cols * fm.getMaxAdvance ();
+
+    int width = text_width + 2 * gtkEntryGetBorderWidth ();
+
+    return new Dimension (width, dim[1]);
   }
 
   public Dimension preferredSize (int cols)
   {
-    return getPreferredSize (cols);
+    int dim[] = new int[2];
+
+    gtkWidgetGetPreferredDimensions (dim);
+
+    Font f = awtComponent.getFont ();
+    if (f == null)
+      return new Dimension (2 * gtkEntryGetBorderWidth (), dim[1]);
+
+    FontMetrics fm;
+    if (GtkToolkit.useGraphics2D ())
+      fm = new GdkClasspathFontPeerMetrics (f);
+    else
+      fm = new GdkFontMetrics (f);
+
+    int text_width = cols * fm.getMaxAdvance ();
+
+    int width = text_width + 2 * gtkEntryGetBorderWidth ();
+
+    return new Dimension (width, dim[1]);
   }
 
   public void setEchoCharacter (char c)
@@ -104,18 +156,18 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer
 
   public void setFont (Font f)
   {
-    gtkSetFont(f.getName(), f.getStyle(), f.getSize());
+    gtkSetFont (f.getName (), f.getStyle (), f.getSize ());
   }
 
   public void handleEvent (AWTEvent e)
   {
     if (e.getID () == KeyEvent.KEY_PRESSED)
       {
-        KeyEvent ke = (KeyEvent)e;
+        KeyEvent ke = (KeyEvent) e;
 
-        if (!ke.isConsumed()
-            && ke.getKeyCode() == KeyEvent.VK_ENTER)
-          postActionEvent (getText(), ke.getModifiers ());
+        if (!ke.isConsumed ()
+            && ke.getKeyCode () == KeyEvent.VK_ENTER)
+          postActionEvent (getText (), ke.getModifiers ());
       }
 
     super.handleEvent (e);
index 5379635b88b70fb67e8ad50bef73fb46788c260a..e2429bcd1d07d9b9a4af730cec348b69181d7736 100644 (file)
@@ -39,48 +39,74 @@ exception statement from your version. */
 #include "gtkpeer.h"
 #include "gnu_java_awt_peer_gtk_GtkTextFieldPeer.h"
 
+static jint
+get_border_width (GtkWidget *entry);
+
 JNIEXPORT void JNICALL 
 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_create
-  (JNIEnv *env, jobject obj)
+  (JNIEnv *env, jobject obj, jint text_width)
 {
-  GtkWidget *widget;
+  GtkWidget *entry;
 
   /* Create global reference and save it for future use */
   NSA_SET_GLOBAL_REF (env, obj);
 
   gdk_threads_enter ();
-  
-  widget = gtk_entry_new ();
+
+  entry = gtk_entry_new ();
+  gtk_widget_set_size_request (entry,
+                              text_width + 2 * get_border_width (entry), -1);
 
   gdk_threads_leave ();
 
-  NSA_SET_PTR (env, obj, widget);
+  NSA_SET_PTR (env, obj, entry);
 }
 
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkEntryGetSize
-  (JNIEnv *env, jobject obj, jintArray jdims)
+JNIEXPORT jint JNICALL
+Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkEntryGetBorderWidth
+  (JNIEnv *env, jobject obj)
 {
   void *ptr;
-  jint *dims;
-  GtkRequisition myreq;
-  GtkWidget *entry;
-  
+  int border_width = 0;
+
   ptr = NSA_GET_PTR (env, obj);
-  dims = (*env)->GetIntArrayElements (env, jdims, 0);  
-  
+
   gdk_threads_enter ();
-  
-  entry = GTK_WIDGET (ptr);
-  gtk_widget_size_request(entry, &myreq);
-  dims[0]=myreq.width;
-  dims[1]=myreq.height;
-  
+
+  border_width = get_border_width (GTK_WIDGET (ptr));
+
   gdk_threads_leave ();
-  
-  (*env)->ReleaseIntArrayElements (env, jdims, dims, 0);
+
+  return border_width;
 }
 
+/* GTK hard-codes this value.  It is the space between a GtkEntry's
+   frame and its text. */
+#define INNER_BORDER 2
+
+static jint
+get_border_width (GtkWidget *entry)
+{
+  gint focus_width;
+  gboolean interior_focus;
+  int x_border_width = INNER_BORDER;
+
+  gtk_widget_style_get (entry,
+                       "interior-focus", &interior_focus,
+                       "focus-line-width", &focus_width,
+                       NULL);
+
+  if (GTK_ENTRY (entry)->has_frame)
+    x_border_width += entry->style->xthickness;
+
+  if (!interior_focus)
+    x_border_width += focus_width;
+
+  return x_border_width;
+}
+
+#undef INNER_BORDER
+
 JNIEXPORT void JNICALL 
 Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEchoChar
   (JNIEnv *env, jobject obj, jchar c)
@@ -93,10 +119,12 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEchoChar
   gdk_threads_enter ();
 
   entry = GTK_ENTRY (ptr);
-    
-  if (c!=0)
+
+  if (c != 0)
     {
-/*        gtk_entry_set_echo_char (entry, c); */
+      /* FIXME: use gtk_entry_set_invisible_char (GtkEntry *entry,
+        gunichar ch) here.  That means we must convert from jchar
+        (utf16) to gunichar (ucs4). */
       gtk_entry_set_visibility (entry, FALSE);
     }
   else