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.swing;
21
22 import java.awt.AlphaComposite;
23 import java.awt.BorderLayout;
24 import java.awt.Color;
25 import java.awt.Component;
26 import java.awt.Cursor;
27 import java.awt.Dimension;
28 import java.awt.Graphics;
29 import java.awt.Graphics2D;
30 import java.awt.Point;
31 import java.awt.Rectangle;
32 import java.awt.event.ComponentEvent;
33 import java.awt.event.ComponentListener;
34 import java.awt.event.MouseEvent;
35 import java.awt.event.MouseListener;
36 import java.awt.event.MouseMotionListener;
37 import java.awt.event.MouseWheelEvent;
38 import java.awt.event.MouseWheelListener;
39 import java.util.ArrayList;
40 import java.util.HashMap;
41 import java.util.List;
42 import java.util.Map;
43
44 import javax.swing.BoundedRangeModel;
45 import javax.swing.JComponent;
46 import javax.swing.JPanel;
47 import javax.swing.JPopupMenu;
48 import javax.swing.JScrollBar;
49 import javax.swing.SwingUtilities;
50 import javax.swing.event.ChangeEvent;
51 import javax.swing.event.ChangeListener;
52
53 import de.jaret.util.date.Interval;
54 import de.jaret.util.date.JaretDate;
55 import de.jaret.util.misc.Pair;
56 import de.jaret.util.ui.timebars.TimeBarIntervalFilter;
57 import de.jaret.util.ui.timebars.TimeBarMarker;
58 import de.jaret.util.ui.timebars.TimeBarRowFilter;
59 import de.jaret.util.ui.timebars.TimeBarRowSorter;
60 import de.jaret.util.ui.timebars.TimeBarViewerDelegate;
61 import de.jaret.util.ui.timebars.TimeBarViewerInterface;
62 import de.jaret.util.ui.timebars.mod.IntervalModificator;
63 import de.jaret.util.ui.timebars.model.FocussedIntervalListener;
64 import de.jaret.util.ui.timebars.model.HierarchicalTimeBarModel;
65 import de.jaret.util.ui.timebars.model.HierarchicalViewState;
66 import de.jaret.util.ui.timebars.model.IIntervalRelation;
67 import de.jaret.util.ui.timebars.model.ISelectionRectListener;
68 import de.jaret.util.ui.timebars.model.ITimeBarChangeListener;
69 import de.jaret.util.ui.timebars.model.ITimeBarViewState;
70 import de.jaret.util.ui.timebars.model.TBRect;
71 import de.jaret.util.ui.timebars.model.TimeBarModel;
72 import de.jaret.util.ui.timebars.model.TimeBarNode;
73 import de.jaret.util.ui.timebars.model.TimeBarRow;
74 import de.jaret.util.ui.timebars.model.TimeBarRowHeader;
75 import de.jaret.util.ui.timebars.model.TimeBarSelectionModel;
76 import de.jaret.util.ui.timebars.strategy.IOverlapStrategy;
77 import de.jaret.util.ui.timebars.strategy.ITickProvider;
78 import de.jaret.util.ui.timebars.strategy.OverlapInfo;
79 import de.jaret.util.ui.timebars.swing.renderer.DefaultGridRenderer;
80 import de.jaret.util.ui.timebars.swing.renderer.DefaultHeaderRenderer;
81 import de.jaret.util.ui.timebars.swing.renderer.DefaultMarkerRenderer;
82 import de.jaret.util.ui.timebars.swing.renderer.DefaultMiscRenderer;
83 import de.jaret.util.ui.timebars.swing.renderer.DefaultTimeBarRenderer;
84 import de.jaret.util.ui.timebars.swing.renderer.DefaultTimeScaleRenderer;
85 import de.jaret.util.ui.timebars.swing.renderer.GridRenderer;
86 import de.jaret.util.ui.timebars.swing.renderer.HeaderRenderer;
87 import de.jaret.util.ui.timebars.swing.renderer.HierarchyRenderer;
88 import de.jaret.util.ui.timebars.swing.renderer.IGlobalAssistantRenderer;
89 import de.jaret.util.ui.timebars.swing.renderer.IMarkerRenderer;
90 import de.jaret.util.ui.timebars.swing.renderer.IMiscRenderer;
91 import de.jaret.util.ui.timebars.swing.renderer.IRelationRenderer;
92 import de.jaret.util.ui.timebars.swing.renderer.ITitleRenderer;
93 import de.jaret.util.ui.timebars.swing.renderer.TimeBarGapRenderer;
94 import de.jaret.util.ui.timebars.swing.renderer.TimeBarRenderer;
95 import de.jaret.util.ui.timebars.swing.renderer.TimeScaleRenderer;
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 @SuppressWarnings("serial")
115 public class TimeBarViewer extends JPanel implements TimeBarViewerInterface, ChangeListener, ComponentListener {
116
117 private static final boolean SHOWPAINTTIME = false;
118
119
120 private static final int PREFHEIGHT = 300;
121
122 private static final int PREFWIDTH = 500;
123
124
125
126
127 protected TimeBarViewerDelegate _delegate;
128
129
130 protected transient TimeScaleRenderer _timeScaleRenderer = new DefaultTimeScaleRenderer();
131
132 protected JComponent _timeScaleRendererComponent;
133
134 protected transient GridRenderer _gridRenderer = new DefaultGridRenderer();
135
136 protected JComponent _gridRendererComponent;
137
138 protected TimeBarGapRenderer _gapRenderer = null;
139
140 protected HeaderRenderer _headerRenderer;
141
142 protected HierarchyRenderer _hierarchyRenderer;
143
144 protected transient IMiscRenderer _miscRenderer = new DefaultMiscRenderer();
145
146 protected transient ITitleRenderer _titleRenderer = null;
147
148 protected transient IRelationRenderer _relationRenderer = null;
149
150 protected transient IMarkerRenderer _markerRenderer = new DefaultMarkerRenderer();
151
152 protected transient IGlobalAssistantRenderer _globalAssistantRenderer;
153
154
155 protected JScrollBar _xScrollBar;
156
157
158 protected JScrollBar _yScrollBar;
159
160
161 public Diagram _diagram;
162
163
164 protected Map<Class<? extends Interval>, TimeBarRenderer> _rendererMap = new HashMap<Class<? extends Interval>, TimeBarRenderer>();
165
166
167 protected Map<Class<? extends Interval>, JPopupMenu> _registeredPopupMenues;
168
169
170 protected JPopupMenu _bodyContextMenu;
171
172 protected JPopupMenu _timeScaleContextMenu;
173
174 protected JPopupMenu _headerContextMenu;
175
176 protected JPopupMenu _hierarchyContextMenu;
177
178 protected JPopupMenu _titleContextMenu;
179
180
181 protected boolean _requiresPopupTriggerCheck;
182
183
184 protected JPanel _horizontalScrollPanel;
185
186 protected JPanel _verticalScrollPanel;
187
188 protected boolean _useTitleRendererComponentInPlace = false;
189
190
191
192
193
194
195
196
197 public TimeBarViewer(TimeBarModel model, boolean suppressXScroll, boolean suppressYScroll) {
198 _delegate = new TimeBarViewerDelegate(this);
199
200 putClientProperty("delegate", _delegate);
201
202 setLayout(new BorderLayout());
203
204 _xScrollBar = new JScrollBar(JScrollBar.HORIZONTAL);
205 BoundedRangeModel brModelX = _xScrollBar.getModel();
206 brModelX.addChangeListener(this);
207 _xScrollBar.setUnitIncrement(1);
208 if (!suppressXScroll) {
209 _horizontalScrollPanel = new JPanel(new BorderLayout());
210 add(_horizontalScrollPanel, BorderLayout.SOUTH);
211 _horizontalScrollPanel.add(_xScrollBar, BorderLayout.CENTER);
212 }
213
214 _yScrollBar = new JScrollBar(JScrollBar.VERTICAL);
215 BoundedRangeModel brModelY = _yScrollBar.getModel();
216 brModelY.addChangeListener(this);
217 _yScrollBar.setUnitIncrement(1);
218 if (!suppressYScroll) {
219 _verticalScrollPanel = new JPanel(new BorderLayout());
220 add(_verticalScrollPanel, BorderLayout.EAST);
221 _verticalScrollPanel.add(_yScrollBar, BorderLayout.CENTER);
222 }
223
224
225 _diagram = new Diagram();
226 _diagram._timeBarViewer = this;
227 add(_diagram, BorderLayout.CENTER);
228
229 this.addComponentListener(this);
230
231 if (model != null) {
232 _delegate.setModel(model);
233 }
234
235 setHeaderRenderer(new DefaultHeaderRenderer());
236
237
238 registerTimeBarRenderer(Interval.class, new DefaultTimeBarRenderer());
239
240
241
242 _gridRenderer.setTickProvider((DefaultTimeScaleRenderer) _timeScaleRenderer);
243
244
245 String osname = System.getProperty("os.name");
246
247 if (osname != null) {
248 _requiresPopupTriggerCheck = osname.startsWith("Mac") || osname.startsWith("Linux");
249 }
250
251 }
252
253
254
255
256
257
258 public TimeBarViewer(TimeBarModel model) {
259 this(model, false, false);
260 }
261
262
263
264
265
266 public TimeBarViewer() {
267 this(null);
268 }
269
270
271
272
273
274
275 public JScrollBar getXScrollBar() {
276 return _xScrollBar;
277 }
278
279
280
281
282
283
284 public JScrollBar getYScrollBar() {
285 return _yScrollBar;
286 }
287
288
289
290
291 public synchronized void addMouseListener(MouseListener l) {
292
293 super.addMouseListener(l);
294 _diagram.addMouseListener(l);
295 }
296
297
298
299
300 public void setModel(TimeBarModel model) {
301 _delegate.setModel(model);
302 }
303
304
305
306
307 public TimeBarModel getModel() {
308 return _delegate.getModel();
309 }
310
311
312
313
314 public void setRowFilter(TimeBarRowFilter rowFilter) {
315 _delegate.setRowFilter(rowFilter);
316 }
317
318
319
320
321 public TimeBarRowFilter getRowFilter() {
322 return _delegate.getRowFilter();
323 }
324
325
326
327
328 public void setRowSorter(TimeBarRowSorter rowSorter) {
329 _delegate.setRowSorter(rowSorter);
330 }
331
332
333
334
335 public TimeBarRowSorter getRowSorter() {
336 return _delegate.getRowSorter();
337 }
338
339
340
341
342 public void setIntervalFilter(TimeBarIntervalFilter intervalFilter) {
343 _delegate.setIntervalFilter(intervalFilter);
344 }
345
346
347
348
349
350
351 public void setTimeBarRenderer(TimeBarRenderer renderer) {
352 registerTimeBarRenderer(Interval.class, renderer);
353 }
354
355
356
357
358
359
360 public TimeBarRenderer getTimeBarRenderer() {
361 return _rendererMap.get(Interval.class);
362 }
363
364
365
366
367
368
369
370
371 public void registerTimeBarRenderer(Class<? extends Interval> intervalClass, TimeBarRenderer renderer) {
372 _rendererMap.put(intervalClass, renderer);
373 repaint();
374 }
375
376
377
378
379
380
381 public Map<Class<? extends Interval>, TimeBarRenderer> getRendererMapping() {
382 return _rendererMap;
383 }
384
385
386
387
388
389
390
391 protected TimeBarRenderer getRenderer(Class<? extends Interval> clazz) {
392 TimeBarRenderer result = null;
393 result = _rendererMap.get(clazz);
394 if (result != null) {
395 return result;
396 }
397
398
399 Class<?>[] interfaces = clazz.getInterfaces();
400 for (Class<?> c : interfaces) {
401 result = _rendererMap.get(c);
402 if (result != null) {
403 return result;
404 }
405 }
406
407
408 Class<?> sc = clazz.getSuperclass();
409
410 while (sc != null) {
411 result = _rendererMap.get(sc);
412 if (result != null) {
413 return result;
414 }
415
416 Class<?>[] scinterfaces = sc.getInterfaces();
417 for (Class<?> c : scinterfaces) {
418 result = _rendererMap.get(c);
419 if (result != null) {
420 return result;
421 }
422 }
423 sc = sc.getSuperclass();
424 }
425
426 return result;
427 }
428
429
430
431
432
433
434 public void setHeaderRenderer(HeaderRenderer renderer) {
435 _headerRenderer = renderer;
436 if (_headerRenderer != null) {
437 _delegate.setYAxisWidth(renderer.getWidth());
438 } else {
439 _delegate.setYAxisWidth(0);
440 }
441 _diagram.safeRepaint();
442 }
443
444
445
446
447
448
449 public void setHierarchyRenderer(HierarchyRenderer renderer) {
450 _hierarchyRenderer = renderer;
451 if (_hierarchyRenderer != null) {
452 _delegate.setHierarchyWidth(renderer.getWidth());
453 } else {
454 _delegate.setHierarchyWidth(0);
455 }
456 _diagram.safeRepaint();
457 }
458
459
460
461
462
463
464
465
466 public void setPixelPerSecond(double pixelPerSecond) {
467 _delegate.setPixelPerSecond(pixelPerSecond);
468 }
469
470
471
472
473 public double getPixelPerSecond() {
474 return _delegate.getPixelPerSecond();
475 }
476
477
478
479
480 public void setRowHeight(int rowHeight) {
481 _delegate.setRowHeight(rowHeight);
482 }
483
484
485
486
487 public int getRowHeight() {
488 return _delegate.getTimeBarViewState().getDefaultRowHeight();
489 }
490
491
492
493
494 public void updateXScrollBar(int max, int pos, int secondsDisplayed) {
495 BoundedRangeModel brModel = _xScrollBar.getModel();
496 if (brModel != null) {
497
498 brModel.removeChangeListener(this);
499 brModel.setMinimum(0);
500 brModel.setMaximum(max);
501 brModel.setExtent(secondsDisplayed);
502 brModel.setValue(pos);
503 brModel.addChangeListener(this);
504 _xScrollBar.setBlockIncrement(secondsDisplayed * 9 / 10);
505 _xScrollBar.setUnitIncrement(secondsDisplayed / 10);
506 }
507 }
508
509
510
511
512 public void updateYScrollBar(int max, int pos, int rowsDisplayed) {
513 BoundedRangeModel brModel = _yScrollBar.getModel();
514
515 brModel.removeChangeListener(this);
516 brModel.setMinimum(0);
517 brModel.setMaximum(max);
518 brModel.setExtent(rowsDisplayed);
519 brModel.setValue(pos);
520 brModel.addChangeListener(this);
521 _yScrollBar.setBlockIncrement(rowsDisplayed * 9 / 10);
522 _yScrollBar.setUnitIncrement(getRowHeight() * 3);
523
524
525 }
526
527
528
529
530
531
532
533 public void stateChanged(ChangeEvent e) {
534 if (e.getSource() == _xScrollBar.getModel()) {
535 BoundedRangeModel brModel = _xScrollBar.getModel();
536 int value = brModel.getValue();
537 _delegate.handleHorizontalScroll(value, true);
538 } else if (e.getSource() == _yScrollBar.getModel()) {
539 BoundedRangeModel brModel = _yScrollBar.getModel();
540 int value = brModel.getValue();
541 _delegate.handleVerticalScroll(value, true);
542
543 } else {
544 throw new RuntimeException("Unknown sender");
545 }
546 }
547
548
549
550
551
552 public void componentHidden(ComponentEvent e) {
553 }
554
555
556
557
558 public void componentMoved(ComponentEvent e) {
559 }
560
561
562
563
564 public void componentResized(ComponentEvent e) {
565
566 _delegate.componentResized();
567 }
568
569
570
571
572 public void componentShown(ComponentEvent e) {
573 }
574
575
576
577
578
579
580
581
582
583
584 protected JComponent getIntervalComponent(TimeBarRow row, Interval interval) {
585 Rectangle intervalRect = _delegate.getIntervalBounds(row, interval);
586
587 return getIntervalComponent(interval, intervalRect);
588 }
589
590
591
592
593
594
595
596
597 protected JComponent getIntervalComponent(Interval interval, Rectangle intervalRect) {
598 boolean overlapping = false;
599 OverlapInfo oi = null;
600 TimeBarRow row = _delegate.getModel().getRowForInterval(interval);
601 if (!_delegate.getTimeBarViewState().getDrawOverlapping(row)) {
602 oi = _delegate.getOverlapStrategy().getOverlapInfo(row, interval);
603 if (oi != null && (oi.maxOverlapping > 0 || _delegate.getUseUniformHeight())) {
604 overlapping = true;
605 }
606 }
607 return getIntervalComponent(interval, intervalRect, overlapping);
608 }
609
610
611
612
613
614
615
616
617
618 protected JComponent getIntervalComponent(Interval interval, Rectangle intervalRect, boolean overlapping) {
619 TimeBarRenderer renderer = getRenderer(interval.getClass());
620 if (renderer == null) {
621 throw new RuntimeException("no suitable renderer registered");
622 }
623
624 JComponent component = renderer.getTimeBarRendererComponent(this, interval, false, overlapping);
625 component.setBounds(intervalRect);
626 return component;
627 }
628
629
630
631
632
633
634
635 private class Diagram extends JComponent implements MouseListener, MouseMotionListener, MouseWheelListener {
636
637 protected TimeBarViewer _timeBarViewer;
638
639
640
641
642 public Diagram() {
643
644
645 setBackground(Color.WHITE);
646 setToolTipText("");
647 addMouseListener(this);
648 addMouseMotionListener(this);
649 addMouseWheelListener(this);
650 }
651
652
653
654
655 public String getToolTipText(MouseEvent event) {
656 int x = event.getX();
657 int y = event.getY();
658 return _delegate.getToolTipText(x, y);
659 }
660
661
662
663
664 public void safeRepaint() {
665 Runnable doRepaint = new Runnable() {
666 public void run() {
667 repaint();
668 }
669 };
670 SwingUtilities.invokeLater(doRepaint);
671 }
672
673
674
675
676
677 public void paintComponent(Graphics g) {
678 long time = System.currentTimeMillis();
679 long nanoTime = System.nanoTime();
680
681
682 _delegate.preparePaint(getWidth(), getHeight());
683
684 g.setColor(Color.WHITE);
685 g.fillRect(g.getClipBounds().x, g.getClipBounds().y, g.getClipBounds().width, g.getClipBounds().height);
686 g.setColor(Color.BLACK);
687
688
689 if (_delegate.getTimeScalePosition() != TIMESCALE_POSITION_NONE) {
690 drawXAxis(g);
691 }
692 drawGrid(g);
693
694
695 if (_globalAssistantRenderer != null) {
696 _globalAssistantRenderer.doRenderingBeforeIntervals(_delegate, g);
697 }
698
699
700 drawRows(g);
701
702 drawMarkers(g);
703
704
705 Rectangle clipSave = g.getClipBounds();
706 g.setClip(clipSave.intersection(_delegate.getDiagramRect()));
707 drawSelectionRect(g);
708 g.setClip(clipSave);
709
710
711 clipSave = g.getClipBounds();
712 g.setClip(clipSave.intersection(_delegate.getDiagramRect()));
713 _miscRenderer.renderRegionRect(g, this._timeBarViewer, _delegate);
714 g.setClip(clipSave);
715
716
717 if (_titleRenderer != null) {
718 JComponent titleComponent = _titleRenderer.getTitleRendererComponent(this._timeBarViewer);
719 if (!_useTitleRendererComponentInPlace) {
720 titleComponent.setBounds(_delegate.getTitleRect());
721 titleComponent.paint(g);
722 } else {
723 boolean added = false;
724 if (titleComponent.getParent() == null) {
725 add(titleComponent);
726 added = true;
727 }
728 titleComponent.setBounds(_delegate.getTitleRect());
729 titleComponent.doLayout();
730
731 if (added)
732 titleComponent.paintAll(g);
733 }
734 }
735
736
737 if (_globalAssistantRenderer != null) {
738 _globalAssistantRenderer.doRenderingLast(_delegate, g);
739 }
740
741
742 if (SHOWPAINTTIME) {
743 System.out.println(_delegate.getName() + " : paintTime " + (System.currentTimeMillis() - time) + " ms "
744 + (System.nanoTime() - nanoTime) + " ns");
745 }
746 }
747
748
749
750
751
752
753 private void drawSelectionRect(Graphics g) {
754 if (_delegate.getSelectionRect() != null) {
755
756 _delegate.setLastSelRect(normalizeRectangle(_delegate.getSelectionRect()));
757 Rectangle lastSelRect = _delegate.getLastSelRect();
758 _miscRenderer.renderSelectionRect(g, this._timeBarViewer, lastSelRect);
759 }
760
761 }
762
763
764
765
766
767
768
769 private Rectangle normalizeRectangle(Rectangle rect) {
770 int x = Math.min(rect.x, rect.x + rect.width);
771 int y = Math.min(rect.y, rect.y + rect.height);
772 int width = Math.abs(rect.width);
773 int height = Math.abs(rect.height);
774 return new Rectangle(x, y, width, height);
775 }
776
777
778
779
780
781
782 private void drawMarkers(Graphics g) {
783 if (_delegate.getMarkers() != null) {
784 for (TimeBarMarker marker : _delegate.getMarkers()) {
785 if (_delegate.isDisplayed(marker.getDate())) {
786 drawMarker(g, marker);
787 }
788 }
789 }
790 }
791
792
793
794
795
796
797
798 private void drawMarker(Graphics g, TimeBarMarker marker) {
799 if (_markerRenderer != null) {
800 int x = _delegate.xForDate(marker.getDate());
801 boolean dragged = _delegate.getDraggedMarker() == marker;
802 _markerRenderer.renderMarker(_delegate, g, marker, x, dragged);
803 }
804 }
805
806
807
808
809
810
811 private void drawXAxis(Graphics g) {
812 if (_timeScaleRenderer != null) {
813 _timeScaleRendererComponent = _timeScaleRenderer.getRendererComponent(_timeBarViewer, _delegate
814
815 .getTimeScalePosition() == TimeBarViewerInterface.TIMESCALE_POSITION_TOP);
816 _timeScaleRendererComponent.setBounds(_delegate.getXAxisRect());
817 Graphics gg = g.create(_delegate.getXAxisRect().x, _delegate.getXAxisRect().y,
818 _delegate.getXAxisRect().width, _delegate.getXAxisRect().height);
819 _timeScaleRendererComponent.paint(gg);
820 gg.dispose();
821 }
822 }
823
824
825
826
827
828
829 private void drawGrid(Graphics g) {
830 if (_gridRenderer != null) {
831 _gridRendererComponent = _gridRenderer.getRendererComponent(_timeBarViewer);
832 _gridRendererComponent.setBounds(_delegate.getDiagramRect());
833 Graphics gg = g.create(_delegate.getDiagramRect().x, _delegate.getDiagramRect().y,
834 _delegate.getDiagramRect().width, _delegate.getDiagramRect().height);
835 _gridRendererComponent.paint(gg);
836 gg.dispose();
837 }
838 }
839
840
841
842
843
844
845 private void drawRows(Graphics g) {
846 if (_delegate.getOrientation() == Orientation.HORIZONTAL) {
847 drawRowsHorizontal(g);
848 } else {
849 drawRowsVertical(g);
850 }
851
852 if (_relationRenderer != null) {
853 _relationRenderer.renderRelations(_delegate, g);
854 }
855 drawGhostIntervals(g);
856 }
857
858
859
860
861
862
863 private void drawRowsHorizontal(Graphics g) {
864 g.setColor(Color.BLACK);
865
866
867 Rectangle clipSave = g.getClipBounds();
868
869 Rectangle newClip = new Rectangle(0, _delegate.getDiagramRect().y, getWidth(), _delegate.getDiagramRect().height).intersection(g.getClipBounds());
870 g.setClip(newClip);
871
872
873
874
875
876
877 g.drawLine(_delegate.getDiagramRect().x - 1, 0, _delegate.getDiagramRect().x - 1, getHeight());
878 g.drawLine(_delegate.getHierarchyRect().x + _delegate.getHierarchyWidth() - 1, 0,
879 _delegate.getHierarchyRect().x + _delegate.getHierarchyWidth() - 1, getHeight());
880
881 int upperYBound = _delegate.getDiagramRect().y;
882 int lowerYBound = upperYBound + _delegate.getDiagramRect().height;
883 if (g.getClipBounds() != null) {
884 upperYBound = g.getClipBounds().y;
885 lowerYBound = upperYBound + g.getClipBounds().height;
886 }
887 for (int r = _delegate.getFirstRow(); r <= _delegate.getFirstRow() + _delegate.getRowsDisplayed()
888 && r < _delegate.getRowCount(); r++) {
889 TimeBarRow row = _delegate.getRow(r);
890 int rowHeight = _delegate.getTimeBarViewState().getRowHeight(row);
891
892
893 int y = _delegate.yForRow(row);
894 if (y + rowHeight < 0) {
895
896 continue;
897 }
898
899
900
901
902
903 if ((y >= upperYBound && y <= lowerYBound)
904 || (y + rowHeight >= upperYBound && y + rowHeight <= lowerYBound)
905 || (upperYBound > y && upperYBound < y + rowHeight)) {
906 drawRow(g, y, rowHeight, _delegate.getRow(r),
907 _delegate.getSelectionModel().isSelected(_delegate.getRow(r)));
908
909 if (_gapRenderer != null) {
910 drawRowGaps(g, y, rowHeight, _delegate.getRow(r),
911 _delegate.getSelectionModel().isSelected(_delegate.getRow(r)));
912 }
913 }
914 if (y + rowHeight > lowerYBound) {
915
916 break;
917 }
918 }
919 g.setClip(clipSave);
920 }
921
922
923
924
925
926
927 private void drawRowsVertical(Graphics g) {
928 g.setColor(Color.BLACK);
929
930
931 Rectangle clipSave = g.getClipBounds();
932
933 Rectangle newClip = new Rectangle(0, _delegate.getDiagramRect().y, getWidth(), _delegate.getDiagramRect().height).intersection(g.getClipBounds());
934 g.setClip(newClip);
935
936
937
938
939 g.drawLine(0, _delegate.getDiagramRect().y - 1, getWidth(), _delegate.getDiagramRect().y - 1);
940 g.drawLine(0, _delegate.getHierarchyRect().y + _delegate.getHierarchyWidth() - 1, getWidth(),
941 _delegate.getHierarchyRect().y + _delegate.getHierarchyWidth() - 1);
942
943 int leftXBound = _delegate.getDiagramRect().x;
944 int rightXBound = leftXBound + _delegate.getDiagramRect().width;
945 if (g.getClipBounds() != null) {
946 leftXBound = g.getClipBounds().x;
947 rightXBound = leftXBound + g.getClipBounds().width;
948 }
949
950 for (int r = _delegate.getFirstRow(); r <= _delegate.getFirstRow() + _delegate.getRowsDisplayed()
951 && r < _delegate.getRowCount(); r++) {
952 TimeBarRow row = _delegate.getRow(r);
953 int rowWidth = _delegate.getTimeBarViewState().getRowHeight(row);
954
955
956
957 int x = _delegate.yForRow(row);
958 if (x + rowWidth < 0) {
959
960 continue;
961 }
962
963
964
965
966
967 if ((x >= leftXBound && x <= rightXBound)
968 || (x + rowWidth >= leftXBound && x + rowWidth <= rightXBound)
969 || (leftXBound > x && leftXBound < x + rowWidth)) {
970 drawRowVertical(g, x, rowWidth, _delegate.getRow(r),
971 _delegate.getSelectionModel().isSelected(_delegate.getRow(r)));
972
973 if (_gapRenderer != null) {
974 drawRowGapsVertical(g, x, rowWidth, _delegate.getRow(r), _delegate.getSelectionModel()
975 .isSelected(_delegate.getRow(r)));
976 }
977 }
978 if (x + rowWidth > rightXBound) {
979
980 break;
981 }
982 }
983 g.setClip(clipSave);
984 }
985
986
987
988
989
990
991
992
993
994
995 private void drawRow(Graphics g, int y, int height, TimeBarRow row, boolean selected) {
996
997 drawRowHeader(g, y, height, row.getRowHeader(), selected);
998
999 drawHierarchy(g, y, height, row, selected);
1000
1001 Rectangle diagramRect = _delegate.getDiagramRect();
1002 if (_delegate.getDrawRowGrid()) {
1003 _miscRenderer.drawRowGridLine(g, diagramRect.x, y + height - 1, diagramRect.x + diagramRect.width, y
1004 + height - 1);
1005 }
1006
1007
1008
1009 if (selected || _delegate.getHighlightedRow() == row) {
1010 boolean highlighted = _delegate.getHighlightedRow() == row;
1011 int markerHeight = height;
1012
1013 if (y + markerHeight > diagramRect.y + diagramRect.height) {
1014 markerHeight = markerHeight - (y + markerHeight - (diagramRect.y + diagramRect.height));
1015 }
1016 _miscRenderer.drawRowBackground(g, diagramRect.x, y,
1017 getWidth() - _delegate.getYAxisWidth() - _delegate.getHierarchyWidth(), markerHeight, selected,
1018 highlighted);
1019
1020 }
1021
1022
1023 JaretDate start = _delegate.getStartDate();
1024 JaretDate end = _delegate.getEndDate();
1025 if (g.getClipBounds() != null) {
1026 start = _delegate.dateForCoord(g.getClipBounds().x);
1027 end = _delegate.dateForCoord(g.getClipBounds().x + g.getClipBounds().width);
1028 }
1029
1030 List<Interval> intervals = row.getIntervals(start, end);
1031 for (Interval i : intervals) {
1032
1033 if (_delegate.getIntervalFilter() == null || _delegate.getIntervalFilter().isInResult(i)) {
1034 if (_delegate.getTimeBarViewState().getDrawOverlapping(row)) {
1035 drawInterval(g, y, height, i, _delegate.getSelectionModel().isSelected(i), null, row);
1036 } else {
1037 drawInterval(g, y, height, i, _delegate.getSelectionModel().isSelected(i), _delegate
1038 .getOverlapStrategy().getOverlapInfo(row, i), row);
1039 }
1040 }
1041 }
1042 }
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053 private void drawRowVertical(Graphics g, int x, int width, TimeBarRow row, boolean selected) {
1054
1055 drawRowHeaderVertical(g, x, width, row.getRowHeader(), selected);
1056
1057 drawHierarchyVertical(g, x, width, row, selected);
1058
1059 Rectangle diagramRect = _delegate.getDiagramRect();
1060 if (_delegate.getDrawRowGrid()) {
1061 _miscRenderer.drawRowGridLine(g, x + width - 1, diagramRect.y, x + width - 1, diagramRect.y
1062 + diagramRect.height);
1063 }
1064
1065
1066
1067 if (selected || _delegate.getHighlightedRow() == row) {
1068 boolean highlighted = _delegate.getHighlightedRow() == row;
1069 int markerWidth = width;
1070
1071 if (x + markerWidth > diagramRect.x + diagramRect.width) {
1072 markerWidth = markerWidth - (x + markerWidth - (diagramRect.x + diagramRect.width));
1073 }
1074 _miscRenderer.drawRowBackground(g, x, diagramRect.y, markerWidth,
1075 getHeight() - _delegate.getYAxisWidth() - _delegate.getHierarchyWidth(), selected, highlighted);
1076 }
1077
1078
1079 JaretDate start = _delegate.getStartDate();
1080 JaretDate end = _delegate.getEndDate();
1081 if (g.getClipBounds() != null) {
1082 start = _delegate.dateForCoord(g.getClipBounds().y);
1083 end = _delegate.dateForCoord(g.getClipBounds().y + g.getClipBounds().height);
1084 }
1085 List<Interval> intervals = row.getIntervals(start, end);
1086 for (Interval i : intervals) {
1087
1088 if (_delegate.getIntervalFilter() == null || _delegate.getIntervalFilter().isInResult(i)) {
1089 if (_delegate.getTimeBarViewState().getDrawOverlapping(row)) {
1090 drawIntervalVertical(g, x, width, i, _delegate.getSelectionModel().isSelected(i), null, row);
1091 } else {
1092 drawIntervalVertical(g, x, width, i, _delegate.getSelectionModel().isSelected(i), _delegate
1093 .getOverlapStrategy().getOverlapInfo(row, i), row);
1094 }
1095 }
1096 }
1097 }
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109 private void drawRowGaps(Graphics g, int y, int height, TimeBarRow row, boolean selected) {
1110
1111
1112 JaretDate start = _delegate.getStartDate();
1113 JaretDate end = _delegate.getEndDate();
1114 if (g.getClipBounds() != null) {
1115 start = _delegate.dateForCoord(g.getClipBounds().x);
1116 end = _delegate.dateForCoord(g.getClipBounds().x + g.getClipBounds().width);
1117 }
1118
1119
1120
1121
1122
1123 List<Interval> intervals = new ArrayList<Interval>();
1124 Interval firstInterval = null;
1125 for (Interval interval : row.getIntervals()) {
1126 if (_delegate.getIntervalFilter() == null || _delegate.getIntervalFilter().isInResult(interval)) {
1127 if (interval.getEnd().compareTo(start) < 0) {
1128
1129
1130 if (firstInterval == null
1131 || start.diffSeconds(interval.getEnd()) < start.diffSeconds(firstInterval.getEnd())) {
1132 firstInterval = interval;
1133 }
1134 } else if (interval.contains(start)) {
1135
1136 firstInterval = interval;
1137 } else {
1138
1139
1140
1141
1142
1143 if (firstInterval != null) {
1144 intervals.add(firstInterval);
1145 firstInterval = null;
1146
1147
1148
1149 }
1150 if (interval.contains(end)) {
1151
1152 intervals.add(interval);
1153 break;
1154 }
1155 if (interval.getBegin().compareTo(end) > 0) {
1156 intervals.add(interval);
1157 break;
1158
1159
1160 } else {
1161
1162 intervals.add(interval);
1163 }
1164 }
1165 }
1166 }
1167 Interval lastInterval = null;
1168 for (Interval i : intervals) {
1169
1170 if (lastInterval != null) {
1171 drawGap(g, row, y, height, lastInterval, i);
1172 }
1173
1174 lastInterval = i;
1175 }
1176 }
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188 private void drawRowGapsVertical(Graphics g, int x, int width, TimeBarRow row, boolean selected) {
1189
1190
1191 JaretDate start = _delegate.getStartDate();
1192 JaretDate end = _delegate.getEndDate();
1193 if (g.getClipBounds() != null) {
1194 start = _delegate.dateForCoord(g.getClipBounds().y);
1195 end = _delegate.dateForCoord(g.getClipBounds().y + g.getClipBounds().height);
1196 }
1197
1198
1199
1200
1201
1202 List<Interval> intervals = new ArrayList<Interval>();
1203 Interval firstInterval = null;
1204 for (Interval interval : row.getIntervals()) {
1205 if (_delegate.getIntervalFilter() == null || _delegate.getIntervalFilter().isInResult(interval)) {
1206 if (interval.getEnd().compareTo(start) < 0) {
1207
1208
1209 if (firstInterval == null
1210 || start.diffSeconds(interval.getEnd()) < start.diffSeconds(firstInterval.getEnd())) {
1211 firstInterval = interval;
1212 }
1213 } else if (interval.contains(start)) {
1214
1215 firstInterval = interval;
1216 } else {
1217
1218
1219
1220
1221
1222 if (firstInterval != null) {
1223 intervals.add(firstInterval);
1224 firstInterval = null;
1225
1226
1227
1228 }
1229 if (interval.contains(end)) {
1230
1231 intervals.add(interval);
1232 break;
1233 }
1234 if (interval.getBegin().compareTo(end) > 0) {
1235 intervals.add(interval);
1236 break;
1237
1238
1239 } else {
1240
1241 intervals.add(interval);
1242 }
1243 }
1244 }
1245 }
1246 Interval lastInterval = null;
1247 for (Interval i : intervals) {
1248
1249 if (lastInterval != null) {
1250 drawGapVertical(g, row, x, width, lastInterval, i);
1251 }
1252
1253 lastInterval = i;
1254 }
1255 }
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268 private void drawInterval(Graphics g, int y, int height, Interval i, boolean selected, OverlapInfo oiInfo,
1269 TimeBarRow row) {
1270 TimeBarRenderer renderer = getRenderer(i.getClass());
1271
1272
1273 if (renderer == null) {
1274 throw new RuntimeException("no suitable renderer registered for " + i.getClass().getName());
1275 }
1276
1277 boolean overlapping = oiInfo != null && oiInfo.maxOverlapping > 0;
1278
1279
1280 if (oiInfo != null) {
1281 float exactHeight;
1282
1283 if (!_delegate.getUseUniformHeight()) {
1284 exactHeight = 1.0f * _delegate.getTimeBarViewState().getRowHeight(row)
1285 / (oiInfo.maxOverlapping + 1);
1286 } else {
1287 exactHeight = 1.0f * _delegate.getTimeBarViewState().getRowHeight(row)
1288 / (_delegate.getOverlapStrategy().getMaxOverlapCount(row));
1289 }
1290 int yOffset = (int)(oiInfo.pos * exactHeight);
1291 y += yOffset;
1292 height = (int)((oiInfo.pos + 1) * exactHeight) - yOffset;
1293 }
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308 Component component = renderer.getTimeBarRendererComponent(_timeBarViewer, i, selected, overlapping);
1309 int x = _delegate.xForDate(i.getBegin());
1310 int width = _delegate.xForDate(i.getEnd()) - x;
1311
1312
1313 Rectangle intervalDrawingArea = new Rectangle(x, y, width, height);
1314 Rectangle drawingArea = renderer.getPreferredDrawingBounds(intervalDrawingArea, _delegate, i, selected,
1315 overlapping);
1316 x = drawingArea.x;
1317 width = drawingArea.width;
1318 y = drawingArea.y;
1319 height = drawingArea.height;
1320
1321 component.setBounds(x, y, width, height);
1322 Graphics gg = g.create(x, y, width, height);
1323 Rectangle ggClip = gg.getClipBounds();
1324
1325
1326 Rectangle diagramRect = _delegate.getDiagramRect();
1327 if (y + height > diagramRect.y + diagramRect.height) {
1328 height = height - (y + height - (diagramRect.y + diagramRect.height));
1329 }
1330 int upperClipBound = 0;
1331 if (y < diagramRect.y) {
1332 upperClipBound = diagramRect.y - y;
1333 }
1334
1335 if (x + width > diagramRect.x + diagramRect.width) {
1336 width = width - (x + width - (diagramRect.x + diagramRect.width));
1337 }
1338
1339 int clipX = x < diagramRect.x ? diagramRect.x - x : 0;
1340 int clipWidth = x < diagramRect.x ? Math.max(0, width - (diagramRect.x - x)) : width;
1341
1342 Rectangle newClip = new Rectangle(clipX, upperClipBound, clipWidth, height).intersection(ggClip);
1343 gg.setClip(newClip);
1344
1345 component.paint(gg);
1346 gg.dispose();
1347 }
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360 private void drawIntervalVertical(Graphics g, int x, int width, Interval i, boolean selected,
1361 OverlapInfo oiInfo, TimeBarRow row) {
1362 TimeBarRenderer renderer = getRenderer(i.getClass());
1363 if (renderer == null) {
1364 throw new RuntimeException("no suitable renderer registered");
1365 }
1366
1367 boolean overlapping = oiInfo != null && oiInfo.maxOverlapping > 0;
1368
1369 if (oiInfo != null) {
1370
1371 if (!_delegate.getUseUniformHeight()) {
1372 width = _delegate.getTimeBarViewState().getRowHeight(row) / (oiInfo.maxOverlapping + 1);
1373 } else {
1374 width = _delegate.getTimeBarViewState().getRowHeight(row)
1375 / (_delegate.getOverlapStrategy().getMaxOverlapCount(row));
1376 }
1377 x = x + oiInfo.pos * width;
1378 }
1379
1380 Component component = renderer.getTimeBarRendererComponent(_timeBarViewer, i, selected, overlapping);
1381 int y = _delegate.xForDate(i.getBegin());
1382 int height = _delegate.xForDate(i.getEnd()) - y;
1383
1384
1385 Rectangle intervalDrawingArea = new Rectangle(x, y, width, height);
1386 Rectangle drawingArea = renderer.getPreferredDrawingBounds(intervalDrawingArea, _delegate, i, selected,
1387 overlapping);
1388 x = drawingArea.x;
1389 width = drawingArea.width;
1390 y = drawingArea.y;
1391 height = drawingArea.height;
1392
1393 component.setBounds(x, y, width, height);
1394 Graphics gg = g.create(x, y, width, height);
1395 Rectangle ggClip = gg.getClipBounds();
1396
1397 Rectangle diagramRect = _delegate.getDiagramRect();
1398 if (x + width > diagramRect.x + diagramRect.width) {
1399 width = width - (x + width - (diagramRect.x + diagramRect.width));
1400 }
1401 int upperClipBound = 0;
1402 if (x < diagramRect.x) {
1403 upperClipBound = diagramRect.x - x;
1404 }
1405
1406
1407 if (y + height > diagramRect.y + diagramRect.height) {
1408 height = height - (y + height - (diagramRect.y + diagramRect.height));
1409 }
1410
1411
1412 int clipY = y < diagramRect.y ? diagramRect.y - y : 0;
1413 int clipHeight = y < diagramRect.y ? Math.max(0, height - (diagramRect.y - y)) : height;
1414
1415 Rectangle newClip = new Rectangle(upperClipBound, clipY, width, clipHeight).intersection(ggClip);
1416 gg.setClip(newClip);
1417
1418 component.paint(gg);
1419 gg.dispose();
1420 }
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432 private void drawGap(Graphics g, TimeBarRow row, int y, int height, Interval i1, Interval i2) {
1433 Component component = _gapRenderer.getTimeBarGapRendererComponent(_timeBarViewer, row, i1, i2);
1434 int x = _delegate.xForDate(i1.getEnd());
1435 int width = _delegate.xForDate(i2.getBegin()) - x;
1436
1437 if (_gapRenderer.getMinimumWidth() > 0) {
1438 if (width < _gapRenderer.getMinimumWidth()) {
1439 int diff = _gapRenderer.getMinimumWidth() - width;
1440 width += diff;
1441 x -= diff / 2;
1442 }
1443 }
1444
1445 component.setBounds(x, y, width, height);
1446 Graphics gg = g.create(x, y, width, height);
1447
1448 Rectangle diagramRect = _delegate.getDiagramRect();
1449 if (y + height > diagramRect.y + diagramRect.height) {
1450 height = height - (y + height - (diagramRect.y + diagramRect.height));
1451 }
1452 int upperClipBound = 0;
1453 if (y < diagramRect.y) {
1454 upperClipBound = diagramRect.y - y;
1455 }
1456
1457
1458 gg.setClip(x < diagramRect.x ? diagramRect.x - x : 0, upperClipBound, width, height);
1459 component.paint(gg);
1460 gg.dispose();
1461 }
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473 private void drawGapVertical(Graphics g, TimeBarRow row, int x, int width, Interval i1, Interval i2) {
1474 Component component = _gapRenderer.getTimeBarGapRendererComponent(_timeBarViewer, row, i1, i2);
1475 int y = _delegate.xForDate(i1.getEnd());
1476 int height = _delegate.xForDate(i2.getBegin()) - y;
1477
1478 if (_gapRenderer.getMinimumWidth() > 0) {
1479 if (height < _gapRenderer.getMinimumWidth()) {
1480 int diff = _gapRenderer.getMinimumWidth() - height;
1481 height += diff;
1482 y -= diff / 2;
1483 }
1484 }
1485
1486 component.setBounds(x, y, width, height);
1487 Graphics gg = g.create(x, y, width, height);
1488
1489 Rectangle diagramRect = _delegate.getDiagramRect();
1490 if (x + width > diagramRect.x + diagramRect.width) {
1491 width = width - (x + width - (diagramRect.x + diagramRect.width));
1492 }
1493 int upperClipBound = 0;
1494 if (x < diagramRect.x) {
1495 upperClipBound = diagramRect.x - x;
1496 }
1497
1498
1499 gg.setClip(upperClipBound, y < diagramRect.y ? diagramRect.y - y : 0, width, height);
1500 component.paint(gg);
1501 gg.dispose();
1502 }
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514 private void drawRowHeader(Graphics g, int y, int height, TimeBarRowHeader header, boolean selected) {
1515
1516 if (_headerRenderer != null && _delegate.getYAxisWidth() > 0) {
1517 JComponent component = _headerRenderer.getHeaderRendererComponent(_timeBarViewer, header, selected);
1518 int x = _delegate.getYAxisRect().x;
1519 int width = _delegate.getYAxisWidth() - 1;
1520 Rectangle diagramRect = _delegate.getDiagramRect();
1521 Graphics gg;
1522 int prefHeight = component.getPreferredSize().height;
1523 if (prefHeight < height) {
1524 int hCor = (height - prefHeight) / 2;
1525 gg = g.create(x, y + hCor, width, prefHeight);
1526 component.setBounds(x, y + hCor, width, prefHeight);
1527 int upperClipBound = 0;
1528 if (y + hCor < diagramRect.y) {
1529 upperClipBound = diagramRect.y - y - hCor;
1530 }
1531 if (y + hCor + height > diagramRect.y + diagramRect.height) {
1532 prefHeight = prefHeight - (y + hCor + prefHeight - (diagramRect.y + diagramRect.height));
1533 }
1534
1535 Rectangle clipSave = gg.getClipBounds();
1536 Rectangle newClip = new Rectangle(0, upperClipBound, width, prefHeight).intersection(clipSave);
1537 gg.setClip(newClip);
1538 } else {
1539 gg = g.create(x, y, width, height);
1540 component.setBounds(x, y, width, height);
1541 int upperClipBound = 0;
1542 if (y < diagramRect.y) {
1543 upperClipBound = diagramRect.y - y;
1544 }
1545
1546 if (y + height > diagramRect.y + diagramRect.height) {
1547 height = height - (y + height - (diagramRect.y + diagramRect.height));
1548 }
1549
1550 Rectangle clipSave = gg.getClipBounds();
1551 Rectangle newClip = new Rectangle(x, upperClipBound, width, height).intersection(clipSave);
1552 gg.setClip(newClip);
1553 }
1554 component.paint(gg);
1555 gg.dispose();
1556 }
1557 }
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569 private void drawRowHeaderVertical(Graphics g, int x, int width, TimeBarRowHeader header, boolean selected) {
1570
1571 if (_headerRenderer != null && _delegate.getYAxisWidth() > 0) {
1572 JComponent component = _headerRenderer.getHeaderRendererComponent(_timeBarViewer, header, selected);
1573 int y = _delegate.getYAxisRect().y;
1574 int height = _delegate.getYAxisWidth() - 1;
1575 Rectangle diagramRect = _delegate.getDiagramRect();
1576 Graphics gg;
1577 int prefWidth = component.getPreferredSize().width;
1578 if (prefWidth < width) {
1579 int wCor = (width - prefWidth) / 2;
1580 gg = g.create(x + wCor, y, prefWidth, height);
1581 component.setBounds(x + wCor, y, prefWidth, height);
1582 int upperClipBound = 0;
1583 if (x + wCor < diagramRect.x) {
1584 upperClipBound = diagramRect.x - x - wCor;
1585 }
1586 if (x + wCor + width > diagramRect.x + diagramRect.width) {
1587 prefWidth = prefWidth - (x + wCor + prefWidth - (diagramRect.x + diagramRect.width));
1588 }
1589
1590 Rectangle clipSave = gg.getClipBounds();
1591 Rectangle newClip = new Rectangle(upperClipBound, 0, prefWidth, height).intersection(clipSave);
1592 gg.setClip(newClip);
1593 } else {
1594 gg = g.create(x, y, width, height);
1595 component.setBounds(x, y, width, height);
1596 int upperClipBound = 0;
1597 if (x < diagramRect.x) {
1598 upperClipBound = diagramRect.x - x;
1599 }
1600
1601 if (x + width > diagramRect.x + diagramRect.width) {
1602 width = width - (x + width - (diagramRect.x + diagramRect.width));
1603 }
1604
1605 Rectangle clipSave = gg.getClipBounds();
1606 Rectangle newClip = new Rectangle(upperClipBound, 0, width, height).intersection(clipSave);
1607 gg.setClip(newClip);
1608 }
1609 component.paint(gg);
1610 gg.dispose();
1611 }
1612 }
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623 private void drawHierarchy(Graphics g, int y, int height, TimeBarRow row, boolean selected) {
1624
1625 if (_hierarchyRenderer != null && _delegate.getHierarchyWidth() > 0) {
1626 int level = 0;
1627 int depth = 0;
1628 boolean expanded = false;
1629 boolean leaf = true;
1630 if (row instanceof TimeBarNode) {
1631 TimeBarNode node = (TimeBarNode) row;
1632 if (_delegate.getHierarchicalViewState().isExpanded(node)) {
1633 expanded = true;
1634 }
1635 leaf = node.getChildren().size() == 0;
1636 level = node.getLevel();
1637 depth = _delegate.getHierarchicalModel().getDepth();
1638 }
1639
1640 int x = _delegate.getHierarchyRect().x;
1641 int width = _delegate.getHierarchyWidth() - 1;
1642
1643 JComponent component = _hierarchyRenderer.getHierarchyRendererComponent(_timeBarViewer, row, selected,
1644 expanded, leaf, level, depth);
1645 Rectangle diagramRect = _delegate.getDiagramRect();
1646 Graphics gg;
1647
1648 gg = g.create(x, y, width, height);
1649 component.setBounds(x, y, width, height);
1650 if (y + height > diagramRect.y + diagramRect.height) {
1651 height = height - (y + height - (diagramRect.y + diagramRect.height));
1652 }
1653 int upperClipBound = 0;
1654 if (y < diagramRect.y) {
1655 upperClipBound = diagramRect.y - y;
1656 }
1657
1658 Rectangle clipSave = gg.getClipBounds();
1659 Rectangle newClip = new Rectangle(x, upperClipBound, width, height).intersection(clipSave);
1660 gg.setClip(newClip);
1661
1662 component.paint(gg);
1663 gg.dispose();
1664 }
1665
1666 }
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677 private void drawHierarchyVertical(Graphics g, int x, int width, TimeBarRow row, boolean selected) {
1678
1679 if (_hierarchyRenderer != null && _delegate.getHierarchyWidth() > 0) {
1680 int level = 0;
1681 int depth = 0;
1682 boolean expanded = false;
1683 boolean leaf = true;
1684 if (row instanceof TimeBarNode) {
1685 TimeBarNode node = (TimeBarNode) row;
1686 if (_delegate.getHierarchicalViewState().isExpanded(node)) {
1687 expanded = true;
1688 }
1689 leaf = node.getChildren().size() == 0;
1690 level = node.getLevel();
1691 depth = _delegate.getHierarchicalModel().getDepth();
1692 }
1693
1694 int y = _delegate.getHierarchyRect().y;
1695 int height = _delegate.getHierarchyWidth() - 1;
1696
1697 JComponent component = _hierarchyRenderer.getHierarchyRendererComponent(_timeBarViewer, row, selected,
1698 expanded, leaf, level, depth);
1699 Rectangle diagramRect = _delegate.getDiagramRect();
1700 Graphics gg;
1701
1702 gg = g.create(x, y, width, height);
1703 component.setBounds(x, y, width, height);
1704
1705 if (x + width > diagramRect.x + diagramRect.width) {
1706 width = width - (x + width - (diagramRect.x + diagramRect.width));
1707 }
1708 int upperClipBound = 0;
1709 if (x < diagramRect.x) {
1710 upperClipBound = diagramRect.x - x;
1711 }
1712
1713 Rectangle clipSave = gg.getClipBounds();
1714 Rectangle newClip = new Rectangle(upperClipBound, y, width, height).intersection(clipSave);
1715 gg.setClip(newClip);
1716
1717 component.paint(gg);
1718 gg.dispose();
1719 }
1720
1721 }
1722
1723
1724
1725
1726 public Dimension getPreferredSize() {
1727 return new Dimension(PREFWIDTH, PREFHEIGHT);
1728 }
1729
1730
1731
1732
1733
1734 public void mouseEntered(MouseEvent e) {
1735 }
1736
1737
1738
1739
1740 public void mouseExited(MouseEvent e) {
1741 }
1742
1743
1744
1745
1746 public void mousePressed(MouseEvent e) {
1747 _delegate.mousePressed(e.getX(), e.getY(), e.isPopupTrigger(), e.getModifiersEx());
1748 }
1749
1750
1751
1752
1753 public void mouseClicked(MouseEvent e) {
1754 }
1755
1756
1757
1758
1759 public void mouseReleased(MouseEvent e) {
1760 boolean popupTrigger = e.isPopupTrigger();
1761 if (!popupTrigger && _requiresPopupTriggerCheck) {
1762 popupTrigger = e.getButton() == MouseEvent.BUTTON3;
1763 }
1764
1765 _delegate.mouseReleased(e.getX(), e.getY(), popupTrigger, e.getModifiersEx());
1766 }
1767
1768
1769
1770
1771
1772
1773
1774 public void mouseDragged(MouseEvent e) {
1775 _delegate.mouseDragged(e.getX(), e.getY(), e.getModifiersEx());
1776 }
1777
1778
1779
1780
1781 public void mouseMoved(MouseEvent e) {
1782 _delegate.mouseMoved(e.getX(), e.getY());
1783 }
1784
1785
1786
1787
1788
1789
1790 public void mouseWheelMoved(MouseWheelEvent e) {
1791 if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
1792 int val = e.getUnitsToScroll();
1793 if (_delegate.getXAxisRect() != null && e.getY() > _delegate.getXAxisRect().y
1794 && e.getY() < _delegate.getXAxisRect().y + _delegate.getXAxisRect().height) {
1795
1796 _xScrollBar.setValue(_xScrollBar.getValue() + val * _xScrollBar.getModel().getExtent() / 5);
1797 } else {
1798
1799 _yScrollBar.getModel().setValue(_yScrollBar.getModel().getValue() + val * getRowHeight());
1800 }
1801 }
1802 }
1803
1804 }
1805
1806
1807
1808
1809 public TimeScaleRenderer getTimeScaleRenderer() {
1810 return _timeScaleRenderer;
1811 }
1812
1813
1814
1815
1816
1817
1818
1819 public void setTimeScaleRenderer(TimeScaleRenderer timeScaleRenderer) {
1820 _timeScaleRenderer = timeScaleRenderer;
1821 if (_timeScaleRenderer != null && _timeScaleRenderer.getHeight() != -1) {
1822
1823 _delegate.setXAxisHeight(_timeScaleRenderer.getHeight());
1824 }
1825
1826 if (_gridRenderer != null) {
1827 _gridRenderer.setTickProvider(null);
1828 }
1829 if (_timeScaleRenderer != null && _gridRenderer != null && _timeScaleRenderer instanceof ITickProvider
1830 && _delegate.getTimeScalePosition() != TimeBarViewerInterface.TIMESCALE_POSITION_NONE) {
1831 _gridRenderer.setTickProvider((ITickProvider) _timeScaleRenderer);
1832 }
1833 _diagram.safeRepaint();
1834 }
1835
1836
1837
1838
1839
1840
1841 public IMiscRenderer getMiscRenderer() {
1842 return _miscRenderer;
1843 }
1844
1845
1846
1847
1848
1849
1850 public void setMiscRenderer(IMiscRenderer miscRenderer) {
1851 _miscRenderer = miscRenderer;
1852 _diagram.safeRepaint();
1853 }
1854
1855
1856
1857
1858
1859
1860 public ITitleRenderer getTitleRenderer() {
1861 return _titleRenderer;
1862 }
1863
1864
1865
1866
1867
1868
1869 public void setTitleRenderer(ITitleRenderer titleRenderer) {
1870 _titleRenderer = titleRenderer;
1871 _diagram.safeRepaint();
1872 }
1873
1874
1875
1876
1877
1878
1879 public IRelationRenderer getRelationRenderer() {
1880 return _relationRenderer;
1881 }
1882
1883
1884
1885
1886
1887
1888 public void setRelationRenderer(IRelationRenderer relationRenderer) {
1889 _relationRenderer = relationRenderer;
1890 _diagram.safeRepaint();
1891 }
1892
1893
1894
1895
1896
1897
1898 public IMarkerRenderer getMarkerRenderer() {
1899 return _markerRenderer;
1900 }
1901
1902
1903
1904
1905
1906
1907 public void setMarkerRenderer(IMarkerRenderer markerRenderer) {
1908 _markerRenderer = markerRenderer;
1909 _diagram.safeRepaint();
1910 }
1911
1912
1913
1914
1915
1916
1917 public IGlobalAssistantRenderer getGlobalAssistantRenderer() {
1918 return _globalAssistantRenderer;
1919 }
1920
1921
1922
1923
1924
1925
1926 public void setGlobalAssistantRenderer(IGlobalAssistantRenderer globalAssistantRenderer) {
1927 _globalAssistantRenderer = globalAssistantRenderer;
1928 _diagram.safeRepaint();
1929 }
1930
1931
1932
1933
1934 public GridRenderer getGridRenderer() {
1935 return _gridRenderer;
1936 }
1937
1938
1939
1940
1941 public void setGridRenderer(GridRenderer gridRenderer) {
1942 _gridRenderer = gridRenderer;
1943
1944 if (_gridRenderer != null && _timeScaleRenderer != null && _timeScaleRenderer instanceof ITickProvider) {
1945 _gridRenderer.setTickProvider((ITickProvider) _timeScaleRenderer);
1946 }
1947 _diagram.safeRepaint();
1948 }
1949
1950
1951
1952
1953 public TimeBarGapRenderer getGapRenderer() {
1954 return _gapRenderer;
1955 }
1956
1957
1958
1959
1960 public void setGapRenderer(TimeBarGapRenderer gapRenderer) {
1961 _gapRenderer = gapRenderer;
1962 _diagram.safeRepaint();
1963 }
1964
1965
1966
1967
1968
1969
1970
1971 public void registerPopupMenu(Class<? extends Interval> clazz, JPopupMenu popup) {
1972 if (_registeredPopupMenues == null) {
1973 _registeredPopupMenues = new HashMap<Class<? extends Interval>, JPopupMenu>();
1974 }
1975 _registeredPopupMenues.put(clazz, popup);
1976 }
1977
1978
1979
1980
1981
1982
1983
1984 public JPopupMenu getPopupMenu(Class<? extends Interval> clazz) {
1985 if (_registeredPopupMenues == null) {
1986 return null;
1987 }
1988 JPopupMenu result = null;
1989 result = _registeredPopupMenues.get(clazz);
1990 if (result != null) {
1991 return result;
1992 }
1993
1994
1995 Class<?>[] interfaces = clazz.getInterfaces();
1996 for (Class<?> c : interfaces) {
1997 result = _registeredPopupMenues.get(c);
1998 if (result != null) {
1999 return result;
2000 }
2001 }
2002
2003
2004 Class<?> sc = clazz.getSuperclass();
2005
2006 while (sc != null) {
2007 result = _registeredPopupMenues.get(sc);
2008 if (result != null) {
2009 return result;
2010 }
2011
2012 Class<?>[] scinterfaces = sc.getInterfaces();
2013 for (Class<?> c : scinterfaces) {
2014 result = _registeredPopupMenues.get(c);
2015 if (result != null) {
2016 return result;
2017 }
2018 }
2019 sc = sc.getSuperclass();
2020 }
2021
2022 return result;
2023 }
2024
2025
2026
2027
2028 public void firePropertyChangeX(String propName, Object oldVal, Object newVal) {
2029 firePropertyChange(propName, oldVal, newVal);
2030 }
2031
2032
2033
2034
2035 public boolean timeBarContains(Interval interval, Rectangle intervalRect, int x, int y, boolean overlapping) {
2036 JComponent component = getIntervalComponent(interval, intervalRect, overlapping);
2037 return component.contains(x, y);
2038 }
2039
2040
2041
2042
2043 public Rectangle timeBarContainingRect(Interval interval, Rectangle intervalRect, boolean overlapping) {
2044 JComponent component = getIntervalComponent(interval, intervalRect);
2045
2046
2047 Rectangle containingRect = (Rectangle) component.getClientProperty(TimeBarRenderer.CONTAINING_RECTANGLE);
2048 return containingRect;
2049 }
2050
2051
2052
2053
2054 public void setCursor(int cursorType) {
2055 setCursor(Cursor.getPredefinedCursor(cursorType));
2056 }
2057
2058
2059
2060
2061 public String getIntervalToolTipText(Interval interval, Rectangle intervalRect, int x, int y) {
2062 JComponent component = getIntervalComponent(interval, intervalRect);
2063
2064
2065 String tooltip = component.getToolTipText(new MouseEvent(this, 0, 0, 0, x, y, 0, false));
2066 return tooltip;
2067 }
2068
2069
2070
2071
2072 public JaretDate getStartDate() {
2073 return _delegate.getStartDate();
2074 }
2075
2076
2077
2078
2079 public void setStartDate(JaretDate startDate) {
2080 _delegate.setStartDate(startDate);
2081 }
2082
2083
2084
2085
2086 public JaretDate getMinDate() {
2087 return _delegate.getMinDate();
2088 }
2089
2090
2091
2092
2093 public void setMinDate(JaretDate minDate) {
2094 _delegate.setMinDate(minDate);
2095 }
2096
2097
2098
2099
2100 public JaretDate getMaxDate() {
2101 return _delegate.getMaxDate();
2102 }
2103
2104
2105
2106
2107 public void setMaxDate(JaretDate maxDate) {
2108 _delegate.setMaxDate(maxDate);
2109 }
2110
2111
2112
2113
2114 public TimeBarSelectionModel getSelectionModel() {
2115 return _delegate.getSelectionModel();
2116 }
2117
2118
2119
2120
2121 public void setSelectionModel(TimeBarSelectionModel selectionModel) {
2122 _delegate.setSelectionModel(selectionModel);
2123 }
2124
2125
2126
2127
2128 public int getFirstRowDisplayed() {
2129 return _delegate.getFirstRow();
2130 }
2131
2132
2133
2134
2135 public void setFirstRowDisplayed(int rowIdx) {
2136 _delegate.setFirstRow(rowIdx);
2137 }
2138
2139
2140
2141
2142 public void setFirstRowDisplayed(TimeBarRow row) {
2143 _delegate.setFirstRow(row);
2144 }
2145
2146
2147
2148
2149 public void setFirstRow(int firstRow, int pixOffset) {
2150 _delegate.setFirstRow(firstRow, pixOffset);
2151 }
2152
2153
2154
2155
2156 public void setLastRow(int index) {
2157 _delegate.setLastRow(index);
2158 }
2159
2160
2161
2162
2163 public void setLastRow(TimeBarRow row) {
2164 _delegate.setLastRow(row);
2165 }
2166
2167
2168
2169
2170 public JaretDate getEndDate() {
2171 return _delegate.getEndDate();
2172 }
2173
2174
2175
2176
2177 public int getFirstRowOffset() {
2178 return _delegate.getFirstRowOffset();
2179 }
2180
2181
2182
2183
2184 public void setFirstRowOffset(int offset) {
2185 _delegate.setFirstRowOffset(offset);
2186 }
2187
2188
2189
2190
2191 public void setTimeScalePosition(int timeScalePosition) {
2192 if (timeScalePosition == TimeBarViewerInterface.TIMESCALE_POSITION_NONE) {
2193 if (_gridRenderer != null) {
2194 _gridRenderer.setTickProvider(null);
2195 }
2196 } else {
2197 if (_gridRenderer != null && _timeScaleRenderer instanceof ITickProvider) {
2198 _gridRenderer.setTickProvider((ITickProvider) _timeScaleRenderer);
2199 }
2200 }
2201 _delegate.setTimeScalePosition(timeScalePosition);
2202 }
2203
2204
2205
2206
2207 public void setAdjustMinMaxDatesByModel(boolean adjust) {
2208 _delegate.setAdjustMinMaxDatesByModel(adjust);
2209 }
2210
2211
2212
2213
2214 public boolean getAdjustMinMaxDatesByModel() {
2215 return _delegate.getAdjustMinMaxDatesByModel();
2216 }
2217
2218
2219
2220
2221 public TimeBarRow rowForY(int y) {
2222 return _delegate.rowForY(y);
2223 }
2224
2225
2226
2227
2228 public JaretDate dateForX(int x) {
2229 return _delegate.dateForCoord(x);
2230 }
2231
2232
2233
2234
2235 public JaretDate dateForXY(int x, int y) {
2236 return _delegate.dateForCoord(x, y);
2237 }
2238
2239
2240
2241
2242 public int xForDate(JaretDate date) {
2243 return _delegate.xForDate(date);
2244 }
2245
2246
2247
2248
2249 public void highlightRow(int y) {
2250 _delegate.highlightRow(y);
2251 }
2252
2253
2254
2255
2256 public void highlightRow(TimeBarRow timeBarRow) {
2257 _delegate.highlightRow(timeBarRow);
2258 }
2259
2260
2261
2262
2263 public void deHighlightRow() {
2264 _delegate.deHighlightRow();
2265 }
2266
2267
2268
2269
2270 public void setDrawRowGrid(boolean drawRowGrid) {
2271 _delegate.setDrawRowGrid(drawRowGrid);
2272 }
2273
2274
2275
2276
2277 public boolean getDrawRowGrid() {
2278 return _delegate.getDrawRowGrid();
2279 }
2280
2281
2282
2283
2284 public void setYAxisWidth(int width) {
2285 _delegate.setYAxisWidth(width);
2286 }
2287
2288
2289
2290
2291 public int getYAxisWidth() {
2292 return _delegate.getYAxisWidth();
2293 }
2294
2295
2296
2297
2298 public void setHierarchyWidth(int width) {
2299 _delegate.setHierarchyWidth(width);
2300 }
2301
2302
2303
2304
2305 public int getHierarchyWidth() {
2306 return _delegate.getHierarchyWidth();
2307 }
2308
2309
2310
2311
2312 public void addIntervalModificator(IntervalModificator intervalModificator) {
2313 _delegate.addIntervalModificator(intervalModificator);
2314 }
2315
2316
2317
2318
2319 public void remIntervalModificator(IntervalModificator intervalModificator) {
2320 _delegate.remIntervalModificator(intervalModificator);
2321 }
2322
2323
2324
2325
2326 public void setAutoscrollEnabled(boolean enableAutoscroll) {
2327 _delegate.setAutoscrollEnabled(enableAutoscroll);
2328 }
2329
2330
2331
2332
2333 public boolean isAutoscrollEnabled() {
2334 return _delegate.isAutoscrollEnabled();
2335 }
2336
2337
2338
2339
2340 public String getTimeScaleToolTipText(int x, int y) {
2341 if (_timeScaleRendererComponent != null) {
2342 return _timeScaleRendererComponent.getToolTipText(new MouseEvent(this, 0, 0, 0, x
2343 - _delegate.getDiagramRect().x, y - _delegate.getXAxisRect().y, 0, false));
2344 }
2345 return null;
2346 }
2347
2348
2349
2350
2351 public String getHeaderToolTipText(TimeBarRow row, int x, int y) {
2352 if (_headerRenderer != null && row != null) {
2353 JComponent component = _headerRenderer.getHeaderRendererComponent(this, row.getRowHeader(), false);
2354 if (component != null) {
2355 component.setBounds(_delegate.getHeaderRect(row));
2356 return component.getToolTipText(new MouseEvent(this, 0, 0, 0, x - _delegate.getYAxisRect().x, y
2357 - _delegate.getYAxisRect().y, 0, false));
2358 }
2359 }
2360 return null;
2361 }
2362
2363
2364
2365
2366 public String getHierarchyToolTipText(TimeBarNode node, int x, int y) {
2367 if (_hierarchyRenderer != null && node != null) {
2368
2369
2370 JComponent component = _hierarchyRenderer.getHierarchyRendererComponent(this, node, false, false, false, 0,
2371 1);
2372 component.setBounds(_delegate.getHierarchyRect(node));
2373 return component.getToolTipText(new MouseEvent(this, 0, 0, 0, x - _delegate.getHierarchyRect().x, y
2374 - _delegate.getHierarchyRect().y, 0, false));
2375 }
2376 return null;
2377 }
2378
2379
2380
2381
2382 public HierarchicalViewState getHierarchicalViewState() {
2383 return _delegate.getHierarchicalViewState();
2384 }
2385
2386
2387
2388
2389 public void setHierarchicalViewState(HierarchicalViewState hierarchicalViewState) {
2390 _delegate.setHierarchicalViewState(hierarchicalViewState);
2391 }
2392
2393
2394
2395
2396 public void setModel(HierarchicalTimeBarModel hModel) {
2397 _delegate.setModel(hModel);
2398 }
2399
2400
2401
2402
2403 public HierarchicalTimeBarModel getHierarchicalModel() {
2404 return _delegate.getHierarchicalModel();
2405 }
2406
2407
2408
2409
2410 public int getMarkerWidth(TimeBarMarker marker) {
2411 if (_markerRenderer != null) {
2412 return _markerRenderer.getMarkerWidth(marker);
2413 }
2414 return 0;
2415 }
2416
2417
2418
2419
2420 public void setTitle(String title) {
2421 _delegate.setTitle(title);
2422 }
2423
2424
2425
2426
2427 public String getTitle() {
2428 return _delegate.getTitle();
2429 }
2430
2431
2432
2433
2434
2435
2436 public JPopupMenu getBodyContextMenu() {
2437 return _bodyContextMenu;
2438 }
2439
2440
2441
2442
2443
2444
2445 public void setBodyContextMenu(JPopupMenu bodyContextMenu) {
2446 _bodyContextMenu = bodyContextMenu;
2447 }
2448
2449
2450
2451
2452
2453
2454 public JPopupMenu getTimeScaleContextMenu() {
2455 return _timeScaleContextMenu;
2456 }
2457
2458
2459
2460
2461
2462
2463 public void setTimeScaleContextMenu(JPopupMenu timeScaleContextMenu) {
2464 _timeScaleContextMenu = timeScaleContextMenu;
2465 }
2466
2467
2468
2469
2470
2471
2472
2473 public JPopupMenu getHeaderContextMenu() {
2474 return _headerContextMenu;
2475 }
2476
2477
2478
2479
2480
2481
2482 public void setHeaderContextMenu(JPopupMenu headerContextMenu) {
2483 _headerContextMenu = headerContextMenu;
2484 }
2485
2486
2487
2488
2489
2490
2491 public JPopupMenu getHierarchyContextMenu() {
2492 return _hierarchyContextMenu;
2493 }
2494
2495
2496
2497
2498
2499
2500 public void setHierarchyContextMenu(JPopupMenu hierarchyContextMenu) {
2501 _hierarchyContextMenu = hierarchyContextMenu;
2502 }
2503
2504
2505
2506
2507
2508
2509 public JPopupMenu getTitleContextMenu() {
2510 return _titleContextMenu;
2511 }
2512
2513
2514
2515
2516
2517
2518 public void setTitleContextMenu(JPopupMenu titleContextMenu) {
2519 _titleContextMenu = titleContextMenu;
2520 }
2521
2522
2523
2524
2525 public void displayBodyContextMenu(int x, int y) {
2526 if (_bodyContextMenu != null) {
2527 _bodyContextMenu.show(_diagram, x, y);
2528 }
2529 }
2530
2531
2532
2533
2534 public void displayTimeScaleContextMenu(int x, int y) {
2535 if (_timeScaleContextMenu != null) {
2536 _timeScaleContextMenu.show(_diagram, x, y);
2537 }
2538 }
2539
2540
2541
2542
2543 public void displayIntervalContextMenu(Interval interval, int x, int y) {
2544 JPopupMenu menu = getPopupMenu(interval.getClass());
2545 if (menu != null) {
2546 menu.show(_diagram, x, y);
2547 }
2548 }
2549
2550
2551
2552
2553 public void displayHeaderContextMenu(TimeBarRow row, int x, int y) {
2554 if (_headerContextMenu != null) {
2555 _headerContextMenu.show(_diagram, x, y);
2556 }
2557 }
2558
2559
2560
2561
2562 public void displayHierarchyContextMenu(TimeBarRow row, int x, int y) {
2563 if (_hierarchyContextMenu != null) {
2564 _hierarchyContextMenu.show(_diagram, x, y);
2565 }
2566 }
2567
2568
2569
2570
2571 public void displayTitleContextMenu(int x, int y) {
2572 if (_titleContextMenu != null) {
2573 _titleContextMenu.show(_diagram, x, y);
2574 }
2575 }
2576
2577
2578
2579
2580 public boolean isInToggleArea(TimeBarNode node, int x, int y) {
2581 return true;
2582 }
2583
2584
2585
2586
2587 public boolean isInHierarchySelectionArea(TimeBarNode node, int x, int y) {
2588 return false;
2589 }
2590
2591
2592
2593
2594
2595
2596
2597 public void setDrawOverlapping(boolean drawOverlapping) {
2598 _delegate.setDrawOverlapping(drawOverlapping);
2599 }
2600
2601
2602
2603
2604
2605
2606 public boolean getDrawOverlapping() {
2607 return _delegate.isDrawOverlapping();
2608 }
2609
2610
2611
2612
2613 public void addMarker(TimeBarMarker marker) {
2614 _delegate.addMarker(marker);
2615 }
2616
2617
2618
2619
2620 public void remMarker(TimeBarMarker marker) {
2621 _delegate.remMarker(marker);
2622 }
2623
2624
2625
2626
2627 public List<TimeBarMarker> getMarkers() {
2628 return _delegate.getMarkers();
2629 }
2630
2631
2632
2633
2634 public void addMarkers(List<TimeBarMarker> markers) {
2635 _delegate.addMarkers(markers);
2636 }
2637
2638
2639
2640
2641 public int getSelectionDelta() {
2642 return _delegate.getSelectionDelta();
2643 }
2644
2645
2646
2647
2648 public void setSelectionDelta(int selectionDelta) {
2649 _delegate.setSelectionDelta(selectionDelta);
2650 }
2651
2652
2653
2654
2655 public boolean isLineDraggingAllowed() {
2656 return _delegate.isLineDraggingAllowed();
2657 }
2658
2659
2660
2661
2662 public void setLineDraggingAllowed(boolean lineDraggingAllowed) {
2663 _delegate.setLineDraggingAllowed(lineDraggingAllowed);
2664 }
2665
2666
2667
2668
2669 public int getYForRow(TimeBarRow row) {
2670 return _delegate.yForRow(row);
2671 }
2672
2673
2674
2675
2676 public TimeBarRow getRowForY(int y) {
2677 return _delegate.rowForY(y);
2678 }
2679
2680
2681
2682
2683 public TimeBarRow getRowForXY(int x, int y) {
2684 return _delegate.rowForXY(x, y);
2685 }
2686
2687
2688
2689
2690 public boolean isMilliAccuracy() {
2691 return _delegate.isMilliAccuracy();
2692 }
2693
2694
2695
2696
2697 public void setMilliAccuracy(boolean milliAccuracy) {
2698 _delegate.setMilliAccuracy(milliAccuracy);
2699 }
2700
2701
2702
2703
2704 public TimeBarNode getPpsRow() {
2705 return _delegate.getPpsRow();
2706 }
2707
2708
2709
2710
2711 public boolean hasVariableXScale() {
2712 return _delegate.hasVariableXScale();
2713 }
2714
2715
2716
2717
2718 public void setVariableXScale(boolean state) {
2719 _delegate.setVariableXScale(state);
2720 }
2721
2722
2723
2724
2725 public void doScrollHorizontal(int diff) {
2726 Graphics g = _diagram.getGraphics();
2727 if (g == null) {
2728 return;
2729 }
2730 if (_delegate.getDiagramRect() == null) {
2731 return;
2732 }
2733
2734 Rectangle d = new Rectangle(_delegate.getDiagramRect());
2735 if (_delegate.getOrientation().equals(Orientation.HORIZONTAL)) {
2736 if (_delegate.getTimeScalePosition() != TIMESCALE_POSITION_NONE) {
2737 if (_delegate.getTimeScalePosition() == TIMESCALE_POSITION_TOP) {
2738 d.y = _delegate.getXAxisRect().y;
2739 }
2740 d.height += _delegate.getXAxisRect().height;
2741 }
2742 } else {
2743 d.y = 0;
2744 d.height = d.height + _delegate.getHierarchyWidth() + _delegate.getYAxisWidth();
2745 }
2746
2747 if (diff > 0) {
2748
2749 g.copyArea(d.x + diff, d.y, d.width - diff, d.height, -diff, 0);
2750 _diagram.repaint(d.x + d.width - diff, d.y, diff, d.height);
2751 } else {
2752 diff = -diff;
2753 g.copyArea(d.x, d.y, d.width - diff, d.height, diff, 0);
2754 _diagram.repaint(d.x, d.y, diff, d.height);
2755 }
2756 g.dispose();
2757 }
2758
2759
2760
2761
2762 public void doScrollVertical(int diff) {
2763 Graphics g = _diagram.getGraphics();
2764 if (g == null) {
2765 return;
2766 }
2767
2768 if (_delegate.getDiagramRect() == null) {
2769 return;
2770 }
2771
2772 Rectangle d = new Rectangle(_delegate.getDiagramRect());
2773 if (_delegate.getOrientation().equals(Orientation.HORIZONTAL)) {
2774 d.x = d.x - _delegate.getHierarchyWidth() - _delegate.getYAxisWidth();
2775 d.width = d.width + _delegate.getHierarchyWidth() + _delegate.getYAxisWidth();
2776 } else {
2777 if (_delegate.getTimeScalePosition() == TIMESCALE_POSITION_TOP) {
2778 d.x = d.x - _delegate.getXAxisHeight();
2779 }
2780 d.width = d.width + _delegate.getXAxisHeight();
2781 }
2782 if (diff > 0) {
2783
2784 g.copyArea(d.x, d.y + diff, d.width, d.height - diff, 0, -diff);
2785 _diagram.repaint(d.x, d.y + d.height - diff, d.width, diff);
2786 } else {
2787 diff = -diff;
2788 g.copyArea(d.x, d.y, d.width, d.height - diff, 0, diff);
2789 _diagram.repaint(d.x, d.y, d.width, diff);
2790 }
2791 g.dispose();
2792 }
2793
2794
2795
2796
2797 public boolean getOptimizeScrolling() {
2798 return _delegate.getOptimizeScrolling();
2799 }
2800
2801
2802
2803
2804 public void setOptimizeScrolling(boolean optimizeScrolling) {
2805 _delegate.setOptimizeScrolling(optimizeScrolling);
2806 }
2807
2808
2809
2810
2811 public Orientation getTBOrientation() {
2812 return _delegate.getOrientation();
2813 }
2814
2815
2816
2817
2818 public void setTBOrientation(Orientation orientation) {
2819 _delegate.setOrientation(orientation);
2820 }
2821
2822
2823
2824
2825 public int getAutoScaleRows() {
2826 return _delegate.getAutoScaleRows();
2827 }
2828
2829
2830
2831
2832 public void setAutoScaleRows(int rows) {
2833 _delegate.setAutoScaleRows(rows);
2834 }
2835
2836
2837
2838
2839 public int getXAxisHeight() {
2840 return _delegate.getXAxisHeight();
2841 }
2842
2843
2844
2845
2846 public void setXAxisHeight(int height) {
2847 _delegate.setXAxisHeight(height);
2848 }
2849
2850
2851
2852
2853 public void fireSelectionChanged() {
2854
2855 }
2856
2857
2858
2859
2860 public void addTimeBarChangeListener(ITimeBarChangeListener listener) {
2861 _delegate.addTimeBarChangeListener(listener);
2862 }
2863
2864
2865
2866
2867 public void removeTimeBarChangeListener(ITimeBarChangeListener listener) {
2868 _delegate.removeTimeBarChangeListener(listener);
2869 }
2870
2871
2872
2873
2874 public void addFocussedIntervalListener(FocussedIntervalListener listener) {
2875 _delegate.addFocussedIntervalListener(listener);
2876 }
2877
2878
2879
2880
2881 public void remFocussedIntervalListener(FocussedIntervalListener listener) {
2882 _delegate.remFocussedIntervalListener(listener);
2883 }
2884
2885
2886
2887
2888 public ITimeBarViewState getTimeBarViewState() {
2889 return _delegate.getTimeBarViewState();
2890 }
2891
2892
2893
2894
2895 public boolean isRowHeightDragginAllowed() {
2896 return _delegate.isRowHeightDraggingAllowed();
2897 }
2898
2899
2900
2901
2902 public void setRowHeightDraggingAllowed(boolean rowHeightDraggingAllowed) {
2903 _delegate.setRowHeightDraggingAllowed(rowHeightDraggingAllowed);
2904 }
2905
2906
2907
2908
2909 public boolean rowLineHit(int x, int y) {
2910 return _delegate.rowLineHit(x, y);
2911 }
2912
2913
2914
2915
2916 public boolean isInRowAxis(int x, int y) {
2917 return _delegate.isInRowAxis(x, y);
2918 }
2919
2920
2921
2922
2923 public boolean isInDiagram(int x, int y) {
2924 return _delegate.isInDiagram(x, y);
2925 }
2926
2927
2928
2929
2930 public boolean getStrictClipTimeCheck() {
2931 return _delegate.getStrictClipTimeCheck();
2932 }
2933
2934
2935
2936
2937 public void setStrictClipTimeCheck(boolean strictClipTimeCheck) {
2938 _delegate.setStrictClipTimeCheck(strictClipTimeCheck);
2939 }
2940
2941
2942
2943
2944 public int getSecondsDisplayed() {
2945 return _delegate.getSecondsDisplayed();
2946 }
2947
2948
2949
2950
2951 public IOverlapStrategy getOverlapStrategy() {
2952 return _delegate.getOverlapStrategy();
2953 }
2954
2955
2956
2957
2958 public void setOverlapStrategy(IOverlapStrategy overlapStrategy) {
2959 _delegate.setOverlapStrategy(overlapStrategy);
2960 }
2961
2962
2963
2964
2965 public int getScrollLookBackMinutes() {
2966 return _delegate.getScrollLookBackMinutes();
2967 }
2968
2969
2970
2971
2972 public void setScrollLookBackMinutes(int scrollLookBackMinutes) {
2973 _delegate.setScrollLookBackMinutes(scrollLookBackMinutes);
2974 }
2975
2976
2977
2978
2979 public void setScrollLookForwardMinutes(int scrollLookForwardMinutes) {
2980 _delegate.setScrollLookForwardMinutes(scrollLookForwardMinutes);
2981 }
2982
2983
2984
2985
2986 public int getScrollLookForwardMinutes() {
2987 return _delegate.getScrollLookForwardMinutes();
2988 }
2989
2990
2991
2992
2993 public String getName() {
2994
2995 if (_delegate != null) {
2996 return _delegate.getName();
2997 } else {
2998 return null;
2999 }
3000 }
3001
3002
3003
3004
3005 public void setName(String name) {
3006 _delegate.setName(name);
3007 }
3008
3009
3010
3011
3012 public TimeBarViewerDelegate getDelegate() {
3013 return _delegate;
3014 }
3015
3016
3017
3018
3019 public int getAutoscrollDelta() {
3020 return _delegate.getAutoscrollDelta();
3021 }
3022
3023
3024
3025
3026 public void setAutoscrollDelta(int autoscrollDelta) {
3027 _delegate.setAutoscrollDelta(autoscrollDelta);
3028 }
3029
3030
3031
3032
3033 public boolean getDragAllSelectedIntervals() {
3034 return _delegate.getDragAllSelectedIntervals();
3035 }
3036
3037
3038
3039
3040 public void setDragAllSelectedIntervals(boolean dragAllSelectedIntervals) {
3041 _delegate.setDragAllSelectedIntervals(dragAllSelectedIntervals);
3042 }
3043
3044
3045
3046
3047 public List<IIntervalRelation> getRelationsForCoord(int x, int y) {
3048 if (_relationRenderer != null) {
3049 return _relationRenderer.getRelationsForCoord(x, y);
3050 } else {
3051 return null;
3052 }
3053 }
3054
3055
3056
3057
3058 public String getRelationTooltip(int x, int y) {
3059 if (_relationRenderer != null) {
3060 return _relationRenderer.getTooltip(x, y);
3061 }
3062 return null;
3063 }
3064
3065
3066
3067
3068 public boolean getScrollOnFocus() {
3069 return _delegate.getScrollOnFocus();
3070 }
3071
3072
3073
3074
3075 public void setScrollOnFocus(boolean scrollOnFocus) {
3076 _delegate.setScrollOnFocus(scrollOnFocus);
3077 }
3078
3079
3080
3081
3082 public void addSelectionRectListener(ISelectionRectListener listener) {
3083 _delegate.addSelectionRectListener(listener);
3084 }
3085
3086
3087
3088
3089 public void remSelectionRectListener(ISelectionRectListener listener) {
3090 _delegate.remSelectionRectListener(listener);
3091 }
3092
3093
3094
3095
3096 public boolean getHideRoot() {
3097 return _delegate.getHideRoot();
3098 }
3099
3100
3101
3102
3103 public void setHideRoot(boolean hideRoot) {
3104 _delegate.setHideRoot(hideRoot);
3105 }
3106
3107
3108
3109
3110 public boolean getMarkerDraggingInDiagramArea() {
3111 return _delegate.getMarkerDraggingInDiagramArea();
3112 }
3113
3114
3115
3116
3117 public void setMarkerDraggingInDiagramArea(boolean allowed) {
3118 _delegate.setMarkerDraggingInDiagramArea(allowed);
3119 }
3120
3121
3122
3123
3124 public void clearRegionRect() {
3125 _delegate.clearRegionRect();
3126 }
3127
3128
3129
3130
3131 public TBRect getRegionRect() {
3132 return _delegate.getRegionRect();
3133 }
3134
3135
3136
3137
3138 public boolean getRegionRectEnable() {
3139 return _delegate.getRegionRectEnable();
3140 }
3141
3142
3143
3144
3145 public void setRegionRectEnable(boolean enabled) {
3146 _delegate.setRegionRectEnable(enabled);
3147 }
3148
3149
3150
3151
3152 public void repaint(Rectangle r) {
3153 super.repaint(r.x, r.y, r.width + 1, r.height + 1);
3154 }
3155
3156
3157
3158
3159 public boolean getUseUniformHeight() {
3160 return _delegate.getUseUniformHeight();
3161 }
3162
3163
3164
3165
3166 public void setUseUniformHeight(boolean useUniformHeight) {
3167 _delegate.setUseUniformHeight(useUniformHeight);
3168 }
3169
3170
3171
3172
3173 public void setSecondsDisplayed(int seconds, boolean center) {
3174 _delegate.setSecondsDisplayed(seconds, center);
3175 }
3176
3177
3178
3179
3180 public void setSecondsDisplayed(int seconds, JaretDate centerDate) {
3181 _delegate.setSecondsDisplayed(seconds, centerDate);
3182 }
3183
3184
3185
3186
3187 public boolean isDisplayed(JaretDate date) {
3188 return _delegate.isDisplayed(date);
3189 }
3190
3191
3192
3193
3194 public void setInitialDisplayRange(JaretDate startDate, int secondsDisplayed) {
3195 _delegate.setInitialDisplayRange(startDate, secondsDisplayed);
3196 }
3197
3198
3199
3200
3201
3202
3203
3204 public JPanel getHorizontalScrollPanel() {
3205 return _horizontalScrollPanel;
3206 }
3207
3208
3209
3210
3211
3212
3213
3214 public JPanel getVerticalScrollPanel() {
3215 return _verticalScrollPanel;
3216 }
3217
3218
3219
3220
3221 public Pair<TimeBarRow, JaretDate> getPopUpInformation() {
3222 return _delegate.getPopUpInformation();
3223 }
3224
3225
3226 protected List<? extends Interval> _ghostIntervals;
3227
3228 protected List<Integer> _ghostIntervalYCoordinates;
3229
3230
3231
3232
3233 protected Point _ghostOrigin;
3234
3235 protected List<TimeBarRow> _ghostRows;
3236
3237 protected List<Integer> _ghostRowYCoordinates;
3238
3239
3240
3241
3242
3243
3244
3245
3246 public void setGhostIntervals(List<? extends Interval> intervals, List<Integer> yCoordinates) {
3247 _ghostIntervals = intervals;
3248 _ghostIntervalYCoordinates = yCoordinates;
3249 repaint();
3250 }
3251
3252
3253
3254
3255
3256
3257 private void drawGhosts(Graphics gc) {
3258 drawGhostIntervals(gc);
3259 drawGhostRows(gc);
3260 }
3261
3262
3263
3264
3265
3266
3267
3268 private void drawGhostIntervals(Graphics gc) {
3269 if (_ghostOrigin != null && _ghostIntervals != null) {
3270 for (int i = 0; i < _ghostIntervals.size(); i++) {
3271 Interval interval = _ghostIntervals.get(i);
3272 int yoff = _ghostIntervalYCoordinates.get(i);
3273
3274 Rectangle drawingArea = _delegate.getIntervalBounds(-1, interval);
3275 if (_delegate.getOrientation().equals(Orientation.HORIZONTAL)) {
3276 drawingArea.y = _ghostOrigin.y + yoff;
3277 drawingArea.height = _delegate.getTimeBarViewState().getDefaultRowHeight();
3278 } else {
3279 drawingArea.x = _ghostOrigin.x + yoff;
3280 drawingArea.width = _delegate.getTimeBarViewState().getDefaultRowHeight();
3281 }
3282 Graphics2D g2 = (Graphics2D) gc;
3283 Color color = g2.getColor();
3284 g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f));
3285
3286 TimeBarRenderer renderer = getRenderer(interval.getClass());
3287 if (renderer == null) {
3288 throw new RuntimeException("no suitable renderer");
3289 }
3290
3291 Component component = renderer.getTimeBarRendererComponent(this, interval, false, false);
3292
3293 component.setBounds(drawingArea);
3294
3295 Graphics2D g22 = (Graphics2D) g2.create(drawingArea.x, drawingArea.y - _delegate.getRowHeight() / 2,
3296 drawingArea.width, drawingArea.height);
3297 component.paint(g22);
3298
3299 g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
3300 g2.setColor(color);
3301
3302 }
3303 }
3304 }
3305
3306
3307
3308
3309
3310
3311 private void drawGhostRows(Graphics gc) {
3312 if (_ghostOrigin != null && _ghostRows != null) {
3313
3314 Graphics2D g2 = (Graphics2D) gc;
3315 Color color = g2.getColor();
3316 g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f));
3317
3318 for (int i = 0; i < _ghostRows.size(); i++) {
3319 TimeBarRow row = _ghostRows.get(i);
3320 int yoff = _ghostRowYCoordinates.get(i);
3321
3322 if (_delegate.getOrientation().equals(Orientation.HORIZONTAL)) {
3323 int y = _ghostOrigin.y + yoff;
3324 int height = _delegate.getRowHeight();
3325 _diagram.drawRow(g2, y, height, row, false);
3326 } else {
3327 int x = _ghostOrigin.x + yoff;
3328 int width = _delegate.getRowHeight();
3329 _diagram.drawRowVertical(g2, x, width, row, false);
3330 }
3331 }
3332 g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
3333 g2.setColor(color);
3334 }
3335 }
3336
3337
3338
3339
3340
3341
3342
3343 public void setGhostOrigin(int x, int y) {
3344 _ghostOrigin = new Point(x, y);
3345 if (_ghostIntervals != null || _ghostRows != null) {
3346 repaint();
3347 }
3348 }
3349
3350
3351
3352
3353
3354
3355
3356 public void setUseTitleRendererComponentInPlace(boolean useTitleRendererComponentInPlace) {
3357 _useTitleRendererComponentInPlace = useTitleRendererComponentInPlace;
3358 }
3359
3360
3361
3362
3363 public int scrollDateToVisible(JaretDate date) {
3364 return _delegate.scrollDateToVisible(date);
3365 }
3366
3367
3368
3369
3370 public void scrollRowToVisible(TimeBarRow row) {
3371 _delegate.scrollRowToVisible(row);
3372 }
3373
3374
3375
3376
3377 public void scrollIntervalToVisible(TimeBarRow row, Interval interval) {
3378 _delegate.scrollIntervalToVisible(row, interval);
3379 }
3380
3381 }