package net.miginfocom.layout; /* * License (BSD): * ============== * * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) 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 MiG InfoCom AB 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 THE COPYRIGHT OWNER OR CONTRIBUTORS 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. * * @version 1.0 * @author Mikael Grev, MiG InfoCom AB * Date: 2006-sep-08 */ /** * A class that wraps the important parts of a Component. * <p> * <b>NOTE!</b>.equals() and .hashcode() should be shunted to the wrapped * component. E.g. * * <pre> * public int hashCode() { * return getComponent().hashCode(); * } * * public final boolean equals(Object o) { * if (o instanceof ComponentWrapper == false) * return false; * * return getComponent().equals(((ComponentWrapper) o).getComponent()); * } * </pre> */ public interface ComponentWrapper { static final int TYPE_UNSET = -1; public static final int TYPE_UNKNOWN = 0; public static final int TYPE_CONTAINER = 1; public static final int TYPE_LABEL = 2; public static final int TYPE_TEXT_FIELD = 3; public static final int TYPE_TEXT_AREA = 4; public static final int TYPE_BUTTON = 5; public static final int TYPE_LIST = 6; public static final int TYPE_TABLE = 7; public static final int TYPE_SCROLL_PANE = 8; public static final int TYPE_IMAGE = 9; public static final int TYPE_PANEL = 10; public static final int TYPE_COMBO_BOX = 11; public static final int TYPE_SLIDER = 12; public static final int TYPE_SPINNER = 13; public static final int TYPE_PROGRESS_BAR = 14; public static final int TYPE_TREE = 15; public static final int TYPE_CHECK_BOX = 16; public static final int TYPE_SCROLL_BAR = 17; public static final int TYPE_SEPARATOR = 18; /** * Returns the actual object that this wrapper is aggregating. This might be * needed for getting information about the object that the wrapper * interface does not provide. * <p> * If this is a container the container should be returned instead. * * @return The actual object that this wrapper is aggregating. Not * <code>null</code>. */ public abstract Object getComponent(); /** * Returns the current x coordinate for this component. * * @return The current x coordinate for this component. */ public abstract int getX(); /** * Returns the current y coordinate for this component. * * @return The current y coordinate for this component. */ public abstract int getY(); /** * Returns the current width for this component. * * @return The current width for this component. */ public abstract int getWidth(); /** * Returns the current height for this component. * * @return The current height for this component. */ public abstract int getHeight(); /** * Returns the screen x-coordinate for the upper left coordinate of the * component layout-able bounds. * * @return The screen x-coordinate for the upper left coordinate of the * component layout-able bounds. */ public abstract int getScreenLocationX(); /** * Returns the screen y-coordinate for the upper left coordinate of the * component layout-able bounds. * * @return The screen y-coordinate for the upper left coordinate of the * component layout-able bounds. */ public abstract int getScreenLocationY(); /** * Returns the minimum width of the component. * * @param hHint * The Size hint for the other dimension. An implementation can * use this value or the current size for the widget in this * dimension, or a combination of both, to calculate the correct * size.<br> * Use -1 to denote that there is no hint. This corresponds with * SWT.DEFAULT. * @return The minimum width of the component. * @since 3.5. Added the hint as a parameter knowing that a correction and * recompilation is necessary for any implementing classes. This * change was worth it though. */ public abstract int getMinimumWidth(int hHint); /** * Returns the minimum height of the component. * * @param wHint * The Size hint for the other dimension. An implementation can * use this value or the current size for the widget in this * dimension, or a combination of both, to calculate the correct * size.<br> * Use -1 to denote that there is no hint. This corresponds with * SWT.DEFAULT. * @return The minimum height of the component. * @since 3.5. Added the hint as a parameter knowing that a correction and * recompilation is necessary for any implementing classes. This * change was worth it though. */ public abstract int getMinimumHeight(int wHint); /** * Returns the preferred width of the component. * * @param hHint * The Size hint for the other dimension. An implementation can * use this value or the current size for the widget in this * dimension, or a combination of both, to calculate the correct * size.<br> * Use -1 to denote that there is no hint. This corresponds with * SWT.DEFAULT. * @return The preferred width of the component. * @since 3.5. Added the hint as a parameter knowing that a correction and * recompilation is necessary for any implementing classes. This * change was worth it though. */ public abstract int getPreferredWidth(int hHint); /** * Returns the preferred height of the component. * * @param wHint * The Size hint for the other dimension. An implementation can * use this value or the current size for the widget in this * dimension, or a combination of both, to calculate the correct * size.<br> * Use -1 to denote that there is no hint. This corresponds with * SWT.DEFAULT. * @return The preferred height of the component. * @since 3.5. Added the hint as a parameter knowing that a correction and * recompilation is necessary for any implementing classes. This * change was worth it though. */ public abstract int getPreferredHeight(int wHint); /** * Returns the maximum width of the component. * * @param hHint * The Size hint for the other dimension. An implementation can * use this value or the current size for the widget in this * dimension, or a combination of both, to calculate the correct * size.<br> * Use -1 to denote that there is no hint. This corresponds with * SWT.DEFAULT. * @return The maximum width of the component. * @since 3.5. Added the hint as a parameter knowing that a correction and * recompilation is necessary for any implementing classes. This * change was worth it though. */ public abstract int getMaximumWidth(int hHint); /** * Returns the maximum height of the component. * * @param wHint * The Size hint for the other dimension. An implementation can * use this value or the current size for the widget in this * dimension, or a combination of both, to calculate the correct * size.<br> * Use -1 to denote that there is no hint. This corresponds with * SWT.DEFAULT. * @return The maximum height of the component. * @since 3.5. Added the hint as a parameter knowing that a correction and * recompilation is necessary for any implementing classes. This * change was worth it though. */ public abstract int getMaximumHeight(int wHint); /** * Sets the component's bounds. * * @param x * The x coordinate. * @param y * The y coordinate. * @param width * The width. * @param height * The height. */ public abstract void setBounds(int x, int y, int width, int height); /** * Returns if the component's visibility is set to <code>true</code>. This * should not return if the component is actually visible, but if the * visibility is set to true or not. * * @return <code>true</code> means visible. */ public abstract boolean isVisible(); /** * Returns the baseline for the component given the suggested height. * * @param width * The width to calculate for if other than the current. If * <code>-1</code> the current size should be used. * @param height * The height to calculate for if other than the current. If * <code>-1</code> the current size should be used. * @return The baseline from the top or -1 if not applicable. */ public abstract int getBaseline(int width, int height); /** * Returns if the component has a baseline and if it can be retrieved. * Should for instance return <code>false</code> for Swing before mustang. * * @return If the component has a baseline and if it can be retrieved. */ public abstract boolean hasBaseline(); /** * Returns the container for this component. * * @return The container for this component. Will return <code>null</code> * if the component has no parent. */ public abstract ContainerWrapper getParent(); /** * Returns the pixel unit factor for the horizontal or vertical dimension. * <p> * The factor is 1 for both dimensions on the normal font in a JPanel on * Windows. The factor should increase with a bigger "X". * <p> * This is the Swing version: * * <pre> * Rectangle2D r = fm.getStringBounds("X", parent.getGraphics()); * wFactor = r.getWidth() / 6; * hFactor = r.getHeight() / 13.27734375f; * </pre> * * @param isHor * If it is the horizontal factor that should be returned. * @return The factor. */ public abstract float getPixelUnitFactor(boolean isHor); /** * Returns the DPI (Dots Per Inch) of the screen the component is currently * in or for the default screen if the component is not visible. * <p> * If headless mode * {@link net.miginfocom.layout.PlatformDefaults#getDefaultDPI} will be * returned. * * @return The DPI. */ public abstract int getHorizontalScreenDPI(); /** * Returns the DPI (Dots Per Inch) of the screen the component is currently * in or for the default screen if the component is not visible. * <p> * If headless mode * {@link net.miginfocom.layout.PlatformDefaults#getDefaultDPI} will be * returned. * * @return The DPI. */ public abstract int getVerticalScreenDPI(); /** * Returns the pixel size of the screen that the component is currently in * or for the default screen if the component is not visible or * <code>null</code>. * <p> * If in headless mode <code>1024</code> is returned. * * @return The screen size. E.g. <code>1280</code>. */ public abstract int getScreenWidth(); /** * Returns the pixel size of the screen that the component is currently in * or for the default screen if the component is not visible or * <code>null</code>. * <p> * If in headless mode <code>768</code> is returned. * * @return The screen size. E.g. <code>1024</code>. */ public abstract int getScreenHeight(); /** * Returns a String id that can be used to reference the component in link * constraints. This value should return the default id for the component. * The id can be set for a component in the constraints and if so the value * returned by this method will never be used. If there are no sensible id * for the component <code>null</code> should be returned. * <p> * For instance the Swing implementation returns the string returned from * <code>Component.getName()</code>. * * @return The string link id or <code>null</code>. */ public abstract String getLinkId(); /** * Returns a hash code that should be reasonably different for anything that * might change the layout. This value is used to know if the component * layout needs to clear any caches. * * @return A hash code that should be reasonably different for anything that * might change the layout. Returns -1 if the widget is disposed. */ public abstract int getLayoutHashCode(); /** * Returns the padding on a component by component basis. This method can be * overridden to return padding to compensate for example for borders that * have shadows or where the outer most pixel is not the visual "edge" to * align to. * <p> * Default implementation returns <code>null</code> for all components * except for Windows XP's JTabbedPane which will return new Insets(0, 0, 2, * 2). * <p> * <b>NOTE!</B> To reduce generated garbage the returned padding should * never be changed so that the same insets can be returned many times. * * @return <code>null</code> if no padding. <b>NOTE!</B> To reduce generated * garbage the returned padding should never be changed so that the * same insets can be returned many times. [top, left, bottom, * right] */ public int[] getVisualPadding(); /** * Paints component outline to indicate where it is. */ public abstract void paintDebugOutline(); /** * Returns the type of component that this wrapper is wrapping. * <p> * This method can be invoked often so the result should be cached. * <p> * <b>NOTE!</b> This is misspelled. Keeping it that way though since this is * only used by developers who port MigLayout. * * @param disregardScrollPane * Is <code>true</code> any wrapping scroll pane should be * disregarded and the type of the scrolled component should be * returned. * @return The type of component that this wrapper is wrapping. E.g. * {@link #TYPE_LABEL}. */ public abstract int getComponetType(boolean disregardScrollPane); }