mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Добавлены JTextArea и JScrollPane
This commit is contained in:
parent
090f3a5a70
commit
f46ed638bf
25
examples/forms/textarea.own
Normal file
25
examples/forms/textarea.own
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
use ["std", "forms", "functional"]
|
||||||
|
|
||||||
|
text = join(map(range(1, 16), def(x) = "line " + x), "\n")
|
||||||
|
label = newLabel()
|
||||||
|
textArea = newTextArea(text)
|
||||||
|
textArea.addCaretListener(def(event) = updateInfo())
|
||||||
|
textArea.addDocumentListener(def(type, event) = updateInfo())
|
||||||
|
updateInfo()
|
||||||
|
|
||||||
|
def updateInfo() {
|
||||||
|
text = "Text length: " + textArea.getText().length
|
||||||
|
text += ", lines: " + textArea.getLineCount()
|
||||||
|
selectedText = default(textArea.getSelectedText(), "")
|
||||||
|
if (!selectedText.isEmpty()) {
|
||||||
|
text += ", selected: " + selectedText.length
|
||||||
|
}
|
||||||
|
label.setText(text)
|
||||||
|
}
|
||||||
|
|
||||||
|
window = newWindow("JTextArea example")
|
||||||
|
window.add(newScrollPane(textArea), BorderLayout.CENTER)
|
||||||
|
window.add(label, BorderLayout.SOUTH)
|
||||||
|
window.setSize(300, 200)
|
||||||
|
window.setLocationByPlatform()
|
||||||
|
window.setVisible()
|
@ -2,11 +2,13 @@ package com.annimon.ownlang.modules.forms;
|
|||||||
|
|
||||||
import com.annimon.ownlang.lib.Arguments;
|
import com.annimon.ownlang.lib.Arguments;
|
||||||
import com.annimon.ownlang.lib.Value;
|
import com.annimon.ownlang.lib.Value;
|
||||||
|
import java.awt.Component;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.JProgressBar;
|
import javax.swing.JProgressBar;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
import javax.swing.JTextArea;
|
import javax.swing.JTextArea;
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
import javax.swing.SwingConstants;
|
import javax.swing.SwingConstants;
|
||||||
@ -64,6 +66,28 @@ public final class Components {
|
|||||||
return new JTextFieldValue(new JTextField(text, cols));
|
return new JTextFieldValue(new JTextField(text, cols));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Value newTextArea(Value[] args) {
|
||||||
|
Arguments.checkRange(0, 3, args.length);
|
||||||
|
String text = "";
|
||||||
|
int rows = 0;
|
||||||
|
int cols = 0;
|
||||||
|
switch (args.length) {
|
||||||
|
case 1: {
|
||||||
|
text = args[0].asString();
|
||||||
|
} break;
|
||||||
|
case 2: {
|
||||||
|
rows = args[0].asInt();
|
||||||
|
cols = args[1].asInt();
|
||||||
|
} break;
|
||||||
|
case 3: {
|
||||||
|
text = args[0].asString();
|
||||||
|
rows = args[1].asInt();
|
||||||
|
cols = args[2].asInt();
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
return new JTextAreaValue(new JTextArea(text, rows, cols));
|
||||||
|
}
|
||||||
|
|
||||||
static Value newProgressBar(Value[] args) {
|
static Value newProgressBar(Value[] args) {
|
||||||
Arguments.checkRange(0, 3, args.length);
|
Arguments.checkRange(0, 3, args.length);
|
||||||
boolean isVertical = false;
|
boolean isVertical = false;
|
||||||
@ -88,4 +112,28 @@ public final class Components {
|
|||||||
min, max
|
min, max
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Value newScrollPane(Value[] args) {
|
||||||
|
Arguments.checkRange(0, 3, args.length);
|
||||||
|
Component view = null;
|
||||||
|
int vsbPolicy = JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED;
|
||||||
|
int hsbPolicy = JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED;
|
||||||
|
switch (args.length) {
|
||||||
|
case 1: {
|
||||||
|
view = ((ComponentValue) args[0]).component;
|
||||||
|
} break;
|
||||||
|
case 2: {
|
||||||
|
vsbPolicy = args[0].asInt();
|
||||||
|
hsbPolicy = args[1].asInt();
|
||||||
|
} break;
|
||||||
|
case 3: {
|
||||||
|
view = ((ComponentValue) args[0]).component;
|
||||||
|
vsbPolicy = args[1].asInt();
|
||||||
|
hsbPolicy = args[2].asInt();
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
return new JScrollPaneValue(new JScrollPane(
|
||||||
|
view, vsbPolicy, hsbPolicy
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
package com.annimon.ownlang.modules.forms;
|
||||||
|
|
||||||
|
import com.annimon.ownlang.lib.Arguments;
|
||||||
|
import static com.annimon.ownlang.lib.Converters.*;
|
||||||
|
import com.annimon.ownlang.lib.FunctionValue;
|
||||||
|
import com.annimon.ownlang.lib.NumberValue;
|
||||||
|
import com.annimon.ownlang.lib.Value;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
|
|
||||||
|
public class JScrollPaneValue extends JComponentValue {
|
||||||
|
|
||||||
|
final JScrollPane scrollPane;
|
||||||
|
|
||||||
|
public JScrollPaneValue(JScrollPane scrollPane) {
|
||||||
|
super(10, scrollPane);
|
||||||
|
this.scrollPane = scrollPane;
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init() {
|
||||||
|
set("getHorizontalScrollBarPolicy", voidToInt(scrollPane::getHorizontalScrollBarPolicy));
|
||||||
|
set("getVerticalScrollBarPolicy", voidToInt(scrollPane::getVerticalScrollBarPolicy));
|
||||||
|
set("isWheelScrollingEnabled", voidToBoolean(scrollPane::isWheelScrollingEnabled));
|
||||||
|
set("setColumnHeaderView", new FunctionValue(this::setColumnHeaderView));
|
||||||
|
set("setCorner", new FunctionValue(this::setCorner));
|
||||||
|
set("setHorizontalScrollBarPolicy", intToVoid(scrollPane::setHorizontalScrollBarPolicy));
|
||||||
|
set("setRowHeaderView", new FunctionValue(this::setRowHeaderView));
|
||||||
|
set("setVerticalScrollBarPolicy", intToVoid(scrollPane::setVerticalScrollBarPolicy));
|
||||||
|
set("setViewportView", new FunctionValue(this::setViewportView));
|
||||||
|
set("setWheelScrollingEnabled", booleanToVoid(scrollPane::setWheelScrollingEnabled));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Value setViewportView(Value[] args) {
|
||||||
|
Arguments.check(1, args.length);
|
||||||
|
scrollPane.setViewportView(((ComponentValue) args[0]).component);
|
||||||
|
return NumberValue.ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Value setRowHeaderView(Value[] args) {
|
||||||
|
Arguments.check(1, args.length);
|
||||||
|
scrollPane.setRowHeaderView(((ComponentValue) args[0]).component);
|
||||||
|
return NumberValue.ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Value setColumnHeaderView(Value[] args) {
|
||||||
|
Arguments.check(1, args.length);
|
||||||
|
scrollPane.setColumnHeaderView(((ComponentValue) args[0]).component);
|
||||||
|
return NumberValue.ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Value setCorner(Value[] args) {
|
||||||
|
Arguments.check(2, args.length);
|
||||||
|
scrollPane.setCorner(args[0].asString(), ((ComponentValue) args[1]).component);
|
||||||
|
return NumberValue.ZERO;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package com.annimon.ownlang.modules.forms;
|
||||||
|
|
||||||
|
import com.annimon.ownlang.lib.Arguments;
|
||||||
|
import static com.annimon.ownlang.lib.Converters.*;
|
||||||
|
import com.annimon.ownlang.lib.FunctionValue;
|
||||||
|
import com.annimon.ownlang.lib.NumberValue;
|
||||||
|
import com.annimon.ownlang.lib.Value;
|
||||||
|
import javax.swing.JTextArea;
|
||||||
|
import javax.swing.text.BadLocationException;
|
||||||
|
|
||||||
|
public class JTextAreaValue extends JTextComponentValue {
|
||||||
|
|
||||||
|
private final JTextArea textArea;
|
||||||
|
|
||||||
|
public JTextAreaValue(JTextArea textArea) {
|
||||||
|
super(18, textArea);
|
||||||
|
this.textArea = textArea;
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init() {
|
||||||
|
set("append", stringToVoid(textArea::append));
|
||||||
|
set("getColumns", voidToInt(textArea::getColumns));
|
||||||
|
set("getLineCount", voidToInt(textArea::getLineCount));
|
||||||
|
set("getLineStartOffset", offsetFunction(textArea::getLineStartOffset));
|
||||||
|
set("getLineEndOffset", offsetFunction(textArea::getLineEndOffset));
|
||||||
|
set("getLineOfOffset", offsetFunction(textArea::getLineOfOffset));
|
||||||
|
set("getLineWrap", voidToBoolean(textArea::getLineWrap));
|
||||||
|
set("getWrapStyleWord", voidToBoolean(textArea::getWrapStyleWord));
|
||||||
|
set("getRows", voidToInt(textArea::getRows));
|
||||||
|
set("getColumns", voidToInt(textArea::getColumns));
|
||||||
|
set("getTabSize", voidToInt(textArea::getTabSize));
|
||||||
|
set("insert", this::insert);
|
||||||
|
set("setRows", intToVoid(textArea::setRows));
|
||||||
|
set("setColumns", intToVoid(textArea::setColumns));
|
||||||
|
set("setTabSize", intToVoid(textArea::setTabSize));
|
||||||
|
set("setLineWrap", booleanToVoid(textArea::setLineWrap));
|
||||||
|
set("setWrapStyleWord", booleanToVoid(textArea::setWrapStyleWord));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Value insert(Value[] args) {
|
||||||
|
Arguments.check(2, args.length);
|
||||||
|
textArea.insert(args[0].asString(), args[1].asInt());
|
||||||
|
return NumberValue.ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
|
private interface OffsetFunction {
|
||||||
|
int accept(int line) throws BadLocationException;
|
||||||
|
}
|
||||||
|
|
||||||
|
private FunctionValue offsetFunction(OffsetFunction f) {
|
||||||
|
return new FunctionValue(args -> {
|
||||||
|
Arguments.check(1, args.length);
|
||||||
|
try {
|
||||||
|
int result = f.accept(args[0].asInt());
|
||||||
|
return NumberValue.of(result);
|
||||||
|
} catch (BadLocationException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,16 @@
|
|||||||
package com.annimon.ownlang.modules.forms;
|
package com.annimon.ownlang.modules.forms;
|
||||||
|
|
||||||
|
import com.annimon.ownlang.lib.Arguments;
|
||||||
import static com.annimon.ownlang.lib.Converters.*;
|
import static com.annimon.ownlang.lib.Converters.*;
|
||||||
|
import com.annimon.ownlang.lib.Function;
|
||||||
|
import com.annimon.ownlang.lib.MapValue;
|
||||||
|
import com.annimon.ownlang.lib.NumberValue;
|
||||||
|
import com.annimon.ownlang.lib.StringValue;
|
||||||
|
import com.annimon.ownlang.lib.Value;
|
||||||
|
import com.annimon.ownlang.lib.ValueUtils;
|
||||||
|
import javax.swing.event.CaretEvent;
|
||||||
|
import javax.swing.event.DocumentEvent;
|
||||||
|
import javax.swing.event.DocumentListener;
|
||||||
import javax.swing.text.JTextComponent;
|
import javax.swing.text.JTextComponent;
|
||||||
|
|
||||||
public class JTextComponentValue extends JComponentValue {
|
public class JTextComponentValue extends JComponentValue {
|
||||||
@ -8,12 +18,14 @@ public class JTextComponentValue extends JComponentValue {
|
|||||||
private final JTextComponent textComponent;
|
private final JTextComponent textComponent;
|
||||||
|
|
||||||
public JTextComponentValue(int functionsCount, JTextComponent textComponent) {
|
public JTextComponentValue(int functionsCount, JTextComponent textComponent) {
|
||||||
super(functionsCount + 20, textComponent);
|
super(functionsCount + 21, textComponent);
|
||||||
this.textComponent = textComponent;
|
this.textComponent = textComponent;
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void init() {
|
private void init() {
|
||||||
|
set("addCaretListener", this::addCaretListener);
|
||||||
|
set("addDocumentListener", this::addDocumentListener);
|
||||||
set("copy", voidToVoid(textComponent::copy));
|
set("copy", voidToVoid(textComponent::copy));
|
||||||
set("cut", voidToVoid(textComponent::cut));
|
set("cut", voidToVoid(textComponent::cut));
|
||||||
set("getCaretPosition", voidToInt(textComponent::getCaretPosition));
|
set("getCaretPosition", voidToInt(textComponent::getCaretPosition));
|
||||||
@ -35,4 +47,46 @@ public class JTextComponentValue extends JComponentValue {
|
|||||||
set("setSelectionEnd", intToVoid(textComponent::setSelectionEnd));
|
set("setSelectionEnd", intToVoid(textComponent::setSelectionEnd));
|
||||||
set("setText", stringToVoid(textComponent::setText));
|
set("setText", stringToVoid(textComponent::setText));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Value addCaretListener(Value[] args) {
|
||||||
|
Arguments.check(1, args.length);
|
||||||
|
final Function action = ValueUtils.consumeFunction(args[0], 0);
|
||||||
|
textComponent.addCaretListener((CaretEvent e) -> {
|
||||||
|
final MapValue map = new MapValue(2);
|
||||||
|
map.set("getDot", NumberValue.of(e.getDot()));
|
||||||
|
map.set("getMark", NumberValue.of(e.getMark()));
|
||||||
|
action.execute(map);
|
||||||
|
});
|
||||||
|
return NumberValue.ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Value addDocumentListener(Value[] args) {
|
||||||
|
Arguments.check(1, args.length);
|
||||||
|
final Function action = ValueUtils.consumeFunction(args[0], 0);
|
||||||
|
textComponent.getDocument().addDocumentListener(new DocumentListener() {
|
||||||
|
@Override
|
||||||
|
public void insertUpdate(DocumentEvent e) {
|
||||||
|
handleDocumentEvent(DocumentEvent.EventType.INSERT, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeUpdate(DocumentEvent e) {
|
||||||
|
handleDocumentEvent(DocumentEvent.EventType.REMOVE, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void changedUpdate(DocumentEvent e) {
|
||||||
|
handleDocumentEvent(DocumentEvent.EventType.CHANGE, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleDocumentEvent(DocumentEvent.EventType type, final DocumentEvent e) {
|
||||||
|
final MapValue map = new MapValue(3);
|
||||||
|
map.set("getLength", NumberValue.of(e.getLength()));
|
||||||
|
map.set("getOffset", NumberValue.of(e.getOffset()));
|
||||||
|
map.set("getType", new StringValue(e.getType().toString()));
|
||||||
|
action.execute(new StringValue(type.toString()), map);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return NumberValue.ZERO;
|
||||||
|
}
|
||||||
}
|
}
|
@ -5,6 +5,7 @@ import com.annimon.ownlang.modules.Module;
|
|||||||
import java.awt.BorderLayout;
|
import java.awt.BorderLayout;
|
||||||
import javax.swing.BoxLayout;
|
import javax.swing.BoxLayout;
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.ScrollPaneConstants;
|
||||||
import javax.swing.SwingConstants;
|
import javax.swing.SwingConstants;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,6 +60,31 @@ public final class forms implements Module {
|
|||||||
border.set("SOUTH", new StringValue(BorderLayout.SOUTH));
|
border.set("SOUTH", new StringValue(BorderLayout.SOUTH));
|
||||||
border.set("WEST", new StringValue(BorderLayout.WEST));
|
border.set("WEST", new StringValue(BorderLayout.WEST));
|
||||||
Variables.define("BorderLayout", border);
|
Variables.define("BorderLayout", border);
|
||||||
|
|
||||||
|
// ScrollPane constants
|
||||||
|
final MapValue scrollpane = new MapValue(13);
|
||||||
|
scrollpane.set("COLUMN_HEADER", new StringValue(ScrollPaneConstants.COLUMN_HEADER));
|
||||||
|
scrollpane.set("HORIZONTAL_SCROLLBAR", new StringValue(ScrollPaneConstants.HORIZONTAL_SCROLLBAR));
|
||||||
|
scrollpane.set("HORIZONTAL_SCROLLBAR_POLICY", new StringValue(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_POLICY));
|
||||||
|
scrollpane.set("LOWER_LEADING_CORNER", new StringValue(ScrollPaneConstants.LOWER_LEADING_CORNER));
|
||||||
|
scrollpane.set("LOWER_LEFT_CORNER", new StringValue(ScrollPaneConstants.LOWER_LEFT_CORNER));
|
||||||
|
scrollpane.set("LOWER_RIGHT_CORNER", new StringValue(ScrollPaneConstants.LOWER_RIGHT_CORNER));
|
||||||
|
scrollpane.set("LOWER_TRAILING_CORNER", new StringValue(ScrollPaneConstants.LOWER_TRAILING_CORNER));
|
||||||
|
scrollpane.set("ROW_HEADER", new StringValue(ScrollPaneConstants.ROW_HEADER));
|
||||||
|
scrollpane.set("UPPER_LEADING_CORNER", new StringValue(ScrollPaneConstants.UPPER_LEADING_CORNER));
|
||||||
|
scrollpane.set("UPPER_LEFT_CORNER", new StringValue(ScrollPaneConstants.UPPER_LEFT_CORNER));
|
||||||
|
scrollpane.set("UPPER_RIGHT_CORNER", new StringValue(ScrollPaneConstants.UPPER_RIGHT_CORNER));
|
||||||
|
scrollpane.set("UPPER_TRAILING_CORNER", new StringValue(ScrollPaneConstants.UPPER_TRAILING_CORNER));
|
||||||
|
scrollpane.set("VERTICAL_SCROLLBAR", new StringValue(ScrollPaneConstants.VERTICAL_SCROLLBAR));
|
||||||
|
scrollpane.set("VERTICAL_SCROLLBAR_POLICY", new StringValue(ScrollPaneConstants.VERTICAL_SCROLLBAR_POLICY));
|
||||||
|
scrollpane.set("VIEWPORT", new StringValue(ScrollPaneConstants.VIEWPORT));
|
||||||
|
scrollpane.set("HORIZONTAL_SCROLLBAR_ALWAYS", NumberValue.of(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS));
|
||||||
|
scrollpane.set("HORIZONTAL_SCROLLBAR_AS_NEEDED", NumberValue.of(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
|
||||||
|
scrollpane.set("HORIZONTAL_SCROLLBAR_NEVER", NumberValue.of(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER));
|
||||||
|
scrollpane.set("VERTICAL_SCROLLBAR_ALWAYS", NumberValue.of(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS));
|
||||||
|
scrollpane.set("VERTICAL_SCROLLBAR_AS_NEEDED", NumberValue.of(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED));
|
||||||
|
scrollpane.set("VERTICAL_SCROLLBAR_NEVER", NumberValue.of(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER));
|
||||||
|
Variables.define("ScrollPaneConstants", scrollpane);
|
||||||
|
|
||||||
final MapValue box = new MapValue(4);
|
final MapValue box = new MapValue(4);
|
||||||
box.set("LINE_AXIS", NumberValue.of(BoxLayout.LINE_AXIS));
|
box.set("LINE_AXIS", NumberValue.of(BoxLayout.LINE_AXIS));
|
||||||
@ -76,6 +102,8 @@ public final class forms implements Module {
|
|||||||
Functions.set("newLabel", Components::newLabel);
|
Functions.set("newLabel", Components::newLabel);
|
||||||
Functions.set("newPanel", Components::newPanel);
|
Functions.set("newPanel", Components::newPanel);
|
||||||
Functions.set("newProgressBar", Components::newProgressBar);
|
Functions.set("newProgressBar", Components::newProgressBar);
|
||||||
|
Functions.set("newScrollPane", Components::newScrollPane);
|
||||||
|
Functions.set("newTextArea", Components::newTextArea);
|
||||||
Functions.set("newTextField", Components::newTextField);
|
Functions.set("newTextField", Components::newTextField);
|
||||||
Functions.set("newWindow", Components::newWindow);
|
Functions.set("newWindow", Components::newWindow);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user