📄 waprender.java
字号:
package com.gameislive.browser;
import java.util.Hashtable;
import java.util.Vector;
import java.util.Enumeration;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import com.gameislive.browser.element.*;
/**
* 渲染器,支持WML1.0和部分WML1.1标记
*
* @author pan
*
*/
public class WapRender {
private Browser browser;
private int width,height;
/**
* 当前浏览的页面的标题
*/
private String title;
/**
* 当前渲染参考点
*/
private int curRenderX,curRenderY;
private int curDrawY;
/**
* 所有可渲染到屏幕的元素
*/
private Vector elements;
/**
* 超链接元素
*/
private Vector hotSpots;
/**
* 该页面中的所有Form元素
*/
private Hashtable formElements;
/**
* 保存由link标记连接的css文件数据
*/
private Hashtable cssData;
/**
* 文档被渲染后的行数
*/
private int lineNum;
/**
* 当前行内最高的元素(一行可以包括图片和文字,当某图片够高时,最高的就是这张图片了)
*/
private int curLineMaxHeight;
/**
* 当前检查的标记Id
*/
private int curTagId;
/**
* 超链接个数
*/
private int hotSpotNum;
/**
* 元素总个数
*/
private int elementNum;
private int curHyperlinks;
/**
* 滚动条宽和高
*/
int scrollBarWidth,scrollBarHeight;
/**
* 滚动条位置
*/
int scrollBarX,scrollBarY;
int browserWidth,browserHeight;
int _css_bgColor = 0xffffff;
int _css_foreColor = 0x000000;
public WapRender(Browser browser){
this.browser = browser;
this.width = browser.width;
this.height = browser.height;
hotSpots = new Vector();
elements = new Vector();
formElements = new Hashtable();
scrollBarWidth = 5;
scrollBarX = width - scrollBarWidth - 1;
scrollBarY = 0 + 1;
scrollBarHeight = height - (scrollBarY << 1);
browserWidth = width - scrollBarWidth - 2;
browserHeight = height;
}
/**
* 重新设置渲染器,每次渲染新文档前都要先重设
*/
public void reset(){
hotSpots.removeAllElements();
elements.removeAllElements();
if(cssData!=null){
cssData.clear();
cssData = null;
}
formElements.clear();
curRenderX = 0;
curRenderY = 0;
curDrawY = 0;
lineNum = 0;
curTagId = 0;
elementNum = 0;
hotSpotNum = 0;
curHyperlinks = 0;
startDrawElement = 0;
lastDrawElement = 0;
hyperlinksInElementPos = 0;
inHyperlinks = false;
curLineMaxHeight = 0;
_css_bgColor = 0xffffff;
_css_foreColor = 0x000000;
}
/**
* 退出browser的时候所做的"手工"清理工作
*/
public void destory(){
try{
hotSpots.removeAllElements();
elements.removeAllElements();
hotSpots = null;
elements = null;
if(cssData!=null){
cssData.clear();
cssData = null;
}
}catch(Exception e){
e.printStackTrace();
}
}
public String getTitle(){
if(title==null){
return "";
}else{
return title;
}
}
public int getCurLoadedTag(){
return curTagId;
}
public void addElement(Element element){
elements.addElement(element);
elementNum++;
}
public Element getElement(int index){
if(index>=0 && index<elementNum){
return (Element)elements.elementAt(index);
}else{
return null;
}
}
public int getElementNum(){
return elementNum;
}
public void addHotSpot(HotSpot hotspot){
hotSpots.addElement(hotspot);
hotSpotNum++;
}
public HotSpot getHotSpot(){
if(hotSpots.size()<=0){
return null;
}else{
return (HotSpot)hotSpots.elementAt(curHyperlinks);
}
}
/**
* 当前选择的超链接在元素中的位置
*/
private int hyperlinksInElementPos;
/**
* 最后一次显示时开始和结束元素编号
*/
private int lastDrawElement,startDrawElement;
/**
* 滚动超链接到下一个,并考虑是否滚动页面
*/
public void scrollUp(){
if(curHyperlinks > 0){
if(hyperlinksInElementPos >= startDrawElement){
hyperlinksInElementPos = ((HotSpot)hotSpots.elementAt(--curHyperlinks)).elementId;
}
if(hyperlinksInElementPos < startDrawElement){
curDrawY -= (browser.fontHeight << 0);
if(curDrawY < 0){
curDrawY = 0;
}
}
}else if(curDrawY > 0){
curDrawY -= (browser.fontHeight << 0);
if(curDrawY < 0){
curDrawY = 0;
}
}
}
/**
* 滚动超链接到上一个,并考虑是否滚动页面
*/
public void scrollDown(){
if(curHyperlinks < hotSpotNum - 1){
if(hyperlinksInElementPos < lastDrawElement){
hyperlinksInElementPos = ((HotSpot)hotSpots.elementAt(++curHyperlinks)).elementId;
}
if(hyperlinksInElementPos >= lastDrawElement){
curDrawY += (browser.fontHeight << 0);
}
}else if(curDrawY < curRenderY - browserHeight){
curDrawY += (browser.fontHeight << 0);
if(curDrawY > curRenderY - browserHeight){
curDrawY = curRenderY - browserHeight;
}
}
}
/**
* 开始解释标记,其中destcardid表示需要解释的cardId<br>
* 一个页面可能包括多个card,但只能有一个被渲染
* @param pendingTag
* @param destcardid
*/
public void explainTag(Vector pendingTag,String destcardid){
try{
Tag tag = null;
Object obj = null;
for(Enumeration e = pendingTag.elements();e.hasMoreElements();){
obj = e.nextElement();
curTagId++;
if(obj instanceof Tag){
tag = (Tag)obj;
if(tag.getName().equals("head")){
dealTag_Head(e,tag);
}else if(tag.getName().equals("do")){
dealTag_Do(e,tag);
}else if(tag.getName().equals("card") && tag.getState() == Tag.TAG_OPEN){
String cardid = tag.getParm("id");
if(cardid == null) cardid = "";
if((destcardid==null || destcardid.equals("")) ||
cardid.equals(destcardid)){
dealBaseTag(e,tag,null);
destcardid = cardid;
}else{
// not this card,nothing to do...
ignoreTag(e,tag);
}
}else if(tag.getName().equals("body") && tag.getState() == Tag.TAG_OPEN){
Css css = getTagCss(tag,null);
if(css!=null){
_css_bgColor = css.bgColor;
}
dealBaseTag(e,tag,css);
}else{
//System.out.println("[unknow tag] "+tag);
}
}else{
// 普通文字
dealNormalText((String)obj,null);
}
}
curRenderY += curLineMaxHeight;
// // 添加两个空行作为结束符号
// addElement(new NormalText("",false,-1,++lineNum,browser));
// addElement(new NormalText("",false,-1,++lineNum,browser));
// curRenderY += (browser.fontHeight << 1);
}catch(Exception ex){
ex.printStackTrace();
}
}
/**
* 跳过当前指定的标记
* @param e
* @param tag
*/
private void ignoreTag(Enumeration e,Tag tag){
String name = tag.getName();
Object obj = null;
while(true){
obj = e.nextElement();
curTagId++;
if(obj instanceof Tag){
tag = (Tag)obj;
if(tag.getName().equals(name) && tag.getState() == Tag.TAG_CLOSE){
break;
}
}
}
}
/**
* 获得某一标记的可能的CSS样式,由于上一级标记也可能存在CSS<br>
* 因此,参数father表示上一级的CSS
* @param tag
* @param father
* @return
*/
private Css getTagCss(Tag tag,Css father){
Css css = null;
Vector tmpVector = null;
if(cssData!=null){
String className = tag.getParm("class");
if(className!=null && !className.equals("")){
tmpVector = (Vector)cssData.get(className);
}else{
// 根据标记名字来获取CSS样式
tmpVector = (Vector)cssData.get(tag.getName());
}
}
if(tmpVector == null){
String style = tag.getParm("style");
// 根据标记中的style属性来获取CSS样式,例如:
// style="color:#ff9900; font-size:12pt"
if(style!=null && !style.equals("")){
style = Tools.RepString(style, " ", "");
tmpVector = new Vector();
do{
int index = style.indexOf(";");
if(index==-1){
tmpVector.addElement(style+";");
break;
}else{
tmpVector.addElement(style.substring(0,index+1));
style = style.substring(index+1);
}
}while(true);
}
}
if(tmpVector!=null){
css = new Css(tmpVector,father,browser);
}
return css;
}
/**
* 临时的,保存form元素行为内容
*/
String tmpFormAction,tmpFormMethod;
/**
* 临时的,保存form内的元素
*/
Vector tmpFormElement;
boolean inForm;
/**
* 此处处理的标记包括可能嵌套的标记<br>
* <br>
* 可嵌套,可递归
* <br>
* @param e
* @param tag
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -