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 bearbeitedokumente import BearbeiteDokumente
43 from filter import Filter
44 from gefahrenanalyse import Gefahrenanalyse
45 from gefahrenprotokoll import Gefahrenprotokoll
46 from wxuniversal import FlexGridSizerWxObjTitel
47 from wxuniversal import GaugeErg
48 from wxuniversal import ComboBoxErg
49 from wxuniversal import ListBoxErg
50 from wxuniversal import TextCtrlErg
51 from wxuniversal import TextCtrlErgSpW
52 from progstart import ProgStart
53 from risikobewertung import Risikobewertung
54 from risikominderung import Sicherheitsanforderungen
55
56 from datenbank import Datenbank, Fehler
57
58 import sys
59 import getpass
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
91
92
93
94
95
97 """
98 Klasse, die das Hauptfenster der Benutzeroberfläche repräsentiert.
99
100 @raise IOError: Fehlermeldung und Programmende, wenn die Konfigurationsdatei '.wxvf' nicht geöffnet werden kann.
101 @raise Fehler: Fehlermeldung und Programmende, wenn die Datenbankverbindung nicht hergestellt werden kann.
102 """
103
104
105
106
107
108
110 kwds["style"] = wx.DEFAULT_FRAME_STYLE
111 wx.Frame.__init__(self, *args, **kwds)
112
113
114
115
116
117
118 self.SetName( name = "VFHauptfenster" )
119
120
121
122
123 self.__dbVerbindung__ = None
124
125
126
127
128
129
130
131
132
133
134
135
136
137 try:
138 confDatei=open('.wxvf', 'r')
139 except IOError:
140 dlg = wx.MessageDialog(self,
141 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."
142 , u"Fehlermeldung", wx.OK | wx.ICON_ERROR )
143 dlg.ShowModal()
144 dlg.Destroy()
145 sys.exit()
146
147
148
149
150
151
152
153
154
155
156 hostaddr = confDatei.readline()[0:15].strip()
157 dbName = confDatei.readline()[0:25].strip()
158 dbBenutzerName = confDatei.readline()[0:25].strip()
159 schreibProtokollDatei = ( confDatei.readline()[0:4].strip() == 'True' )
160
161 confDatei.close()
162
163
164
165
166
167
168
169
170 if( len( dbBenutzerName ) == 0 ) : dbBenutzerName = getpass.getuser()
171
172 dlg = ProgStart( self )
173 dlg.CenterOnScreen()
174 dlg.text_ctrl_dbBenutzerName.ChangeValue( dbBenutzerName )
175 if ( dlg.ShowModal() != wx.ID_OK ):
176 sys.exit()
177
178 dbBenutzerName = dlg.text_ctrl_dbBenutzerName.GetValue()
179 dbKennwort = dlg.text_ctrl_dbKennwort.GetValue()
180 dlg.Destroy()
181
182
183
184
185
186
187 try:
188 self.__dbVerbindung__ = Datenbank( dbName, dbBenutzerName, dbKennwort, hostaddr )
189 """
190 @cvar: Datenbankobjekt, welches die Datenbankverbindung enthält.
191 @type: libpq - PgConnection
192 """
193
194 except Fehler, msg:
195 dlg = wx.MessageDialog( self, str( msg ), 'Fehlermeldung', wx.OK|wx.ICON_ERROR )
196 dlg.ShowModal()
197 dlg.Destroy()
198 sys.exit()
199
200
201
202
203
204
205 self.__dbVerbindung__.ProtokolldateiErzeugen( schreibProtokollDatei = schreibProtokollDatei )
206
207
208
209
210
211
212 self.SetTitle(u"wxvf - 'Virtuelles Fahrzeug'")
213 self.Maximize( True )
214 self.CenterOnScreen()
215
216
217
218
219
220
221
222
223 self.hauptfenster_menubar = wx.MenuBar()
224
225
226
227
228 datei = wx.Menu()
229 datei.Append(102, u"&Speichern\tCtrl+S", u"Änderungen in der Datenbank ablegen", wx.ITEM_NORMAL)
230 datei.AppendSeparator()
231 datei.Append(103, u"&Beenden\tCtrl+B", u"Die Benutzeroberfläche 'wxvf' beenden.", wx.ITEM_NORMAL)
232 self.hauptfenster_menubar.Append(datei, u"&Datei")
233
234
235
236
237 filter = wx.Menu()
238 filter.Append( 201, u"&Gefahrenszenarien einschränken\tCtrl+G", u"Filterkriterien zur Einschränkung der Gefahrenszenarien setzen.", wx.ITEM_NORMAL )
239 self.hauptfenster_menubar.Append( filter, u"&Filter" )
240
241
242
243
244 basisdaten = wx.Menu()
245 basisdaten.Append( 301, u"&Dokumente bearbeiten\tCtrl+D", u"Dokumente bearbeiten", wx.ITEM_NORMAL )
246 self.hauptfenster_menubar.Append( basisdaten, u"&Basisdaten" )
247
248
249
250
251 hilfe = wx.Menu()
252 hilfe.Append( 401, u"&Info zu wxvf\tCtrl+I", u"Informationen zum Programm", wx.ITEM_NORMAL )
253 self.hauptfenster_menubar.Append( hilfe, u"&Hilfe" )
254
255
256
257
258 self.SetMenuBar( self.hauptfenster_menubar )
259
260
261
262
263 self.Bind( wx.EVT_MENU, self.__ereignisAenderungenSpeichern__, id=102 )
264 self.Bind( wx.EVT_MENU, self.__ereignisProgrammBeenden__, id=103 )
265
266 self.Bind( wx.EVT_MENU, self.__ereignisFilter__, id=201 )
267
268 self.Bind( wx.EVT_MENU, self.__ereignisDokumente__, id=301 )
269
270 self.Bind( wx.EVT_MENU, self.__ereignisUeberWxvf__, id=401 )
271
272
273
274
275
276 self.TextCtrlErgSpW__Notizen = TextCtrlErgSpW( parent = self
277 , orient = wx.VERTICAL
278 , Notizen = None
279 , styleTCli = wx.BORDER_SUNKEN|wx.TE_MULTILINE|wx.TE_READONLY
280 , styleTCre = wx.BORDER_SUNKEN|wx.TE_MULTILINE|wx.TE_READONLY )
281
282 self.TextCtrlErgSpW__Notizen.TextCtrlErg__li.SetBackgroundColour( colour = self.GetBackgroundColour() )
283 self.TextCtrlErgSpW__Notizen.TextCtrlErg__re.SetBackgroundColour( colour = self.GetBackgroundColour() )
284
285 self.TextCtrlErgSpW__Notizen.SplitterWindow.SetSashPosition( position = 600 )
286
287 self.TextCtrlErgSpW__Notizen.SetMinSize( ( -1, 40 ) )
288
289
290
291
292
293 self.ListBox__GefIdStatus = FlexGridSizerWxObjTitel( parent = self
294 , wxObj = ListBoxErg( self
295 , style = wx.BORDER_SUNKEN | wx.LB_SORT
296 , Notizen = self.TextCtrlErgSpW__Notizen )
297 , titel = u"Gef-Id / \nStatus"
298 , orient = wx.VERTICAL )
299
300 self.ListBox__GefIdStatus.wxObjekt.SetMinSize( ( 70, -1 ) )
301
302 self.ListBox__GefIdStatus.wxObjekt.nimmWerteStatusleiste(
303 DBSpNameErlaeuterung = u"Eineindeutige Identifikationsnummer des Gefahrenszenarios."
304 , DBSpName = "ps.gefszenario / prj.pp_psgefszenario" )
305
306 self.ListBox__GefIdStatus.wxObjekt.markiereWertProjUeb = False
307
308 self.ListBox__GefIdStatus.wxObjekt.Bind( wx.EVT_LISTBOX
309 , self.__ereignisNavigation__ )
310
311
312
313
314
315 self.Fortschritt = GaugeErg( parent = self
316 , delta = 1 )
317
318 self.Fortschritt.SetMaxSize( ( -1, 20 ) )
319
320
321
322
323
324
325
326 self.Notebook__zentralerBereich = wx.Notebook( self )
327
328 self.Notebook__zentralerBereich.AddPage( Gefahrenanalyse( parent = self.Notebook__zentralerBereich
329 , Notizen = self.TextCtrlErgSpW__Notizen
330 , Fortschritt = self.Fortschritt
331 , dbVerbindung = self.__dbVerbindung__ )
332 , u"Gefahrenanalyse" )
333
334
335 self.Notebook__zentralerBereich.AddPage( Sicherheitsanforderungen( parent = self.Notebook__zentralerBereich
336 , Notizen = self.TextCtrlErgSpW__Notizen
337 , Fortschritt = self.Fortschritt
338 , dbVerbindung = self.__dbVerbindung__ )
339 , u"Risikominderung" )
340
341 self.Notebook__zentralerBereich.AddPage( Risikobewertung( parent = self.Notebook__zentralerBereich
342 , Notizen = self.TextCtrlErgSpW__Notizen
343 , Fortschritt = self.Fortschritt
344 , dbVerbindung = self.__dbVerbindung__ )
345 , u"Risikobewertung" )
346
347 self.Notebook__zentralerBereich.AddPage( Gefahrenprotokoll( parent = self.Notebook__zentralerBereich
348 , Notizen = self.TextCtrlErgSpW__Notizen
349 , Fortschritt = self.Fortschritt
350 , dbVerbindung = self.__dbVerbindung__ )
351 , u"Gefahrenprotokoll" )
352
353 self.Notebook__zentralerBereich.SetMinSize( ( 500, 500 ) )
354
355
356
357
358
359
360
361
362
363
364
365 FlexGridSizer_Notebook = wx.FlexGridSizer( rows = 1, cols = 2, vgap = 0, hgap = 10 )
366
367 FlexGridSizer_Notebook.AddGrowableRow( idx = 0, proportion = 1 )
368 FlexGridSizer_Notebook.AddGrowableCol( idx = 1, proportion = 1 )
369
370 FlexGridSizer_Notebook.Add( self.ListBox__GefIdStatus
371 , flag = wx.EXPAND )
372
373 FlexGridSizer_Notebook.Add( self.Notebook__zentralerBereich
374 , flag = wx.EXPAND )
375
376
377
378
379
380
381 FlexGridSizer = wx.FlexGridSizer( rows = 1, cols = 1, vgap = 5, hgap = 0 )
382
383 FlexGridSizer.AddGrowableRow( idx = 1, proportion = 1 )
384 FlexGridSizer.AddGrowableCol( idx = 0, proportion = 1 )
385
386 FlexGridSizer.Add( self.TextCtrlErgSpW__Notizen
387 , flag = wx.EXPAND
388 , border = 10 )
389
390 FlexGridSizer.Add( FlexGridSizer_Notebook
391 , flag = wx.EXPAND
392 , border = 10 )
393
394 FlexGridSizer.Add( self.Fortschritt
395 , flag = wx.EXPAND|wx.LEFT|wx.RIGHT
396 , border = 5 )
397
398 self.SetSizerAndFit( FlexGridSizer )
399
400
401
402
403
404
405
406
407
408
409
411 """
412 Methode die aufgerufen wird, um alle Änderungen zu speichern.
413
414 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
415 @type ereignisDummy: C{wx - Ereignisobjekt}
416 """
417
418
419
420
421
422 self.Notebook__zentralerBereich.GetPage(0).schreibDB()
423 self.Notebook__zentralerBereich.GetPage(2).schreibDB()
424 self.Notebook__zentralerBereich.GetPage(3).schreibDB()
425
426
427
428
429
430
431 self.__dbVerbindung__.nimmAenderungen()
432
433
434
435
436
437
438
439
440
442 """
443 Dokumente bearbeiten.
444
445 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
446 @type ereignisDummy: C{wx - Ereignisobjekt}
447 """
448
449
450
451
452 dlg = BearbeiteDokumente( parent = self
453 , Notizen = self.TextCtrlErgSpW__Notizen
454 , Fortschritt = self.Fortschritt
455 , dbVerbindung = self.__dbVerbindung__ )
456
457 dlg.ShowModal()
458 dlg.Destroy()
459
460
461
462
463
464
465
466
467
469 """
470 Dokumente bearbeiten.
471
472 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
473 @type ereignisDummy: C{wx - Ereignisobjekt}
474 """
475
476
477
478
479 dlg = Filter( parent = self
480 , Notizen = self.TextCtrlErgSpW__Notizen
481 , Fortschritt = self.Fortschritt
482 , dbVerbindung = self.__dbVerbindung__ )
483
484 dlg.CenterOnScreen()
485 dlg.ShowModal()
486 dlg.Destroy()
487
488
489
490
491
492
493 self.__dbVerbindung__.selektiere__psGefszenario( self.ListBox__GefIdStatus.wxObjekt )
494
495
496
497
498
499
500
501 self.__ereignisNavigation__()
502
503
504
505
506
507
508
509
510
511
513 """
514 Methode die aufgerufen wird, wenn eine Gefahren-Id ausgewählt wurde.
515
516 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
517 @type ereignisDummy: C{wx - Ereignisobjekt}
518 """
519
520
521
522
523 self.Notebook__zentralerBereich.GetPage(0).schreibDB()
524 self.Notebook__zentralerBereich.GetPage(2).schreibDB()
525 self.Notebook__zentralerBereich.GetPage(3).schreibDB()
526
527
528
529
530
531 self.__dbVerbindung__.ps_gefszenario_id = self.ListBox__GefIdStatus.wxObjekt.gibDbId()
532
533
534
535
536
537
538 if( self.__dbVerbindung__.ps_gefszenario_id is not None ) :
539
540 self.Notebook__zentralerBereich.GetPage(0).liesDB()
541
542 self.Notebook__zentralerBereich.GetPage(1).SiAnf__SiAnf.liesDB()
543
544 self.Notebook__zentralerBereich.GetPage(2).liesDB()
545
546 self.Notebook__zentralerBereich.GetPage(3).liesDB()
547
548
549
550
551
552
553
554
555
557 """
558 Methode die aufgerufen wird, um das Programm zu beenden.
559
560 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
561 @type ereignisDummy: C{wx - Ereignisobjekt}
562 """
563 self.__dbVerbindung__.verwerfeAenderungen()
564 sys.exit()
565
566
567
568
569
570
571
572
573
574
576 """
577 Methode die aufgerufen wird, um Informationen zum Programm auszugeben.
578
579 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet.
580 @type ereignisDummy: C{wx - Ereignisobjekt}
581 """
582
583
584 info = wx.AboutDialogInfo()
585 info.Name = u"wxvf"
586 info.Version = u"1.0"
587 info.Copyright = u"(C) 2010, 2011 Michael Bellair"
588 info.Description = wordwrap(
589 u"\'wxvf\' ist die Benutzeroberfläche zum Datenbankmodell 'Virtuelles Fahrzeug' \nab Version 1.3. \nDas Datenbankmodell soll die Aspekte der Produktsicherheit abbilden."
590 , 350
591 , wx.ClientDC(self) )
592 info.WebSite = ("http://vf.michaelbellair.de/index.html", u"Die Homepage.")
593 info.Developers = [ u"Michael Bellair" ]
594
595 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))
596
597
598 wx.AboutBox(info)
599
600
601
602
603
604
605
606
607
642