15
15
import javafx .stage .FileChooser ;
16
16
import org .fxmisc .richtext .CodeArea ;
17
17
import org .fxmisc .richtext .LineNumberFactory ;
18
+ import org .fxmisc .richtext .model .StyleSpans ;
19
+ import org .fxmisc .richtext .model .StyleSpansBuilder ;
18
20
19
21
import java .io .BufferedReader ;
20
22
import java .io .File ;
21
23
import java .io .FileReader ;
22
24
import java .nio .charset .Charset ;
23
25
import java .nio .charset .StandardCharsets ;
24
26
import java .util .ArrayList ;
27
+ import java .util .Collection ;
28
+ import java .util .Collections ;
25
29
import java .util .Objects ;
30
+ import java .util .regex .Matcher ;
26
31
import java .util .regex .Pattern ;
27
32
28
33
public class IDEController {
@@ -42,15 +47,17 @@ public class IDEController {
42
47
private static final String CONSTRAINTS_PATTERN = "\\ b(" + String .join ("|" , Analyzer .getConstraints ()) + ")\\ b" ;
43
48
private static final String FUNCTIONS_PATTERN = "\\ b(" + String .join ("|" , Analyzer .getFunctions ()) + ")\\ b" ;
44
49
private static final String PAREN_PATTERN = "\\ (|\\ )" ;
50
+ private static final String COMPARATORS_PATTERN = "\\ b(" + String .join ("|" , Analyzer .getComparators ()) + ")\\ b" ;
45
51
private static final String SEMICOLON_PATTERN = "\\ ;" ;
46
- private static final String STRING_PATTERN = "\" ([^'\\ \\ ]|\\ \\ .)*'" ;
52
+ private static final String STRING_PATTERN = "' ([^'\\ \\ ]|\\ \\ .)*'" ;
47
53
48
54
private static final Pattern PATTERN = Pattern .compile (
49
55
"(?<KEYWORD>" + KEYWORD_PATTERN + ")"
56
+ + "|(?<PAREN>" + PAREN_PATTERN + ")"
50
57
+ "|(?<DATATYPE>" + DATATYPES_PATTERN + ")"
51
58
+ "|(?<CONSTRAINT>" + CONSTRAINTS_PATTERN + ")"
52
59
+ "|(?<FUNCTION>" + FUNCTIONS_PATTERN + ")"
53
- + "|(?<PAREN >" + PAREN_PATTERN + ")"
60
+ + "|(?<COMPARATOR >" + COMPARATORS_PATTERN + ")"
54
61
+ "|(?<SEMICOLON>" + SEMICOLON_PATTERN + ")"
55
62
+ "|(?<STRING>" + STRING_PATTERN + ")"
56
63
);
@@ -67,6 +74,12 @@ protected void initialize() {
67
74
}
68
75
});
69
76
77
+ codeArea .richChanges ()
78
+ .filter (ch -> !ch .getInserted ().equals (ch .getRemoved ()))
79
+ .subscribe (change -> {
80
+ codeArea .setStyleSpans (0 , computeHighlighting (codeArea .getText ()));
81
+ });
82
+ codeArea .getStyleClass ().add ("area" );
70
83
}
71
84
72
85
@ FXML
@@ -163,6 +176,32 @@ protected void executeSelectedStatement(ActionEvent event) {
163
176
}
164
177
}
165
178
179
+ private StyleSpans <Collection <String >> computeHighlighting (String text ) {
180
+ text = text .toUpperCase ();
181
+ Matcher matcher = PATTERN .matcher (text );
182
+ int lastKwEnd = 0 ;
183
+ StyleSpansBuilder <Collection <String >> spansBuilder = new StyleSpansBuilder <>();
184
+
185
+ while (matcher .find ()) {
186
+ String styleClass =
187
+ matcher .group ("KEYWORD" ) != null ? "keyword" :
188
+ matcher .group ("DATATYPE" ) != null ? "datatype" :
189
+ matcher .group ("CONSTRAINT" ) != null ? "constraint" :
190
+ matcher .group ("FUNCTION" ) != null ? "function" :
191
+ matcher .group ("COMPARATOR" ) != null ? "comparator" :
192
+ matcher .group ("PAREN" ) != null ? "paren" :
193
+ matcher .group ("SEMICOLON" ) != null ? "semicolon" :
194
+ matcher .group ("STRING" ) != null ? "string" :
195
+ null ; /* never happens */ assert styleClass != null ;
196
+ spansBuilder .add (Collections .emptyList (), matcher .start () - lastKwEnd );
197
+ spansBuilder .add (Collections .singleton (styleClass ), matcher .end () - matcher .start ());
198
+ lastKwEnd = matcher .end ();
199
+ }
200
+ spansBuilder .add (Collections .emptyList (), text .length () - lastKwEnd );
201
+ return spansBuilder .create ();
202
+ }
203
+
204
+
166
205
/**
167
206
* Aquí mando toda la basura de mensajes de excepciones para que se impriman en el tab de logs
168
207
* @param errorMessage
0 commit comments