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