Merge forms-module into latest

This commit is contained in:
Victor 2016-07-29 19:29:59 +03:00
commit faba36e1c5
19 changed files with 936 additions and 0 deletions

6
examples/forms/basic.own Normal file
View File

@ -0,0 +1,6 @@
use "forms"
window = newWindow("Basic form example")
window.add("Hello, world")
window.pack()
window.setVisible()

11
examples/forms/button.own Normal file
View File

@ -0,0 +1,11 @@
use "forms"
button = newButton("Click me")
button.onClick(def() {
println "Oh, you clicked me."
})
window = newWindow("Button example")
window.add(button)
window.pack()
window.setVisible()

View File

@ -0,0 +1,38 @@
use "std"
use "forms"
actionsPanel = newPanel()
actionsPanel.setLayout(boxLayout(actionsPanel, BoxLayout.PAGE_AXIS))
actionsPanel.add("Actions:")
actionsPanel.add(newButton("Action 1"))
actionsPanel.add(newButton("Action 2"))
actionsPanel.add(newButton("Action 3"))
actionsPanel.add(newButton("Action 4"))
enterTextLabel = newLabel("Enter a text", SwingConstants.CENTER)
textField = newTextField()
textField.addKeyListener(def(type, event) {
lengthLabel.setText(length(textField.getText()))
})
statusPanel = newPanel()
statusPanel.setLayout(boxLayout(statusPanel, BoxLayout.LINE_AXIS))
statusPanel.add("Length: ")
lengthLabel = newLabel()
statusPanel.add(lengthLabel)
mainPanel = newPanel(borderLayout(10, 10))
mainPanel.setPreferredSize(400, 250)
mainPanel.add(actionsPanel, BorderLayout.WEST)
mainPanel.add(enterTextLabel, BorderLayout.NORTH)
mainPanel.add(textField, BorderLayout.CENTER)
mainPanel.add(statusPanel, BorderLayout.SOUTH)
window = newWindow("Complicated Form Example")
window.setMinimumSize(200, 220)
window.setLocationByPlatform()
window.add(mainPanel)
window.pack()
window.setVisible()

37
examples/forms/panel.own Normal file
View File

@ -0,0 +1,37 @@
use "forms"
// Create Panel with BoxLayout
panel = newPanel()
panel.setLayout(boxLayout(panel, BoxLayout.PAGE_AXIS))
// String label (alias to JLabel)
panel.add("String label")
// Add label
label = newLabel("Label")
label.setHorizontalAlignment(SwingConstants.CENTER)
panel.add(label)
// Add text field
textField = newTextField("Some text")
textField.setColumns(20)
panel.add(textField)
// Add button
button = newButton("Button")
panel.add(button)
// Add another button
clearBtn = newButton("Clear panel")
clearBtn.onClick(def() {
panel.removeAll()
panel.revalidate()
panel.repaint()
})
panel.add(clearBtn)
window = newWindow("Panel Example")
window.setLocation(400, 200)
window.add(panel)
window.pack()
window.setAlwaysOnTop()
window.setVisible()

View File

@ -0,0 +1,23 @@
use "std"
use "forms"
textField = newTextField("Some text")
button = newButton("Click me")
button.onClick(def() {
println "TextField text: " + textField.getText()
textField.setText(textField.getText() + " Let's add new line")
})
window = newWindow("Text field example")
window.add(textField)
window.add(button, BorderLayout.SOUTH)
window.pack()
window.setLocationByPlatform()
window.setVisible()
textField.onAction(def() = echo("I am a TextField"))
textField.addKeyListener(def(type, event) {
println sprintf("%s %d %s",
type, event.keyCode, toChar(event.keyChar))
})

View File

