All Downloads are FREE. Search and download functionalities are using the official Maven repository.

bibliothek.gui.dock.station.split.SplitDockProperty Maven / Gradle / Ivy

/*
 * 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) 2007 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
 * [email protected]
 * CH - Switzerland
 */

package bibliothek.gui.dock.station.split;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

import bibliothek.gui.dock.SplitDockStation;
import bibliothek.gui.dock.layout.AbstractDockableProperty;
import bibliothek.gui.dock.layout.DockableProperty;
import bibliothek.util.Version;
import bibliothek.util.xml.XElement;

/**
 * This property stores the location and the size of each child of a 
 * {@link SplitDockStation}. The property assumes that the station itself
 * has a size of 1/1, and the top left edge is 0/0.
 * @author Benjamin Sigg
 */
public class SplitDockProperty extends AbstractDockableProperty {
	/** A property covering the right quarter of the station */
    public static final SplitDockProperty EAST = new SplitDockProperty( 0.75, 0, 0.25, 1 );
    
    /** A property covering the left quarter of the station */
    public static final SplitDockProperty WEST = new SplitDockProperty( 0, 0, 0.25, 1 );
    
    /** A property covering the top quarter of the station */
    public static final SplitDockProperty NORTH = new SplitDockProperty( 0, 0, 1, 0.25 );
    
    /** A property covering the bottom quarter of the station */
    public static final SplitDockProperty SOUTH = new SplitDockProperty( 0, 0.75, 1, 0.25 );
    
    private double x, y, width, height;
    
    /**
     * Constructs a new property with size and location equal to 0/0
     */
    public SplitDockProperty(){
    	// do nothing
    }
    
    /**
     * Creates a new property with the given values. The coordinates and
     * the sizes should be in the range of 0 and 1, but the {@link SplitDockStation}
     * can handle values that are out of bounds.
     * @param x the x-coordinate
     * @param y the y-coordinate
     * @param width the width of the child
     * @param height the height of the child
     */
    public SplitDockProperty( double x, double y, double width, double height ){
        setX( x );
        setY( y );
        setWidth( width );
        setHeight( height );
    }
    

    public DockableProperty copy() {
        SplitDockProperty copy = new SplitDockProperty( x, y, width, height );
        copy( copy );
        return copy;
    }
    
    public String getFactoryID() {
        return SplitDockPropertyFactory.ID;
    }

    public void store( DataOutputStream out ) throws IOException {
        Version.write( out, Version.VERSION_1_0_4 );
        out.writeDouble( x );
        out.writeDouble( y );
        out.writeDouble( width );
        out.writeDouble( height );
    }
    
    public void store( XElement element ) {
        element.addElement( "x" ).setDouble( x );
        element.addElement( "y" ).setDouble( y );
        element.addElement( "width" ).setDouble( width );
        element.addElement( "height" ).setDouble( height );
    }

    public void load( DataInputStream in ) throws IOException {
        Version version = Version.read( in );
        version.checkCurrent();
        x = in.readDouble();
        y = in.readDouble();
        width = in.readDouble();
        height = in.readDouble();
    }
    
    public void load( XElement element ) {
        x = element.getElement( "x" ).getDouble();
        y = element.getElement( "y" ).getDouble();
        width = element.getElement( "width" ).getDouble();
        height = element.getElement( "height" ).getDouble();
    }

    /**
     * Gets the height of the child.
     * @return the height
     * @see #setHeight(double)
     */
    public double getHeight() {
        return height;
    }

    /**
     * Sets the height of the child.
     * @param height the height, should be between 0 and 1
     */
    public void setHeight( double height ) {
        this.height = height;
    }

    /**
     * Gets the width of the child.
     * @return the width
     * @see #setWidth(double)
     */
    public double getWidth() {
        return width;
    }

    /**
     * Sets the width of the child.
     * @param width the width, should be between 0 and 1
     */
    public void setWidth( double width ) {
        this.width = width;
    }

    /**
     * Gets the x-coordinate of the child.
     * @return the x-coordinate
     * @see #setX(double)
     */
    public double getX() {
        return x;
    }

    /**
     * Sets the x-coordinate of the child.
     * @param x the coordinate, should be between 0 and 1
     */
    public void setX( double x ) {
        this.x = x;
    }

    /**
     * Gets the y-coordinate of the child.
     * @return the coordinate
     * @see #setY(double)
     */
    public double getY() {
        return y;
    }

    /**
     * Sets the y-coordinate of the child.
     * @param y the coordinate, should be between 0 and 1
     */
    public void setY( double y ) {
        this.y = y;
    }
    
    @Override
    public String toString() {
    	return getClass().getName() + "[x=" + x + ", y=" + y + ", width=" + width + ", height=" + height + "]";
    }

	@Override
	public int hashCode(){
		final int prime = 31;
		int result = super.hashCode();
		long temp;
		temp = Double.doubleToLongBits( height );
		result = prime * result + (int)(temp ^ (temp >>> 32));
		temp = Double.doubleToLongBits( width );
		result = prime * result + (int)(temp ^ (temp >>> 32));
		temp = Double.doubleToLongBits( x );
		result = prime * result + (int)(temp ^ (temp >>> 32));
		temp = Double.doubleToLongBits( y );
		result = prime * result + (int)(temp ^ (temp >>> 32));
		return result;
	}

	@Override
	public boolean equals( Object obj ){
		if( this == obj )
			return true;
		if( !super.equals( obj ) )
			return false;
		if( !(obj instanceof SplitDockProperty) )
			return false;
		SplitDockProperty other = (SplitDockProperty)obj;
		if( Double.doubleToLongBits( height ) != Double
				.doubleToLongBits( other.height ) )
			return false;
		if( Double.doubleToLongBits( width ) != Double
				.doubleToLongBits( other.width ) )
			return false;
		if( Double.doubleToLongBits( x ) != Double.doubleToLongBits( other.x ) )
			return false;
		if( Double.doubleToLongBits( y ) != Double.doubleToLongBits( other.y ) )
			return false;
		return true;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy