Skip to content

Commit f46ed63

Browse files
committed
Добавлены JTextArea и JScrollPane
1 parent 090f3a5 commit f46ed63

File tree

6 files changed

+274
-1
lines changed

6 files changed

+274
-1
lines changed

examples/forms/textarea.own

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use ["std", "forms", "functional"]
2+
3+
text = join(map(range(1, 16), def(x) = "line " + x), "\n")
4+
label = newLabel()
5+
textArea = newTextArea(text)
6+
textArea.addCaretListener(def(event) = updateInfo())
7+
textArea.addDocumentListener(def(type, event) = updateInfo())
8+
updateInfo()
9+
10+
def updateInfo() {
11+
text = "Text length: " + textArea.getText().length
12+
text += ", lines: " + textArea.getLineCount()
13+
selectedText = default(textArea.getSelectedText(), "")
14+
if (!selectedText.isEmpty()) {
15+
text += ", selected: " + selectedText.length
16+
}
17+
label.setText(text)
18+
}
19+
20+
window = newWindow("JTextArea example")
21+
window.add(newScrollPane(textArea), BorderLayout.CENTER)
22+
window.add(label, BorderLayout.SOUTH)
23+
window.setSize(300, 200)
24+
window.setLocationByPlatform()
25+
window.setVisible()

src/main/java/com/annimon/ownlang/modules/forms/Components.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import com.annimon.ownlang.lib.Arguments;
44
import com.annimon.ownlang.lib.Value;
5+
import java.awt.Component;
56
import javax.swing.JButton;
67
import javax.swing.JFrame;
78
import javax.swing.JLabel;
89
import javax.swing.JPanel;
910
import javax.swing.JProgressBar;
11+
import javax.swing.JScrollPane;
1012
import javax.swing.JTextArea;
1113
import javax.swing.JTextField;
1214
import javax.swing.SwingConstants;
@@ -64,6 +66,28 @@ static Value newTextField(Value[] args) {
6466
return new JTextFieldValue(new JTextField(text, cols));
6567
}
6668

69+
static Value newTextArea(Value[] args) {
70+
Arguments.checkRange(0, 3, args.length);
71+
String text = "";
72+
int rows = 0;
73+
int cols = 0;
74+
switch (args.length) {
75+
case 1: {
76+
text = args[0].asString();
77+
} break;
78+
case 2: {
79+
rows = args[0].asInt();
80+
cols = args[1].asInt();
81+
} break;
82+
case 3: {
83+
text = args[0].asString();
84+
rows = args[1].asInt();
85+
cols = args[2].asInt();
86+
} break;
87+
}
88+
return new JTextAreaValue(new JTextArea(text, rows, cols));
89+
}
90+
6791
static Value newProgressBar(Value[] args) {
6892
Arguments.checkRange(0, 3, args.length);
6993
boolean isVertical = false;
@@ -88,4 +112,28 @@ static Value newProgressBar(Value[] args) {
88112
min, max
89113
));
90114
}
115+
116+
static Value newScrollPane(Value[] args) {
117+
Arguments.checkRange(0, 3, args.length);
118+
Component view = null;
119+
int vsbPolicy = JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED;
120+
int hsbPolicy = JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED;
121+
switch (args.length) {
122+
case 1: {
123+
view = ((ComponentValue) args[0]).component;
124+
} break;
125+
case 2: {
126+
vsbPolicy = args[0].asInt();
127+
hsbPolicy = args[1].asInt();
128+
} break;
129+
case 3: {
130+
view = ((ComponentValue) args[0]).component;
131+
vsbPolicy = args[1].asInt();
132+
hsbPolicy = args[2].asInt();
133+
} break;
134+
}
135+
return new JScrollPaneValue(new JScrollPane(
136+
view, vsbPolicy, hsbPolicy
137+
));
138+
}
91139
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.annimon.ownlang.modules.forms;
2+
3+
import com.annimon.ownlang.lib.Arguments;
4+
import static com.annimon.ownlang.lib.Converters.*;
5+
import com.annimon.ownlang.lib.FunctionValue;
6+
import com.annimon.ownlang.lib.NumberValue;
7+
import com.annimon.ownlang.lib.Value;
8+
import javax.swing.JScrollPane;
9+
10+
public class JScrollPaneValue extends JComponentValue {
11+
12+
final JScrollPane scrollPane;
13+
14+
public JScrollPaneValue(JScrollPane scrollPane) {
15+
super(10, scrollPane);
16+
this.scrollPane = scrollPane;
17+
init();
18+
}
19+
20+
private void init() {
21+
set("getHorizontalScrollBarPolicy", voidToInt(scrollPane::getHorizontalScrollBarPolicy));
22+
set("getVerticalScrollBarPolicy", voidToInt(scrollPane::getVerticalScrollBarPolicy));
23+
set("isWheelScrollingEnabled", voidToBoolean(scrollPane::isWheelScrollingEnabled));
24+
set("setColumnHeaderView", new FunctionValue(this::setColumnHeaderView));
25+
set("setCorner", new FunctionValue(this::setCorner));
26+
set("setHorizontalScrollBarPolicy", intToVoid(scrollPane::setHorizontalScrollBarPolicy));
27+
set("setRowHeaderView", new FunctionValue(this::setRowHeaderView));
28+
set("setVerticalScrollBarPolicy", intToVoid(scrollPane::setVerticalScrollBarPolicy));
29+
set("setViewportView", new FunctionValue(this::setViewportView));
30+
set("setWheelScrollingEnabled", booleanToVoid(scrollPane::setWheelScrollingEnabled));
31+
}
32+
33+
private Value setViewportView(Value[] args) {
34+
Arguments.check(1, args.length);
35+
scrollPane.setViewportView(((ComponentValue) args[0]).component);
36+
return NumberValue.ZERO;
37+
}
38+
39+
private Value setRowHeaderView(Value[] args) {
40+
Arguments.check(1, args.length);
41+
scrollPane.setRowHeaderView(((ComponentValue) args[0]).component);
42+
return NumberValue.ZERO;
43+
}
44+
45+
private Value setColumnHeaderView(Value[] args) {
46+
Arguments.check(1, args.length);
47+
scrollPane.setColumnHeaderView(((ComponentValue) args[0]).component);
48+
return NumberValue.ZERO;
49+
}
50+
51+
private Value setCorner(Value[] args) {
52+
Arguments.check(2, args.length);
53+
scrollPane.setCorner(args[0].asString(), ((ComponentValue) args[1]).component);
54+
return NumberValue.ZERO;
55+
}
56+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.annimon.ownlang.modules.forms;
2+
3+
import com.annimon.ownlang.lib.Arguments;
4+
import static com.annimon.ownlang.lib.Converters.*;
5+
import com.annimon.ownlang.lib.FunctionValue;
6+
import com.annimon.ownlang.lib.NumberValue;
7+
import com.annimon.ownlang.lib.Value;
8+
import javax.swing.JTextArea;
9+
import javax.swing.text.BadLocationException;
10+
11+
public class JTextAreaValue extends JTextComponentValue {
12+
13+
private final JTextArea textArea;
14+
15+
public JTextAreaValue(JTextArea textArea) {
16+
super(18, textArea);
17+
this.textArea = textArea;
18+
init();
19+
}
20+
21+
private void init() {
22+
set("append", stringToVoid(textArea::append));
23+
set("getColumns", voidToInt(textArea::getColumns));
24+
set("getLineCount", voidToInt(textArea::getLineCount));
25+
set("getLineStartOffset", offsetFunction(textArea::getLineStartOffset));
26+
set("getLineEndOffset", offsetFunction(textArea::getLineEndOffset));
27+
set("getLineOfOffset", offsetFunction(textArea::getLineOfOffset));
28+
set("getLineWrap", voidToBoolean(textArea::getLineWrap));
29+
set("getWrapStyleWord", voidToBoolean(textArea::getWrapStyleWord));
30+
set("getRows", voidToInt(textArea::getRows));
31+
set("getColumns", voidToInt(textArea::getColumns));
32+
set("getTabSize", voidToInt(textArea::getTabSize));
33+
set("insert", this::insert);
34+
set("setRows", intToVoid(textArea::setRows));
35+
set("setColumns", intToVoid(textArea::setColumns));
36+
set("setTabSize", intToVoid(textArea::setTabSize));
37+
set("setLineWrap", booleanToVoid(textArea::setLineWrap));
38+
set("setWrapStyleWord", booleanToVoid(textArea::setWrapStyleWord));
39+
}
40+
41+
private Value insert(Value[] args) {
42+
Arguments.check(2, args.length);
43+
textArea.insert(args[0].asString(), args[1].asInt());
44+
return NumberValue.ZERO;
45+
}
46+
47+
private interface OffsetFunction {
48+
int accept(int line) throws BadLocationException;
49+
}
50+
51+
private FunctionValue offsetFunction(OffsetFunction f) {
52+
return new FunctionValue(args -> {
53+
Arguments.check(1, args.length);
54+
try {
55+
int result = f.accept(args[0].asInt());
56+
return NumberValue.of(result);
57+
} catch (BadLocationException ex) {
58+
throw new RuntimeException(ex);
59+
}
60+
});
61+
}
62+
}

src/main/java/com/annimon/ownlang/modules/forms/JTextComponentValue.java

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,31 @@
11
package com.annimon.ownlang.modules.forms;
22

3+
import com.annimon.ownlang.lib.Arguments;
34
import static com.annimon.ownlang.lib.Converters.*;
5+
import com.annimon.ownlang.lib.Function;
6+
import com.annimon.ownlang.lib.MapValue;
7+
import com.annimon.ownlang.lib.NumberValue;
8+
import com.annimon.ownlang.lib.StringValue;
9+
import com.annimon.ownlang.lib.Value;
10+
import com.annimon.ownlang.lib.ValueUtils;
11+
import javax.swing.event.CaretEvent;
12+
import javax.swing.event.DocumentEvent;
13+
import javax.swing.event.DocumentListener;
414
import javax.swing.text.JTextComponent;
515

616
public class JTextComponentValue extends JComponentValue {
717

818
private final JTextComponent textComponent;
919

1020
public JTextComponentValue(int functionsCount, JTextComponent textComponent) {
11-
super(functionsCount + 20, textComponent);
21+
super(functionsCount + 21, textComponent);
1222
this.textComponent = textComponent;
1323
init();
1424
}
1525

1626
private void init() {
27+
set("addCaretListener", this::addCaretListener);
28+
set("addDocumentListener", this::addDocumentListener);
1729
set("copy", voidToVoid(textComponent::copy));
1830
set("cut", voidToVoid(textComponent::cut));
1931
set("getCaretPosition", voidToInt(textComponent::getCaretPosition));
@@ -35,4 +47,46 @@ private void init() {
3547
set("setSelectionEnd", intToVoid(textComponent::setSelectionEnd));
3648
set("setText", stringToVoid(textComponent::setText));
3749
}
50+
51+
private Value addCaretListener(Value[] args) {
52+
Arguments.check(1, args.length);
53+
final Function action = ValueUtils.consumeFunction(args[0], 0);
54+
textComponent.addCaretListener((CaretEvent e) -> {
55+
final MapValue map = new MapValue(2);
56+
map.set("getDot", NumberValue.of(e.getDot()));
57+
map.set("getMark", NumberValue.of(e.getMark()));
58+
action.execute(map);
59+
});
60+
return NumberValue.ZERO;
61+
}
62+
63+
private Value addDocumentListener(Value[] args) {
64+
Arguments.check(1, args.length);
65+
final Function action = ValueUtils.consumeFunction(args[0], 0);
66+
textComponent.getDocument().addDocumentListener(new DocumentListener() {
67+
@Override
68+
public void insertUpdate(DocumentEvent e) {
69+
handleDocumentEvent(DocumentEvent.EventType.INSERT, e);
70+
}
71+
72+
@Override
73+
public void removeUpdate(DocumentEvent e) {
74+
handleDocumentEvent(DocumentEvent.EventType.REMOVE, e);
75+
}
76+
77+
@Override
78+
public void changedUpdate(DocumentEvent e) {
79+
handleDocumentEvent(DocumentEvent.EventType.CHANGE, e);
80+
}
81+
82+
private void handleDocumentEvent(DocumentEvent.EventType type, final DocumentEvent e) {
83+
final MapValue map = new MapValue(3);
84+
map.set("getLength", NumberValue.of(e.getLength()));
85+
map.set("getOffset", NumberValue.of(e.getOffset()));
86+
map.set("getType", new StringValue(e.getType().toString()));
87+
action.execute(new StringValue(type.toString()), map);
88+
}
89+
});
90+
return NumberValue.ZERO;
91+
}
3892
}

src/main/java/com/annimon/ownlang/modules/forms/forms.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.awt.BorderLayout;
66
import javax.swing.BoxLayout;
77
import javax.swing.JFrame;
8+
import javax.swing.ScrollPaneConstants;
89
import javax.swing.SwingConstants;
910

1011
/**
@@ -59,6 +60,31 @@ public static void initConstants() {
5960
border.set("SOUTH", new StringValue(BorderLayout.SOUTH));
6061
border.set("WEST", new StringValue(BorderLayout.WEST));
6162
Variables.define("BorderLayout", border);
63+
64+
// ScrollPane constants
65+
final MapValue scrollpane = new MapValue(13);
66+
scrollpane.set("COLUMN_HEADER", new StringValue(ScrollPaneConstants.COLUMN_HEADER));
67+
scrollpane.set("HORIZONTAL_SCROLLBAR", new StringValue(ScrollPaneConstants.HORIZONTAL_SCROLLBAR));
68+
scrollpane.set("HORIZONTAL_SCROLLBAR_POLICY", new StringValue(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_POLICY));
69+
scrollpane.set("LOWER_LEADING_CORNER", new StringValue(ScrollPaneConstants.LOWER_LEADING_CORNER));
70+
scrollpane.set("LOWER_LEFT_CORNER", new StringValue(ScrollPaneConstants.LOWER_LEFT_CORNER));
71+
scrollpane.set("LOWER_RIGHT_CORNER", new StringValue(ScrollPaneConstants.LOWER_RIGHT_CORNER));
72+
scrollpane.set("LOWER_TRAILING_CORNER", new StringValue(ScrollPaneConstants.LOWER_TRAILING_CORNER));
73+
scrollpane.set("ROW_HEADER", new StringValue(ScrollPaneConstants.ROW_HEADER));
74+
scrollpane.set("UPPER_LEADING_CORNER", new StringValue(ScrollPaneConstants.UPPER_LEADING_CORNER));
75+
scrollpane.set("UPPER_LEFT_CORNER", new StringValue(ScrollPaneConstants.UPPER_LEFT_CORNER));
76+
scrollpane.set("UPPER_RIGHT_CORNER", new StringValue(ScrollPaneConstants.UPPER_RIGHT_CORNER));
77+
scrollpane.set("UPPER_TRAILING_CORNER", new StringValue(ScrollPaneConstants.UPPER_TRAILING_CORNER));
78+
scrollpane.set("VERTICAL_SCROLLBAR", new StringValue(ScrollPaneConstants.VERTICAL_SCROLLBAR));
79+
scrollpane.set("VERTICAL_SCROLLBAR_POLICY", new StringValue(ScrollPaneConstants.VERTICAL_SCROLLBAR_POLICY));
80+
scrollpane.set("VIEWPORT", new StringValue(ScrollPaneConstants.VIEWPORT));
81+
scrollpane.set("HORIZONTAL_SCROLLBAR_ALWAYS", NumberValue.of(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS));
82+
scrollpane.set("HORIZONTAL_SCROLLBAR_AS_NEEDED", NumberValue.of(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
83+
scrollpane.set("HORIZONTAL_SCROLLBAR_NEVER", NumberValue.of(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER));
84+
scrollpane.set("VERTICAL_SCROLLBAR_ALWAYS", NumberValue.of(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS));
85+
scrollpane.set("VERTICAL_SCROLLBAR_AS_NEEDED", NumberValue.of(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED));
86+
scrollpane.set("VERTICAL_SCROLLBAR_NEVER", NumberValue.of(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER));
87+
Variables.define("ScrollPaneConstants", scrollpane);
6288

6389
final MapValue box = new MapValue(4);
6490
box.set("LINE_AXIS", NumberValue.of(BoxLayout.LINE_AXIS));
@@ -76,6 +102,8 @@ public void init() {
76102
Functions.set("newLabel", Components::newLabel);
77103
Functions.set("newPanel", Components::newPanel);
78104
Functions.set("newProgressBar", Components::newProgressBar);
105+
Functions.set("newScrollPane", Components::newScrollPane);
106+
Functions.set("newTextArea", Components::newTextArea);
79107
Functions.set("newTextField", Components::newTextField);
80108
Functions.set("newWindow", Components::newWindow);
81109

0 commit comments

Comments
 (0)