Milán Major

netscape-revival

1 branch
Code

sun-java/awt/x/awt_Menu.c

/*
 * @(#)awt_Menu.c	1.15 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 "color.h"
#include "java_awt_Menu.h"
#include "sun_awt_motif_MMenuPeer.h"
#include "java_awt_MenuBar.h"
#include "sun_awt_motif_MMenuBarPeer.h"
#include "java_awt_Font.h"
#include "ustring.h"

static void
awt_createMenu(struct Hsun_awt_motif_MMenuPeer *this, Widget menuParent)
{
    int			argc;
    Arg			args[10];
    XmString		xTitle;
    struct MenuData	*mdata;
    struct FontData	*fdata;
    Pixel		bg;
    Pixel		fg;
    Widget		tearOff;
    Classjava_awt_Menu	*targetPtr;
    struct Hjava_awt_Font* font = NULL; 

    if (unhand(this)->target == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	return;
    }
    targetPtr = unhand((struct Hjava_awt_Menu *)unhand(this)->target);
    mdata = ZALLOC(MenuData);
    SET_PDATA(this, mdata);

    if (mdata == 0) {
	SignalError(0, JAVAPKG "OutOfMemoryError", 0);
	return;
    }
    
    xTitle = makeXmString(targetPtr->label);
    if( xTitle == NULL ) {
        return;
    }

    XtVaGetValues(menuParent, XmNbackground, &bg, NULL);

    argc = 0;
    XtSetArg(args[argc], XmNbackground, bg); argc++;
    if (targetPtr->tearOff != 0) {
	XtSetArg(args[argc], XmNtearOffModel, XmTEAR_OFF_ENABLED); argc++;
    }
    XtSetArg(args[argc], XmNvisual, awt_visual); argc++;
    mdata->itemData.comp.widget = XmCreatePulldownMenu(menuParent,
						       "",
						       args,
						       argc);
    if (targetPtr->tearOff != 0) {
	tearOff = XmGetTearOffControl(mdata->itemData.comp.widget);
	fg = awtImage->ColorMatch(0,0,0);
	XtVaSetValues(tearOff,
		      XmNbackground, bg,
		      XmNforeground, fg,
		      XmNhighlightColor, fg,
		      NULL);
    }

    argc=0;
    XtSetArg(args[argc], XmNsubMenuId, mdata->itemData.comp.widget); argc++;
    XtSetArg(args[argc], XmNlabelString, xTitle); argc++;
    XtSetArg(args[argc], XmNbackground, bg); argc++;
    
    /* 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.
     */
    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++;
    }
    mdata->comp.widget = XmCreateCascadeButton(menuParent, "", args, argc);
    if (targetPtr->isHelpMenu != 0) {
	XtVaSetValues(menuParent,
		      XmNmenuHelpWidget, mdata->comp.widget,
		      NULL);
    }
		      
    XtManageChild(mdata->comp.widget);
    XtSetSensitive(mdata->comp.widget, targetPtr->enabled ? True : False);
}

void
sun_awt_motif_MMenuPeer_createMenu(struct Hsun_awt_motif_MMenuPeer *this,
				   struct Hjava_awt_MenuBar *parent)
{
    struct ComponentData	*mbdata;

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

    mbdata = PEER_PDATA(ComponentData,Hsun_awt_motif_MMenuBarPeer,parent);
    if (mbdata == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }

    awt_createMenu(this, mbdata->widget);

    AWT_UNLOCK();
}

void
sun_awt_motif_MMenuPeer_createSubMenu(struct Hsun_awt_motif_MMenuPeer *this,
				      struct Hjava_awt_Menu *parent)
{
    struct MenuData	*mpdata;

    AWT_LOCK();
    if (parent == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }	
    mpdata = PEER_PDATA(MenuData,Hsun_awt_motif_MMenuPeer,parent);
    if (mpdata == 0) {
	SignalError(0, JAVAPKG "NullPointerException", 0);
	AWT_UNLOCK();
	return;
    }
    awt_createMenu(this, mpdata->itemData.comp.widget);
    AWT_UNLOCK();
}

void
sun_awt_motif_MMenuPeer_dispose(struct Hsun_awt_motif_MMenuPeer *this)
{
    struct MenuData *mdata;

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