⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 waprender.java

📁 手机程序
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
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 + -