/[classpath]/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
ViewVC logotype

Diff of /classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.10 by mark, Fri Jul 30 23:16:58 2004 UTC revision 1.11 by mark, Sat Jul 31 21:15:06 2004 UTC
# Line 39  exception statement from your version. * Line 39  exception statement from your version. *
39  #include "gtkpeer.h"  #include "gtkpeer.h"
40  #include "gnu_java_awt_peer_gtk_GtkChoicePeer.h"  #include "gnu_java_awt_peer_gtk_GtkChoicePeer.h"
41    
42  static void connect_choice_item_selectable_hook (JNIEnv *env,  static void selection_changed (GtkComboBox *combobox, gpointer data);
                                                  jobject peer_obj,  
                                                  GtkItem *menuitem,  
                                                  const char *label);  
43    
44  JNIEXPORT void JNICALL  JNIEXPORT void JNICALL
45  Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create  Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create
46    (JNIEnv *env, jobject obj)    (JNIEnv *env, jobject obj)
47  {  {
48    GtkWidget *menu;    GtkWidget *menu;
49    GtkOptionMenu *option_menu;    GtkComboBox *combobox;
   GtkRequisition child_requisition;  
50    
51    NSA_SET_GLOBAL_REF (env, obj);    NSA_SET_GLOBAL_REF (env, obj);
52    
53    gdk_threads_enter ();    gdk_threads_enter ();
54        
55    option_menu = GTK_OPTION_MENU (gtk_option_menu_new ());    combobox = gtk_combo_box_new_text ();
56    menu = gtk_menu_new ();  
57    gtk_widget_show (menu);    g_signal_connect (combobox, "changed",
58                        G_CALLBACK (selection_changed), obj);
   gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);  
   
   gtk_widget_size_request (gtk_menu_item_new_with_label (""),  
                            &child_requisition);  
   option_menu->width = child_requisition.width;  
   option_menu->height = child_requisition.height;  
59    
60    gdk_threads_leave ();    gdk_threads_leave ();
61    
62    NSA_SET_PTR (env, obj, option_menu);    NSA_SET_PTR (env, obj, combobox);
63  }  }
64    
65  JNIEXPORT void JNICALL  JNIEXPORT void JNICALL
# Line 77  Java_gnu_java_awt_peer_gtk_GtkChoicePeer Line 67  Java_gnu_java_awt_peer_gtk_GtkChoicePeer
67    (JNIEnv *env, jobject obj, jobjectArray items)    (JNIEnv *env, jobject obj, jobjectArray items)
68  {  {
69    gpointer ptr;    gpointer ptr;
   GtkMenu *menu;  
70    jsize count, i;    jsize count, i;
   int need_set_history = 0;  
71    
72    ptr = NSA_GET_PTR (env, obj);    ptr = NSA_GET_PTR (env, obj);
73    
74    gdk_threads_enter ();    gdk_threads_enter ();
75    
   menu = GTK_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr)));  
   
   /* Are we adding the first element? */  
   if (gtk_option_menu_get_history (GTK_OPTION_MENU (ptr)) < 0)  
       need_set_history = 1;  
   
76    count = (*env)->GetArrayLength (env, items);    count = (*env)->GetArrayLength (env, items);
77    
78    for (i = 0; i < count; i++)    for (i = 0; i < count; i++)
79      {      {
80        jobject item;        jobject item;
81        const char *label;        const char *label;
       GtkWidget *menuitem;  
82    
83        item = (*env)->GetObjectArrayElement (env, items, i);        item = (*env)->GetObjectArrayElement (env, items, i);
84        label = (*env)->GetStringUTFChars (env, item, NULL);        label = (*env)->GetStringUTFChars (env, item, NULL);
85    
86        menuitem = gtk_menu_item_new_with_label (label);        gtk_combo_box_append_text (GTK_COMBO_BOX (ptr), label);
       gtk_menu_append (menu, menuitem);  
       gtk_widget_show (menuitem);  
   
       connect_choice_item_selectable_hook (env, obj,  
                                            GTK_ITEM (menuitem), label);  
87    
88        (*env)->ReleaseStringUTFChars (env, item, label);        (*env)->ReleaseStringUTFChars (env, item, label);
89      }      }
90    
   /* If we just added the first element select it. */    
   if (need_set_history)  
     gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0);  
   
91    gdk_threads_leave ();    gdk_threads_leave ();
92  }  }
93    
# Line 125  Java_gnu_java_awt_peer_gtk_GtkChoicePeer Line 97  Java_gnu_java_awt_peer_gtk_GtkChoicePeer
97  {  {
98    void *ptr;    void *ptr;
99    const char *label;    const char *label;
   GtkWidget *menu, *menuitem;  
   int current;  
   int need_set_history = 0;  
100    
101    ptr = NSA_GET_PTR (env, obj);    ptr = NSA_GET_PTR (env, obj);
102        
103    label = (*env)->GetStringUTFChars (env, item, 0);          label = (*env)->GetStringUTFChars (env, item, 0);      
104    
105    gdk_threads_enter ();    gdk_threads_enter ();
106        gtk_combo_box_insert_text (GTK_COMBO_BOX (ptr), index, label);
   current = gtk_option_menu_get_history (GTK_OPTION_MENU (ptr));  
   
   /* Are we adding the first element or below or at the currently  
      selected one? */  
   if ((current < 0) || (current >= index))  
       need_set_history = 1;  
   
   menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr));  
   menuitem = gtk_menu_item_new_with_label (label);  
   gtk_menu_insert (GTK_MENU (menu), menuitem, index);  
   gtk_widget_show (menuitem);  
   
   connect_choice_item_selectable_hook (env, obj, GTK_ITEM (menuitem), label);  
   
   /* If we just added the first element select it.  
      If we added at of below the currently selected position make  
      the first item the selected one. */    
   if (need_set_history)  
     gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0);  
   
107    gdk_threads_leave ();    gdk_threads_leave ();
108    
109    (*env)->ReleaseStringUTFChars (env, item, label);    (*env)->ReleaseStringUTFChars (env, item, label);
# Line 165  Java_gnu_java_awt_peer_gtk_GtkChoicePeer Line 114  Java_gnu_java_awt_peer_gtk_GtkChoicePeer
114    (JNIEnv *env, jobject obj, jint index)    (JNIEnv *env, jobject obj, jint index)
115  {  {
116    void *ptr;    void *ptr;
   GtkContainer *menu;  
   GtkWidget *menuitem;  
   GList *children;  
   int need_set_history = 0;  
   int i, from, to;  
117    
118    ptr = NSA_GET_PTR (env, obj);    ptr = NSA_GET_PTR (env, obj);
119    
120    gdk_threads_enter ();    gdk_threads_enter ();
121      gtk_combo_box_remove_text (GTK_COMBO_BOX (ptr), index);
122      gdk_threads_leave ();
123    }
124    
125    menu = GTK_CONTAINER (gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr)));  JNIEXPORT void JNICALL
126    children = gtk_container_children (menu);  Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeRemoveAll
127      (JNIEnv *env, jobject obj)
128    {
129      void *ptr;
130      GtkTreeModel *model;
131      gint count, i;
132    
133    if (index == -1)    ptr = NSA_GET_PTR (env, obj);
     {  
       /* Remove all elements (removeAll) */  
       from = g_list_length (children) - 1;  
       to = 0;  
134    
135        /* Select the first item to prevent spurious activate signals */    gdk_threads_enter ();
       gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0);  
     }  
   else  
     {  
       /* Remove the specific index element */  
       from = index;  
       to = index;  
   
       /* Are we removing the currently selected element? */  
       if (gtk_option_menu_get_history (GTK_OPTION_MENU (ptr)) == index)  
         need_set_history = 1;  
     }  
136    
137    for (i = from; i >= to; i--)    model = gtk_combo_box_get_model (GTK_COMBO_BOX (ptr));
138      {    count = gtk_tree_model_iter_n_children (model, NULL);
139        menuitem = GTK_WIDGET (g_list_nth (children, i)->data);  
140        gtk_container_remove (menu, menuitem);    /* First, unselect everything, to avoid problems when removing items. */
141        gtk_widget_destroy (menuitem);    gtk_combo_box_set_active (GTK_COMBO_BOX (ptr), -1);
     }  
142    
143    /* If we just removed the currently selected element and there are    for (i = count - 1; i >= 0; i--) {
144       still elements left in the list, make the first item the selected one. */        gtk_combo_box_remove_text (GTK_COMBO_BOX (ptr), i);
145    if (need_set_history && gtk_container_children (menu))    }
     gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0);  
146    
147    gdk_threads_leave ();    gdk_threads_leave ();
148  }  }
# Line 222  Java_gnu_java_awt_peer_gtk_GtkChoicePeer Line 156  Java_gnu_java_awt_peer_gtk_GtkChoicePeer
156    ptr = NSA_GET_PTR (env, obj);    ptr = NSA_GET_PTR (env, obj);
157    
158    gdk_threads_enter ();    gdk_threads_enter ();
159    gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), index);    gtk_combo_box_set_active (GTK_COMBO_BOX (ptr), index);
160    gdk_threads_leave ();    gdk_threads_leave ();
161  }  }
162    
163  JNIEXPORT jint JNICALL  JNIEXPORT jint JNICALL
164  Java_gnu_java_awt_peer_gtk_GtkChoicePeer_getHistory  Java_gnu_java_awt_peer_gtk_GtkChoicePeer_nativeGetSelected
165    (JNIEnv *env, jobject obj)    (JNIEnv *env, jobject obj)
166  {  {
167    void *ptr;    void *ptr;
# Line 236  Java_gnu_java_awt_peer_gtk_GtkChoicePeer Line 170  Java_gnu_java_awt_peer_gtk_GtkChoicePeer
170    ptr = NSA_GET_PTR (env, obj);    ptr = NSA_GET_PTR (env, obj);
171    
172    gdk_threads_enter ();    gdk_threads_enter ();
173      index = gtk_combo_box_get_active (GTK_COMBO_BOX (ptr));
   index = gtk_option_menu_get_history (GTK_OPTION_MENU (ptr));  
   
174    gdk_threads_leave ();    gdk_threads_leave ();
175    
176    return index;    return index;
177  }  }
178    
179  static void  void selection_changed (GtkComboBox *combobox, jobject peer)
 item_activate (GtkItem *item __attribute__((unused)),  
                struct item_event_hook_info *ie)  
180  {  {
181    jstring label;    jstring label;
182    gdk_threads_leave ();    GtkTreeModel *model;
183      GtkTreeIter iter;
184      GValue value;
185      gchar *selected;
186      gint index;
187    
188    label = (*gdk_env)->NewStringUTF (gdk_env, ie->label);    index = gtk_combo_box_get_active(combobox);
   (*gdk_env)->CallVoidMethod (gdk_env, ie->peer_obj,  
                               choicePostItemEventID,  
                               label,  
                               (jint) AWT_ITEM_SELECTED);  
   gdk_threads_enter ();  
 }  
   
 static void  
 item_removed (gpointer data,  
               GClosure gc __attribute__((unused)))  
 {  
   struct item_event_hook_info *ie = data;  
189    
190    free ((void *) ie->label);    if (index >= 0)
191    free (ie);      {
192  }        model = gtk_combo_box_get_model (combobox);
   
 static void  
 connect_choice_item_selectable_hook (JNIEnv *env,  
                                      jobject peer_obj,  
                                      GtkItem *menuitem,  
                                      const char *label)  
 {  
   struct item_event_hook_info *ie;  
   jobject *peer_objGlobPtr;  
   
   ie = (struct item_event_hook_info *)  
     malloc (sizeof (struct item_event_hook_info));  
193    
194    peer_objGlobPtr = NSA_GET_GLOBAL_REF (env, peer_obj);        gtk_combo_box_get_active_iter (combobox, &iter);
   g_assert (peer_objGlobPtr);  
195    
196    ie->peer_obj = *peer_objGlobPtr;        gtk_tree_model_get (model, &iter, 0, &selected, -1);
   ie->label = strdup (label);  
197    
198    g_signal_connect_data (G_OBJECT (menuitem), "activate",        gdk_threads_leave ();
                       GTK_SIGNAL_FUNC (item_activate), ie,  
                       (GClosureNotify) item_removed, 0);  
 }  
199    
200  JNIEXPORT void JNICALL        label = (*gdk_env)->NewStringUTF (gdk_env, selected);
201  Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetParent        (*gdk_env)->CallVoidMethod (gdk_env, peer,
202  (JNIEnv *env, jobject obj, jobject parent)                                    choicePostItemEventID,
203  {                                    label,
204    void *ptr;                                    (jint) AWT_ITEM_SELECTED);
205    void *parent_ptr;        gdk_threads_enter ();
   GtkWidget *widget;  
   GtkWidget *parent_widget;  
     
   ptr = NSA_GET_PTR (env, obj);  
   parent_ptr = NSA_GET_PTR (env, parent);  
     
   gdk_threads_enter ();  
     
   widget = GTK_WIDGET (ptr);  
   parent_widget = GTK_WIDGET (parent_ptr);  
     
   if (GTK_IS_WINDOW (parent_widget))  
     {  
       GList *children = gtk_container_children  
         (GTK_CONTAINER (GTK_BIN (parent_widget)->child));  
   
       if (GTK_IS_MENU_BAR (children->data))  
         gtk_layout_put (GTK_LAYOUT (children->next->data), widget, 0, 0);  
       else  
         gtk_layout_put (GTK_LAYOUT (children->data), widget, 0, 0);  
206      }      }
   else  
     if (GTK_IS_SCROLLED_WINDOW (parent_widget))  
       {  
         gtk_scrolled_window_add_with_viewport  
           (GTK_SCROLLED_WINDOW (parent_widget), widget);  
         gtk_viewport_set_shadow_type (GTK_VIEWPORT (widget->parent),  
                                       GTK_SHADOW_NONE);  
           
       }  
     else  
       gtk_layout_put (GTK_LAYOUT (parent_widget), widget, 0, 0);  
     
   gdk_threads_leave ();  
 }  
   
 JNIEXPORT void JNICALL  
 Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetSensitive  
 (JNIEnv *env, jobject obj, jboolean sensitive)  
 {  
   void *ptr;  
     
   ptr = NSA_GET_PTR (env, obj);  
     
   gdk_threads_enter ();  
     
   gtk_widget_set_sensitive (GTK_WIDGET (ptr), sensitive);  
     
   gdk_threads_leave ();  
207  }  }

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.11

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26