/* =====================================================================
* Ocelotl Visualization Tool
* =====================================================================
*
* Ocelotl is a Framesoc plug in that enables to visualize a trace
* overview by using aggregation techniques
*
* (C) Copyright 2013 INRIA
*
* 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:
* Damien Dosimont <damien.dosimont@imag.fr>
* Generoso Pagano <generoso.pagano@inria.fr>
*/
package fr.inria.soctrace.tools.ocelotl.ui.views.unitAxisView;
import java.util.HashMap;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.OrderedLayout;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Canvas;
import fr.inria.soctrace.tools.ocelotl.core.dataaggregmanager.spacetime.EventProducerHierarchy.EventProducerNode;
import fr.inria.soctrace.tools.ocelotl.core.ivisuop.IVisuOperator;
import fr.inria.soctrace.tools.ocelotl.ui.views.OcelotlView;
import fr.inria.soctrace.tools.ocelotl.ui.views.timelineview.AggregatedView;
/**
* Unit Axis View: show a Y axis on the side
*
* @author "Damien Dosimont <damien.dosimont@imag.fr>"
*/
abstract public class UnitAxisView {
protected Figure root;
protected Canvas canvas;
protected OcelotlView ocelotlView;
protected YAxisMouseListener mouse;
protected SelectFigure highLightDisplayedProducer;
protected SelectFigure highLightSelectedProducer;
protected SelectFigure selectFigure;
protected EventProducerNode currentlySelectedEpn = null;
protected UnitAxisViewWrapper wrapper;
protected int originY;
protected int cornerY;
protected HashMap<EventProducerNode, Rectangle> eventProdToFigures;
protected HashMap<Rectangle, EventProducerNode> figuresToEventProd;
public class UnitAxisViewControlListener implements ControlListener{
@Override
public void controlMoved(final ControlEvent arg0) {
canvas.redraw();
root.repaint();
resizeDiagram();
}
@Override
public void controlResized(final ControlEvent arg0) {
canvas.redraw();
root.repaint();
resizeDiagram();
}
}
public UnitAxisView() {
eventProdToFigures = new HashMap<EventProducerNode, Rectangle>();
figuresToEventProd = new HashMap<Rectangle, EventProducerNode>();
selectFigure = new SelectFigure();
}
public Figure getRoot() {
return root;
}
public SelectFigure getSelectFigure() {
return selectFigure;
}
public void setSelectFigure(SelectFigure selectFigure) {
this.selectFigure = selectFigure;
}
public int getOriginY() {
return originY;
}
public void setOriginY(int originY) {
this.originY = originY;
}
public int getCornerY() {
return cornerY;
}
public void setCornerY(int cornerY) {
this.cornerY = cornerY;
}
public HashMap<EventProducerNode, Rectangle> getEventProdToFigures() {
return eventProdToFigures;
}
public void setEventProdToFigures(HashMap<EventProducerNode, Rectangle> figures) {
this.eventProdToFigures = figures;
}
public HashMap<Rectangle, EventProducerNode> getFiguresToEventProd() {
return figuresToEventProd;
}
public void setFiguresToEventProd(HashMap<Rectangle, EventProducerNode> figuresToEventProd) {
this.figuresToEventProd = figuresToEventProd;
}
public EventProducerNode getCurrentlySelectedEpn() {
return currentlySelectedEpn;
}
public void setCurrentlySelectedEpn(EventProducerNode currentlySelectedEpn) {
this.currentlySelectedEpn = currentlySelectedEpn;
}
public OcelotlView getOcelotlView() {
return ocelotlView;
}
public void setOcelotlView(OcelotlView ocelotlView) {
this.ocelotlView = ocelotlView;
}
public SelectFigure getHighLightDisplayedProducer() {
return highLightDisplayedProducer;
}
public void setHighLightDisplayedProducer(SelectFigure highLightDisplayedProducer) {
this.highLightDisplayedProducer = highLightDisplayedProducer;
}
public SelectFigure getHighLightSelectedProducer() {
return highLightSelectedProducer;
}
public void setHighLightSelectedProducer(SelectFigure highLightSelectedProducer) {
this.highLightSelectedProducer = highLightSelectedProducer;
}
public abstract void createDiagram(final IVisuOperator manager);
public abstract void resizeDiagram();
public abstract void initDiagram();
public abstract void select(final int y0, final int y1, final boolean active);
/**
* Remove selection display
*/
public abstract void unselect();
public void init(final UnitAxisViewWrapper wrapper) {
root = wrapper.getRoot();
canvas = wrapper.getCanvas();
ocelotlView = wrapper.getOcelotlView();
highLightDisplayedProducer = new SelectFigure(ColorConstants.black, ColorConstants.white, 255);
highLightDisplayedProducer.setLineWidth(2);
highLightDisplayedProducer.setFill(false);
highLightSelectedProducer = new SelectFigure(ColorConstants.red, ColorConstants.white, 255);
highLightSelectedProducer.setLineWidth(2);
highLightSelectedProducer.setFill(false);
currentlySelectedEpn = null;
this.wrapper=wrapper;
this.wrapper.cleanMouseListeners();
this.wrapper.cleanMouseMotionListeners();
this.wrapper.addMouseListener(mouse);
this.wrapper.addMouseMotionListener(mouse);
this.wrapper.cleanControlListeners();
this.wrapper.addControlListener(new UnitAxisViewControlListener());
initDiagram();
}
public void deleteDiagram() {
unselect();
root.removeAll();
root.repaint();
}
public class SelectFigure extends RectangleFigure {
public SelectFigure() {
super();
final ToolbarLayout layout = new ToolbarLayout();
layout.setMinorAlignment(OrderedLayout.ALIGN_CENTER);
setLayoutManager(layout);
setAlpha(50);
}
public SelectFigure(Color foreGround, Color backGround, int alphaValue) {
super();
final ToolbarLayout layout = new ToolbarLayout();
layout.setMinorAlignment(OrderedLayout.ALIGN_CENTER);
setLayoutManager(layout);
setForegroundColor(foreGround);
setBackgroundColor(backGround);
setAlpha(AggregatedView.activeColorAlpha);
}
public void draw(int originY, int cornerY, final boolean active) {
if (active) {
setForegroundColor(AggregatedView.activeColorFG);
setBackgroundColor(AggregatedView.activeColorBG);
setAlpha(AggregatedView.activeColorAlpha);
} else {
setForegroundColor(AggregatedView.potentialColorFG);
setBackgroundColor(AggregatedView.potentialColorBG);
setAlpha(AggregatedView.potentialColorAlpha);
}
root.add(this,
new Rectangle(new Point(0, originY), new Point(root.getClientArea().width,
cornerY)));
root.validate();
}
public void draw(int originX, int originY, int cornerX, int cornerY) {
root.add(this, new Rectangle(new Point(originX, originY),
new Point(cornerX, cornerY)));
}
public void draw(EventProducerNode epn) {
if (eventProdToFigures.containsKey(epn)) {
Rectangle selectedZone = eventProdToFigures.get(epn);
draw(selectedZone.x, selectedZone.y, selectedZone.x() + selectedZone.width(), selectedZone.y() + selectedZone.height());
}
}
/**
* Remove the selection from display
*/
public void delete() {
if (getParent() != null)
root.remove(this);
}
}
}