/*******************************************************************************
* Copyright (c) 2009 the CHISEL group and contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Del Myers -- initial API and implementation
*******************************************************************************/
package org.eclipse.zest.custom.sequence.widgets;
import java.util.LinkedList;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.RangeModel;
import org.eclipse.draw2d.Viewport;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.zest.custom.sequence.tools.AbstractWidgetTool;
/**
* Selection tool for the sequence viewer.
* @author Del Myers
*/
public class SelectionTool extends AbstractWidgetTool {
/* (non-Javadoc)
* @see org.eclipse.mylar.zest.custom.sequence.tools.IWidgetTool#handleMouseDoubleClicked(org.eclipse.swt.events.MouseEvent, org.eclipse.swt.widgets.Widget, org.eclipse.draw2d.IFigure)
*/
public void handleMouseDoubleClicked(MouseEvent me, Widget widget,
IFigure cursorTarget) {
}
/* (non-Javadoc)
* @see org.eclipse.mylar.zest.custom.sequence.tools.IWidgetTool#handleMouseHover(org.eclipse.swt.events.MouseEvent, org.eclipse.swt.widgets.Widget, org.eclipse.draw2d.IFigure)
*/
public void handleMouseHover(MouseEvent me, Widget widget,
IFigure cursorTarget) {
}
/* (non-Javadoc)
* @see org.eclipse.mylar.zest.custom.sequence.tools.IWidgetTool#handleMouseMoved(org.eclipse.swt.events.MouseEvent, org.eclipse.swt.widgets.Widget, org.eclipse.draw2d.IFigure)
*/
public void handleMouseMoved(MouseEvent me, Widget widget,
IFigure cursorTarget) {
}
/* (non-Javadoc)
* @see org.eclipse.mylar.zest.custom.sequence.tools.IWidgetTool#handleMousePressed(org.eclipse.swt.events.MouseEvent, org.eclipse.swt.widgets.Widget, org.eclipse.draw2d.IFigure)
*/
public void handleMousePressed(MouseEvent me, Widget widget,
IFigure cursorTarget) {
Widget parent = getCurrentControl();
UMLSequenceChart chart = (UMLSequenceChart) parent;
if (((parent.getStyle() & SWT.MULTI) != 0) && ((me.stateMask & SWT.MOD1) != 0)) {
if (widget == null) return;
UMLItem[] oldSelection = chart.getSelection();
LinkedList<UMLItem> newSelection = new LinkedList<UMLItem>();
boolean reselect = false;
for (int i = 0; i < oldSelection.length; i++) {
UMLItem item = oldSelection[i];
if (item == widget) {
reselect = true;
newSelection.addFirst(item);
} else {
newSelection.addLast(item);
}
}
if (!reselect && widget instanceof UMLItem) {
newSelection.addLast((UMLItem)widget);
}
chart.internalUpdateSelection(newSelection.toArray(new UMLItem[newSelection.size()]));
if (reselect) {
//we have found the item a second time. Put it at the
//top of the selection list, and fire a "re-select"
chart.internalReselect(newSelection.getFirst());
}
} else {
if (widget == null) {
if (chart.getSelection().length != 0) {
chart.internalSetSelection(new UMLItem[0]);
}
} else if (widget != null){
chart.internalSetSelection(new UMLItem[] {(UMLItem)widget});
}
}
}
/* (non-Javadoc)
* @see org.eclipse.mylar.zest.custom.sequence.tools.IWidgetTool#handleMouseReleased(org.eclipse.swt.events.MouseEvent, org.eclipse.swt.widgets.Widget, org.eclipse.draw2d.IFigure)
*/
public void handleMouseReleased(MouseEvent me, Widget widget,
IFigure cursorTarget) {
}
/* (non-Javadoc)
* @see org.eclipse.mylar.zest.custom.sequence.tools.IWidgetTool#understandsEvent(org.eclipse.swt.events.MouseEvent, org.eclipse.swt.widgets.Widget, org.eclipse.draw2d.IFigure)
*/
public boolean understandsEvent(MouseEvent me, Widget widget,
IFigure cursorTarget) {
return (getCurrentControl() instanceof UMLSequenceChart);
}
/* (non-Javadoc)
* @see org.eclipse.mylar.zest.custom.sequence.tools.IWidgetTool#handleMouseWheelScrolled(org.eclipse.swt.widgets.Event)
*/
public void handleMouseWheelScrolled(Event event, IFigure mouseTarget) {
//find the nearest viewport
while (!(mouseTarget instanceof Viewport) && mouseTarget != null) {
mouseTarget = mouseTarget.getParent();
}
if (mouseTarget instanceof Viewport) {
RangeModel rm = ((Viewport)mouseTarget).getVerticalRangeModel();
rm.setValue(rm.getValue() - event.count*10);
}
}
}