1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package de.jaret.examples.timebars.timeline.swt.renderer;
21
22 import org.eclipse.swt.SWT;
23 import org.eclipse.swt.graphics.Color;
24 import org.eclipse.swt.graphics.GC;
25 import org.eclipse.swt.graphics.Rectangle;
26 import org.eclipse.swt.printing.Printer;
27
28 import de.jaret.examples.timebars.timeline.model.TimelineEvent;
29 import de.jaret.util.date.Interval;
30 import de.jaret.util.swt.SwtGraphicsHelper;
31 import de.jaret.util.ui.timebars.TimeBarViewerDelegate;
32 import de.jaret.util.ui.timebars.TimeBarViewerInterface;
33 import de.jaret.util.ui.timebars.swt.renderer.RendererBase;
34 import de.jaret.util.ui.timebars.swt.renderer.TimeBarRenderer;
35 import de.jaret.util.ui.timebars.swt.renderer.TimeBarRenderer2;
36
37 /***
38 * Renderer rendering a point in time as a simple diamod and a label (using extended painting area).
39 *
40 * @author Peter Kliem
41 * @version $Id: FancyEventRenderer.java 565 2007-09-16 13:25:48Z olk $
42 */
43 public class DetailEventRenderer extends RendererBase implements TimeBarRenderer, TimeBarRenderer2 {
44 /*** size of the drawn element. */
45 private static final int SIZE = 5;
46 /*** extend for the label. */
47 private static final int MAXLABELWIDTH = 200;
48 /*** pixeloffset for the label drawing. */
49 private static final int LABELOFFSET = 3;
50
51 /*** corrected size (for printing). */
52 private int _size = SIZE;
53
54 /*** cache for the delegate supplying the orientation information. */
55 protected TimeBarViewerDelegate _delegate;
56
57 /***
58 * Create renderer for printing.
59 *
60 * @param printer printer device
61 */
62 public DetailEventRenderer(Printer printer) {
63 super(printer);
64 _size = scaleX(SIZE);
65 }
66
67 /***
68 * Construct renderer for screen use.
69 *
70 */
71 public DetailEventRenderer() {
72 super(null);
73 }
74
75 /***
76 * {@inheritDoc}
77 */
78 public Rectangle getPreferredDrawingBounds(Rectangle intervalDrawingArea, TimeBarViewerDelegate delegate,
79 Interval interval, boolean selected, boolean printing, boolean overlap) {
80
81 boolean horizontal = delegate.getOrientation() == TimeBarViewerInterface.Orientation.HORIZONTAL;
82 if (horizontal) {
83 return new Rectangle(intervalDrawingArea.x - _size, intervalDrawingArea.y, intervalDrawingArea.width + 2
84 * _size + scaleX(MAXLABELWIDTH), intervalDrawingArea.height);
85 } else {
86 return new Rectangle(intervalDrawingArea.x, intervalDrawingArea.y - _size, intervalDrawingArea.width,
87 intervalDrawingArea.height + 2 * _size + scaleY(MAXLABELWIDTH));
88 }
89 }
90
91 /***
92 * {@inheritDoc}
93 */
94 public void draw(GC gc, Rectangle drawingArea, TimeBarViewerDelegate delegate, Interval interval, boolean selected,
95 boolean printing, boolean overlap) {
96 _delegate = delegate;
97 defaultDraw(gc, drawingArea, delegate, interval, selected, printing, overlap);
98 }
99
100 /***
101 * {@inheritDoc}
102 */
103 public String getToolTipText(Interval interval, Rectangle drawingArea, int x, int y, boolean overlapping) {
104 return getToolTipText(_delegate, interval, drawingArea, x, y, overlapping);
105 }
106
107 /***
108 * {@inheritDoc}
109 */
110 public boolean contains(Interval interval, Rectangle drawingArea, int x, int y, boolean overlapping) {
111 return contains(_delegate, interval, drawingArea, x, y, overlapping);
112 }
113
114 /***
115 * {@inheritDoc}
116 */
117 public Rectangle getContainingRectangle(Interval interval, Rectangle drawingArea, boolean overlapping) {
118 return getContainingRectangle(_delegate, interval, drawingArea, overlapping);
119 }
120
121 /***
122 * {@inheritDoc}. Will create print renderes for all registered renderers.
123 */
124 public TimeBarRenderer createPrintrenderer(Printer printer) {
125 DetailEventRenderer renderer = new DetailEventRenderer(printer);
126 return renderer;
127 }
128
129 /***
130 * {@inheritDoc}
131 */
132 public void dispose() {
133 }
134
135 /***
136 * Drawing method for default rendering.
137 *
138 * @param gc GC
139 * @param drawingArea drawingArea
140 * @param delegate delegate
141 * @param interval interval to draw
142 * @param selected true for selected drawing
143 * @param printing true for printing
144 * @param overlap true if the interval overlaps with other intervals
145 */
146 private void defaultDraw(GC gc, Rectangle drawingArea, TimeBarViewerDelegate delegate, Interval interval,
147 boolean selected, boolean printing, boolean overlap) {
148
149 TimelineEvent event = (TimelineEvent) interval;
150
151
152 boolean horizontal = delegate.getOrientation() == TimeBarViewerInterface.Orientation.HORIZONTAL;
153 Rectangle da = getDrawingRect(drawingArea, horizontal);
154
155
156 drawFocus(gc, da, delegate, interval, selected, printing, overlap);
157
158 Color bg = gc.getBackground();
159
160
161 if (event.getSeconds()>0) {
162 gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_CYAN));
163 gc.fillRectangle(drawingArea);
164 }
165
166
167
168 gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_GRAY));
169 if (event.getColor() != null && event.getColor().equals("red")) {
170 gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_RED));
171 }
172
173
174 int[] points = new int[] {da.x, da.y + da.height / 2, da.x + da.width / 2, da.y, da.x + da.width,
175 da.y + da.height / 2, da.x + da.width / 2, da.y + da.height};
176
177 gc.fillPolygon(points);
178 gc.drawPolygon(points);
179
180 if (selected) {
181 gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_BLUE));
182 gc.setAlpha(60);
183 gc.fillPolygon(points);
184 gc.setAlpha(255);
185 }
186 gc.setBackground(bg);
187
188
189
190 if (horizontal) {
191 SwtGraphicsHelper.drawStringVCentered(gc, event.getTitle(), da.x + da.width + scaleX(LABELOFFSET), da.y, da.y
192 + da.height);
193 } else {
194 SwtGraphicsHelper.drawStringCentered(gc, event.getTitle(), da.x + da.width / 2, da.y + da.height
195 + scaleY(LABELOFFSET) + gc.textExtent(event.getTitle()).y);
196 }
197
198 }
199
200 /***
201 * Calculate the drawing area for the marking symbol.
202 *
203 * @param drawingArea drawing area as given for the time
204 * @return Rectangle for drawing the main symbol
205 */
206 private Rectangle getDrawingRect(Rectangle drawingArea, boolean horizontal) {
207 if (horizontal) {
208 int y = drawingArea.y + (drawingArea.height - 2 * _size) / 2;
209 return new Rectangle(drawingArea.x - _size, y, 2 * _size, 2 * _size);
210 } else {
211 int x = drawingArea.x + (drawingArea.width - 2 * _size) / 2;
212 return new Rectangle(x, drawingArea.y - _size, 2 * _size, 2 * _size);
213 }
214 }
215
216 public String getToolTipText(TimeBarViewerDelegate delegate, Interval interval, Rectangle drawingArea, int x,
217 int y, boolean overlapping) {
218 if (contains(delegate, interval, drawingArea, x, y, overlapping)) {
219 return interval.toString();
220 }
221 return null;
222 }
223
224 public boolean contains(TimeBarViewerDelegate delegate, Interval interval, Rectangle drawingArea, int x, int y,
225 boolean overlapping) {
226 boolean horizontal = delegate.getOrientation() == TimeBarViewerInterface.Orientation.HORIZONTAL;
227 Rectangle da = getDrawingRect(drawingArea, horizontal);
228 return da.contains(drawingArea.x + x, drawingArea.y + y);
229 }
230
231 public Rectangle getContainingRectangle(TimeBarViewerDelegate delegate, Interval interval, Rectangle drawingArea,
232 boolean overlapping) {
233 boolean horizontal = delegate.getOrientation() == TimeBarViewerInterface.Orientation.HORIZONTAL;
234 Rectangle da = getDrawingRect(drawingArea, horizontal);
235 return da;
236 }
237
238 }