1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package de.jaret.examples.timebars.pdi.swing;
21
22 import java.awt.BorderLayout;
23 import java.awt.Component;
24 import java.awt.datatransfer.DataFlavor;
25 import java.awt.datatransfer.Transferable;
26 import java.awt.dnd.DnDConstants;
27 import java.awt.dnd.DragGestureEvent;
28 import java.awt.dnd.DragGestureListener;
29 import java.awt.dnd.DropTarget;
30 import java.awt.dnd.DropTargetAdapter;
31 import java.awt.dnd.DropTargetDragEvent;
32 import java.awt.dnd.DropTargetDropEvent;
33 import java.awt.dnd.DropTargetEvent;
34 import java.awt.dnd.DropTargetListener;
35 import java.util.Iterator;
36 import java.util.List;
37
38 import javax.swing.JFrame;
39 import javax.swing.JSplitPane;
40
41 import de.jaret.examples.timebars.pdi.model.DispoModel;
42 import de.jaret.examples.timebars.pdi.model.Duty;
43 import de.jaret.examples.timebars.pdi.model.DutyMass;
44 import de.jaret.examples.timebars.pdi.model.PdiCalendar;
45 import de.jaret.examples.timebars.pdi.model.PdiDay;
46 import de.jaret.examples.timebars.pdi.model.Person;
47 import de.jaret.examples.timebars.pdi.model.PersonenDisposition;
48 import de.jaret.util.date.Interval;
49 import de.jaret.util.date.JaretDate;
50 import de.jaret.util.misc.FormatHelper;
51 import de.jaret.util.ui.timebars.TimeBarViewerSynchronizer;
52 import de.jaret.util.ui.timebars.model.TimeBarRow;
53 import de.jaret.util.ui.timebars.swing.TimeBarViewer;
54 import de.jaret.util.ui.timebars.swing.dnd.IntervalListTransferable;
55 import de.jaret.util.ui.timebars.swing.dnd.RowIntervalTuple;
56 import de.jaret.util.ui.timebars.swing.renderer.DefaultGapRenderer;
57
58 /***
59 * @author Peter Kliem
60 * @version $Id: PdiExample.java 426 2007-05-13 15:41:49Z olk $
61 */
62 public class PdiExample {
63 public static DutyMass _dutyMass;
64 public static DispoModel _dispoModel;
65 public static PdiCalendar _pdiCalendar;
66
67 public static void main(String[] args) {
68 JFrame f = new JFrame(PdiExample.class.getName());
69 f.setSize(1200, 700);
70 f.getContentPane().setLayout(new BorderLayout());
71 f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
72
73 createModels(200, 28, 240);
74
75
76 final TimeBarViewer tbv = new TimeBarViewer(_dispoModel, false, false);
77 tbv.setName("upper");
78 tbv.setTimeScalePosition(TimeBarViewer.TIMESCALE_POSITION_TOP);
79 tbv.setTimeScaleRenderer(new PdiTimeScaleRenderer(_pdiCalendar));
80 tbv.setHeaderRenderer(new PdiHeaderRenderer());
81 tbv.setGridRenderer(new PdiGridRenderer(_pdiCalendar));
82 tbv.setStartDate(new JaretDate());
83 tbv.setDrawRowGrid(true);
84 tbv.setTimeBarRenderer(new PdiRenderer());
85 tbv.setPixelPerSecond(200.0 / (24.0 * 60.0 * 60.0));
86 tbv.setGapRenderer(new DefaultGapRenderer());
87
88 TimeBarViewer tbv2 = new TimeBarViewer(_dutyMass.getTimeBarModel(null), false, false);
89 tbv2.setTimeScalePosition(TimeBarViewer.TIMESCALE_POSITION_NONE);
90 tbv2.setName("lower");
91 tbv2.setGridRenderer(new PdiGridRenderer(_pdiCalendar));
92 tbv2.setDrawRowGrid(true);
93 tbv2.setTimeBarRenderer(new PdiRenderer());
94 tbv2.setPixelPerSecond(200.0 / (24.0 * 60.0 * 60.0));
95 tbv2.setAdjustMinMaxDatesByModel(false);
96 tbv2.setMinDate(tbv.getMinDate());
97 tbv2.setMaxDate(tbv.getMaxDate());
98 tbv2.setStartDate(tbv.getStartDate());
99 tbv2.setYAxisWidth(tbv.getYAxisWidth());
100
101
102
103
104
105
106
107
108
109
110 DropTargetListener dtl = new ZuweisenDropTargetListener(tbv);
111 DropTarget dt = new DropTarget(tbv, dtl);
112
113
114 TimeBarViewerSynchronizer synchronizer = new TimeBarViewerSynchronizer(false, true, true);
115 synchronizer.addViewer(tbv);
116 synchronizer.addViewer(tbv2);
117
118 JSplitPane splitter = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
119 splitter.add(tbv);
120 splitter.add(tbv2);
121
122 f.getContentPane().add(splitter, BorderLayout.CENTER);
123
124
125 ControlPanel1 cp = new ControlPanel1(tbv, null, false);
126 f.getContentPane().add(cp, BorderLayout.NORTH);
127
128 ControlPanel2 cp2 = new ControlPanel2(tbv2, null);
129 f.getContentPane().add(cp2, BorderLayout.SOUTH);
130
131 f.setVisible(true);
132
133 splitter.setDividerLocation(0.5);
134
135 }
136
137 /***
138 *
139 */
140 public static void createModels(int personen, int tage, int diensteProTag) {
141 PdiCalendar kalender = createKalender(tage);
142 _pdiCalendar = kalender;
143 _dutyMass = createDienstMasse(kalender, diensteProTag);
144 _dispoModel = new DispoModel(kalender);
145 for (int i = 0; i < personen; i++) {
146 PersonenDisposition pd = createPersonenDispo(kalender);
147 _dispoModel.addPersonenDispo(pd);
148 }
149 }
150
151 /***
152 * @return
153 */
154 private static PersonenDisposition createPersonenDispo(PdiCalendar kalender) {
155 Person person = createPerson();
156 PersonenDisposition pd = new PersonenDisposition(kalender, person);
157 Iterator it = kalender.getTage().iterator();
158 int tcount = 1;
159 while (it.hasNext()) {
160 PdiDay tag = (PdiDay) it.next();
161 List dienste = _dutyMass.getDienste(tag);
162 Duty d = null;
163 for (int i = 0; d == null && i < 5; i++) {
164 Duty dd = (Duty) dienste.get((int) (dienste.size() * Math.random()));
165 if (dd.getAssignedTo() == null) {
166 if (pd.allowed(dd)) {
167 d = dd;
168 }
169 }
170 }
171 if (d != null) {
172 pd.addDienst(d);
173
174 }
175 }
176 return pd;
177 }
178
179 private static String[] orte = { "MSTH", "MOP", "MPH", "RL" };
180
181 /***
182 * @return
183 */
184 private static DutyMass createDienstMasse(PdiCalendar kalender, int diensteProTag) {
185 DutyMass dm = new DutyMass();
186 Iterator it = kalender.getTage().iterator();
187 int tcount = 1;
188 while (it.hasNext()) {
189 PdiDay tag = (PdiDay) it.next();
190 for (int i = 0; i < diensteProTag; i++) {
191 String dienstnr = FormatHelper.NFInt2Digits().format(tcount) + FormatHelper.NFInt2Digits().format(i);
192 JaretDate begin = tag.getDate().copy();
193 begin.advanceMinutes(Math.random() * 22 * 60);
194 JaretDate end = begin.copy();
195 end.advanceMinutes(3 * 60 + Math.random() * 60 * 8);
196 Duty d = new Duty(dienstnr, tag, begin, end);
197 d.setBeginOrt(orte[(int) (Math.random() * orte.length)]);
198 d.setEndeOrt(orte[(int) (Math.random() * orte.length)]);
199 d.setBezahlteZeitSeconds((int) (d.getEnd().diffSeconds(d.getBegin())));
200
201 dm.addDienst(tag, d);
202 }
203 tcount++;
204 }
205
206 return dm;
207 }
208
209 /***
210 * @param tage
211 * @return
212 */
213 private static PdiCalendar createKalender(int tage) {
214 PdiCalendar kalender = new PdiCalendar();
215 JaretDate date = new JaretDate();
216 date.setHours(0);
217 date.setMinutes(0);
218 date.setSeconds(0);
219 for (int i = 0; i < tage; i++) {
220 PdiDay tag = new PdiDay("BT" + date.getDayOfWeekString(), date.copy());
221 kalender.addTag(tag);
222 date.advanceDays(1);
223 }
224 return kalender;
225 }
226
227 static String[] vornamen = { "Peter", "Dieter", "Thomas", "Frank", "Oliver", "Ulf", "Jonathan", "Philipp",
228 "Norbert", "Josef", "Johannes", "Kathrin", "Jutta", "Stefan", "Martin", "Lukas", "Horst", "Gero", "Karsten" };
229 static String[] nachnamen = { "Mller", "Meier", "Hartmann", "Mildenberger", "Kliem", "Hilken", "Sieber", "Schulz",
230 "Scholz", "Koch", "Doe", "Schwedt", "Kanne", "Topf", "Stach", "Langenhan" };
231
232 static private Person createPerson() {
233 String name = vornamen[(int) (vornamen.length * Math.random())] + " "
234 + nachnamen[(int) (nachnamen.length * Math.random())];
235 Person person = new Person(name, "bhof");
236 return person;
237 }
238
239 static class TimeBarViewerDragGestureListener implements DragGestureListener {
240 public void dragGestureRecognized(DragGestureEvent e) {
241 Component c = e.getComponent();
242 System.out.println("component " + c);
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259 }
260 }
261
262 static class ZuweisenDropTargetListener extends DropTargetAdapter {
263 TimeBarViewer _tbv;
264
265 public ZuweisenDropTargetListener(TimeBarViewer tbv) {
266 _tbv = tbv;
267 }
268
269 public void dragOver(DropTargetDragEvent e) {
270 if (e.isDataFlavorSupported(IntervalListTransferable.intervalListFlavor)) {
271 TimeBarRow row = _tbv.rowForY(e.getLocation().y);
272 if (row != null && e.isDataFlavorSupported(IntervalListTransferable.intervalListFlavor)) {
273
274 if (row.getIntervals(_tbv.dateForX(e.getLocation().x)).size() == 0) {
275 _tbv.highlightRow(row);
276 e.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
277 return;
278 }
279 }
280 e.rejectDrag();
281 _tbv.deHighlightRow();
282 }
283 }
284
285 public void dragExit(DropTargetEvent dte) {
286 _tbv.deHighlightRow();
287 }
288
289 public void drop(DropTargetDropEvent e) {
290 try {
291 Transferable tr = e.getTransferable();
292 DataFlavor[] flavors = tr.getTransferDataFlavors();
293 PersonenDisposition pdispo = (PersonenDisposition) _tbv.rowForY(e.getLocation().y);
294 for (int i = 0; i < flavors.length; i++) {
295 if (flavors[i].equals(IntervalListTransferable.intervalListFlavor)) {
296
297 e.acceptDrop(e.getDropAction());
298 List l = (List) e.getTransferable()
299 .getTransferData(IntervalListTransferable.intervalListFlavor);
300 List intervals = ((RowIntervalTuple) l.get(0)).getIntervals();
301 Iterator it = intervals.iterator();
302 while (it.hasNext()) {
303 Interval interval = (Interval) it.next();
304 Duty d = (Duty) interval;
305 if (pdispo.allowed(d)) {
306 pdispo.addDienst(d);
307 }
308 }
309 _tbv.deHighlightRow();
310 e.dropComplete(true);
311 }
312 }
313 } catch (Throwable t) {
314 t.printStackTrace();
315 }
316 e.rejectDrop();
317 }
318 }
319
320 }