/******************************************************************** This file is part of the abs 0.907 distribution. abs is a spreadsheet with graphical user interface. Copyright (C) 1998-2001 André Bertin (Andre.Bertin@ping.be) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version if in the same spirit as version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Concact: abs@pi.be http://home.pi.be/bertin/abs.shtml *********************************************************************/ #include "menubar.h" #include "separator.h" #include "memory.h" #include "file_selector.h" #include "separator.h" #include "main.h" #include "application.h" #include "workbook.h" #include "worksheet.h" #include "info_dialog.h" #include "printdialog.h" #include "formula.h" #include "celldialog.h" #include "plotdialog.h" #include "mainwin.h" #include "inputbox.h" #include "cb.h" #include "project.h" #include "macrodialog.h" #include "pastedialog.h" #include "button.h" #include "callback.h" #include "callback_app.h" static char menuTranslations[] = ": highlight() \n\ : reset() \n\ : reset() PopupMenu() "; static char menupopupTranslations[] = ": highlight() \n\ : unhighlight() \n\ : highlight() \n\ : MenuPopdown() notify() unhighlight()"; #define BtnEle 1 #define EntryEle 2 #define SeparatorEle 3 static Menu_ele filepopup[] = { {"New", EntryEle, NULL, m_newfile}, {"0pen...", EntryEle, NULL, X11m_openfile}, {"Close", EntryEle, NULL, m_closefile}, {"Separ1", SeparatorEle, NULL, m_close}, {"Save", EntryEle, NULL, X11m_savefile}, {"Save As...", EntryEle, NULL, X11m_saveasfile}, {"Separ2", SeparatorEle, NULL, m_close}, {"Print", EntryEle, NULL, X11m_print}, {"Separ3", SeparatorEle, NULL, m_close}, {"Exit", EntryEle, NULL, m_exit}, {NULL, 0, NULL, NULL}, }; static Menu_ele editpopup[] = { {"Cut", EntryEle, NULL, m_cut}, {"Copy", EntryEle, NULL, m_copy}, {"Paste", EntryEle, NULL, m_paste}, {"Paste Special...", EntryEle, NULL, X11m_paste_special}, {"Separ4", SeparatorEle, NULL, m_close}, {"Copy Down", EntryEle, NULL, m_copyd}, {"Copy Right", EntryEle, NULL, m_copyr}, {"Separ5", SeparatorEle, NULL, m_close}, {"Delete line", EntryEle, NULL, m_delline}, {"Delete column", EntryEle, NULL, m_delcolumn}, {"Delete sheet", EntryEle, NULL, m_delsheet}, {NULL, 0, NULL, NULL}, }; static Menu_ele insertpopup[] = { {"Line", EntryEle, NULL, m_insertline}, {"Column", EntryEle, NULL, m_insertcolumn}, {"Chart", EntryEle, NULL, m_createplot}, {"Sheet", EntryEle, NULL, m_addsheet}, {"Separ7", SeparatorEle, NULL, m_close}, {"Function...", EntryEle, NULL, X11m_formula}, {NULL, 0, NULL, NULL}, }; static Menu_ele formatpopup[] = { {"Cell...", EntryEle, NULL, X11m_formatnumber}, {"Adjust Line", EntryEle, NULL, formatline}, {"Adjust Column", EntryEle, NULL, formatcolumn}, {"Adjust Sheet", EntryEle, NULL, m_fit}, {"Sheet name...", EntryEle, NULL, X11m_sheetname}, {NULL, 0, NULL, NULL}, }; static Menu_ele drawpopup[] = { {"Line", EntryEle, NULL, m_plotline}, {"Rectangle", EntryEle, NULL, m_plotrect}, {"Arc", EntryEle, NULL, m_plotarc}, {"Ellipse", EntryEle, NULL, m_plotcircle}, {"Button", EntryEle, NULL, m_plotbutton}, {"->Edit On", EntryEle, NULL, m_editdraw}, {"->Edit Off", EntryEle, NULL, m_exitdraw}, {NULL, 0, NULL, NULL}, }; static Menu_ele chartpopup[] = { {"Create", EntryEle, NULL, m_createplot}, {"Option...", EntryEle, NULL, X11m_plotoption}, {"Redraw", EntryEle, NULL, cb_redrawgra}, {NULL, 0, NULL, NULL}, }; static Menu_ele toolpopup[] = { {"Insert Data File...", EntryEle, NULL, X11m_insertfile}, {"Export Data File...", EntryEle, NULL, X11m_exportfile}, {"Separ8", SeparatorEle, NULL, m_close}, {"Audit Cell", EntryEle, NULL, m_auditcell}, {"Separ9", SeparatorEle, NULL, m_close}, {"Rec Macro", EntryEle, NULL, X11m_macrorec}, {"Stop Recording", EntryEle, NULL, X11m_macrostop}, {"Play Macro...", EntryEle, NULL, X11m_macroplay}, {"Separ10", SeparatorEle, NULL, m_close}, {"ABVisual...", EntryEle, NULL, X11m_macro}, {NULL, 0, NULL, NULL}, }; static Menu_ele viewpopup[] = { {"Buttonbar", EntryEle, NULL, buttonbar_onoff}, {"Formatbar", EntryEle, NULL, formatbar_onoff}, {NULL, 0, NULL, NULL}, }; static Menu_ele windowpopup[] = { {NULL, 0, NULL, NULL}, }; static Menu_ele helppopup[] = { {"About...", EntryEle, NULL, m_about}, {"On line...", EntryEle, NULL, m_online}, {NULL, 0, NULL, NULL}, }; static Menu_ele rootmenu[] = { {"File", BtnEle, filepopup, nocb}, {"Edit", BtnEle, editpopup, nocb}, {"Insert", BtnEle, insertpopup, nocb}, {"Format", BtnEle, formatpopup, nocb}, {"Draw", BtnEle, drawpopup, nocb}, {"Chart", BtnEle, chartpopup, nocb}, {"Tools", BtnEle, toolpopup, nocb}, {"View", BtnEle, viewpopup, nocb}, {"Windows", BtnEle, windowpopup, nocb}, {"?", BtnEle, helppopup, nocb}, {NULL, 0, NULL, NULL}, }; void nocb () { } void X11m_openfile () { MakePrompt (gettop (), "open file:", m_openfile, "defaut.abs"); } void X11m_savefile () { savefile (); } void X11m_saveasfile () { MakePrompt (gettop (), "save file:", m_saveasfile, "defaut.abs"); } void X11m_insertfile () { X11m_separator (INSERTFILE); } void X11m_exportfile () { X11m_separator (EXPORTFILE); } void X11m_paste_special () { PasteMakePrompt (gettop (), "Paste", NULL, NULL); } void X11m_macro () { if (ActiveWorkbook == NULL) return; editmacro (ActiveWorkbook->project, 0); } void X11m_macroplay () { MacroMakePrompt (gettop (), "Macro", playmacro, "defaut.abs"); } void X11m_macrorec () { char *name; if (ActiveWorkbook == NULL) return; name = inputbox ("Macro name:", "macro name", NULL); if (name != NULL) { if (strlen (name) > 0) { recordmacro (ActiveWorkbook->project, name); } else { Inform ("Bad macro name!", NULL); } } else { Inform ("Bad macro name!", NULL); } } void X11m_macrostop () { stoprecordmacro (); } void X11m_sheetname () { char *value; int i; if (ActiveWorkbook == NULL) return; if (ActiveWorksheet == NULL) return; value = inputbox ("New worksheet name:", "worksheet name", ActiveWorksheet->Name); if (value != NULL) if (strlen (value) > 0) { for (i = 0; i < ActiveWorkbook->nbworksheet; i++) { if (strcasecmp (ActiveWorkbook->Worksheets[i]->Name, value) == 0) { Inform ("Worksheet name allready in use!", NULL); return; } } worksheet_setname (ActiveWorksheet, value); } } void X11m_formatborder () { } void m_print (char *filename) { } void m_close () { } Widget make_bar_button (Widget menu_bar, char *name) { Arg args[20]; register int n; n = 0; XtSetArg (args[n], XtNborderWidth, 0); n++; XtSetArg (args[n], XtNhighlightThickness, 1); n++; return XtCreateManagedWidget (name, menuButtonWidgetClass, menu_bar, args, n); } Widget make_popup (Widget bar_button, char *name, char *button_name, struct menuEntry * menuentry, int num) { Arg args[20]; register int n; Widget popupmenu, entry; int i; n = 0; XtSetArg (args[0], XtNmenuName, name); XtSetValues (bar_button, args, (Cardinal) 1); popupmenu = XtCreatePopupShell (name, simpleMenuWidgetClass, bar_button, args, n); for (i = 0; i < num; i++) { entry = XtCreateManagedWidget (menuentry[i].name, smeBSBObjectClass, popupmenu, NULL, (Cardinal) 0); XtAddCallback (entry, XtNcallback, menuentry[i].function, NULL); } return popupmenu; } Widget add_entry (Widget popupmenu, char *name, void (*func) ()) { Widget entry = XtCreateManagedWidget (name, smeBSBObjectClass, popupmenu, NULL, (Cardinal) 0); XtAddCallback (entry, XtNcallback, func, NULL); return entry; } static int level; static Widget popupmenu[10]; static Widget windowname[20]; static int nwin = 0; int add_window_name (char *name) { int i = 0; while (i < 10 && strncmp (rootmenu[i].name, "Windows", 7)) i++; if (nwin == 20) return -1; windowname[nwin] = add_entry (popupmenu[i], name, m_changewin); nwin++; return 0; } int remove_window_name (char *name) { int j; int i = 0; while (i < nwin && strcmp (XtName (windowname[i]), name)) i++; if (i == nwin) return 0; XtUnmanageChild (windowname[i]); XtDestroyWidget (windowname[i]); nwin--; for (j = i; j < nwin; j++) windowname[j] = windowname[j + 1]; return 0; } int recursive_build (Menubar * mb_obj, Widget parent, Menu_ele * menu) { int i; Arg args[20]; register int n = 0; Widget entry, button; XtTranslations menu_trans_table; XtTranslations menu_popup_trans_table; menu_trans_table = XtParseTranslationTable (menuTranslations); menu_popup_trans_table = XtParseTranslationTable (menupopupTranslations); i = 0; level++; while (menu[i].name != NULL) { switch (menu[i].type) { case BtnEle: { n = 0; XtSetArg (args[n], XtNborderWidth, 0); n++; XtSetArg (args[n], XtNhighlightThickness, 1); n++; button = XtCreateManagedWidget (menu[i].name, menuButtonWidgetClass, parent, args, n); XtOverrideTranslations (button, menu_trans_table); n = 0; XtSetArg (args[n], XtNmenuName, menu[i].name); n++; XtSetValues (button, args, n); n = 0; popupmenu[i] = XtCreatePopupShell (menu[i].name, simpleMenuWidgetClass, button, args, n); XtOverrideTranslations (popupmenu[i], menu_popup_trans_table); recursive_build (mb_obj, popupmenu[i], menu[i].popup); break; } case EntryEle: { entry = XtCreateManagedWidget (menu[i].name, smeBSBObjectClass, parent, NULL, (Cardinal) 0); XtAddCallback (entry, XtNcallback, menu[i].cb, NULL); break; } case SeparatorEle: { entry = XtCreateManagedWidget (menu[i].name, smeLineObjectClass, parent, NULL, (Cardinal) 0); break; } } i++; } level--; return 0; } Menubar * newmenubar (Widget menubar) { Menubar *mb_obj; mb_obj = (Menubar *) absmalloc (sizeof (Menubar), "newmenubar:mb_obj "); level = 0; recursive_build (mb_obj, menubar, rootmenu); return mb_obj; }