@ -0,0 +1,130 @@
package com.annimon.ownlang.lib;
/**
* Wrapper functions and interfaces.
*/
public final class Converters {
public interface VoidToVoidFunction {
void apply();
}
public interface VoidToBooleanFunction {
boolean apply();
}
public interface VoidToIntFunction {
int apply();
}
public interface VoidToFloatFunction {
float apply();
}
public interface VoidToStringFunction {
String apply();
}
public interface BooleanToVoidFunction {
void apply(boolean b);
}
public interface IntToVoidFunction {
void apply(int i);
}
public interface FloatToVoidFunction {
void apply(float f);
}
public interface Float4ToVoidFunction {
void apply(float f1, float f2, float f3, float f4);
}
public interface StringToVoidFunction {
void apply(String s);
}
public static FunctionValue voidToVoid(VoidToVoidFunction f) {
return new FunctionValue(args -> {
f.apply();
return NumberValue.ZERO;
});
}
public static FunctionValue voidToBoolean(VoidToBooleanFunction f) {
return new FunctionValue(args -> NumberValue.fromBoolean(f.apply()));
}
public static FunctionValue voidToInt(VoidToIntFunction f) {
return new FunctionValue(args -> NumberValue.of(f.apply()));
}
public static FunctionValue voidToFloat(VoidToFloatFunction f) {
return new FunctionValue(args -> NumberValue.of(f.apply()));
}
public static FunctionValue voidToString(VoidToStringFunction f) {
return new FunctionValue(args -> new StringValue(f.apply()));
}
public static FunctionValue booleanToVoid(BooleanToVoidFunction f) {
return new FunctionValue(args -> {
Arguments.check(1, args.length);
f.apply(args[0].asInt() != 0);
return NumberValue.ZERO;
});
}
public static FunctionValue booleanOptToVoid(BooleanToVoidFunction f) {
return booleanOptToVoid(f, true);
}
public static FunctionValue booleanOptToVoid(BooleanToVoidFunction f, final boolean def) {
return new FunctionValue(args -> {
Arguments.checkOrOr(0, 1, args.length);
f.apply( (args.length == 1) ? (args[0].asInt() != 0) : def );
return NumberValue.ZERO;
});
}
public static FunctionValue intToVoid(IntToVoidFunction f) {
return new FunctionValue(args -> {
Arguments.check(1, args.length);
f.apply(args[0].asInt());
return NumberValue.ZERO;
});
}
public static FunctionValue floatToVoid(FloatToVoidFunction f) {
return new FunctionValue(args -> {
Arguments.check(1, args.length);
f.apply(getNumber(args[0]).floatValue());
return NumberValue.ZERO;
});
}
public static FunctionValue float4ToVoid(Float4ToVoidFunction f) {
return new FunctionValue(args -> {
Arguments.check(4, args.length);
f.apply(getNumber(args[0]).floatValue(),
getNumber(args[1]).floatValue(),
getNumber(args[2]).floatValue(),
getNumber(args[3]).floatValue());
return NumberValue.ZERO;
});
}
public static FunctionValue stringToVoid(StringToVoidFunction f) {
return new FunctionValue(args -> {
Arguments.check(1, args.length);
f.apply(args[0].asString());
return NumberValue.ZERO;
});
}
public static Number getNumber(Value value) {
if (value.type() == Types.NUMBER) return ((NumberValue) value).raw();
return value.asInt();
}
}

View File

@ -48,6 +48,10 @@ public class MapValue implements Value, Iterable<Map.Entry<Value, Value>> {
return map.get(key); return map.get(key);
} }
public void set(String key, Value value) {
set(new StringValue(key), value);
}
public void set(Value key, Value value) { public void set(Value key, Value value) {
map.put(key, value); map.put(key, value);
} }

View File

