content: /*
   * @(#)AbstractView.java
   *
   * Copyright 2002 EGANTT LLP. All rights reserved.
   * PROPRIETARY/QPL. Use is subject to license terms.
   */
  
  package com.egantt.model.drawing.axis.view;
  
  import java.util.HashSet;
  import java.util.Iterator;
  import java.util.Set;
  
  import com.egantt.model.drawing.DrawingAxis;
  import com.egantt.model.drawing.DrawingTransform;
  import com.egantt.model.drawing.axis.AxisInterval;
  import com.egantt.model.drawing.axis.AxisView;
  import com.egantt.model.drawing.axis.view.event.ViewEvent;
  import com.egantt.model.drawing.axis.view.event.ViewListener;
  
  /**
   * AbstractAxis handles the basic implementation of an Axis which are not related
   * to the type of data that the Axis shall be supporting
   */
  public abstract class AbstractView implements AxisView
  {
  	protected AxisInterval visible;  /** visible extents */
  	protected DrawingAxis axis; /** maximum extents */
  
  	protected Set <ViewListener>listeners = new HashSet<ViewListener>(); // notification list
  	protected int orientation;
  
  	public AbstractView(DrawingAxis axis, int orientation)
  	{
  		this.axis = axis;
  		this.orientation = orientation;
  	}
  	
  	// _________________________________________________________________________
  	
  	public int getOrientation() {
  		return orientation;
  	}
  
  	// _________________________________________________________________________
  
  	public DrawingAxis getAxis()
  	{
  		return axis;
  	}
  
  	public AxisInterval getInterval()
  	{
  		return visible != null ? visible : axis.getInterval();
  	}
  
  	// _________________________________________________________________________
  
  	public DrawingTransform getTransform()
  	{
  		AxisInterval interval = visible != null
  			?  visible
  			:  axis.getInterval();
  		return interval != null ? interval.getTransform() : null;
  	}
  	
  //	 __________________________________________________________________________
  
  	public synchronized boolean setVisible(AxisInterval visible)
  	{
  		if (! this.axis.getInterval().contains(visible))
  			return false;
  
  		this.visible = visible; // make changes
  
  		fireStateChanged(new ViewEvent(this)); // notify changes
  		return true;
  	}
  
  	// _________________________________________________________________________
  
  	public synchronized boolean addViewListener(ViewListener listener)
  	{
  		return listeners.add(listener);
  	}
  
  	public synchronized boolean removeViewListener(ViewListener listener)
  	{
  		return listeners.remove(listeners);
  	}
  
  	// __________________________________________________________________________
  
  	protected synchronized void fireStateChanged(ViewEvent event)
  	{
  		for (Iterator iter = listeners.iterator(); iter.hasNext();)
  			((ViewListener) iter.next()).stateChanged(event);
  	}
  }
  