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 from wx.lib.wordwrap import wordwrap
41
42 from gefahrenprotokoll import Gefahrenprotokoll
43
44 from wxuniversal import FlexGridSizerWxObjTitel
45 from wxuniversal import ComboBoxErg
46 from wxuniversal import ListBoxErg
47 from wxuniversal import PopupTransientWindowFilterSuche
48
49 from progstart import ProgStart
50 from risikoanalyse import Risikoanalyse
51
52
53 from datenbank import Datenbank, Fehler
54
55 import sys
56 import getpass
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
90
92 """
93 Klasse, die das Hauptfenster der Benutzeroberfläche repräsentiert.
94
95 @raise IOError: Fehlermeldung und Programmende, wenn die Konfigurationsdatei '.wxvf' nicht geöffnet werden kann.
96 @raise Fehler: Fehlermeldung und Programmende, wenn die Datenbankverbindung nicht hergestellt werden kann.
97 """
98
99
100
101
102
103
105 kwds["style"] = wx.DEFAULT_FRAME_STYLE
106 wx.Frame.__init__(self, *args, **kwds)
107
108
109
110
111 self.SetName( name = "VFHauptfenster" )
112
113
114
115
116
117 self.__dbVerbindung__()
118
119
120
121
122
123
124
125
126 self.hauptfenster_menubar = wx.MenuBar()
127 menu = wx.Menu()
128 menu.Append(102, u"&Speichern\tCtrl+S", u"Änderungen in der Datenbank ablegen", wx.ITEM_NORMAL)
129 menu.AppendSeparator()
130 menu.Append(103, u"&Beenden\tCtrl+B", u"Die Benutzeroberfläche 'wxvf' beenden.", wx.ITEM_NORMAL)
131 self.hauptfenster_menubar.Append(menu, u"&Datei")
132
133
134 hilfe = wx.Menu()
135 hilfe.Append( 201, u"&Über wxvf", u"Informationen zum Programm", wx.ITEM_NORMAL )
136 self.hauptfenster_menubar.Append( hilfe, u"&Hilfe" )
137
138 self.SetMenuBar( self.hauptfenster_menubar )
139
140
141
142
143
144 self.Bind( wx.EVT_MENU, self.__ereignisAenderungenSpeichern__, id=102 )
145 self.Bind( wx.EVT_MENU, self.__ereignisProgrammBeenden__, id=103 )
146
147 self.Bind( wx.EVT_MENU, self.__ereignisUeberWxvf__, id=201 )
148
149
150
151
152
153 self.Statusleiste = wx.StatusBar( self )
154 self.Statusleiste.SetFieldsCount( 2 )
155 self.Statusleiste.SetStatusWidths( [-7, -3] )
156 self.SetStatusBar( self.Statusleiste )
157
158
159
160
161
162
163
164 self.ComboBox__Projekt = FlexGridSizerWxObjTitel( parent = self
165 , wxObj = ComboBoxErg( self
166 , choices = []
167 , style = wx.CB_DROPDOWN|wx.CB_READONLY|wx.CB_SORT
168 , Statusleiste = self.Statusleiste
169 , dbVerbindung = self.dbVerbindung )
170 , orient = wx.VERTICAL
171 , titel = u"Projekt:" )
172 self.ComboBox__Projekt.wxObjekt.statusLeisteDBSpNameErlaeuterung = u"Die Datensätze auf das Projekt einschränken."
173
174 self.dbVerbindung.init_prjProjekte( self.ComboBox__Projekt.wxObjekt )
175
176 self.ComboBox__Projekt.wxObjekt.Bind( wx.EVT_COMBOBOX, self.__ereignisLiesDB__ )
177
178
179
180
181
182
183
184 self.ComboBox__Sprache = FlexGridSizerWxObjTitel( parent = self
185 , wxObj = ComboBoxErg( self
186 , choices = []
187 , style = wx.CB_DROPDOWN|wx.CB_READONLY|wx.CB_SORT
188 , Statusleiste = self.Statusleiste
189 , dbVerbindung = self.dbVerbindung )
190 , orient = wx.VERTICAL
191 , titel = u"Sprache:" )
192 self.ComboBox__Sprache.wxObjekt.statusLeisteDBSpNameErlaeuterung = u"Die Werte in der gewählten Sprache ausgeben."
193
194 self.dbVerbindung.init_sprSprachen( self.ComboBox__Sprache.wxObjekt )
195
196 self.ComboBox__Sprache.wxObjekt.Bind( wx.EVT_COMBOBOX, self.__ereignisLiesDB__ )
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214 self.Button__Filter = FlexGridSizerWxObjTitel( parent = self
215 , wxObj = wx.Button( parent = self
216 , label = u" Filter aktivieren " )
217 , orient = wx.VERTICAL
218 , titel = u"Filter:" )
219
220
221 self.Bind( wx.EVT_BUTTON
222 , self.__dummy__
223 , self.Button__Filter.wxObjekt )
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244 self.ListBox__GefIdStatus = FlexGridSizerWxObjTitel( parent = self
245 , wxObj = ListBoxErg( self
246 , size = ( -1, -1 )
247 , style = wx.BORDER_SUNKEN | wx.LB_SORT
248 , Statusleiste = self.Statusleiste
249 , dbVerbindung = self.dbVerbindung )
250 , titel = u"Gef-Id / \nStatus"
251 , orient = wx.VERTICAL )
252 self.ListBox__GefIdStatus.wxObjekt.statusLeisteDBSpNameErlaeuterung = u"Eineindeutige Identifikationsnummer des Gefahrenszenarios."
253
254 self.ListBox__GefIdStatus.wxObjekt.SetToolTip(wx.ToolTip( u"mittlere Maustaste:\tzugeordnete Strukturpunkte anzeigen\nrechte Maustaste:\tStrukturpunkte zuordnen / bearbeiten" ))
255
256 self.ListBox__GefIdStatus.wxObjekt.markiereWertProjUeb = False
257
258 self.Bind( wx.EVT_LISTBOX
259 , self.__ereignisNavigation__
260 , self.ListBox__GefIdStatus.wxObjekt )
261
262
263
264
265
266 self.dbVerbindung.init_psGefszenario( self.ListBox__GefIdStatus.wxObjekt
267 , prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData() )
268
269 self.psGefszenarioId = self.ListBox__GefIdStatus.wxObjekt.GetStringSelection()
270
271
272
273
274
275
276
277 self.Notebook__zentralerBereich = wx.Notebook( self )
278
279 self.Notebook__zentralerBereich.AddPage( Risikoanalyse( parent = self.Notebook__zentralerBereich
280 , Statusleiste = self.Statusleiste
281 , dbVerbindung = self.dbVerbindung
282 , prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData()
283 , sprSprachenId = self.ComboBox__Sprache.wxObjekt.gibClientData()
284 , psGefszenarioId = self.psGefszenarioId )
285 , u"Risikoanalyse" )
286
287
288 self.Notebook__zentralerBereich.AddPage( Gefahrenprotokoll( parent = self.Notebook__zentralerBereich
289 , Statusleiste = self.Statusleiste
290 , dbVerbindung = self.dbVerbindung
291 , prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData()
292 , sprSprachenId = self.ComboBox__Sprache.wxObjekt.gibClientData()
293 , psGefszenarioId = self.psGefszenarioId )
294 , u"Gefahrenprotokoll" )
295
296
297
298
299
300 self.Bind( wx.EVT_NOTEBOOK_PAGE_CHANGED
301 , self.__ereignisNavigation__
302 , self.Notebook__zentralerBereich )
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318 sizerNavigationSuche = wx.FlexGridSizer( rows = 1, cols = 3, vgap = 0, hgap = 0 )
319
320 sizerNavigationSuche.AddGrowableCol( 0, 0 )
321 sizerNavigationSuche.AddGrowableCol( 1, 0 )
322 sizerNavigationSuche.AddGrowableCol( 2, 0 )
323 sizerNavigationSuche.AddGrowableCol( 3, 0 )
324
325 sizerNavigationSuche.Add( self.ComboBox__Projekt
326 , flag = wx.ALL|wx.EXPAND
327 , border = 1 )
328
329
330 sizerNavigationSuche.Add( self.ComboBox__Sprache
331 , flag = wx.ALL|wx.EXPAND
332 , border = 1 )
333
334
335 sizerNavigationSuche.Add( self.Button__Filter
336 , flag = wx.ALL|wx.EXPAND
337 , border = 1 )
338
339
340
341
342
343
344
345
346
347
348 sizerHauptfenster = wx.BoxSizer( wx.VERTICAL )
349 sizerHauptfenster.Add( sizerNavigationSuche
350 , flag = wx.ALL|wx.EXPAND
351 , border = 5 )
352
353 BoxSizer = wx.BoxSizer( wx.HORIZONTAL )
354 BoxSizer.Add( self.ListBox__GefIdStatus, flag = wx.EXPAND )
355 BoxSizer.Add( self.Notebook__zentralerBereich
356 , proportion = 1
357 , flag = wx.ALL|wx.EXPAND
358 , border = 5 )
359
360 sizerHauptfenster.Add( BoxSizer
361 , proportion = 1
362 , flag = wx.ALL|wx.EXPAND
363 , border = 5 )
364
365 self.SetSizerAndFit( sizerHauptfenster )
366
367
368
369
370
371 self.SetTitle(u"wxvf - 'Virtuelles Fahrzeug'")
372 self.Maximize( True )
373 self.CenterOnScreen()
374
375
376
377
378
379
380 self.__ereignisLiesDB__()
381
382
383
384
385
386
387
389 """
390 Methode die aufgerufen wird, um auf die Datenbankverbindung herzustellen
391 """
392
393
394
395
396
397 try:
398 confDatei=open('.wxvf', 'r')
399 except IOError:
400 dlg = wx.MessageDialog(self,
401 u"Die von 'wxvf' benötigte Konfigurationsdatei ist nicht vorhanden !\n\nBitte lege im Programmverzeichnis eine Textdatei mit dem Namen '.wxvf' an.\nBitte trage in der ersten Zeile im Format 'xxx.xxx.xxx.xxx' die IP-Adresse ein, über die der Datenbankserver (PostgreSQL) angesprochen werden kann (000.000.000.000 entspricht 'localhost').\nBitte trage in der zweiten Zeile den Datenbanknamen ein (maximal 25 Zeichen).\nIn der dritten Zeile kannst Du den Benutzernamen angeben (maximal 25 Zeichen).\n\n\'wxvf\' wird beendet."
402 , u"Fehlermeldung", wx.OK | wx.ICON_ERROR )
403 dlg.ShowModal()
404 dlg.Destroy()
405 sys.exit()
406
407
408
409
410
411
412 hostaddr = confDatei.readline()[0:15].strip()
413 dbName = confDatei.readline()[0:25].strip()
414 dbBenutzerName = confDatei.readline()[0:25].strip()
415
416 confDatei.close()
417
418
419
420
421
422
423 if( len( dbBenutzerName ) == 0 ) : dbBenutzerName = getpass.getuser()
424
425
426
427
428
429 dlg = ProgStart( self )
430 dlg.CenterOnScreen()
431 dlg.text_ctrl_dbBenutzerName.ChangeValue( dbBenutzerName )
432 if ( dlg.ShowModal() != wx.ID_OK ):
433 sys.exit()
434
435 dbBenutzerName = dlg.text_ctrl_dbBenutzerName.GetValue()
436 dbKennwort = dlg.text_ctrl_dbKennwort.GetValue()
437 dlg.Destroy()
438
439
440
441
442
443
444
445
446 try:
447 self.dbVerbindung = Datenbank( dbName, dbBenutzerName, dbKennwort, hostaddr )
448 """
449 @cvar: Datenbankobjekt, welches die Datenbankverbindung enthält.
450 @type: libpq - PgConnection
451 """
452
453 except Fehler, msg:
454 dlg = wx.MessageDialog( self, str( msg ), 'Fehlermeldung', wx.OK|wx.ICON_ERROR )
455 dlg.ShowModal()
456 dlg.Destroy()
457 sys.exit()
458
459
460
461
462
463
464
465
467 """
468 Methode die aufgerufen wird, um alle Änderungen zu speichern.
469
470 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
471 @type ereignisDummy: C{wx - Ereignisobjekt}
472 """
473
474
475
476
477 self.__schreibDB__()
478
479
480
481
482
483 self.dbVerbindung.nimmAenderungen()
484
485
486
487
488
489
490
491
493 """
494 Methode die aufgerufen wird, um auf die fehlende Funktionalität hizuweisen
495
496 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
497 @type ereignisDummy: C{wx - Ereignisobjekt}
498 """
499
500
501
502
503 dlg = wx.MessageDialog( self, "Noch nicht implementiert !", "Hinweis", wx.OK | wx.ICON_INFORMATION )
504 dlg.ShowModal()
505 dlg.Destroy()
506
507
508
509
510
511
512
513
514
515
517 """
518 Methode die aufgerufen wird, wenn der gesamte Fensterinhalt neu berechnet und gezeichnet werden soll.
519
520 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
521 @type ereignisDummy: C{wx - Ereignisobjekt}
522 """
523
524 self.Layout()
525
526
527
528
529
530
531
532
533
534
536 """
537 Methode die aufgerufen wird, wenn die Datenbank neu ausgelesen werden muß (z.B. nach Änderung des Projektes oder der Sprache).
538
539 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
540 @type ereignisDummy: C{wx - Ereignisobjekt}
541 """
542
543
544
545
546
547 if ereignisDummy != None:
548
549
550
551 self.ListBox__GefIdStatus.wxObjekt.Clear()
552
553
554
555
556 self.dbVerbindung.init_psGefszenario( self.ListBox__GefIdStatus.wxObjekt
557 , prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData() )
558
559
560
561
562
563
564 self.Notebook__zentralerBereich.GetPage(0).prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData()
565 self.Notebook__zentralerBereich.GetPage(0).sprSprachenId = self.ComboBox__Sprache.wxObjekt.gibClientData()
566
567 self.Notebook__zentralerBereich.GetPage(1).prjProjekteId = self.ComboBox__Projekt.wxObjekt.gibClientData()
568 self.Notebook__zentralerBereich.GetPage(1).sprSprachenId = self.ComboBox__Sprache.wxObjekt.gibClientData()
569
570
571
572
573
574
575 self.__ereignisNavigation__()
576
577
578
579
580
581
582
584 """
585 Methode die aufgerufen wird, wenn eine Gefahren-Id ausgewählt wurde.
586
587 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
588 @type ereignisDummy: C{wx - Ereignisobjekt}
589 """
590
591
592
593
594 self.__schreibDB__()
595
596
597
598
599
600 if ereignisDummy != None and self.ListBox__GefIdStatus.wxObjekt.GetClientData( self.ListBox__GefIdStatus.wxObjekt.GetSelection() ) == None :
601 return
602
603
604
605
606
607
608 if self.ListBox__GefIdStatus.wxObjekt.IsEmpty() :
609 self.Notebook__zentralerBereich.GetPage(0).liesDB()
610 self.Notebook__zentralerBereich.GetPage(1).liesDB()
611 return
612
613
614
615
616 else:
617 self.psGefszenarioId = self.ListBox__GefIdStatus.wxObjekt.GetStringSelection()
618
619
620
621
622
623
624 self.Notebook__zentralerBereich.GetPage(0).liesDB(
625 psGefszenarioId = self.psGefszenarioId )
626
627
628
629
630
631 self.Notebook__zentralerBereich.GetPage(1).liesDB(
632 psGefszenarioId = self.psGefszenarioId )
633
634
635
636
637
638
639
640
641
642
643
644
646 """
647 Methode die aufgerufen wird, um das Programm zu beenden.
648
649 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
650 @type ereignisDummy: C{wx - Ereignisobjekt}
651 """
652 self.dbVerbindung.verwerfeAenderungen()
653 sys.exit()
654
655
656
657
658
659
660
662 """
663 Methode die aufgerufen wird, um Informationen zum Programm auszugeben.
664
665 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
666 @type ereignisDummy: C{wx - Ereignisobjekt}
667 """
668
669
670 info = wx.AboutDialogInfo()
671 info.Name = u"wxvf"
672 info.Version = u"0.93"
673 info.Copyright = u"(C) 2010 Michael Bellair"
674 info.Description = wordwrap(
675 u"\'wxvf\' ist die Benutzeroberfläche zum Datenbankmodell 'Virtuelles Fahrzeug' ab Version 1.1. \nDas Datenbankmodell soll die Aspekte der Produktsicherheit abbilden, die Bestandteil des RAMS-Fachgebietes sind."
676 , 350
677 , wx.ClientDC(self) )
678 info.WebSite = ("http://freenet-homepage.de/bellair/vf/index.html", u"Die Homepage.")
679 info.Developers = [ u"Michael Bellair" ]
680
681 info.License = wordwrap(u"\'wxvf\' is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\n\'wxvf\' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with \'wxvf\'. If not, see <http://www.gnu.org/licenses/>.", 500, wx.ClientDC(self))
682
683
684 wx.AboutBox(info)
685
686
687
688
689
690
691
692
693
695 """
696 Methode die aufgerufen wird, wenn die Eingabefelder ausgelesen und deren Werte in die Datenbank geschrieben werden sollen.
697 """
698
699
700
701
702
703 self.Notebook__zentralerBereich.GetPage(0).schreibDB(
704 psGefszenarioId = self.psGefszenarioId )
705
706 self.Notebook__zentralerBereich.GetPage(1).schreibDB()
707