View Javadoc

1   /*
2    *  File: PdiRenderer.java 
3    *  Copyright (c) 2004-2007  Peter Kliem (Peter.Kliem@jaret.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.examples.timebars.pdi.swing;
21  
22  import java.awt.Color;
23  import java.awt.Graphics;
24  import java.awt.Rectangle;
25  import java.awt.event.MouseEvent;
26  import java.util.Iterator;
27  
28  import javax.swing.JComponent;
29  
30  import de.jaret.examples.timebars.pdi.model.Assignment;
31  import de.jaret.examples.timebars.pdi.model.Duty;
32  import de.jaret.examples.timebars.pdi.model.Taetigkeit;
33  import de.jaret.util.date.Interval;
34  import de.jaret.util.date.JaretDateFormatter;
35  import de.jaret.util.swing.GraphicsHelper;
36  import de.jaret.util.ui.timebars.TimeBarViewerDelegate;
37  import de.jaret.util.ui.timebars.swing.TimeBarViewer;
38  import de.jaret.util.ui.timebars.swing.renderer.TimeBarRenderer;
39  
40  public class PdiRenderer implements TimeBarRenderer {
41      DienstRenderer _component = new DienstRenderer();
42  
43      /***
44       * {@inheritDoc}
45       */
46      public JComponent getTimeBarRendererComponent(TimeBarViewer tbv, Interval value, boolean isSelected, boolean overlapping) {
47          if (value instanceof Assignment) {
48              _component.setDienst((Taetigkeit) ((Assignment) value).getTaetigkeit());
49          } else {
50              _component.setDienst((Duty) value);
51          }
52          _component.setSelected(isSelected);
53          return _component;
54      }
55  
56      class DienstRenderer extends JComponent {
57          Taetigkeit _taetigkeit;
58          boolean _selected;
59  
60          public DienstRenderer() {
61              setLayout(null);
62              setOpaque(false);
63          }
64  
65          public void setDienst(Taetigkeit t) {
66              _taetigkeit = t;
67          }
68  
69          /***
70           * {@inheritDoc}
71           */
72          public String getToolTipText() {
73              if (_taetigkeit instanceof Duty) {
74                  Duty dienst = (Duty) _taetigkeit;
75                  return "<html><b>"
76                          + dienst.getDienstNr()
77                          + "</b><br/"
78                          + _taetigkeit.getBegin().toDisplayString()
79                          + " - "
80                          + _taetigkeit.getEnd().toDisplayString()
81                          + "<br/ Az.:"
82                          + JaretDateFormatter.secondsToDisplayString(_taetigkeit.getEnd().diffSeconds(
83                                  _taetigkeit.getBegin())) + "</html>";
84              } else {
85                  return "<html><b>" + "Ttigkeit" + "</b><br/" + _taetigkeit.getBegin().toDisplayString() + " - "
86                          + _taetigkeit.getEnd().toDisplayString() + "</html>";
87              }
88          }
89  
90          public void setSelected(boolean selected) {
91              _selected = selected;
92          }
93  
94          /***
95           * {@inheritDoc}
96           */
97          protected void paintComponent(Graphics g) {
98              super.paintComponent(g);
99              int height = getHeight();
100             int width = getWidth();
101 
102             int y = height / 3;
103             int bheight = height / 3;
104             int yEnd = y + bheight;
105 
106             // balken
107             if (_selected) {
108                 g.setColor(Color.BLUE);
109             } else {
110                 g.setColor(Color.LIGHT_GRAY);
111             }
112             // body
113             g.fillRect(0, y, width - 1, bheight);
114             // Ecke falls Probleme vorhanden sind
115             if (_taetigkeit.getProbleme() != null && _taetigkeit.getProbleme().size() != 0) {
116                 g.setColor(Color.RED);
117                 g.fillRect(width - 1 - bheight / 2, y, bheight / 2, bheight / 2);
118             }
119             // Rahmen
120             g.setColor(Color.BLACK);
121             g.drawRect(0, y, width - 1, bheight);
122 
123             // store the containing rectangle in a client property
124             Rectangle containingRect = new Rectangle(0 + getX(), y + getY(), width - 1, bheight);
125             putClientProperty(CONTAINING_RECTANGLE, containingRect);
126 
127             String name;
128             if (_taetigkeit instanceof Duty) {
129                 name = ((Duty) _taetigkeit).getDienstNr();
130             } else {
131                 name = "Ttigkeit";
132             }
133 
134             int twidth = GraphicsHelper.getStringDrawingWidth(g, name);
135             // Balkenbeschriftung nur wenn sie passt
136             if (getWidth() > twidth + 2) {
137                 GraphicsHelper.drawStringCenteredVCenter(g, name, 0, width, height / 2);
138             }
139 
140             // beginn- und endeort
141             // g.drawString(_fahrt.getBeginOrt(), 0,y);
142             // GraphicsHelper.drawStringRightAlignedVTop(g, _fahrt.getEndeOrt(),
143             // width-1, yEnd);
144 
145         }
146 
147         /*
148          * (non-Javadoc)
149          * 
150          * @see java.awt.Component#setBounds(int, int, int, int)
151          */
152         public void setBounds(int x, int y, int width, int height) {
153             super.setBounds(x, y, width, height);
154             // store the containing rectangle in a client property
155             int bheight = height / 3;
156             int ys = height / 3;
157             Rectangle containingRect = new Rectangle(x, ys + y, width - 1, bheight);
158             putClientProperty(CONTAINING_RECTANGLE, containingRect);
159         }
160 
161         /*
162          * (non-Javadoc)
163          * 
164          * @see javax.swing.JComponent#getToolTipText(java.awt.event.MouseEvent)
165          */
166         public String getToolTipText(MouseEvent event) {
167             if (_taetigkeit.getProbleme() == null || _taetigkeit.getProbleme().size() == 0) {
168                 return super.getToolTipText(event);
169             } else {
170                 int bheight = getHeight() / 3;
171                 int y = getHeight() / 3;
172                 if (event.getX() >= getWidth() - 1 - bheight / 2 && event.getY() >= y
173                         && event.getY() <= y + bheight / 2) {
174                     return problemTT();
175                 } else {
176                     return getToolTipText();
177                 }
178             }
179         }
180 
181         /***
182          * @return
183          */
184         private String problemTT() {
185             StringBuffer buf = new StringBuffer();
186             buf.append("<html>");
187             Iterator it = _taetigkeit.getProbleme().iterator();
188             while (it.hasNext()) {
189                 String problem = (String) it.next();
190                 buf.append(problem);
191                 if (it.hasNext()) {
192                     buf.append("</br");
193                 }
194             }
195 
196             buf.append("</html>");
197             return buf.toString();
198         }
199 
200         /*
201          * (non-Javadoc)
202          * 
203          * @see javax.swing.JComponent#contains(int, int)
204          */
205         public boolean contains(int x, int y) {
206             if (y >= getHeight() / 3 && y <= getHeight() / 3 + getHeight() / 3) {
207                 return true;
208             } else {
209                 return false;
210             }
211         }
212     }
213     /***
214      * {@inheritDoc} Simple default implementation.
215      */
216 	public Rectangle getPreferredDrawingBounds(Rectangle intervalDrawingArea,
217 			TimeBarViewerDelegate delegate, Interval interval,
218 			boolean selected, boolean overlap) {
219 		return intervalDrawingArea;
220 	}
221 
222 }