]> gitweb.factorcode.org Git - factor.git/blob - library/ui/cocoa/menu-bar.factor
Fix list selection
[factor.git] / library / ui / cocoa / menu-bar.factor
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 ;
6 IN: cocoa
7
8 ! -------------------------------------------------------------------------
9
10 GENERIC: to-target-and-action ( spec -- target action )
11
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 ;
17
18 : <NSMenu> ( title -- menu )
19     NSMenu -> alloc
20     swap <NSString> -> initWithTitle:
21     -> autorelease ;
22
23 : set-main-menu ( menu -- ) NSApp swap -> setMainMenu: ;
24
25 : <NSMenuItem> ( title action equivalent -- item )
26     >r >r >r
27     NSMenuItem -> alloc
28     r> <NSString>
29     r> dup [ sel_registerName ] when
30     r> <NSString>
31     -> initWithTitle:action:keyEquivalent: -> autorelease ;
32
33 : make-menu-item ( title spec -- item )
34     to-target-and-action >r swap <NSMenuItem> dup
35     r> -> setTarget: ;
36
37 : submenu-to-item ( menu -- item )
38     dup -> title CF>string f "" <NSMenuItem> dup
39     rot -> setSubmenu: ;
40
41 : add-submenu ( menu submenu -- )
42     submenu-to-item -> addItem: ;
43
44 : and-modifiers ( item key-equivalent-modifier-mask -- item )
45     dupd -> setKeyEquivalentModifierMask: ;
46
47 : and-alternate ( item -- item )
48     dup 1 -> setAlternate: ;
49
50 : and-option-equivalent-modifier 1572864 and-modifiers ;
51
52 ! -------------------------------------------------------------------------
53
54 DEFER: described-menu
55
56 ! { } => separator
57
58 ! { { ... } } or
59 ! { { ... } modify-quotation } => submenu as described in inner sequence
60
61 ! { title action equivalent } or
62 ! { title action equivalent modify-quotation } => item
63
64 ! this is a mess
65 : described-item ( desc -- menu-item )
66     dup length 0 = [
67         drop NSMenuItem -> separatorItem
68     ] [
69         dup first string? [
70             [ first3 swap make-menu-item ] keep
71             dup length 4 = [ fourth call ] [ drop ] if
72         ] [
73             [ first described-menu ] keep
74             dup length 2 = [ second call ] [ drop ] if
75             submenu-to-item
76         ] if
77     ] if ;
78
79 : and-described-item ( menu desc -- same-menu )
80     described-item dupd -> addItem: ;
81
82 : described-menu ( { title items* } -- menu )
83     [ first <NSMenu> ] keep
84     1 tail [ and-described-item ] each ;
85
86 : and-described-submenu ( menu { title items* } -- menu )
87     described-menu dupd add-submenu ;
88
89 ! -------------------------------------------------------------------------
90
91 : menu-run-file ( -- )
92     open-panel [ listener-run-files ] when* ;
93
94 : default-main-menu 
95     {
96         "<top>"
97         { {
98             "Factor"
99             ! About goes here
100             ! Preferences goes here
101             { {
102                 "Services"
103             } [ NSApp over -> setServicesMenu: ] }
104             { }
105             { "Hide Factor" "hide:" "h" }
106             { "Hide Others" "hideOtherApplications:" "h" [ and-option-equivalent-modifier ] }
107             { "Show All" "unhideAllApplications:" "" }
108             { }
109             { "Quit" "terminate:" "q" }
110         } [ NSApp over -> setAppleMenu: ] }
111         { {
112             "File"
113             { "New Workspace" [ workspace-window drop ] "n" }
114             { "Run..." menu-run-file "o" }
115             { }
116             { "Save Image" save "s" }
117         } }
118         { {
119             "Edit"
120             { "Undo" "undo:" "z" }
121             { "Redo" "redo:" "Z" }
122             { }
123             { "Cut" "cut:" "x" }
124             { "Copy" "copy:" "c" }
125             { "Paste" "paste:" "v" }
126             { "Delete" "delete:" "" }
127             { "Select All" "selectAll:" "a" }
128             ! Find, Spelling, and Speech submenus go here
129         } }
130         { {
131             "Window"
132             { "Close" "performClose:" "w" }
133             { "Zoom" "performZoom:" "" }
134             { "Minimize" "performMiniaturize:" "m" }
135             { "Minimize All" "miniaturizeAll:" "m"  [ and-alternate and-option-equivalent-modifier ] }
136             { }
137             { "Bring All to Front" "arrangeInFront:" "" }
138         } [ NSApp over -> setWindowsMenu: ] }
139         { {
140             "Help"
141             { "Factor Documentation" [ "handbook" <link> help-gadget call-tool ] "?" }
142         } }
143     } described-menu set-main-menu ;