]> gitweb.factorcode.org Git - factor.git/blob - core/ui/text/commands.factor
a0cf1db1de9055c96a929bf7e94a65ee6c19ce4e
[factor.git] / core / ui / text / commands.factor
1 ! Copyright (C) 2006 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 IN: gadgets-text
4 USING: gadgets kernel models namespaces sequences arrays ;
5
6 : editor-extend-selection ( editor -- )
7     dup request-focus
8     dup editor-caret click-loc ;
9
10 : editor-mouse-drag ( editor -- )
11     dup editor-caret click-loc ;
12
13 : editor-copy ( editor clipboard -- )
14     over gadget-selection? [
15         >r [ gadget-selection ] keep r> copy-clipboard
16     ] [
17         2drop
18     ] if ;
19
20 : editor-cut ( editor clipboard -- )
21     dupd editor-copy remove-editor-selection ;
22
23 : delete/backspace ( elt editor quot -- )
24     over gadget-selection? [
25         drop nip remove-editor-selection
26     ] [
27         over >r >r dup editor-caret* swap control-model
28         r> call r> control-model remove-doc-range
29     ] if ; inline
30
31 : editor-delete ( editor elt -- )
32     swap [ over >r rot next-elt r> swap ] delete/backspace ;
33
34 : editor-backspace ( editor elt -- )
35     swap [ over >r rot prev-elt r> ] delete/backspace ;
36
37 : editor-select-prev ( editor elt -- )
38     swap [ rot prev-elt ] change-caret ;
39
40 : editor-prev ( editor elt -- )
41     dupd editor-select-prev mark>caret ;
42
43 : editor-select-next ( editor elt -- )
44     swap [ rot next-elt ] change-caret ;
45
46 : editor-next ( editor elt -- )
47     dupd editor-select-next mark>caret ;
48
49 : editor-select ( from to editor -- )
50     tuck editor-caret set-model editor-mark set-model ;
51
52 : select-elt ( editor elt -- )
53     over >r
54     >r dup editor-caret* swap control-model r>
55     3dup next-elt >r prev-elt r>
56     r> editor-select ;
57
58 : select-all ( editor -- ) T{ doc-elt } select-elt ;
59
60 : editor-doc-start ( editor -- ) T{ doc-elt } editor-prev ;
61
62 : editor-doc-end ( editor -- ) T{ doc-elt } editor-next ;
63
64 : selected-word ( editor -- string )
65     dup gadget-selection?
66     [ dup T{ one-word-elt } select-elt ] unless
67     gadget-selection ;
68
69 : position-caret ( editor -- )
70     dup editor-extend-selection
71     dup editor-mark click-loc ;
72
73 : editor-mouse-down ( editor -- )
74     hand-click# get {
75         [ ]
76         [ dup position-caret ]
77         [ dup T{ one-word-elt } select-elt ]
78         [ dup T{ one-line-elt } select-elt ]
79     } ?nth call drop ;
80
81 editor "editing" {
82     { "Insert newline" T{ key-down f f "RETURN" } [ "\n" swap user-input ] }
83     { "Insert newline" T{ key-down f { S+ } "RETURN" } [ "\n" swap user-input ] }
84     { "Insert newline" T{ key-down f f "ENTER" } [ "\n" swap user-input ] }
85     { "Delete next character" T{ key-down f f "DELETE" } [ T{ char-elt } editor-delete ] }
86     { "Delete next character" T{ key-down f { S+ } "DELETE" } [ T{ char-elt } editor-delete ] }
87     { "Delete previous character" T{ key-down f f "BACKSPACE" } [ T{ char-elt } editor-backspace ] }
88     { "Delete previous character" T{ key-down f { S+ } "BACKSPACE" } [ T{ char-elt } editor-backspace ] }
89     { "Delete previous word" T{ key-down f { C+ } "DELETE" } [ T{ word-elt } editor-delete ] }
90     { "Delete next word" T{ key-down f { C+ } "BACKSPACE" } [ T{ word-elt } editor-backspace ] }
91     { "Delete to start of line" T{ key-down f { A+ } "DELETE" } [ T{ one-line-elt } editor-delete ] }
92     { "Delete to end of line" T{ key-down f { A+ } "BACKSPACE" } [ T{ one-line-elt } editor-backspace ] }
93 } define-commands
94
95 editor "clipboard" {
96     { "Paste" T{ paste-action } [ clipboard get paste-clipboard ] }
97     { "Paste selection" T{ button-up f f 2 } [ selection get paste-clipboard ] }
98     { "Copy" T{ copy-action } [ clipboard get editor-copy ] }
99     { "Copy selection" T{ button-up } [ selection get editor-copy ] }
100     { "Cut" T{ cut-action } [ clipboard get editor-cut ] }
101 } define-commands
102
103 editor "caret" {
104     { "Position caret" T{ button-down } [ editor-mouse-down ] }
105     { "Previous character" T{ key-down f f "LEFT" } [ T{ char-elt } editor-prev ] }
106     { "Next character" T{ key-down f f "RIGHT" } [ T{ char-elt } editor-next ] }
107     { "Previous line" T{ key-down f f "UP" } [ T{ line-elt } editor-prev ] }
108     { "Next line" T{ key-down f f "DOWN" } [ T{ line-elt } editor-next ] }
109     { "Previous word" T{ key-down f { C+ } "LEFT" } [ T{ word-elt } editor-prev ] }
110     { "Next word" T{ key-down f { C+ } "RIGHT" } [ T{ word-elt } editor-next ] }
111     { "Start of line" T{ key-down f f "HOME" } [ T{ one-line-elt } editor-prev ] }
112     { "End of line" T{ key-down f f "END" } [ T{ one-line-elt } editor-next ] }
113     { "Start of document" T{ key-down f { C+ } "HOME" } [ editor-doc-start ] }
114     { "End of document" T{ key-down f { C+ } "END" } [ editor-doc-end ] }
115 } define-commands
116     
117 editor "selection" {
118     { "Extend selection" T{ button-down f { S+ } } [ editor-extend-selection ] }
119     { "Start selection" T{ drag } [ editor-mouse-drag ] }
120     { "Focus editor" T{ gain-focus } [ focus-editor ] }
121     { "Unfocus editor" T{ lose-focus } [ unfocus-editor ] }
122     { "Clear" T{ delete-action } [ remove-editor-selection ] }
123     { "Select all" T{ select-all-action } [ T{ doc-elt } select-elt ] }
124     { "Select line" T{ key-down f { C+ } "l" } [ T{ one-line-elt } select-elt ] }
125     { "Select word" f [ T{ one-word-elt } select-elt ] }
126     { "Select previous character" T{ key-down f { S+ } "LEFT" } [ T{ char-elt } editor-select-prev ] }
127     { "Select next character" T{ key-down f { S+ } "RIGHT" } [ T{ char-elt } editor-select-next ] }
128     { "Select previous line" T{ key-down f { S+ } "UP" } [ T{ line-elt } editor-select-prev ] }
129     { "Select next line" T{ key-down f { S+ } "DOWN" } [ T{ line-elt } editor-select-next ] }
130     { "Select previous line" T{ key-down f { S+ C+ } "LEFT" } [ T{ word-elt } editor-select-prev ] }
131     { "Select next line" T{ key-down f { S+ C+ } "RIGHT" } [ T{ word-elt } editor-select-next ] }
132     { "Select to start of line" T{ key-down f { S+ } "HOME" } [ T{ one-line-elt } editor-select-prev ] }
133     { "Select to end of line" T{ key-down f { S+ } "END" } [ T{ one-line-elt } editor-select-next ] }
134     { "Select start of document" T{ key-down f { S+ C+ } "HOME" } [ T{ doc-elt } editor-select-prev ] }
135     { "Select end of document" T{ key-down f { S+ C+ } "END" } [ T{ doc-elt } editor-select-next ] }
136 } define-commands