diff --git a/examples/forms/progressbar.own b/examples/forms/progressbar.own new file mode 100644 index 0000000..261587f --- /dev/null +++ b/examples/forms/progressbar.own @@ -0,0 +1,29 @@ +use "forms" + +label = newLabel("Current value: 50") +progressBar = newProgressBar() +progressBar.setValue(50) +progressBar.onChange(def() { + label.setText("Current value: " + progressBar.getValue()) +}) +minusBtn = newButton("-1") +minusBtn.onClick(def() = changeProgress(-1)) +plusBtn = newButton("+1") +plusBtn.onClick(def() = changeProgress(1)) + +def changeProgress(delta) { + value = progressBar.getValue() + delta + if (value > 100) value = 100 + else if (value < 0) value = 0 + progressBar.setValue(value) +} + +window = newWindow("ProgressBar example") +window.add(minusBtn, BorderLayout.WEST) +window.add(progressBar, BorderLayout.CENTER) +window.add(plusBtn, BorderLayout.EAST) +window.add(label, BorderLayout.SOUTH) +window.pack() +window.setLocationByPlatform() +window.setResizable(false) +window.setVisible() \ No newline at end of file diff --git a/src/main/java/com/annimon/ownlang/lib/Converters.java b/src/main/java/com/annimon/ownlang/lib/Converters.java index 3c14435..9415df0 100644 --- a/src/main/java/com/annimon/ownlang/lib/Converters.java +++ b/src/main/java/com/annimon/ownlang/lib/Converters.java @@ -158,6 +158,18 @@ public final class Converters { return NumberValue.ZERO; }); } + + public static FunctionValue intOptToVoid(VoidToVoidFunction f1, IntToVoidFunction f2) { + return new FunctionValue(args -> { + Arguments.checkOrOr(0, 1, args.length); + if (args.length == 0) { + f1.apply(); + } else { + f2.apply(args[0].asInt()); + } + return NumberValue.ZERO; + }); + } public static FunctionValue intToLong(IntToLongFunction f) { return new FunctionValue(args -> { @@ -168,7 +180,7 @@ public final class Converters { public static FunctionValue int2ToVoid(Int2ToVoidFunction f) { return new FunctionValue(args -> { - Arguments.check(4, args.length); + Arguments.check(2, args.length); f.apply(args[0].asInt(), args[1].asInt()); return NumberValue.ZERO; diff --git a/src/main/java/com/annimon/ownlang/modules/forms/Components.java b/src/main/java/com/annimon/ownlang/modules/forms/Components.java index f283e5a..9e2e7d8 100644 --- a/src/main/java/com/annimon/ownlang/modules/forms/Components.java +++ b/src/main/java/com/annimon/ownlang/modules/forms/Components.java @@ -6,6 +6,8 @@ import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingConstants; @@ -16,7 +18,7 @@ public final class Components { private Components() { } - static Value newWindow(Value... args) { + static Value newWindow(Value[] args) { Arguments.checkOrOr(0, 1, args.length); String title = (args.length == 1) ? args[0].asString() : ""; final JFrame frame = new JFrame(title); @@ -24,7 +26,7 @@ public final class Components { return new JFrameValue(frame); } - static Value newPanel(Value... args) { + static Value newPanel(Value[] args) { Arguments.checkOrOr(0, 1, args.length); final JPanel panel = new JPanel(); if (args.length == 1) { @@ -33,22 +35,57 @@ public final class Components { return new JPanelValue(panel); } - static Value newButton(Value... args) { + static Value newButton(Value[] args) { Arguments.checkOrOr(0, 1, args.length); String text = (args.length == 1) ? args[0].asString() : ""; return new JButtonValue(new JButton(text)); } - static Value newLabel(Value... args) { + static Value newLabel(Value[] args) { Arguments.checkRange(0, 2, args.length); String text = (args.length >= 1) ? args[0].asString() : ""; int align = (args.length == 2) ? args[1].asInt() : SwingConstants.LEADING; return new JLabelValue(new JLabel(text, align)); } - static Value newTextField(Value... args) { - Arguments.checkOrOr(0, 1, args.length); - String text = (args.length == 1) ? args[0].asString() : ""; - return new JTextFieldValue(new JTextField(text)); + static Value newTextField(Value[] args) { + Arguments.checkRange(0, 2, args.length); + String text = ""; + int cols = 0; + switch (args.length) { + case 1: { + text = args[0].asString(); + } break; + case 2: { + text = args[0].asString(); + cols = args[1].asInt(); + } break; + } + return new JTextFieldValue(new JTextField(text, cols)); + } + + static Value newProgressBar(Value[] args) { + Arguments.checkRange(0, 3, args.length); + boolean isVertical = false; + int min = 0; + int max = 100; + switch (args.length) { + case 1: { + isVertical = args[0].asInt() != 0; + } break; + case 2: { + min = args[0].asInt(); + max = args[1].asInt(); + } break; + case 3: { + isVertical = args[0].asInt() != 0; + min = args[1].asInt(); + max = args[2].asInt(); + } break; + } + return new JProgressBarValue(new JProgressBar( + isVertical ? SwingConstants.VERTICAL : SwingConstants.HORIZONTAL, + min, max + )); } } diff --git a/src/main/java/com/annimon/ownlang/modules/forms/JProgressBarValue.java b/src/main/java/com/annimon/ownlang/modules/forms/JProgressBarValue.java new file mode 100644 index 0000000..5417e5e --- /dev/null +++ b/src/main/java/com/annimon/ownlang/modules/forms/JProgressBarValue.java @@ -0,0 +1,51 @@ +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.FunctionValue; +import com.annimon.ownlang.lib.NumberValue; +import com.annimon.ownlang.lib.Value; +import com.annimon.ownlang.lib.ValueUtils; +import javax.swing.JProgressBar; + +public class JProgressBarValue extends JComponentValue { + + final JProgressBar progressBar; + + public JProgressBarValue(JProgressBar progressBar) { + super(19, progressBar); + this.progressBar = progressBar; + init(); + } + + private void init() { + set("onChange", new FunctionValue(this::addChangeListener)); + set("addChangeListener", new FunctionValue(this::addChangeListener)); + set("getMinimum", voidToInt(progressBar::getMinimum)); + set("getMaximum", voidToInt(progressBar::getMaximum)); + set("getOrientation", voidToInt(progressBar::getOrientation)); + set("getValue", voidToInt(progressBar::getValue)); + set("isBorderPainted", voidToBoolean(progressBar::isBorderPainted)); + set("isIndeterminate", voidToBoolean(progressBar::isIndeterminate)); + set("isStringPainted", voidToBoolean(progressBar::isStringPainted)); + set("getString", voidToString(progressBar::getString)); + set("getPercentComplete", voidToDouble(progressBar::getPercentComplete)); + + set("setMinimum", intToVoid(progressBar::setMinimum)); + set("setMaximum", intToVoid(progressBar::setMaximum)); + set("setBorderPainted", booleanToVoid(progressBar::setBorderPainted)); + set("setIndeterminate", booleanToVoid(progressBar::setIndeterminate)); + set("setOrientation", intToVoid(progressBar::setOrientation)); + set("setStringPainted", booleanToVoid(progressBar::setStringPainted)); + set("setString", stringToVoid(progressBar::setString)); + set("setValue", intToVoid(progressBar::setValue)); + } + + private Value addChangeListener(Value[] args) { + Arguments.check(1, args.length); + final Function action = ValueUtils.consumeFunction(args[0], 0); + progressBar.addChangeListener(e -> action.execute()); + return NumberValue.ZERO; + } +} \ No newline at end of file diff --git a/src/main/java/com/annimon/ownlang/modules/forms/LayoutManagers.java b/src/main/java/com/annimon/ownlang/modules/forms/LayoutManagers.java index 45558f2..262e168 100644 --- a/src/main/java/com/annimon/ownlang/modules/forms/LayoutManagers.java +++ b/src/main/java/com/annimon/ownlang/modules/forms/LayoutManagers.java @@ -15,7 +15,7 @@ public final class LayoutManagers { private LayoutManagers() { } - static Value borderLayout(Value... args) { + static Value borderLayout(Value[] args) { Arguments.checkOrOr(0, 2, args.length); int hgap = (args.length == 2) ? args[0].asInt() : 0; int vgap = (args.length == 2) ? args[1].asInt() : 0; @@ -24,7 +24,7 @@ public final class LayoutManagers { ); } - static Value boxLayout(Value... args) { + static Value boxLayout(Value[] args) { Arguments.checkOrOr(1, 2, args.length); int axis = (args.length == 2) ? args[1].asInt() : BoxLayout.PAGE_AXIS; return new LayoutManagerValue( @@ -32,7 +32,7 @@ public final class LayoutManagers { ); } - static Value cardLayout(Value... args) { + static Value cardLayout(Value[] args) { Arguments.checkOrOr(0, 2, args.length); int hgap = (args.length == 2) ? args[0].asInt() : 0; int vgap = (args.length == 2) ? args[1].asInt() : 0; @@ -41,7 +41,7 @@ public final class LayoutManagers { ); } - static Value gridLayout(Value... args) { + static Value gridLayout(Value[] args) { Arguments.checkRange(0, 4, args.length); int rows = 1, cols = 0, hgap = 0, vgap = 0; switch (args.length) { @@ -69,7 +69,7 @@ public final class LayoutManagers { ); } - static Value flowLayout(Value... args) { + static Value flowLayout(Value[] args) { Arguments.checkRange(0, 3, args.length); final int align, hgap, vgap; switch (args.length) { diff --git a/src/main/java/com/annimon/ownlang/modules/forms/forms.java b/src/main/java/com/annimon/ownlang/modules/forms/forms.java index 477f7ff..af761ab 100644 --- a/src/main/java/com/annimon/ownlang/modules/forms/forms.java +++ b/src/main/java/com/annimon/ownlang/modules/forms/forms.java @@ -75,6 +75,7 @@ public final class forms implements Module { Functions.set("newButton", Components::newButton); Functions.set("newLabel", Components::newLabel); Functions.set("newPanel", Components::newPanel); + Functions.set("newProgressBar", Components::newProgressBar); Functions.set("newTextField", Components::newTextField); Functions.set("newWindow", Components::newWindow);