/*
* @(#)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);
//___________________________________________________________________________
}