/*
* 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) 2011 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.dockable;
import bibliothek.gui.DockStation;
import bibliothek.gui.Dockable;
import bibliothek.util.Todo;
import bibliothek.util.Todo.Compatibility;
import bibliothek.util.Todo.Priority;
import bibliothek.util.Todo.Version;
/**
* An event sent to the {@link DockableStateListener}.<br>
* Note: if the hierarchy changed, the flag {@link #FLAG_SHOWING} will be set correctly. All the other
* flags are not set.
* @author Benjamin Sigg
*/
public class DockableStateEvent {
/** Indicates that the internal location of the {@link Dockable} on its {@link DockStation} changed. */
public static final int FLAG_LOCATION_CHANGED = 1;
/** Indicates that the internal location of one of the anchestors of the {@link Dockable} changed */
public static final int FLAG_PARENT_LOCATION_CHANGED = 2;
/**
* Indicates that the {@link Dockable} was either made visible or invisible to the user
* @deprecated use {@link #FLAG_SHOWING} instead of this flag. This flag will be removed in a future version.
*/
@Deprecated
@Todo( compatibility=Compatibility.BREAK_MAJOR, priority=Priority.ENHANCEMENT, target=Version.VERSION_1_1_3, description="remove this method" )
public static final int FLAG_VISIBILITY = 4;
/** Indicates that the {@link Dockable} was either made visible or invisible to the user */
public static final int FLAG_SHOWING = FLAG_VISIBILITY;
/** Indicates that the {@link Dockable} is or was selected on its parent */
public static final int FLAG_SELECTION = 8;
/** Indicates that the selection state of a parent of the {@link Dockable} changed */
public static final int FLAG_PARENT_SELECTION = 16;
/** Indicates that the parent of the {@link Dockable} has changed */
public static final int FLAG_HIERARCHY = 32;
/** the source of the event */
private Dockable dockable;
/** exact changes */
private int flags;
/**
* Creates a new event.
* @param dockable the dockables that is affected
* @param flags all the details about the changes
*/
public DockableStateEvent( Dockable dockable, int flags ){
this.dockable = dockable;
this.flags = flags;
}
/**
* Gets the element which is affected
* @return the element, not <code>null</code>
*/
public Dockable getDockable(){
return dockable;
}
/**
* Gets all the changes composed into one bit-array.
* @return all the changes
*/
public int getFlags(){
return flags;
}
/**
* Tells whether the selection state of the {@link #getDockable() dockable} on its parent
* changed.
* @return whether the selection state changed
*/
public boolean didSelectionChange(){
return (flags & FLAG_SELECTION) == FLAG_SELECTION;
}
/**
* Tells whether the selection state of a parent of the {@link #getDockable() dockable} changed.
* @return whether the selection state changed
*/
public boolean didParentSelectionChange(){
return (flags & FLAG_PARENT_SELECTION) == FLAG_PARENT_SELECTION;
}
/**
* Tells whether the position of the {@link #getDockable() dockable} on its parent changed. This means
* that {@link DockStation#getDockableProperty(Dockable, Dockable)} would return another result
* than before.
* @return whether the position changed
*/
public boolean didLocationChange(){
return (flags & FLAG_LOCATION_CHANGED) == FLAG_LOCATION_CHANGED;
}
/**
* Tells whether the position of one of the anchestors of {@link #getDockable() dockable} changed. This
* event is cased if an event with {@link #didLocationChange()} was found for one of the anchestors.
* @return whether an anchestor changed its position
*/
public boolean didParentLocationChange(){
return (flags & FLAG_PARENT_LOCATION_CHANGED) == FLAG_PARENT_LOCATION_CHANGED;
}
/**
* Tells whether the visibility of the {@link #getDockable() dockable} changed.
* @return whether the visibility changed
* @see Dockable#isDockableShowing()
* @deprecated use {@link #didShowingChange()} instead, this method will be removed in a future version
*/
@Deprecated
@Todo( compatibility=Compatibility.BREAK_MAJOR, priority=Priority.ENHANCEMENT, target=Version.VERSION_1_1_3, description="remove this method" )
public boolean didVisibilityChange(){
return (flags & FLAG_VISIBILITY) == FLAG_VISIBILITY;
}
/**
* Tells whether the visibility of the {@link #getDockable() dockable} changed (whether the user
* can now see the dockable or not).
* @return whether the visibility changed
* @see Dockable#isDockableShowing()
*/
public boolean didShowingChange(){
return (flags & FLAG_SHOWING) == FLAG_SHOWING;
}
/**
* Tells that the parent of the {@link #getDockable() dockable} has changed.
* @return whether the hierarchy changed
*/
public boolean didHierarchyChange(){
return (flags & FLAG_HIERARCHY) == FLAG_HIERARCHY;
}
@Override
public String toString(){
StringBuilder builder = new StringBuilder( getClass().getSimpleName() );
builder.append( "[" );
boolean comma = false;
if( didHierarchyChange() ){
builder.append( "HIERARCHY" );
comma = true;
}
if( didParentLocationChange() ){
if( comma ){
builder.append( ", " );
}
builder.append( "PARENT LOCATION" );
}
if( didLocationChange() ){
if( comma ){
builder.append( ", " );
}
builder.append( "LOCATION" );
}
if( didSelectionChange() ){
if( comma ){
builder.append( ", " );
}
builder.append( "SELECTION" );
}
if( didShowingChange() ){
if( comma ){
builder.append( ", " );
}
builder.append( "SHOWING" );
}
builder.append( "]" );
return builder.toString();
}
}