content: /*
   * @(#)AbstractSelection.java
   *
   * Copyright 2002 EGANTT LLP. All rights reserved.
   * PROPRIETARY/QPL. Use is subject to license terms.
   */
  
  package com.egantt.model.drawing.selection;
  
  import java.awt.event.MouseEvent;
  import java.util.Vector;
  
  import com.egantt.model.drawing.DrawingSelection;
  
  /**
    * The AbstractDrawingSelection is designed to take some of the heart-ache out of the design
    * of the model design which is a bit complicated for most users
    */
  public abstract class AbstractSelection implements DrawingSelection
  {
  	protected Vector changeListeners = new Vector(2);
  /**
  	protected boolean clearSelection()
  	{
  	   boolean result = false;
  	   for (Iterator iter = selection.iterator(); iter.hasNext();)
  			result = fireSelected(iter.next(), false) || result;
  	   return result;
  	}
  
     protected boolean deselectOthers(Object o)
  	{
  	   boolean result = false;
  	   for (Iterator iter = selection.iterator(); iter.hasNext();)
  	   {
  			Object z = iter.next();
  			if (z != o)
  			   result = fireSelected(o,false) || result;
  	   }
  	   return result;
  	}
  
  	protected boolean fireSelected(Object o, boolean selected)
     {
  		return selected(o) ? selection.add(o) : selection.remove(o);
  	}
  
  	//_ info_____________________________________________________________________
  
  	protected boolean selectable(Object o)
  	{
  		return true;
  	}
  
  	protected boolean selected(Object o)
  	{
  		return selection.contains(o);
  	}
  
  **/
  	//___________________________________________________________________________
  
  	/** warning returning true will fire a repaint
  		despite the design of select to be away from gui events in this case
  		the mouse event actually provides a lot of information crutial to selectionfs
  	*/
  	public boolean select(Object o, MouseEvent e)
  	{
  		boolean shiftDown = e.isShiftDown();
  		boolean ctrlDown = e.isControlDown();
  
  		if (!selectable(o))
  			return (!shiftDown && !ctrlDown) ? false : clearSelection();
  
  		if (shiftDown && selected(o))
  		   return false;
  
  		boolean changes = false;
  		if (!shiftDown && !ctrlDown)
  			changes = deselectOthers(o);
  
  		return shiftDown ? fireSelected(o,true) || changes : toggleSelected(o) || changes;
  	}
  
  	//_request changes___________________________________________________________
  
  	protected abstract boolean clearSelection();
  
  	protected abstract boolean deselectOthers(Object o);
  
  	protected boolean toggleSelected(Object o)
  	{
  	   return selected(o) ? fireSelected(o,false) : fireSelected(o,true);
  	}
  
  	protected abstract boolean fireSelected(Object o, boolean selected);
  
  	//_info______________________________________________________________________
  
  	protected abstract boolean selectable(Object o);
  
  	protected abstract boolean selected(Object o);
  
  	//___________________________________________________________________________
  }
  