/* * Bibliothek - DockingFrames * Library built on Java/Swing, allows the user to "drag and drop" * panels containing any Swing-Component the developer likes to add. * * Copyright (C) 2012 Benjamin Sigg * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Benjamin Sigg * benjamin_sigg@gmx.ch * CH - Switzerland */ package bibliothek.gui.dock.station.split; import java.awt.Rectangle; import bibliothek.gui.dock.SplitDockStation.Orientation; /** * A {@link Divideable} offers the information needed to represent a divider between two * {@link SplitNode}s. The {@link Divideable} may itself be a {@link SplitNode}. The location of a divider * is encoded by a <code>double</code>, where <code>0</code> means top/left, and <code>1.0</code> means bottom/right. * @author Benjamin Sigg */ public interface Divideable { /** * Calculates the value which the divider must have on condition that * the point <code>x/y</code> lies inside the {@link #getDividerBounds(double, Rectangle) divider bounds}. * @param x x-coordinate of the point in pixel * @param y y-coordinate of the point in pixel * @return The value that the divider should have. This value might not * be valid if the coordinates of the point are too extreme. */ public double getDividerAt( int x, int y ); /** * Calculates the location and the size of the area which represents the divider. * The user can grab this area with the mouse and drag it around. * @param divider The location of the divider, should be between 0 and 1. * @param bounds A rectangle in which the result will be stored. It can be <code>null</code> * @return Either <code>bounds</code> or a new {@link Rectangle} if <code>bounds</code> * was <code>null</code> */ public Rectangle getDividerBounds( double divider, Rectangle bounds ); /** * Gets the orientation of this divideable. The orientation tells how to layout * the children. If the orientation is {@link Orientation#VERTICAL}, one child * will be at the top and the other at the bottom. * @return the orientation */ public Orientation getOrientation(); /** * Gets the location of the divider. * @return the divider * @see #setDivider(double) */ public double getDivider(); /** * Gets the {@link #getDivider() divider} as it is actually seen by the user. Usually this is equivalent * to <code>validateDivider( getDivider() )</code>, subclasses may however consider other restrictions. * @return the divider as seen by the user */ public double getActualDivider(); /** * Sets the location of the divider. The area of the left child is the area * of the whole node multiplied with <code>divider</code>. * @param divider the divider */ public void setDivider( double divider ); /** * Validates the new location <code>divider</code>. * @param divider the new divider * @return a valid version of <code>divider</code> */ public double validateDivider( double divider ); }