/**
* 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
* benjamin_sigg@gmx.ch
* CH - Switzerland
*/
package bibliothek.gui.dock.accept;
import bibliothek.gui.DockStation;
import bibliothek.gui.Dockable;
/**
* A DockAcceptance that is a combination out of two other acceptances.
* @author Benjamin Sigg
*/
public class CombinatoryAcceptance extends AbstractAcceptance {
public static enum Combination{
AND, OR, XOR, EQUAL, IMPLIES
}
private Combination combination;
private DockAcceptance first, second;
/**
* Constructor, sets up all fields of this acceptance
* @param combination How the two Acceptances <code>first</code> and
* <code>second</code> will be combined.
* @param first The acceptance at the "left" side of the operation
* @param second The acceptance at the "right" side of the operation
*/
public CombinatoryAcceptance( Combination combination, DockAcceptance first, DockAcceptance second ){
setCombination( combination );
setFirst( first );
setSecond( second );
}
@Override
public boolean accept( DockStation parent, Dockable child ) {
return compare( first.accept( parent, child ), second.accept( parent, child ));
}
@Override
public boolean accept( DockStation parent, Dockable child, Dockable next ) {
return compare( first.accept(parent, child, next), second.accept(parent, child, next));
}
/**
* Makes a logical operation with <code>first</code> and
* <code>second</code> according to the operation specified
* as {@link #setCombination(bibliothek.gui.dock.accept.CombinatoryAcceptance.Combination) combination}.
* @param first The operand at the left side
* @param second The operand at the right side
* @return The combination
*/
protected boolean compare( boolean first, boolean second ){
switch( combination ){
case AND: return first && second;
case OR: return first || second;
case XOR: return first != second;
case EQUAL: return first == second;
case IMPLIES: return second || !first;
default: throw new IllegalStateException( "no combination" );
}
}
/**
* Sets, how the two acceptances of this {@link CombinatoryAcceptance}
* have to be combined
* @param combination How to calculate {@link #accept(DockStation, Dockable)}
* out of the results of {@link #setFirst(DockAcceptance) first} and
* of {@link #setSecond(DockAcceptance) second}
* @throws IllegalArgumentException if <code>combination</code> is <code>null</code>
*/
public void setCombination( Combination combination ) {
if( combination == null )
throw new IllegalArgumentException( "Combination must not be null" );
this.combination = combination;
}
/**
* Gets how the combination is calculated
* @return The operand
* @see #setCombination(bibliothek.gui.dock.accept.CombinatoryAcceptance.Combination)
*/
public Combination getCombination() {
return combination;
}
/**
* Sets the "left" operand of the combination
* @param first The first acceptance whose opinion for an
* {@link #accept(DockStation, Dockable) accept} will be asked.
* @throws IllegalArgumentException if the argument is <code>null</code>
*/
public void setFirst( DockAcceptance first ) {
if( first == null )
throw new IllegalArgumentException( "First must not be null" );
this.first = first;
}
/**
* Gets the "left" operand of the combination
* @return The acceptance
* @see #setFirst(DockAcceptance)
*/
public DockAcceptance getFirst() {
return first;
}
/**
* Sets the "right" operand of the combination
* @param second The second acceptance whose opinion for
* {@link #accept(DockStation, Dockable)} will be asked.
* @throws IllegalArgumentException if the argument is <code>null</code>
*/
public void setSecond( DockAcceptance second ) {
if( second == null )
throw new IllegalArgumentException( "Second must not be null" );
this.second = second;
}
/**
* Gets the "right" operand of the combination
* @return The right operand
* @see #setSecond(DockAcceptance)
*/
public DockAcceptance getSecond() {
return second;
}
}