@ -0,0 +1,91 @@
package com.annimon.ownlang.lib.modules;
import com.annimon.ownlang.annotations.ConstantInitializer;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.lib.modules.functions.forms.Components;
import com.annimon.ownlang.lib.modules.functions.forms.LayoutManagers;
import java.awt.BorderLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.SwingConstants;
/**
*
* @author aNNiMON
*/
@ConstantInitializer
public final class forms implements Module {
public static void initConstants() {
// JFrame constants
Variables.define("DISPOSE_ON_CLOSE", NumberValue.of(JFrame.DISPOSE_ON_CLOSE));
Variables.define("DO_NOTHING_ON_CLOSE", NumberValue.of(JFrame.DO_NOTHING_ON_CLOSE));
Variables.define("EXIT_ON_CLOSE", NumberValue.of(JFrame.EXIT_ON_CLOSE));
Variables.define("HIDE_ON_CLOSE", NumberValue.of(JFrame.HIDE_ON_CLOSE));
// SwinfConstants
final MapValue swing = new MapValue(20);
swing.set("BOTTOM", NumberValue.of(SwingConstants.BOTTOM));
swing.set("CENTER", NumberValue.of(SwingConstants.CENTER));
swing.set("EAST", NumberValue.of(SwingConstants.EAST));
swing.set("HORIZONTAL", NumberValue.of(SwingConstants.HORIZONTAL));
swing.set("LEADING", NumberValue.of(SwingConstants.LEADING));
swing.set("LEFT", NumberValue.of(SwingConstants.LEFT));
swing.set("NEXT", NumberValue.of(SwingConstants.NEXT));
swing.set("NORTH", NumberValue.of(SwingConstants.NORTH));
swing.set("NORTH_EAST", NumberValue.of(SwingConstants.NORTH_EAST));
swing.set("NORTH_WEST", NumberValue.of(SwingConstants.NORTH_WEST));
swing.set("PREVIOUS", NumberValue.of(SwingConstants.PREVIOUS));
swing.set("RIGHT", NumberValue.of(SwingConstants.RIGHT));
swing.set("SOUTH", NumberValue.of(SwingConstants.SOUTH));
swing.set("SOUTH_EAST", NumberValue.of(SwingConstants.SOUTH_EAST));
swing.set("SOUTH_WEST", NumberValue.of(SwingConstants.SOUTH_WEST));
swing.set("TOP", NumberValue.of(SwingConstants.TOP));
swing.set("TRAILING", NumberValue.of(SwingConstants.TRAILING));
swing.set("VERTICAL", NumberValue.of(SwingConstants.VERTICAL));
swing.set("WEST", NumberValue.of(SwingConstants.WEST));
Variables.define("SwingConstants", swing);
// LayoutManagers constants
final MapValue border = new MapValue(13);
border.set("AFTER_LAST_LINE", new StringValue(BorderLayout.AFTER_LAST_LINE));
border.set("AFTER_LINE_ENDS", new StringValue(BorderLayout.AFTER_LINE_ENDS));
border.set("BEFORE_FIRST_LINE", new StringValue(BorderLayout.BEFORE_FIRST_LINE));
border.set("BEFORE_LINE_BEGINS", new StringValue(BorderLayout.BEFORE_LINE_BEGINS));
border.set("CENTER", new StringValue(BorderLayout.CENTER));
border.set("EAST", new StringValue(BorderLayout.EAST));
border.set("LINE_END", new StringValue(BorderLayout.LINE_END));
border.set("LINE_START", new StringValue(BorderLayout.LINE_START));
border.set("NORTH", new StringValue(BorderLayout.NORTH));
border.set("PAGE_END", new StringValue(BorderLayout.PAGE_END));
border.set("PAGE_START", new StringValue(BorderLayout.PAGE_START));
border.set("SOUTH", new StringValue(BorderLayout.SOUTH));
border.set("WEST", new StringValue(BorderLayout.WEST));
Variables.define("BorderLayout", border);
final MapValue box = new MapValue(4);
box.set("LINE_AXIS", NumberValue.of(BoxLayout.LINE_AXIS));
box.set("PAGE_AXIS", NumberValue.of(BoxLayout.PAGE_AXIS));
box.set("X_AXIS", NumberValue.of(BoxLayout.X_AXIS));
box.set("Y_AXIS", NumberValue.of(BoxLayout.Y_AXIS));
Variables.define("BoxLayout", box);
}
@Override
public void init() {
initConstants();
// Components
Functions.set("newButton", Components::newButton);
Functions.set("newLabel", Components::newLabel);
Functions.set("newPanel", Components::newPanel);
Functions.set("newTextField", Components::newTextField);
Functions.set("newWindow", Components::newWindow);
// LayoutManagers
Functions.set("borderLayout", LayoutManagers::borderLayout);
Functions.set("boxLayout", LayoutManagers::boxLayout);
Functions.set("cardLayout", LayoutManagers::cardLayout);
Functions.set("gridLayout", LayoutManagers::gridLayout);
Functions.set("flowLayout", LayoutManagers::flowLayout);
}
}

View File

