jdk/src/solaris/native/sun/awt/awt_Choice21.c
changeset 1203 3e5496df0d2b
parent 1202 5a725d2f0daa
parent 1201 e87f9c042699
child 1211 b659a7cee935
equal deleted inserted replaced
1202:5a725d2f0daa 1203:3e5496df0d2b
     1 /*
       
     2  * Copyright 2001-2003 Sun Microsystems, Inc.  All Rights Reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Sun designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Sun in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    22  * CA 95054 USA or visit www.sun.com if you need additional information or
       
    23  * have any questions.
       
    24  */
       
    25 
       
    26 #ifdef HEADLESS
       
    27     #error This file should not be included in headless library
       
    28 #endif
       
    29 
       
    30 #if MOTIF_VERSION!=2
       
    31     #error This file should only be compiled with motif 2.1
       
    32 #endif
       
    33 
       
    34 #include "awt_p.h"
       
    35 #include "java_awt_Component.h"
       
    36 #include "java_awt_AWTEvent.h"
       
    37 #include "sun_awt_motif_MComponentPeer.h"
       
    38 #include "sun_awt_motif_MChoicePeer.h"
       
    39 
       
    40 #include "awt_Component.h"
       
    41 #include "canvas.h"
       
    42 
       
    43 #include "multi_font.h"
       
    44 
       
    45 #include <jni.h>
       
    46 #include <jni_util.h>
       
    47 #include <Xm/ComboBox.h>
       
    48 
       
    49 #define MAX_VISIBLE 10
       
    50 
       
    51 extern struct ComponentIDs componentIDs;
       
    52 extern struct ContainerIDs containerIDs;
       
    53 extern struct MComponentPeerIDs mComponentPeerIDs;
       
    54 
       
    55 extern AwtGraphicsConfigDataPtr
       
    56     copyGraphicsConfigToPeer(JNIEnv *env, jobject this);
       
    57 
       
    58 /*
       
    59    setSelection
       
    60    Set the selected text on the XmTextField of the XmComboBox.
       
    61 */
       
    62 static void
       
    63 setSelection(JNIEnv *env,
       
    64               jobject this,
       
    65               Widget comboBox,
       
    66               jint index)
       
    67 {
       
    68     jstring item = NULL;
       
    69     jobject target;
       
    70     Widget text=NULL;
       
    71 
       
    72     AWT_LOCK();
       
    73     /* Get the java Choice component. */
       
    74     target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
       
    75     if (target == NULL) {
       
    76         JNU_ThrowNullPointerException(env, "NullPointerException");
       
    77         AWT_UNLOCK();
       
    78         return;
       
    79     }
       
    80     /* Get the XmTextField widget in the XmComboBox. */
       
    81     text = XtNameToWidget(comboBox, "*Text");
       
    82     /* Get the selected Unicode string from the java Choice component. */
       
    83     item = (jstring) JNU_CallMethodByName(env, NULL,
       
    84         target, "getItem", "(I)Ljava/lang/String;", index).l;
       
    85     if ((*env)->ExceptionOccurred(env)) {
       
    86         (*env)->ExceptionDescribe(env);
       
    87         (*env)->ExceptionClear(env);
       
    88     }
       
    89     if (!JNU_IsNull(env, item)) {
       
    90         /* Convert the Unicode string to a multibyte string. */
       
    91         char *temp = (char *)JNU_GetStringPlatformChars(env, item, NULL);
       
    92         /* Assign the multibyte string to the XmTextField of the XmComboBox. */
       
    93         XmTextSetString(text, temp);
       
    94         JNU_ReleaseStringPlatformChars(env, item, (const char *)temp);
       
    95     }
       
    96     AWT_UNLOCK();
       
    97 }
       
    98 
       
    99 extern Boolean skipNextNotifyWhileGrabbed;
       
   100 extern Boolean skipNextFocusIn;
       
   101 
       
   102 static void
       
   103 GrabShellPopup(Widget grab_shell,
       
   104                 jobject this,
       
   105                 XmAnyCallbackStruct * call_data)
       
   106 {
       
   107     skipNextNotifyWhileGrabbed = True;
       
   108 }
       
   109 static void
       
   110 GrabShellPopdown(Widget grab_shell,
       
   111                 jobject this,
       
   112                 XmAnyCallbackStruct * call_data)
       
   113 {
       
   114     skipNextNotifyWhileGrabbed = True;
       
   115     skipNextFocusIn = True;
       
   116 }
       
   117 
       
   118 static void
       
   119 Choice_callback(Widget list,
       
   120                 jobject this,
       
   121                 XmAnyCallbackStruct * call_data)
       
   122 {
       
   123     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
       
   124     XmListCallbackStruct *cbs = (XmListCallbackStruct *)call_data;
       
   125     struct ChoiceData *cdata;
       
   126 
       
   127 
       
   128     AWT_LOCK();
       
   129     /* Get the Choice data. */
       
   130     cdata = (struct ChoiceData *)
       
   131       JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
       
   132     if (cdata == NULL) {
       
   133         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   134         AWT_UNLOCK();
       
   135         return;
       
   136     }
       
   137     setSelection(env, this, cdata->comp.widget, cbs->item_position - 1);
       
   138     /* Get the Choice data. */
       
   139     JNU_CallMethodByName(env, NULL,
       
   140         this, "action", "(I)V", cbs->item_position - 1);
       
   141     if ((*env)->ExceptionOccurred(env)) {
       
   142         (*env)->ExceptionDescribe(env);
       
   143         (*env)->ExceptionClear(env);
       
   144     }
       
   145     AWT_UNLOCK();
       
   146 }
       
   147 
       
   148 static void
       
   149 addItems(JNIEnv *env, jobject this,
       
   150     jstring *items, int32_t nItems, jint index)
       
   151 {
       
   152     struct ChoiceData *cdata;
       
   153     int32_t i;
       
   154     Widget list;
       
   155     XmString mfstr = NULL;
       
   156     XmFontList fontlist = NULL;
       
   157     jobject font = awtJNI_GetFont(env, this);
       
   158     Boolean IsMultiFont = awtJNI_IsMultiFont(env, font);
       
   159 
       
   160     if ((items == NULL) || (nItems == 0)) {
       
   161         return;
       
   162     }
       
   163 
       
   164     AWT_LOCK();
       
   165 
       
   166     cdata = (struct ChoiceData *)
       
   167       JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
       
   168 
       
   169     if (cdata == NULL) {
       
   170         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   171         AWT_UNLOCK();
       
   172         return;
       
   173     }
       
   174 
       
   175     for (i = 0; i < nItems; ++i) {
       
   176         char *temp = (char *)JNU_GetStringPlatformChars(env, items[i], NULL);
       
   177         mfstr = XmStringCreateLocalized(temp);
       
   178         JNU_ReleaseStringPlatformChars(env, items[i], (const char *)temp);
       
   179         XmComboBoxAddItem(cdata->comp.widget, mfstr, index + i + 1, FALSE);
       
   180 
       
   181         if (mfstr != NULL) {
       
   182             XmStringFree(mfstr);
       
   183             mfstr = NULL;
       
   184         }
       
   185     }
       
   186 
       
   187     cdata->n_items += nItems;
       
   188 
       
   189     list = XtNameToWidget(cdata->comp.widget, "*List");
       
   190     XtVaSetValues(list,
       
   191                   XmNvisibleItemCount, min(MAX_VISIBLE, cdata->n_items),
       
   192                   NULL);
       
   193     AWT_UNLOCK();
       
   194 }
       
   195 
       
   196 /*
       
   197  * Class:     sun_awt_motif_MChoicePeer
       
   198  * Method:    create
       
   199  * Signature: (Lsun/awt/motif/MComponentPeer;)V
       
   200  */
       
   201 JNIEXPORT void JNICALL
       
   202 Java_sun_awt_motif_MChoicePeer_create(JNIEnv * env, jobject this,
       
   203     jobject parent)
       
   204 {
       
   205     jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this);
       
   206 
       
   207     struct ComponentData *wdata; /* parent's peer data */
       
   208     struct ChoiceData *cdata;    /* our own peer data */
       
   209     Widget list, text, list_shell;               /* components of drop dowwn list widget */
       
   210 
       
   211     AwtGraphicsConfigDataPtr adata;
       
   212     Pixel fg, bg;                /* colors inherited from parent */
       
   213     Dimension width = 0, height = 0;
       
   214     jclass clsDimension;
       
   215     jobject dimension;
       
   216 
       
   217 #undef MAX_ARGC
       
   218 #define MAX_ARGC 30
       
   219     Arg args[MAX_ARGC];
       
   220     int32_t argc;
       
   221 
       
   222     AWT_LOCK();
       
   223 
       
   224     if (JNU_IsNull(env, parent)) {
       
   225         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   226         return;
       
   227     }
       
   228 
       
   229     /* get parent's peer data */
       
   230     wdata = (struct ComponentData *)JNU_GetLongFieldAsPtr(env,
       
   231                 parent, mComponentPeerIDs.pData);
       
   232     if (wdata == NULL) {
       
   233         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   234         AWT_UNLOCK();
       
   235         return;
       
   236     }
       
   237 
       
   238     /* create our own peer data */
       
   239     cdata = ZALLOC(ChoiceData);
       
   240     if (cdata == NULL) {
       
   241         JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
       
   242         AWT_UNLOCK();
       
   243         return;
       
   244     }
       
   245     JNU_SetLongFieldFromPtr(env, this, mComponentPeerIDs.pData, cdata);
       
   246 
       
   247     /* get desired size */
       
   248     clsDimension = (*env)->FindClass(env, "java/awt/Dimension");
       
   249     DASSERT(clsDimension != NULL);
       
   250 
       
   251     dimension = JNU_CallMethodByName(env, NULL,
       
   252                     this, "getPreferredSize", "()Ljava/awt/Dimension;").l;
       
   253     width  = (Dimension)((*env)->GetIntField(env, dimension,
       
   254                              (*env)->GetFieldID(env, clsDimension,
       
   255                                  "width" , "I")));
       
   256     height = (Dimension)((*env)->GetIntField(env, dimension,
       
   257                              (*env)->GetFieldID(env, clsDimension,
       
   258                                  "height", "I")));
       
   259 
       
   260     /* Inherit visual/colors from parent component */
       
   261     XtVaGetValues(wdata->widget, XmNbackground, &bg, NULL);
       
   262     XtVaGetValues(wdata->widget, XmNforeground, &fg, NULL);
       
   263     adata = copyGraphicsConfigToPeer(env, this);
       
   264 
       
   265     argc = 0;
       
   266     XtSetArg(args[argc], XmNuserData, (XtPointer)globalRef);            ++argc;
       
   267     XtSetArg(args[argc], XmNx, 0);                                      ++argc;
       
   268     XtSetArg(args[argc], XmNy, 0);                                      ++argc;
       
   269     XtSetArg(args[argc], XmNmarginHeight, 2);                           ++argc;
       
   270     XtSetArg(args[argc], XmNmarginWidth, 1);                            ++argc;
       
   271     XtSetArg(args[argc], XmNvisibleItemCount, 0);                       ++argc;
       
   272     XtSetArg(args[argc], XmNancestorSensitive, True);                   ++argc;
       
   273     /* Don't ding on key press */
       
   274     XtSetArg(args[argc], XmNverifyBell, False);                         ++argc;
       
   275     XtSetArg(args[argc], XmNvisual, adata->awt_visInfo.visual);         ++argc;
       
   276     XtSetArg(args[argc], XmNscreen,
       
   277              ScreenOfDisplay(awt_display, adata->awt_visInfo.screen));  ++argc;
       
   278     XtSetArg(args[argc], XmNbackground, bg);                            ++argc;
       
   279     XtSetArg(args[argc], XmNforeground, fg);                            ++argc;
       
   280 
       
   281     DASSERT(!(argc > MAX_ARGC));
       
   282     cdata->comp.widget = XmCreateDropDownList(wdata->widget,
       
   283                                               "combobox", args, argc);
       
   284     cdata->n_items = 0;
       
   285 
       
   286     list = XtNameToWidget(cdata->comp.widget, "*List");
       
   287     text = XtNameToWidget(cdata->comp.widget, "*Text");
       
   288     list_shell = XtNameToWidget(cdata->comp.widget, "*GrabShell");
       
   289     XtAddCallback(list_shell,
       
   290                   XmNpopupCallback,
       
   291                   (XtCallbackProc)GrabShellPopup,
       
   292                   globalRef);
       
   293     XtAddCallback(list_shell,
       
   294                   XmNpopdownCallback,
       
   295                   (XtCallbackProc)GrabShellPopdown,
       
   296                   globalRef);
       
   297 
       
   298     /*
       
   299      * Bug 4477410:  Setting the width of the XmComboBox made the XmTextField
       
   300      * too small, cutting off the dropdown list knob on the right side. Set
       
   301      * the width of the TextField because it is the widget actually seen.
       
   302     */
       
   303     /* Set the width and height of the TextField widget. */
       
   304     XtVaSetValues(text,
       
   305                   XmNwidth, width,
       
   306                   XmNheight, height,
       
   307                   NULL);
       
   308 
       
   309     XtAddCallback(list,
       
   310                   XmNbrowseSelectionCallback,
       
   311                   (XtCallbackProc)Choice_callback,
       
   312                   (XtPointer)globalRef);
       
   313 
       
   314     XtAddEventHandler(text, FocusChangeMask, True,
       
   315                       awt_canvas_event_handler, globalRef);
       
   316 
       
   317     awt_addWidget(text, cdata->comp.widget, globalRef,
       
   318                   java_awt_AWTEvent_KEY_EVENT_MASK
       
   319                   | java_awt_AWTEvent_MOUSE_EVENT_MASK
       
   320                   | java_awt_AWTEvent_MOUSE_MOTION_EVENT_MASK);
       
   321 
       
   322     XtSetMappedWhenManaged(cdata->comp.widget, False);
       
   323     XtManageChild(cdata->comp.widget);
       
   324 
       
   325     AWT_UNLOCK();
       
   326 }
       
   327 
       
   328 /*
       
   329  * Class:     sun_awt_motif_MChoicePeer
       
   330  * Method:    pSelect
       
   331  * Signature: (I)V
       
   332  */
       
   333 JNIEXPORT void JNICALL
       
   334 Java_sun_awt_motif_MChoicePeer_pSelect(JNIEnv *env, jobject this,
       
   335     jint index, jboolean init)
       
   336 {
       
   337     struct ChoiceData *cdata;
       
   338     Widget list;
       
   339 
       
   340     AWT_LOCK();
       
   341 
       
   342     cdata = (struct ChoiceData *)JNU_GetLongFieldAsPtr(env,
       
   343                 this, mComponentPeerIDs.pData);
       
   344     if (cdata == NULL) {
       
   345         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   346         AWT_UNLOCK();
       
   347         return;
       
   348     }
       
   349 
       
   350     list = XtNameToWidget(cdata->comp.widget, "*List");
       
   351 
       
   352     XmListDeselectAllItems(list);
       
   353     XmListSelectPos(list, index + 1, False);
       
   354     setSelection(env, this, cdata->comp.widget, index);
       
   355     XmComboBoxUpdate(cdata->comp.widget);
       
   356 
       
   357     AWT_UNLOCK();
       
   358 }
       
   359 
       
   360 /*
       
   361  * Class:     sun_awt_motif_MChoicePeer
       
   362  * Method:    setFont
       
   363  * Signature: (Ljava/awt/Font;)V
       
   364  */
       
   365 JNIEXPORT void JNICALL
       
   366 Java_sun_awt_motif_MChoicePeer_setFont(JNIEnv *env, jobject this,
       
   367     jobject f)
       
   368 {
       
   369     struct ChoiceData *cdata;
       
   370     struct FontData *fdata;
       
   371     XmFontList fontlist;
       
   372     Widget list;
       
   373     Widget text;
       
   374     char *err;
       
   375     XmFontListEntry fontentry;
       
   376     Position x=0, y=0;
       
   377 
       
   378     if (JNU_IsNull(env, f)) {
       
   379         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   380         return;
       
   381     }
       
   382     AWT_LOCK();
       
   383 
       
   384     fdata = awtJNI_GetFontData(env, f, &err);
       
   385     if (fdata == NULL) {
       
   386         JNU_ThrowInternalError(env, err);
       
   387         AWT_UNLOCK();
       
   388         return;
       
   389     }
       
   390 
       
   391     cdata = (struct ChoiceData *)JNU_GetLongFieldAsPtr(env,
       
   392                 this, mComponentPeerIDs.pData);
       
   393     if (cdata == NULL || cdata->comp.widget == NULL) {
       
   394         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   395         AWT_UNLOCK();
       
   396         return;
       
   397     }
       
   398 
       
   399     /* Make a fontset and set it. */
       
   400     if (awtJNI_IsMultiFont(env, f)) {
       
   401         if (fdata->xfs == NULL) {
       
   402             fdata->xfs = awtJNI_MakeFontSet(env, f);
       
   403         }
       
   404         if (fdata->xfs != NULL) {
       
   405             fontentry = XmFontListEntryCreate("labelFont",
       
   406                                               XmFONT_IS_FONTSET,
       
   407                                               (XtPointer) (fdata->xfs));
       
   408             fontlist = XmFontListAppendEntry(NULL, fontentry);
       
   409             /*
       
   410              * Some versions of motif have a bug in
       
   411              * XmFontListEntryFree() which causes it to free more than it
       
   412              * should.  Use XtFree() instead.  See O'Reilly's
       
   413              * Motif Reference Manual for more information.
       
   414              */
       
   415             XmFontListEntryFree(&fontentry);
       
   416         } else {
       
   417             fontlist = XmFontListCreate(fdata->xfont, "labelFont");
       
   418         }
       
   419     } else {
       
   420         fontlist = XmFontListCreate(fdata->xfont, "labelFont");
       
   421     }
       
   422     XtVaSetValues(cdata->comp.widget,
       
   423                   XmNfontList, fontlist,
       
   424                   NULL);
       
   425     list = XtNameToWidget(cdata->comp.widget, "*List");
       
   426     XtVaSetValues(list,
       
   427                   XmNfontList, fontlist,
       
   428                   NULL);
       
   429 
       
   430     text = XtNameToWidget(cdata->comp.widget, "*Text");
       
   431     XtVaSetValues(text,
       
   432                   XmNfontList, fontlist,
       
   433                   NULL);
       
   434     XmFontListFree(fontlist);
       
   435     XtVaGetValues(cdata->comp.widget,
       
   436                   XmNx, &x,
       
   437                   XmNy, &y,
       
   438                   NULL);
       
   439     Java_sun_awt_motif_MChoicePeer_pReshape(env, this, x, y, 0, 0);
       
   440     AWT_UNLOCK();
       
   441 }
       
   442 
       
   443 
       
   444 /*
       
   445  * Class:     sun_awt_motif_MChoicePeer
       
   446  * Method:    freeNativeData
       
   447  * Signature: ()V
       
   448  */
       
   449 JNIEXPORT void JNICALL
       
   450 Java_sun_awt_motif_MChoicePeer_freeNativeData(JNIEnv *env, jobject this)
       
   451 {
       
   452     /*
       
   453      * Fix for bug 4326619 - not necessary for Motif 2.1
       
   454      */
       
   455 }
       
   456 
       
   457 
       
   458 /*
       
   459  * Class:     sun_awt_motif_MChoicePeer
       
   460  * Method:    setBackground
       
   461  * Signature: (Ljava/awt/Color;)V
       
   462  */
       
   463 JNIEXPORT void JNICALL
       
   464 Java_sun_awt_motif_MChoicePeer_setBackground(JNIEnv *env, jobject this,
       
   465     jobject c)
       
   466 {
       
   467     struct ChoiceData *cdata;
       
   468     Pixel bg;
       
   469     Pixel fg;
       
   470     int32_t i;
       
   471 
       
   472     if (JNU_IsNull(env, c)) {
       
   473         JNU_ThrowNullPointerException(env, "NullPointerException: null color");
       
   474         return;
       
   475     }
       
   476     AWT_LOCK();
       
   477 
       
   478     cdata = (struct ChoiceData *)
       
   479         JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
       
   480     if (cdata == NULL || cdata->comp.widget == NULL) {
       
   481         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   482         AWT_UNLOCK();
       
   483         return;
       
   484     }
       
   485     /* Get background color */
       
   486     bg = awtJNI_GetColor(env, c);
       
   487 
       
   488     /*
       
   489        XmChangeColor(), in addtion to changing the background and
       
   490        selection colors, also changes the foreground color to be
       
   491        what it thinks should be. However, we want to use the color
       
   492        that gets set by setForeground() instead. We therefore need to
       
   493        save the current foreground color here, and then set it again
       
   494        after the XmChangeColor() occurs.
       
   495     */
       
   496     XtVaGetValues(cdata->comp.widget, XmNforeground, &fg, NULL);
       
   497 
       
   498     /* Set color */
       
   499     XmChangeColor(cdata->comp.widget, bg);
       
   500     XtVaSetValues(cdata->comp.widget, XmNforeground, fg, NULL);
       
   501 
       
   502     AWT_FLUSH_UNLOCK();
       
   503 }
       
   504 
       
   505 /*
       
   506  * Class:     sun_awt_motif_MChoicePeer
       
   507  * Method:    setForeground
       
   508  * Signature: (Ljava/awt/Color;)V
       
   509  */
       
   510 JNIEXPORT void JNICALL
       
   511 Java_sun_awt_motif_MChoicePeer_setForeground(JNIEnv *env, jobject this,
       
   512     jobject c)
       
   513 {
       
   514     struct ChoiceData *cdata;
       
   515     Pixel color;
       
   516     int32_t i;
       
   517 
       
   518     if (JNU_IsNull(env, c)) {
       
   519         JNU_ThrowNullPointerException(env, "NullPointerException: null color");
       
   520         return;
       
   521     }
       
   522     AWT_LOCK();
       
   523 
       
   524     cdata = (struct ChoiceData *)
       
   525       JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
       
   526     if (cdata == NULL || cdata->comp.widget == NULL) {
       
   527         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   528         AWT_UNLOCK();
       
   529         return;
       
   530     }
       
   531     color = awtJNI_GetColor(env, c);
       
   532 
       
   533     XtVaSetValues(cdata->comp.widget, XmNforeground, color, NULL);
       
   534 
       
   535     AWT_FLUSH_UNLOCK();
       
   536 }
       
   537 
       
   538 /*
       
   539  * Class:     sun_awt_motif_MChoicePeer
       
   540  * Method:    pReshape
       
   541  * Signature: (IIII)V
       
   542  */
       
   543 JNIEXPORT void JNICALL
       
   544 Java_sun_awt_motif_MChoicePeer_pReshape(JNIEnv *env, jobject this,
       
   545     jint x, jint y, jint w, jint h)
       
   546 {
       
   547     struct ChoiceData *cdata;
       
   548     Widget list;
       
   549     Dimension width = 0, height = 0;
       
   550     jclass clsDimension;
       
   551     jobject dimension;
       
   552     jobject target;
       
   553     Widget text=NULL;
       
   554 
       
   555     AWT_LOCK();
       
   556 
       
   557     cdata = (struct ChoiceData *)
       
   558       JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
       
   559     if (cdata == NULL || cdata->comp.widget == NULL) {
       
   560         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   561         AWT_UNLOCK();
       
   562         return;
       
   563     }
       
   564 
       
   565     if (w == 0) {
       
   566         /* Set the width and height of the TextField widget to the
       
   567          * PreferredSize, based on the font size.
       
   568         */
       
   569         clsDimension = (*env)->FindClass(env, "java/awt/Dimension");
       
   570         DASSERT(clsDimension != NULL);
       
   571         dimension = JNU_CallMethodByName(env, NULL,
       
   572                         this, "getPreferredSize", "()Ljava/awt/Dimension;").l;
       
   573         width  = (Dimension)((*env)->GetIntField(env, dimension,
       
   574                                  (*env)->GetFieldID(env, clsDimension,
       
   575                                      "width" , "I")));
       
   576         height = (Dimension)((*env)->GetIntField(env, dimension,
       
   577                                  (*env)->GetFieldID(env, clsDimension,
       
   578                                      "height", "I")));
       
   579     } else {
       
   580         /* Set the width and height of the TextField widget to the
       
   581          * given values. BorderLayout passes these values, for example.
       
   582         */
       
   583         width = w;
       
   584         height = h;
       
   585     }
       
   586     text = XtNameToWidget(cdata->comp.widget, "*Text");
       
   587     /*
       
   588      * Bug 4477410:  Setting the width of the XmComboBox made the XmTextField
       
   589      * too small, cutting off the dropdown list knob on the right side. Set
       
   590      * the width of the TextField because it is the widget actually seen.
       
   591     */
       
   592     XtVaSetValues(text,
       
   593                   XmNwidth, width,
       
   594                   XmNheight, height,
       
   595                   NULL);
       
   596 
       
   597     awt_util_reshape(cdata->comp.widget, x, y, width, height);
       
   598 
       
   599     list = XtNameToWidget(cdata->comp.widget, "*List");
       
   600 
       
   601     XtVaSetValues(list, XmNwidth, width, NULL);
       
   602 
       
   603     /* Set the width and height of the Choice component. */
       
   604     target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
       
   605     if (target == NULL) {
       
   606         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   607         AWT_UNLOCK();
       
   608         return;
       
   609     }
       
   610     (*env)->SetIntField(env, target, componentIDs.width, (jint)width);
       
   611     (*env)->SetIntField(env, target, componentIDs.height, (jint)height);
       
   612 
       
   613     AWT_FLUSH_UNLOCK();
       
   614 }
       
   615 
       
   616 
       
   617 /*
       
   618  * Class:     sun_awt_motif_MChoicePeer
       
   619  * Method:    addItem
       
   620  * Signature: (Ljava/lang/String;I)V
       
   621  */
       
   622 JNIEXPORT void JNICALL
       
   623 Java_sun_awt_motif_MChoicePeer_addItem(JNIEnv *env, jobject this,
       
   624     jstring item, jint index)
       
   625 {
       
   626     if (JNU_IsNull(env, item)) {
       
   627         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   628         return;
       
   629     }
       
   630     addItems(env, this, &item, 1, index);
       
   631 }
       
   632 
       
   633 
       
   634 /*
       
   635  * Class:     sun_awt_motif_MChoicePeer
       
   636  * Method:    appendItems
       
   637  * Signature: ([Ljava/lang/String;)V
       
   638  */
       
   639 JNIEXPORT void JNICALL
       
   640 Java_sun_awt_motif_MChoicePeer_appendItems(JNIEnv *env, jobject this,
       
   641     jarray items)
       
   642 {
       
   643     struct ChoiceData *cdata = NULL;
       
   644     jstring *strItems = NULL;
       
   645     int32_t nItems, i;
       
   646 
       
   647     if (JNU_IsNull(env, items)) {
       
   648         return;
       
   649     }
       
   650     nItems  = (*env)->GetArrayLength(env, items);
       
   651     if (nItems == 0) {
       
   652         return;
       
   653     }
       
   654 
       
   655     AWT_LOCK();
       
   656 
       
   657     cdata = (struct ChoiceData *)JNU_GetLongFieldAsPtr(env,
       
   658                 this, mComponentPeerIDs.pData);
       
   659     if (cdata == NULL) {
       
   660         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   661         goto cleanup;
       
   662     }
       
   663 
       
   664     strItems = (jstring *)malloc(sizeof(jstring) * nItems);
       
   665     if (strItems == NULL) {
       
   666         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   667         goto cleanup;
       
   668     }
       
   669 
       
   670     for (i = 0; i < nItems; ++i) {
       
   671         strItems[i] = (jstring)(*env)->GetObjectArrayElement(env,
       
   672                                    items, (jsize)i);
       
   673         if (JNU_IsNull(env, strItems[i])) {
       
   674             JNU_ThrowNullPointerException(env, "NullPointerException");
       
   675             goto cleanup;
       
   676         }
       
   677     }
       
   678 
       
   679     addItems(env, this, strItems, nItems, (jint)cdata->n_items);
       
   680 
       
   681   cleanup:
       
   682     if (strItems != NULL) {
       
   683         free(strItems);
       
   684     }
       
   685     AWT_UNLOCK();
       
   686 }
       
   687 
       
   688 
       
   689 /*
       
   690  * Class:     sun_awt_motif_MChoicePeer
       
   691  * Method:    remove
       
   692  * Signature: (I)V
       
   693  */
       
   694 JNIEXPORT void JNICALL
       
   695 Java_sun_awt_motif_MChoicePeer_remove(JNIEnv *env, jobject this,
       
   696     jint index)
       
   697 {
       
   698     struct ChoiceData *cdata;
       
   699     Widget list;
       
   700     Widget text=NULL;
       
   701 
       
   702     AWT_LOCK();
       
   703 
       
   704     cdata = (struct ChoiceData *)
       
   705       JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
       
   706     if (cdata == NULL || cdata->comp.widget == NULL) {
       
   707         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   708         AWT_UNLOCK();
       
   709         return;
       
   710     }
       
   711 
       
   712     XmComboBoxDeletePos(cdata->comp.widget, index + 1);
       
   713     --(cdata->n_items);
       
   714 
       
   715     list = XtNameToWidget(cdata->comp.widget, "*List");
       
   716     XtVaSetValues(list, XmNvisibleItemCount, min(MAX_VISIBLE, cdata->n_items), NULL);
       
   717 
       
   718     if (cdata->n_items == 0) {
       
   719         /* No item is selected, so clear the TextField. */
       
   720         text = XtNameToWidget(cdata->comp.widget, "*Text");
       
   721         XtVaSetValues(text, XmNvalue, "", NULL);
       
   722     }
       
   723 
       
   724     AWT_UNLOCK();
       
   725 }
       
   726 
       
   727 /*
       
   728  * Class:     sun_awt_motif_MChoicePeer
       
   729  * Method:    removeAll
       
   730  * Signature: ()V
       
   731  */
       
   732 JNIEXPORT void JNICALL
       
   733 Java_sun_awt_motif_MChoicePeer_removeAll(JNIEnv *env, jobject this)
       
   734 {
       
   735     struct ChoiceData *cdata;
       
   736     int32_t i;
       
   737     Widget text=NULL;
       
   738     Widget list;
       
   739 
       
   740     AWT_LOCK();
       
   741 
       
   742     cdata = (struct ChoiceData *)
       
   743       JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
       
   744     if (cdata == NULL || cdata->comp.widget == NULL) {
       
   745         JNU_ThrowNullPointerException(env, "NullPointerException");
       
   746         AWT_UNLOCK();
       
   747         return;
       
   748     }
       
   749 
       
   750     for (i = cdata->n_items - 1; i >= 0; --i) {
       
   751         XmComboBoxDeletePos(cdata->comp.widget, i);
       
   752     }
       
   753     cdata->n_items = 0;
       
   754 
       
   755     /* No item is selected, so clear the TextField. */
       
   756     text = XtNameToWidget(cdata->comp.widget, "*Text");
       
   757     XtVaSetValues(text, XmNvalue, "", NULL);
       
   758 
       
   759     /* should set XmNvisibleItemCount to 1 as 0 is invalid value */
       
   760     list = XtNameToWidget(cdata->comp.widget, "*List");
       
   761     XtVaSetValues(list, XmNvisibleItemCount, 1, NULL);
       
   762 
       
   763     AWT_UNLOCK();
       
   764 }