1 ! Copyright (C) 2005, 2006 Kevin Reid.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: cocoa compiler gadgets gadgets-workspace gadgets-help
4 gadgets-listener kernel memory objc objc-classes sequences
5 strings words io help ;
8 ! -------------------------------------------------------------------------
10 GENERIC: to-target-and-action ( spec -- target action )
12 M: f to-target-and-action f swap ;
13 M: string to-target-and-action f ;
14 M: word to-target-and-action unit to-target-and-action ;
15 M: quotation to-target-and-action
16 <FactorCallback> "perform:" swap ;
18 : <NSMenu> ( title -- menu )
20 swap <NSString> -> initWithTitle:
23 : set-main-menu ( menu -- ) NSApp swap -> setMainMenu: ;
25 : <NSMenuItem> ( title action equivalent -- item )
29 r> dup [ sel_registerName ] when
31 -> initWithTitle:action:keyEquivalent: -> autorelease ;
33 : make-menu-item ( title spec -- item )
34 to-target-and-action >r swap <NSMenuItem> dup
37 : submenu-to-item ( menu -- item )
38 dup -> title CF>string f "" <NSMenuItem> dup
41 : add-submenu ( menu submenu -- )
42 submenu-to-item -> addItem: ;
44 : and-modifiers ( item key-equivalent-modifier-mask -- item )
45 dupd -> setKeyEquivalentModifierMask: ;
47 : and-alternate ( item -- item )
48 dup 1 -> setAlternate: ;
50 : and-option-equivalent-modifier 1572864 and-modifiers ;
52 ! -------------------------------------------------------------------------
59 ! { { ... } modify-quotation } => submenu as described in inner sequence
61 ! { title action equivalent } or
62 ! { title action equivalent modify-quotation } => item
65 : described-item ( desc -- menu-item )
67 drop NSMenuItem -> separatorItem
70 [ first3 swap make-menu-item ] keep
71 dup length 4 = [ fourth call ] [ drop ] if
73 [ first described-menu ] keep
74 dup length 2 = [ second call ] [ drop ] if
79 : and-described-item ( menu desc -- same-menu )
80 described-item dupd -> addItem: ;
82 : described-menu ( { title items* } -- menu )
83 [ first <NSMenu> ] keep
84 1 tail [ and-described-item ] each ;
86 : and-described-submenu ( menu { title items* } -- menu )
87 described-menu dupd add-submenu ;
89 ! -------------------------------------------------------------------------
91 : menu-run-file ( -- )
92 open-panel [ listener-run-files ] when* ;
100 ! Preferences goes here
103 } [ NSApp over -> setServicesMenu: ] }
105 { "Hide Factor" "hide:" "h" }
106 { "Hide Others" "hideOtherApplications:" "h" [ and-option-equivalent-modifier ] }
107 { "Show All" "unhideAllApplications:" "" }
109 { "Quit" "terminate:" "q" }
110 } [ NSApp over -> setAppleMenu: ] }
113 { "New Workspace" [ workspace-window drop ] "n" }
114 { "Run..." menu-run-file "o" }
116 { "Save Image" save "s" }
120 { "Undo" "undo:" "z" }
121 { "Redo" "redo:" "Z" }
124 { "Copy" "copy:" "c" }
125 { "Paste" "paste:" "v" }
126 { "Delete" "delete:" "" }
127 { "Select All" "selectAll:" "a" }
128 ! Find, Spelling, and Speech submenus go here
132 { "Close" "performClose:" "w" }
133 { "Zoom" "performZoom:" "" }
134 { "Minimize" "performMiniaturize:" "m" }
135 { "Minimize All" "miniaturizeAll:" "m" [ and-alternate and-option-equivalent-modifier ] }
137 { "Bring All to Front" "arrangeInFront:" "" }
138 } [ NSApp over -> setWindowsMenu: ] }
141 { "Factor Documentation" [ "handbook" <link> help-gadget call-tool ] "?" }
143 } described-menu set-main-menu ;