]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/backend/cocoa/tools/tools.factor
change add-init-hook to add-startup-hook, new add-shutdown-hook word
[factor.git] / basis / ui / backend / cocoa / tools / tools.factor
1 ! Copyright (C) 2006, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien.syntax cocoa cocoa.nibs cocoa.application
4 cocoa.classes cocoa.dialogs cocoa.pasteboard cocoa.subclassing
5 core-foundation core-foundation.strings help.topics kernel
6 memory namespaces parser system ui ui.tools.browser
7 ui.tools.listener ui.backend.cocoa eval locals
8 vocabs.refresh ;
9 IN: ui.backend.cocoa.tools
10
11 : finder-run-files ( alien -- )
12     CF>string-array listener-run-files
13     NSApp NSApplicationDelegateReplySuccess
14     -> replyToOpenOrPrint: ;
15
16 : menu-run-files ( -- )
17     open-panel [ listener-run-files ] when* ;
18
19 : menu-save-image ( -- )
20     image save-panel [ save-image ] when* ;
21
22 ! Handle Open events from the Finder
23 CLASS: {
24     { +superclass+ "FactorApplicationDelegate" }
25     { +name+ "FactorWorkspaceApplicationDelegate" }
26 }
27
28 { "application:openFiles:" "void" { "id" "SEL" "id" "id" }
29     [ [ 3drop ] dip finder-run-files ]
30 }
31
32 { "applicationShouldHandleReopen:hasVisibleWindows:" "int" { "id" "SEL" "id" "int" }
33     [ [ 3drop ] dip 0 = [ show-listener ] when 1 ]
34 }
35
36 { "factorListener:" "id" { "id" "SEL" "id" }
37     [ 3drop show-listener f ]
38 }
39
40 { "factorBrowser:" "id" { "id" "SEL" "id" }
41     [ 3drop show-browser f ]
42 }
43
44 { "newFactorListener:" "id" { "id" "SEL" "id" }
45     [ 3drop listener-window f ]
46 }
47
48 { "newFactorBrowser:" "id" { "id" "SEL" "id" }
49     [ 3drop browser-window f ]
50 }
51
52 { "runFactorFile:" "id" { "id" "SEL" "id" }
53     [ 3drop menu-run-files f ]
54 }
55
56 { "saveFactorImage:" "id" { "id" "SEL" "id" }
57     [ 3drop save f ]
58 }
59
60 { "saveFactorImageAs:" "id" { "id" "SEL" "id" }
61     [ 3drop menu-save-image f ]
62 }
63
64 { "refreshAll:" "id" { "id" "SEL" "id" }
65     [ 3drop [ refresh-all ] \ refresh-all call-listener f ]
66 } ;
67
68 : install-app-delegate ( -- )
69     NSApp FactorWorkspaceApplicationDelegate install-delegate ;
70
71 ! Service support; evaluate Factor code from other apps
72 :: do-service ( pboard error quot -- )
73     pboard error ?pasteboard-string
74     dup [ quot call( string -- result/f ) ] when
75     [ pboard set-pasteboard-string ] when* ;
76
77 CLASS: {
78     { +superclass+ "NSObject" }
79     { +name+ "FactorServiceProvider" }
80 } {
81     "evalInListener:userData:error:"
82     "void"
83     { "id" "SEL" "id" "id" "id" }
84     [ nip [ eval-listener f ] do-service 2drop ]
85 } {
86     "evalToString:userData:error:"
87     "void"
88     { "id" "SEL" "id" "id" "id" }
89     [ nip [ eval>string ] do-service 2drop ]
90 } ;
91
92 : register-services ( -- )
93     NSApp
94     FactorServiceProvider -> alloc -> init
95     -> setServicesProvider: ;
96
97 FUNCTION: void NSUpdateDynamicServices ;
98
99 [
100     install-app-delegate
101     "Factor.nib" load-nib
102     register-services
103 ] cocoa-startup-hook set-global