1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package de.jaret.util.ui.timebars.swt.renderer;
21
22 import java.util.HashMap;
23 import java.util.Map;
24
25 import org.eclipse.jface.resource.ImageDescriptor;
26 import org.eclipse.jface.resource.ImageRegistry;
27 import org.eclipse.jface.viewers.ILabelProvider;
28 import org.eclipse.swt.SWT;
29 import org.eclipse.swt.graphics.Color;
30 import org.eclipse.swt.graphics.GC;
31 import org.eclipse.swt.graphics.Image;
32 import org.eclipse.swt.graphics.Rectangle;
33 import org.eclipse.swt.printing.Printer;
34 import org.eclipse.swt.widgets.Display;
35
36 import de.jaret.util.ui.ResourceImageDescriptor;
37 import de.jaret.util.ui.timebars.TimeBarViewerDelegate;
38 import de.jaret.util.ui.timebars.TimeBarViewerInterface;
39 import de.jaret.util.ui.timebars.model.StdHierarchicalTimeBarModel;
40 import de.jaret.util.ui.timebars.model.TimeBarNode;
41 import de.jaret.util.ui.timebars.model.TimeBarRow;
42 import de.jaret.util.ui.timebars.swt.TimeBarViewer;
43
44
45
46
47
48
49
50
51 public class DefaultHierarchyRenderer extends RendererBase implements HierarchyRenderer {
52
53 protected static final int DEFAULT_SIZE = 12;
54
55
56 protected static final int SYMBOLINSETS = 3;
57
58
59 protected static final int DEFAULT_LEVEL_WIDTH = 16;
60
61
62 protected static final int LABELGAP = 4;
63
64
65 protected int _size = DEFAULT_SIZE;
66
67
68 protected int _signInsets = SYMBOLINSETS;
69
70
71 protected boolean _drawTreeLines = true;
72
73
74 protected int _levelWidth = DEFAULT_LEVEL_WIDTH;
75
76
77 protected boolean _fixedLevelWidth = false;
78
79
80 protected boolean _drawIcons = false;
81
82
83 protected boolean _drawLabels = false;
84
85
86 protected Map<Class<? extends TimeBarRow>, ILabelProvider> _labelProviderMap = new HashMap<Class<? extends TimeBarRow>, ILabelProvider>();
87
88
89 protected static final String PLUS = "plus";
90
91 protected static final String MINUS = "minus";
92
93 protected static final String LEAF = "leaf";
94
95
96 private ImageRegistry _imageRegistry;
97
98
99 protected String _plusRscName;
100
101 protected String _minusRscName;
102
103 protected String _leafRscName;
104
105
106
107
108
109
110 public DefaultHierarchyRenderer(Printer printer) {
111 super(printer);
112 _size = scaleX(DEFAULT_SIZE);
113 _signInsets = scaleX(_signInsets);
114 _levelWidth = scaleX(_levelWidth);
115 }
116
117
118
119
120 public DefaultHierarchyRenderer() {
121 super(null);
122 }
123
124
125
126
127 public void draw(GC gc, Rectangle drawingArea, TimeBarViewerDelegate tbv, TimeBarRow row, boolean selected,
128 boolean expanded, boolean leaf, int level, int depth, boolean printing) {
129
130 int offx;
131 if (!_fixedLevelWidth && depth > 0) {
132 offx = (drawingArea.width - _size) / (depth + 1);
133 } else {
134 offx = scaleX(_levelWidth);
135 }
136
137 int x = drawingArea.x + offx * level + _size / 2;
138
139 int y = drawingArea.y + (drawingArea.height - _size) / 2;
140
141 if (leaf && !_drawIcons) {
142 drawLeafSymbol(gc, _size, x, y);
143 } else if (expanded && !leaf) {
144 drawExpanded(gc, _size, x, y);
145 } else if (!leaf) {
146 drawCollapsed(gc, _size, x, y);
147 }
148 x += _size + LABELGAP;
149
150 ILabelProvider labelProvider = getLabelProvider(row.getClass());
151
152 if (labelProvider != null && (_drawIcons || _drawLabels)) {
153 int labelx = x;
154 if (_drawIcons) {
155 Image img = labelProvider.getImage(row);
156 if (img != null) {
157 if (!printing) {
158 gc.drawImage(img, x, y);
159 labelx += img.getBounds().width;
160 } else {
161 gc.drawImage(img, 0, 0, img.getBounds().width, img.getBounds().height, x, y, scaleX(img
162 .getBounds().width), scaleY(img.getBounds().height));
163 labelx += scaleX(img.getBounds().width);
164 }
165 }
166 }
167 if (_drawLabels) {
168 String label = labelProvider.getText(row);
169 if (label != null) {
170 if (!printing && selected) {
171 Color bg = gc.getBackground();
172 gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
173 gc.drawString(label, labelx, y);
174 gc.setBackground(bg);
175 } else {
176 gc.drawString(label, labelx, y);
177 }
178 }
179 }
180
181 }
182
183
184 if (_drawTreeLines) {
185 TimeBarNode node = (TimeBarNode) row;
186 if (printing) {
187 gc.setLineWidth(getDefaultLineWidth());
188 }
189 gc.setLineStyle(SWT.LINE_DOT);
190 int midy = drawingArea.y + ((drawingArea.height - _size) / 2) + _size / 2;
191 int icoy = drawingArea.y + ((drawingArea.height - _size) / 2) + _size;
192 int icox = drawingArea.x + offx * (level) + _size - _size / 2;
193 int midx = drawingArea.x + +offx * (level) + _size;
194 int beginx = drawingArea.x + offx * (level - 1) + _size;
195
196
197
198 gc.drawLine(beginx, midy, icox, midy);
199
200
201 gc.drawLine(beginx, drawingArea.y, beginx, midy);
202
203
204 if ((!leaf && expanded)) {
205 gc.drawLine(midx, icoy, midx, drawingArea.y + drawingArea.height);
206 }
207
208
209 if (tbv.getModel() instanceof StdHierarchicalTimeBarModel) {
210 StdHierarchicalTimeBarModel model = (StdHierarchicalTimeBarModel) tbv.getModel();
211 for (int i = 0; i < level; i++) {
212 if (model.moreSiblings(node, i)) {
213 x = drawingArea.x + offx * i + _size;
214 gc.drawLine(x, drawingArea.y, x, drawingArea.y + drawingArea.height);
215 }
216 }
217 }
218
219 gc.setLineStyle(SWT.LINE_SOLID);
220 gc.setLineWidth(1);
221 }
222 }
223
224
225
226
227
228
229
230
231
232 protected void drawCollapsed(GC gc, int size, int x, int y) {
233 if (_plusRscName != null) {
234 ImageRegistry registry = getImageRegistry();
235 Image img = registry.get(PLUS);
236 if (img != null) {
237 gc.drawImage(img, 0, 0, img.getBounds().width, img.getBounds().height, x, y, size, size);
238 }
239 } else {
240 drawPlus(gc, size, x, y);
241 }
242 }
243
244
245
246
247
248
249
250
251
252 protected void drawExpanded(GC gc, int size, int x, int y) {
253 if (_minusRscName != null) {
254 ImageRegistry registry = getImageRegistry();
255 Image img = registry.get(MINUS);
256 if (img != null) {
257 gc.drawImage(img, 0, 0, img.getBounds().width, img.getBounds().height, x, y, size, size);
258 }
259 } else {
260 drawMinus(gc, size, x, y);
261 }
262 }
263
264
265
266
267
268
269
270
271
272 protected void drawLeafSymbol(GC gc, int size, int x, int y) {
273 if (_leafRscName != null) {
274 ImageRegistry registry = getImageRegistry();
275 Image img = registry.get(LEAF);
276 if (img != null) {
277 gc.drawImage(img, 0, 0, img.getBounds().width, img.getBounds().height, x, y, size, size);
278 }
279 } else {
280 drawLeaf(gc, size, x, y);
281 }
282 }
283
284
285
286
287
288
289
290
291
292 protected void drawPlus(GC gc, int size, int x, int y) {
293 gc.drawLine(x + _signInsets, y + size / 2, x + size - _signInsets, y + size / 2);
294 gc.drawLine(x + size / 2, y + _signInsets, x + size / 2, y + size - _signInsets);
295 gc.drawRectangle(x, y, size, size);
296 }
297
298
299
300
301
302
303
304
305
306 protected void drawMinus(GC gc, int size, int x, int y) {
307 gc.drawLine(x + _signInsets, y + size / 2, x + size - _signInsets, y + size / 2);
308 gc.drawRectangle(x, y, size, size);
309 }
310
311
312
313
314
315
316
317
318
319 protected void drawLeaf(GC gc, int size, int x, int y) {
320 Color bg = gc.getBackground();
321 gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
322 gc.fillOval(x + size / 2, y + size / 2, size / 2, size / 2);
323 gc.setBackground(bg);
324 }
325
326
327
328
329 public String getToolTipText(TimeBarNode node, Rectangle drawingArea, int x, int y) {
330 if (node != null) {
331 return node.getRowHeader().getLabel();
332 }
333 return null;
334 }
335
336
337
338
339 public boolean isInToggleArea(TimeBarViewerInterface tbv, TimeBarNode node, Rectangle drawingArea, int xx, int yy) {
340 int depth = tbv.getHierarchicalModel().getDepth();
341 int offx;
342 if (!_fixedLevelWidth && depth > 0) {
343 offx = (drawingArea.width - _size) / (depth + 1);
344 } else {
345 offx = scaleX(_levelWidth);
346 }
347 int level = node.getLevel();
348
349 int x = drawingArea.x + offx * level + _size / 2;
350 int y = drawingArea.y + (drawingArea.height - _size) / 2;
351
352 return x <= xx && xx <= x + _size && y <= yy && yy <= y + _size;
353 }
354
355
356
357
358 public boolean isInHierarchySelectionArea(TimeBarViewer tbv, TimeBarNode node, Rectangle drawingArea, int xx, int yy) {
359 int depth = tbv.getHierarchicalModel().getDepth();
360 int offx;
361 if (!_fixedLevelWidth && depth > 0) {
362 offx = (drawingArea.width - _size) / (depth + 1);
363 } else {
364 offx = scaleX(_levelWidth);
365 }
366 int level = node.getLevel();
367
368 int x = drawingArea.x + offx * level + _size / 2;
369 int y = drawingArea.y + (drawingArea.height - _size) / 2;
370
371 x += _size + LABELGAP;
372
373 ILabelProvider labelProvider = getLabelProvider(node.getClass());
374
375 if (labelProvider != null && (_drawIcons || _drawLabels)) {
376 Rectangle selRect = new Rectangle(x, y, 0, 0);
377 if (_drawIcons) {
378 Image img = labelProvider.getImage(node);
379 if (img != null) {
380 selRect.width += img.getBounds().width;
381 selRect.height += img.getBounds().height;
382 }
383 }
384 if (_drawLabels) {
385 String label = labelProvider.getText(node);
386 if (label != null) {
387 selRect.width += drawingArea.width - selRect.x;
388
389
390
391 selRect.height = Math.max(selRect.height, 16);
392
393
394 }
395 }
396 return selRect.contains(xx, yy);
397
398 }
399 return false;
400
401 }
402
403
404
405
406 public int getPreferredWidth() {
407 return scaleX(_size + LABELGAP);
408 }
409
410
411
412
413 public void dispose() {
414 if (_imageRegistry != null) {
415 _imageRegistry.dispose();
416 }
417 }
418
419
420
421
422
423
424 public boolean getFixedLevelWidth() {
425 return _fixedLevelWidth;
426 }
427
428
429
430
431
432
433 public void setFixedLevelWidth(boolean fixedLevelWidth) {
434 _fixedLevelWidth = fixedLevelWidth;
435 }
436
437
438
439
440
441
442 public ILabelProvider getLabelProvider() {
443 return getLabelProvider(TimeBarRow.class);
444 }
445
446
447
448
449
450
451 public void setLabelProvider(ILabelProvider labelProvider) {
452 registerLabelProvider(TimeBarRow.class, labelProvider);
453 }
454
455
456
457
458
459
460
461 public void registerLabelProvider(Class<? extends TimeBarRow> clazz, ILabelProvider labelProvider) {
462 _labelProviderMap.put(clazz, labelProvider);
463 }
464
465
466
467
468
469
470 protected void setLabelProviderMap(Map<Class<? extends TimeBarRow>, ILabelProvider> map) {
471 _labelProviderMap = map;
472 }
473
474
475
476
477
478
479
480 protected ILabelProvider getLabelProvider(Class<? extends TimeBarRow> clazz) {
481 ILabelProvider result = null;
482 result = _labelProviderMap.get(clazz);
483 if (result != null) {
484 return result;
485 }
486
487
488 Class<?>[] interfaces = clazz.getInterfaces();
489 for (Class<?> c : interfaces) {
490 result = _labelProviderMap.get(c);
491 if (result != null) {
492 return result;
493 }
494 }
495
496
497 Class<?> sc = clazz.getSuperclass();
498
499 while (sc != null) {
500 result = _labelProviderMap.get(sc);
501 if (result != null) {
502 return result;
503 }
504
505 Class<?>[] scinterfaces = sc.getInterfaces();
506 for (Class<?> c : scinterfaces) {
507 result = _labelProviderMap.get(c);
508 if (result != null) {
509 return result;
510 }
511 }
512 sc = sc.getSuperclass();
513 }
514
515 return result;
516 }
517
518
519
520
521
522
523 public int getLevelWidth() {
524 return _levelWidth;
525 }
526
527
528
529
530 public void setLevelWidth(int levelWidth) {
531 _levelWidth = levelWidth;
532 }
533
534
535
536
537 public boolean getDrawIcons() {
538 return _drawIcons;
539 }
540
541
542
543
544 public void setDrawIcons(boolean drawIcons) {
545 this._drawIcons = drawIcons;
546 }
547
548
549
550
551 public boolean getDrawLabels() {
552 return _drawLabels;
553 }
554
555
556
557
558 public void setDrawLabels(boolean drawLabels) {
559 this._drawLabels = drawLabels;
560 }
561
562
563
564
565 public HierarchyRenderer createPrintRenderer(Printer printer) {
566 DefaultHierarchyRenderer r = new DefaultHierarchyRenderer(printer);
567 r.setDrawIcons(_drawIcons);
568 r.setDrawLabels(_drawLabels);
569 r.setFixedLevelWidth(_fixedLevelWidth);
570 r.setLevelWidth(_levelWidth);
571 r.setLabelProviderMap(_labelProviderMap);
572 r.setRscNames(_plusRscName, _minusRscName, _leafRscName);
573 return r;
574 }
575
576
577
578
579
580
581
582
583
584
585 public void setRscNames(String plusRscPath, String minusRscPath, String leafRscPath) {
586 if (_imageRegistry != null) {
587 _imageRegistry.dispose();
588 _imageRegistry = null;
589 }
590 _plusRscName = plusRscPath;
591 _minusRscName = minusRscPath;
592 _leafRscName = leafRscPath;
593 }
594
595
596
597
598
599
600
601
602 public void setImageDescriptors(ImageDescriptor plus, ImageDescriptor minus, ImageDescriptor leaf) {
603 if (_imageRegistry != null) {
604 _imageRegistry.dispose();
605 }
606 _imageRegistry = new ImageRegistry();
607 _imageRegistry.put(PLUS, plus);
608 _imageRegistry.put(MINUS, minus);
609 _imageRegistry.put(LEAF, leaf);
610 _plusRscName = "plusRscPath";
611 _minusRscName = "minusRscPath";
612 _leafRscName = "leafRscPath";
613 }
614
615
616
617
618
619
620 private ImageRegistry getImageRegistry() {
621 if (_imageRegistry == null) {
622 _imageRegistry = new ImageRegistry();
623 ImageDescriptor imgDesc = new ResourceImageDescriptor(_plusRscName, this.getClass());
624 _imageRegistry.put(PLUS, imgDesc.createImage());
625 imgDesc = new ResourceImageDescriptor(_minusRscName, this.getClass());
626 _imageRegistry.put(MINUS, imgDesc.createImage());
627 imgDesc = new ResourceImageDescriptor(_leafRscName, this.getClass());
628 _imageRegistry.put(LEAF, imgDesc.createImage());
629 }
630 return _imageRegistry;
631 }
632
633
634
635
636
637
638 public int getSize() {
639 return _size;
640 }
641
642
643
644
645
646
647 public void setSize(int size) {
648 _size = size;
649 }
650
651
652
653
654
655
656 public boolean getDrawTreeLines() {
657 return _drawTreeLines;
658 }
659
660
661
662
663
664
665 public void setDrawTreeLines(boolean drawTreeLines) {
666 _drawTreeLines = drawTreeLines;
667 }
668
669 }