/* * 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); } }