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

📄 containerview.java

📁 j2me polish学习的经典代码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
//#condition polish.usePolishGui
/*
 * Created on Oct 27, 2004 at 7:03:40 PM.
 *
 * Copyright (c) 2004-2005 Robert Virkus / Enough Software
 *
 * This file is part of J2ME Polish.
 *
 * J2ME Polish is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * J2ME Polish 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with J2ME Polish; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * 
 * Commercial licenses are also available, please
 * refer to the accompanying LICENSE.txt or visit
 * http://www.j2mepolish.org for details.
 */
// package de.enough.polish.ui;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;

//import de.enough.polish.util.ArrayList;
//import de.enough.polish.util.TextUtil;

/**
 * <p>Is responsible for visual representation and interpretation of user-input.</p>
 * <p>Copyright Enough Software 2004, 2005</p>
 * <pre>
 * history
 *        Oct 27, 2004 - rob creation
 * </pre>
 * @author Robert Virkus, robert@enough.de
 */
public class ContainerView {
	//#if polish.css.columns || polish.useTable
		//#define tmp.useTable
		//#ifdef polish.css.columns-width.star
			//# private int starIndex;
		//#endif
//# 			
	//#endif
	
	private static final int NO_COLUMNS = 0;
	private static final int EQUAL_WIDTH_COLUMNS = 1;
	private static final int NORMAL_WIDTH_COLUMNS = 2;
	private static final int STATIC_WIDTH_COLUMNS = 3;

	protected int yOffset;
	protected int contentWidth;
	protected int contentHeight;
	protected int focusedIndex = -1;
	/** this field is set automatically, so that subclasses can use it for referencing the parent-container */
	protected Container parentContainer;
	/** determines whether any animation of this view should be (re) started at the next possibility. this is set to "true" in each showNotify() method. */
	protected boolean restartAnimation;
	protected int paddingVertical;
	protected int paddingHorizontal;
	protected int layout;
	protected boolean focusFirstElement;
	protected int appearanceMode;
	protected boolean isFocused;
	protected Item focusedItem;
	
	// table support:
	protected int columnsSetting = NO_COLUMNS;
	protected int numberOfColumns;
	protected int[] columnsWidths;
	protected int[] rowsHeights;
	protected int numberOfRows;
	protected boolean isLayoutCenter;
	protected boolean isLayoutRight;
	
	protected boolean allowCycling = true;
	
	//#if polish.css.view-type-left-x-offset
		//# protected int leftXOffset;
	//#endif
	//#if polish.css.view-type-right-x-offset
		//# protected int rightXOffset;
	//#endif
	//#if polish.css.view-type-top-y-offset
		//# protected int topYOffset;
	//#endif


	/**
	 * Creates a new view
	 */
	protected ContainerView() {
		super();
	}
	