@ -0,0 +1,162 @@
package com.annimon.ownlang.lib.modules.functions.forms;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.ArrayValue;
import static com.annimon.ownlang.lib.Converters.*;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.FunctionValue;
import com.annimon.ownlang.lib.MapValue;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.StringValue;
import com.annimon.ownlang.lib.Types;
import com.annimon.ownlang.lib.Value;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.function.Consumer;
import java.util.function.Supplier;
public abstract class ComponentValue extends MapValue {
final Component component;
public ComponentValue(int functionsCount, Component component) {
super(functionsCount + 42);
this.component = component;
init();
}
private void init() {
set("onKeyAction", new FunctionValue(this::addKeyListener));
set("addKeyListener", new FunctionValue(this::addKeyListener));
set("getFocusTraversalKeysEnabled", voidToBoolean(component::getFocusTraversalKeysEnabled));
set("getHeight", voidToInt(component::getHeight));
set("getIgnoreRepaint", voidToBoolean(component::getIgnoreRepaint));
set("getLocation", new FunctionValue(this::getLocation));
set("getLocationOnScreen", new FunctionValue(this::getLocationOnScreen));
set("getMinimumSize", dimensionFunction(component::getMinimumSize));
set("getMaximumSize", dimensionFunction(component::getMaximumSize));
set("getName", voidToString(component::getName));
set("getPreferredSize", dimensionFunction(component::getPreferredSize));
set("getSize", dimensionFunction(component::getSize));
set("getWidth", voidToInt(component::getWidth));
set("getX", voidToInt(component::getX));
set("getY", voidToInt(component::getY));
set("hasFocus", voidToBoolean(component::hasFocus));
set("invalidate", voidToVoid(component::invalidate));
set("isDisplayable", voidToBoolean(component::isDisplayable));
set("isDoubleBuffered", voidToBoolean(component::isDoubleBuffered));
set("isEnabled", voidToBoolean(component::isEnabled));
set("isFocusOwner", voidToBoolean(component::isFocusOwner));
set("isFocusable", voidToBoolean(component::isFocusable));
set("isLightweight", voidToBoolean(component::isLightweight));
set("isOpaque", voidToBoolean(component::isOpaque));
set("isShowing", voidToBoolean(component::isShowing));
set("isValid", voidToBoolean(component::isValid));
set("isVisible", voidToBoolean(component::isVisible));
set("requestFocus", voidToVoid(component::requestFocus));
set("requestFocusInWindow", voidToBoolean(component::requestFocusInWindow));
set("repaint", voidToVoid(component::repaint));
set("revalidate", voidToVoid(component::revalidate));
set("setMaximumSize", voidDimensionFunction(component::setMaximumSize));
set("setMinimumSize", voidDimensionFunction(component::setMinimumSize));
set("setName", stringToVoid(component::setName));
set("setPreferredSize", voidDimensionFunction(component::setPreferredSize));
set("setSize", voidDimensionFunction(component::setSize));
set("setVisible", booleanOptToVoid(component::setVisible));
set("setLocation", new FunctionValue(this::setLocation));
set("validate", voidToVoid(component::validate));
}
private Value addKeyListener(Value... args) {
Arguments.check(1, args.length);
final int type = args[0].type();
if (type != Types.FUNCTION) {
throw new TypeException("Function expected, but found " + Types.typeToString(type));
}
final Function action = ((FunctionValue) args[0]).getValue();
component.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
handleKeyEvent("typed", e);
}
@Override
public void keyPressed(KeyEvent e) {
handleKeyEvent("pressed", e);
}
@Override
public void keyReleased(KeyEvent e) {
handleKeyEvent("released", e);
}
private void handleKeyEvent(String type, final KeyEvent e) {
final MapValue map = new MapValue(15);
map.set("extendedKeyCode", NumberValue.of(e.getExtendedKeyCode()));
map.set("keyChar", NumberValue.of(e.getKeyChar()));
map.set("keyCode", NumberValue.of(e.getKeyCode()));
map.set("keyLocation", NumberValue.of(e.getKeyLocation()));
map.set("id", NumberValue.of(e.getID()));
map.set("isActionKey", NumberValue.fromBoolean(e.isActionKey()));
map.set("isAltDown", NumberValue.fromBoolean(e.isAltDown()));
map.set("isAltGraphDown", NumberValue.fromBoolean(e.isAltGraphDown()));
map.set("isConsumed", NumberValue.fromBoolean(e.isConsumed()));
map.set("isControlDown", NumberValue.fromBoolean(e.isControlDown()));
map.set("isMetaDown", NumberValue.fromBoolean(e.isMetaDown()));
map.set("isShiftDown", NumberValue.fromBoolean(e.isShiftDown()));
map.set("modifiers", NumberValue.of(e.getModifiers()));
action.execute(new StringValue(type), map);
}
});
return NumberValue.ZERO;
}
private Value getLocation(Value... args) {
final Point location = component.getLocation();
final ArrayValue result = new ArrayValue(2);
result.set(0, NumberValue.of(location.x));
result.set(1, NumberValue.of(location.y));
return result;
}
private Value getLocationOnScreen(Value... args) {
final Point location = component.getLocationOnScreen();
final ArrayValue result = new ArrayValue(2);
result.set(0, NumberValue.of(location.x));
result.set(1, NumberValue.of(location.y));
return result;
}
private Value setLocation(Value... args) {
Arguments.check(2, args.length);
component.setLocation(args[0].asInt(), args[1].asInt());
return NumberValue.ZERO;
}
protected static FunctionValue dimensionFunction(Supplier<Dimension> s) {
return new FunctionValue(args -> {
final Dimension dimension = s.get();
final ArrayValue result = new ArrayValue(2);
result.set(0, NumberValue.of(dimension.getWidth()));
result.set(1, NumberValue.of(dimension.getHeight()));
return result;
});
}
protected static FunctionValue voidDimensionFunction(Consumer<Dimension> s) {
return new FunctionValue(args -> {
Arguments.check(2, args.length);
s.accept(new Dimension(args[0].asInt(), args[1].asInt()));
return NumberValue.ZERO;
});
}
}

View File

@ -0,0 +1,52 @@
package com.annimon.ownlang.lib.modules.functions.forms;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Value;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
/**
* Functions for working with components.
*/
public final class Components {
public 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);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
return new JFrameValue(frame);
}
public static Value newPanel(Value... args) {
Arguments.checkOrOr(0, 1, args.length);
final JPanel panel = new JPanel();
if (args.length == 1) {
panel.setLayout( ((LayoutManagerValue) args[0]).layout );
}
return new JPanelValue(panel);
}
public 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));
}
public 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[0].asInt() : SwingConstants.LEADING;
return new JLabelValue(new JLabel(text, align));
}
public 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));
}
}

View File

@ -0,0 +1,80 @@
package com.annimon.ownlang.lib.modules.functions.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.Types;
import com.annimon.ownlang.lib.Value;
import java.awt.Component;
import java.awt.Container;
import javax.swing.JLabel;
public abstract class ContainerValue extends ComponentValue {
final Container container;
public ContainerValue(int functionsCount, Container container) {
super(functionsCount + 10, container);
this.container = container;
init();
}
private void init() {
set("add", new FunctionValue(this::add));
set("remove", new FunctionValue(this::remove));
set("removeAll", voidToVoid(container::removeAll));
set("getAlignmentX", voidToFloat(container::getAlignmentX));
set("getAlignmentY", voidToFloat(container::getAlignmentY));
set("getComponentCount", voidToInt(container::getComponentCount));
set("isFocusCycleRoot", voidToBoolean(container::isFocusCycleRoot));
set("isValidateRoot", voidToBoolean(container::isValidateRoot));
set("setLayout", new FunctionValue(this::setLayout));
}
private Value add(Value... args) {
Arguments.checkRange(1, 3, args.length);
final Component newComponent;
if (args[0] instanceof ComponentValue) {
newComponent = ((ComponentValue) args[0]).component;
} else {
newComponent = new JLabel(args[0].asString());
}
switch (args.length) {
case 1:
container.add(newComponent);
break;
case 2:
if (args[1].type() == Types.NUMBER) {
// add(component, index)
container.add(newComponent, args[1].asInt());
} else {
// add(component, constraints)
container.add(newComponent, args[1].raw());
}
break;
case 3:
// add(component, constraints, index)
container.add(newComponent, args[1].raw(), args[2].asInt());
break;
}
return NumberValue.ZERO;
}
private Value remove(Value... args) {
Arguments.check(1, args.length);
if (args[0] instanceof JComponentValue) {
container.remove(((JComponentValue) args[0]).component);
} else {
container.remove(args[0].asInt());
}
return NumberValue.ZERO;
}
private Value setLayout(Value... args) {
Arguments.check(1, args.length);
container.setLayout(((LayoutManagerValue) args[0]).layout);
return NumberValue.ZERO;
}
}

View File

@ -0,0 +1,37 @@
package com.annimon.ownlang.lib.modules.functions.forms;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.FunctionValue;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Types;
import com.annimon.ownlang.lib.Value;
import javax.swing.JButton;
public class JButtonValue extends JComponentValue {
final JButton button;
public JButtonValue(JButton button) {
super(2, button);
this.button = button;
init();
}
private void init() {
set("onClick", new FunctionValue(this::addActionListener));
set("addActionListener", new FunctionValue(this::addActionListener));
}
private Value addActionListener(Value... args) {
Arguments.check(1, args.length);
final int type = args[0].type();
if (type != Types.FUNCTION) {
throw new TypeException("Function expected, but found " + Types.typeToString(type));
}
final Function action = ((FunctionValue) args[0]).getValue();
button.addActionListener(e -> action.execute());
return NumberValue.ZERO;
}
}

View File

@ -0,0 +1,20 @@
package com.annimon.ownlang.lib.modules.functions.forms;
import static com.annimon.ownlang.lib.Converters.*;
import javax.swing.JComponent;
public abstract class JComponentValue extends ContainerValue {
final JComponent jComponent;
public JComponentValue(int functionsCount, JComponent jComponent) {
super(functionsCount + 2, jComponent);
this.jComponent = jComponent;
init();
}
private void init() {
set("getToolTipText", voidToString(jComponent::getToolTipText));
set("setToolTipText", stringToVoid(jComponent::setToolTipText));
}
}

View File

@ -0,0 +1,27 @@
package com.annimon.ownlang.lib.modules.functions.forms;
import static com.annimon.ownlang.lib.Converters.*;
import javax.swing.JFrame;
public class JFrameValue extends ContainerValue {
final JFrame frame;
public JFrameValue(JFrame frame) {
super(9, frame);
this.frame = frame;
init();
}
private void init() {
set("dispose", voidToVoid(frame::dispose));
set("getTitle", voidToString(frame::getTitle));
set("getDefaultCloseOperation", voidToInt(frame::getDefaultCloseOperation));
set("pack", voidToVoid(frame::pack));
set("setAlwaysOnTop", booleanOptToVoid(frame::setAlwaysOnTop));
set("setDefaultCloseOperation", intToVoid(frame::setDefaultCloseOperation));
set("setLocationByPlatform", booleanOptToVoid(frame::setLocationByPlatform));
set("setResizable", booleanOptToVoid(frame::setResizable));
set("setTitle", stringToVoid(frame::setTitle));
}
}

View File

@ -0,0 +1,35 @@
package com.annimon.ownlang.lib.modules.functions.forms;
import static com.annimon.ownlang.lib.Converters.*;
import javax.swing.JLabel;
public class JLabelValue extends JComponentValue {
final JLabel label;
public JLabelValue(JLabel label) {
super(17, label);
this.label = label;
init();
}
private void init() {
set("getDisplayedMnemonic", voidToInt(label::getDisplayedMnemonic));
set("getDisplayedMnemonicIndex", voidToInt(label::getDisplayedMnemonicIndex));
set("getHorizontalAlignment", voidToInt(label::getHorizontalAlignment));
set("getHorizontalTextPosition", voidToInt(label::getHorizontalTextPosition));
set("getIconTextGap", voidToInt(label::getIconTextGap));
set("getVerticalAlignment", voidToInt(label::getVerticalAlignment));
set("getVerticalTextPosition", voidToInt(label::getVerticalTextPosition));
set("getText", voidToString(label::getText));
set("setDisplayedMnemonic", intToVoid(label::setDisplayedMnemonic));
set("setDisplayedMnemonicIndex", intToVoid(label::setDisplayedMnemonicIndex));
set("setHorizontalAlignment", intToVoid(label::setHorizontalAlignment));
set("setHorizontalTextPosition", intToVoid(label::setHorizontalTextPosition));
set("setIconTextGap", intToVoid(label::setIconTextGap));
set("setVerticalAlignment", intToVoid(label::setVerticalAlignment));
set("setVerticalTextPosition", intToVoid(label::setVerticalTextPosition));
set("setText", stringToVoid(label::setText));
}
}

View File

@ -0,0 +1,17 @@
package com.annimon.ownlang.lib.modules.functions.forms;
import javax.swing.JPanel;
public class JPanelValue extends JComponentValue {
final JPanel panel;
public JPanelValue(JPanel panel) {
super(0, panel);
this.panel = panel;
init();
}
private void init() {
}
}

View File

@ -0,0 +1,52 @@
package com.annimon.ownlang.lib.modules.functions.forms;
import com.annimon.ownlang.exceptions.TypeException;
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.Types;
import com.annimon.ownlang.lib.Value;
import javax.swing.JTextField;
public class JTextFieldValue extends JComponentValue {
private final JTextField textField;
public JTextFieldValue(JTextField textField) {
super(16, textField);
this.textField = textField;
init();
}
private void init() {
set("onAction", new FunctionValue(this::addActionListener));
set("addActionListener", new FunctionValue(this::addActionListener));
set("getCaretPosition", voidToInt(textField::getCaretPosition));
set("getColumns", voidToInt(textField::getColumns));
set("getHorizontalAlignment", voidToInt(textField::getHorizontalAlignment));
set("getSelectionEnd", voidToInt(textField::getSelectionEnd));
set("getSelectionStart", voidToInt(textField::getSelectionStart));
set("getScrollOffset", voidToInt(textField::getScrollOffset));
set("getText", voidToString(textField::getText));
set("setCaretPosition", intToVoid(textField::setCaretPosition));
set("setColumns", intToVoid(textField::setColumns));
set("setHorizontalAlignment", intToVoid(textField::setHorizontalAlignment));
set("setScrollOffset", intToVoid(textField::setScrollOffset));
set("setSelectionEnd", intToVoid(textField::setSelectionEnd));
set("setSelectionStart", intToVoid(textField::setSelectionStart));
set("setText", stringToVoid(textField::setText));
}
private Value addActionListener(Value... args) {
Arguments.check(1, args.length);
final int type = args[0].type();
if (type != Types.FUNCTION) {
throw new TypeException("Function expected, but found " + Types.typeToString(type));
}
final Function action = ((FunctionValue) args[0]).getValue();
textField.addActionListener(e -> action.execute());
return NumberValue.ZERO;
}
}

View File

@ -0,0 +1,14 @@
package com.annimon.ownlang.lib.modules.functions.forms;
import com.annimon.ownlang.lib.MapValue;
import java.awt.LayoutManager;
public class LayoutManagerValue extends MapValue {
final LayoutManager layout;
public LayoutManagerValue(LayoutManager layout) {
super(0);
this.layout = layout;
}
}

View File

@ -0,0 +1,100 @@
package com.annimon.ownlang.lib.modules.functions.forms;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Value;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.BoxLayout;
/**
* Functions for working with layout managers.
*/
public final class LayoutManagers {
public 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;
return new LayoutManagerValue(
new BorderLayout(hgap, vgap)
);
}
public 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(
new BoxLayout(((JPanelValue) args[0]).panel, axis)
);
}
public 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;
return new LayoutManagerValue(
new CardLayout(hgap, vgap)
);
}
public static Value gridLayout(Value... args) {
Arguments.checkRange(0, 4, args.length);
int rows = 1, cols = 0, hgap = 0, vgap = 0;
switch (args.length) {
case 1:
rows = args[0].asInt();
break;
case 2:
rows = args[0].asInt();
cols = args[1].asInt();
break;
case 3:
rows = args[0].asInt();
cols = args[1].asInt();
hgap = args[2].asInt();
break;
case 4:
rows = args[0].asInt();
cols = args[1].asInt();
hgap = args[2].asInt();
vgap = args[3].asInt();
break;
}
return new LayoutManagerValue(
new GridLayout(rows, cols, hgap, vgap)
);
}
public static Value flowLayout(Value... args) {
Arguments.checkRange(0, 3, args.length);
final int align, hgap, vgap;
switch (args.length) {
case 1:
align = args[0].asInt();
hgap = 5;
vgap = 5;
break;
case 2:
align = FlowLayout.CENTER;
hgap = args[0].asInt();
vgap = args[1].asInt();
break;
case 3:
align = args[0].asInt();
hgap = args[1].asInt();
vgap = args[2].asInt();
break;
default:
align = FlowLayout.CENTER;
hgap = 5;
vgap = 5;
break;
}
return new LayoutManagerValue(
new FlowLayout(align, hgap, vgap)
);
}
}