?? softbutton.java
字號:
/********************************************************************
* 項目名稱 :<b>足球項目j2me客戶端</b> <br/>
*
* Copyright 2005-2006 Teesoo. All rights reserved
********************************************************************/
package org.wuhua.wap.ui;
import java.util.Vector;
import javax.microedition.lcdui.Graphics;
import org.wuhua.wap.Resources;
import org.wuhua.wap.log.Logger;
import org.wuhua.wap.ui.core.Platform;
import org.wuhua.wap.ui.event.CommandListener;
import org.wuhua.wap.util.GraphicsUtil;
/**
* <b>類名:SoftButton.java</b> </br> 編寫日期: 2006-9-14 <br/>
* 程序功能描述: 個人認為這里的代碼設計的不好,重復代碼過多,應該重構,應該把那些命令的繪制當做一個容器來管理<br/> Demo:
* <br/> Bug: <br/>
*
* 程序變更日期 :<br/> 變更作者 :<br/> 變更說明 :<br/>
*
* @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a>
*/
public class SoftButton extends Part {
Logger logger = Logger.getLogger("SoftButton");
/** 軟鍵 * */
private CommandListener commandListener;
private Vector left;
private Command right;
private Command middle;
private boolean isSelectLeftCmd;
private boolean isSelectLeftCmdItem;
private int leftCmdItemIndex;
private int leftItemIndexStart;
private int leftCmdIndex;
private int numOfEls;
private int itemNumOfEls;
private int startIndex;
private int paintSize = 5;
private int itemPaintSize = 5;
private Command currentCmd;
private SelectedPart selected;
private String menu = "菜單";
private String select = "選擇";
private String cancel = "取消";
/**
* 構造固定位置的軟鍵條
*
*/
public SoftButton() {
super(0, Platform.HEIGHT - 20, Platform.WIDTH, Platform.HEIGHT);
selected = new SelectedPart();
}
/**
* 添加一列,我的想法是讓左列軟件可以多個
*
* @param item
*/
public void addCommand(Command cmd) {
if (cmd.type == Command.LEFT)
addCommandLeftImpl(cmd);
else if (cmd.type == Command.RIGHT) {
this.right = cmd;
} else if (cmd.type == Command.MIDDLE) {
this.middle = cmd;
}
}
/**
* 推進去
*
* @param cmd
*/
private void addCommandLeftImpl(Command cmd) {
if (left == null)
left = new Vector();
left.addElement(cmd);
numOfEls = left.size();
}
/**
* 判斷當前選擇條是否到了底部,經過用戶的選擇,這些選擇條會不斷的變化</br> 變化的依據是當selectPosition >=
* viewPart[HEIGHT]*/
private void changeSelectIndex(){
int num = (this.paintSize < numOfEls)?paintSize:numOfEls;//取可顯示的菜單項數目
if (leftCmdIndex>num-1)
{
startIndex++;
leftCmdIndex=(byte)(num-1);
}
if (leftCmdIndex < 0)
{
if (startIndex>0)
{
leftCmdIndex =0;
startIndex--;
}
else
{
startIndex = numOfEls-num;
leftCmdIndex=num-1;
}
}
if (startIndex+ leftCmdIndex > numOfEls -1)
{
startIndex= 0;
leftCmdIndex = 0;
}
}
// 判斷是否存在這個命令,如果為空,或者標題為""則表示不存在
private boolean cmdIsExist(Command cmd) {
if (cmd == null || cmd.equals(""))
return false;
else
return true;
}
private void enterAction() {
if(this.isSelectLeftCmd){
leftAction();
}
}
// 填充cmds區域
private void fillCmdsClip(Graphics g) {
if (Platform.HEIGHT - 20 > this.view[HEIGHT]) {
view[Y] = Platform.HEIGHT - 20;
view[HEIGHT] = Platform.HEIGHT;
}
g.setColor(bgColor);
g.fillRect(view[X], view[Y], view[WIDTH], view[HEIGHT]);
g.setColor(0xFFFFFF);
// 畫條白線
g.drawLine(view[X], view[Y] - 1, view[WIDTH], view[Y] - 1);
}
/**
* 填充顏色并且繪制左列菜單出來
*
*/
private void fillLeftBackground(Graphics g) {
int size = paintSize > numOfEls? numOfEls:this.paintSize + startIndex;
int height = (paintSize>numOfEls?numOfEls:paintSize) * font.getHeight() + 2;
int width = 60;
int startY = Platform.HEIGHT - 23 - height;
paintCmdNameImpl(g,size,this.startIndex,this.leftCmdIndex,0, startY,width, height,left);
paintLeftCmdItem(g);
}
/**
* 把那些cmd繪制出來
* @param g
* @param startX
* @param startY
* @param items
*/
private void paintCmdNameImpl(Graphics g,int size, int startIndex, int selectIndex, int startX, int startY,int width, int height,Vector items) {
GraphicsUtil.drawSreenBorder(g, 0x000000, startX, startY-2, width+3, height+3);
GraphicsUtil.drawSreenBorder(g, 0xFFFFFF, startX + 1, startY-1 , width+1, height+1);
GraphicsUtil.fillSreen(g, this.bgColor, startX + 2, startY, width, height);
// 繪制選擇條
//GraphicsUtil.fillSreen(g, 0xFFFFF, startX + 2, startY + font.getHeight()*selectedIndex ,
// width, font.getHeight()+2 );
selected.changePosition(startX + 2, startY + font.getHeight()*selectIndex, width, font.getHeight()+2);
selected.paint(g);
g.setColor(fontColor);
for(int i =startIndex,j=0; i< size; i++, j++){
Command cmd;
if( selectIndex == j){
cmd = (Command) items.elementAt(selectIndex+startIndex);
}else{
cmd = (Command) items.elementAt(i);
}
g.drawString(cmd.getName(), startX + 10, startY + 2 + font.getHeight() * j,
Graphics.TOP | Graphics.LEFT);
cmd.setHeight(startY + 2 + font.getHeight() * j);
//繪制箭頭
if(cmd.hasItem()){
g.drawImage(Resources.ARROW, font.stringWidth(cmd.getName()) + startX + 20, startY + 2 + font.getHeight() * j + 4,
Graphics.TOP | Graphics.LEFT);
}
}
}
/**
* 繪制CmdItem。
* @param g
*/
private void paintLeftCmdItem(Graphics g) {
if(this.isSelectLeftCmdItem){
currentCmd = (Command)left.elementAt(this.leftCmdIndex + this.startIndex);
if(currentCmd.hasItem()){
Vector items = currentCmd.getItems();
itemNumOfEls = items.size();
int size = itemPaintSize > itemNumOfEls ? itemNumOfEls:this.itemPaintSize + this.leftItemIndexStart;
int height = (itemPaintSize>itemNumOfEls?itemNumOfEls:itemPaintSize) * font.getHeight() + 2;
int width = 60;
paintCmdNameImpl(g,size,this.leftItemIndexStart,this.leftCmdItemIndex,50, currentCmd.getHeight() - 30,width, height,items);
}
}
}
/**
* 友鍵動作
*
*/
private void leftAction() {
if(left.size() == 1){
commandListener.commandAction((Command) left.elementAt(0));
return;
}
if (isSelectLeftCmd) {
Command cmd = (Command) left.elementAt(leftCmdIndex + startIndex);
if(cmd.hasItem()){
if(isSelectLeftCmdItem){
Vector items = cmd.getItems();
cmd = (Command)items.elementAt(this.leftCmdItemIndex + this.leftItemIndexStart);
commandListener.commandAction(cmd);
isSelectLeftCmdItem = false;
}else{
isSelectLeftCmdItem = true;
}
}else{
commandListener.commandAction(cmd);
}
logger.debug(cmd.getName());
if(!isSelectLeftCmdItem){
isSelectLeftCmd = false;
return;
}
}
this.isSelectLeftCmd = true;
}
/**
* 左列上下動作
* @param keyCode
*/
private void leftUpAndDown(int keyCode) {
if(!isSelectLeftCmd)
return;
if(!isSelectLeftCmdItem)
leftCmdAction(keyCode);
else
leftCmdItemUpAndDown(keyCode);
}
private void leftCmdAction(int keyCode) {
if(this.numOfEls == 0)
return;
switch (keyCode) {
case Platform.KEY_UP: {
leftCmdIndex--;
break;
}
case Platform.KEY_DOWN: {
leftCmdIndex++;
break;
}
}
changeSelectIndex();
}
/**
* 左列上下動作
* @param keyCode
*/
private void leftCmdItemUpAndDown(int keyCode) {
if(this.itemNumOfEls == 0)
return;
switch (keyCode) {
case Platform.KEY_UP: {
leftCmdItemIndex--;
break;
}
case Platform.KEY_DOWN: {
leftCmdItemIndex++;
break;
}
}
changeSelectLeftItmeIndex();
}
private void changeSelectLeftItmeIndex() {
int num = (this.itemPaintSize < itemNumOfEls)?itemPaintSize:itemNumOfEls;//取可顯示的菜單項數目
if (leftCmdItemIndex>num-1)
{
leftItemIndexStart++;
leftCmdItemIndex=(byte)(num-1);
}
if (leftCmdItemIndex < 0)
{
if (leftItemIndexStart>0)
{
leftCmdItemIndex =0;
leftItemIndexStart--;
}
else
{
leftItemIndexStart = itemNumOfEls-num;
leftCmdItemIndex=num-1;
}
}
if (leftItemIndexStart+ leftCmdItemIndex > itemNumOfEls -1)
{
leftItemIndexStart= 0;
leftCmdItemIndex = 0;
}
}
/**
* 按鈕的動作
*/
public void onClick(int keyCode) {
if (this.commandListener == null)
return;
if (keyCode == Platform.KEY_SOFT_LEFT) {
leftAction();
} else if (keyCode == Platform.KEY_SOFT_RIGHT && cmdIsExist(right)) {
rightAction();
} else if (keyCode == Platform.KEY_ENTER) {
enterAction();
}else if(keyCode == Platform.KEY_UP || keyCode == Platform.KEY_DOWN){
leftUpAndDown(keyCode);
}else if(keyCode == Platform.KEY_RIGHT || keyCode == Platform.KEY_LEFT){
leftItemLeftAndRight(keyCode);
}
}
/**
* 左列菜單左右事件
* @param keyCode
*/
private void leftItemLeftAndRight(int keyCode) {
currentCmd = (Command) left.elementAt(leftCmdIndex + startIndex);
if(!currentCmd.hasItem()
|| this.numOfEls <=0)
return;
switch (keyCode) {
case Platform.KEY_RIGHT: {
isSelectLeftCmdItem = true;
break;
}
case Platform.KEY_LEFT: {
isSelectLeftCmdItem = false;
this.itemNumOfEls = 0;
this.leftCmdItemIndex = 0;
this.leftItemIndexStart = 0;
break;
}
}
}
public void paint(Graphics g) {
//獲取Form的字體,保存到下面
this.font = g.getFont();
paintCmdsImpl(g);
}
/**
* 繪制cmds
*/
private void paintCmdsImpl(Graphics g) {
fillCmdsClip(g);
paintCmdNames(g);
}
private void paintCmdNames(Graphics g) {
g.setFont(this.font);
g.setColor(fontColor);
if (left != null) {
// 如果選擇列表的時候,要繪制取消跟選擇所以就只好return
if (isSelectLeftCmd) {
paintLeftImpl(g);
paintSelectAndCancel(g);
return;
} else {
if(left.size()== 1){
g.drawString(((Command)left.elementAt(0)).getName(), view[X], view[Y] + (20-font.getHeight())/2, Graphics.LEFT
| Graphics.TOP);
}else{
g.drawString(menu, view[X], view[Y] + (20-font.getHeight())/2, Graphics.LEFT
| Graphics.TOP);
}
}
}
if (middle != null) {
g.drawString(middle.name, view[WIDTH] / 2, view[Y] + (20-font.getHeight())/2,
Graphics.HCENTER | Graphics.TOP);
}
if (right != null) {
g.drawString(right.name, view[WIDTH] - 2, view[Y] + (20-font.getHeight())/2, Graphics.TOP
| Graphics.RIGHT);
}
}
/**
* 繪制菜單的實現
*
* @param g
*/
private void paintLeftImpl(Graphics g) {
if (left == null)
return;
fillLeftBackground(g);
}
/*
* 繪制選擇跟取消
*/
private void paintSelectAndCancel(Graphics g) {
g.drawString(select, view[X], view[Y] + (20-font.getHeight())/2, Graphics.LEFT | Graphics.TOP);
g.drawString(cancel, view[WIDTH] - 2, view[Y] + (20-font.getHeight())/2, Graphics.TOP
| Graphics.RIGHT);
}
/** 刪除相應的Command */
public void removeCommand(Command cmd) {
if (cmd.type == Command.LEFT)
removeCommandLeftImpl(cmd);
else if (cmd.type == Command.MIDDLE)
middle = null;
else if (cmd.type == Command.RIGHT)
right = null;
}
/**
* 刪除左列表的cmd,通過查找方式刪除
* @param cmd
*/
private void removeCommandLeftImpl(Command cmd) {
boolean ok = false;
if (left != null)
ok = left.removeElement(cmd);
if(ok)
return;
else{
for(int i =0; i < left.size(); i++){
Command c = (Command) left.elementAt(i);
if(c.hasItem())
c.removeCommandItem(cmd);
}
}
}
private void rightAction() {
if (isSelectLeftCmd) {
isSelectLeftCmd = false;
return;
}
commandListener.commandAction(right);
}
/**
* 注冊監視器
*/
public void setCommandListener(CommandListener commandListener) {
this.commandListener = commandListener;
}
public void setSelectedStyle(int selectColor){
this.selected.setStyle(selectColor, fontColor);
}
public final void setCancel(String cancel) {
this.cancel = cancel;
}
public final void setMenu(String menu) {
this.menu = menu;
}
public final void setSelect(String select) {
this.select = select;
}
public int getHeight() {
// TODO 自動生成方法存根
return 0;
}
public final boolean isSelectLeftCmd() {
return isSelectLeftCmd;
}
public int getWidth() {
return font.stringWidth(text);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -