📄 inlist.java
字号:
package inline.ui.ce;
import inline.ui.*;
import java.util.*;
import javax.microedition.lcdui.*;
import inline.ui.le.ListElement;
public class InList extends CanvasElement
{
private static final int SPEED_STEPS = 4;
private static final int SCROLLER_WIDTH = 2;
private Vector vct;
private Hashtable accelerators;
private boolean fastscroll;
private int vctsel = 0;
private int intsta = 0;
private int intend = 0;
private static final int TTT_LIST_INACTIVITY = 0x6F41EF07;
private Timer inactititytimer;
public InList(HostCanvas prnt, int x, int y, int w, int h)
{
super(prnt, x,y,w,h);
vct = new Vector();
accelerators = new Hashtable();
fastscroll = true;
}
public InList(HostCanvas prnt)
{
this(prnt, 0,0,0,0);
}
public final boolean canFocus()
{
return true;
}
public final void assignNumberAccelerators()
{
if (vct.size()>0 && vct.size()<9)
{
for(int i =0;i<vct.size();i++)
{
ListElement ev = (ListElement)vct.elementAt(i);
if (ev != null)
{
accelerators.put(new Integer('1'+i), ev);
}
}
}
}
public void setLines(Vector evct)
{
vct = evct;
vctsel = 0;
intsta = 0;
for(int i =0;i<vct.size();i++)
{
ListElement ev = (ListElement)vct.elementAt(i);
int ac = ev.getAccelerator();
if (ac != 0)
{
accelerators.put(new Integer(ac), ev);
}
}
intend = getVisibleRows()-1;
}
public Vector getLines()
{
return vct;
}
public int getSelectedIndex()
{
return vctsel;
}
public String getSelectedText()
{
ListElement ev = (ListElement)vct.elementAt(vctsel);
return ev.getString();
}
public void setSelectedIndex(int idx)
{
if (vct.size()==0) return;
if (idx>=vct.size()) idx = vct.size()-1;
int ovs = vctsel;
while(idx!=vctsel)
{
if (idx>vctsel)
{
SelectionDown();
}
else
{
SelectionUp();
}
}
if (ovs != vctsel) clearAutoScrollCounter();
}
public void moveSelectionDown()
{
SelectionDown();
}
public ListElement getSelectedElement()
{
if (vct.size()==0) return null;
return (ListElement)vct.elementAt(vctsel);
}
public void setFastScroll(boolean ffastscroll)
{
fastscroll = ffastscroll;
}
private int getLimit()
{
int lim = getHeight() / fnthei;
if (lim>=vct.size())
{
lim = vct.size();
}
return lim;
}
private int getVisibleRows()
{
int vis = 0;
for(int i=0;i<getLimit();i++)
{
ListElement ev = (ListElement)vct.elementAt(intsta+i);
vis += ev.getRowsCount();
}
return vis;
}
public void paintElement(Graphics g)
{
synchronized (g)
{
int bgcolor = getBackgroundColor();
int fgcolor = getForegroundColor();
int lim = getLimit();
{
int scy = 0;
int sch;
int vis = 0;
for(int i=0;i<lim;i++)
{
ListElement ev = (ListElement)vct.elementAt(intsta+i);
vis += ev.getRowsCount();
intend = intsta+i+(ev.getRowsCount()-1);
}
if (vct.size()==0)
{
sch = getHeight();
}
else
{
sch = getHeight()*vis/vct.size();
}
if (vct.size()>1)
{
scy = vctsel*(getHeight()-sch)/(vct.size()-1);
}
if (sch<g.getClipHeight())
{
g.setColor(fgcolor);
g.fillRect(getWidth()-SCROLLER_WIDTH, scy, SCROLLER_WIDTH, sch);
g.setClip(g.getClipX(),g.getClipY(), g.getClipWidth()-SCROLLER_WIDTH-1, g.getClipHeight());
}
}
for(int i=0;i<lim;i++)
{
ListElement ev = (ListElement)vct.elementAt(intsta+i);
int asc = -1;
if (vctsel == intsta+i)
{
g.setColor(fgcolor);
g.fillRect(0, i*fnthei, getWidth(), ev.getRowsCount()*fnthei);
g.setColor(bgcolor);
asc = getAutoScrollCounter();
}
else
{
g.setColor(fgcolor);
}
if (ev.ownerDraw())
{
ev.onDraw(g, this, 0, i*fnthei, asc);
}
else
{
paintStringASC(this, g,ev.getString(),1,i*fnthei,0, 1, asc);
}
i = i+(ev.getRowsCount()-1);
intend = intsta+i;
}
}
}
public void keyPressedElement(int keyCode)
{
boolean paint = false;
if (inactititytimer != null)
{
startInactivityTimer();
}
if (vct.size()==0)
{
return;
}
if (keyCode == UP)
{
SelectionUp();
wantRepaint();
wantKeyRepeat();
}
if (keyCode == DOWN)
{
SelectionDown();
wantRepaint();
wantKeyRepeat();
}
if (keyCode == LEFT && fastscroll)
{
for(int i=0;i<SPEED_STEPS;i++)
{
SelectionUp();
}
wantRepaint();
wantKeyRepeat();
}
if (keyCode == RIGHT && fastscroll)
{
for(int i=0;i<SPEED_STEPS;i++)
{
SelectionDown();
}
wantRepaint();
wantKeyRepeat();
}
Object accobj = accelerators.get(new Integer(keyCode));
ListElement le;
if (accobj != null)
{
le = (ListElement)accobj;
}
else
{
le = (ListElement)vct.elementAt(vctsel);
}
if ((keyCode == CENTER) || (accobj != null))
{
boolean repaint = le.onSelect();
parent.selectPreview(le);
if (repaint)
{
wantRepaint();
}
}
if (le!=null && le.deliverKeys())
{
if (le.keyPressedElement(keyCode, this))
{
wantRepaint();
};
}
}
private final void SelectionUp()
{
if (vct.size()==0) return;
if (vctsel>0)
{
vctsel--;
if (vctsel<intsta)
{
intsta--;
}
}
else
{
vctsel = vct.size()-1;
int haverows = getHeight()/fnthei;
int sum = 0;
intsta = vctsel;
while((sum<haverows) && (intsta>=0))
{
sum+=((ListElement)vct.elementAt(intsta)).getRowsCount();
intsta--;
}
intsta++;
}
}
private final void SelectionDown()
{
if (vct.size()==0) return;
if (vctsel<vct.size()-1)
{
vctsel++;
if (vctsel>intend)
{
intsta++;
}
}
else
{
vctsel = 0;
intsta = 0;
}
}
protected int getContentWidthImpl()
{
int maxw = 0;
if (vct!=null)
{
for(int i=0;i<vct.size();i++)
{
ListElement le = (ListElement)vct.elementAt(i);
int letw = selectedFont.stringWidth(le.getString());
if (maxw<letw) maxw=letw;
}
}
maxw += 4; // scroller
return maxw;
}
protected int getContentHeightImpl()
{
int maxh = 0;
if (vct!=null)
{
maxh = vct.size()*selectedFont.getHeight();
}
return maxh;
}
public void OnSizeChanged()
{
int presel = vctsel;
vctsel = 0;
intsta = 0;
intend = getVisibleRows()-1;
setSelectedIndex(presel);
}
public void startInactivityTimer()
{
clearInactivityTimer();
inactititytimer = getParent().newSingleShotTimer(inactititytimer,
TTT_LIST_INACTIVITY,
20000, // 20 sec
this);
}
private void clearInactivityTimer()
{
inactititytimer = getParent().killTimer(inactititytimer);
}
public void onTimer(int tag, long delta)
{
super.onTimer(tag, delta);
if (tag == TTT_LIST_INACTIVITY)
{
parent.selectPreview(this);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -