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.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
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
69 tbv.registerTimeBarRenderer(Fahrt.class, new FahrtRenderer());
70 tbv.registerTimeBarRenderer(Umlauf.class, new UmlaufRenderer());
71
72 tbv.setHeaderRenderer(new FahrzeugInfoHeaderRenderer());
73
74
75 TimeBarViewer tbv2 = new TimeBarViewer(_ukettenModel);
76 tbv2.setDrawOverlapping(true);
77
78 tbv2.registerTimeBarRenderer(Fahrt.class, new FahrtRenderer());
79 tbv2.registerTimeBarRenderer(Umlauf.class, new UmlaufRenderer());
80
81 tbv2.setYAxisWidth(tbv.getYAxisWidth());
82
83
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
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
101
102
103
104
105
106 ControlPanel cp = new ControlPanel(tbv, marker);
107 f.getContentPane().add(cp, BorderLayout.NORTH);
108
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
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
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
133
134
135
136
137
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
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
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
236
237
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 }