diff options
Diffstat (limited to 'maccaml/menus.c')
-rw-r--r-- | maccaml/menus.c | 341 |
1 files changed, 341 insertions, 0 deletions
diff --git a/maccaml/menus.c b/maccaml/menus.c new file mode 100644 index 000000000..aec0e38cf --- /dev/null +++ b/maccaml/menus.c @@ -0,0 +1,341 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Damien Doligez, projet Para, INRIA Rocquencourt */ +/* */ +/* Copyright 1998 Institut National de Recherche en Informatique et */ +/* en Automatique. Distributed only by permission. */ +/* */ +/***********************************************************************/ + +/* $Id$ */ + +#include "main.h" + +static void DoAppleChoice (short item, EventModifiers mods) +{ + if (item == kItemAbout){ + OpenAboutBox (); + }else{ + Str255 deskAccName; + GetMenuItemText (GetMenuHandle (kMenuApple), item, deskAccName); + OpenDeskAcc (deskAccName); + } +} + +OSErr DoQuit () +{ + WindowPtr w; + OSErr err; + + while (1){ + w = FrontWindow (); + while (1){ + if (w == NULL) goto done; + if (GetWindowGoAwayFlag (w) && w != winGraphics) break; + w = GetNextWindow (w); + } + err = WinDoClose (closingApp, w); + if (err != noErr) return err; + } + done: + if (winGraphics != NULL) WinCloseGraphics (); + WinCloseToplevel (); + quit_requested = 1; + return noErr; +} + +static void DoFileChoice (short item, EventModifiers mods) +{ + WindowPtr w = FrontWindow (); + + switch (item){ + case kItemNew: + FileNew (); + break; + case kItemOpen: + FileDoGetOpen (); + break; + case kItemClose: + WinDoClose (closingWindow, w); + break; + case kItemSave: + FileDoSave (w, 0); + break; + case kItemSaveAs: + FileDoSave (w, 1); + break; + case kItemRevert: + FileRevert (w); + break; + case kItemPageSetup: + XXX (); + break; + case kItemPrint: + XXX (); + break; + case kItemQuit: + DoQuit (); + break; + default: Assert (0); + } +} + +static void DoEditChoice (short item, EventModifiers mods) +{ + WindowPtr w = FrontWindow (); + WEReference we = WinGetWE (w); + + switch (item){ + case kItemUndo: + WEUndo (we); + break; + case kItemCut: + WECut (we); + ClipChanged (); + break; + case kItemCopy: + WECopy (we); + ClipChanged (); + break; + case kItemPaste: + if (w == winToplevel){ + long selstart, selend; + WEGetSelection (&selstart, &selend, we); + if (selstart == wintopfrontier && selend == selstart){ + WESetStyle (weDoFont + weDoSize + weDoColor + weDoFace+weDoReplaceFace, + &prefs.unread, we); + } + WEFeatureFlag (weFMonoStyled, weBitSet, we); + WEPaste (we); + WEFeatureFlag (weFMonoStyled, weBitClear, we); + }else{ + WEPaste (we); + } + break; + case kItemClear: + WEDelete (we); + break; + case kItemSelectAll: + WESetSelection (0, LONG_MAX, we); + break; + case kItemShowClipboard: + ClipShow (); + break; + case kItemFind: + XXX (); + break; + case kItemReplace: + XXX (); + break; + case kItemPreferences: + XXX (); + break; + default: Assert (0); + } +} + +static WindowPtr **winTable; /* a handle */ +static long winTableLen = 0; /* number of entries in the table */ + +static void DoWindowsChoice (short item, EventModifiers mods) +{ + switch (item){ + case 1: + Assert (winToplevel != NULL); + SelectWindow (winToplevel); + break; + case 2: + Assert (winGraphics != NULL); + ShowWindow (winGraphics); + SelectWindow (winGraphics); + break; + case 3: + Assert (0); + default: + Assert (item - 4 >= 0 && item - 4 < winTableLen); + SelectWindow ((*winTable)[item - 4]); + break; + } +} + +void DoMenuChoice (long choice, EventModifiers mods) +{ + short menu = HiWord (choice); + short item = LoWord (choice); + + switch (menu){ + case 0: break; + case kMenuApple: + DoAppleChoice (item, mods); + HiliteMenu (0); + break; + case kMenuFile: + DoFileChoice (item, mods); + HiliteMenu (0); + break; + case kMenuEdit: + DoEditChoice (item, mods); + HiliteMenu (0); + break; + case kMenuWindows: + DoWindowsChoice (item, mods); + HiliteMenu (0); + break; + default: Assert (0); + } +} + +OSErr InitialiseMenus (void) +{ + OSErr err; + Size s = 10; + + err = AllocHandle (s * sizeof (WindowPtr), (Handle *) &winTable); + if (err != noErr) return err; + + SetMenuBar (GetNewMBar (kMenuBar)); + AppendResMenu (GetMenuHandle (kMenuApple), 'DRVR'); + DrawMenuBar (); + return 0; +} + +static void EnableDisableItem (MenuHandle menu, short item, int enable) +{ + if (enable){ + EnableItem (menu, item); + }else{ + DisableItem (menu, item); + } +} + +/* Add w to the windows menu. */ +OSErr MenuWinAdd (WindowPtr w) +{ + MenuHandle m; + Str255 title; + Size s = GetHandleSize ((Handle) winTable) / sizeof (WindowPtr); + + if (s <= winTableLen){ + OSErr err; + SetHandleSize ((Handle) winTable, (s + 10) * sizeof (WindowPtr)); + err = MemError (); if (err != noErr) return err; + } + (*winTable)[winTableLen] = w; + ++ winTableLen; + + m = GetMenuHandle (kMenuWindows); + AppendMenu (m, "\px"); + GetWTitle (w, title); + SetMenuItemText (m, (winTableLen-1) + 4, title); + + return noErr; +} + +/* Remove w from the windows menu; do nothing if w is not there. */ +void MenuWinRemove (WindowPtr w) +{ + long i; + MenuHandle m; + + i = 0; + while (1){ + if (i >= winTableLen) return; + if ((*winTable)[i] == w) break; + ++ i; + } + Assert (i < winTableLen); + m = GetMenuHandle (kMenuWindows); + DeleteMenuItem (m, kItemDocuments + i); + for (++i; i < winTableLen; i++) (*winTable)[i-1] = (*winTable)[i]; + -- winTableLen; +} + +static void MenuWinUpdate (void) +{ + long i; + MenuHandle m = GetMenuHandle (kMenuWindows); + WindowPtr w = FrontWindow (); + + SetItemMark (m, kItemToplevel, w == winToplevel ? diamondMark : noMark); + SetItemMark (m, kItemGraphics, w == winGraphics ? diamondMark : noMark); + for (i = 0; i < winTableLen; i++){ + SetItemMark (m, kItemDocuments + i, + w == (*winTable)[i] ? diamondMark : noMark); + } +} + +void UpdateMenus (void) +{ + WindowPtr w; + WStatusH st; + WEHandle we; + MenuHandle m; + Str255 text; + + w = FrontWindow (); + st = WinGetStatus (w); + we = WinGetWE (w); + + WinUpdateStatus (w); + + m = GetMenuHandle (kMenuFile); + /* New is always enabled. */ + /* Open is always enabled. */ + EnableDisableItem (m, kItemClose, w != NULL && GetWindowGoAwayFlag (w)); + EnableDisableItem (m, kItemSave, st != NULL && (*st)->dirty + && (*st)->datarefnum != -1); + EnableDisableItem (m, kItemSaveAs, w != NULL && (*st)->hascontents); + EnableDisableItem (m, kItemRevert, st != NULL && (*st)->dirty + && (*st)->datarefnum != -1); + EnableDisableItem (m, kItemPageSetup, w != NULL && (*st)->hascontents); + EnableDisableItem (m, kItemPrint, w != NULL && (*st)->hascontents); + /* Quit is always enabled. */ + + m = GetMenuHandle (kMenuEdit); + DisableItem (m, kItemUndo); + GetIndString (text, kUndoStrings, 1); + SetMenuItemText (m, kItemUndo, text); + if (we != NULL){ + Boolean temp; + WEActionKind ak; + long selstart, selend; + + Assert (st != NULL); + + ak = WEGetUndoInfo (&temp, we); + if (ak != weAKNone){ + EnableItem (m, kItemUndo); + GetIndString (text, kUndoStrings, 2*ak + temp); + SetMenuItemText (m, kItemUndo, text); + } + + WEGetSelection (&selstart, &selend, we); + EnableDisableItem (m, kItemCut, (*st)->canwritesel && selstart != selend); + EnableDisableItem (m, kItemCopy, selstart != selend); + EnableDisableItem (m, kItemPaste, WECanPaste (we)); + EnableDisableItem (m, kItemClear, + (*st)->canwritesel && selstart != selend); + EnableDisableItem (m, kItemSelectAll, + (*st)->hascontents && WEGetTextLength (we) > 0); + /* Show Clipboard is always enabled. */ + EnableDisableItem (m, kItemFind, (*st)->hascontents); + EnableDisableItem (m, kItemReplace, (*st)->kind == kWinDocument); + /* PreferencesÉ is always enabled. */ + }else{ + /* Graphics window: no editing operations. */ + DisableItem (m, kItemCut); + DisableItem (m, kItemCopy); + DisableItem (m, kItemPaste); + DisableItem (m, kItemClear); + DisableItem (m, kItemSelectAll); + /* Show Clipboard is always enabled. */ + DisableItem (m, kItemFind); + DisableItem (m, kItemReplace); + /* PreferencesÉ is always enabled. */ + } + MenuWinUpdate (); + m = GetMenuHandle (kMenuWindows); + EnableDisableItem (m, kItemGraphics, winGraphics != NULL); +} |