зеркало из https://github.com/mozilla/pjs.git
304 строки
7.4 KiB
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;
|
|
}
|
|
/*----------------------------------------------------------------------*/
|