pjs/cmd/xfe/XfeWidgets/XfeTest/TestMenu.c

304 строки
7.4 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*----------------------------------------------------------------------*/
/* */
/* Name: <XfeTest/TestMenu.c> */
/* Description: Xfe widget menu test funcs. */
/* Author: Ramiro Estrugo <ramiro@netscape.com> */
/* */
/*----------------------------------------------------------------------*/
#include <Xfe/XfeTest.h>
static WidgetClass type_to_class (XfeMenuItemType item_type);
static String type_to_action_cb_name (XfeMenuItemType item_type);
/*----------------------------------------------------------------------*/
/* extern */ Widget
XfeMenuItemCreate(Widget pw,XfeMenuItem data,XtPointer client_data)
{
Widget item = NULL;
WidgetClass wc = NULL;
assert( XfeIsAlive(pw) );
assert( XmIsRowColumn(pw) );
assert( data != NULL );
assert( data->name != NULL );
wc = type_to_class(data->type);
assert( wc != NULL );
if (client_data)
{
data->client_data = client_data;
}
if (data->type == XfeMENU_PANE)
{
XfeMenuPaneRec pane_data;
pane_data.name = data->name;
pane_data.items = data->pane_items;
item = XfeMenuPaneCreate(pw,&pane_data,client_data);
}
else
{
item = XtVaCreateManagedWidget(data->name,wc,pw,NULL);
if (data->type == XfeMENU_SEP)
{
XtVaSetValues(item,XmNshadowThickness,3,NULL);
}
else if (data->type == XfeMENU_RADIO)
{
XtVaSetValues(item,XmNindicatorType,XmONE_OF_MANY,NULL);
XtVaSetValues(pw,XmNradioBehavior,True,NULL);
}
else if (data->type == XfeMENU_TOGGLE)
{
XtVaSetValues(item,XmNindicatorType,XmN_OF_MANY,NULL);
XtVaSetValues(pw,XmNradioBehavior,False,NULL);
}
if (data->action_cb)
{
String cb_name = type_to_action_cb_name(data->type);
XtAddCallback(item,cb_name,data->action_cb,data->client_data);
}
}
return item;
}
/*----------------------------------------------------------------------*/
/* extern */ Widget
XfeMenuItemCreate2(Widget pw,
String name,
XfeMenuItemType type,
XtCallbackProc action_cb,
XfeMenuItemRec * pane_items,
XtPointer client_data)
{
XfeMenuItemRec menu_item;
assert( XfeIsAlive(pw) );
assert( XmIsRowColumn(pw) );
assert( name != NULL );
menu_item.name = name;
menu_item.type = type;
menu_item.action_cb = action_cb;
menu_item.pane_items = pane_items;
menu_item.client_data = client_data;
return XfeMenuItemCreate(pw,&menu_item,client_data);
}
/*----------------------------------------------------------------------*/
/* extern */ Widget
XfeMenuPaneCreate(Widget pw,XfeMenuPane data,XtPointer client_data)
{
Widget pane = NULL;
Widget cascade;
char buf[1024];
assert( XfeIsAlive(pw) );
assert( XmIsRowColumn(pw) );
assert( data != NULL );
sprintf(buf,"%s_pulldown",data->name);
pane = XmCreatePulldownMenu(pw,buf,NULL,0);
XtVaSetValues(pane,XmNtearOffModel,XmTEAR_OFF_ENABLED,NULL);
cascade = XtVaCreateManagedWidget(data->name,
xmCascadeButtonWidgetClass,
pw,
XmNsubMenuId, pane,
NULL);
if (data->items)
{
XfeMenuItem item = data->items;
while(item && item->name)
{
XfeMenuItemCreate(pane,item,client_data);
item++;
}
}
if ((strcmp(data->name,"help") == 0) ||
(strcmp(data->name,"Help") == 0))
{
XtVaSetValues(pw,XmNmenuHelpWidget,cascade,NULL);
}
return cascade;
}
/*----------------------------------------------------------------------*/
extern Widget
XfeMenuPaneCreate2(Widget pw,
String name,
XfeMenuItemRec * items,
XtPointer client_data)
{
XfeMenuPaneRec menu_pane[2];
assert( XfeIsAlive(pw) );
assert( XmIsRowColumn(pw) );
assert( name != NULL );
menu_pane[0].name = name;
menu_pane[0].items = items;
menu_pane[1].name = NULL;
menu_pane[1].items = NULL;
return XfeMenuPaneCreate(pw,menu_pane,client_data);
}
/*----------------------------------------------------------------------*/
/* extern */ Widget
XfeMenuBarCreate(Widget pw,
String name,
XfeMenuPaneRec * items,
XtPointer client_data,
ArgList av,
Cardinal ac)
{
Widget menu_bar = NULL;
assert( XfeIsAlive(pw) );
assert( name != NULL );
menu_bar = XmCreateMenuBar(pw,name,av,ac);
if (items)
{
XfeMenuPane pane = items;
while(pane && pane->name)
{
XfeMenuPaneCreate(menu_bar,pane,client_data);
pane++;
}
}
XtManageChild(menu_bar);
return menu_bar;
}
/*----------------------------------------------------------------------*/
/* extern */ Widget
XfePopupMenuCreate(Widget pw,
String name,
XfeMenuItemRec * items,
XtPointer client_data,
ArgList av,
Cardinal ac)
{
Widget popup_menu = NULL;
assert( XfeIsAlive(pw) );
assert( name != NULL );
popup_menu = XmCreatePopupMenu(pw,name,av,ac);
if (items)
{
XfeMenuItem item = items;
while(item && item->name)
{
XfeMenuItemCreate(popup_menu,item,client_data);
item++;
}
}
return popup_menu;
}
/*----------------------------------------------------------------------*/
/* extern */ String
XfeNameIndex(String prefix,Cardinal i)
{
static char buf[4096];
sprintf(buf,"%s%d",prefix,i);
return buf;
}
/*----------------------------------------------------------------------*/
/* extern */ String
XfeNameString(String prefix,String name)
{
static char buf[4096];
sprintf(buf,"%s%s",prefix,name);
return buf;
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
static WidgetClass
type_to_class(XfeMenuItemType item_type)
{
WidgetClass wc = NULL;
switch(item_type)
{
case XfeMENU_BM_PANE: wc = xfeBmCascadeWidgetClass; break;
case XfeMENU_BM_PUSH: wc = xfeBmButtonWidgetClass; break;
case XfeMENU_PANE: wc = xmCascadeButtonWidgetClass; break;
case XfeMENU_LABEL: wc = xmLabelWidgetClass; break;
case XfeMENU_PUSH: wc = xmPushButtonWidgetClass; break;
case XfeMENU_SEP: wc = xmSeparatorWidgetClass; break;
case XfeMENU_TOGGLE: wc = xmToggleButtonWidgetClass; break;
case XfeMENU_RADIO: wc = xmToggleButtonWidgetClass; break;
}
return wc;
}
/*----------------------------------------------------------------------*/
static String
type_to_action_cb_name(XfeMenuItemType item_type)
{
String name = NULL;
switch(item_type)
{
case XfeMENU_BM_PANE: name = XmNactivateCallback; break;
case XfeMENU_BM_PUSH: name = XmNactivateCallback; break;
case XfeMENU_PANE: name = XmNactivateCallback; break;
case XfeMENU_LABEL: name = NULL; break;
case XfeMENU_PUSH: name = XmNactivateCallback; break;
case XfeMENU_RADIO: name = XmNvalueChangedCallback; break;
case XfeMENU_SEP: name = NULL; break;
case XfeMENU_TOGGLE: name = XmNvalueChangedCallback; break;
}
return name;
}
/*----------------------------------------------------------------------*/