/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.view.timeline;
import java.util.Date;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import de.rcenvironment.core.gui.resources.api.ColorManager;
/**
* Each Component has its own {@link TimelineComponentCanvas} showing the usage of the component during a workflow.
* @author Hendrik Abbenhaus
*
*/
public class TimelineComponentCanvas extends Canvas implements PaintListener, MouseListener, MouseMoveListener {
private TimelineActivityPart[] activities = null;
private Date wfEndTime = null;
private Date visibleStartTime = null;
private Date visibleEndTime = null;
public TimelineComponentCanvas(Composite parent, Date startTime, Date endTime) {
super(parent, SWT.SINGLE);
this.addPaintListener(this);
this.addMouseMoveListener(this);
this.setVisibleTimeArea(startTime, endTime);
}
@Override
public void paintControl(PaintEvent e) {
// get width of canvas
int maxX = this.getSize().x;
// getHeigh of canvass
int maxY = this.getSize().y;
e.gc.setBackground(ColorManager.getInstance().getSharedColor(TimelineViewConstants.CANVAS_COLOR_BACKGROUND));
e.gc.fillRectangle(0, 0, maxX, maxY);
e.gc.setForeground(ColorManager.getInstance().getSharedColor(TimelineViewConstants.CANVAS_COLOR_BACKGROUND_LINE));
e.gc.drawLine(0, (int) (maxY / 2), maxX, (int) (maxY / 2));
if (activities == null || activities.length == 0
|| visibleStartTime == null
|| visibleEndTime == null
|| wfEndTime == null) {
return;
}
for (int i = 0; i < activities.length; i++) {
TimelineActivityPart activity = activities[i];
if (activity.getType() == null) {
continue;
}
if (activity.getType().getColor() == null) {
continue;
}
if (activity.getEndDate() == null) {
activity.setEndtime(wfEndTime);
}
if (activity.getEndDate().before(this.visibleStartTime) || activity.getDate().after(this.visibleEndTime)) {
continue;
}
e.gc.setBackground(new Color(null, activity.getType().getColor()));
long startdraw =
TimelineView.convertDateToPixel(activity.getDate(), maxX, visibleStartTime, visibleEndTime);
long enddraw =
TimelineView.convertDateToPixel(activity.getEndDate(), maxX, visibleStartTime, visibleEndTime)
- startdraw;
e.gc.fillRectangle((int) startdraw, 3, (int) enddraw, maxY - 4);
}
}
/**
* Sets a new WorkflowEndTime.
* @param newwfEndTime the new workflow end time
*/
public void setWorkflowEndTime(Date newwfEndTime) {
this.wfEndTime = newwfEndTime;
this.redraw();
}
/**
* Sets a new visible time area containing start and endTime.
* @param startTime the current selected startTime
* @param endTime the current selected endTime
*/
public void setVisibleTimeArea(Date startTime, Date endTime) {
this.visibleStartTime = startTime;
this.visibleEndTime = endTime;
this.redraw();
}
/**
* Sets a new Content.
* @param newActivities the activities
*/
public void setActivities(TimelineActivityPart[] newActivities) {
this.activities = newActivities;
this.redraw();
}
/*
* (non-Javadoc)
* NO OP!
*
* @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
*/
@Override
public void mouseDoubleClick(MouseEvent arg0) {
}
/*
* (non-Javadoc)
* NO OP!
*
* @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
*/
@Override
public void mouseDown(MouseEvent arg0) {
}
/*
* (non-Javadoc)
* NO OP!
*
* @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
*/
@Override
public void mouseUp(MouseEvent arg0) {
}
/**
* Refreshes the current tooltipText by getting the correct {@link TimelineActivityPart}.
*
* {@inheritDoc}
*
* @see org.eclipse.swt.events.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent)
*/
@Override
public void mouseMove(MouseEvent e) {
String newToolTipText = "";
long tmpdate =
((long) e.x * (this.visibleEndTime.getTime() - this.visibleStartTime.getTime()) / (long) this.getSize().x)
+ this.visibleStartTime.getTime();
for (int i = 0; i < activities.length; i++) {
TimelineActivityPart current = activities[i];
if (current.getDate().getTime() < tmpdate) {
newToolTipText = activities[i].getTooltipText(wfEndTime);
}
}
this.setToolTipText(newToolTipText);
}
}