View Javadoc

1   /*
2    *  File: CombiningTimeScaleRenderer.java 
3    *  Copyright (c) Peter Kliem (peter@kliemax.de)
4    *  A commercial license is available, see http://www.jaret.de.
5    *
6    *  This program is free software; you can redistribute it and/or modify
7    *  it under the terms of the GNU General Public License as published by
8    *  the Free Software Foundation; either version 2 of the License, or
9    *  (at your option) any later version.
10   *
11   *  This program is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   *  GNU General Public License for more details.
15   *
16   *  You should have received a copy of the GNU General Public License
17   *  along with this program; if not, write to the Free Software
18   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19   */
20  package de.jaret.util.ui.timebars.swt.renderer;
21  
22  import org.eclipse.swt.graphics.GC;
23  import org.eclipse.swt.graphics.Rectangle;
24  import org.eclipse.swt.printing.Printer;
25  
26  
27  import de.jaret.util.misc.Pair;
28  import de.jaret.util.ui.timebars.TimeBarViewerDelegate;
29  import de.jaret.util.ui.timebars.TimeBarViewerInterface;
30  import de.jaret.util.ui.timebars.swt.TimeBarViewer;
31  
32  /**
33   * A TimeScaleRenderer that combines two other TimeScaleRenderers.
34   * @author kliem
35   *
36   */
37  public class CombiningTimeScaleRenderer implements TimeScaleRenderer{
38      protected TimeScaleRenderer _outerRenderer;
39      protected TimeScaleRenderer _innerRenderer;
40      
41      public CombiningTimeScaleRenderer(TimeScaleRenderer outerRenderer, TimeScaleRenderer innerRenderer) {
42          _outerRenderer = outerRenderer;
43          _innerRenderer = innerRenderer;
44          if (_outerRenderer == null || _innerRenderer==null) {
45              throw new IllegalArgumentException("renderes must both be set");
46          }
47      }
48          
49      
50      @Override
51      public void draw(GC gc, Rectangle drawingArea, TimeBarViewerDelegate delegate, boolean top, boolean printing) {
52          Pair<Rectangle, Rectangle> rects = getDrawingareas(drawingArea, delegate, top);
53          Rectangle outerRect = rects.getLeft();
54          Rectangle innerRect = rects.getRight();
55          
56          // and now ... go draw
57          _outerRenderer.draw(gc, outerRect, delegate, top, printing);
58          _innerRenderer.draw(gc, innerRect, delegate, top, printing);
59      }
60  
61      @Override
62      public String getToolTipText(TimeBarViewer tbv, Rectangle drawingArea, int x, int y) {
63          Pair<Rectangle, Rectangle> rects = getDrawingareas(drawingArea, tbv.getDelegate(), tbv.getTimeScalePosition() == TimeBarViewerInterface.TIMESCALE_POSITION_TOP);
64          Rectangle outerRect = rects.getLeft();
65          Rectangle innerRect = rects.getRight();
66  
67          if (outerRect.contains(x, y)) {
68              return _outerRenderer.getToolTipText(tbv, outerRect, x, y);
69          } else {
70              return _innerRenderer.getToolTipText(tbv, innerRect, x, y);
71          }
72      }
73  
74      protected Pair<Rectangle, Rectangle> getDrawingareas(Rectangle drawingArea, TimeBarViewerDelegate delegate, boolean top) {
75          boolean horizontal = delegate.getOrientation().equals(TimeBarViewerInterface.Orientation.HORIZONTAL);
76          Rectangle da = drawingArea;
77          // setup the rectangles for the renderers
78          Rectangle outerRect = null;
79          Rectangle innerRect = null;
80          if (horizontal) {
81              if (top) {
82                  outerRect = new Rectangle(da.x, da.y, da.width, _outerRenderer.getHeight());
83                  innerRect = new Rectangle(da.x, da.y+outerRect.height, da.width, _innerRenderer.getHeight());
84              } else {
85                  // bottom
86                  innerRect = new Rectangle(da.x, da.y, da.width, _innerRenderer.getHeight());
87                  outerRect = new Rectangle(da.x, da.y+innerRect.height, da.width, _outerRenderer.getHeight());
88              }
89          } else {
90              // vertical
91              if (top) {
92                  outerRect = new Rectangle(da.x, da.y, _outerRenderer.getHeight(), da.height);
93                  innerRect = new Rectangle(da.x+outerRect.width, da.y, _innerRenderer.getHeight(), da.height);
94              } else {
95                  // bottom
96                  innerRect = new Rectangle(da.x, da.y, _innerRenderer.getHeight(), da.height);
97                  outerRect = new Rectangle(da.x+innerRect.width, da.y, _outerRenderer.getHeight(), da.height);
98              }
99          }
100         
101         
102         Pair<Rectangle, Rectangle> result = new Pair<Rectangle, Rectangle>(outerRect, innerRect);
103         return result;
104     }
105     
106     
107     @Override
108     public int getHeight() {
109         return _outerRenderer.getHeight()+_innerRenderer.getHeight();
110     }
111 
112     @Override
113     public void dispose() {
114         _outerRenderer.dispose();
115         _innerRenderer.dispose();
116     }
117 
118     @Override
119     public TimeScaleRenderer createPrintRenderer(Printer printer) {
120         return new CombiningTimeScaleRenderer(_outerRenderer.createPrintRenderer(printer), _innerRenderer.createPrintRenderer(printer));
121     }
122 
123     /**
124      * {@inheritDoc}
125      */
126     public boolean supportsOptimizedScrolling() {
127         return _outerRenderer.supportsOptimizedScrolling() && _innerRenderer.supportsOptimizedScrolling();
128     }
129 
130     
131 }