/******************************************************************************* * Copyright (c) 2011, Nathan Sweet <nathan.sweet@gmail.com> All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the * following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation and/or other materials provided with the * distribution. * Neither the name of the <organization> nor the names of its contributors may be used to endorse or * promote products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ package com.esotericsoftware.tablelayout; /** * Base class for a table or cell property value. Values are provided a table or cell for context. Eg, the value may * compute its size taking into consideration the size of the table or the widget in the cell. Some values may be only * valid for use with either call. * * @author Nathan Sweet */ abstract public class Value { /** Returns the value in the context of the specified table. */ abstract public float get(Object table); /** Returns the value in the context of the specified cell. */ abstract public float get(Cell cell); /** Returns the value in the context of a width for the specified table. */ public float width(Object table) { return Toolkit.instance.width(get(table)); } /** Returns the value in the context of a height for the specified table. */ public float height(Object table) { return Toolkit.instance.height(get(table)); } /** Returns the value in the context of a width for the specified cell. */ public float width(Cell cell) { return Toolkit.instance.width(get(cell)); } /** Returns the value in the context of a height for the specified cell. */ public float height(Cell cell) { return Toolkit.instance.height(get(cell)); } /** A value that is always zero. */ static public final Value zero = new CellValue() { public float get(Cell cell) { return 0; } public float get(Object table) { return 0; } }; /** * A value that is only valid for use with a cell. * * @author Nathan Sweet */ static abstract public class CellValue extends Value { public float get(Object table) { throw new UnsupportedOperationException("This value can only be used for a cell property."); } } /** * A value that is valid for use with a table or a cell. * * @author Nathan Sweet */ static abstract public class TableValue extends Value { public float get(Cell cell) { return get(cell.getLayout().getTable()); } } /** * A fixed value that is not computed each time it is used. * * @author Nathan Sweet */ static public class FixedValue extends Value { private float value; public FixedValue(float value) { this.value = value; } public void set(float value) { this.value = value; } public float get(Object table) { return value; } public float get(Cell cell) { return value; } } /** Value for a cell that is the minWidth of the widget in the cell. */ static public Value minWidth = new CellValue() { public float get(Cell cell) { if (cell == null) throw new RuntimeException("minWidth can only be set on a cell property."); Object widget = cell.widget; if (widget == null) return 0; return Toolkit.instance.getMinWidth(widget); } }; /** Value for a cell that is the minHeight of the widget in the cell. */ static public Value minHeight = new CellValue() { public float get(Cell cell) { if (cell == null) throw new RuntimeException("minHeight can only be set on a cell property."); Object widget = cell.widget; if (widget == null) return 0; return Toolkit.instance.getMinHeight(widget); } }; /** Value for a cell that is the prefWidth of the widget in the cell. */ static public Value prefWidth = new CellValue() { public float get(Cell cell) { if (cell == null) throw new RuntimeException("prefWidth can only be set on a cell property."); Object widget = cell.widget; if (widget == null) return 0; return Toolkit.instance.getPrefWidth(widget); } }; /** Value for a cell that is the prefHeight of the widget in the cell. */ static public Value prefHeight = new CellValue() { public float get(Cell cell) { if (cell == null) throw new RuntimeException("prefHeight can only be set on a cell property."); Object widget = cell.widget; if (widget == null) return 0; return Toolkit.instance.getPrefHeight(widget); } }; /** Value for a cell that is the maxWidth of the widget in the cell. */ static public Value maxWidth = new CellValue() { public float get(Cell cell) { if (cell == null) throw new RuntimeException("maxWidth can only be set on a cell property."); Object widget = cell.widget; if (widget == null) return 0; return Toolkit.instance.getMaxWidth(widget); } }; /** Value for a cell that is the maxHeight of the widget in the cell. */ static public Value maxHeight = new CellValue() { public float get(Cell cell) { if (cell == null) throw new RuntimeException("maxHeight can only be set on a cell property."); Object widget = cell.widget; if (widget == null) return 0; return Toolkit.instance.getMaxHeight(widget); } }; /** Returns a value that is a percentage of the table's width. */ static public Value percentWidth(final float percent) { return new TableValue() { public float get(Object table) { return Toolkit.instance.getWidth(table) * percent; } }; } /** Returns a value that is a percentage of the table's height. */ static public Value percentHeight(final float percent) { return new TableValue() { public float get(Object table) { return Toolkit.instance.getHeight(table) * percent; } }; } /** Returns a value that is a percentage of the specified widget's width. */ static public Value percentWidth(final float percent, final Object widget) { return new Value() { public float get(Cell cell) { return Toolkit.instance.getWidth(widget) * percent; } public float get(Object table) { return Toolkit.instance.getWidth(widget) * percent; } }; } /** Returns a value that is a percentage of the specified widget's height. */ static public Value percentHeight(final float percent, final Object widget) { return new TableValue() { public float get(Object table) { return Toolkit.instance.getHeight(widget) * percent; } }; } }