/*
* Copyright (C) 2004 The Concord Consortium, Inc.,
* 10 Concord Crossing, Concord, MA 01742
*
* Web Site: http://www.concord.org
* Email: info@concord.org
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* END LICENSE */
package org.concord.swing;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
public class SelectionManager
extends MouseMotionAdapter
implements MouseListener
{
protected int mouseX;
protected int mouseY;
protected boolean multiple = false;
protected boolean dragged = false;
protected boolean popup = false;
protected SelectableContainer selectableContainer;
protected Selectable selectedObject;
protected Selectable activeObject;
protected Component popupComponent;
protected EventRelay eventRelay = new EventRelay();
protected final String [] mouseNames =
{
"mouseEntered",
"mouseExited",
"mousePressed",
"mouseReleased",
"mouseClicked"
};
protected final String [] mouseMotionNames =
{
"mouseDragged",
"mouseMoved"
};
public Selectable getSelectedObject()
{
return selectedObject;
}
public Selectable getActiveObject()
{
return activeObject;
}
public void setSelectableContainer(SelectableContainer container)
{
selectableContainer = container;
}
public void mousePressed(MouseEvent event)
{
mouseX = event.getX();
mouseY = event.getY();
if ((activeObject != null) && activeObject.contains(mouseX, mouseY))
{
eventRelay.relay("mousePressed", event);
}
else
{
multiple = event.isShiftDown();
Selectable next = selectableContainer.findSelectable(event, mouseX, mouseY);
if ((next == null) || (next != selectedObject))
{
activeObject = null;
eventRelay.reset();
}
selectedObject = next;
if (selectedObject != null)
selectableContainer.select(selectedObject, multiple);
else
selectableContainer.deselect();
popup = event.isPopupTrigger();
}
}
public void mouseReleased(MouseEvent event)
{
if ((activeObject != null) && activeObject.contains(event.getX(), event.getY()))
{
eventRelay.relay("mouseReleased", event);
}
else
{
if ((popup || event.isPopupTrigger()) && (popupComponent instanceof Component))
{
popupComponent.setVisible(true);
popupComponent.setLocation(mouseX, mouseY);
}
else if (dragged)
{
selectableContainer.dragActionDone(selectedObject);
dragged = false;
}
else if (multiple && (selectedObject != null))
{
selectedObject.toggleSelected();
}
multiple = false;
}
}
public void mouseDragged(MouseEvent event)
{
if ((activeObject != null) && activeObject.contains(event.getX(), event.getY()))
{
eventRelay.relay("mouseDragged", event);
}
else
{
int x = event.getX();
int y = event.getY();
int deltaX = x - mouseX;
int deltaY = y - mouseY;
if ((deltaX != 0) || (deltaY != 0))
dragged = true;
if (dragged && (selectedObject != null))
{
selectableContainer.dragAction(deltaX, deltaY, selectedObject);
}
mouseX = x;
mouseY = y;
}
}
public void setPopupComponent(Component popup)
{
popupComponent = popup;
}
public void mouseClicked(MouseEvent event)
{
if ((activeObject != null) && activeObject.contains(event.getX(), event.getY()))
{
eventRelay.relay("mouseClicked", event);
}
else
{
if (event.getClickCount() == 2)
{
if (selectedObject != null)
{
activeObject = selectedObject;
Component component = activeObject.getComponent();
if (component != null)
{
eventRelay.reset();
eventRelay.addTarget(component, MouseListener.class, MouseEvent.class, mouseNames);
eventRelay.addTarget(component, MouseMotionListener.class, MouseEvent.class, mouseMotionNames);
selectableContainer.select(selectedObject, false);
}
}
}
}
}
public void mouseMoved(MouseEvent event)
{
if ((activeObject != null) && activeObject.contains(event.getX(), event.getY()))
{
eventRelay.relay("mouseMoved", event);
}
}
public void mouseEntered(MouseEvent event)
{
if ((activeObject != null) && activeObject.contains(event.getX(), event.getY()))
{
eventRelay.relay("mouseEntered", event);
}
}
public void mouseExited(MouseEvent event)
{
if ((activeObject != null) && activeObject.contains(event.getX(), event.getY()))
{
eventRelay.relay("mouseExited", event);
}
}
}