📄 panel.java
字号:
/* * Fire (Flexible Interface Rendering Engine) is a set of graphics widgets for creating GUIs for j2me applications. * Copyright (C) 2006 Bluebird co (www.bluebird.gr) * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * *//* * Created on Aug 25, 2006 */package gr.bluevibe.fire.components;import gr.bluevibe.fire.displayables.FireScreen;import gr.bluevibe.fire.util.CommandListener;import gr.bluevibe.fire.util.ComponentListener;import gr.bluevibe.fire.util.Lang;import java.util.Vector;import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Command;import javax.microedition.lcdui.Displayable;import javax.microedition.lcdui.Font;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Image;public class Panel extends Component implements ComponentListener{ /* Components */ private FTicker ticker; protected Vector rows = new Vector(); private Command cancelCmd=null; private Command leftCmd,rightCmd; private Popup leftPopup,rightPopup; private CommandListener commandListener; private String label = FireScreen.defaultLabel; private String labelStr = FireScreen.defaultLabel; /* Support vars */ protected FireScreen control=null; protected int internalHeight=0; protected int verticalOffset=0; protected int pointerPos=-1; protected int viewportHeight=0; protected int scrollY; protected boolean animateUp=false; protected boolean animateDown = false; private int scrollCount = 0; private boolean alertMode=false; private Row alertText = null; private boolean animatedChildren=false; public Panel() { control = FireScreen.getScreen(null); // get Singleton FireScreen. setWidth(control.getWidth()); setHeight(control.getHeight()); } public void paint(Graphics g) { // zogragizo ta giro giro. Image bgImage = control.getBgImage(); if(bgImage!=null) { g.drawImage(bgImage,0,0,Graphics.TOP|Graphics.LEFT); } int tickerClip = 0; if(ticker!=null) { tickerClip = FireScreen.defaultTickerFont.getHeight(); } int topOffset = FireScreen.getTopOffset(); int bottomOffset = FireScreen.getBottomOffset(); viewportHeight = (getHeight()-bottomOffset-topOffset-tickerClip); int ypos=topOffset; int htmp=0; Component row; int width = getWidth(); int height = getHeight(); int i; if(ticker!=null) { htmp = ticker.getHeight(); int trY = topOffset; int clipYa=0; int clipYb=htmp; g.translate(-g.getTranslateX(),-g.getTranslateY()); g.translate(0,trY); g.setClip(0,clipYa,width-FireScreen.SCROLLBAR_WIDTH,clipYb); ticker.paint(g); ypos+=htmp; } for(i =0 ;i<rows.size() && ypos<(verticalOffset+height);++i) { row = (Component)rows.elementAt(i); htmp = row.getHeight(); if(ypos+htmp>verticalOffset) { // arxizoume na zografizoume apo auto edo to row. int trY = ypos-verticalOffset; int clipYa=0; if(trY<(topOffset+tickerClip)) { clipYa = topOffset+tickerClip - trY; } int clipYb=htmp-clipYa; if(trY+htmp>viewportHeight) { clipYb = clipYb - ((trY+htmp)-(height-bottomOffset)); } g.translate(-g.getTranslateX(),-g.getTranslateY()); g.translate(0,trY); g.setClip(0,clipYa,width-FireScreen.SCROLLBAR_WIDTH,clipYb); row.paint(g); } ypos +=htmp; } /* Zografizoume ta ypolipa komatia tou interface. */ g.translate(-g.getTranslateX(),-g.getTranslateY()); g.setClip(0,0,width,height); if(internalHeight>viewportHeight) { if(animateDown || animateUp) { scrollY = (((verticalOffset+viewportHeight/2) * viewportHeight)/internalHeight) + topOffset; } if(scrollY<topOffset) scrollY=topOffset; if(scrollY>(getHeight()-bottomOffset-FireScreen.SCROLLBAR_HEIGHT)) scrollY = height-bottomOffset-FireScreen.SCROLLBAR_HEIGHT; g.setColor(FireScreen.defaultScrollColor); g.fillRect(width-FireScreen.SCROLLBAR_WIDTH+3,scrollY,FireScreen.SCROLLBAR_WIDTH-3,FireScreen.SCROLLBAR_HEIGHT); } Font labelFont = control.getLabelFont(); g.setFont(labelFont); g.setColor(FireScreen.defaultLabelColor); int lhpos = height-(((bottomOffset-2)/2)+(labelFont.getHeight()/2)); if(control.isBusyMode() && cancelCmd!=null) { // draw the cancel command String str = control.getLeftSoftKeyShortcut()+cancelCmd.getLabel(); g.drawString(str,2,lhpos,Graphics.TOP|Graphics.LEFT); } else { if(leftCmd!=null) { String str = control.getLeftSoftKeyShortcut()+leftCmd.getLabel(); g.drawString(str,2,lhpos,Graphics.TOP|Graphics.LEFT); } if(rightCmd!=null) { String str = control.getRightSoftKeyShortcut()+rightCmd.getLabel(); g.drawString(str,width-labelFont.stringWidth(str)-3,lhpos,Graphics.TOP|Graphics.LEFT); } } if(label!=null) { lhpos = (((topOffset-2)/2)-(labelFont.getHeight()/2)); int loff = 4; if(FireScreen.getLogoPossition()==FireScreen.LEFT) { loff= width - labelFont.stringWidth(label)-4; } g.drawString(label,loff,lhpos,Graphics.TOP|Graphics.LEFT); } if(alertMode) { g.translate(FireScreen.ALERT_HORIZONTAL_OFFSET,topOffset+viewportHeight/2-alertText.getHeight()/2); g.setClip(0,0,alertText.getWidth(),alertText.getHeight()); alertText.paint(g); } } public FTicker getTicker() { return ticker; } public void setTicker(FTicker ticker) { ticker.setWidth(getWidth()-FireScreen.SCROLLBAR_WIDTH); ticker.setHeight(FireScreen.defaultTickerFont.getHeight()); ticker.validate(); this.ticker = ticker; } public synchronized int add(Component cmp) { if(cmp.isAnimated()) { animatedChildren=true; } rows.addElement(cmp); int id = rows.size()-1; cmp.set_componentID(id); cmp.addValidateListener(this); return id; } public int countRows() { if(rows!=null) return rows.size(); return 0; } public boolean remove(Component cmp) { pointerPos=-1; boolean found =rows.removeElement(cmp); if(found) internalHeight-=cmp.getHeight(); return found; } public void remove(int pos) { pointerPos=-1; if(pos>=0 && pos<rows.size()) { Component c = (Component)rows.elementAt(pos); internalHeight-=c.getHeight(); rows.removeElementAt(pos); } } public boolean pointerEvent(int x, int y) { if(alertMode) { alertMode=false; alertText=null; return true; } int height = getHeight(); int width = getWidth(); int topOffset = FireScreen.getTopOffset(); if(ticker!=null) topOffset+=ticker.getHeight(); if(y>height-FireScreen.getBottomOffset()) { // event sto command bar (bottom border) if(leftCmd!=null) { if(x<=(FireScreen.defaultLabelFont.stringWidth(leftCmd.getLabel())+2)) { return keyEvent(Canvas.GAME_A); } } if(rightCmd!=null) { if(x>=(width-FireScreen.defaultLabelFont.stringWidth(rightCmd.getLabel())-2)) { return keyEvent(Canvas.GAME_B); } } } else if(y>topOffset && x<width-FireScreen.SCROLLBAR_WIDTH) { // event se kapoio component tou Panel int i,tmpHeight=0; Component c=null; for(i=0;i<rows.size();++i) { c=(Component)rows.elementAt(i); tmpHeight+=c.getHeight(); if((tmpHeight-verticalOffset+topOffset)>=y) break; } if(pointerPos==i) // fire event. { tmpHeight = tmpHeight-c.getHeight(); c.pointerEvent(x,y+verticalOffset-tmpHeight-topOffset); return true; } if(i==rows.size()) { // no component in tap location. return true; } // selection event. if(pointerPos>=0) { // deselect old selected component Component old = (Component)rows.elementAt(pointerPos); old.setSelected(false); } pointerPos=i; Component sel = (Component)rows.elementAt(pointerPos); sel.setSelected(true); sel.pointerEvent(x,y+verticalOffset-tmpHeight-topOffset); return true; } else if(internalHeight>viewportHeight) { // scrollbar action. if(y>scrollY) { return keyEvent(Canvas.RIGHT); } if(y<scrollY) { return keyEvent(Canvas.LEFT); } } return false; } private int getNextTraversableComponent(int pointer,boolean down) { int end; if(down) { end = rows.size(); for(int i=(pointer+1);i<end;++i) { Component c = (Component)rows.elementAt(i); if(c.isTraversable()) return i; } } else { for(int i=(pointer-1);i>-1;--i) { Component c = (Component)rows.elementAt(i); if(c.isTraversable()) return i; } } return -1; } public boolean keyEvent(int key) { if(alertMode) { alertMode=false; alertText=null; return true; } //if(rows.size()==0) return false; boolean repaint=false; Component row=null; if((key==Canvas.UP || key==Canvas.DOWN) && pointerPos==-1) { int h =0; int i; for(i =0;i<rows.size() && h<verticalOffset;++i) { h += ((Component)rows.elementAt(i)).getHeight(); } pointerPos = getNextTraversableComponent(i-1,true); if(pointerPos>-1) { row = ((Component)rows.elementAt(pointerPos)); row.keyEvent(key); recalculateVecticalOffset(); } else { if(key==Canvas.UP) { return keyEvent(Canvas.LEFT); } else if(key==Canvas.DOWN) { return keyEvent(Canvas.RIGHT); } } return true; } else if(pointerPos!=-1 && key!=Canvas.GAME_A && key!=Canvas.GAME_B) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -