/* * This file is a part of Alchemy OS project. * Copyright (C) 2011-2014, Sergey Basalaev <sbasalaev@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package alchemy.libs; import alchemy.fs.Filesystem; import alchemy.io.ConnectionInputStream; import alchemy.libs.ui.MsgBox; import alchemy.libs.ui.UICanvas; import alchemy.libs.ui.UIForm; import alchemy.platform.Platform; import alchemy.platform.UI; import alchemy.system.Cache; import alchemy.system.NativeLibrary; import alchemy.system.Process; import alchemy.system.UIServer; import alchemy.types.Int32; import alchemy.util.Strings; import java.io.IOException; import java.io.InputStream; import java.util.Date; import javax.microedition.lcdui.Choice; import javax.microedition.lcdui.ChoiceGroup; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.DateField; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Gauge; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; import javax.microedition.lcdui.ImageItem; import javax.microedition.lcdui.Item; import javax.microedition.lcdui.List; import javax.microedition.lcdui.StringItem; import javax.microedition.lcdui.TextBox; import javax.microedition.lcdui.TextField; /** * User interface library for Alchemy OS. * This is j2me implementation. * * Classes are mapped as follows: * <table border="1"> * <tr> * <th>Ether type</th> * <th>Java class</th> * </tr> * <tr> * <td><code>Graphics</code></td> * <td><code>javax.microedition.lcdui.Graphics</code></td> * </tr> * <tr> * <td><code>Image</code></td> * <td><code>javax.microedition.lcdui.Image</code></td> * </tr> * <tr> * <td><code>Menu</code></td> * <td><code>javax.microedition.lcdui.Command</code></td> * </tr> * <tr> * <td><code>Screen</code></td> * <td><code>javax.microedition.lcdui.Displayable</code></td> * </tr> * <tr> * <td><code>Canvas</code></td> * <td><code>alchemy.libs.ui.UICanvas</code></td> * </tr> * </table> * * @author Sergey Basalaev */ public final class LibUI2 extends NativeLibrary { public LibUI2() throws IOException { load("/symbols/ui2"); name = "libui.2.so"; } private final UI ui = Platform.getPlatform().getUI(); /** Command for hyperlinks. */ private final Command hyperCommand = new Command("Go", Command.ITEM, 1); protected Object invokeNative(int index, Process p, Object[] args) throws Exception { switch (index) { /* == Header: font.eh == */ case 0: // stringWidth(font: Int, str: String): Int return Ival(int2font((Int32)args[0]).stringWidth((String)args[1])); case 1: // fontHeight(font: Int): Int return Ival(int2font((Int32)args[0]).getHeight()); case 2: // fontBaseline(font: Int): Int return Ival(int2font((Int32)args[0]).getBaselinePosition()); /* == Header: graphics.eh == */ case 3: // Graphics.getColor(): Int return Ival(((Graphics)args[0]).getColor()); case 4: // Graphics.setColor(rgb: Int) ((Graphics)args[0]).setColor(ival(args[1])); return null; case 5: // Graphics.getStroke(): Int return Ival(((Graphics)args[0]).getStrokeStyle()); case 6: // Graphics.setStroke(stroke: Int) ((Graphics)args[0]).setStrokeStyle(ival(args[1])); return null; case 7: // Graphics.getFont(): Int return font2int(((Graphics)args[0]).getFont()); case 8: // Graphics.setFont(font: Int) ((Graphics)args[0]).setFont(int2font((Int32)args[1])); return null; case 9: // Graphics.drawLine(x1: Int, y1: Int, x2: Int, y2: Int) ((Graphics)args[0]).drawLine(ival(args[1]), ival(args[2]), ival(args[3]), ival(args[4])); return null; case 10: // Graphics.drawRect(x: Int, y: Int, w: Int, h: Int) ((Graphics)args[0]).drawRect(ival(args[1]), ival(args[2]), ival(args[3]), ival(args[4])); return null; case 11: // Graphics.fillRect(x: Int, y: Int, w: Int, h: Int) ((Graphics)args[0]).fillRect(ival(args[1]), ival(args[2]), ival(args[3]), ival(args[4])); return null; case 12: // Graphics.drawRoundrect(x: Int, y: Int, w: Int, h: Int, arcw: Int, arch: Int) ((Graphics)args[0]).drawRoundRect(ival(args[1]), ival(args[2]), ival(args[3]), ival(args[4]), ival(args[5]), ival(args[6])); return null; case 13: // Graphics.fillRoundrect(x: Int, y: Int, w: Int, h: Int, arcw: Int, arch: Int) ((Graphics)args[0]).fillRoundRect(ival(args[1]), ival(args[2]), ival(args[3]), ival(args[4]), ival(args[5]), ival(args[6])); return null; case 14: // Graphics.drawArc(x: Int, y: Int, w: Int, h: Int, sta: Int, a: Int) ((Graphics)args[0]).drawArc(ival(args[1]), ival(args[2]), ival(args[3]), ival(args[4]), ival(args[5]), ival(args[6])); return null; case 15: // Graphics.fillArc(x: Int, y: Int, w: Int, h: Int, sta: Int, a: Int) ((Graphics)args[0]).fillArc(ival(args[1]), ival(args[2]), ival(args[3]), ival(args[4]), ival(args[5]), ival(args[6])); return null; case 16: // Graphics.fillTriangle(x1: Int, y1: Int, x2: Int, y2: Int, x3: Int, y3: Int) ((Graphics)args[0]).fillTriangle(ival(args[1]), ival(args[2]), ival(args[3]), ival(args[4]), ival(args[5]), ival(args[6])); return null; case 17: // Graphics.drawString(str: String, x: Int, y: Int) ((Graphics)args[0]).drawString((String)args[1], ival(args[2]), ival(args[3]), 0); return null; case 18: // Graphics.drawImage(im: Image, x: Int, y: Int) ((Graphics)args[0]).drawImage((Image)args[1], ival(args[2]), ival(args[3]), 0); return null; case 19: // Graphics.drawRGB(rgb: [Int], ofs: Int, scanlen: Int, x: Int, y: Int, w: Int, h: Int, alpha: Bool) ((Graphics)args[0]).drawRGB((int[])args[1], ival(args[2]), ival(args[3]), ival(args[4]), ival(args[5]), ival(args[6]), ival(args[7]), bval(args[8])); return null; case 20: // Graphics.copyArea(xsrc: Int, ysrc: Int, w: Int, h: Int, xdst: Int, ydst: Int) ((Graphics)args[0]).copyArea(ival(args[1]), ival(args[2]), ival(args[3]), ival(args[4]), ival(args[5]), ival(args[6]), 0); return null; case 21: // Graphics.drawRegion(im: Image, xsrc: Int, ysrc: Int, w: Int, h: Int, trans: Int, xdst: Int, ydst: Int) ((Graphics)args[0]).drawRegion((Image)args[1], ival(args[2]), ival(args[3]), ival(args[4]), ival(args[5]), ival(args[6]), ival(args[7]), ival(args[8]), 0); return null; /* == Header: image.eh == */ case 22: // Image.new(w: Int, h: Int) return Image.createImage(ival(args[0]), ival(args[1])); case 23: // Image.graphics(): Graphics return ((Image)args[0]).getGraphics(); case 24: // imageFromARGB(argb: [Int], w: Int, h: Int, alpha: Bool): Image return Image.createRGBImage((int[])args[0], ival(args[1]), ival(args[2]), bval(args[3])); case 25: { // imageFromFile(file: String): Image String filename = p.toFile((String)args[0]); long tstamp = Filesystem.lastModified(filename); Image img = (Image) Cache.get(filename, tstamp); if (img == null) { ConnectionInputStream in = new ConnectionInputStream(Filesystem.read(filename)); p.addConnection(in); img = Image.createImage(in); in.close(); Cache.put(filename, tstamp, img); p.removeConnection(in); } return img; } case 26: // imageFromStream(in: IStream): Image return Image.createImage((InputStream)args[0]); case 27: { // imageFromData(data: [Byte], ofs: Int = 0, len: Int = -1): Image final byte[] buf = (byte[])args[0]; int ofs = ival(args[1]); int len = ival(args[2]); if (len < 0) len = buf.length - ofs; return Image.createImage(buf, ofs, len); } case 28: // imageFromImage(im: Image, x: Int, y: Int, w: Int, h: Int): Image return Image.createImage((Image)args[0], ival(args[1]), ival(args[2]), ival(args[3]), ival(args[4]), 0); case 29: // Image.getARGB(argb: [Int], ofs: Int, scanlen: Int, x: Int, y: Int, w: Int, h: Int) ((Image)args[0]).getRGB((int[])args[1], ival(args[2]), ival(args[3]), ival(args[4]), ival(args[5]), ival(args[6]), ival(args[7])); return null; case 30: // Image.getWidth(): Int return Ival(((Image)args[0]).getWidth()); case 31: // Image.getHeight(): Int return Ival(((Image)args[0]).getHeight()); case 32: // Image.isMutable(): Bool return Ival(((Image)args[0]).isMutable()); /* == Header: ui.eh == */ case 33: // Menu.new(text: String, priority: Int, mtype: Int = MT_SCREEN): Menu return new Command((String)args[0], ival(args[1]), ival(args[2])); case 34: // Menu.getText(): String return ((Command)args[0]).getLabel(); case 35: // Menu.getPriority(): Int return Ival(((Command)args[0]).getPriority()); case 36: // Menu.getType(): Int return Ival(((Command)args[0]).getCommandType()); case 37: // Screen.isShown(): Bool return Ival(((Displayable)args[0]).isShown()); case 38: // Screen.getHeight(): Int return Ival(((Displayable)args[0]).getHeight()); case 39: // Screen.getWidth(): Int return Ival(((Displayable)args[0]).getWidth()); case 40: // Screen.getTitle(): String return ((Displayable)args[0]).getTitle(); case 41: { // Screen.setTitle(title: String) Displayable screen = (Displayable) args[0]; String title = (String) args[1]; screen.setTitle(title); ui.screenTitleChanged(screen, title); return null; } case 42: { // Screen.addMenu(menu: Menu) Displayable screen = (Displayable) args[0]; Command menu = (Command) args[1]; screen.addCommand(menu); ui.screenMenuAdded(screen, menu); return null; } case 43: { // Screen.removeMenu(menu: Menu) Displayable screen = (Displayable) args[0]; Command menu = (Command) args[1]; screen.removeCommand(menu); ui.screenMenuRemoved(screen, menu); return null; } case 44: // uiReadEvent(): UIEvent return UIServer.readEvent(p, false); case 45: // uiWaitEvent(): UIEvent return UIServer.readEvent(p, true); case 46: // uiVibrate(millis: Int): Bool return Ival(ui.vibrate(ival(args[0]))); case 47: // uiFlash(millis: Int): Bool return Ival(ui.flash(ival(args[0]))); case 48: // uiGetScreen(): Screen return UIServer.getScreen(p); case 49: // uiSetScreen(scr: Screen) UIServer.setScreen(p, args[0]); return null; case 50: // uiSetDefaultTitle(title: String) p.setGlobal(null, "ui.title", (String)args[0]); return null; case 51: { // uiSetIcon(icon: Image) p.setGlobal(null, "ui.icon", (Image)args[0]); UIServer.displayCurrent(); return null; } /* == Header: canvas.eh == */ case 52: // Canvas.new(full: Bool = false): Canvas return new UICanvas(bval(args[0])); case 53: // Canvas.graphics(): Graphics return ((UICanvas)args[0]).getGraphics(); case 54: // Canvas.repaint(x: Int, y: Int, w: Int, h: Int) ((UICanvas)args[0]).repaint(ival(args[1]), ival(args[2]), ival(args[3]), ival(args[4])); return null; case 55: // Canvas.refresh() ((UICanvas)args[0]).repaint(); return null; case 56: // Canvas.actionCode(key: Int): Int return Ival(((UICanvas)args[0]).getGameAction(ival(args[1]))); case 57: // Canvas.keyName(key: Int): String return ((UICanvas)args[0]).getKeyName(ival(args[1])); case 58: // Canvas.hasPtrEvents(): Bool return Ival(((UICanvas)args[0]).hasPointerEvents()); case 59: // Canvas.hasPtrDragEvent(): Bool return Ival(((UICanvas)args[0]).hasPointerMotionEvents()); case 60: // Canvas.hasHoldEvent(): Bool return Ival(((UICanvas)args[0]).hasRepeatEvents()); /* == Header: msgbox.eh == */ case 61: // MsgBox.new(title: String, text: String = null, image: Image = null) return new MsgBox((String)args[0], (String)args[1], (Image)args[2]); case 62: // MsgBox.getText(): String return ((MsgBox)args[0]).getString(); case 63: // MsgBox.setText(text: String) ((MsgBox)args[0]).setString((String)args[1]); return null; case 64: // MsgBox.getImage(): Image return ((MsgBox)args[0]).getImage(); case 65: // MsgBox.setImage(img: Image) ((MsgBox)args[0]).setImage((Image)args[1]); return null; case 66: // MsgBox.getFont(): Int return font2int(((MsgBox)args[0]).getFont()); case 67: // MsgBox.setFont(font: Int) ((MsgBox)args[0]).setFont(int2font((Int32)args[1])); return null; /* == Header: editbox.eh == */ case 68: // EditBox.new(title: String, text: String = null): EditBox return new TextBox((String)args[0], (String)args[1], Short.MAX_VALUE, TextField.ANY); case 69: // EditBox.getText(): String return ((TextBox)args[0]).getString(); case 70: // EditBox.setText(text: String) ((TextBox)args[0]).setString((String)args[1]); return null; case 71: // EditBox.getMaxSize(): Int return Ival(((TextBox)args[0]).getMaxSize()); case 72: // EditBox.setMaxSize(size: Int) ((TextBox)args[0]).setMaxSize(ival(args[1])); return null; case 73: // EditBox.getSize(): Int return Ival(((TextBox)args[0]).size()); case 74: // EditBox.getCaret(): Int return Ival(((TextBox)args[0]).getCaretPosition()); /* == Header: listbox.eh == */ case 75: { // ListBox.new(title: String, strings: [String], images: [Image], select: Menu): ListBox Object[] objStrings = (Object[])args[1]; String[] strings = null; if (objStrings != null) { strings = new String[objStrings.length]; System.arraycopy(objStrings, 0, strings, 0, objStrings.length); } Object[] objImages = (Object[])args[2]; Image[] images = null; if (objImages != null) { images = new Image[objImages.length]; System.arraycopy(objImages, 0, images, 0, objImages.length); } List list = new List((String)args[0], List.IMPLICIT, strings, images); list.setSelectCommand((Command)args[3]); return list; } case 76: // ListBox.getIndex(): Int return Ival(((List)args[0]).getSelectedIndex()); case 77: // ListBox.setIndex(index: Int) ((List)args[0]).setSelectedIndex(ival(args[1]), true); return null; case 78: // ListBox.add(str: String, img: Image = null) ((List)args[0]).append((String)args[1], (Image)args[2]); return null; case 79: // ListBox.insert(at: Int, str: String, img: Image = null) ((List)args[0]).insert(ival(args[1]), (String)args[2], (Image)args[3]); return null; case 80: // ListBox.set(at: Int, str: String, img: Image = null) ((List)args[0]).set(ival(args[1]), (String)args[2], (Image)args[3]); return null; case 81: // ListBox.delete(at: Int) ((List)args[0]).delete(ival(args[1])); return null; case 82: // ListBox.getString(at: Int): String return ((List)args[0]).getString(ival(args[1])); case 83: // ListBox.getImage(at: Int): Image return ((List)args[0]).getImage(ival(args[1])); case 84: // ListBox.getFont(at: Int): Font return font2int(((List)args[0]).getFont(ival(args[1]))); case 85: // ListBox.setFont(at: Int, font: Int) ((List)args[0]).setFont(ival(args[1]), int2font((Int32)args[2])); return null; case 86: // ListBox.clear() ((List)args[0]).deleteAll(); return null; case 87: // ListBox.len(): Int return Ival(((List)args[0]).size()); /* == Header: form.eh == */ case 88: // Form.new(title: String = null) return new UIForm((String)args[0]); case 89: // Item.getLabel(): String return ((Item)args[0]).getLabel(); case 90: // Item.setLabel(label: String) ((Item)args[0]).setLabel((String)args[1]); return null; case 91: { // Form.add(item: Item) ((UIForm)args[0]).append((Item)args[1]); return null; } case 92: // Form.get(at: Int): Item return ((UIForm)args[0]).get(ival(args[1])); case 93: // Form.set(at: Int, item: Item) ((UIForm)args[0]).set(ival(args[1]), (Item)args[2]); return null; case 94: // Form.insert(at: Int, item: Item) ((UIForm)args[0]).insert(ival(args[1]), (Item)args[2]); return null; case 95: // Form.remove(at: Int) ((UIForm)args[0]).delete(ival(args[1])); return null; case 96: // Form.size(): Int return Ival(((UIForm)args[0]).size()); case 97: // Form.clear() ((UIForm)args[0]).deleteAll(); return null; case 98: // TextItem.new(label: String, text: String) return new StringItem((String)args[0], Strings.toString(args[1]) + '\n'); case 99: // TextItem.getText(): String return ((StringItem)args[0]).getText(); case 100: // TextItem.setText(text: String) ((StringItem)args[0]).setText(Strings.toString(args[1]) + '\n'); return null; case 101: // TextItem.getFont(): Int return font2int(((StringItem)args[0]).getFont()); case 102: // TextItem.setFont(font: Int) ((StringItem)args[0]).setFont(int2font((Int32)args[1])); return null; case 103: { // HyperlinkItem.new(label: String, text: String) Item item = new StringItem((String)args[0], (String)args[1], Item.HYPERLINK); item.addCommand(hyperCommand); return item; } case 104: // ImageItem.new(label: String, img: Image) return new ImageItem((String)args[0], (Image)args[1], Item.LAYOUT_NEWLINE_AFTER, null); case 105: // ImageItem.getImage(): Image return ((ImageItem)args[0]).getImage(); case 106: // ImageItem.setImage(img: Image) ((ImageItem)args[0]).setImage((Image)args[1]); return null; case 107: // ImageItem.getAltText(): String return ((ImageItem)args[0]).getAltText(); case 108: // ImageItem.setAltText(text: String) ((ImageItem)args[0]).setAltText((String)args[1]); return null; case 109: { // HyperimageItem.new(label: String, img: Image) Item item = new ImageItem((String)args[0], (Image)args[1], Item.LAYOUT_NEWLINE_AFTER, null, Item.HYPERLINK); item.addCommand(hyperCommand); return item; } case 110: { // EditItem.new(label: String, text: String = "", mode: Int = EDIT_ANY, maxsize: Int = 50) int mode = ival(args[2]); if (mode < 0 || mode > 5) throw new IllegalArgumentException("invalid mode"); return new TextField((String)args[0], (String)args[1], ival(args[3]), mode); } case 111: // EditItem.getText(): String return ((TextField)args[0]).getString(); case 112: // EditItem.setText(text: String) ((TextField)args[0]).setString((String)args[1]); return null; case 113: // EditItem.getMaxSize(): Int return Ival(((TextField)args[0]).getMaxSize()); case 114: // EditItem.setMaxSize(size: Int) ((TextField)args[0]).setMaxSize(ival(args[1])); return null; case 115: // EditItem.getEditable(): Bool return Ival((((TextField)args[0]).getConstraints() & TextField.UNEDITABLE) == 0); case 116: { // EditItem.setEditable(on: Bool) TextField editItem = (TextField) args[0]; int constraints = editItem.getConstraints(); if (bval(args[1])) { constraints &= ~TextField.UNEDITABLE; } else { constraints |= TextField.UNEDITABLE; } editItem.setConstraints(constraints); return null; } case 117: // EditItem.getSize(): Int return Ival(((TextField)args[0]).size()); case 118: // EditItem.getCaret(): Int return Ival(((TextField)args[0]).getCaretPosition()); case 119: // PasswordItem.new(label: String, text: String = "", maxsize: Int = 50) return new TextField((String)args[0], (String)args[1], ival(args[2]), TextField.PASSWORD); case 120: // GaugeItem.new(label: String, max: Int, init: Int) return new Gauge((String)args[0], true, ival(args[0]), ival(args[1])); case 121: // GaugeItem.getValue(): Int return Ival(((Gauge)args[0]).getValue()); case 122: // GaugeItem.setValue(val: Int) ((Gauge)args[0]).setValue(ival(args[1])); return null; case 123: // GaugeItem.getMaxValue(): Int return Ival(((Gauge)args[0]).getMaxValue()); case 124: // GaugeItem.setMaxValue(val: Int) ((Gauge)args[0]).setMaxValue(ival(args[1])); return null; case 125: { // ProgressItem.new(label: String, max: Int, init: Int) int maxValue = ival(args[1]); int initValue = ival(args[2]); if (maxValue == Gauge.INDEFINITE) initValue = Gauge.CONTINUOUS_RUNNING; return new Gauge((String)args[0], false, maxValue, initValue); } case 126: { // ProgressItem.getValue(): Int Gauge g = (Gauge) args[0]; int value; if (g.getMaxValue() == Gauge.INDEFINITE) { value = 0; } else { value = g.getValue(); } return Ival(value); } case 127: { // ProgressItem.setValue(val: Int) Gauge g = (Gauge) args[0]; if (g.getMaxValue() != Gauge.INDEFINITE) { g.setValue(ival(args[1])); } return null; } case 128: // ProgressItem.getMaxValue(): Int return Ival(((Gauge)args[0]).getMaxValue()); case 129: { // ProgressItem.setMaxValue(val: Int) Gauge g = (Gauge) args[0]; int maxValue = ival(args[1]); g.setMaxValue(maxValue); if (maxValue == Gauge.INDEFINITE) { g.setValue(Gauge.CONTINUOUS_RUNNING); } return null; } case 130: // DateItem.new(label: String, mode: Int = DATE_ONLY) return new DateField((String)args[0], ival(args[1])); case 131: { // DateItem.getDate(): Long Date date = ((DateField)args[0]).getDate(); return Lval(date == null ? 0L : date.getTime()); } case 132: // DateItem.setDate(date: Long) ((DateField)args[0]).setDate(new Date(lval(args[1]))); return null; case 133: { // CheckItem.new(label: String, text: String, checked: Bool) ChoiceGroup check = new ChoiceGroup((String)args[0], Choice.MULTIPLE); check.append((String)args[1], null); check.setSelectedIndex(0, bval(args[2])); return check; } case 134: { // CheckItem.getChecked(): Bool boolean[] checked = new boolean[1]; ((ChoiceGroup)args[0]).getSelectedFlags(checked); return Ival(checked[0]); } case 135: // CheckItem.setChecked(checked: Bool) ((ChoiceGroup)args[0]).setSelectedIndex(0, bval(args[1])); return null; case 136: // CheckItem.getText(): String return ((ChoiceGroup)args[0]).getString(0); case 137: // CheckItem.setText(text: String) ((ChoiceGroup)args[0]).set(0, (String)args[1], null); return null; case 138: { // RadioItem.new(label: String, strings: [String]) Object[] array = (Object[])args[1]; String[] strings = new String[(array != null) ? array.length : 0]; if (array != null) { System.arraycopy(array, 0, strings, 0, array.length); } return new ChoiceGroup((String)args[0], Choice.EXCLUSIVE, strings, null); } case 139: // RadioItem.getIndex(): Int return Ival(((ChoiceGroup)args[0]).getSelectedIndex()); case 140: // RadioItem.setIndex(index: Int) ((ChoiceGroup)args[0]).setSelectedIndex(ival(args[1]), true); return null; case 141: // RadioItem.add(str: String) ((ChoiceGroup)args[0]).append((String)args[1], null); return null; case 142: // RadioItem.insert(at: Int, str: String) ((ChoiceGroup)args[0]).insert(ival(args[1]), (String)args[2], null); return null; case 143: // RadioItem.set(at: Int, str: String) ((ChoiceGroup)args[0]).set(ival(args[1]), (String)args[2], null); return null; case 144: // RadioItem.delete(at: Int) ((ChoiceGroup)args[0]).delete(ival(args[1])); return null; case 145: // RadioItem.get(at: Int): String return ((ChoiceGroup)args[0]).getString(ival(args[1])); case 146: // RadioItem.clear() ((ChoiceGroup)args[0]).deleteAll(); return null; case 147: // RadioItem.len(): Int return Ival(((ChoiceGroup)args[0]).size()); case 148: { // PopupItem.new(label: String, strings: [String]): PopupItem Object[] array = (Object[])args[1]; String[] strings = new String[(array != null) ? array.length : 0]; if (array != null) { System.arraycopy(array, 0, strings, 0, array.length); } return new ChoiceGroup((String)args[0], Choice.POPUP, strings, null); } default: return null; } } private static Int32 font2int(Font f) { return Int32.toInt32(f.getFace() | f.getSize() | f.getStyle()); } private static Font int2font(Int32 mask) { return Font.getFont(mask.value & 0x60, mask.value & 0x7, mask.value & 0x18); } }