Milán Major

netscape-revival

1 branch
Code

sun-java/awt/x/awt_FileDialog.c

/*
 * @(#)awt_FileDialog.c	1.15 95/12/04 Sami Shaio
 *
 * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL purposes and without
 * fee is hereby granted provided that this copyright notice
 * appears in all copies. Please refer to the file "copyright.html"
 * for further important copyright and licensing information.
 *
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 */
#include "awt_p.h"
#include "interpreter.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 "sun_awt_motif_MFileDialogPeer.h"
#include "sun_awt_motif_MComponentPeer.h"

static void
FileDialog_OK(
    Widget w,
    void *client_data,
    XmFileSelectionBoxCallbackStruct *call_data
)
{
    struct Hsun_awt_motif_MFileDialogPeer *this = (struct Hsun_awt_motif_MFileDialogPeer *)client_data;
    struct FrameData	*fdata = PDATA(FrameData,this);
    char		*file;

    XmStringGetLtoR(call_data->value, XmSTRING_DEFAULT_CHARSET,  &file);
    JAVA_UPCALL((EE(), client_data,"handleSelected",
		 "(Ljava/lang/String;)V", makeJavaString(file, strlen(file))));
    XtUnmanageChild(fdata->winData.comp.widget);
}

static void
FileDialog_CANCEL(
    Widget w,
    void *client_data,
    XmFileSelectionBoxCallbackStruct *call_data
)
{
    struct Hsun_awt_motif_MFileDialogPeer *this = (struct Hsun_awt_motif_MFileDialogPeer *)client_data;
    struct FrameData	*fdata = PDATA(FrameData,this);

    JAVA_UPCALL((EE(), client_data,"handleCancel","()V"));
    XtUnmanageChild(fdata->winData.comp.widget);
}


static void
FileDialog_quit(Widget w,
	   XtPointer client_data,
	   XtPointer call_data)
{
    JAVA_UPCALL((EE(), (void *)client_data,"handleQuit","()V"));
}
	   
static void
setDeleteCallback(struct Hsun_awt_motif_MFileDialogPeer *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);
}


static void
changeBackground(Widget w, void *bg)
{
    XmChangeColor(w, (Pixel)bg);
}

void
sun_awt_motif_MFileDialogPeer_create(struct Hsun_awt_motif_MFileDialogPeer *this,
				     struct Hsun_awt_motif_MComponentPeer *parent)
{
    struct FrameData		*fdata;
    struct CanvasData		*wdata;
    int				argc;
    Arg				args[10];
    Widget			child;
    XmString			xim;
    Pixel			bg;
    Classjava_awt_FileDialog	*targetPtr;

    if (parent == 0 || unhand(this)->target == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	return;
    }

    AWT_LOCK();

    wdata = PDATA(CanvasData,parent);
    fdata = ZALLOC(FrameData);
    SET_PDATA(this, fdata);

    if (fdata == 0) {
	SignalError(0, JAVAPKG "OutOfMemoryError", 0);
	AWT_UNLOCK();
	return;
    }

    XtVaGetValues(wdata->comp.widget, XmNbackground, &bg, NULL);

    argc=0;
    XtSetArg(args[argc], XmNmustMatch, False); argc++;
    XtSetArg(args[argc], XmNautoUnmanage, False); argc++;
    XtSetArg(args[argc], XmNbackground, bg); argc++;
    XtSetArg(args[argc], XmNvisual, awt_visual); argc++;
    XtSetArg(args[argc], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL);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);
    if (child != 0) {
	XtUnmanageChild(child);
    }
    targetPtr = unhand((struct Hjava_awt_FileDialog *)unhand(this)->target);
    child = XmFileSelectionBoxGetChild(fdata->winData.comp.widget,XmDIALOG_DEFAULT_BUTTON);
    if (child != 0) {
	XmString	xim;

	switch (targetPtr->mode) {
	  case java_awt_FileDialog_LOAD:
	    xim = XmStringCreateLtoR("Open", "labelFont");
	    XtVaSetValues(child, XmNlabelString, xim, NULL);
	    XmStringFree(xim);
	    break;
	  case java_awt_FileDialog_SAVE:
	    xim = XmStringCreateLtoR("Save", "labelFont");
	    XtVaSetValues(child, XmNlabelString, xim, NULL);
	    XmStringFree(xim);
	    break;
	  default:
	    break;
	}
    }
    child = XmFileSelectionBoxGetChild(fdata->winData.comp.widget,
				       XmDIALOG_TEXT);
    if (child != 0 && targetPtr->file != 0) {
	XtVaSetValues(child, XmNvalue, makeCString(targetPtr->file), NULL);
    }
    XtAddCallback(fdata->winData.comp.widget,
		  XmNokCallback,
		  (XtCallbackProc)FileDialog_OK,
		  (XtPointer)this);
    XtAddCallback(fdata->winData.comp.widget,
		  XmNcancelCallback,
		  (XtCallbackProc)FileDialog_CANCEL,
		  (XtPointer)this);
    setDeleteCallback(this, fdata);
    xim=XmStringCreateLtoR("./*", XmSTRING_DEFAULT_CHARSET);
    XtVaSetValues(fdata->winData.comp.widget, XmNdirMask, xim,  NULL);
    /*XmFileSelectionDoSearch(fdata->winData.comp.widget, xim);*/
    XmStringFree(xim);
    AWT_UNLOCK();
}

static int
WaitForUnmap(void *data)
{
    return (XtWindow((Widget)data) && !XtIsManaged((Widget)data));
}


void
sun_awt_motif_MFileDialogPeer_pShow(struct Hsun_awt_motif_MFileDialogPeer *this)
{
    struct FrameData	*wdata;
    XmString		dirMask = NULL;

    AWT_LOCK();
    wdata = PDATA(FrameData,this);
    if (wdata == 0 ||
	wdata->winData.comp.widget==0 ||
	wdata->winData.shell==0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    XtVaGetValues(wdata->winData.comp.widget, XmNdirMask, &dirMask, NULL);
    if (dirMask != NULL) {
	XmFileSelectionDoSearch(wdata->winData.comp.widget, dirMask);
    }
    XtManageChild(wdata->winData.comp.widget);
    AWT_FLUSH_UNLOCK();

    awt_MToolkit_modalWait(WaitForUnmap, wdata->winData.comp.widget);
}


void
sun_awt_motif_MFileDialogPeer_pHide(struct Hsun_awt_motif_MFileDialogPeer *this)
{
    struct FrameData	*wdata;

    AWT_LOCK();
    wdata = PDATA(FrameData,this);
    if (wdata == 0 ||
	wdata->winData.comp.widget==0 ||
	wdata->winData.shell==0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    if (XtIsManaged(wdata->winData.comp.widget)) {
	XtUnmanageChild(wdata->winData.comp.widget);
    }
    AWT_FLUSH_UNLOCK();
}

void
sun_awt_motif_MFileDialogPeer_setFileEntry(struct Hsun_awt_motif_MFileDialogPeer *this,
					   struct Hjava_lang_String *dir,
					   struct Hjava_lang_String *file)
{
    struct ComponentData *cdata;
    XmString	xim;
    char	*cdir;
    char	*separator;
    char	path[MAXPATHLEN];
    int		dirLen;

    AWT_LOCK();
    if ((cdata = PDATA(ComponentData,this)) == 0 || dir == 0) {
	AWT_UNLOCK();
	SignalError(0, JAVAPKG "NullPointerException", 0);
	return;
    }
    cdir = makeCString(dir);
    dirLen = strlen(cdir);

    jio_snprintf(path, sizeof(path), "%s/*", cdir);
    xim=XmStringCreateLtoR(path,XmSTRING_DEFAULT_CHARSET);
    XtVaSetValues(cdata->widget, XmNdirMask, xim,  NULL);
    XmFileSelectionDoSearch(cdata->widget, xim);
    XmStringFree(xim);

    if (cdir[dirLen] != '/') {
	separator = "/";
    } else {
	separator = "";
    }
    jio_snprintf(path, sizeof(path), "%s%s%s",
		 cdir, separator, makeCString(file));

    xim=XmStringCreateLtoR(path,XmSTRING_DEFAULT_CHARSET);
    XtVaSetValues(cdata->widget, XmNdirSpec, xim,  NULL);
    XmStringFree(xim);

    AWT_FLUSH_UNLOCK();
}

void
sun_awt_motif_MFileDialogPeer_pReshape(struct Hsun_awt_motif_MFileDialogPeer *this,
				       long x, long y,
				       long w, long h)
{
    struct FrameData		*wdata;

    AWT_LOCK();
    wdata = PDATA(FrameData,this);
    if (wdata == 0 || wdata->winData.shell==0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }

    XtVaSetValues(wdata->winData.shell,
		  XtNx, (XtArgVal) x,
		  XtNy, (XtArgVal) y,
		  NULL);

    AWT_FLUSH_UNLOCK();
}