	/**
	 * Initialises this item. 
	 * The implementation needs to calculate and set the contentWidth and 
	 * contentHeight fields. 
	 * The style of the focused item has already been set.
	 *  
	 * @param parent the Container which uses this view, use parent.getItems() for retrieving all items. 
	 * @param firstLineWidth the maximum width of the first line 
	 * @param lineWidth the maximum width of any following lines
	 * @see #contentWidth
	 * @see #contentHeight
	 */
	protected void initContent( Container parent, int firstLineWidth, int lineWidth ) {
		//#debug
		//# System.out.println("ContainerView: intialising content for " + this + " with vertical-padding " + this.paddingVertical );
		//#if polish.Container.allowCycling != false
			this.allowCycling = parent.allowCycling;
			if (parent.parent == null ||
					 ( (parent.parent instanceof Container)  && ((Container)parent.parent).getItems().length>1) )
			{
				this.allowCycling = false;
			}
		//#endif
		//#if polish.css.view-type-left-x-offset
			//# lineWidth -= this.leftXOffset;
		//#endif
		//#if polish.css.view-type-right-x-offset
			//# lineWidth -= this.rightXOffset;
		//#endif

		
		this.parentContainer = parent;
		Item[] myItems = parent.items;

		//#ifdef tmp.useTable
			//# if (this.columnsSetting == NO_COLUMNS || myItems.length <= 1) {
		//#endif
			// look at the layout of the parentContainer, since the SHRINK layout can be set outside of the setStyle method as well:
			boolean isLayoutShrink = (this.parentContainer.layout & Item.LAYOUT_SHRINK) == Item.LAYOUT_SHRINK;
			int myContentWidth = 0;
			int myContentHeight = 0;
			boolean hasFocusableItem = false;
			for (int i = 0; i < myItems.length; i++) {
				Item item = myItems[i];
				//System.out.println("initalising " + item.getClass().getName() + ":" + i);
				int width = item.getItemWidth( firstLineWidth, lineWidth );
				int height = item.getItemHeight( firstLineWidth, lineWidth );
				// now the item should have a style, so it can be safely focused
				// without loosing the style information:
				if (item.appearanceMode != Item.PLAIN) {
					hasFocusableItem = true;
				}
				if (isLayoutShrink && i == this.focusedIndex) {
					width = 0;
				}
				if (width > myContentWidth) {
					myContentWidth = width; 
				}
				item.yTopPos = myContentHeight;
				item.yBottomPos = myContentHeight + item.itemHeight;
				myContentHeight += height + this.paddingVertical;
			}
			if (hasFocusableItem) {
				this.appearanceMode = Item.INTERACTIVE;
				if (isLayoutShrink && this.focusedItem != null) {
					Item item = this.focusedItem;
					//System.out.println("container has shrinking layout and contains focuse item " + item);
					item.isInitialised = false;
					boolean doExpand = item.isLayoutExpand;
					int width;
					if (doExpand) {
						item.isLayoutExpand = false;
						width = item.getItemWidth( lineWidth, lineWidth );
						item.isInitialised = false;
						item.isLayoutExpand = true;
					} else {
						width = item.itemWidth;
					}
					if (width > myContentWidth) {
						myContentWidth = width;
					}
				}
			} else {
				this.appearanceMode = Item.PLAIN;
			}
			
			//#if polish.css.view-type-top-y-offset
				//# this.contentHeight = myContentHeight + this.topYOffset;
			//#else
				this.contentHeight = myContentHeight;
			//#endif
			this.contentWidth = myContentWidth;
			//System.out.println("ContainerView.initContent(): contentWidth=" + this.contentWidth );
			return;
		//#ifdef tmp.useTable
		//# }
		//#endif
		
		//#ifdef tmp.useTable
			//# // columns are used
			//# boolean isNormalWidthColumns = (this.columnsSetting == NORMAL_WIDTH_COLUMNS);
			//#ifdef polish.css.columns-width.star
				//# if (this.columnsSetting == STATIC_WIDTH_COLUMNS) {
					//# if (this.starIndex != -1) {
						//# int combinedWidth = 0;
						//# for (int i = 0; i < this.numberOfColumns; i++) {
							//# combinedWidth += this.columnsWidths[i];
						//# }
						//# this.columnsWidths[this.starIndex] = lineWidth - combinedWidth;
					//# }
				//# } else {
			//#else
				//#	if (this.columnsSetting != STATIC_WIDTH_COLUMNS) {
			//#endif
				//# int availableColumnWidth;
				//# if (isNormalWidthColumns) {
					//# // this.columnsSetting == NORMAL_WIDTH_COLUMNS
					//# // each column should use as much space as it can use
					//# // without ousting the other columns
					//# // (the calculation will be finished below)
					//# availableColumnWidth = lineWidth - ((this.numberOfColumns -1) * this.paddingHorizontal);
				//# } else {
					//# // each column should take an equal share
					//# availableColumnWidth = 
						//# (lineWidth - ((this.numberOfColumns -1) * this.paddingHorizontal))
						//# / this.numberOfColumns;
				//# }
				//# //System.out.println("available column width: " + availableColumnWidth );
				//# this.columnsWidths = new int[ this.numberOfColumns ];
				//# for (int i = 0; i < this.numberOfColumns; i++) {
					//# this.columnsWidths[i] = availableColumnWidth;
				//# }
			//# }
//# 				
			//#if polish.css.colspan
				//# ArrayList rowHeightsList = new ArrayList( (myItems.length / this.numberOfColumns) + (myItems.length % 2) + 1 );
			//#else
				//# this.numberOfRows = (myItems.length / this.numberOfColumns) + (myItems.length % 2);
				//# this.rowsHeights = new int[ this.numberOfRows ];
			//#endif
			//# int maxRowHeight = 0;
			//# int columnIndex = 0;
			//# int rowIndex = 0;
			//# int[] maxColumnWidths = null;
			//# if (isNormalWidthColumns) {
				//# maxColumnWidths = new int[ this.numberOfColumns ];
			//# }
			//# int maxWidth = 0; // important for "equal" columns-width
			//# int myContentHeight = 0;
			//# boolean hasFocusableItem = false;
			//# //System.out.println("starting init of " + myItems.length + " container items.");
			//# for (int i=0; i< myItems.length; i++) {
				//# Item item = myItems[i];
				//# if (item.appearanceMode != Item.PLAIN) {
					//# hasFocusableItem = true;
				//# }
				//# int availableWidth = this.columnsWidths[columnIndex];
				//#if polish.css.colspan
					//# int itemColSpan = item.colSpan;
					//# if (!item.isInitialised && item.style != null) {
						//# Integer colSpanInt = item.style.getIntProperty(106);
						//# if ( colSpanInt != null ) {
							//# itemColSpan = colSpanInt.intValue();
							//# //System.out.println("colspan of item " + i + "/" + item + ", column " + columnIndex + ": " + itemColSpan);
						//# }
					//# }
					//# //System.out.println("ContainerView.init(): colspan of item " + i + "=" + itemColSpan);
					//# if (itemColSpan > 1) {
						//# // okay, this item stretched beyond one column,
						//# // so let's calculate the correct available cell width
						//# // and switch to the right column index:
						//# int maxColSpan = this.numberOfColumns - columnIndex;
						//# if (itemColSpan > maxColSpan) {
							//#debug error
							//# System.err.println("Warning: colspan " + itemColSpan + " is invalid at column " + columnIndex + " of a table with " + this.numberOfColumns + " columns, now using maximum possible value " + maxColSpan + ".");
							//# itemColSpan = maxColSpan;
						//# }
//# 						
						//# // adjust the available width only when
						//# // each column has an equal size or when
						//# // the column widths are static,
						//# // otherwise the complete row width
						//# // is available anyhow:
						//# if (!isNormalWidthColumns) {
							//# if (itemColSpan == maxColSpan) {
								//# availableWidth = 0;
								//# for (int j = 0; j < columnIndex; j++) {
									//# availableWidth += this.paddingHorizontal + this.columnsWidths[j];
								//# }
								//# availableWidth = lineWidth - availableWidth;
							//# } else {
								//# for (int j = columnIndex + 1; j < columnIndex + itemColSpan; j++) {
									//# availableWidth += this.paddingHorizontal + this.columnsWidths[j];
								//# }								
							//# }
							//# //System.out.println("ContainerView.init(): adjusted availableWidth for item " + i + ": " + availableWidth);
						//# }
					//# }
				//#endif
				//# //System.out.println( i + ": available with: " + availableWidth + ", item.isInitialized=" + item.isInitialised + ", itemWidth=" + item.getItemWidth( availableWidth, availableWidth ));
				//# if (item.isInitialised && item.itemWidth > availableWidth) {
					//# item.isInitialised = false;
				//# }
				//# int width = item.getItemWidth( availableWidth, availableWidth );
				//# //System.out.println("got item width");
				//# int height = item.getItemHeight( availableWidth, availableWidth );
//# 								
				//# if (height > maxRowHeight) {
					//# maxRowHeight = height;
				//# }
				//#if polish.css.colspan
					//# if (itemColSpan == 1) {
				//#endif
						//# if (isNormalWidthColumns && width > maxColumnWidths[columnIndex ]) {
							//# maxColumnWidths[ columnIndex ] = width;
						//# }
						//# if (width > maxWidth ) {
							//# maxWidth = width;
						//# }
				//#if polish.css.colspan
					//# }
				//#endif
				//#if polish.css.colspan
					//# if (item.colSpan != itemColSpan) {
						//#debug
						//# System.out.println("initializing new colspan of item " + i + "/" + item + ", column " + columnIndex + ": " + itemColSpan);
						//# item.colSpan = itemColSpan;
						//# item.isInitialised = false;
					//# }
					//# columnIndex += itemColSpan;
				//#else
					//# columnIndex++;
				//#endif
				//# item.yTopPos = myContentHeight;
				//# item.yBottomPos = myContentHeight + height;
				//# if (columnIndex == this.numberOfColumns) {
					//# //System.out.println("starting new row: rowIndex=" + rowIndex + "  numberOfRows: " + numberOfRows);
					//# columnIndex = 0;
					//#if polish.css.colspan
						//# //System.out.println("ContainerView.init(): adding new row " + rowIndex + " with height " + maxRowHeight + ", contentHeight=" + myContentHeight + ", item " + i);
						//# rowHeightsList.add( new Integer( maxRowHeight ) );
					//#else
						//# this.rowsHeights[rowIndex] = maxRowHeight;						
					//#endif
					//# myContentHeight += maxRowHeight + this.paddingVertical;
					//# maxRowHeight = 0;
					//# rowIndex++;
				//# }
			//# } // for each item
			//# if (hasFocusableItem) {
				//# this.appearanceMode = Item.INTERACTIVE;
			//# } else {
				//# this.appearanceMode = Item.PLAIN;
			//# }
			//# if (columnIndex != 0) {
				//# // last row is not completely filled.
				//#if polish.css.colspan
					//# rowHeightsList.add( new Integer( maxRowHeight ) );
				//#endif
				//# myContentHeight += maxRowHeight;
			//# }
			//#if polish.css.colspan
				//# this.numberOfRows = rowHeightsList.size();
				//# //System.out.println("ContainerView.init(): numberOfRows=" + this.numberOfRows + ", rowIndex=" + rowIndex);
				//# this.rowsHeights = new int[ this.numberOfRows ];
//# 				
				//# for (int i = 0; i < this.numberOfRows; i++) {
					//# this.rowsHeights[i] = ((Integer) rowHeightsList.get(i)).intValue();
				//# }
			//#endif
			//# // now save the worked out dimensions:
			//# if (isNormalWidthColumns) {
				//# // Each column should use up as much space as 
				//# // needed in the "normal" columns-width mode.
				//# // Each column which takes less than available 
				//# // the available-row-width / number-of-columns
				//# // can keep, but the others might need to be adjusted,
				//# // in case the complete width of the table is wider
				//# // than the allowed width.
//# 				
				//# int availableRowWidth = lineWidth - ((this.numberOfColumns -1) * this.paddingHorizontal);
				//# int availableColumnWidth = availableRowWidth / this.numberOfColumns;
				//# int usedUpWidth = 0;
				//# int leftColumns = this.numberOfColumns;
				//# int completeWidth = 0;
				//# for (int i = 0; i < maxColumnWidths.length; i++) {
					//# int maxColumnWidth = maxColumnWidths[i];
					//# if (maxColumnWidth <= availableColumnWidth) {
						//# usedUpWidth += maxColumnWidth;
						//# leftColumns--;
					//# }
					//# completeWidth += maxColumnWidth;
				//# }
				//# if (completeWidth <= availableRowWidth) {
					//# // okay, the table is fine just how it is
					//# this.columnsWidths = maxColumnWidths;
				//# } else {
					//# // okay, some columns need to be adjusted:
					//# // re-initialise the table:
					//# int leftAvailableColumnWidth = (availableRowWidth - usedUpWidth) / leftColumns;
					//# int[] newMaxColumnWidths = new int[ this.numberOfColumns ];
					//# myContentHeight = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -