Milán Major

netscape-revival

1 branch
Code

sun-java/awt/x/awt_MenuItem.c

/*
 * @(#)awt_MenuItem.c	1.17 95/12/08 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 <Xm/Separator.h>
#include "java_awt_MenuItem.h"
#include "java_awt_Font.h"
#include "sun_awt_motif_MMenuItemPeer.h"
#include "sun_awt_motif_MCheckboxMenuItemPeer.h"
#include "java_awt_Menu.h"
#include "sun_awt_motif_MMenuPeer.h"
#include "ustring.h"

static void
MenuItem_selected(Widget w, XtPointer client_data, XmAnyCallbackStruct *s)
{
    extern int getModifiers(int state);
    int modifiers = getModifiers(s->event->xbutton.state);
    int64_t when = int2ll(s->event->xbutton.time);
    struct Hsun_awt_motif_MMenuPeer* this = (struct Hsun_awt_motif_MMenuPeer *)client_data;

    if (unhand(this)->isCheckbox) {
	Boolean state;
	struct MenuItemData *mdata;
	if ((mdata = PDATA(MenuItemData,this)) != NULL) {
	    XtVaGetValues(mdata->comp.widget, XmNset, &state, NULL);
	    JAVA_UPCALL((EE(), (void *)this, "action", "(JIZ)V", when, modifiers, state));
	}
    } else {
	JAVA_UPCALL((EE(), (void *)this, "action", "(JI)V", when, modifiers));
    }
}

static Boolean
MenuItem_isSeperator( Hjava_lang_String* javaStringHandle )
{
   if( javaStringHandle == NULL )
   {
      return FALSE;
   }
   else if( javaStringLength( javaStringHandle ) != 1 )
   {
      return FALSE;
   }
   else
   {
      unicode* uniChars;
      Classjava_lang_String* javaStringClass = unhand( javaStringHandle );
      HArrayOfChar* unicodeArrayHandle = (HArrayOfChar *)javaStringClass->value;
      uniChars =  unhand(unicodeArrayHandle)->body + javaStringClass->offset;
      if( uniChars[0] == '-' )
         return TRUE;
      else
         return FALSE;
   }   
}

void
sun_awt_motif_MMenuItemPeer_create(struct Hsun_awt_motif_MMenuItemPeer *this,
				   struct Hjava_awt_Menu *parent)
{
    int				argc;
    Arg				args[10];
    XmString			xLabel;
    struct MenuData		*menuData;
    struct MenuItemData 	*mdata;
    struct FontData		*fdata;
    Pixel			bg;
    Classjava_awt_MenuItem	*targetPtr;

    if (parent == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	return;
    }

    AWT_LOCK();
    targetPtr = unhand(unhand(this)->target);
    menuData = PEER_PDATA(MenuData,Hsun_awt_motif_MMenuPeer,parent);
    
    xLabel = makeXmString(targetPtr->label);
    if( xLabel == NULL ) {
        AWT_UNLOCK();
        return;
    }

    mdata = ZALLOC(MenuItemData);
    SET_PDATA(this, mdata);

    argc = 0;
    XtSetArg(args[argc], XmNbackground, &bg); argc++;
    XtGetValues(menuData->itemData.comp.widget, args, argc);

    argc = 0;
    XtSetArg(args[argc], XmNbackground, bg); argc++;
    if (MenuItem_isSeperator(targetPtr->label)) {
	mdata->comp.widget =  XmCreateSeparator(menuData->itemData.comp.widget,
						"", args, argc);
    } else {
       /* It is not sufficient to get the target's font from the target's font data
        * field.  MenuComponent.getFont() will return the the parent's font if
        * the target's own font is nil.
        */
        struct Hjava_awt_Font* font = NULL; 
        JAVA_UPCALL_WITH_RETURN( (EE(), (void*)unhand(this)->target,
                                  "getFont", "()Ljava/awt/Font;"),
                                 font, (struct Hjava_awt_Font*) );
	if (font != 0 && (fdata = awt_GetFontData(font, 0)) != 0) {
	    XtSetArg(args[argc], XmNfontList, fdata->xmfontlist); argc++;
	}
        
	XtSetArg(args[argc], XmNlabelString, xLabel);  argc++;

	if (unhand(this)->isCheckbox != 0) {
	    XtSetArg(args[argc], XmNset, False); argc++;
	    XtSetArg(args[argc], XmNvisibleWhenOff, True); argc++;
	    mdata->comp.widget = XmCreateToggleButton(menuData->itemData.comp.widget,
						      "", 
						      args,
						      argc);
	} else {
	    mdata->comp.widget = XmCreatePushButton(menuData->itemData.comp.widget,
						    "",
						    args,
						    argc);
	}
	XtAddCallback(mdata->comp.widget,
		      ((unhand(this)->isCheckbox != 0) ?
		       XmNvalueChangedCallback : XmNactivateCallback),
		      (XtCallbackProc)MenuItem_selected,
		      (XtPointer)this);
	XtSetSensitive(mdata->comp.widget, targetPtr->enabled ? True : False);
    }
    XtManageChild(mdata->comp.widget);
    AWT_UNLOCK();
}

void
sun_awt_motif_MMenuItemPeer_enable(struct Hsun_awt_motif_MMenuItemPeer *this)
{
    struct MenuItemData *mdata;

    AWT_LOCK();
    if ((mdata = PDATA(MenuItemData,this)) == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    XtSetSensitive(mdata->comp.widget, True);
    AWT_UNLOCK();
}

void
sun_awt_motif_MMenuItemPeer_disable(struct Hsun_awt_motif_MMenuItemPeer *this)
{
    struct MenuItemData *mdata;

    AWT_LOCK();
    if ((mdata = PDATA(MenuItemData,this)) == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    XtSetSensitive(mdata->comp.widget, False);
    AWT_UNLOCK();
}

void
sun_awt_motif_MMenuItemPeer_dispose(struct Hsun_awt_motif_MMenuItemPeer *this)
{
    struct MenuItemData *mdata;

    AWT_LOCK();
    if ((mdata = PDATA(MenuItemData,this)) != 0) {
	XtUnmanageChild(mdata->comp.widget);
	XtDestroyWidget(mdata->comp.widget);
	sysFree((void *)mdata);
	SET_PDATA(this, 0);
    }
    AWT_UNLOCK();
}

void
sun_awt_motif_MMenuItemPeer_setLabel(struct Hsun_awt_motif_MMenuItemPeer *this,
				     struct Hjava_lang_String *label)
{
    struct ComponentData	*wdata;
    XmString			xLabel;

    AWT_LOCK();
    wdata = PDATA(ComponentData, this);
    if (wdata == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }

    xLabel = makeXmString(label);
    if( xLabel == NULL ) {
        AWT_UNLOCK();
        return;
    }

    XtVaSetValues(wdata->widget, XmNlabelString, xLabel, NULL);
    XmStringFree(xLabel);
    
    AWT_UNLOCK();
}


void
sun_awt_motif_MCheckboxMenuItemPeer_setState(struct Hsun_awt_motif_MCheckboxMenuItemPeer *this,
					 long state)
{
    struct MenuItemData *mdata;

    AWT_LOCK();
    if ((mdata = PDATA(MenuItemData,this)) == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    XtVaSetValues(mdata->comp.widget, XmNset, (Boolean)state, NULL);
    AWT_UNLOCK();
}

long
sun_awt_motif_MCheckboxMenuItemPeer_getState(struct Hsun_awt_motif_MCheckboxMenuItemPeer *this)
{
    struct MenuItemData *mdata;
    Boolean		state;

    AWT_LOCK();
    if ((mdata = PDATA(MenuItemData,this)) == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return 0;
    }
    XtVaGetValues(mdata->comp.widget, XmNset, &state, NULL);
    AWT_UNLOCK();

    return (long)state;
}