/* * Copyright (C) 1998,1999 David Stes. * * 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. * * 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. */ #include #include #include #include #define Object XtObject #define String XtString #include #include #include #include #include #include #undef Object #undef String #include "panic.h" #include "document.h" #include "menu.h" #include /* action procedures */ static void newap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { assert(*nArgs == 0); [Document new]; } static void openap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { assert(*nArgs == 1); [Document open:args[0]]; } static void opendialogap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { assert(*nArgs == 0); [[Document fromwidget:w] open]; } static void closeap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { assert(*nArgs == 0); [[Document fromwidget:w] close]; } static void saveasap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { assert(*nArgs == 0); [[Document fromwidget:w] saveas]; } static void saveap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { assert(*nArgs == 0); [[Document fromwidget:w] save]; } static void revertap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { assert(*nArgs == 0); [[Document fromwidget:w] revert]; } static void printap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] print]; } static void exitap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [Document closeall]; exit(0); /* regardless of closeall success */ } static void cutap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] cutclipboard]; } static void copyap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] copyclipboard]; } static void pasteap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] pasteclipboard]; } static void deleteap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] delete]; } static void selallap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] selectAll]; } static void findap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] find]; } static void enterselap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] enterselection]; } static void findnextap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] findnext]; } static void jumpap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { id doc = [Document fromwidget:w]; [doc selectAndScroll]; [doc update]; /* not needed, but ctrl-j can be used to force screen update */ } static void findpreviousap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] findprevious]; } static void replacedialogap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { replacedialog(w); } static void replaceap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { } static void replaceallap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { } static void rearrangeap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { assert(*nArgs == 0); [Document rearrange]; } static void copyright(Widget w, XEvent *event, char **args, Cardinal *nArgs) { warndialog(w, "Copyright (C) 1998 David Stes.\n" "\n" "This program is free software; you can redistribute it and/or modify it\n" "under the terms of the GNU General Public License as published\n" "by the Free Software Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program; if not, write to the Free Software\n" "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n" ); } static void romanap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeRoman]; } static void swissap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeSwiss]; } static void modernap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeModern]; } static void plainap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makePlain]; } static void italicap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeItalic]; } static void boldap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeBold]; } static void underlinedap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeUnderlined]; } static void f9ap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeFontsize:9]; } static void f10ap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeFontsize:10]; } static void f11ap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeFontsize:11]; } static void f12ap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeFontsize:12]; } static void f14ap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeFontsize:14]; } static void f18ap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeFontsize:18]; } static void f20ap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeFontsize:20]; } static void f24ap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeFontsize:24]; } static void f36ap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeFontsize:36]; } static void f48ap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { [[Document fromwidget:w] makeFontsize:48]; } static void nyiap(Widget w, XEvent *event, char **args, Cardinal *nArgs) { fprintf(stderr,"Not yet implemented.\n"); } static XtActionsRec appactions[] = { {"new", newap}, {"open", openap}, {"open_dialog", opendialogap}, {"close", closeap}, {"save", saveap}, {"save_as", saveasap}, {"save_as_dialog", saveasap}, {"revert_to_saved", revertap}, {"print", printap}, {"exit", exitap}, {"cut_clipboard", cutap}, {"copy_clipboard", copyap}, {"paste_clipboard", pasteap}, {"delete", deleteap}, {"select_all", selallap}, {"find", findap}, {"enter_selection", enterselap}, {"find_next", findnextap}, {"find_previous", findpreviousap}, {"replace", replaceap}, {"replace_dialog", replacedialogap}, {"replace_all", replaceallap}, {"rearrange", rearrangeap}, {"copyright", copyright}, {"jump", jumpap}, {"roman", romanap}, {"swiss", swissap}, {"modern", modernap}, {"plain", plainap}, {"italic", italicap}, {"bold", boldap}, {"underlined", underlinedap}, {"f9", f9ap}, {"f10", f10ap}, {"f11", f11ap}, {"f12", f12ap}, {"f14", f14ap}, {"f18", f18ap}, {"f20", f20ap}, {"f24", f24ap}, {"f36", f36ap}, {"f48", f48ap}, {"nyi", nyiap}, }; void addactions(XtAppContext context) { XtAppAddActions(context,appactions,XtNumber(appactions)); } static Widget menubutton(Widget parent,char *name,char *label,char mnemonic,XtCallbackProc callback,void *cbarg) { XmString s; Widget button; button = XtVaCreateWidget(name,xmPushButtonWidgetClass,parent, XmNlabelString,s=XmStringCreateSimple(label), XmNmnemonic,mnemonic,NULL); XtAddCallback(button,XmNactivateCallback,callback,cbarg); XmStringFree(s); XtManageChild(button); return button; } static Widget menu(Widget parent, char *name, char *label,char mnemonic, Widget *cascaderef) { XmString s; Widget menu, cascade; menu = XmCreatePulldownMenu(parent,name,NULL,0); cascade = XtVaCreateWidget(name, xmCascadeButtonWidgetClass, parent, XmNlabelString, s=XmStringCreateSimple(label), XmNsubMenuId, menu, 0); XmStringFree(s); if (mnemonic != 0) XtVaSetValues(cascade, XmNmnemonic, mnemonic, 0); XtManageChild(cascade); if (cascaderef != NULL) { *cascaderef = cascade; } return menu; } static Widget menuseparator(Widget parent, char *name) { Widget button; button = XmCreateSeparator(parent, name, NULL, 0); XtManageChild(button); return button; } static void doaction(Widget w,XtPointer clientdata,XtPointer calldata) { Widget lf,m; m = XmGetPostedFromWidget(XtParent(w)); lf = [[Document fromwidget:m] lastfocus]; if (lf) { XtCallActionProc(lf, (char *)clientdata,((XmAnyCallbackStruct *)calldata)->event, NULL, 0); } } static void windowmenucb(Widget w,XtPointer clientdata,XtPointer calldata) { id document = (id)clientdata; [document updatewindowsmenu]; } void emptywindowsmenu(Widget windowsmenu) { int i,nitems; WidgetList items; XtVaGetValues(windowsmenu, XmNchildren, &items, XmNnumChildren, &nitems,0); for(i=3;i