📄 assigment.java
字号:
/*
* MC2 -- j2me spreadsheet
*
* Copyright (c) 2004-2006 Michael Zemljanukha (mixaz@mail.ru)
*
* 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 2 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, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.wapindustrial.calc;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import java.util.Vector;
class InputForm {
private static final int PROMPT_TYPE_TEXT = 0;
private static final int PROMPT_TYPE_INTEGER = 1;
private static final int PROMPT_TYPE_FLOAT = 2;
private static final int PROMPT_TYPE_DATE = 3;
private static final int PROMPT_TYPE_TIME = 4;
private static final int PROMPT_TYPE_DATETIME = 5;
private static final int PROMPT_TYPE_LIST = 100;
final LispObject formtitle; // if null it's not iteractive call (no user input)
final LispObject code; // functor this assigment is mapped to
FunctorList fields[];
LispObject values[];
Displayable screen;
InputForm( LispObject formtitle, LispObject code) {
this.formtitle = formtitle;
this.code = code;
}
private void collectFields(Vector fields, LispObject code) {
int type = code.typeNumber();
if(type==LispObject.TYPE_FUNCTORLIST) {
FunctorList fl = (FunctorList)code;
if(fl.functor==ScreenLite.SCREENLITE.table[ScreenLite.INDEX_PROMPT]) {
fields.addElement(fl);
}
// don't go into nested (input-form)
else if(fl.functor!=ScreenLite.SCREENLITE.table[ScreenLite.INDEX_INPUT_FORM]) {
int size = fl.listSize();
for(int i=1;i<size;i++) {
collectFields(fields,fl.getArgumentN(i));
}
}
return;
}
if(type==LispObject.TYPE_QUOTEDLIST) {
QuotedList fl = (QuotedList)code;
for(int i=0;i<fl.value.length;i++) {
collectFields(fields,fl.value[i]);
}
}
}
LispObject buildCode() throws EvaluateException {
extractFromForm(screen);
return buildCode(code);
}
LispObject buildCode(LispObject code) {
int type = code.typeNumber();
if(type==LispObject.TYPE_FUNCTORLIST) {
FunctorList fl = (FunctorList)code;
if(fl.functor==ScreenLite.SCREENLITE.table[ScreenLite.INDEX_PROMPT]) {
for(int i=0;i<fields.length;i++) {
if(fl==fields[i])
return values[i];
}
throw new IllegalStateException();
}
// don't go into nested (input-form)
else if(fl.functor!=ScreenLite.SCREENLITE.table[ScreenLite.INDEX_INPUT_FORM]) {
int size = fl.listSize();
boolean replace = false;
LispObject args[] = new LispObject[size];
args[0]=fl.functor;
for(int i=1;i<size;i++) {
LispObject oldarg = fl.getArgumentN(i);
LispObject newarg = buildCode(oldarg);
args[i] = newarg;
if(oldarg!=newarg)
replace = true;
}
if(replace)
return LispObject.createFunctorList(args);
}
}
if(type==LispObject.TYPE_QUOTEDLIST) {
QuotedList fl = (QuotedList)code;
boolean replace = false;
LispObject args[] = new LispObject[fl.value.length];
for(int i=0;i<fl.value.length;i++) {
LispObject oldarg = fl.value[i];
LispObject newarg = buildCode(oldarg);
args[i] = newarg;
if(oldarg!=newarg)
replace = true;
}
if(replace)
return new QuotedList(args);
}
return code;
}
void initialize() {
Vector ff = new Vector(10);
collectFields(ff,code);
int size = ff.size();
fields = new FunctorList[size];
values = new LispObject[size];
for(int i=0;i<size;i++) {
fields[i]=(FunctorList)ff.elementAt(i);
}
}
Displayable createForm() throws EvaluateException {
if(fields.length>1) {
Form form = new Form(formtitle.evaluateSExp().toValueString(0));
for(int ii=0; ii<fields.length; ii++) {
FunctorList fl = fields[ii];
int type = fl.getShort(1);
String label = fl.evaluateArg2().toValueString(0); // string w/o ""
LispObject value = fl.evaluateArg3();
switch(type) {
case PROMPT_TYPE_LIST:
{
ChoiceGroup cg = new ChoiceGroup( label, Choice.EXCLUSIVE );
LispObject items[] = ((QuotedList)value).value;
for( int i=0; i<items.length; i++ )
cg.append( items[i].toValueString(0), null );
form.append( cg );
break;
}
case PROMPT_TYPE_TEXT:
form.append( new TextField( label, value.toValueString(0), 256, TextField.ANY ) );
break;
case PROMPT_TYPE_INTEGER:
form.append( new TextField( label, value.toValueString(0), 256, TextField.NUMERIC ) );
break;
case PROMPT_TYPE_FLOAT:
form.append( new TextField( label, value.toValueString(0), 256, TextField.ANY ) );
break;
}
}
screen = form;
return form;
}
// Screen (fields.length=1)
Displayable screen = null;
FunctorList fl = fields[0];
int type = fl.getShort(1);
String label = formtitle.evaluateSExp().toValueString(0); // string w/o ""
LispObject value = fl.evaluateArg3();
switch(fields[0].getShort(1)) {
case PROMPT_TYPE_LIST:
{
List list = new List( label, Choice.EXCLUSIVE );
LispObject items[] = ((QuotedList)value).value;
for( int i=0; i<items.length; i++ )
list.append( items[i].toValueString(0), null );
screen = list;
break;
}
case PROMPT_TYPE_TEXT:
screen = new TextBox( label, value.toValueString(0), 256, TextField.ANY );
break;
case PROMPT_TYPE_INTEGER:
screen = new TextBox( label, value.toValueString( 0 ), 256, TextField.NUMERIC );
break;
case PROMPT_TYPE_FLOAT:
screen = new TextBox( label, value.toValueString( 0 ), 256, TextField.ANY );
break;
}
this.screen = screen;
return screen;
}
void extractFromForm(Displayable disp) throws EvaluateException {
if(fields.length>1) {
Form form = (Form) disp;
for(int ii=0; ii<fields.length; ii++) {
int type = fields[ii].getShort(1);
LispObject rez = LispObject.NIL;
switch(type) {
case PROMPT_TYPE_LIST:
{
ChoiceGroup cg = (ChoiceGroup) form.get( ii );
int indx = cg.getSelectedIndex();
if( indx != -1 )
rez = new StringAtom( cg.getString( indx ) );
break;
}
case PROMPT_TYPE_TEXT:
rez = new StringAtom( ((TextField)form.get( ii )).getString() );
break;
case PROMPT_TYPE_INTEGER:
rez = ShortAtom.createShortAtom( Short.parseShort( ((TextField)form.get( ii )).getString() ) );
break;
case PROMPT_TYPE_FLOAT:
rez = new FloatAtom( ((TextField)form.get( ii )).getString() );
break;
}
values[ii] = rez;
}
return;
}
// screen
int type = fields[0].getShort(1);
LispObject rez = LispObject.NIL;
switch(type) {
case PROMPT_TYPE_LIST:
{
List list = (List) disp;
int indx = list.getSelectedIndex();
if( indx != -1 )
rez = new StringAtom( list.getString( indx ) );
break;
}
case PROMPT_TYPE_TEXT:
rez = new StringAtom( ((TextBox)disp).getString() );
break;
case PROMPT_TYPE_INTEGER:
rez = ShortAtom.createShortAtom( Short.parseShort( ((TextBox)disp).getString() ) );
break;
case PROMPT_TYPE_FLOAT:
rez = new FloatAtom( ((TextBox)disp).getString() );
break;
}
values[0] = rez;
}
}
// UI item (assigments Lisp functions to menu & keypad)
public class Assigment {
short screenmode; // screen mode for keycodes (see CanvasHandler1.screenmode
short keycode; // keycode to press
short gameaction; // gameaction to press. Either gameaction or keycode is used. Gamecode is higher priority
Command command; // if not null it's a command binding
QuotedList goldkeys; // gold keys sequence
String menupath; // position in menu, if not null it's menu binding
// if both command and menupath = null it's keybinding
LispObject code;
// InputForm inputForm;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -