/* ======================================================================
   Parts Copyright 2006 University of Leeds, Oxford University, University of the Highlands and Islands.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

====================================================================== */

package org.bodington.util;

import java.io.*;

/**
 * This is a class that can help with code to handle collapsing/expanding 
 * trees in a servlet.  It can be stored in a Hashtable against a key where
 * the key is something that identifies the node of a tree.  When the tree
 * is to be displayed the servlet can consult a Hashtable for each node to
 * decide if the node is open/closed visible/invisible.  There are four
 * static members of the class that are references to instances of the class
 * showing all four permutations of state.
 * 
 * @author Jon Maber
 * @version 1.0
 */
public class Visibility implements java.io.Serializable
	{

	/**
	 * A convenience instance that is set to invisible and closed.
	 */
	public static Visibility INVISIBLE_CLOSED = new Visibility( false, false );

	/**
	 * A convenience instance that is set to invisible and open.
	 */
	public static Visibility INVISIBLE_OPEN = new Visibility( false, true );

	/**
	 * A convenience instance that is set to visible and closed.
	 */
	public static Visibility VISIBLE_CLOSED = new Visibility( true, false );

	/**
	 * A convenience instance that is set to visible and open.
	 */
	public static Visibility VISIBLE_OPEN = new Visibility( true, true );
	
	
	
	/**
	 * The only instance member.  Stores the state.
	 */
	private byte flags;
	
	/**
	 * Convenience flag for private use.
	 */
	private static final byte FLAG_VISIBLE =1;

	/**
	 * Convenience flag for private use.
	 */
	private static final byte FLAG_OPEN    =2;
	
	/**
	 * The constructor is used to set the flags because the state of
	 * the object can't be changed later.
	 * 
	 * @param visible Should the new instance be visible?
	 * @param open Should the new instance be open?
	 */
	public Visibility( boolean visible, boolean open )
		{
		flags = 0;
		if ( visible )
			flags = (byte)(flags | FLAG_VISIBLE);
		if ( open )
			flags = (byte)(flags | FLAG_OPEN);
		}
	
	/**
	 * Tests the visibility flag.
	 * 
	 * @return True is the object is visible.
	 */
	public boolean isVisible()
		{
		return (flags & FLAG_VISIBLE)!=0;
		}
	
	/**
	 * Tests the open flag.
	 * 
	 * @return Returns true if the object is open.
	 */
	public boolean isOpen()
		{
		return (flags & FLAG_OPEN)!=0;
		}
	
    /**
     * Tests equality.
     * 
     * @param obj The object to compare with.
     * @return True if the comparison object is an object of type Visibility and
     * has the same visibility and openness.
     */
    public boolean equals(Object obj)
	    {
	    if ( !(obj instanceof Visibility) )
	    	return false;
	    	
	    Visibility vobj = (Visibility)obj;
	    
	    return vobj.flags == this.flags;
    	}

	}
