1 /* ******************************************************************** **
2 ** Copyright notice **
3 ** **
4 ** (c) 2003 WiSim Development Team **
5 ** http://wisim.sourceforge.net/ **
6 ** **
7 ** All rights reserved **
8 ** **
9 ** This script is part of the WiSim Business Game project. The WiSim **
10 ** project is free software; you can redistribute it and/or modify **
11 ** it under the terms of the GNU General Public License as published by **
12 ** the Free Software Foundation; either version 2 of the License, or **
13 ** (at your option) any later version. **
14 ** **
15 ** The GNU General Public License can be found at **
16 ** http://www.gnu.org/copyleft/gpl.html. **
17 ** A copy is found in the textfile GPL.txt and important notices to the **
18 ** license from the team is found in the textfile LICENSE.txt distributed **
19 ** in these package. **
20 ** **
21 ** This copyright notice MUST APPEAR in all copies of the file! **
22 ** ******************************************************************** */
23
24 /*
25 * JPanelSimulationStart.java
26 *
27 * Created on 17. M?rz 2003, 14:55
28 */
29
30 package net.sourceforge.wisim.controller;
31 import net.sourceforge.wisim.dao;
32 import net.sourceforge.wisim.model;
33 import javax.swing.tree;
34 import javax.swing.plaf.metal;
35 import java.util;
36 import java.sql.Date;
37 import javax.swing;
38 import javax.swing.event;
39 import java.text.DateFormat;
40
41 /** In diesem Fenster kann der Benutzer die Simulation starten. Ereignisse (z.B.
42 * eingehende Lieferungen, produzierte Hubs, versendete Hubs) werden angezeigt.
43 * @author benjamin.pasero
44 */
45 public class JPanelSimulationStart extends javax.swing.JPanel {
46 private WiSimDAO dao;
47 private ActualTime actTime;
48 private CoreTime coreTime;
49 private UpdateSimulationsauswertung updateSimulationsauswertung;
50 private UpdateLagerThread updateLagerThread;
51 private int faktor;
52 private Date actDate;
53 private int hubBestand;
54 private Vector artikelLagerElemente;
55 private Hashtable stueckliste;
56 private Collection vertraege;
57 private GregorianCalendar actDateGC;
58 private GregorianCalendar lieferDateGC;
59 private GregorianCalendar gc;
60 private DateFormat df;
61 private boolean beendeNachEinerWoche;
62 private boolean isActive;
63 private int actDay;
64
65 //Treepath der JTrees werden gespeichert
66 private Set treepathsEinkauf;
67 private Set treepathsVertrieb;
68 private Set treepathsProduktion;
69
70 // Simulation der Produktion
71 private WiSimMainController wiSimMainController;
72 private ProduktionsController runController;
73 private ProduktionsSimulationThread[] threads;
74
75 // Dauer einer Zeiteinheit f?r die gesamte Simulation
76 public final static int TIMESTEP = 100;
77
78 // IconNodes als Elemente der JTrees
79 private IconNode rootNodeLieferungen;
80 private IconNode rootNodeVertrieb;
81 private IconNode rootNodeProduktion;
82 private IconNode dateNode;
83 private IconNode lieferantNode;
84 private IconNode positionNode;
85 private IconNode hubProduktionNode;
86 private IconNode hubEinzelteilVerbrauch;
87 private IconNode hubVertrieb;
88 private IconNode hubVertriebPos;
89
90 // Icons f?r einzelene Elemente der JTrees
91 private ImageIcon rightIcon;
92 private ImageIcon vanIcon;
93 private ImageIcon boxIcon;
94 private ImageIcon hubIcon;
95 private ImageIcon boxOpenIcon;
96 private ImageIcon errorIcon;
97
98 //Logger
99 private WiSimLogger wiSimLogger;
100
101 /** Creates new form JPanelSimulationStart
102 * @param wiSimMainController
103 */
104 public JPanelSimulationStart(WiSimMainController wiSimMainController) {
105 this.wiSimMainController = wiSimMainController;
106 wiSimLogger = wiSimMainController.getWiSimLogger();
107 initDAO(wiSimMainController);
108 actTime = new ActualTime();
109 actDay = 0;
110 this.wiSimMainController = wiSimMainController;
111 faktor = 1;
112 actDate = new Date(new GregorianCalendar(2003, 8, 1, 0, 0).getTimeInMillis());
113 hubBestand = 0;
114 artikelLagerElemente = new Vector();
115 stueckliste = new Hashtable();
116 vertraege = new Vector();
117
118 actDateGC = new GregorianCalendar();
119 lieferDateGC = new GregorianCalendar();
120 gc = new GregorianCalendar();
121
122 df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT, Locale.GERMANY);
123
124 beendeNachEinerWoche = false;
125 isActive = false;
126
127 //Synchronisierte HashSets
128 treepathsEinkauf = Collections.synchronizedSet(new HashSet());
129 treepathsVertrieb = Collections.synchronizedSet(new HashSet());
130 treepathsProduktion = Collections.synchronizedSet(new HashSet());
131
132 //Icon Grafiken
133 rightIcon = new ImageIcon(getClass().getResource("/icons/right.gif"));
134 vanIcon = new ImageIcon(getClass().getResource("/icons/van.gif"));
135 boxIcon = new ImageIcon(getClass().getResource("/icons/box.gif"));
136 hubIcon = new ImageIcon(getClass().getResource("/icons/hub.gif"));
137 boxOpenIcon = new ImageIcon(getClass().getResource("/icons/boxopen.gif"));
138 errorIcon = new ImageIcon(getClass().getResource("/icons/error.gif"));
139
140 // Initialisierung der IconNodes
141 rootNodeLieferungen = new IconNode("");
142 rootNodeVertrieb = new IconNode("");
143 rootNodeProduktion = new IconNode("");
144 rootNodeLieferungen.setIcon(MetalIconFactory.getFileChooserHomeFolderIcon());
145 rootNodeVertrieb.setIcon(MetalIconFactory.getFileChooserHomeFolderIcon());
146 rootNodeProduktion.setIcon(MetalIconFactory.getFileChooserHomeFolderIcon());
147
148 initComponents();
149 initializeCollections();
150 addJTreeListener();
151 }
152
153 private void initDAO(WiSimMainController wiSimMainController) {
154 dao = wiSimMainController.getDAO();
155 }
156
157 /** This method is called from within the constructor to
158 * initialize the form.
159 * WARNING: Do NOT modify this code. The content of this method is
160 * always regenerated by the Form Editor.
161 */
162 private void initComponents() {//GEN-BEGIN:initComponents
163 jLabelSimulation = new javax.swing.JLabel();
164 jButtonReset = new javax.swing.JButton();
165 jTextFieldDatum = new javax.swing.JTextField();
166 DateFormat justDate = DateFormat.getDateInstance(DateFormat.FULL, Locale.GERMANY);
167 jTextFieldDatum.setText(justDate.format(actDate));
168 jLabelDatum = new javax.swing.JLabel();
169 jToggleButtonStartStop = new javax.swing.JToggleButton();
170 jLabelSimStartStop = new javax.swing.JLabel();
171 jTabbedPaneSimulationsverlauf = new javax.swing.JTabbedPane();
172 jScrollPaneTreeHolderEinkauf = new javax.swing.JScrollPane();
173 jTreeEinkauf = new javax.swing.JTree();
174 jTreeEinkauf.setModel(null);
175 jScrollPaneTreeHolderProduktion = new javax.swing.JScrollPane();
176 jTreeProduktion = new javax.swing.JTree();
177 jTreeProduktion.setModel(null);
178 jScrollPaneTreeHolderVertrieb = new javax.swing.JScrollPane();
179 jTreeVertrieb = new javax.swing.JTree();
180 jTreeVertrieb.setModel(null);
181 jPanelControll = new javax.swing.JPanel();
182 jLabelZeitfaktor = new javax.swing.JLabel();
183 jComboBoxZeitfaktor = new javax.swing.JComboBox();
184 jCheckBoxEineWoche = new javax.swing.JCheckBox();
185
186 setLayout(null);
187
188 addAncestorListener(new javax.swing.event.AncestorListener() {
189 public void ancestorMoved(javax.swing.event.AncestorEvent evt) {
190 }
191 public void ancestorAdded(javax.swing.event.AncestorEvent evt) {
192 formAncestorAdded(evt);
193 }
194 public void ancestorRemoved(javax.swing.event.AncestorEvent evt) {
195 formAncestorRemoved(evt);
196 }
197 });
198
199 jLabelSimulation.setFont(new java.awt.Font("Dialog", 1, 24));
200 jLabelSimulation.setText("Simulation");
201 add(jLabelSimulation);
202 jLabelSimulation.setBounds(350, 10, 130, 30);
203
204 jButtonReset.setText("Reset");
205 jButtonReset.addActionListener(new java.awt.event.ActionListener() {
206 public void actionPerformed(java.awt.event.ActionEvent evt) {
207 jButtonResetActionPerformed(evt);
208 }
209 });
210
211 add(jButtonReset);
212 jButtonReset.setBounds(530, 90, 100, 30);
213
214 jTextFieldDatum.setEditable(false);
215 jTextFieldDatum.setFont(new java.awt.Font("Dialog", 0, 18));
216 jTextFieldDatum.setHorizontalAlignment(javax.swing.JTextField.CENTER);
217 add(jTextFieldDatum);
218 jTextFieldDatum.setBounds(300, 50, 330, 30);
219
220 jLabelDatum.setFont(new java.awt.Font("Dialog", 1, 18));
221 jLabelDatum.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
222 jLabelDatum.setText("Datum");
223 add(jLabelDatum);
224 jLabelDatum.setBounds(230, 50, 60, 30);
225
226 jToggleButtonStartStop.setFont(new java.awt.Font("Dialog", 1, 24));
227 jToggleButtonStartStop.setIcon(new javax.swing.ImageIcon(""));
228 jToggleButtonStartStop.setText("Start");
229 jToggleButtonStartStop.addActionListener(new java.awt.event.ActionListener() {
230 public void actionPerformed(java.awt.event.ActionEvent evt) {
231 jToggleButtonStartStopActionPerformed(evt);
232 }
233 });
234
235 add(jToggleButtonStartStop);
236 jToggleButtonStartStop.setBounds(230, 90, 290, 30);
237
238 jLabelSimStartStop.setFont(new java.awt.Font("Dialog", 1, 14));
239 jLabelSimStartStop.setForeground(new java.awt.Color(0, 204, 51));
240 jLabelSimStartStop.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
241 add(jLabelSimStartStop);
242 jLabelSimStartStop.setBounds(230, 120, 290, 30);
243
244 jTabbedPaneSimulationsverlauf.setFont(new java.awt.Font("Dialog", 0, 14));
245 jTreeEinkauf.setFont(new java.awt.Font("Arial", 0, 14));
246 jScrollPaneTreeHolderEinkauf.setViewportView(jTreeEinkauf);
247
248 jTabbedPaneSimulationsverlauf.addTab(" Einkauf ", new javax.swing.ImageIcon(""), jScrollPaneTreeHolderEinkauf);
249
250 jTreeProduktion.setFont(new java.awt.Font("Arial", 0, 14));
251 jScrollPaneTreeHolderProduktion.setViewportView(jTreeProduktion);
252
253 jTabbedPaneSimulationsverlauf.addTab(" Produktion ", jScrollPaneTreeHolderProduktion);
254
255 jTreeVertrieb.setFont(new java.awt.Font("Arial", 0, 14));
256 jScrollPaneTreeHolderVertrieb.setViewportView(jTreeVertrieb);
257
258 jTabbedPaneSimulationsverlauf.addTab(" Vetrieb ", jScrollPaneTreeHolderVertrieb);
259
260 add(jTabbedPaneSimulationsverlauf);
261 jTabbedPaneSimulationsverlauf.setBounds(20, 150, 750, 360);
262
263 jPanelControll.setLayout(null);
264
265 jPanelControll.setBorder(new javax.swing.border.TitledBorder("Konfiguration"));
266 jLabelZeitfaktor.setFont(new java.awt.Font("Dialog", 1, 14));
267 jLabelZeitfaktor.setText("Zeitfaktor");
268 jPanelControll.add(jLabelZeitfaktor);
269 jLabelZeitfaktor.setBounds(20, 30, 80, 19);
270
271 jComboBoxZeitfaktor.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1X", "1/2X", "1/4X", "1/8X", "1/16X" }));
272 jComboBoxZeitfaktor.addActionListener(new java.awt.event.ActionListener() {
273 public void actionPerformed(java.awt.event.ActionEvent evt) {
274 jComboBoxZeitfaktorActionPerformed(evt);
275 }
276 });
277
278 jPanelControll.add(jComboBoxZeitfaktor);
279 jComboBoxZeitfaktor.setBounds(100, 30, 70, 20);
280
281 jCheckBoxEineWoche.setText("Beende nach 1 Woche");
282 jCheckBoxEineWoche.addActionListener(new java.awt.event.ActionListener() {
283 public void actionPerformed(java.awt.event.ActionEvent evt) {
284 jCheckBoxEineWocheActionPerformed(evt);
285 }
286 });
287
288 jPanelControll.add(jCheckBoxEineWoche);
289 jCheckBoxEineWoche.setBounds(20, 60, 160, 24);
290
291 add(jPanelControll);
292 jPanelControll.setBounds(20, 50, 190, 90);
293
294 }//GEN-END:initComponents
295
296 private void formAncestorRemoved(javax.swing.event.AncestorEvent evt) {//GEN-FIRST:event_formAncestorRemoved
297 setIsActive(false);
298 }//GEN-LAST:event_formAncestorRemoved
299
300 private void formAncestorAdded(javax.swing.event.AncestorEvent evt) {//GEN-FIRST:event_formAncestorAdded
301 setIsActive(true);
302 }//GEN-LAST:event_formAncestorAdded
303
304 private void jCheckBoxEineWocheActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxEineWocheActionPerformed
305 if (jCheckBoxEineWoche.getSelectedObjects().length > 0) {
306 beendeNachEinerWoche = true;
307 } else {
308 beendeNachEinerWoche = false;
309 }
310 }//GEN-LAST:event_jCheckBoxEineWocheActionPerformed
311
312 private void jToggleButtonStartStopActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButtonStartStopActionPerformed
313 startStopSimulation();
314 }//GEN-LAST:event_jToggleButtonStartStopActionPerformed
315
316 private void jComboBoxZeitfaktorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jComboBoxZeitfaktorActionPerformed
317 faktor = jComboBoxZeitfaktor.getSelectedIndex()+1;
318 }//GEN-LAST:event_jComboBoxZeitfaktorActionPerformed
319
320 private void jButtonResetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonResetActionPerformed
321 resetFields();
322
323 int i = JOptionPane.showConfirmDialog(this, "Achtung! Es wird empfohlen die Datenbank auch zu resetten!", "Reset", JOptionPane.YES_NO_OPTION);
324
325 if (i == 0) {
326 JPanelOptions jPanelOptions = (JPanelOptions) wiSimMainController.getActions().get("Options");
327 jPanelOptions.einlesenQueries();
328 JOptionPane.showMessageDialog(this, "Die Datenbank wurde resettet!");
329 }
330 }//GEN-LAST:event_jButtonResetActionPerformed
331
332 // Variables declaration - do not modify//GEN-BEGIN:variables
333 private javax.swing.JButton jButtonReset;
334 private javax.swing.JCheckBox jCheckBoxEineWoche;
335 private javax.swing.JComboBox jComboBoxZeitfaktor;
336 private javax.swing.JLabel jLabelDatum;
337 private javax.swing.JLabel jLabelSimStartStop;
338 private javax.swing.JLabel jLabelSimulation;
339 private javax.swing.JLabel jLabelZeitfaktor;
340 private javax.swing.JPanel jPanelControll;
341 private javax.swing.JScrollPane jScrollPaneTreeHolderEinkauf;
342 private javax.swing.JScrollPane jScrollPaneTreeHolderProduktion;
343 private javax.swing.JScrollPane jScrollPaneTreeHolderVertrieb;
344 private javax.swing.JTabbedPane jTabbedPaneSimulationsverlauf;
345 private javax.swing.JTextField jTextFieldDatum;
346 private javax.swing.JToggleButton jToggleButtonStartStop;
347 private javax.swing.JTree jTreeEinkauf;
348 private javax.swing.JTree jTreeProduktion;
349 private javax.swing.JTree jTreeVertrieb;
350 // End of variables declaration//GEN-END:variables
351
352 /** Baut den JTree mit einer Liste aller Lieferungen auf. F?gt die gelieferten
353 * Einzelteile au?erdem in die Datenbank.
354 */
355 public void refreshJTreeEinkauf() {
356 actDay++;
357 Collection etatListe = new Vector();
358 Collection etatListeHeute = new Vector();
359
360 //Liste aller Einzelteilauftr?ge
361 try {
362 etatListe = dao.getEinzelteilauftraege();
363 } catch (WiSimDAOException e) {
364 wiSimLogger.log("refreshJTreeEinkauf()", e);
365 }
366
367 actDateGC.setTimeInMillis(actDate.getTime());
368
369 //Neuer Node im JTree
370 dateNode = new IconNode(actDateGC.get(5) + "." + (actDateGC.get(2) + 1) + "." + actDateGC.get(1));
371 dateNode.setIcon(rightIcon);
372
373 Iterator etatListe_it = etatListe.iterator();
374 while (etatListe_it.hasNext()) {
375 Einzelteilauftrag etat = (Einzelteilauftrag) etatListe_it.next();
376
377 Date lieferDate = etat.getLieferdatum();
378 lieferDateGC.setTimeInMillis(lieferDate.getTime());
379
380 //Der Einzelteilauftrag hat das selbe Datum wie das aktuelle Datum der Simulation
381 if (actDateGC.get(5) == lieferDateGC.get(5) && actDateGC.get(2) == lieferDateGC.get(2)) {
382 Lieferant lt = new Lieferant();
383 try {
384 lt = dao.getLieferant(etat.getLieferantNr());
385 } catch (WiSimDAOException e) {
386 wiSimLogger.log("refreshJTreeEinkauf()", e);
387 }
388
389 //Neuer Node im JTree
390 lieferantNode = new IconNode("Auftrags Nr.: " + etat.getNr() + " Lieferant: " + lt.getFirma());
391 lieferantNode.setIcon(vanIcon);
392
393 Collection etatPosis = new Vector();
394 try {
395 etatPosis = dao.getEinzelteilAuftragsPositionen(etat.getNr());
396 } catch (WiSimDAOException e) {
397 wiSimLogger.log("refreshJTreeEinkauf()", e);
398 }
399
400 Iterator etatPosis_it = etatPosis.iterator();
401 int i = 1;
402 while (etatPosis_it.hasNext()) {
403 EinzelteilauftragPosition etatPos = (EinzelteilauftragPosition) etatPosis_it.next();
404 Einzelteil et = new Einzelteil();
405 try {
406 et = dao.getEinzelteil(etatPos.getEtNr());
407 } catch (WiSimDAOException e) {
408 wiSimLogger.log("refreshJTreeEinkauf()", e);
409 }
410
411 boolean status = runController.einzelteilLieferung(et.getNr(), etatPos.getBestellmenge());
412
413 //Neuer Node im JTree
414 if (status) {
415 positionNode = new IconNode("Position: " + i + " Einzelteil: " + et.getName() + " Menge: " + etatPos.getBestellmenge() + " wurde ins Lager geschafft!");
416 positionNode.setIcon(boxIcon);
417 } else {
418 positionNode = new IconNode("Position: " + i + " Einzelteil: " + et.getName() + " Menge: " + etatPos.getBestellmenge() + " ?berf?llt das Lager!");
419 positionNode.setIcon(errorIcon);
420 }
421
422 lieferantNode.add(positionNode);
423 i++;
424 }
425 dateNode.add(lieferantNode);
426 }
427 }
428 rootNodeLieferungen.add(dateNode);
429 jTreeEinkauf.setModel(new DefaultTreeModel(rootNodeLieferungen));
430 jTreeEinkauf.setCellRenderer(new IconNodeRenderer());
431
432 try {
433 Iterator tp_it = treepathsEinkauf.iterator();
434 while (tp_it.hasNext()) {
435 TreePath tp = (TreePath) tp_it.next();
436 jTreeEinkauf.expandPath(tp);
437 }
438 } catch (ConcurrentModificationException c) {}
439
440 }
441
442 /** Baut den JTree mit einer Liste aller produzierten Hubs und verbrauchten Einzelteile auf. */
443 public void refreshJTreeProduktion() {
444 if (actDay != 1) {
445 actDateGC.setTimeInMillis(actDate.getTime()-24*60*60*1000);
446
447 //JTree Produktion Ereignisbaum wird aufgebaut
448 //Neuer Node im JTree
449 dateNode = new IconNode(actDateGC.get(5) + "." + (actDateGC.get(2) + 1) + "." + actDateGC.get(1));
450 dateNode.setIcon(rightIcon);
451
452 Vector artikelLagerElemente = new Vector();
453 int hubBestandAktuell = 0;
454
455 try {
456 artikelLagerElemente = dao.getArtikelLagerElement();
457 } catch (WiSimDAOException e) {
458 wiSimLogger.log("refreshJTreeProduktion()", e);
459 }
460
461 Iterator artIt = artikelLagerElemente.iterator();
462 while (artIt.hasNext()) {
463 EinzelteilLagerElement etElem = (EinzelteilLagerElement) artIt.next();
464 hubBestandAktuell = hubBestandAktuell + etElem.getBestand();
465 }
466
467 int hubBestandDifferenz = hubBestandAktuell - hubBestand;
468 hubBestand = hubBestandAktuell;
469
470 //Neuer Node im JTree
471 hubProduktionNode = new IconNode("Heute wurden " + hubBestandDifferenz + " Hubs produziert!");
472 hubProduktionNode.setIcon(hubIcon);
473
474 //Neues Nodes im JTree
475 if (hubBestandDifferenz > 0) {
476 Enumeration keys = stueckliste.keys();
477 while (keys.hasMoreElements()) {
478 String key = (String) keys.nextElement();
479 Einzelteil et = new Einzelteil();
480
481 try {
482 et = dao.getEinzelteil(Integer.parseInt(key));
483 } catch (WiSimDAOException e) {
484 wiSimLogger.log("refreshJTreeProduktion()", e);
485 }
486
487 hubEinzelteilVerbrauch = new IconNode("Einzelteil: " + et.getName() + " Verbrauch: " + (Integer.parseInt((String) stueckliste.get(key)) * hubBestandDifferenz + " Stk."));
488 hubEinzelteilVerbrauch.setIcon(boxOpenIcon);
489
490 hubProduktionNode.add(hubEinzelteilVerbrauch);
491 }
492 }
493 dateNode.add(hubProduktionNode);
494
495 rootNodeProduktion.add(dateNode);
496 jTreeProduktion.setModel(new DefaultTreeModel(rootNodeProduktion));
497 jTreeProduktion.setCellRenderer(new IconNodeRenderer());
498
499 try {
500 Iterator tp_it = treepathsProduktion.iterator();
501 while (tp_it.hasNext()) {
502 TreePath tp = (TreePath) tp_it.next();
503 jTreeProduktion.expandPath(tp);
504 }
505 } catch (ConcurrentModificationException c) {}
506 } else {
507 rootNodeProduktion.add(new IconNode("Es wird produziert...", false, hubIcon));
508 jTreeProduktion.setModel(new DefaultTreeModel(rootNodeProduktion));
509 jTreeProduktion.setCellRenderer(new IconNodeRenderer());
510 }
511 }
512
513 /** Baut den JTree mit einer Liste aller verkauften Hubs f?r einen Tag auf. Leert au?erdem
514 * das Lager je nach Anzahl der verkauften Hubs
515 */
516 public void refreshJTreeVertrieb() {
517 actDateGC.setTimeInMillis(actDate.getTime());
518
519 //JTree Vertrieb Ereignisbaum wird aufgebaut
520 //Neuer Node im JTree
521 dateNode = new IconNode(actDateGC.get(5) + "." + (actDateGC.get(2) + 1) + "." + actDateGC.get(1));
522 dateNode.setIcon(rightIcon);
523
524 Iterator vertragIt = vertraege.iterator();
525 while (vertragIt.hasNext()) {
526 Vertrag vertrag = (Vertrag) vertragIt.next();
527 Date lieferDate = vertrag.getLieferdatum();
528
529 lieferDateGC.setTimeInMillis(lieferDate.getTime());
530
531 //Der Vertrag hat das selbe Datum wie das aktuelle Datum der Simulation
532 if (actDateGC.get(5) == lieferDateGC.get(5) && actDateGC.get(2) == lieferDateGC.get(2)) {
533 int menge = 0;
534
535 try {
536 menge = dao.getVertragsPositionMenge(vertrag.getVertragsId(), 1);
537 } catch (WiSimDAOException e) {
538 wiSimLogger.log("refreshJTreeVertrieb()", e);
539 }
540
541 //Lagermenge der Hubs wird verringert
542 boolean status = false;
543 try {
544 status = dao.setArtikelLagerBestand(1, -menge);
545 } catch (WiSimDAOWriteException e) {
546 wiSimLogger.log("refreshJTreeVertrieb()", e);
547 } catch (WiSimDAOException e) {
548 wiSimLogger.log("refreshJTreeVertrieb()", e);
549 }
550
551 Kunde kunde = new Kunde();
552
553 try {
554 kunde = dao.getKunde(vertrag.getKundenId());
555 } catch (WiSimDAOException e) {
556 wiSimLogger.log("refreshJTreeVertrieb()", e);
557 }
558
559 //Neuer Node im JTree
560 hubVertrieb = new IconNode("Auftrags Nr.: " + vertrag.getVertragsId() + " Kunde: " + kunde.getFirma() + " (" + kunde.getNachname() + " " + kunde.getVorname() + ")");
561 hubVertrieb.setIcon(vanIcon);
562
563 //Neuer Node im JTree
564 if (status) {
565 hubVertriebPos = new IconNode("Artikel: Hub Menge: " + menge + " Stk. wurden an den Kunden geliefert!");
566 hubVertriebPos.setIcon(hubIcon);
567 hubBestand = hubBestand - menge;
568 } else {
569 hubVertriebPos = new IconNode("Artikel: Hub Menge: " + menge + " Stk. konnte nicht geliefert werden (Lager leer)!");
570 hubVertriebPos.setIcon(errorIcon);
571 }
572 hubVertrieb.add(hubVertriebPos);
573 dateNode.add(hubVertrieb);
574 }
575 }
576 rootNodeVertrieb.add(dateNode);
577 jTreeVertrieb.setModel(new DefaultTreeModel(rootNodeVertrieb));
578 jTreeVertrieb.setCellRenderer(new IconNodeRenderer());
579
580 try {
581 Iterator tp_it = treepathsVertrieb.iterator();
582 while (tp_it.hasNext()) {
583 TreePath tp = (TreePath) tp_it.next();
584 jTreeVertrieb.expandPath(tp);
585 }
586 } catch (ConcurrentModificationException c) {}
587 }
588
589 /** Erneuert die Datumsanzeige.
590 * @param actDate
591 */
592 public void refreshTextFieldDate(java.util.Date actDate) {
593 this.actDate.setTime(actDate.getTime());
594 GregorianCalendar actDateGC = new GregorianCalendar();
595 actDateGC.setTimeInMillis(actDate.getTime());
596 jTextFieldDatum.setText(df.format(actDate));
597 }
598
599 /** Setzt das actDate
600 * @param actDate
601 */
602 public void setActDate(Date actDate) {
603 this.actDate = actDate;
604 }
605
606 /** L?scht die JTrees und setzt das Datumsfeld zur?ck. */
607 public void resetFields() {
608 actDate = new Date(new GregorianCalendar(2003, 8, 1, 0, 0).getTimeInMillis());
609 actDay = 0;
610 jTextFieldDatum.setText("");
611 jTreeEinkauf.setModel(null);
612 jTreeVertrieb.setModel(null);
613 jTreeProduktion.setModel(null);
614 jLabelSimStartStop.setText("");
615 rootNodeLieferungen = new IconNode("");
616 rootNodeVertrieb = new IconNode("");
617 rootNodeProduktion = new IconNode("");
618 rootNodeLieferungen.setIcon(MetalIconFactory.getFileChooserHomeFolderIcon());
619 rootNodeVertrieb.setIcon(MetalIconFactory.getFileChooserHomeFolderIcon());
620 rootNodeProduktion.setIcon(MetalIconFactory.getFileChooserHomeFolderIcon());
621 treepathsEinkauf.clear();
622 treepathsProduktion.clear();
623 treepathsVertrieb.clear();
624 resetDateFields();
625 }
626
627 private void startStopSimulation() {
628 int anzahlArbeitsplaetze = -1;
629
630 if (jToggleButtonStartStop.isSelected()) {
631 resetFields();
632 jComboBoxZeitfaktor.setEnabled(false);
633 jButtonReset.setEnabled(false);
634 jCheckBoxEineWoche.setEnabled(false);
635 actTime = new ActualTime();
636 coreTime = new CoreTime(actTime, faktor, TIMESTEP);
637 gc.setTime(actDate);
638 updateSimulationsauswertung =
639 new UpdateSimulationsauswertung(
640 actTime,
641 wiSimMainController,
642 beendeNachEinerWoche);
643 updateLagerThread = new UpdateLagerThread(wiSimMainController);
644
645 coreTime.start();
646 updateSimulationsauswertung.start();
647 updateLagerThread.start();
648
649 // Simulation der Produktion
650 try {
651 anzahlArbeitsplaetze = dao.getAnzahlArbeitspl?tze();
652 }
653 catch (WiSimDAOException e) {
654 wiSimLogger.log("startStopSimulation()", e);
655 }
656
657 runController = new ProduktionsController(wiSimMainController);
658 try {
659 threads = new ProduktionsSimulationThread[anzahlArbeitsplaetze+1];
660 for (int i = 1; i <= anzahlArbeitsplaetze; i++) {
661
662 threads[i] =
663 new ProduktionsSimulationThread(
664 dao.getArbeitsplatz(i),
665 runController,
666 wiSimMainController,
667 faktor,
668 TIMESTEP);
669 threads[i].start();
670
671 }
672 }
673 catch (WiSimDAOException e) {
674 wiSimLogger.log("startStopSimulation()", e);
675 }
676
677 // Ende Simulation der Produktion
678
679 jToggleButtonStartStop.setText("Ende");
680
681 jLabelSimStartStop.setForeground(new java.awt.Color(51, 153, 51));
682 jLabelSimStartStop.setText("Simulation wurde gestartet!");
683 }
684 else {
685 coreTime.interrupt();
686 updateSimulationsauswertung.interrupt();
687 updateLagerThread.interrupt();
688
689 try {
690 anzahlArbeitsplaetze = dao.getAnzahlArbeitspl?tze();
691 }
692 catch (WiSimDAOException e) {
693 wiSimLogger.log("startStopSimulation()", e);
694 }
695
696 // Simulation der Produktion
697 for (int i = 1; i <= anzahlArbeitsplaetze; i++) {
698 threads[i].interrupt();
699 }
700
701 // Ende Simulation der Produktion
702 enableControll();
703 jToggleButtonStartStop.setText("Start");
704 jLabelSimStartStop.setForeground(java.awt.Color.red);
705 jLabelSimStartStop.setText("Simulation wurde beendet!");
706 }
707 }
708
709 /** Schaltet die Kontrollfelder der Simulation wieder frei */
710 public void enableControll() {
711 jComboBoxZeitfaktor.setEnabled(true);
712 jButtonReset.setEnabled(true);
713 jCheckBoxEineWoche.setEnabled(true);
714 }
715
716 /** Setzt das Datum des Men?s zur?ck */
717 public void resetDateFields() {
718 JPanelSimulationStart jPanelSimulationStart = (JPanelSimulationStart) wiSimMainController.getActions().get("SimulationStart");
719 jPanelSimulationStart.resetTextFieldDate();
720 wiSimMainController.resetTextFieldDate();
721 }
722
723 /** Setzt das Datumsfeld dieses Panes zur?ck */
724 public void resetTextFieldDate() {
725 actDate = new Date(new GregorianCalendar(2003, 8, 1, 0, 0).getTimeInMillis());
726 DateFormat justDate = DateFormat.getDateInstance(DateFormat.FULL, Locale.GERMANY);
727 jTextFieldDatum.setText(justDate.format(actDate));
728 }
729
730 /** Setzt den Button zum Starten und Stoppen der Simulation in den Start-Zustand */
731 public void startStopButtonDoClick() {
732 jToggleButtonStartStop.setFocusPainted(false);
733 jToggleButtonStartStop.setSelected(false);
734 jToggleButtonStartStop.setText("Start");
735 jLabelSimStartStop.setForeground(java.awt.Color.red);
736 jLabelSimStartStop.setText("Simulation wurde beendet!");
737 }
738
739 /** Setzt die Variable isActive auf TRUE oder FALSE
740 * @param isActive
741 */
742 public void setIsActive(boolean isActive) {
743 this.isActive = isActive;
744 }
745
746 /** Befindet sich der Benutzer auf diesem Pane, so ist "isActive" = TRUE.
747 * Verl?sst der Benutzer das Pane, so ist "isActive" = FALSE.
748 * Wichtig ist diese Variable f?r die Simulation: Es wird nur das Pane
749 * aktualisiert, auf dem sich der Benutzer gerade befindet!
750 * @return boolean
751 */
752 public boolean getIsActive() {
753 return isActive;
754 }
755
756 /**
757 * Datenbankinfos f?r die Simulation
758 */
759 public void initializeCollections() {
760 try {
761 artikelLagerElemente = dao.getArtikelLagerElement();
762 stueckliste = dao.getStueckliste(1);
763 vertraege = dao.getVertraege();
764 } catch (WiSimDAOException e) {
765 wiSimLogger.log("JPanelSimulationStart()", e);
766 }
767
768 Iterator artIt = artikelLagerElemente.iterator();
769 while (artIt.hasNext()) {
770 EinzelteilLagerElement etElem = (EinzelteilLagerElement) artIt.next();
771 hubBestand = hubBestand + etElem.getBestand();
772 }
773 }
774
775 /**
776 * Expansion Listeners f?r die JTrees: Expandierte Nodes werden gespeichert
777 * und gehen nach setModel(newModel) nicht verloren!
778 */
779 public void addJTreeListener() {
780 jTreeEinkauf.addTreeExpansionListener(
781 new javax.swing.event.TreeExpansionListener() {
782 public void treeExpanded(TreeExpansionEvent e) {
783 treepathsEinkauf.add(e.getPath());
784 }
785
786 public void treeCollapsed(TreeExpansionEvent e) {
787 treepathsEinkauf.remove(e.getPath());
788 Iterator tp_it = treepathsEinkauf.iterator();
789 while (tp_it.hasNext()) {
790 TreePath tp = (TreePath) tp_it.next();
791 if (e.getPath().isDescendant(tp)) {
792 treepathsEinkauf.remove(tp);
793 }
794 }
795 }
796 }
797 );
798
799 jTreeProduktion.addTreeExpansionListener(
800 new javax.swing.event.TreeExpansionListener() {
801 public void treeExpanded(TreeExpansionEvent e) {
802 treepathsProduktion.add(e.getPath());
803 }
804
805 public void treeCollapsed(TreeExpansionEvent e) {
806 treepathsProduktion.remove(e.getPath());
807 Iterator tp_it = treepathsProduktion.iterator();
808 while (tp_it.hasNext()) {
809 TreePath tp = (TreePath) tp_it.next();
810 if (e.getPath().isDescendant(tp)) {
811 treepathsProduktion.remove(tp);
812 }
813 }
814 }
815 }
816 );
817
818 jTreeVertrieb.addTreeExpansionListener(
819 new javax.swing.event.TreeExpansionListener() {
820 public void treeExpanded(TreeExpansionEvent e) {
821 treepathsVertrieb.add(e.getPath());
822 }
823
824 public void treeCollapsed(TreeExpansionEvent e) {
825 treepathsVertrieb.remove(e.getPath());
826 Iterator tp_it = treepathsVertrieb.iterator();
827 while (tp_it.hasNext()) {
828 TreePath tp = (TreePath) tp_it.next();
829 if (e.getPath().isDescendant(tp)) {
830 treepathsVertrieb.remove(tp);
831 }
832 }
833 }
834 }
835 );
836 }
837 }