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

📄 middlecolumnsview.java

📁 Wicket一个开发Java Web应用程序框架。它使得开发web应用程序变得容易而轻松。 Wicket利用一个POJO data beans组件使得它可以与任何持久层技术相结合。
💻 JAVA
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.wicket.extensions.markup.html.tree.table;import java.text.NumberFormat;import java.util.ArrayList;import java.util.Arrays;import java.util.Iterator;import java.util.List;import java.util.Locale;import javax.swing.tree.TreeNode;import org.apache.wicket.Component;import org.apache.wicket.RequestCycle;import org.apache.wicket.Response;import org.apache.wicket.extensions.markup.html.tree.table.ColumnLocation.Unit;import org.apache.wicket.markup.MarkupStream;import org.apache.wicket.markup.html.WebMarkupContainer;import org.apache.wicket.response.NullResponse;/** * Class that renders cells of columns aligned in the middle. This class also takes care of counting * their widths and of column spans. *  * @author Matej Knopp */final class MiddleColumnsView extends WebMarkupContainer{	private static final long serialVersionUID = 1L;	private final List columns = new ArrayList();	private final List components = new ArrayList();	private TreeNode node;	private final List renderables = new ArrayList();	private boolean treeHasLeftColumn;	/**	 * Constructor.	 * 	 * @param id	 *            The component id	 * @param node	 *            The tree node	 * @param treeHasLeftColumn	 *            Whether there is a column aligned to left in the tree table	 */	public MiddleColumnsView(String id, TreeNode node, boolean treeHasLeftColumn)	{		super(id);		this.node = node;		this.treeHasLeftColumn = treeHasLeftColumn;	}	/**	 * Adds a column to be rendered.	 * 	 * @param column	 *            The column to render	 * @param component	 *            The component	 * @param renderable	 *            The renderer	 */	public void addColumn(IColumn column, Component component, IRenderable renderable)	{		if (column.isVisible())		{			columns.add(column);			components.add(component);			renderables.add(renderable);		}	}	/**	 * Computes the percentagle widths of columns. If a column spans over other columns, the widths	 * of those columns will be zero.	 * 	 * @return widths of columns	 */	protected double[] computeColumnWidths()	{		// initialize the columns array		double result[] = new double[columns.size()];		Arrays.fill(result, 0d);		// the sum of weights of all columns		double sum = 0d;		double whole = 99.8d;		// go over all columns, check their alignment and count sum of their		// weights		for (Iterator i = columns.iterator(); i.hasNext();)		{			IColumn column = (IColumn)i.next();			// check if the unit is right			if (column.getLocation().getUnit() != Unit.PROPORTIONAL)			{				throw new IllegalStateException("Middle columns must have PROPORTIONAL unit set.");			}			sum += column.getLocation().getSize();		}		int index = 0; // index of currently processed column		int spanColumn = 0; // index of column that is spanning over currently		// processed column (if any)		int spanLeft = 0; // over how many columns does the spanning column		// span		for (Iterator i = columns.iterator(); i.hasNext();)		{			IColumn column = (IColumn)i.next();			int ix = index; // to which column should we append the size			if (spanLeft > 0) // is there a column spanning over current			// column?			{				ix = spanColumn; // the size should be appended to the				// spanning				// column				--spanLeft;			}			// add the percentage size to the column			result[ix] += Math.round((column.getLocation().getSize()) / sum * whole);			// wants this column to span and no other column is spanning over			// this column?			if (spanLeft == 0 && column.getSpan(node) > 1)			{				int maxSpan = columns.size() - columns.indexOf(column); // how				// many				// columns				// left				int span = column.getSpan(node) - 1; // how much columns want				// the column to span				// over				spanColumn = index; // index of column that is spanning				spanLeft = span < maxSpan ? span : maxSpan; // set the number of				// columns spanned				// over			}			++index;		}		// count the sum		double together = 0d;		for (int i = 0; i < result.length; i++)		{			together += result[i];		}		// is it bigger than 99.8? that can cause layout problems in IE		if (together > 99.8d)		{			// this can happen - rounding error. just decrease the last one			for (int i = result.length - 1; i >= 0; --i)			{				if (result[i] != 0d)				{					result[i] -= together - 99.8d;					break;				}			}		}		return result;	}	/**	 * Renders all columns.	 * 	 * @param markupStream	 *            The markup stream of this component	 */	protected void onRender(final MarkupStream markupStream)	{		final int markupStart = markupStream.getCurrentIndex();		Response response = RequestCycle.get().getResponse();		double widths[] = computeColumnWidths();		boolean rendered = false; // has been at least one column (component,		// not renderable) rendered?		NumberFormat nf = NumberFormat.getNumberInstance(Locale.ENGLISH);		nf.setMaximumFractionDigits(0);		nf.setMaximumFractionDigits(2);		for (int i = 0; i < columns.size(); ++i)		{			Component component = (Component)components.get(i);			IRenderable renderable = (IRenderable)renderables.get(i);			IColumn column = (IColumn)columns.get(i);			// write the wrapping column markup			response.write("<span class=\"b_\" style=\"width:" + nf.format(widths[i]) + "%\">");			// determine whether we should render the left border			if (!treeHasLeftColumn && i == 0)				response.write("<span class=\"d_\">");			else				response.write("<span class=\"c_\">");			if (component != null) // is there a component for current column?			{				// render the component				markupStream.setCurrentIndex(markupStart);				component.render(markupStream);				rendered = true;			}			else if (renderable != null) // no component - try to render			// renderable			{				renderable.render(node, response);			}			else			{				// no renderable or component. fail				throw new IllegalStateException(						"Either renderable or cell component must be created for this noode");			}			// end of wrapping markup			response.write("</span></span>\n");			// does this component span over other columns			int span = column.getSpan(node);			if (span > 1)			{				// iterate through the columns and if any of them has a				// component,				// render the component to null response (otherwise the				// component will				// complain that it hasn't been rendered				for (int j = 1; j < span && i < components.size(); ++j)				{					++i;					if (components.get(i) != null)					{						Response old = RequestCycle.get().setResponse(NullResponse.getInstance());						markupStream.setCurrentIndex(markupStart);						((Component)components.get(i)).render(markupStream);						RequestCycle.get().setResponse(old);						rendered = true;					}				}			}		}		// if no component was rendered just advance in the markup stream		if (rendered == false)		{			markupStream.skipComponent();		}	}}

⌨️ 快捷键说明

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