15
15
import java .util .function .Supplier ;
16
16
import java .util .function .UnaryOperator ;
17
17
18
+ import org .fxmisc .richtext .model .Paragraph ;
19
+ import org .fxmisc .richtext .model .StyledSegment ;
20
+ import org .reactfx .util .Tuple2 ;
21
+ import org .reactfx .util .Tuples ;
22
+ import org .reactfx .value .Val ;
23
+
18
24
import javafx .beans .property .ObjectProperty ;
19
25
import javafx .beans .property .SimpleObjectProperty ;
20
- import javafx .beans .value .ChangeListener ;
21
26
import javafx .collections .FXCollections ;
22
27
import javafx .collections .MapChangeListener ;
23
28
import javafx .collections .ObservableMap ;
34
39
import javafx .scene .shape .Path ;
35
40
import javafx .scene .shape .PathElement ;
36
41
import javafx .scene .shape .StrokeLineCap ;
37
-
38
42
import javafx .scene .shape .StrokeType ;
39
- import org .fxmisc .richtext .model .Paragraph ;
40
- import org .fxmisc .richtext .model .StyledSegment ;
41
- import org .reactfx .util .Tuple2 ;
42
- import org .reactfx .util .Tuples ;
43
- import org .reactfx .value .Val ;
44
43
45
44
/**
46
45
* The class responsible for rendering the segments in an paragraph. It also renders additional RichTextFX-specific
@@ -59,8 +58,8 @@ class ParagraphText<PS, SEG, S> extends TextFlowExt {
59
58
FXCollections .observableMap (new HashMap <>(1 ));
60
59
public final ObservableMap <Selection <PS , SEG , S >, SelectionPath > selectionsProperty () { return selections ; }
61
60
62
- private final ChangeListener < IndexRange > selectionRangeListener ;
63
- private final ChangeListener < Integer > caretPositionListener ;
61
+ private final MapChangeListener <? super Selection < PS , SEG , S >, ? super SelectionPath > selectionPathListener ;
62
+ private final SetChangeListener <? super CaretNode > caretNodeListener ;
64
63
65
64
// FIXME: changing it currently has not effect, because
66
65
// Text.impl_selectionFillProperty().set(newFill) doesn't work
@@ -95,47 +94,47 @@ public ObjectProperty<Paint> highlightTextFillProperty() {
95
94
Val <Double > leftInset = Val .map (insetsProperty (), Insets ::getLeft );
96
95
Val <Double > topInset = Val .map (insetsProperty (), Insets ::getTop );
97
96
98
- selectionRangeListener = (obs , ov , nv ) -> requestLayout ();
99
- selections .addListener ((MapChangeListener .Change <? extends Selection <PS , SEG , S >, ? extends SelectionPath > change ) -> {
97
+ selectionPathListener = change -> {
100
98
if (change .wasRemoved ()) {
101
99
SelectionPath p = change .getValueRemoved ();
102
- p .rangeProperty ().removeListener (selectionRangeListener );
100
+ p .rangeProperty ().removeListener ( ( obs , ov , nv ) -> requestLayout () );
103
101
p .layoutXProperty ().unbind ();
104
102
p .layoutYProperty ().unbind ();
105
103
106
104
getChildren ().remove (p );
107
105
}
108
106
if (change .wasAdded ()) {
109
107
SelectionPath p = change .getValueAdded ();
110
- p .rangeProperty ().addListener (selectionRangeListener );
108
+ p .rangeProperty ().addListener ( ( obs , ov , nv ) -> requestLayout () );
111
109
p .layoutXProperty ().bind (leftInset );
112
110
p .layoutYProperty ().bind (topInset );
113
111
114
112
getChildren ().add (selectionShapeStartIndex , p );
115
113
updateSingleSelection (p );
116
114
}
117
- });
115
+ };
116
+ selections .addListener ( selectionPathListener );
118
117
119
- caretPositionListener = (obs , ov , nv ) -> requestLayout ();
120
- carets .addListener ((SetChangeListener .Change <? extends CaretNode > change ) -> {
118
+ caretNodeListener = change -> {
121
119
if (change .wasRemoved ()) {
122
120
CaretNode caret = change .getElementRemoved ();
123
- caret .columnPositionProperty ().removeListener (caretPositionListener );
121
+ caret .columnPositionProperty ().removeListener ( ( obs , ov , nv ) -> requestLayout () );
124
122
caret .layoutXProperty ().unbind ();
125
123
caret .layoutYProperty ().unbind ();
126
124
127
125
getChildren ().remove (caret );
128
126
}
129
127
if (change .wasAdded ()) {
130
128
CaretNode caret = change .getElementAdded ();
131
- caret .columnPositionProperty ().addListener (caretPositionListener );
129
+ caret .columnPositionProperty ().addListener ( ( obs , ov , nv ) -> requestLayout () );
132
130
caret .layoutXProperty ().bind (leftInset );
133
131
caret .layoutYProperty ().bind (topInset );
134
132
135
133
getChildren ().add (caret );
136
134
updateSingleCaret (caret );
137
135
}
138
- });
136
+ };
137
+ carets .addListener ( caretNodeListener );
139
138
140
139
// XXX: see the note at highlightTextFill
141
140
// highlightTextFill.addListener(new ChangeListener<Paint>() {
@@ -220,6 +219,8 @@ public ObjectProperty<Paint> highlightTextFillProperty() {
220
219
221
220
void dispose () {
222
221
// this removes listeners (in selections and carets listeners) and avoids memory leaks
222
+ selections .removeListener ( selectionPathListener );
223
+ carets .removeListener ( caretNodeListener );
223
224
selections .clear ();
224
225
carets .clear ();
225
226
}
0 commit comments