1 | !include once #1015780 // RSyntaxTextArea |
2 | |
3 | /* |
4 | * original author: Robert Futrell |
5 | */ |
6 | static class EditorFrame extends JFrame implements SearchListener { |
7 | CollapsibleSectionPanel csp; |
8 | RSyntaxTextArea textArea; |
9 | FindDialog findDialog; |
10 | ReplaceDialog replaceDialog; |
11 | FindToolBar findToolBar; |
12 | ReplaceToolBar replaceToolBar; |
13 | StatusBar statusBar; |
14 | |
15 | *() { |
16 | rsyntaxTextArea_fixNumPad(); |
17 | _initFrame(this); |
18 | initSearchDialogs(); |
19 | |
20 | JPanel contentPane = new JPanel(new BorderLayout()); |
21 | setContentPane(contentPane); |
22 | csp = new CollapsibleSectionPanel(); |
23 | contentPane.add(csp); |
24 | |
25 | setJMenuBar(createMenuBar()); |
26 | textArea = javaxSyntaxTextArea(); |
27 | RTextScrollPane sp = new RTextScrollPane(textArea); |
28 | csp.add(sp); |
29 | |
30 | ErrorStrip errorStrip = new ErrorStrip(textArea); |
31 | contentPane.add(errorStrip, BorderLayout.LINE_END); |
32 | //org.fife.rsta.ui.DocumentMap docMap = new org.fife.rsta.ui.DocumentMap(textArea); |
33 | //contentPane.add(docMap, BorderLayout.LINE_END); |
34 | |
35 | statusBar = new StatusBar(); |
36 | contentPane.add(statusBar, BorderLayout.SOUTH); |
37 | |
38 | setTitle(autoFrameTitle()); |
39 | centerFrame(this); |
40 | |
41 | bindBotToFrame(this, makeBot("Editor.", this)); |
42 | } |
43 | |
44 | S answer(S s) { |
45 | new Matches m; |
46 | if "get text" ret quote(textArea.getText()); |
47 | if "set text to * " { |
48 | final S text = m.unq(0); |
49 | setText(text); |
50 | ret "OK"; |
51 | } |
52 | if "get frame title" ret quote(getTitle()); |
53 | null; |
54 | } |
55 | |
56 | void addItem(Action a, ButtonGroup bg, JMenu menu) { |
57 | JRadioButtonMenuItem item = new JRadioButtonMenuItem(a); |
58 | bg.add(item); |
59 | menu.add(item); |
60 | } |
61 | |
62 | JMenuBar createMenuBar() { |
63 | JMenuBar mb = new JMenuBar(); |
64 | JMenu menu = new JMenu("Search"); |
65 | menu.add(new JMenuItem(new ShowFindDialogAction())); |
66 | menu.add(new JMenuItem(new ShowReplaceDialogAction())); |
67 | menu.add(new JMenuItem(new GoToLineAction())); |
68 | menu.addSeparator(); |
69 | |
70 | int ctrl = getToolkit().getMenuShortcutKeyMask(); |
71 | int shift = InputEvent.SHIFT_MASK; |
72 | KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_F, ctrl|shift); |
73 | Action a = csp.addBottomComponent(ks, findToolBar); |
74 | a.putValue(Action.NAME, "Show Find Search Bar"); |
75 | menu.add(new JMenuItem(a)); |
76 | ks = KeyStroke.getKeyStroke(KeyEvent.VK_H, ctrl|shift); |
77 | a = csp.addBottomComponent(ks, replaceToolBar); |
78 | a.putValue(Action.NAME, "Show Replace Search Bar"); |
79 | menu.add(new JMenuItem(a)); |
80 | |
81 | mb.add(menu); |
82 | return mb; |
83 | } |
84 | |
85 | @Override |
86 | public String getSelectedText() { |
87 | return textArea.getSelectedText(); |
88 | } |
89 | |
90 | /** |
91 | * Creates our Find and Replace dialogs. |
92 | */ |
93 | public void initSearchDialogs() { |
94 | |
95 | findDialog = new FindDialog(this, this); |
96 | replaceDialog = new ReplaceDialog(this, this); |
97 | |
98 | // This ties the properties of the two dialogs together (match case, |
99 | // regex, etc.). |
100 | SearchContext context = findDialog.getSearchContext(); |
101 | replaceDialog.setSearchContext(context); |
102 | |
103 | // Create tool bars and tie their search contexts together also. |
104 | findToolBar = new FindToolBar(this); |
105 | findToolBar.setSearchContext(context); |
106 | replaceToolBar = new ReplaceToolBar(this); |
107 | replaceToolBar.setSearchContext(context); |
108 | |
109 | } |
110 | |
111 | |
112 | /** |
113 | * Listens for events from our search dialogs and actually does the dirty |
114 | * work. |
115 | */ |
116 | @Override |
117 | public void searchEvent(SearchEvent e) { |
118 | |
119 | SearchEvent.Type type = e.getType(); |
120 | SearchContext context = e.getSearchContext(); |
121 | SearchResult result = null; |
122 | |
123 | switch (type) { |
124 | default: // Prevent FindBugs warning later |
125 | case MARK_ALL: |
126 | result = SearchEngine.markAll(textArea, context); |
127 | break; |
128 | case FIND: |
129 | result = SearchEngine.find(textArea, context); |
130 | if (!result.wasFound()) { |
131 | UIManager.getLookAndFeel().provideErrorFeedback(textArea); |
132 | } |
133 | break; |
134 | case REPLACE: |
135 | result = SearchEngine.replace(textArea, context); |
136 | if (!result.wasFound()) { |
137 | UIManager.getLookAndFeel().provideErrorFeedback(textArea); |
138 | } |
139 | break; |
140 | case REPLACE_ALL: |
141 | result = SearchEngine.replaceAll(textArea, context); |
142 | JOptionPane.showMessageDialog(null, result.getCount() + |
143 | " occurrences replaced."); |
144 | break; |
145 | } |
146 | |
147 | String text = null; |
148 | if (result.wasFound()) { |
149 | text = "Text found; occurrences marked: " + result.getMarkedCount(); |
150 | } |
151 | else if (type==SearchEvent.Type.MARK_ALL) { |
152 | if (result.getMarkedCount()>0) { |
153 | text = "Occurrences marked: " + result.getMarkedCount(); |
154 | } |
155 | else { |
156 | text = ""; |
157 | } |
158 | } |
159 | else { |
160 | text = "Text not found"; |
161 | } |
162 | statusBar.setText(text); |
163 | } |
164 | |
165 | class GoToLineAction extends AbstractAction { |
166 | *() { |
167 | super("Go To Line..."); |
168 | int c = getToolkit().getMenuShortcutKeyMask(); |
169 | putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_L, c)); |
170 | } |
171 | |
172 | public void actionPerformed(ActionEvent e) { |
173 | findDialog.setVisible(false); |
174 | replaceDialog.setVisible(false); |
175 | GoToDialog dialog = new GoToDialog(EditorFrame.this); |
176 | dialog.setMaxLineNumberAllowed(textArea.getLineCount()); |
177 | dialog.setVisible(true); |
178 | int line = dialog.getLineNumber(); |
179 | if (line>0) { |
180 | try { |
181 | textArea.setCaretPosition(textArea.getLineStartOffset(line-1)); |
182 | } catch (BadLocationException ble) { // Never happens |
183 | UIManager.getLookAndFeel().provideErrorFeedback(textArea); |
184 | ble.printStackTrace(); |
185 | } |
186 | } |
187 | } |
188 | } |
189 | |
190 | class ShowFindDialogAction extends AbstractAction { |
191 | |
192 | *() { |
193 | super("Find..."); |
194 | int c = getToolkit().getMenuShortcutKeyMask(); |
195 | putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F, c)); |
196 | } |
197 | |
198 | public void actionPerformed(ActionEvent e) { |
199 | replaceDialog.setVisible(false); |
200 | findDialog.setVisible(true); |
201 | } |
202 | } |
203 | |
204 | class ShowReplaceDialogAction extends AbstractAction { |
205 | *() { |
206 | super("Replace..."); |
207 | int c = getToolkit().getMenuShortcutKeyMask(); |
208 | putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_H, c)); |
209 | } |
210 | |
211 | public void actionPerformed(ActionEvent e) { |
212 | findDialog.setVisible(false); |
213 | replaceDialog.setVisible(true); |
214 | } |
215 | } |
216 | |
217 | static class StatusBar extends JPanel { |
218 | JLabel label; |
219 | |
220 | *() { |
221 | label = new JLabel("Ready"); |
222 | setLayout(new BorderLayout()); |
223 | add(label, BorderLayout.LINE_START); |
224 | add(new JLabel(new SizeGripIcon()), BorderLayout.LINE_END); |
225 | } |
226 | |
227 | public void setText(String label) { |
228 | main.setText(this.label, label); |
229 | } |
230 | } |
231 | |
232 | void setStatus(S text) { |
233 | statusBar.setText(text); |
234 | } |
235 | |
236 | void setText(S text) { |
237 | main.setText(textArea, text); |
238 | } |
239 | |
240 | S getText() { |
241 | ret main.getText(textArea); |
242 | } |
243 | |
244 | void _setFont(final Font font) swing { |
245 | SyntaxScheme ss = textArea.getSyntaxScheme(); |
246 | ss = (SyntaxScheme) ss.clone(); |
247 | for (int i = 0; i < ss.getStyleCount(); i++) |
248 | if (ss.getStyle(i) != null) |
249 | ss.getStyle(i).font = font; |
250 | textArea.setSyntaxScheme(ss); |
251 | textArea.setFont(font); |
252 | } |
253 | |
254 | Font _getFont() { |
255 | ret swing(func -> Font { textArea.getFont() }); |
256 | } |
257 | |
258 | int _getFontSize() { |
259 | ret _getFont().getSize(); |
260 | } |
261 | |
262 | void _setFontSize(int size) { |
263 | _setFont(deriveFont(_getFont(), size)); |
264 | } |
265 | |
266 | RSyntaxTextArea getTextArea() { |
267 | ret textArea; |
268 | } |
269 | |
270 | RSyntaxDocument getDocument() { |
271 | ret (RSyntaxDocument) textArea.getDocument(); |
272 | } |
273 | } |
Began life as a copy of #1004353
download show line numbers debug dex old transpilations
Travelled to 17 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, ddnzoavkxhuk, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, sawdedvomwva, tslmcundralx, tvejysmllsmz, vouqrxazstgt, wtqryiryparv
No comments. add comment
Snippet ID: | #1004356 |
Snippet name: | EditorFrame (syntax-enhanced swing editor) |
Eternal ID of this version: | #1004356/20 |
Text MD5: | 66fbe262e03a7cc276b4b8e736377858 |
Author: | stefan |
Category: | javax / gui |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2018-05-27 18:21:18 |
Source code size: | 7277 bytes / 273 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 793 / 1434 |
Version history: | 19 change(s) |
Referenced in: | [show references] |