Libraryless. Click here for Pure Java version (2350L/17K/54K).
1 | !752 |
2 | |
3 | static S snippetID; |
4 | static int maxTokens = 100; |
5 | static S fontID = null/*"#1000993"*/; |
6 | |
7 | static S corpusID = "#1001010"; |
8 | static S predictorID = "#1001028"; |
9 | static boolean allTokens = true; |
10 | |
11 | static JTextArea textArea; |
12 | static JLabel status; |
13 | static JButton btnSave; |
14 | static JTextArea advisorTextPane; |
15 | static JScrollPane textScroller, advisorScroller; |
16 | static volatile Object predictor; |
17 | static Font fancyFont; |
18 | |
19 | static class MyLayoutManager implements LayoutManager { |
20 | public void addLayoutComponent(String s, Component c) {} |
21 | public void removeLayoutComponent(Component c) {} |
22 | |
23 | public Dimension preferredLayoutSize(Container c) { |
24 | return minimumLayoutSize(c); |
25 | } |
26 | |
27 | public Dimension minimumLayoutSize(Container c) { |
28 | return new Dimension(500, 400); |
29 | } |
30 | |
31 | public void layoutContainer(Container c) { |
32 | int w = c.getWidth(), h = c.getHeight(); |
33 | int split = h*2/3; |
34 | textScroller.setBounds(0, 0, w, split); |
35 | advisorScroller.setBounds(0, split, w, h-split); |
36 | } |
37 | } |
38 | |
39 | p { |
40 | if (args.length != 0) snippetID = args[0]; |
41 | thread { ask(); } |
42 | } |
43 | |
44 | svoid ask() { |
45 | corpusID = slte("Corpus ID or GitHub URL:", corpusID); |
46 | if (corpusID != null && !isSnippetID(corpusID)) { |
47 | Matcher m = matcher("github.com/([^/]+/[^/]+)", corpusID); |
48 | if (m.find()) |
49 | github(m.group(1)); |
50 | else { |
51 | m = matcher("([^/]+/[^/]+)", corpusID); |
52 | if (m.matches()) |
53 | github(corpusID); |
54 | else { |
55 | print("Unknown corpus reference: " + corpusID); |
56 | corpusID = null; |
57 | } |
58 | } |
59 | } |
60 | awt { go(); } |
61 | } |
62 | |
63 | svoid go() { |
64 | //snippetID = formatSnippetID(snippetID); |
65 | JFrame frame = new JFrame("Predictive Editor v2"); |
66 | JPanel panel2 = new JPanel(new MyLayoutManager()); |
67 | |
68 | advisorTextPane = new JTextArea(); |
69 | advisorTextPane.setEditable(false); |
70 | advisorTextPane.setLineWrap(true); |
71 | advisorTextPane.setWrapStyleWord(true); |
72 | |
73 | // Prevents scrolling down? |
74 | DefaultCaret caret = (DefaultCaret) advisorTextPane.getCaret(); |
75 | caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE); |
76 | |
77 | if (fontID != null) try { |
78 | fancyFont = loadFont(fontID, 24); |
79 | advisorTextPane.setFont(fancyFont); |
80 | } catch (Throwable e) { e.printStackTrace(); } |
81 | |
82 | //advisorScroller = new JScrollPane(advisorTextPane); |
83 | advisorScroller = new JScrollPane(makeAnimation()); |
84 | advisorScroller.setMinimumSize(new Dimension(100, 300)); |
85 | |
86 | textArea = new JTextArea(); |
87 | textScroller = new JScrollPane(textArea); |
88 | panel2.add(textScroller); |
89 | panel2.add(advisorScroller); |
90 | |
91 | status = new JLabel(" "); |
92 | btnSave = new JButton("Save " + snippetID); |
93 | btnSave.setEnabled(false); |
94 | |
95 | btnSave.addActionListener(actionListener { |
96 | saveSnippet(); |
97 | }); |
98 | |
99 | JPanel bottom = new JPanel(new BorderLayout); |
100 | bottom.add(BorderLayout.CENTER, status); |
101 | //bottom.add(BorderLayout.EAST, btnSave); |
102 | |
103 | JPanel panel = new JPanel(new BorderLayout); |
104 | panel.add(BorderLayout.CENTER, panel2); |
105 | panel.add(BorderLayout.SOUTH, bottom); |
106 | |
107 | textArea.getDocument().addDocumentListener(new DocumentListener() { |
108 | public void insertUpdate(DocumentEvent e) { |
109 | btnSave.setEnabled(true); |
110 | predict(); |
111 | } |
112 | public void removeUpdate(DocumentEvent e) { |
113 | btnSave.setEnabled(true); |
114 | predict(); |
115 | } |
116 | public void changedUpdate(DocumentEvent e) { |
117 | // apparently it doesn't occur |
118 | } |
119 | }); |
120 | |
121 | textArea.addCaretListener(new CaretListener() { |
122 | public void caretUpdate(CaretEvent e) { |
123 | predict(); |
124 | } |
125 | }); |
126 | |
127 | if (snippetID != null) { |
128 | textArea.setEditable(false); // still loading |
129 | status.setText("Loading..."); |
130 | thread { |
131 | final S s = loadSnippet(snippetID); |
132 | awt { |
133 | status.setText("Loaded " + s.length() + " chars."); |
134 | textArea.setText(s); |
135 | //textArea.scrollRectToVisible(new Rectangle(0, 0, 1, 1)); |
136 | textArea.setCaretPosition(0); |
137 | btnSave.setEnabled(false); |
138 | textArea.setEditable(true); |
139 | textArea.requestFocus(); |
140 | } |
141 | } |
142 | } |
143 | |
144 | frame.addWindowListener(new WindowAdapter() { |
145 | public void windowOpened(WindowEvent e) { |
146 | textArea.requestFocus(); |
147 | } |
148 | }); |
149 | |
150 | frame.add(panel); |
151 | frame.setBounds(200, 150, 500, 420); |
152 | frame.setVisible(true); |
153 | exitOnFrameClose(frame); |
154 | |
155 | thread { |
156 | loadPredictor(); |
157 | } |
158 | } |
159 | |
160 | svoid saveSnippet() { |
161 | final S text = textArea.getText(); |
162 | btnSave.setEnabled(false); |
163 | status.setText("Saving..."); |
164 | thread { |
165 | final S url = "http://tinybrain.de:8080/tb-int/update_snippet_text.php"; |
166 | S user = loadTextFile(new File(userHome(), ".tinybrain/username").getPath(), null); |
167 | S pass = loadTextFile(new File(userHome(), ".tinybrain/userpass").getPath(), null); |
168 | S query = "id=" + parseSnippetID(snippetID) + "&text=" + urlencode(text) + "&_user=" + urlencode(user) + "&_pass=" + urlencode(pass); |
169 | final S page = doPost(query, url); |
170 | |
171 | awt { |
172 | status.setText("Saved snippet: " + page); |
173 | } |
174 | } |
175 | } |
176 | |
177 | svoid loadPredictor() ctex { |
178 | // We have the animation instead. |
179 | //advisorShow("Loading predictor..."); |
180 | |
181 | Class learner = hotwire(predictorID); |
182 | set(learner, "showGUI", false); |
183 | if (corpusID != null) |
184 | set(learner, "corpusID", corpusID); |
185 | callMain(learner); |
186 | predictor = get(get(learner, "collector"), "winner"); |
187 | print("Predictor: " + predictor); |
188 | awt { predict(); } |
189 | } |
190 | |
191 | svoid advisorShow(final S text) ctex { |
192 | awt { |
193 | advisorScroller.setViewportView(advisorTextPane); |
194 | advisorTextPane.setText(text); |
195 | } |
196 | } |
197 | |
198 | svoid predict() { |
199 | try { |
200 | long startTime = now(); |
201 | Object p = predictor; |
202 | if (p == null) return; |
203 | //p = clone(p); |
204 | p = call(p, "derive"); // properly make a local copy |
205 | S text = textArea.getText(); |
206 | int idx = textArea.getCaretPosition(); |
207 | S previous = safeSubstring(text, 0, idx); |
208 | previous ="\n==\n" + previous; // indicate start of snippet to predictor |
209 | L<S> tok = javaTok(previous); |
210 | if (!allTokens) tok = codeTokensOnly(tok); |
211 | //if (tok.size() != 0) tok.remove(tok.size()-1); |
212 | print(structure(tok)); |
213 | S fileName = "#new#"; |
214 | |
215 | // make single prediction |
216 | S prediction = cast call(p, "read", fileName, tok); |
217 | new StringBuilder buf; |
218 | |
219 | if (prediction != null) { |
220 | //buf.append(prediction + "\n\n"); |
221 | new L<S> multiPrediction; |
222 | S pred = prediction; |
223 | int i = 0; |
224 | while (true) { |
225 | multiPrediction.add(pred); |
226 | if (++i >= maxTokens) break; |
227 | tok.add(pred); |
228 | pred = (String) call(p, "read", fileName, tok); |
229 | if (pred == null) break; |
230 | } |
231 | if (multiPrediction.size() > 1) |
232 | buf.append(join(multiPrediction) + "\n"); |
233 | } |
234 | |
235 | advisorShow(buf.toString()); |
236 | print((now()-startTime) + " ms"); |
237 | } catch (Throwable e) { |
238 | e.printStackTrace(); |
239 | // TODO: use "error" font :)))) |
240 | advisorShow(e.toString()); |
241 | } |
242 | } |
243 | |
244 | static L<S> codeTokensOnly(L<S> tok) { |
245 | new L<S> l; |
246 | for (int i = 1; i < tok.size(); i += 2) |
247 | l.add(tok.get(i)); |
248 | return l; |
249 | } |
250 | |
251 | !include #1001014 // ScalablePane |
252 | |
253 | static JComponent makeAnimation() ctex { |
254 | JLabel label = new JLabel(new ImageIcon(loadLibrary("#1001015").toURI().toURL())); |
255 | label.setText("Loading predictor..."); |
256 | label.setVerticalTextPosition(SwingConstants.BOTTOM); |
257 | label.setHorizontalTextPosition(SwingConstants.CENTER); |
258 | /*label.setBackground(Color.white); |
259 | label.setOpaque(true);*/ |
260 | return label; |
261 | //return new ScalablePane(ImageIO.read(loadLibrary("#1001013"))); |
262 | } |
263 | |
264 | svoid github(S githubPath) ctex { |
265 | S url = "https://github.com/" + githubPath + "/archive/master.zip"; |
266 | S found = findSnippetNamed("Data: " + url); |
267 | print("Found: " + found); |
268 | if (found != null) |
269 | corpusID = found; |
270 | else { |
271 | S addURL = "http://tinybrain.de:8080/tb-int/add_snippet.php"; |
272 | S query = "type=37&high=1&public=1&url=" + urlencode(url); |
273 | corpusID = doPost(query, addURL); |
274 | print(corpusID); |
275 | if (!isSnippetID(corpusID)) { |
276 | print("Github upload failed"); |
277 | corpusID = null; |
278 | } |
279 | } |
280 | } |
Began life as a copy of #1001004
download show line numbers debug dex old transpilations
Travelled to 16 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, ddnzoavkxhuk, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, teubizvjbppd, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1001018 |
Snippet name: | Swing: Snippet editor with predictor (v2, with github support) |
Eternal ID of this version: | #1001018/1 |
Text MD5: | dc3261dbf3811e6631d759a6532e99d2 |
Transpilation MD5: | 0f77729a01a703e70582a31d66ff51ee |
Author: | stefan |
Category: | javax |
Type: | JavaX source code |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2016-06-15 14:28:30 |
Source code size: | 8127 bytes / 280 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 699 / 829 |
Referenced in: | [show references] |