/*******************************************************************************
* Copyright (c) Emil Crumhorn - Hexapixel.com - emil.crumhorn@gmail.com
* 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:
* emil.crumhorn@gmail.com - initial API and implementation
* ziogiannigmail.com - Bug 464509 - Minute View Implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.ganttchart;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
public abstract class AbstractPaintManager implements IPaintManager {
public void redrawStarting() { // NOPMD
}
public void drawEvent(final GanttComposite ganttComposite, final ISettings settings, final IColorManager colorManager, final GanttEvent event, final GC gc, final boolean isSelected, final boolean threeDee, final int dayWidth, final int xStart, final int y, final int eventWidth, final Rectangle bounds) {
final boolean alpha = colorManager.useAlphaDrawing();
int xLoc = xStart;
// draw the border
gc.setForeground(colorManager.getEventBorderColor());
if (isSelected && settings.drawSelectionMarkerAroundSelectedEvent()) {
gc.setLineStyle(SWT.LINE_DOT);
// this is _extremely_ slow to draw, so we need to check bounds here, which is probably a good idea anyway
final boolean oobLeft = (xLoc < bounds.x);
final boolean oobRight = (xLoc + eventWidth > bounds.width);
if (oobLeft || oobRight) {
if (!oobLeft || !oobRight) { //NOPMD
if (oobLeft) {
if (ganttComposite.getCurrentView() != ISettings.VIEW_MINUTE) {//Control added since this part was leading a deadlock with minute_view
// left side out of bounds
gc.drawLine(xLoc, y, xLoc + eventWidth, y);
gc.drawLine(xLoc + eventWidth, y, xLoc + eventWidth, y + event.getHeight());
gc.drawLine(xLoc, y + event.getHeight(), xLoc + eventWidth, y + event.getHeight());
}
} else {
// right side out of bounds
gc.drawLine(xLoc, y, bounds.width, y);
gc.drawLine(xLoc, y, xLoc, y + event.getHeight());
gc.drawLine(xLoc, y + event.getHeight(), bounds.width, y + event.getHeight());
}
} else {
// double out of bounds
gc.drawLine(bounds.x, y, bounds.x + bounds.width, y);
gc.drawLine(bounds.x, y + event.getHeight(), bounds.x + bounds.width, y + event.getHeight());
}
} else {
gc.drawRectangle(xLoc, y, eventWidth, settings.getEventHeight());
}
gc.setLineStyle(SWT.LINE_SOLID);
} else {
gc.drawRectangle(xLoc, y, eventWidth, settings.getEventHeight());
}
Color cEvent = event.getStatusColor();
Color gradient = event.getGradientStatusColor();
if (cEvent == null) {
cEvent = settings.getDefaultEventColor();
}
if (gradient == null) {
gradient = settings.getDefaultGradientEventColor();
}
// draw the insides
gc.setBackground(cEvent);
if (settings.showGradientEventBars()) {
gc.setForeground(gradient);
gc.fillGradientRectangle(xLoc + 1, y + 1, eventWidth - 1, settings.getEventHeight() - 1, true);
gc.setForeground(colorManager.getEventBorderColor()); // re-set foreground color
} else {
gc.fillRectangle(xLoc + 1, y + 1, eventWidth - 1, settings.getEventHeight() - 1);
}
// if 3D effect, draw drop-shadow
if (threeDee) {
final boolean subAlpha = colorManager.useAlphaDrawingOn3DEventDropShadows();
if (subAlpha) {
gc.setAlpha(200);
}
gc.setForeground(colorManager.getFadeOffColor1());
// horizontal line.. ends a few pixles right of bottom right corner
gc.drawLine(xLoc, y + settings.getEventHeight() + 1, xLoc + eventWidth + 1, y + settings.getEventHeight() + 1);
// vertical line at end, starts slightly below top right corner
gc.drawLine(xLoc + eventWidth + 1, y + 2, xLoc + eventWidth + 1, y + settings.getEventHeight());
if (subAlpha) {
gc.setAlpha(100);
}
gc.setForeground(colorManager.getFadeOffColor2());
gc.drawLine(xLoc, y + settings.getEventHeight() + 2, xLoc + eventWidth + 1, y + settings.getEventHeight() + 2); // h
if (subAlpha) {
gc.setAlpha(50);
}
gc.setForeground(colorManager.getFadeOffColor1());
gc.drawLine(xLoc, y + settings.getEventHeight() + 3, xLoc + eventWidth + 1, y + settings.getEventHeight() + 3); // h
// next vertical starts 1 pixel further down and 1 pixel further right and dips 1 pixel below bottom
gc.drawLine(xLoc + eventWidth + 2, y + 3, xLoc + eventWidth + 2, y + settings.getEventHeight() + 1); // v
if (subAlpha) {
gc.setAlpha(255);
gc.setAdvanced(false);
}
}
// whacky % completes don't get to play
if (event.getPercentComplete() > 0 && event.getPercentComplete() <= 100) {
final int yStart = y + (settings.getEventHeight() / 2) - 1;
// xEnd is how long the event box is
// how much of that in % are we showing?
final float perc = event.getPercentComplete() / 100f;
// and how many pixels is that?
float toDraw = eventWidth * perc;
// remainder
final int remainder = eventWidth - (int) toDraw;
if (alpha) {
gc.setAlpha(settings.getPercentageBarAlpha());
}
xLoc += 1;
toDraw -= 1;
// draw the inner bar
gc.setForeground(colorManager.getPercentageBarColorTop());
gc.setBackground(colorManager.getPercentageBarColorBottom());
gc.fillGradientRectangle(xLoc, yStart - settings.getEventPercentageBarHeight() / 2 + 1, (int) toDraw, settings.getEventPercentageBarHeight(), true);
if (settings.drawFullPercentageBar()) {
if (alpha) {
gc.setAlpha(settings.getRemainderPercentageBarAlpha());
}
gc.setForeground(colorManager.getPercentageBarRemainderColorTop());
gc.setBackground(colorManager.getPercentageBarRemainderColorBottom());
gc.fillGradientRectangle(xLoc + (int) toDraw, yStart - settings.getEventPercentageBarHeight() / 2 + 1, remainder, settings.getEventPercentageBarHeight(), true);
}
if (alpha) {
gc.setAlpha(255);
gc.setAdvanced(false);
}
}
}
public void drawCheckpoint(final GanttComposite ganttComposite, final ISettings settings, final IColorManager colorManager, final GanttEvent event, final GC gc, final boolean threeDee, final int dayWidth, final int x, final int y, final Rectangle bounds) {
Color cEvent = event.getStatusColor();
if (cEvent == null) {
cEvent = settings.getDefaultEventColor();
}
gc.setBackground(cEvent);
final int height = settings.getEventHeight();
// draw a special fun thing! (tm)
final long days = DateHelper.daysBetween(event.getActualStartDate(), event.getActualEndDate());
drawCheckpointMarker(gc, settings, colorManager, event, threeDee, x, y, dayWidth, height, bounds);
// multi day checkpoint
if (days != 0) {
final int width = (int) days * dayWidth;
drawCheckpointMarker(gc, settings, colorManager, event, threeDee, x + width, y, dayWidth, height, bounds);
// draw center
final int neg = height / 2 - 1;
final Rectangle rect = new Rectangle(x + dayWidth, y + neg, width - dayWidth, neg);
gc.setForeground(colorManager.getBlack());
gc.fillRectangle(rect);
gc.drawRectangle(rect);
if (settings.showBarsIn3D()) {
final boolean alpha = (colorManager.useAlphaDrawing() || colorManager.useAlphaDrawingOn3DEventDropShadows());
if (alpha) {
gc.setAlpha(200);
}
gc.setForeground(colorManager.getFadeOffColor1());
gc.drawLine(rect.x + 1, rect.y + rect.height + 1, rect.x + rect.width - 1, rect.y + rect.height + 1);
if (alpha) {
gc.setAlpha(100);
}
gc.setForeground(colorManager.getFadeOffColor2());
gc.drawLine(rect.x + 1, rect.y + rect.height + 2, rect.x + rect.width - 1, rect.y + rect.height + 2);
if (alpha) {
gc.setAlpha(50);
}
gc.setForeground(colorManager.getFadeOffColor3());
gc.drawLine(rect.x + 1, rect.y + rect.height + 3, rect.x + rect.width - 1, rect.y + rect.height + 3);
if (alpha) {
gc.setAlpha(255);
gc.setAdvanced(false);
}
}
}
}
private void drawCheckpointMarker(final GC gc, final ISettings settings, final IColorManager colorManager, final GanttEvent event, final boolean threeDee, final int x, final int y, final int width, final int height, final Rectangle bounds) {
final float fHoriSpacer = width * 0.17f;
final int hSpacer = (int) fHoriSpacer;
final float fVertiSpacer = height * 0.23f;
final int vSpacer = (int) fVertiSpacer;
final Rectangle topToBottom = new Rectangle(x + hSpacer, y, width - (hSpacer * 2), height + vSpacer);
final Rectangle leftToRight = new Rectangle(x, y + vSpacer, width, height - vSpacer);
final Rectangle inner = new Rectangle(x + hSpacer, y + vSpacer, width - (hSpacer * 2), height - (vSpacer * 2));
Color cEvent = event.getStatusColor();
Color gradient = event.getGradientStatusColor();
if (cEvent == null) {
cEvent = settings.getDefaultEventColor();
}
if (gradient == null) {
gradient = settings.getDefaultGradientEventColor();
}
gc.setForeground(gradient);
gc.setBackground(cEvent);
gc.fillRectangle(topToBottom);
gc.fillRectangle(leftToRight);
gc.fillGradientRectangle(inner.x, inner.y, inner.width, inner.height, true);
gc.setForeground(colorManager.getBlack());
gc.drawRectangle(topToBottom);
gc.drawRectangle(leftToRight);
if (threeDee) {
final boolean alpha = (colorManager.useAlphaDrawing() || colorManager.useAlphaDrawingOn3DEventDropShadows());
if (alpha) {
gc.setAlpha(200);
}
gc.setForeground(colorManager.getFadeOffColor1());
// horizontal line.. ends a few pixles right of bottom right corner
gc.drawLine(leftToRight.x, leftToRight.y + leftToRight.height + 1, leftToRight.x + hSpacer - 1, leftToRight.y + leftToRight.height + 1);
gc.drawLine(leftToRight.x + hSpacer, leftToRight.y + leftToRight.height + vSpacer + 1, leftToRight.x - hSpacer + leftToRight.width, leftToRight.y + leftToRight.height + vSpacer + 1);
gc.drawLine(leftToRight.x + leftToRight.width - hSpacer + 1, leftToRight.y + leftToRight.height + 1, leftToRight.x + leftToRight.width + 1, leftToRight.y + leftToRight.height + 1);
// vertical line at end, starts slightly below top right corner
gc.drawLine(leftToRight.x + leftToRight.width + 1, leftToRight.y + 2, leftToRight.x + leftToRight.width + 1, leftToRight.y + leftToRight.height + 1);
if (alpha) {
gc.setAlpha(100);
}
gc.setForeground(colorManager.getFadeOffColor2());
gc.drawLine(leftToRight.x, leftToRight.y + leftToRight.height + 2, leftToRight.x + hSpacer - 1, leftToRight.y + leftToRight.height + 2);
gc.drawLine(leftToRight.x + hSpacer, leftToRight.y + leftToRight.height + vSpacer + 2, leftToRight.x - hSpacer + leftToRight.width, leftToRight.y + leftToRight.height + vSpacer + 2);
gc.drawLine(leftToRight.x + leftToRight.width - hSpacer + 1, leftToRight.y + leftToRight.height + 2, leftToRight.x + leftToRight.width + 1, leftToRight.y + leftToRight.height + 2);
gc.drawLine(leftToRight.x + leftToRight.width + 2, leftToRight.y + 3, leftToRight.x + leftToRight.width + 2, leftToRight.y + leftToRight.height + 1);
if (alpha) {
gc.setAlpha(50);
}
gc.setForeground(colorManager.getFadeOffColor3());
gc.drawLine(leftToRight.x, leftToRight.y + leftToRight.height + 3, leftToRight.x + hSpacer - 1, leftToRight.y + leftToRight.height + 3);
gc.drawLine(leftToRight.x + hSpacer, leftToRight.y + leftToRight.height + vSpacer + 3, leftToRight.x - hSpacer + leftToRight.width, leftToRight.y + leftToRight.height + vSpacer + 3);
gc.drawLine(leftToRight.x + leftToRight.width - hSpacer + 1, leftToRight.y + leftToRight.height + 3, leftToRight.x + leftToRight.width + 1, leftToRight.y + leftToRight.height + 3);
gc.drawLine(leftToRight.x + leftToRight.width + 3, leftToRight.y + 4, leftToRight.x + leftToRight.width + 3, leftToRight.y + leftToRight.height + 1);
if (alpha) {
gc.setAlpha(255);
gc.setAdvanced(false);
}
}
}
public void drawPlannedDates(final GanttComposite ganttComposite, final ISettings settings, final IColorManager colorManager, final GanttEvent event, final GC gc, final boolean threeDee, final int x, final int y, final int eventWidth, final Rectangle bounds) {
final int spacer = settings.getRevisedLineSpacer();
if (event.isScope()) {
return;
}
if (event.getStartDate() != null) {
final int xs = ganttComposite.getStartingXFor(event.getStartDate());
// commenting this out July 2, 2009, if we draw the marker, draw it regardless if it's same or not
// otherwise doesn't make much sense
//if (xs != ge.getX()) {
final int ys = y - spacer;
gc.setForeground(colorManager.getRevisedStartColor());
gc.drawLine(xs, ys, x, ys);
gc.drawLine(xs, ys - 3, xs, ys + 3);
gc.drawLine(x, ys - 3, x, ys + 3);
//}
}
if (event.getEndDate() != null) {
int xe = ganttComposite.getStartingXFor(event.getEndDate());
xe += ganttComposite.getDayWidth();
//if (xe != ge.getXEnd()) {
final int ys = y + settings.getEventHeight() + spacer;
gc.setForeground(colorManager.getRevisedEndColor());
gc.drawLine(xe, ys, x + eventWidth, ys);
gc.drawLine(xe, ys - 3, xe, ys + 3);
gc.drawLine(x + eventWidth, ys - 3, x + eventWidth, ys + 3);
//}
}
}
public void drawDaysOnChart(final GanttComposite ganttComposite, final ISettings settings, final IColorManager colorManager, final GanttEvent event, final GC gc, final boolean threeDee, final int x, final int y, final int eventWidth, final int daysNumber, final Rectangle bounds) {
if (event.isImage()) {
return;
}
final int top = y - 2;
final int xE = x + eventWidth;
final int middle = x + ((xE - x) / 2);
int yMiddle = event.getY() + (event.getHeight() / 2);
final StringBuffer buf = new StringBuffer();
buf.append(daysNumber);
final String dayString = buf.toString();
final Point extent = gc.stringExtent(dayString);
final Point unmodified = new Point(extent.x, extent.y);
extent.x = extent.x + (2 * 2) + 2; // 2 pixel spacing on 2 sides, for clarity's sake
Color gradient = event.getGradientStatusColor();
if (gradient == null) {
gradient = settings.getDefaultGradientEventColor();
}
if ((middle - extent.x) > x) {
gc.setBackground(gradient);
gc.fillRectangle(middle - extent.x / 2, top, extent.x, settings.getEventHeight() + 4);
gc.setForeground(colorManager.getTextColor());
gc.drawRectangle(middle - extent.x / 2, top, extent.x, settings.getEventHeight() + 4);
yMiddle -= unmodified.y / 2;
gc.drawString(dayString, middle - unmodified.x + (unmodified.x / 2) + 1, yMiddle, true);
}
}
public void drawEventString(final GanttComposite ganttComposite, final ISettings settings, final IColorManager colorManager, final GanttEvent event, final GC gc, final String toDraw, final boolean threeDee, final int x, final int y, final int eventWidth, final Rectangle bounds) {
int textEndX = 0;
int yTextPos = y + (event.getHeight() / 2);
Font oldFont = null;
gc.setForeground(colorManager.getTextColor());
if (event.showBoldText()) {
oldFont = gc.getFont();
final FontData[] old = oldFont.getFontData();
old[0].setStyle(SWT.BOLD);
final Font f = new Font(Display.getDefault(), old);
gc.setFont(f);
// DISPOSE FONT or we'll run out of handles
f.dispose();
}
// font overrides a bold setting
if (event.getTextFont() != null) {
gc.setFont(event.getTextFont());
}
final Point toDrawExtent = event.getNameExtent();
final int textSpacer = ganttComposite.isConnected(event) ? settings.getTextSpacerConnected() : settings.getTextSpacerNonConnected();
int textXStart = 0;
// find the horizontal text location
switch (event.getHorizontalTextLocation()) {
case SWT.LEFT:
textXStart = x - textSpacer - toDrawExtent.x;
break;
case SWT.CENTER:
if (!settings.shiftHorizontalCenteredEventString() || toDrawExtent.x < eventWidth) {
textXStart = x + (eventWidth / 2) - (toDrawExtent.x / 2);
break;
}
case SWT.RIGHT:
//textXStart = x + eventWidth + textSpacer;
int eventOrPictureWidth = eventWidth;
// bugzilla feature request #309808
if (!settings.scaleImageToDayWidth() && event.getPicture() != null) {
// the image is drawn centered, therefore consider only half of its width
eventOrPictureWidth = Math.max(eventOrPictureWidth, event.getPicture().getImageData().width / 2);
}
textXStart = x + eventOrPictureWidth + textSpacer;
break;
default:
break;
}
// find the vertical text location
switch (event.getVerticalTextLocation()) {
case SWT.TOP:
yTextPos = event.getY() - toDrawExtent.y;
break;
case SWT.CENTER:
yTextPos -= (toDrawExtent.y / 2) - 1;
break;
case SWT.BOTTOM:
yTextPos = event.getBottomY();
break;
default:
break;
}
gc.drawString(toDraw, textXStart, yTextPos, true);
int extra = textSpacer + toDrawExtent.x;
textEndX = x + eventWidth + extra;
// draw lock icon if parent phase is locked
if (event.isLocked()) {
final Image lockImage = settings.getLockImage();
if (textEndX != 0 && lockImage != null) {
gc.drawImage(lockImage, textEndX, y);
extra += lockImage.getBounds().width;
}
}
// regardless of horizontal alignment, it will still add on, so we can leave this as is
event.setWidthWithText(event.getWidth() + extra);
// reset font
gc.setFont(oldFont);
}
public void drawScope(final GanttComposite ganttComposite, final ISettings settings, final IColorManager colorManager, final GanttEvent event, final GC gc, final boolean threeDee, final int dayWidth, final int x, final int y, final int eventWidth, final Rectangle bounds) {
final List scopeEvents = event.getScopeEvents();
// empty scope
if (scopeEvents.isEmpty()) {
return;
}
gc.setForeground(colorManager.getScopeGradientColorTop());
gc.setBackground(colorManager.getScopeGradientColorBottom());
gc.fillGradientRectangle(x, y, eventWidth, settings.getEventHeight() - 5, true);
gc.setForeground(colorManager.getScopeBorderColor());
gc.drawRectangle(new Rectangle(x, y, eventWidth, settings.getEventHeight() - 5));
gc.setForeground(colorManager.getScopeGradientColorTop());
gc.setBackground(colorManager.getScopeGradientColorBottom());
gc.fillGradientRectangle(x, y, dayWidth / 2, settings.getEventHeight(), true);
gc.fillGradientRectangle(x + eventWidth + (dayWidth / 2) - dayWidth, y, dayWidth / 2, settings.getEventHeight(), true);
gc.setForeground(colorManager.getScopeBorderColor());
gc.drawRectangle(x, y, dayWidth / 2, settings.getEventHeight());
gc.drawRectangle(x + eventWidth + (dayWidth / 2) - dayWidth, y, dayWidth / 2, settings.getEventHeight());
if (threeDee) {
final boolean alpha = (colorManager.useAlphaDrawing() || colorManager.useAlphaDrawingOn3DEventDropShadows());
if (alpha) {
gc.setAlpha(200);
}
gc.setForeground(colorManager.getFadeOffColor1());
gc.drawLine(x, y + settings.getEventHeight() + 1, x + dayWidth / 2, y + settings.getEventHeight() + 1);
gc.drawLine(x + eventWidth - (dayWidth / 2), y + settings.getEventHeight() + 1, x + eventWidth, y + settings.getEventHeight() + 1);
gc.drawLine(x + (dayWidth / 2) + 1, y + settings.getEventHeight() - 4, x + eventWidth - (dayWidth / 2) - 1, y + settings.getEventHeight() - 4);
if (alpha) {
gc.setAlpha(100);
}
gc.setForeground(colorManager.getFadeOffColor2());
gc.drawLine(x, y + settings.getEventHeight() + 2, x + dayWidth / 2, y + settings.getEventHeight() + 2);
gc.drawLine(x + eventWidth - (dayWidth / 2), y + settings.getEventHeight() + 2, x + eventWidth, y + settings.getEventHeight() + 2);
gc.drawLine(x + (dayWidth / 2) + 1, y + settings.getEventHeight() - 3, x + eventWidth - (dayWidth / 2) - 1, y + settings.getEventHeight() - 3);
if (alpha) {
gc.setAlpha(50);
}
gc.setForeground(colorManager.getFadeOffColor3());
gc.drawLine(x, y + settings.getEventHeight() + 3, x + dayWidth / 2, y + settings.getEventHeight() + 3);
gc.drawLine(x + eventWidth - (dayWidth / 2), y + settings.getEventHeight() + 3, x + eventWidth, y + settings.getEventHeight() + 3);
gc.drawLine(x + (dayWidth / 2) + 1, y + settings.getEventHeight() - 2, x + eventWidth - (dayWidth / 2) - 1, y + settings.getEventHeight() - 2);
if (alpha) {
gc.setAlpha(255);
gc.setAdvanced(false);
}
}
}
public void drawImage(final GanttComposite ganttComposite, final ISettings settings, final IColorManager colorManager, final GanttEvent event, final GC gc, final Image image, final boolean threeDee, final int dayWidth, final int xLoc, final int yStart, final Rectangle fullBounds) {
int y = yStart;
int x = xLoc;
// draw a cross in a box if image is null
if (image == null) {
gc.setForeground(colorManager.getBlack());
gc.drawRectangle(x, y, dayWidth, settings.getEventHeight());
gc.drawLine(x, y, x + dayWidth, y + settings.getEventHeight());
gc.drawLine(x + dayWidth, y, x, y + settings.getEventHeight());
return;
}
// can it fit?
final Rectangle bounds = image.getBounds();
if (settings.scaleImageToDayWidth() && bounds.width > dayWidth) {
// shrink image
ImageData id = image.getImageData();
final int diff = id.width - dayWidth;
id.width -= diff;
id.height -= diff;
final Image temp = new Image(Display.getDefault(), id);
final int negY = (bounds.height - settings.getEventHeight());
if (negY > 0) {
y += negY / 2;
}
gc.drawImage(temp, x, y);
temp.dispose();
return;
} else {
// center it x-wise
x -= (bounds.width - dayWidth) / 2;
if (settings.getEventHeight() > bounds.height) {
y += (settings.getEventHeight() - bounds.height);
}
}
gc.drawImage(image, x, y);
}
public void drawArrowHead(final int x, final int y, final int face, final GC gc) {
switch (face) {
case SWT.UP:
gc.drawLine(x, y + 3, x, y + 3);
gc.drawLine(x - 1, y + 4, x + 1, y + 4);
gc.drawLine(x - 2, y + 5, x + 2, y + 5);
gc.drawLine(x - 3, y + 6, x + 3, y + 6);
gc.drawLine(x - 4, y + 7, x + 4, y + 7);
break;
case SWT.DOWN:
gc.drawLine(x, y + 7, x, y + 7);
gc.drawLine(x - 1, y + 6, x + 1, y + 6);
gc.drawLine(x - 2, y + 5, x + 2, y + 5);
gc.drawLine(x - 3, y + 4, x + 3, y + 4);
gc.drawLine(x - 4, y + 3, x + 4, y + 3);
break;
case SWT.RIGHT:
// don't need 1 as a line will be on it
gc.drawLine(x + 3, y - 4, x + 3, y + 4);
gc.drawLine(x + 4, y - 3, x + 4, y + 3);
gc.drawLine(x + 5, y - 2, x + 5, y + 2);
gc.drawLine(x + 6, y - 1, x + 6, y + 1);
break;
case SWT.LEFT:
// don't need 1 as a line will be on it
gc.drawLine(x - 3, y - 4, x - 3, y + 4);
gc.drawLine(x - 4, y - 3, x - 4, y + 3);
gc.drawLine(x - 5, y - 2, x - 5, y + 2);
gc.drawLine(x - 6, y - 1, x - 6, y + 1);
break;
default:
break;
}
}
public void drawLockedDateRangeMarker(final GanttComposite ganttComposite, final ISettings settings, final IColorManager colorManager, final GanttEvent ge, final GC gc, final boolean threeDee, final int dayWidth, final int y, final int startLoc, final int end, final Rectangle bounds) {
int start = startLoc;
final int maxY = settings.getEventHeight();
final int topY = y - 2;
int xEnd = end;
gc.setForeground(ColorCache.getColor(188, 188, 188));
gc.setLineStyle(SWT.LINE_SOLID);
gc.setLineWidth(1);
// we don't draw any extras on the hours view, it doesn't behave like the others
int extra = dayWidth;
if (ganttComposite.getCurrentView() == ISettings.VIEW_DAY) {
extra = 0;
}
if (start != -1 && xEnd != -1) {
// no need to draw beyond what we can see, and it's extremely slow to draw dots anyway, so we need this to be as fast as can be
if (start < 0) {
start = -1;
}
if (xEnd > bounds.width) {
xEnd = bounds.width + 1;
}
// space it slightly or we'll draw on top of event borders
gc.drawRectangle(start - 1, topY, xEnd - start + extra + 2, maxY + 4);
} else {
//gc.setLineStyle(SWT.LINE_SOLID);
if (start != -1) {
gc.drawRectangle(start - 4, topY + 1, 2, 3 + maxY);
gc.drawLine(start - 2, topY + 1, start + 5, topY + 1);
gc.drawLine(start - 2, topY + 4 + maxY, start + 5, topY + 4 + maxY);
}
if (xEnd != -1) {
xEnd += extra;
gc.drawRectangle(xEnd + 2, topY + 1, 2, 3 + maxY);
gc.drawLine(xEnd + 2, topY + 1, xEnd - 5, topY + 1);
gc.drawLine(xEnd + 2, topY + 4 + maxY, xEnd - 5, topY + 4 + maxY);
}
}
//gc.setLineWidth(1);
//gc.setLineStyle(SWT.LINE_SOLID);
}
}