jdk/src/solaris/native/sun/awt/awt_FileDialog.c
changeset 1211 b659a7cee935
parent 1210 7798f9e88bf9
parent 1203 3e5496df0d2b
child 1212 d718a4419361
--- a/jdk/src/solaris/native/sun/awt/awt_FileDialog.c	Fri Sep 12 14:35:51 2008 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,925 +0,0 @@
-/*
- * Copyright 1995-2004 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-#ifdef HEADLESS
-    #error This file should not be included in headless library
-#endif
-
-#include "awt_p.h"
-#include <Xm/AtomMgr.h>
-#include <Xm/Protocols.h>
-#include <sys/param.h>
-#include <string.h>
-#include <stdlib.h>
-#include "awt_p.h"
-#include "java_awt_FileDialog.h"
-#include "java_awt_event_MouseWheelEvent.h"
-#include "sun_awt_motif_MFileDialogPeer.h"
-#include "sun_awt_motif_MComponentPeer.h"
-#include "multi_font.h"
-
-#include "awt_Component.h"
-
-#include <jni.h>
-#include <jni_util.h>
-#include <Xm/FileSB.h>
-
-#define MAX_DIR_PATH_LEN    1024
-
-extern void Text_handlePaste(Widget w, XtPointer client_data, XEvent * event,
-                             Boolean * cont);
-
-extern struct MComponentPeerIDs mComponentPeerIDs;
-
-extern AwtGraphicsConfigDataPtr
-    copyGraphicsConfigToPeer(JNIEnv *env, jobject this);
-
-/* fieldIDs for FileDialog fields and methods that may be accessed from C */
-static struct FileDialogIDs {
-    jfieldID mode;
-    jfieldID file;
-} fileDialogIDs;
-
-/* the field to store the default search procedure */
-static XmSearchProc DefaultSearchProc = NULL;
-
-/* mouse wheel handler for scrolling */
-void File_handleWheel(Widget w, XtPointer client_data, XEvent* event, Boolean* cont);
-
-/*
- * Class:     java_awt_FileDialog
- * Method:    initIDs
- * Signature: ()V
- */
-
-/* This function gets called from the static initializer for FileDialog.java
-   to initialize the fieldIDs for fields that may be accessed from C */
-
-JNIEXPORT void JNICALL
-Java_java_awt_FileDialog_initIDs
-  (JNIEnv *env, jclass cls)
-{
-    fileDialogIDs.mode = (*env)->GetFieldID(env, cls, "mode", "I");
-    fileDialogIDs.file =
-      (*env)->GetFieldID(env, cls, "file", "Ljava/lang/String;");
-
-    DASSERT(fileDialogIDs.mode != NULL);
-    DASSERT(fileDialogIDs.file != NULL);
-}
-
-/*
- * client_data is MFileDialogPeer instance pointer
- */
-static void
-FileDialog_OK(Widget w,
-              void *client_data,
-              XmFileSelectionBoxCallbackStruct * call_data)
-{
-    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    jobject this = (jobject) client_data;
-    struct FrameData *fdata;
-    char *file;
-    jstring jstr;
-    XmStringContext   stringContext;
-    XmStringDirection direction;
-    XmStringCharSet   charset;
-    Boolean           separator;
-
-    fdata = (struct FrameData *)JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
-
-    if ((*env)->EnsureLocalCapacity(env, 1) < 0)
-        return;
-
-    if (!XmStringInitContext(&stringContext, call_data->value))
-        return;
-
-    if (!XmStringGetNextSegment(stringContext, &file, &charset,
-                                &direction, &separator))
-        file = NULL;
-
-    if (file == NULL)
-        jstr = NULL;
-    else
-        jstr = JNU_NewStringPlatform(env, (const char *) file);
-
-    if (jstr != 0) {
-        JNU_CallMethodByName(env, NULL, this, "handleSelected",
-                             "(Ljava/lang/String;)V", jstr);
-        (*env)->DeleteLocalRef(env, jstr);
-    }
-    if ((*env)->ExceptionOccurred(env)) {
-        (*env)->ExceptionDescribe(env);
-        (*env)->ExceptionClear(env);
-    }
-
-    XmStringFreeContext(stringContext);
-    if (file != NULL)
-        XtFree(file);
-}
-
-/*
- * client_data is MFileDialogPeer instance pointer
- */
-static void
-FileDialog_CANCEL(Widget w,
-                  void *client_data,
-                  XmFileSelectionBoxCallbackStruct * call_data)
-{
-    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    jobject this = (jobject) client_data;
-    struct FrameData *fdata;
-
-    fdata = (struct FrameData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
-
-    JNU_CallMethodByName(env, NULL, (jobject) client_data, "handleCancel", "()V");
-    if ((*env)->ExceptionOccurred(env)) {
-        (*env)->ExceptionDescribe(env);
-        (*env)->ExceptionClear(env);
-    }
-}
-
-
-/*
- * client_data is MFileDialogPeer instance pointer
- */
-static void
-FileDialog_quit(Widget w,
-                XtPointer client_data,
-                XtPointer call_data)
-{
-    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-
-    JNU_CallMethodByName(env, NULL, (jobject) client_data, "handleQuit", "()V");
-    if ((*env)->ExceptionOccurred(env)) {
-        (*env)->ExceptionDescribe(env);
-        (*env)->ExceptionClear(env);
-    }
-}
-
-static void
-setDeleteCallback(jobject this, struct FrameData *wdata)
-{
-    Atom xa_WM_DELETE_WINDOW;
-    Atom xa_WM_PROTOCOLS;
-
-    XtVaSetValues(wdata->winData.shell,
-                  XmNdeleteResponse, XmDO_NOTHING,
-                  NULL);
-    xa_WM_DELETE_WINDOW = XmInternAtom(XtDisplay(wdata->winData.shell),
-                                       "WM_DELETE_WINDOW", False);
-    xa_WM_PROTOCOLS = XmInternAtom(XtDisplay(wdata->winData.shell),
-                                   "WM_PROTOCOLS", False);
-
-    XmAddProtocolCallback(wdata->winData.shell,
-                          xa_WM_PROTOCOLS,
-                          xa_WM_DELETE_WINDOW,
-                          FileDialog_quit, (XtPointer) this);
-}
-
-void
-setFSBDirAndFile(Widget w, char *dir, char *file,
-                 XmString *ffiles, int count)
-{
-    Widget textField, list;
-    char dirbuf[MAX_DIR_PATH_LEN];
-    XmString xim, item;
-    size_t lastSelect;
-
-    dirbuf[0] = (char) '\0';
-
-    if (dir != NULL && strlen(dir) < MAX_DIR_PATH_LEN)
-        strcpy(dirbuf, dir);
-
-    /* -----> make sure dir ends in '/' */
-    if (dirbuf[0] != (char) '\0') {
-        if (dirbuf[strlen(dirbuf) - 1] != (char) '/')
-            strcat(dirbuf, "/");
-    } else {
-        getcwd(dirbuf, MAX_DIR_PATH_LEN - 16);
-        strcat(dirbuf, "/");
-    }
-
-    strcat(dirbuf, "[^.]*");
-    xim = XmStringCreate(dirbuf, XmSTRING_DEFAULT_CHARSET);
-    XtVaSetValues(w, XmNdirMask, xim, NULL);
-
-    if (ffiles != NULL)
-      XtVaSetValues(w,
-                    XmNfileListItems, (count > 0) ? ffiles : NULL,
-                    XmNfileListItemCount, count,
-                    XmNlistUpdated, True, NULL);
-
-    XmStringFree(xim);
-
-    /*
-     * Select the filename from the filelist if it exists.
-     */
-
-    textField = XmFileSelectionBoxGetChild(w, XmDIALOG_TEXT);
-    list = XmFileSelectionBoxGetChild(w, XmDIALOG_LIST);
-
-    if (textField != 0 && file != 0) {
-        lastSelect = strlen(file);
-        XtVaSetValues(textField, XmNvalue, file, NULL);
-        XmTextFieldSetSelection(textField, 0, lastSelect, CurrentTime);
-
-        item = XmStringCreateLocalized(file);
-        XmListSelectItem(list, item, NULL);
-        XmStringFree(item);
-    }
-}
-
-static void
-changeBackground(Widget w, void *bg)
-{
-    /*
-    ** This is a work-around for bug 4325443, caused by motif bug 4345559,
-    ** XmCombobox dosn't return all children, so give it some help ...
-    */
-    Widget grabShell;
-    grabShell = XtNameToWidget(w, "GrabShell");
-    if (grabShell != NULL) {
-        awt_util_mapChildren(grabShell, changeBackground, 0, (void *) bg);
-    }
-
-    XmChangeColor(w, (Pixel) bg);
-}
-
-void
-ourSearchProc(Widget w, XtPointer p) {
-    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    struct FrameData *wdata;
-    XtPointer peer;
-    jobject this;
-    jboolean res;
-    char * dir = NULL;
-    jstring dir_o;
-    int32_t i, filecount = 0;
-    XmString * filelist = NULL;
-    jobjectArray nffiles = NULL;
-    jclass clazz = NULL;
-    jstring jfilename = NULL;
-    char * cfilename = NULL;
-    XmFileSelectionBoxCallbackStruct * vals = (XmFileSelectionBoxCallbackStruct *)p;
-
-    XtVaGetValues(w, XmNuserData, &peer, NULL);
-    this = (jobject)peer;
-    if (JNU_IsNull(env, this) ) {
-        return;
-    }
-    wdata = (struct FrameData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
-    if (wdata == 0 ||
-        wdata->winData.comp.widget == 0 ||
-        wdata->winData.shell == 0 || p == NULL ) {
-        return;
-    }
-
-    if ((*env)->EnsureLocalCapacity(env, 1) < 0) {
-        return;
-    }
-
-    if (DefaultSearchProc != NULL) {
-        /* Unmap the widget temporary. If it takes a long time to generate
-           the list items some visual artifacts may be caused. However,
-           we need to do this to have the widget that works as we expect.
-         */
-        XtSetMappedWhenManaged(w, False);
-        /* Call the default Motif search procedure to take the
-           native filtered file list.
-         */
-        DefaultSearchProc(w, vals);
-        XtSetMappedWhenManaged(w, True);
-        XtVaGetValues(w,
-                      XmNlistItemCount, &filecount,
-                      XmNlistItems, &filelist,
-                      NULL);
-        /* We need to construct the new String array to pass it to
-           the Java code.
-         */
-        clazz = (*env)->FindClass(env, "java/lang/String");
-        /* It is ok if filecount is 0. */
-        nffiles = (*env)->NewObjectArray(env, filecount, clazz, NULL);
-        if (JNU_IsNull(env, nffiles)) {
-            nffiles = NULL;
-            JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
-        } else {
-            for (i = 0; i < filecount; i++) {
-                DASSERT(filelist[i] != NULL);
-
-                XmStringGetLtoR(filelist[i], XmFONTLIST_DEFAULT_TAG, &cfilename);
-                jfilename = JNU_NewStringPlatform(env, cfilename);
-
-                if (JNU_IsNull(env, jfilename)) {
-                    XtFree(cfilename);
-                    nffiles = NULL;
-                    JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
-                    break;
-                }
-
-                (*env)->SetObjectArrayElement(env, nffiles, i, jfilename);
-
-                (*env)->DeleteLocalRef(env, jfilename);
-                XtFree(cfilename);
-            }
-        }
-    }
-
-    XmStringGetLtoR(vals->dir, XmFONTLIST_DEFAULT_TAG, &dir);
-    dir_o = JNU_NewStringPlatform(env, dir);
-    res = JNU_CallMethodByName(env, NULL, this,
-                               "proceedFiltering",
-                               "(Ljava/lang/String;[Ljava/lang/String;Z)Z",
-                               dir_o, nffiles,
-                               awt_currentThreadIsPrivileged(env)).z;
-
-    if ((*env)->ExceptionOccurred(env)) {
-        (*env)->ExceptionDescribe(env);
-        (*env)->ExceptionClear(env);
-    }
-
-    XtVaSetValues(w,
-                  XmNlistUpdated, res,
-                  NULL);
-    (*env)->DeleteLocalRef(env, dir_o);
-    free(dir);
-}
-
-/*
- * Class:     sun_awt_motif_MFileDialogPeer
- * Method:    create
- * Signature: (Lsun/awt/motif/MComponentPeer;)V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_create
-  (JNIEnv *env, jobject this, jobject parent)
-{
-    struct FrameData *fdata;
-    struct CanvasData *wdata;
-    int32_t argc;
-#define MAX_ARGC 20
-    Arg args[MAX_ARGC];
-    Widget child, textField, dirList, fileList;
-    XmString xim;
-    Pixel bg;
-    jobject target;
-    jstring file;
-    jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this);
-    AwtGraphicsConfigDataPtr adata;
-#ifndef NOMODALFIX
-    extern void awt_shellPoppedUp(Widget shell, XtPointer c, XtPointer d);
-    extern void awt_shellPoppedDown(Widget shell, XtPointer c, XtPointer d);
-#endif NOMODALFIX
-
-    target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
-    if (JNU_IsNull(env, parent) || JNU_IsNull(env, target)) {
-        JNU_ThrowNullPointerException(env, "NullPointerException");
-        return;
-    }
-    AWT_LOCK();
-
-    adata = copyGraphicsConfigToPeer(env, this);
-
-    wdata = (struct CanvasData *) JNU_GetLongFieldAsPtr(env,parent,mComponentPeerIDs.pData);
-
-    fdata = ZALLOC(FrameData);
-    JNU_SetLongFieldFromPtr(env,this,mComponentPeerIDs.pData,fdata);
-
-    if (fdata == NULL) {
-        JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
-        AWT_UNLOCK();
-        return;
-    }
-    XtVaGetValues(wdata->comp.widget, XmNbackground, &bg, NULL);
-
-    /*
-     * XXX: this code uses FrameData but doesn't bother to init a lot
-     * of its memebers.  This confuses the hell out of the code in
-     * awt_TopLevel.c that gets passes such half-inited FrameData.
-     */
-    fdata->decor = MWM_DECOR_ALL;
-
-    argc = 0;
-    XtSetArg(args[argc], XmNmustMatch, False);
-    argc++;
-    XtSetArg(args[argc], XmNautoUnmanage, False);
-    argc++;
-    XtSetArg(args[argc], XmNbackground, bg);
-    argc++;
-    XtSetArg(args[argc], XmNvisual, adata->awt_visInfo.visual);
-    argc++;
-    XtSetArg(args[argc], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);
-    argc++;
-    XtSetArg (args[argc], XmNscreen,
-              ScreenOfDisplay(awt_display, adata->awt_visInfo.screen));
-    argc++;
-    XtSetArg(args[argc], XmNuserData, (XtPointer)globalRef);
-    argc++;
-    XtSetArg(args[argc], XmNresizePolicy, XmRESIZE_NONE);
-    argc++;
-
-    XtSetArg(args[argc], XmNbuttonFontList,  getMotifFontList());
-    argc++;
-    XtSetArg(args[argc], XmNlabelFontList,   getMotifFontList());
-    argc++;
-    XtSetArg(args[argc], XmNtextFontList,    getMotifFontList());
-    argc++;
-
-    DASSERT(!(argc > MAX_ARGC));
-
-    fdata->winData.comp.widget = XmCreateFileSelectionDialog(wdata->shell,
-                                                             "",
-                                                             args,
-                                                             argc);
-    fdata->winData.shell = XtParent(fdata->winData.comp.widget);
-    awt_util_mapChildren(fdata->winData.shell, changeBackground, 0,
-                         (void *) bg);
-    child = XmFileSelectionBoxGetChild(fdata->winData.comp.widget,
-                                       XmDIALOG_HELP_BUTTON);
-
-    /* We should save a pointer to the default search procedure
-       to do some things that we cannot do else. For instance,
-       apply the native pattern.
-     */
-    XtVaGetValues(fdata->winData.comp.widget,
-                  XmNfileSearchProc, &DefaultSearchProc,
-                  NULL);
-    XtVaSetValues(fdata->winData.comp.widget,
-                  XmNfileSearchProc, ourSearchProc,
-                  NULL);
-
-    /*
-     * Get textfield in FileDialog.
-     */
-    textField = XmFileSelectionBoxGetChild(fdata->winData.comp.widget,
-                                           XmDIALOG_TEXT);
-    if (child != NULL) {
-        /*
-         * Workaround for Bug Id 4415659.
-         * If the dialog child is unmanaged before the dialog is managed,
-         * the Motif drop site hierarchy may be broken if we associate
-         * a drop target with the dialog before it is shown.
-         */
-        XtSetMappedWhenManaged(fdata->winData.shell, False);
-        XtManageChild(fdata->winData.comp.widget);
-        XtUnmanageChild(fdata->winData.comp.widget);
-        XtSetMappedWhenManaged(fdata->winData.shell, True);
-        XtUnmanageChild(child);
-    }
-    if (!awtJNI_IsMultiFont(env, awtJNI_GetFont(env, this))) {
-        /* This process should not be done other than English language
-           locale. */
-        child = XmFileSelectionBoxGetChild(fdata->winData.comp.widget,
-                                           XmDIALOG_DEFAULT_BUTTON);
-        if (child != NULL) {
-            XmString xim;
-
-            switch ((*env)->GetIntField(env, target, fileDialogIDs.mode)) {
-                case java_awt_FileDialog_LOAD:
-                    xim = XmStringCreate("Open", "labelFont");
-                    XtVaSetValues(child, XmNlabelString, xim, NULL);
-                    XmStringFree(xim);
-                    break;
-
-                case java_awt_FileDialog_SAVE:
-                    xim = XmStringCreate("Save", "labelFont");
-                    XtVaSetValues(child, XmNlabelString, xim, NULL);
-                    XmStringFree(xim);
-                    break;
-
-                default:
-                    break;
-            }
-        }
-    }
-    XtAddCallback(fdata->winData.comp.widget,
-                  XmNokCallback,
-                  (XtCallbackProc) FileDialog_OK,
-                  (XtPointer) globalRef);
-    XtAddCallback(fdata->winData.comp.widget,
-                  XmNcancelCallback,
-                  (XtCallbackProc) FileDialog_CANCEL,
-                  (XtPointer) globalRef);
-
-#ifndef NOMODALFIX
-    XtAddCallback(fdata->winData.shell,
-                      XtNpopupCallback,
-                      awt_shellPoppedUp,
-                      NULL);
-    XtAddCallback(fdata->winData.shell,
-                      XtNpopdownCallback,
-                      awt_shellPoppedDown,
-                      NULL);
-#endif NOMODALFIX
-
-    setDeleteCallback(globalRef, fdata);
-
-    if (textField != NULL)  {
-        /*
-         * Insert event handler to correctly process cut/copy/paste keys
-         * such that interaction with our own clipboard mechanism will work
-         * properly.
-         *
-         * The Text_handlePaste() event handler is also used by both
-         * TextField/TextArea.
-         */
-        XtInsertEventHandler(textField,
-                         KeyPressMask,
-                         False, Text_handlePaste, (XtPointer) globalRef,
-                         XtListHead);
-    }
-
-    /* To get wheel scrolling, we add an event handler to the directory list and
-     * file list widgets to handle mouse wheels */
-    dirList = XmFileSelectionBoxGetChild(fdata->winData.comp.widget, XmDIALOG_DIR_LIST);
-    if (dirList != NULL) {
-        XtAddEventHandler(dirList, ButtonPressMask, False, File_handleWheel,
-                          (XtPointer) globalRef);
-    }
-
-    fileList = XmFileSelectionBoxGetChild(fdata->winData.comp.widget, XmDIALOG_LIST);
-    if (fileList != NULL) {
-        XtAddEventHandler(fileList, ButtonPressMask, False, File_handleWheel,
-                          (XtPointer) globalRef);
-    }
-
-    file = (*env)->GetObjectField(env, target, fileDialogIDs.file);
-    if (JNU_IsNull(env, file)) {
-        setFSBDirAndFile(fdata->winData.comp.widget, ".", "", NULL, -1);
-    } else {
-        char *fileString;
-
-        fileString = (char *) JNU_GetStringPlatformChars(env, file, NULL);
-        setFSBDirAndFile(fdata->winData.comp.widget, ".", fileString, NULL, -1);
-        JNU_ReleaseStringPlatformChars(env, file, (const char *) fileString);
-    }
-    AWT_UNLOCK();
-}
-
-/* Event handler for making scrolling happen when the mouse wheel is rotated */
-void File_handleWheel(Widget w, XtPointer client_data, XEvent* event, Boolean* cont) {
-    unsigned int btn;
-    Widget scrolledWindow = NULL;
-
-    /* only registered for ButtonPress, so don't need to check event type  */
-    btn = event->xbutton.button;
-    /* wheel up and wheel down show up as button 4 and 5, respectively */
-    if (btn == 4 || btn == 5) {
-        scrolledWindow = XtParent(w);
-        if (scrolledWindow == NULL) {
-            return;
-        }
-        awt_util_do_wheel_scroll(scrolledWindow,
-                             java_awt_event_MouseWheelEvent_WHEEL_UNIT_SCROLL,
-                             3,
-                             btn == 4 ? -1 : 1);
-    }
-}
-
-
-/*
- * Class:     sun_awt_motif_MFileDialogPeer
- * Method:    pReshape
- * Signature: (IIII)V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_pReshape
-  (JNIEnv *env, jobject this, jint x, jint y, jint w, jint h)
-{
-    struct FrameData *wdata;
-
-    AWT_LOCK();
-    wdata = (struct FrameData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
-    if (wdata == NULL || wdata->winData.shell == NULL) {
-        JNU_ThrowNullPointerException(env, "NullPointerException");
-        AWT_UNLOCK();
-        return;
-    }
-    /* GES: AVH's hack from awt_util.c:
-     * Motif ignores attempts to move a toplevel window to 0,0.
-     * Instead we set the position to 1,1. The expected value is
-     * returned by Frame.getBounds() since it uses the internally
-     * held rectangle rather than querying the peer.
-     */
-
-    if ((x == 0) && (y == 0)) {
-        XtVaSetValues(wdata->winData.shell, XmNx, 1, XmNy, 1, NULL);
-    }
-    XtVaSetValues(wdata->winData.shell,
-                  XtNx, (XtArgVal) x,
-                  XtNy, (XtArgVal) y,
-                  NULL);
-
-    AWT_FLUSH_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MFileDialogPeer
- * Method:    pDispose
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_pDispose
-  (JNIEnv *env, jobject this)
-{
-    struct FrameData *wdata;
-
-    AWT_LOCK();
-    wdata = (struct FrameData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
-    if (wdata == NULL ||
-        wdata->winData.comp.widget == NULL ||
-        wdata->winData.shell == NULL) {
-        JNU_ThrowNullPointerException(env, "NullPointerException");
-        AWT_UNLOCK();
-        return;
-    }
-    XtUnmanageChild(wdata->winData.shell);
-    awt_util_consumeAllXEvents(wdata->winData.shell);
-    XtDestroyWidget(wdata->winData.shell);
-    free((void *) wdata);
-    JNU_SetLongFieldFromPtr(env,this,mComponentPeerIDs.pData,NULL);
-    awtJNI_DeleteGlobalRef(env, this);
-
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MFileDialogPeer
- * Method:    pShow
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_pShow
-  (JNIEnv *env, jobject this)
-{
-    struct FrameData *wdata;
-    XmString dirMask = NULL;
-
-    AWT_LOCK();
-    wdata = (struct FrameData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
-    if (wdata == NULL ||
-        wdata->winData.comp.widget == NULL ||
-        wdata->winData.shell == NULL) {
-        JNU_ThrowNullPointerException(env, "NullPointerException");
-        AWT_UNLOCK();
-        return;
-    }
-    XtManageChild(wdata->winData.comp.widget);
-
-    AWT_FLUSH_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MFileDialogPeer
- * Method:    pHide
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_pHide
-  (JNIEnv *env, jobject this)
-{
-    struct FrameData *wdata;
-
-    AWT_LOCK();
-    wdata = (struct FrameData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
-    if (wdata == NULL ||
-        wdata->winData.comp.widget == NULL ||
-        wdata->winData.shell == NULL) {
-        JNU_ThrowNullPointerException(env, "NullPointerException");
-        AWT_UNLOCK();
-        return;
-    }
-    if (XtIsManaged(wdata->winData.comp.widget)) {
-        XtUnmanageChild(wdata->winData.comp.widget);
-    }
-
-    AWT_FLUSH_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MFileDialogPeer
- * Method:    setFileEntry
- * Signature: (Ljava/lang/String;Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_setFileEntry
-  (JNIEnv *env, jobject this, jstring dir, jstring file, jobjectArray ffiles)
-{
-    struct ComponentData *cdata;
-    char *cdir;
-    char *cfile;
-    char *cf;
-    struct FrameData *wdata;
-    int32_t length, i;
-    XmString * files = NULL;
-    jstring jf;
-
-    AWT_LOCK();
-    wdata = (struct FrameData *)
-        JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
-    if (wdata == NULL || wdata->winData.comp.widget == NULL) {
-        JNU_ThrowNullPointerException(env, "NullPointerException");
-        return;
-    }
-
-    cdir = (JNU_IsNull(env, dir))
-               ? NULL
-               : (char *) JNU_GetStringPlatformChars(env, dir, NULL);
-
-    cfile = (JNU_IsNull(env, file))
-               ? NULL
-               : (char *) JNU_GetStringPlatformChars(env, file, NULL);
-
-    if (ffiles != NULL) {
-        length = (*env)->GetArrayLength(env, ffiles);
-        files = (XmString*)calloc(length, sizeof(XmString));
-
-        for (i = 0; i < length; i++) {
-            jf = (jstring)(*env)->GetObjectArrayElement(env, ffiles, i);
-            cf = (char *) JNU_GetStringPlatformChars(env, jf, NULL);
-
-            if ((*env)->GetStringLength(env, jf) == 0 && length == 1) {
-              length = 0;
-              files[0] = NULL;
-            }
-            else
-              files[i] = XmStringCreateLocalized(cf);
-
-            if (cf)
-                JNU_ReleaseStringPlatformChars(env, jf, (const char *) cf);
-        }
-
-        setFSBDirAndFile(wdata->winData.comp.widget, (cdir) ? cdir : "",
-                         (cfile) ? cfile : "", files, length);
-        while(i > 0) {
-            XmStringFree(files[--i]);
-        }
-        if (files != NULL) {
-            free(files);
-        }
-    }
-    else
-      setFSBDirAndFile(wdata->winData.comp.widget, (cdir) ? cdir : "",
-                       (cfile) ? cfile : "", NULL, -1);
-
-    if (cdir) {
-        JNU_ReleaseStringPlatformChars(env, dir, (const char *) cdir);
-    }
-
-    if (cfile) {
-        JNU_ReleaseStringPlatformChars(env, file, (const char *) cfile);
-    }
-
-    AWT_FLUSH_UNLOCK();
-}
-
-static void
-changeFont(Widget w, void *fontList)
-{
-    XtVaSetValues(w, XmNfontList, fontList, NULL);
-}
-
-/*
- * Class:     sun_awt_motif_MFileDialogPeer
- * Method:    setFont
- * Signature: (Ljava/awt/Font;)V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_setFont
-  (JNIEnv *env, jobject this, jobject f)
-{
-    struct ComponentData *tdata;
-    struct FontData *fdata;
-    XmFontListEntry fontentry;
-    XmFontList fontlist;
-    char *err;
-
-    if (JNU_IsNull(env, f)) {
-        JNU_ThrowNullPointerException(env, "NullPointerException");
-        return;
-    }
-    AWT_LOCK();
-    fdata = awtJNI_GetFontData(env, f, &err);
-    if (fdata == NULL) {
-        JNU_ThrowInternalError(env, err);
-        AWT_UNLOCK();
-        return;
-    }
-    tdata = (struct ComponentData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
-    if (tdata == NULL || tdata->widget == NULL) {
-        JNU_ThrowNullPointerException(env, "NullPointerException");
-        AWT_UNLOCK();
-        return;
-    }
-    if (awtJNI_IsMultiFont(env, f)) {
-        if (fdata->xfs == NULL) {
-            fdata->xfs = awtJNI_MakeFontSet(env, f);
-        }
-        if (fdata->xfs != NULL) {
-            fontentry = XmFontListEntryCreate("labelFont",
-                                              XmFONT_IS_FONTSET,
-                                              (XtPointer) (fdata->xfs));
-            fontlist = XmFontListAppendEntry(NULL, fontentry);
-            /*
-             * Some versions of motif have a bug in
-             * XmFontListEntryFree() which causes it to free more than it
-             * should.  Use XtFree() instead.  See O'Reilly's
-             * Motif Reference Manual for more information.
-             */
-            XmFontListEntryFree(&fontentry);
-        } else {
-            fontlist = XmFontListCreate(fdata->xfont, "labelFont");
-        }
-    } else {
-        fontlist = XmFontListCreate(fdata->xfont, "labelFont");
-    }
-
-    if (fontlist != NULL) {
-     /* setting the fontlist in the FileSelectionBox is not good enough --
-        you have to set the resource for all the descendants individually */
-        awt_util_mapChildren(tdata->widget, changeFont, 1, (void *)fontlist);
-        XmFontListFree(fontlist);
-    } else {
-        JNU_ThrowNullPointerException(env, "NullPointerException");
-    }
-
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MFileDialogPeer
- * Method:    insertReplaceFileDialogText
- * Signature: (Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_insertReplaceFileDialogText
-  (JNIEnv *env, jobject this, jstring l)
-{
-    struct ComponentData *cdata;
-    char *cl;
-    XmTextPosition start, end;
-    Widget textField;
-    jobject font;
-
-    /*
-     * Replaces the text in the FileDialog's textfield with the passed
-     * string.
-     */
-
-    AWT_LOCK();
-    cdata = (struct ComponentData *)
-      JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData);
-    if (cdata == NULL || cdata->widget == NULL) {
-        JNU_ThrowNullPointerException(env, "NullPointerException");
-        AWT_UNLOCK();
-        return;
-    }
-
-    textField = XmFileSelectionBoxGetChild(cdata->widget, XmDIALOG_TEXT);
-
-    if (textField == NULL)  {
-        JNU_ThrowNullPointerException(env, "Null TextField in FileDialog");
-        AWT_UNLOCK();
-        return;
-    }
-
-    font = awtJNI_GetFont(env, this);
-
-    if (JNU_IsNull(env, l)) {
-        cl = NULL;
-    } else {
-        /*
-         * We use makePlatformCString() to convert unicode to EUC here,
-         * although output only components (Label/Button/Menu..)
-         * is not using make/allocCString() functions anymore.
-         * Because Motif TextFiled widget does not support multi-font
-         * compound string.
-         */
-
-        cl = (char *) JNU_GetStringPlatformChars(env, l, NULL);
-    }
-
-    if (!XmTextGetSelectionPosition(textField, &start, &end)) {
-        start = end = XmTextGetInsertionPosition(textField);
-    }
-    XmTextReplace(textField, start, end, cl);
-
-    if (cl != NULL && cl !="") {
-        JNU_ReleaseStringPlatformChars(env, l, cl);
-    }
-    AWT_FLUSH_UNLOCK();
-}