pjs/cmd/xfe/src/Menu.h

174 строки
5.3 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.
*/
/*
Menu.h -- class definition for menu bars.
Created: Chris Toshok <toshok@netscape.com>, 7-Aug-96.
*/
#ifndef _xfe_menu_h
#define _xfe_menu_h
#include "Component.h"
#include "Command.h"
#include "Chrome.h"
class XFE_View;
class XFE_Frame;
typedef void (*dynamenuCreateProc)(Widget, void *, XFE_Frame *);
typedef struct MenuSpec {
/* these are generally initialized in a menu spec. */
char *menuItemName;
EChromeTag tag;
struct MenuSpec *submenu;
char *radioGroupName;
Boolean toggleSet;
void *callData; /* sent in the callData portion of the *Command functions. */
dynamenuCreateProc generateProc;
/* Paramaterization stuff */
char* cmd_name;
char* cmd_args[8];
Boolean do_not_manage; /* set to true if we don't manage this item */
// methods
char* getCmdName() {
return (cmd_name != NULL)? cmd_name: menuItemName;
}
} MenuSpec;
/* nice shortcuts */
#define MENU_SEPARATOR { "--", SEPARATOR }
#define MENU_END { NULL }
#define MENU_TOGGLE(w) \
{ (w), TOGGLEBUTTON }
#define MENU_TOGGLE_1ARG(w,c,a) \
{ (w), TOGGLEBUTTON, 0, 0, 0, 0, 0, (c), { (a) } }
#define MENU_PUSHBUTTON(w) \
{ (w), PUSHBUTTON }
#define MENU_PUSHBUTTON_NAMED(w, c) \
{ (w), PUSHBUTTON, 0, 0, 0, 0, 0, (c) }
#define MENU_PUSHBUTTON_1ARG(w,c,a) \
{ (w), PUSHBUTTON, 0, 0, 0, 0, 0, (c), { (a) } }
#define MENU_MENU(w, s) \
{ (w), CASCADEBUTTON, (MenuSpec*)(s) }
#define xfeMenuFile "fileMenu"
#define xfeMenuEdit "editMenu"
#define xfeMenuView "viewMenu"
#define xfeMenuInsert "insertMenu"
#define xfeMenuFormat "formatMenu"
#define xfeMenuTable "tableMenu"
#define xfeMenuTools "toolsMenu"
#define xfeMenuGo "goMenu"
#define xfeMenuItem "itemMenu"
#define xfeMenuMessage "messageMenu"
#define xfeMenuBookmark "bookmarkMenu"
#if defined(MOZ_MAIL_NEWS) && defined(EDITOR) && defined(MOZ_TASKBAR)
#define xfeMenuWindow "windowMenu"
#else
#define xfeMenuWindow "windowMenuLite"
#endif
#define xfeMenuHelp "helpMenu"
// this next one is going away soon... don't use it. Use windowMenu
#define xfeMenuNavigate "navigateMenu"
class XFE_Menu : public XFE_Component
{
public:
XFE_Menu(XFE_Frame *parent_frame, MenuSpec *menu_spec, Widget baseMenuWidget, XFE_Component *cmdDispatcher = NULL);
virtual ~XFE_Menu();
XFE_Frame *getFrame();
void setMenuSpec(MenuSpec *menu_spec);
void setCommandDispatcher(XFE_Component *dispatcher);
// interface for view's adding and subtracting menu items
Widget addMenuItem(char *itemName, EChromeTag tag,
MenuSpec *submenuSpec = NULL, char *radioGroupName = NULL,
Boolean toggleSet = False, void *callData = NULL, dynamenuCreateProc generateProc = NULL,
int position = XmLAST_POSITION);
void removeMenuItem(char *itemName, EChromeTag tag);
void hideMenuItem(char *itemName, EChromeTag tag);
void showMenuItem(char *itemName, EChromeTag tag);
Widget findMenuItem(char *itemName, EChromeTag tag);
void addMenuSpec(MenuSpec *menu_spec);
void update();
void updateSubMenu(Widget submenu);
void updateMenuItem(Widget menuItem);
void updateCommand(CommandType command);
void updateCommandInSubMenu(CommandType command, Widget submenu);
void updateCommandInMenuItem(CommandType command, Widget menuItem);
// update all the commands in the menu.
XFE_CALLBACK_DECL(update)
// update a specific command in the menu.
XFE_CALLBACK_DECL(updateCommand)
protected:
void createWidgets();
void createWidgets(MenuSpec *spec);
Widget findMenuItemInMenu(char *itemName, EChromeTag tag, Widget menu);
private:
XFE_Frame *m_parentFrame;
XFE_Component *m_cmdDispatcher;
MenuSpec *m_spec;
Widget createPulldown(char *cascadeName, MenuSpec *spec, Widget parent_menu, XP_Bool is_fancy);
Widget createMenuItem(MenuSpec *spec, Widget parent_cascade, Widget parent);
#ifdef DELAYED_MENU_CREATION
void delayedCreatePulldown(Widget cascade, Widget pulldown, MenuSpec *spec);
static void delayed_create_pulldown(Widget, XtPointer, XtPointer);
#endif
void updateToggleGroup(Widget w);
static void pushb_arm_cb(Widget, XtPointer, XtPointer);
static void pushb_activate_cb(Widget, XtPointer, XtPointer);
static void pushb_disarm_cb(Widget, XtPointer, XtPointer);
static void toggleb_arm_cb(Widget, XtPointer, XtPointer);
static void toggleb_activate_cb(Widget, XtPointer, XtPointer);
static void toggleb_disarm_cb(Widget, XtPointer, XtPointer);
static void radiob_arm_cb(Widget, XtPointer, XtPointer);
static void radiob_activate_cb(Widget, XtPointer, XtPointer);
static void radiob_disarm_cb(Widget, XtPointer, XtPointer);
static void cascade_update_cb(Widget, XtPointer, XtPointer);
};
#endif /* _xfe_menu_h */