View Javadoc

1   /*
2    *  File: PdiExample.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.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          // createModels(20, 10, 20);
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          // Dienste ohne dispo info
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         // DragSource dragSource = DragSource.getDefaultDragSource();
102         // DragGestureListener dgl = new TimeBarViewerDragGestureListener();
103         // DragGestureRecognizer dgr =
104         // dragSource.createDefaultDragGestureRecognizer(tbv2._diagram,
105         // DnDConstants.ACTION_MOVE, dgl);
106         /*
107          * DropTargetListener dtl = new TimeBarDropTargetListener(); DropTarget
108          * dt = new DropTarget(this, dtl);
109          */
110         DropTargetListener dtl = new ZuweisenDropTargetListener(tbv);
111         DropTarget dt = new DropTarget(tbv, dtl);
112 
113         // synchronize the TimeBarViewers by a synchronizer
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         // f.getContentPane().add(tbv, BorderLayout.CENTER);
122         f.getContentPane().add(splitter, BorderLayout.CENTER);
123 
124         // add the control panel
125         ControlPanel1 cp = new ControlPanel1(tbv, null, false);
126         f.getContentPane().add(cp, BorderLayout.NORTH);
127         // add the control panel ketten
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                 // System.out.println("dienst "+d.toString());
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             // TimeeBarViewer tbv = (D)
244             /*
245              * TimeBarViewer tbv = (TimeBarViewer) ((Diagram) c)._timeBarViewer;
246              * TimeBarSelectionModel selModel = tbv.getSelectionModel(); if
247              * (selModel.hasIntervalSelection()) { List l =
248              * selModel.getSelectedIntervals(); List rowIntervalTuples =
249              * buildRowIntervalTuples(l);
250              * 
251              * IntervalListTransferable ilt = new
252              * IntervalListTransferable(rowIntervalTuples); e.startDrag(null,
253              * ilt); } else { // nothing to drag System.out.println("nothing to
254              * drag"); } } private List buildRowIntervalTuples(List l) { List
255              * rowIntervalTuples = new ArrayList(); List list = new
256              * ArrayList(l); RowIntervalTuple tuple = new RowIntervalTuple(null,
257              * list); rowIntervalTuples.add(tuple); return rowIntervalTuples; }
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                     // the transferable is not
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                         // e.rejectDrop();
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 }