View Javadoc

1   /*
2    *  File: FzdTest.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.fzd.swing;
21  
22  import java.awt.BorderLayout;
23  import java.awt.event.ActionEvent;
24  
25  import javax.swing.AbstractAction;
26  import javax.swing.Action;
27  import javax.swing.JFrame;
28  import javax.swing.JPopupMenu;
29  import javax.swing.JScrollPane;
30  import javax.swing.JSplitPane;
31  import javax.swing.JTable;
32  
33  import de.jaret.examples.timebars.fzd.ctrl.FzdOperations;
34  import de.jaret.examples.timebars.fzd.model.Fahrt;
35  import de.jaret.examples.timebars.fzd.model.FahrtenTableModel;
36  import de.jaret.examples.timebars.fzd.model.Fahrzeug;
37  import de.jaret.examples.timebars.fzd.model.Umlauf;
38  import de.jaret.examples.timebars.fzd.model.UmlaufKette;
39  import de.jaret.examples.timebars.fzd.model.UmlaufKettenModel;
40  import de.jaret.examples.timebars.fzd.model.ZuteilungsModel;
41  import de.jaret.util.date.Interval;
42  import de.jaret.util.date.JaretDate;
43  import de.jaret.util.ui.timebars.TimeBarMarkerImpl;
44  import de.jaret.util.ui.timebars.TimeBarViewerSynchronizer;
45  import de.jaret.util.ui.timebars.model.TimeBarModel;
46  import de.jaret.util.ui.timebars.swing.TimeBarViewer;
47  
48  /***
49   * @author Peter Kliem
50   * @version $Id: FzdExample.java 791 2008-12-11 23:22:57Z kliem $
51   */
52  public class FzdExample {
53      public static UmlaufKettenModel _ukettenModel;
54      public static ZuteilungsModel _zuteilungsModel;
55  
56      public static void main(String[] args) {
57          JFrame f = new JFrame("FZD Test");
58          f.setSize(800, 600);
59          f.getContentPane().setLayout(new BorderLayout());
60          f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
61  
62          // fahrzeuge
63          TimeBarModel model = createFzdModel(10, 30, 24, 5);
64          TimeBarViewer tbv = new TimeBarViewer(model, true, false);
65          tbv.setDrawOverlapping(true);
66          tbv.setTimeScalePosition(TimeBarViewer.TIMESCALE_POSITION_BOTTOM);
67  
68          // register renderers for the intervals
69          tbv.registerTimeBarRenderer(Fahrt.class, new FahrtRenderer());
70          tbv.registerTimeBarRenderer(Umlauf.class, new UmlaufRenderer());
71          // header renderer
72          tbv.setHeaderRenderer(new FahrzeugInfoHeaderRenderer());
73          // umlaufketten
74          // TimeBarViewer tbv2 = new TimeBarViewer(model);
75          TimeBarViewer tbv2 = new TimeBarViewer(_ukettenModel);
76          tbv2.setDrawOverlapping(true);
77          // register renderers for the intervals
78          tbv2.registerTimeBarRenderer(Fahrt.class, new FahrtRenderer());
79          tbv2.registerTimeBarRenderer(Umlauf.class, new UmlaufRenderer());
80  
81          tbv2.setYAxisWidth(tbv.getYAxisWidth());
82  
83          // synchronize the TimeBarViewers by a synchronizer
84          TimeBarViewerSynchronizer synchronizer = new TimeBarViewerSynchronizer(false, true, true);
85          synchronizer.addViewer(tbv);
86          synchronizer.addViewer(tbv2);
87  
88          JSplitPane splitter = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
89          splitter.add(tbv);
90          splitter.add(tbv2);
91          f.getContentPane().add(splitter, BorderLayout.CENTER);
92  
93          // marker
94          JaretDate date = new JaretDate();
95          date.advanceHours(1);
96          TimeBarMarkerImpl marker = new TimeBarMarkerImpl(true, date);
97          tbv.addMarker(marker);
98          tbv2.addMarker(marker);
99  
100         // now marker (marker will move with the tie)
101         // final TimeBarNowMarker nowMarker;
102         // nowMarker = new TimeBarNowMarker();
103         // tbv.addMarker(nowMarker);
104 
105         // add the control panel fahrzeuge
106         ControlPanel cp = new ControlPanel(tbv, marker);
107         f.getContentPane().add(cp, BorderLayout.NORTH);
108         // add the control panel ketten
109         ControlPanel2 cp2 = new ControlPanel2(tbv2);
110         f.getContentPane().add(cp2, BorderLayout.SOUTH);
111 
112         f.setVisible(true);
113 
114         splitter.setDividerLocation(0.5);
115 
116         // Action : brutal eingehängt!
117         FzdExample x = new FzdExample();
118         Action action = x.new AssignAction(_ukettenModel, tbv, tbv2);
119         final JPopupMenu pop = new JPopupMenu("Operations");
120         pop.add(action);
121         tbv.registerPopupMenu(Interval.class, pop);
122         // additional table
123         final JFrame tableFrame = new JFrame("Current fahrten");
124         tableFrame.setBounds(200, 200, 200, 200);
125         tableFrame.getContentPane().setLayout(new BorderLayout());
126         FahrtenTableModel tmodel = new FahrtenTableModel((ZuteilungsModel) model, marker);
127         JTable table = new JTable(tmodel);
128         JScrollPane scroll = new JScrollPane(table);
129         tableFrame.getContentPane().add(scroll, BorderLayout.CENTER);
130         tableFrame.setVisible(true);
131 
132         // dispose timebar now marker
133         // f.addWindowListener(new WindowAdapter() {
134         // public void windowClosed(WindowEvent e) {
135         // tableFrame.dispose();
136         // if (nowMarker != null) {
137         // nowMarker.stop();
138         // }
139         // }
140         // });
141 
142     }
143 
144     public static ZuteilungsModel createFzdModel(int fahrzeugAnzahl, int averageLengthInMinutes, int countPerUmlauf,
145             int umlaufCount) {
146         ZuteilungsModel model = new ZuteilungsModel();
147         _ukettenModel = new UmlaufKettenModel();
148         int row;
149         for (row = 0; row < fahrzeugAnzahl; row++) {
150             Fahrzeug fahrzeug = new Fahrzeug("4230" + row);
151             UmlaufKette kette = new UmlaufKette("kette " + row);
152             int km = (int) (Math.random() * 1000);
153             fahrzeug.getFahrzeugInfo().setKilometer(km);
154             JaretDate date = new JaretDate();
155             for (int i = 0; i < umlaufCount; i++) {
156                 Umlauf umlauf = new Umlauf("U-" + row + "-" + i);
157                 for (int f = 0; f < countPerUmlauf; f++) {
158                     Fahrt fahrt = new Fahrt("MSTH", "MSTH", "F-" + umlauf.getUmlaufbezeichnug() + ":" + f);
159                     int length = averageLengthInMinutes / 2 + (int) (Math.random() * (double) averageLengthInMinutes);
160                     fahrt.setBegin(date.copy());
161                     date.advanceMinutes(length);
162                     fahrt.setEnd(date.copy());
163 
164                     umlauf.addFahrt(fahrt);
165                     fahrt.setUmlauf(umlauf);
166 
167                     int pause = (int) (Math.random() * (double) averageLengthInMinutes / 5);
168                     date.advanceMinutes(pause);
169                 }
170                 fahrzeug.addUmlauf(umlauf);
171                 kette.addUmlauf(umlauf);
172                 date.advanceMinutes(120);
173             }
174             model.addFahrzeug(fahrzeug);
175             _ukettenModel.addUmlaufKette(kette);
176         }
177         // leere Fahrzeuge
178         int addFahrzeuge = 5;
179         for (; row < fahrzeugAnzahl + addFahrzeuge; row++) {
180             Fahrzeug fahrzeug = new Fahrzeug("4230" + row);
181             int km = (int) (Math.random() * 1000);
182             fahrzeug.getFahrzeugInfo().setKilometer(km);
183             model.addFahrzeug(fahrzeug);
184         }
185         // nicht zugeteilte Umläufe und Ketten
186         int additionalKetten = 5;
187         for (row = 0; row < additionalKetten; row++) {
188             UmlaufKette kette = new UmlaufKette("Zuskette " + row);
189             JaretDate date = new JaretDate();
190             for (int i = 0; i < umlaufCount; i++) {
191                 Umlauf umlauf = new Umlauf("U-" + row + "-" + i);
192                 for (int f = 0; f < countPerUmlauf; f++) {
193                     Fahrt fahrt = new Fahrt("MSTH", "MSTH", "F-" + umlauf.getUmlaufbezeichnug() + ":" + f);
194                     int length = averageLengthInMinutes / 2 + (int) (Math.random() * (double) averageLengthInMinutes);
195                     fahrt.setBegin(date.copy());
196                     date.advanceMinutes(length);
197                     fahrt.setEnd(date.copy());
198 
199                     umlauf.addFahrt(fahrt);
200                     fahrt.setUmlauf(umlauf);
201 
202                     int pause = (int) (Math.random() * (double) averageLengthInMinutes / 5);
203                     date.advanceMinutes(pause);
204                 }
205                 kette.addUmlauf(umlauf);
206                 date.advanceMinutes(120);
207             }
208             _ukettenModel.addUmlaufKette(kette);
209         }
210 
211         System.out.println("Created " + ((fahrzeugAnzahl + additionalKetten) * countPerUmlauf * umlaufCount)
212                 + " Intervals");
213         _zuteilungsModel = model;
214         return model;
215     }
216 
217     class AssignAction extends AbstractAction {
218         UmlaufKettenModel _kettenModel;
219         TimeBarViewer _fahrzeugViewer;
220         TimeBarViewer _kettenViewer;
221 
222         /***
223          * @param kettenModel
224          * @param fahrzeugViewer
225          * @param kettenViewer
226          */
227         public AssignAction(UmlaufKettenModel kettenModel, TimeBarViewer fahrzeugViewer, TimeBarViewer kettenViewer) {
228             _kettenModel = kettenModel;
229             _fahrzeugViewer = fahrzeugViewer;
230             _kettenViewer = kettenViewer;
231             putValue(NAME, "Assign vehicle");
232         }
233 
234         /*
235          * (non-Javadoc)
236          * 
237          * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
238          */
239         public void actionPerformed(ActionEvent e) {
240             Umlauf u;
241             if (_kettenViewer.getSelectionModel().getSelectedIntervals().size() == 1) {
242                 Interval i = (Interval) _kettenViewer.getSelectionModel().getSelectedIntervals().get(0);
243                 if (!(i instanceof Umlauf)) {
244                     System.out.println("need exactly one selected umlauf");
245                     return;
246                 } else {
247                     u = (Umlauf) i;
248                 }
249             } else {
250                 System.out.println("need exactly one selected umlauf");
251                 return;
252             }
253             UmlaufKette kette = _kettenModel.getKetteForUmlauf(u);
254             if (kette == null) {
255                 throw new RuntimeException("Kette not found");
256             }
257 
258             if (_fahrzeugViewer.getSelectionModel().getSelectedRows().size() != 1) {
259                 System.out.println("need exactly one selected fahrzeug");
260                 return;
261             }
262             Fahrzeug f = (Fahrzeug) _fahrzeugViewer.getSelectionModel().getSelectedRows().get(0);
263             FzdOperations.assign(_kettenModel, kette, u, f);
264         }
265 
266     }
267 
268 }