Добавлены JTextArea и JScrollPane

This commit is contained in:
Victor 2019-10-08 21:55:44 +03:00
parent 090f3a5a70
commit f46ed638bf
6 changed files with 274 additions and 1 deletions

View 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()

View File

@ -2,11 +2,13 @@ package com.annimon.ownlang.modules.forms;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Value;
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
@ -64,6 +66,28 @@ public final class Components {
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) {
Arguments.checkRange(0, 3, args.length);
boolean isVertical = false;
@ -88,4 +112,28 @@ public final class Components {
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
));
}
}

View File

@ -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;
}
}

View File

@ -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);
}
});
}
}

View File

@ -1,6 +1,16 @@
package com.annimon.ownlang.modules.forms;
import com.annimon.ownlang.lib.Arguments;
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;
public class JTextComponentValue extends JComponentValue {
@ -8,12 +18,14 @@ public class JTextComponentValue extends JComponentValue {
private final JTextComponent textComponent;
public JTextComponentValue(int functionsCount, JTextComponent textComponent) {
super(functionsCount + 20, textComponent);
super(functionsCount + 21, textComponent);
this.textComponent = textComponent;
init();
}
private void init() {
set("addCaretListener", this::addCaretListener);
set("addDocumentListener", this::addDocumentListener);
set("copy", voidToVoid(textComponent::copy));
set("cut", voidToVoid(textComponent::cut));
set("getCaretPosition", voidToInt(textComponent::getCaretPosition));
@ -35,4 +47,46 @@ public class JTextComponentValue extends JComponentValue {
set("setSelectionEnd", intToVoid(textComponent::setSelectionEnd));
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;
}
}

View File

@ -5,6 +5,7 @@ import com.annimon.ownlang.modules.Module;
import java.awt.BorderLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
/**
@ -59,6 +60,31 @@ public final class forms implements Module {
border.set("SOUTH", new StringValue(BorderLayout.SOUTH));
border.set("WEST", new StringValue(BorderLayout.WEST));
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);
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("newPanel", Components::newPanel);
Functions.set("newProgressBar", Components::newProgressBar);
Functions.set("newScrollPane", Components::newScrollPane);
Functions.set("newTextArea", Components::newTextArea);
Functions.set("newTextField", Components::newTextField);
Functions.set("newWindow", Components::newWindow);