1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 import wx
40
41 from gefahrenprotokoll import Gefahrenprotokoll
42
43 from wxuniversal import FlexGridSizerWxObjTitel
44 from wxuniversal import ComboBoxErg
45 from wxuniversal import ListBoxErg
46 from wxuniversal import PopupTransientWindowFilterSuche
47
48 from progstart import ProgStart
49 from risikoanalyse import Risikoanalyse
50 from terminplan import Terminplan
51
52 from datenbank import Datenbank, Fehler
53
54 import sys
55 import getpass
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
91 """
92 Klasse, die das Hauptfenster der Benutzeroberfläche repräsentiert.
93
94 @raise IOError: Fehlermeldung und Programmende, wenn die Konfigurationsdatei '.wxvf' nicht geöffnet werden kann.
95 @raise Fehler: Fehlermeldung und Programmende, wenn die Datenbankverbindung nicht hergestellt werden kann.
96 """
97
98
99
100
101
102
104 kwds["style"] = wx.DEFAULT_FRAME_STYLE
105 wx.Frame.__init__(self, *args, **kwds)
106
107
108
109
110
111 self.__dbVerbindung__()
112
113
114
115
116
117
118
119
120 self.hauptfenster_menubar = wx.MenuBar()
121 menu = wx.Menu()
122 menu.Append(101, "&Neuer Datensatz\tCtrl+N", u"Neuen Datensatz im aktuellen Kontext anlegen", wx.ITEM_NORMAL)
123 menu.Append(102, "&Speichern\tCtrl+S", u"Änderungen in der Datenbank ablegen", wx.ITEM_NORMAL)
124 menu.AppendSeparator()
125 menu.Append(103, "&Beenden\tCtrl+B", u"Die Benutzeroberfläche 'wxvf' beenden.", wx.ITEM_NORMAL)
126 self.hauptfenster_menubar.Append(menu, "&Datei")
127
128 self.SetMenuBar(self.hauptfenster_menubar)
129
130
131
132
133
134 self.Bind( wx.EVT_MENU, self.__ereignisNeuerDS__, id=101 )
135 self.Bind( wx.EVT_MENU, self.__ereignisAenderungenSpeichern__, id=102 )
136 self.Bind( wx.EVT_MENU, self.__ereignisProgrammBeenden__, id=103 )
137
138
139
140
141
142
143 self.Statusleiste = wx.StatusBar( self )
144 self.Statusleiste.SetFieldsCount( 2 )
145 self.Statusleiste.SetStatusWidths( [-7, -3] )
146 self.SetStatusBar( self.Statusleiste )
147
148
149
150
151
152 self.CollapsiblePane__ProjektSpracheFilter = wx.CollapsiblePane( self
153 , label="Projekt, Sprache, Filter"
154 , style=wx.CP_DEFAULT_STYLE|wx.CP_NO_TLW_RESIZE )
155 self.__initProjektSpracheFilter__( self.CollapsiblePane__ProjektSpracheFilter.GetPane() )
156 self.Bind( wx.EVT_COLLAPSIBLEPANE_CHANGED
157 , self.__ereignisLayout__
158 , self.CollapsiblePane__ProjektSpracheFilter )
159
160
161
162
163
164 SearchCtrl__Suchen = wx.SearchCtrl( self, size=(200,-1), style=wx.TE_PROCESS_ENTER )
165 SearchCtrl__Suchen.Disable()
166
167 self.PopupTransientWindow__Suchen = PopupTransientWindowFilterSuche( parent = self, style = wx.BORDER_SIMPLE )
168
169 self.Button__Suchen = wx.Button( parent = self, label = "v", size = ( 15, -1 ) )
170 self.Button__Suchen.Disable()
171 self.Bind( wx.EVT_BUTTON, self.__ereignisPopupSuchen__, self.Button__Suchen )
172
173 Sizer_Suchen = wx.FlexGridSizer( rows = 1, cols = 2, vgap = 0, hgap = 0 )
174 Sizer_Suchen.Add( SearchCtrl__Suchen, flag = wx.ALL|wx.EXPAND|wx.ALIGN_CENTER, border = 1 )
175 Sizer_Suchen.Add( self.Button__Suchen, flag = wx.ALL|wx.FIXED_MINSIZE|wx.ALIGN_CENTER, border = 1 )
176 Sizer_Suchen.AddGrowableCol( 0 )
177
178
179
180
181
182
183 self.ListBox__GefIdStatus = FlexGridSizerWxObjTitel( parent = self
184 , wxObj = ListBoxErg( self
185 , size = ( -1, -1 )
186 , style = wx.BORDER_SUNKEN | wx.LB_SORT
187 , Statusleiste = self.Statusleiste
188 , dbVerbindung = self.dbVerbindung )
189 , titel = "Gef-Id / \nStatus"
190 , orient = wx.VERTICAL )
191 self.ListBox__GefIdStatus.wxObjekt.statusLeisteDBSpNameErlaeuterung = """Eineindeutige Identifikationsnummer des Gefahrenszenarios."""
192
193 self.ListBox__GefIdStatus.wxObjekt.SetToolTip(wx.ToolTip(
194 """mittlere Maustaste:\tzugeordnete Strukturpunkte anzeigen"""
195 + """\n"""
196 + """rechte Maustaste:\tStrukturpunkte zuordnen / bearbeiten""" ))
197
198 self.ListBox__GefIdStatus.wxObjekt.markiereWertProjUeb = False
199
200 self.Bind( wx.EVT_LISTBOX
201 , self.__ereignisNavigation__
202 , self.ListBox__GefIdStatus.wxObjekt )
203
204
205
206
207 self.dbVerbindung.init_psGefszenario( self.ListBox__GefIdStatus.wxObjekt
208 , prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData() )
209
210 self.psGefszenarioId = self.ListBox__GefIdStatus.wxObjekt.GetStringSelection()
211
212
213
214
215
216
217 self.Notebook__zentralerBereich = wx.Notebook( self )
218
219 self.Notebook__zentralerBereich.AddPage( Risikoanalyse( parent = self.Notebook__zentralerBereich
220 , Statusleiste = self.Statusleiste
221 , dbVerbindung = self.dbVerbindung
222 , prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData()
223 , sprSprachenId = self.ComboBox__Sprache.wxObjekt.gibClientData()
224 , psGefszenarioId = self.psGefszenarioId )
225 , "Risikoanalyse" )
226
227
228 self.Notebook__zentralerBereich.AddPage( Gefahrenprotokoll( parent = self.Notebook__zentralerBereich
229 , Statusleiste = self.Statusleiste
230 , dbVerbindung = self.dbVerbindung
231 , prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData()
232 , sprSprachenId = self.ComboBox__Sprache.wxObjekt.gibClientData()
233 , psGefszenarioId = self.psGefszenarioId )
234 , "Gefahrenprotokoll" )
235
236
237 self.Notebook__zentralerBereich.AddPage( Terminplan( self.Notebook__zentralerBereich )
238 , "Terminplan" )
239
240
241
242
243
244 self.Notebook__zentralerBereich.ChangeSelection( 1 )
245
246
247
248
249
250
251
252
253
254 sizerNavigationSuche = wx.FlexGridSizer( rows = 1, cols = 3, vgap = 0, hgap = 0 )
255
256 sizerNavigationSuche.Add( self.CollapsiblePane__ProjektSpracheFilter
257 , flag = wx.ALL|wx.EXPAND
258 , border = 1 )
259 sizerNavigationSuche.Add( Sizer_Suchen
260 , flag = wx.ALL|wx.EXPAND
261 , border = 1 )
262
263 sizerNavigationSuche.AddGrowableCol( 0 )
264
265
266
267
268
269 sizerHauptfenster = wx.BoxSizer( wx.VERTICAL )
270 sizerHauptfenster.Add( sizerNavigationSuche
271 , flag = wx.ALL|wx.EXPAND
272 , border = 1 )
273
274 BoxSizer = wx.BoxSizer( wx.HORIZONTAL )
275 BoxSizer.Add( self.ListBox__GefIdStatus, flag = wx.EXPAND )
276 BoxSizer.Add( self.Notebook__zentralerBereich
277 , proportion = 1
278 , flag = wx.ALL|wx.EXPAND
279 , border = 5 )
280
281 sizerHauptfenster.Add( BoxSizer
282 , proportion = 1
283 , flag = wx.ALL|wx.EXPAND
284 , border = 5 )
285
286 self.SetSizerAndFit( sizerHauptfenster )
287
288
289
290
291
292 self.SetTitle("wxvf - 'Virtuelles Fahrzeug'")
293 self.Maximize( True )
294 self.CenterOnScreen()
295
296
297
298
299
300
301 self.__ereignisLiesDB__()
302
303
304
305
306
307
308
310 """
311 Methode die aufgerufen wird, um auf die Datenbankverbindung herzustellen
312 """
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329 dbBenutzerName = "micha"
330 dbKennwort = "micha"
331
332
333
334
335
336 try:
337 confDatei=open('.wxvf', 'r')
338 except IOError:
339 dlg = wx.MessageDialog(self,
340 "Die von 'wxvf' benötigte Konfigurationsdatei ist nicht vorhanden !\n\n"
341 + "Bitte lege im Programmverzeichnis eine Textdatei mit dem Namen '.wxvf' an.\n"
342 + "Bitte trage im Format 'xxx.xxx.xxx.xxx' die IP-Adresse ein, über die der Datenbankserver (PostgreSQL) angesprochen werden kann (000.000.000.000 entspricht 'localhost').\n\n"
343 + "'wxvf' wird beendet."
344 , 'Fehlermeldung', wx.OK | wx.ICON_ERROR )
345 dlg.ShowModal()
346 dlg.Destroy()
347 sys.exit()
348
349
350
351
352
353
354 hostaddr = confDatei.read( 15 )
355 confDatei.close()
356
357
358
359
360
361 try:
362 self.dbVerbindung = Datenbank( dbBenutzerName, dbKennwort, hostaddr )
363 """
364 @cvar: Datenbankobjekt, welches die Datenbankverbindung enthält.
365 @type: libpq - PgConnection
366 """
367
368 except Fehler, msg:
369 dlg = wx.MessageDialog( self, str( msg ), 'Fehlermeldung', wx.OK|wx.ICON_ERROR )
370 dlg.ShowModal()
371 dlg.Destroy()
372 sys.exit()
373
374
375
376
377
378
379
380
381
382
384 """
385 Methode die aufgerufen wird, um auf die fehlende Funktionalität hizuweisen
386
387 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
388 @type ereignisDummy: C{wx - Ereignisobjekt}
389 """
390
391
392
393
394 dlg = wx.MessageDialog( self, "Noch nicht implementiert !", "Hinweis", wx.OK | wx.ICON_INFORMATION )
395 dlg.ShowModal()
396 dlg.Destroy()
397
398
399
400
401
402
403
405 """
406 Methode die aufgerufen wird, um alle Änderungen zu speichern.
407
408 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
409 @type ereignisDummy: C{wx - Ereignisobjekt}
410 """
411
412
413
414
415 self.__schreibDB__()
416
417
418
419
420
421 self.dbVerbindung.nimmAenderungen()
422
423
424
425
426
427
428
429
430
431
433 """
434 Methode die aufgerufen wird, wenn der gesamte Fensterinhalt neu berechnet und gezeichnet werden soll.
435
436 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
437 @type ereignisDummy: C{wx - Ereignisobjekt}
438 """
439
440 self.Layout()
441
442
443
444
445
446
447
448
449
450
452 """
453 Methode die aufgerufen wird, wenn die Datenbank neu ausgelesen werden muß (z.B. nach Änderung des Projektes oder der Sprache).
454
455 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
456 @type ereignisDummy: C{wx - Ereignisobjekt}
457 """
458
459
460
461
462
463 if ereignisDummy != None:
464
465
466
467 self.ListBox__GefIdStatus.wxObjekt.Clear()
468
469
470
471
472 self.dbVerbindung.init_psGefszenario( self.ListBox__GefIdStatus.wxObjekt
473 , prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData() )
474
475
476
477
478
479
480 self.Notebook__zentralerBereich.GetPage(0).prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData()
481 self.Notebook__zentralerBereich.GetPage(0).sprSprachenId = self.ComboBox__Sprache.wxObjekt.gibClientData()
482
483 self.Notebook__zentralerBereich.GetPage(1).prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData()
484 self.Notebook__zentralerBereich.GetPage(1).sprSprachenId = self.ComboBox__Sprache.wxObjekt.gibClientData()
485
486
487
488
489
490
491 self.CollapsiblePane__ProjektSpracheFilter.SetLabel( "Projekt: '"
492 + self.ComboBox__Projekt.wxObjekt.GetValue()
493 + "' \t Sprache: '"
494 + self.ComboBox__Sprache.wxObjekt.GetValue()
495 + "' \t Filter: '---'" )
496
497
498
499
500
501 self.__ereignisNavigation__()
502
503
504
505
506
507
508
510 """
511 Methode die aufgerufen wird, wenn ein neuer Datensatz im aktuellen Kontext angelegt werden soll.
512
513 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
514 @type ereignisDummy: C{wx - Ereignisobjekt}
515 """
516
517
518
519
520 self.__schreibDB__()
521
522
523
524
525
526 self.__dummy__( ereignisDummy )
527
528
529
530
531
532
533
535 """
536 Methode die aufgerufen wird, wenn eine Gefahren-Id ausgewählt wurde.
537
538 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
539 @type ereignisDummy: C{wx - Ereignisobjekt}
540 """
541
542
543
544
545 self.__schreibDB__()
546
547
548
549
550
551 if ereignisDummy != None and self.ListBox__GefIdStatus.wxObjekt.GetClientData( self.ListBox__GefIdStatus.wxObjekt.GetSelection() ) == None :
552 return
553
554
555
556
557
558
559 if self.ListBox__GefIdStatus.wxObjekt.IsEmpty() :
560 self.Notebook__zentralerBereich.GetPage(0).liesDB()
561 self.Notebook__zentralerBereich.GetPage(1).liesDB()
562 return
563
564
565
566
567 else:
568 self.psGefszenarioId = self.ListBox__GefIdStatus.wxObjekt.GetStringSelection()
569
570
571
572
573
574
575 self.Notebook__zentralerBereich.GetPage(0).liesDB(
576 psGefszenarioId = self.psGefszenarioId )
577
578
579
580
581
582 self.Notebook__zentralerBereich.GetPage(1).liesDB(
583 psGefszenarioId = self.psGefszenarioId )
584
585
586
587
588
589
590
591
592
593
594
595
596
597
599 """
600 Methode die aufgerufen wird, wenn das Fenster zum Einschränken der Suche angezeigt werden soll.
601
602 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben.
603 @type ereignis: C{wx - Ereignisobjekt}
604 """
605
606
607
608
609 btn = ereignis.GetEventObject()
610 pos = btn.ClientToScreen( (0,0) )
611 sz = btn.GetSize()
612 self.PopupTransientWindow__Suchen.Position(pos, (0, sz[1]))
613
614 self.PopupTransientWindow__Suchen.Popup()
615
616
617
618
619
620
621
623 """
624 Methode die aufgerufen wird, um das Programm zu beenden.
625
626 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
627 @type ereignisDummy: C{wx - Ereignisobjekt}
628 """
629 self.dbVerbindung.verwerfeAenderungen()
630 sys.exit()
631
632
633
634
635
636
637
638
640 """
641 Methode die aufgerufen wird, um die Objekte des oberen ausklappbaren Bereiches zu setzen.
642
643 @param wxCollapsiblePane: Es ist das C{wx - CollapsiblePane} - Objekt zu übergeben, welches den oberen ausklappbaren Bereich repräsentiert
644 @type wxCollapsiblePane: C{wx - CollapsiblePane}
645 """
646
647
648
649
650
651
652 self.ComboBox__Projekt = FlexGridSizerWxObjTitel( parent = wxCollapsiblePane
653 , wxObj = ComboBoxErg( wxCollapsiblePane
654 , choices = []
655 , style = wx.CB_DROPDOWN|wx.CB_READONLY|wx.CB_SORT
656 , Statusleiste = self.Statusleiste
657 , dbVerbindung = self.dbVerbindung )
658 , orient = wx.VERTICAL
659 , titel = "Projekt:" )
660 self.ComboBox__Projekt.wxObjekt.statusLeisteDBSpNameErlaeuterung = """Die Datensätze auf das Projekt einschränken."""
661
662 self.dbVerbindung.init_prjProjekte( self.ComboBox__Projekt.wxObjekt )
663
664 self.ComboBox__Projekt.wxObjekt.Bind( wx.EVT_COMBOBOX, self.__ereignisLiesDB__ )
665
666
667
668
669
670
671 self.ComboBox__Sprache = FlexGridSizerWxObjTitel( parent = wxCollapsiblePane
672 , wxObj = ComboBoxErg( wxCollapsiblePane
673 , choices = []
674 , style = wx.CB_DROPDOWN|wx.CB_READONLY|wx.CB_SORT
675 , Statusleiste = self.Statusleiste
676 , dbVerbindung = self.dbVerbindung )
677 , orient = wx.VERTICAL
678 , titel = "Sprache:" )
679 self.ComboBox__Sprache.wxObjekt.statusLeisteDBSpNameErlaeuterung = """Die Werte in der gewählten Sprache ausgeben."""
680
681 self.dbVerbindung.init_sprSprachen( self.ComboBox__Sprache.wxObjekt )
682
683 self.ComboBox__Sprache.wxObjekt.Bind( wx.EVT_COMBOBOX, self.__ereignisLiesDB__ )
684
685
686
687
688
689
690 self.ComboBox__Filter = FlexGridSizerWxObjTitel( parent = wxCollapsiblePane
691 , wxObj = wx.ComboBox( wxCollapsiblePane, choices = [], style = wx.CB_DROPDOWN|wx.CB_READONLY|wx.CB_SORT)
692 , orient = wx.VERTICAL
693 , titel = "Filter:" )
694 self.ComboBox__Filter.Enable( False )
695
696
697
698
699
700 BoxSizer = wx.BoxSizer( orient = wx.HORIZONTAL )
701 BoxSizer.Add( self.ComboBox__Projekt, proportion = 1, flag = wx.EXPAND )
702 BoxSizer.Add( self.ComboBox__Sprache, proportion = 1, flag = wx.EXPAND )
703 BoxSizer.Add( self.ComboBox__Filter, proportion = 1, flag = wx.EXPAND )
704 wxCollapsiblePane.SetSizerAndFit( BoxSizer )
705
706
707
708
709
710
711
712
713
715 """
716 Methode die aufgerufen wird, wenn die Eingabefelder ausgelesen und deren Werte in die Datenbank geschrieben werden sollen.
717 """
718
719
720
721
722
723 self.Notebook__zentralerBereich.GetPage(0).schreibDB(
724 psGefszenarioId = self.psGefszenarioId )
725
726 self.Notebook__zentralerBereich.GetPage(1).schreibDB()
727