Module wxuniversal
[hide private]
[frames] | no frames]

Source Code for Module wxuniversal

   1  # -*- coding: utf-8 -*- 
   2  # 
   3  # 
   4  #    filename:  wxuniversal.py 
   5  # 
   6  #    version:   see wxvf.py 
   7  # 
   8  # 
   9  # ---------------------------------------------------------------------------------------- 
  10  # 
  11  # 
  12  #    Copyright (C) 2010  Michael Bellair 
  13  # 
  14  #    This file is part of wxvf. 
  15  # 
  16  #    wxvf is free software: you can redistribute it and/or modify 
  17  #    it under the terms of the GNU General Public License as published by 
  18  #    the Free Software Foundation, either version 3 of the License, or 
  19  #    (at your option) any later version. 
  20  # 
  21  #    wxvf is distributed in the hope that it will be useful, 
  22  #    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  23  #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  24  #    GNU General Public License for more details. 
  25  # 
  26  #    You should have received a copy of the GNU General Public License 
  27  #    along with wxvf.  If not, see <http://www.gnu.org/licenses/>. 
  28  # 
  29  #    Michael Bellair 
  30  #    Sportplatzstrasse 11 
  31  #    01259 Dresden 
  32  # 
  33  #    E-Mail:    bellair@freenet.de 
  34  #    homepage:  http://freenet-homepage.de/bellair/vf/index.html 
  35  # 
  36  # 
  37  # ---------------------------------------------------------------------------------------- 
  38  # 
  39  import os 
  40   
  41  import wx 
  42  import wx.lib.masked as  wxmsk          # MaskedCtrl 
  43   
  44  from universal import zk                # Zeichenketten bearbeiten 
  45   
  46  import sys                              # Programmende >sys.exit()< 
  47   
  48   
  49   
  50  # 
  51  # 
  52  # 
  53  # ---------------------------------------------------------------------------------------- 
  54  # ---------------------------------------------------------------------------------------- 
  55  # --                                    -------------------------------------------------- 
  56  # --    Offene Punkte / Aufgaben        -------------------------------------------------- 
  57  # --                                    -------------------------------------------------- 
  58  # ---------------------------------------------------------------------------------------- 
  59  # ---------------------------------------------------------------------------------------- 
  60  # 
  61  #  
  62  #       -- siehe TODO 'wxuniversal.py' -- 
  63  # 
  64  # 
  65  # ---------------------------------------------------------------------------------------- 
  66  # 
  67   
  68   
  69   
  70  # 
  71  # 
  72  # 
  73  # ---------------------------------------------------------------------------------------- 
  74  # ---------------------------------------------------------------------------------------- 
  75  # --                            ---------------------------------------------------------- 
  76  # --    Globale Variablen       ---------------------------------------------------------- 
  77  # --                            ---------------------------------------------------------- 
  78  # ---------------------------------------------------------------------------------------- 
  79  # ---------------------------------------------------------------------------------------- 
  80  # 
  81  # 
  82  # ---------------------------------------------------------------------------------------- 
  83  # --    Farben                                                          ------------------ 
  84  # --    Eine Liste der verfügbaren Farben kann dem wxPython-Demo       ------------------ 
  85  # --    Miscellaneous -> ColourDB entnommen werden                      ------------------ 
  86  # ---------------------------------------------------------------------------------------- 
  87  # 
  88  farbeAuswahlListe = "LIGHT STEEL BLUE"  # Farbe der Objekte, die Vorgabewerte enthalten 
  89  farbeBearbeiten = "LIGHT YELLOW"        # Farbe der Objekte, die bearbeitet werden können 
  90   
  91  # 
  92  # --    Notlösung !                                    ---------------------------------- 
  93  # --    Dem Fehler in >comctl32.dll< ausweichen         ---------------------------------- 
  94  # 
  95  if( os.name == 'nt' ) :  
  96      farbeAuswahlListe = "CYAN" 
  97      farbeBearbeiten = "WHITE"           # Fehler in  
  98   
  99  # 
 100  # 
 101  # 
 102  # ---------------------------------------------------------------------------------------- 
 103  # ---------------------------------------------------------------------------------------- 
 104  # --                                            ------------------------------------------ 
 105  # --    interne Basisklasse der Ergänzungen    ------------------------------------------ 
 106  # --                                            ------------------------------------------ 
 107  # ---------------------------------------------------------------------------------------- 
 108  # ---------------------------------------------------------------------------------------- 
 109  # 
110 -class __Ergaenzung__:
111 """ 112 Basisklasse, die die Ergänzungen bereitstellt. 113 """ 114 115 # 116 # ------------------------------------------------------------------------------------ 117 # -- Initialisierungen -------------------------------------------------- 118 # ------------------------------------------------------------------------------------ 119 #
120 - def __init__( self, Statusleiste ):
121 122 # 123 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 124 # 125 self.SetName( name = "__Ergaenzung__" ) 126 127 128 # 129 # -------------------------------------------------------------------------------- 130 # -- Kontextmenüs einschließlich Ereignisbehandlung -------------------------- 131 # -------------------------------------------------------------------------------- 132 # 133 self.KMenues = MultiMenu() 134 135 # 136 # -- Kontextmenüs unterdrücken (Notlösung) ---------------------------------- 137 # 138 self.KMenues.initMenu() 139 140 141 # 142 # -- Statusleiste -------------------------------------------------- 143 # 144 self.__StatusLeiste__ = Statusleiste 145 self.__statusLeisteDBSpName__ = "" 146 self.statusLeisteDBSpNameErlaeuterung = "" 147 148 149 # 150 # -- wertNichtMod -------------------------------------------------- 151 # 152 self.wertNichtMod = [] 153 self.wertNichtMod.append( None ) 154 """ 155 @cvar: Aktueller, nichtmodifizierter Wert, wie er beim letzten Aufruf von C{nimmWert(...)} eingelesen wurde. 156 @type: Python - Objekt 157 """ 158 159 160 # 161 # -- ClientData -------------------------------------------------- 162 # 163 self.clientData = [] 164 """ 165 @cvar: Zusatzinformationen, die dem aktuellen Objekt zugeordnet werden können. 166 @type: Python - Objekt 167 """ 168 169 170 # 171 # -- >istVomBenutzerGeaendert = True< ---------------------------------- 172 # -- der Wert wurde vom Benutzer verändert ---------------------------------- 173 # 174 self.istVomBenutzerGeaendert = False 175 """ 176 @cvar: Wenn dieser Wert C{True} ist, wurde der Wert des C{wx-Objektes} vom Benutzer verändert. 177 @type: Boolescher Wert 178 """ 179 180 181 # 182 # -- >istBenutzerAenderungJetzt = True< -------------------------- 183 # -- der Wert wurde gerade vom Benutzer verändert -------------------------- 184 # 185 self.istBenutzerAenderungJetzt = False 186 """ 187 @cvar: Wenn dieser Wert C{True} ist, wurde der Wert des C{wx-Objektes} jetzt vom Benutzer verändert. 188 @type: Boolescher Wert 189 """
190 191 192 193 194 195 # 196 # ------------------------------------------------------------------------------------ 197 # -- Änderung erkennen -------------------------------------------------- 198 # ------------------------------------------------------------------------------------ 199 #
200 - def __ereignisAenderung__( self, ereignis = None ):
201 """ 202 Methode die aufgerufen wird, wenn der Inhalt des C{wx-Objektes} geändert wird. 203 204 @param ereignis: Es ist das C{wx-Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 205 @type ereignis: C{wx-Ereignisobjekt} 206 """ 207 208 # 209 # -- Der Wert des wx-Objektes wurde (jetzt) vom Benutzer verändert ---------- 210 # 211 self.istVomBenutzerGeaendert = True 212 self.istBenutzerAenderungJetzt = True 213 214 215 # 216 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 217 # -- ausgewertet werden kann -------------------------- 218 # 219 ereignis.Skip( skip = True )
220 221 222 223 224 # 225 # ------------------------------------------------------------------------------------ 226 # -- Kontextmenü nicht anzeigen ------------------------------------------ 227 # ------------------------------------------------------------------------------------ 228 #
229 - def __ereignisKMenueNicht__( self, ereignis = None ):
230 """ 231 Kontextmenü nicht anzeigen 232 233 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 234 @type ereignis: C{wx - Ereignisobjekt} 235 """ 236 237 # 238 # -- 'Unsichtbares' Kontextmenü aufrufen ---------------------------------- 239 # 240 self.PopupMenu( self.KMenues.gibMenu( lfdNrMenu = 0 ) ) 241 242 243 # 244 # -- Das Ereignis nicht weiterreichen ----------------------------------------- 245 # 246 ereignis.Skip( skip = False )
247 248 249 250 251 # 252 # ------------------------------------------------------------------------------------ 253 # -- Einträge in der Statusleiste vornehmen ---------------------------------- 254 # ------------------------------------------------------------------------------------ 255 #
256 - def __ereignisStatusleiste__( self, ereignis ):
257 """ 258 Methode die aufgerufen wird, um die Einträge in der Statusleiste darzustellen. 259 260 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 261 @type ereignis: C{wx - Ereignisobjekt} 262 """ 263 264 265 # 266 # -- Mauszeiger verläßt >wx.Objekt< ------------------------------------------ 267 # 268 if ereignis.Leaving(): 269 self.__StatusLeiste__.SetStatusText( "", 0 ) 270 self.__StatusLeiste__.SetStatusText( "", 1 ) 271 272 273 # 274 # -- Mauszeiger berührt >wx.Objekt< ------------------------------------------ 275 # 276 if ereignis.Entering(): 277 278 # 279 # -- PostgreSQL-Datenbakspaltennamen ausgeben ------------------ 280 # 281 # self.__StatusLeiste__.SetStatusText( str( self.__statusLeisteDBSpName__ ), 1 ) 282 self.__StatusLeiste__.SetStatusText( self.__statusLeisteDBSpName__, 1 ) 283 284 # 285 # -- Erläuterung zum PostgreSQL-Datenbakspaltennamen ausgeben -- 286 # 287 # self.__StatusLeiste__.SetStatusText( str( self.statusLeisteDBSpNameErlaeuterung ), 0 ) 288 self.__StatusLeiste__.SetStatusText( self.statusLeisteDBSpNameErlaeuterung, 0 ) 289 290 291 # 292 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 293 # -- ausgewertet werden kann -------------------------- 294 # 295 ereignis.Skip( skip = True )
296 297 298 299 # 300 # ------------------------------------------------------------------------------------ 301 # -- Hat der Benutzer eine Änderung durchgeführt ? -------------------------- 302 # ------------------------------------------------------------------------------------ 303 #
304 - def gibIstVomBenutzerGeaendert( self ):
305 """ 306 Hat der Benutzer eine Änderung durchgeführt ? 307 308 @return: Es wird C{True} zurückgegeben, wenn der Benutzer eine Änderung durchgeführt hat; sonst C{False}. 309 @rtype: Boolean 310 """ 311 312 return self.istVomBenutzerGeaendert
313 314 315 316 # 317 # ------------------------------------------------------------------------------------ 318 # -- Den Status der Benutzeränderung explizit setzen -------------------------- 319 # ------------------------------------------------------------------------------------ 320 #
321 - def nimmIstVomBenutzerGeaendert( self, istVomBenutzerGeaendert ):
322 """ 323 Den Status der Benutzeränderung explizit setzen. 324 325 @param istVomBenutzerGeaendert: Es ist der Status der Benutzeränderung zu übergeben. 326 @type istVomBenutzerGeaendert: C{Boolean} 327 """ 328 329 self.istVomBenutzerGeaendert = istVomBenutzerGeaendert
330 331 332 333 # 334 # 335 # 336 # ---------------------------------------------------------------------------------------- 337 # ---------------------------------------------------------------------------------------- 338 # -- ------------------ 339 # -- interne Basisklasse der Funktionen für Texteingabeobjekte ------------------ 340 # -- ------------------ 341 # ---------------------------------------------------------------------------------------- 342 # ---------------------------------------------------------------------------------------- 343 #
344 -class __TextFunktionen__( __Ergaenzung__ ):
345 """ 346 Basisklasse, die zusätzlichen Funktionen für Texteingabeobjekte bereitstellt. 347 """ 348 349 # 350 # ------------------------------------------------------------------------------------ 351 # -- Initialisierungen -------------------------------------------------- 352 # ------------------------------------------------------------------------------------ 353 #
354 - def __init__( self, Statusleiste ):
355 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 356 357 # 358 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 359 # 360 self.SetName( name = "__TextFunktionen__" ) 361 362 363 # 364 # -- das Texteingabefeld darf leer sein ---------------------------------- 365 # 366 self.darfLeerSein = False 367 368 369 # 370 # -- >istMeldungRechtschreibFehlerKorrektur = True< ---------- 371 # -- Die Meldung zur Rechtschreibfehlerkorrektur wird gezeigt ---------- 372 # 373 self.istMeldungRechtschreibFehlerKorrektur = True 374 375 376 # 377 # -- >istRechtschreibFehlerKorrektur = True< ------------------ 378 # -- Wurde eine Rechtschreibfehlerkorrektur durchgeführt ? ------------------ 379 # 380 self.istRechtschreibFehlerKorrektur = False
381 382 383 384 385 # 386 # ------------------------------------------------------------------------------------ 387 # -- Liegt eine Korrektur von Rechtschreibfehlern vor ? ------------------ 388 # ------------------------------------------------------------------------------------ 389 #
390 - def __frageRechtschreibfehlerkorrekur__( self, ereignis ):
391 """ 392 Wenn eine Benutzeränderung vorliegt wird ein Meldung ausgegeben, um beim Benutzer abzufragen, ob eine Rechtschreibkorrektur vorliegt. 393 Nach der Benutzeränderung muß ein gültiger Text vorliegen (nach Entfernen aller 'whitespaces', Fragezeichen, Aurufezeichen, Punkte, Bindestriche). Sonst wird wieder der alte Wert eingetragen. 394 395 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 396 @type ereignis: C{wx - Ereignisobjekt} 397 """ 398 399 400 # 401 # -- Das Texteingabefeld darf leer sein ------------------ 402 # -- Es wird die Leerzeichenkette hinzugefügt ------------------ 403 # -- Die Änderung ist keine Rechtschreibfehlerkorrektur ------------------ 404 # 405 if( self.istLeer() ) : 406 407 # 408 # -- nichtmodifizierten Wert eintragen -------------------------- 409 # 410 if( zk.istLeer( self.wertNichtMod[0] ) ) : 411 self.nimmWert( wert = zk.LeerZk, clientData = self.clientData ) 412 else: 413 self.nimmWert( wert = self.wertNichtMod[0], clientData = self.clientData ) 414 415 416 # 417 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 418 # -- ausgewertet werden kann -------------------------- 419 # 420 ereignis.Skip( skip = True ) 421 422 423 # 424 # -- Nicht nach der Rechtschreibfehlerkorrektur fragen ---------- 425 # 426 return 427 428 429 430 # 431 # -- Rechtschreibfehlerkorrektur ------------------------------------------ 432 # 433 # -- keine Benutzeränderung ------------------------------------------ 434 # 435 if( ( not self.istBenutzerAenderungJetzt ) 436 or ( not self.istMeldungRechtschreibFehlerKorrektur ) ) : 437 # 438 # -- Das Ereignis weiterreichen, damit es weiter ------------------ 439 # -- ausgewertet werden kann ------------------ 440 # 441 ereignis.Skip( skip = True ) 442 return 443 444 445 # 446 # -- Meldung ---------------------------------------------------------- 447 # 448 dlg = wx.MessageDialog( parent = self 449 , message = u"Wurde eine Korrektur von Rechtschreibfehlern durchgeführt ?" 450 , caption = u"Rechtschreibfehler ?" 451 , style = wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION ) 452 453 self.istRechtschreibFehlerKorrektur = ( dlg.ShowModal() == wx.ID_YES ) 454 455 dlg.Destroy() 456 457 458 # 459 # -- Farbe setzen ---------------------------------------------------------- 460 # -- keine Rechtschreibfehlerkorrektur führt immer zum ------------------ 461 # -- projektspezifischen Wert ------------------ 462 # 463 # if( not self.istRechtschreibFehlerKorrektur ) : 464 # self.SetBackgroundColour( self.farbeProjektspezifisch ) 465 466 467 # 468 # -- die nächste Benutzeränderung abfragen ---------------------------------- 469 # 470 self.istBenutzerAenderungJetzt = False 471 472 473 # 474 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 475 # -- ausgewertet werden kann -------------------------- 476 # 477 ereignis.Skip( skip = True )
478 479 480 481 # 482 # ------------------------------------------------------------------------------------ 483 # -- Virtuelle Funktion zur Rückgabe der Zusatzinformationen ---------- 484 # ------------------------------------------------------------------------------------ 485 #
486 - def gibClientData( self ):
487 """ 488 Virtuelle Funktion zur Rückgabe der Zusatzinformationen C{clientData}. Diese Funktion muß in der abgeleiteten Klasse implementiert werden (overloading). 489 """ 490 491 return u"Muß in der abgeleiteten Klasse implementiert (überschrieben) werden."
492 493 494 495 # 496 # ------------------------------------------------------------------------------------ 497 # -- Virtuelle Funktion zur Rückgabe des Wertes -------------------------- 498 # ------------------------------------------------------------------------------------ 499 #
500 - def gibWert( self ):
501 """ 502 Virtuelle Funktion zur Rückgabe des Wertes. Diese Funktion muß in der abgeleiteten Klasse implementiert werden (overloading). 503 """ 504 505 return u"Muß in der abgeleiteten Klasse implementiert (überschrieben) werden."
506 507 508 509 # 510 # ------------------------------------------------------------------------------------ 511 # -- Der Inhalt des Texteingabefeldes ist leer -------------------------- 512 # ------------------------------------------------------------------------------------ 513 #
514 - def istLeer( self ):
515 """ 516 Der Inhalt des Texteingabeobjektes ist leer 517 """ 518 519 return zk.istLeer( self.gibWert() )
520 521 522 523 # 524 # ------------------------------------------------------------------------------------ 525 # -- aktuellen Wert übernehmen ------------------------------------------ 526 # ------------------------------------------------------------------------------------ 527 #
528 - def nimmWert( self, wert, clientData = None ):
529 """ 530 Virtuelle Funktion zur Rückgabe des Wertes. Diese Funktion muß in der abgeleiteten Klasse implementiert werden (overloading). 531 """ 532 533 return u"Muß in der abgeleiteten Klasse implementiert (überschrieben) werden."
534 535 536 537 538 # 539 # 540 # 541 # ---------------------------------------------------------------------------------------- 542 # ---------------------------------------------------------------------------------------- 543 # -- -------------------------------------------------- 544 # -- Allgemeines wx-Objekt mit Titel -------------------------------------------------- 545 # -- -------------------------------------------------- 546 # ---------------------------------------------------------------------------------------- 547 # ---------------------------------------------------------------------------------------- 548 #
549 -class FlexGridSizerWxObjTitel( wx.FlexGridSizer ):
550 """ 551 Klasse, die einem beliebigen wx-Objekt einen Titel zuordnet. 552 """ 553 554 # 555 # ------------------------------------------------------------------------------------ 556 # -- Initialisierungen -------------------------------------------------- 557 # ------------------------------------------------------------------------------------ 558 #
559 - def __init__( self, parent, wxObj, titel, orient ):
560 561 # 562 # -- Überschrift ---------------------------------------------------------- 563 # 564 self.wxText = wx.StaticText( parent, label = titel ) 565 """ 566 @cvar: Titel des C{wx-Objektes}. 567 @type: wxPython - wxText 568 """ 569 570 # 571 # -- wx-Objekt ---------------------------------------------------------- 572 # 573 self.wxObjekt = wxObj 574 """ 575 @cvar: Beliebiges C{wx-Objekt}, welchem der Titel zugeordnet wird. 576 @type: wxPython - wx-Objekt 577 """ 578 579 580 # 581 # -- Layout festlegen ------------------ 582 # 583 if( orient == wx.VERTICAL ) : 584 wx.FlexGridSizer.__init__( self, rows = 2, cols = 1, vgap = 5, hgap = 5 ) 585 586 self.AddGrowableCol( idx = 0, proportion = 1 ) 587 self.AddGrowableRow( idx = 1, proportion = 1 ) 588 else : 589 wx.FlexGridSizer.__init__( self, rows = 1, cols = 2, vgap = 5, hgap = 5 ) 590 591 self.AddGrowableCol( idx = 1, proportion = 1 ) 592 self.AddGrowableRow( idx = 0, proportion = 1 ) 593 594 # 595 # -- Zeilen/Spalten ---------------------------------------------------------- 596 # 597 self.Add( self.wxText, flag = wx.EXPAND ) 598 self.Add( self.wxObjekt, flag = wx.EXPAND )
599 600 601 602 # 603 # ------------------------------------------------------------------------------------ 604 # -- Titel und wxObjekt (de)aktivieren ---------------------------------- 605 # ------------------------------------------------------------------------------------ 606 #
607 - def Enable( self, enable = True ):
608 """ 609 Diese Methode implementiert die Standardfunktion C{Enable(...)} für diese Klasse. 610 """ 611 612 # 613 # -- Objekte (de)aktivieren -------------------------------------------------- 614 # 615 self.wxText.Enable( enable ) 616 self.wxObjekt.Enable( enable )
617 618 619 620 # 621 # 622 # 623 # ---------------------------------------------------------------------------------------- 624 # ---------------------------------------------------------------------------------------- 625 # -- ------------------------------------------ 626 # -- CheckBox mit einigen Ergänzungen ------------------------------------------ 627 # -- ------------------------------------------ 628 # ---------------------------------------------------------------------------------------- 629 # ---------------------------------------------------------------------------------------- 630 #
631 -class CheckBoxErg( wx.CheckBox, __Ergaenzung__ ):
632 """ 633 Klasse, die eine C{wx.CheckBox} mit weiteren Funktionen versieht. 634 """ 635 636 # 637 # ------------------------------------------------------------------------------------ 638 # -- Initialisierungen -------------------------------------------------- 639 # ------------------------------------------------------------------------------------ 640 #
641 - def __init__( self, parent, Statusleiste, dbVerbindung ):
642 wx.CheckBox.__init__( self, parent = parent ) 643 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 644 645 # 646 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 647 # 648 self.SetName( name = "CheckBoxErg" ) 649 650 651 # 652 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 653 # 654 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 655 656 657 # 658 # -- Ereignisse behandeln -------------------------------------------------- 659 # 660 self.Bind( wx.EVT_CHECKBOX, self.__ereignisAenderung__, self ) 661 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 662 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ )
663 664 665 666 # 667 # ------------------------------------------------------------------------------------ 668 # -- aktuellen Wert zurückgeben ------------------------------------------ 669 # ------------------------------------------------------------------------------------ 670 #
671 - def gibWert( self ):
672 """ 673 Mit Aufruf dieser Methode wird der Wert der C{CheckBox} zurückgegeben. 674 """ 675 676 # 677 # -- aktuellen Wert zurückgeben ------------------------------------------ 678 # 679 return self.GetValue()
680 681 682 683 # 684 # ------------------------------------------------------------------------------------ 685 # -- Alle Einträge löschen -------------------------------------------------- 686 # ------------------------------------------------------------------------------------ 687 #
688 - def loescheAlles( self ):
689 """ 690 Mit Aufruf dieser Methode wird C{wx.CheckBox.SetValue( False )} gesetzt, sowie C{self.istVomBenutzerGeaendert = False} und C{self.istBenutzerAenderungJetzt} gesetzt. 691 """ 692 693 694 # 695 # -- Alle Einträge löschen -------------------------------------------------- 696 # 697 self.istVomBenutzerGeaendert = False 698 self.istBenutzerAenderungJetzt = False 699 del self.wertNichtMod[:] 700 self.SetValue( False )
701 702 703 704 # 705 # ------------------------------------------------------------------------------------ 706 # -- aktuellen Wert übernehmen ------------------------------------------ 707 # ------------------------------------------------------------------------------------ 708 #
709 - def nimmWert( self, wert, clientData = None ):
710 """ 711 Mit Aufruf dieser Methode wird der Wert der C{CheckBox} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 712 713 @param wert: Es ist der Wert der C{CheckBox} anzugeben. 714 @type wert: Boolescher Wert 715 716 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 717 @type clientData: beliebiges Objekt 718 """ 719 720 # 721 # -- aktuellen Wert übernehmen ------------------------------------------ 722 # 723 self.wertNichtMod.insert( 0, wert ) 724 self.SetValue( wert ) 725 self.clientData = clientData 726 727 728 # 729 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 730 # 731 self.istVomBenutzerGeaendert = False 732 self.istBenutzerAenderungJetzt = False
733 734 735 736 # 737 # 738 # 739 # ---------------------------------------------------------------------------------------- 740 # ---------------------------------------------------------------------------------------- 741 # -- ------------------------------------------ 742 # -- ComboBox mit einigen Ergänzungen ------------------------------------------ 743 # -- ------------------------------------------ 744 # ---------------------------------------------------------------------------------------- 745 # ---------------------------------------------------------------------------------------- 746 #
747 -class ComboBoxErg( wx.ComboBox, __Ergaenzung__ ):
748 """ 749 Klasse, die eine C{wx.ComboBox} mit weiteren Funktionen versieht. 750 """ 751 752 # 753 # ------------------------------------------------------------------------------------ 754 # -- Initialisierungen -------------------------------------------------- 755 # ------------------------------------------------------------------------------------ 756 #
757 - def __init__( self, parent, choices, style, Statusleiste, dbVerbindung ):
758 wx.ComboBox.__init__( self, parent = parent, choices = choices, style = style ) 759 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 760 761 # 762 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 763 # 764 self.SetName( name = "ComboBoxErg" ) 765 766 767 # 768 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 769 # 770 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 771 772 773 # 774 # -- Ereignisse behandeln -------------------------------------------------- 775 # 776 self.Bind( wx.EVT_COMBOBOX, self.__ereignisAenderung__, self ) 777 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 778 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ ) 779 780 self.Bind( wx.EVT_CONTEXT_MENU, self.__ereignisKMenueNicht__ )
781 782 783 784 # 785 # ------------------------------------------------------------------------------------ 786 # -- Alle Einträge löschen -------------------------------------------------- 787 # ------------------------------------------------------------------------------------ 788 #
789 - def loescheAlles( self ):
790 """ 791 Mit Aufruf dieser Methode werden alle Einträge aus der C{wx.ComboBox} gelöscht, sowie C{self.istVomBenutzerGeaendert = False} und C{self.istBenutzerAenderungJetzt} gesetzt. 792 """ 793 794 795 # 796 # -- Alle Einträge löschen -------------------------------------------------- 797 # 798 del self.clientData[:] 799 self.istVomBenutzerGeaendert = False 800 self.istBenutzerAenderungJetzt = False 801 del self.wertNichtMod[:] 802 self.Clear()
803 804 805 806 807 # 808 # ------------------------------------------------------------------------------------ 809 # -- aktuellen Wert übernehmen ------------------------------------------ 810 # ------------------------------------------------------------------------------------ 811 #
812 - def nimmWert( self, wert, clientData = None ):
813 """ 814 Mit Aufruf dieser Methode wird der Wert der C{ComboBox} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 815 816 @param wert: Es ist der Wert der C{ComboBox} anzugeben. 817 @type wert: Zeichenkette 818 819 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 820 @type clientData: beliebiges Objekt 821 """ 822 823 # 824 # -- aktuellen Wert übernehmen ------------------------------------------ 825 # 826 self.wertNichtMod.append( wert ) 827 self.Append( wert, clientData ) 828 829 830 # 831 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 832 # 833 self.istVomBenutzerGeaendert = False 834 self.istBenutzerAenderungJetzt = False
835 836 837 838 # 839 # ------------------------------------------------------------------------------------ 840 # -- Virtuelle Funktion zur Rückgabe der Zusatzinformationen ---------- 841 # ------------------------------------------------------------------------------------ 842 #
843 - def gibClientData( self, selection = None, lfdNr = 0 ):
844 """ 845 Mit Aufruf dieser Methode werden die Zusatzinformationen zum aktuell ausgewählten Eintrag der C{ComboBox} zurückgegeben. 846 847 848 @param selection: Es ist die Identifikationsnummer des Eintrages der C{ComboBox} anzugeben, zu dem die Zusatzinformationen ausgegeben werden sollen. Wird C{None} angegeben oder der Wert weggelassen, wird der aktuell gewählte Eintrag verwendet. 849 @type selection: 850 851 @param lfdNr: Sollten mehrere Werte in C{self.clientData} enthalten sein, ist die laufende Nummer des zurückzugebenden Wertes anzugeben. Wird der Wert weggelassen, wird C{0} verwendet. 852 @type lfdNr: Gazzahl 853 """ 854 855 # 856 # -- Zusatzinformationen zurückgeben ------------------------------------------ 857 # 858 if( selection == None ) : return self.GetClientData( self.GetSelection() )[lfdNr] 859 else : return self.GetClientData( selection )[lfdNr]
860 861 862 863 # 864 # ------------------------------------------------------------------------------------ 865 # -- aktuellen Wert zurückgeben ------------------------------------------ 866 # ------------------------------------------------------------------------------------ 867 #
868 - def gibWert( self ):
869 """ 870 Mit Aufruf dieser Methode wird der Wert der C{ComboBox} zurückgegeben. 871 """ 872 873 # 874 # -- aktuellen Wert zurückgeben ------------------------------------------ 875 # 876 return self.GetValue()
877 878 879 880 # 881 # ------------------------------------------------------------------------------------ 882 # -- Eintrag auswählen anhand des Wertes in clienrData[0] ------------------ 883 # ------------------------------------------------------------------------------------ 884 #
885 - def selektiereWert( self, clientDataId ):
886 """ 887 Mit Aufruf dieser Methode wird der Wert der in C{ComboBox} selektiert, dem C{clientDataId} in C{clientData} zugeordnet ist . 888 889 890 @param clientDataId: Es ist die Identifikationsnummer in C{clientData} des Eintrages der C{ComboBox} anzugeben, der ausgewählt werden soll. 891 @type clientDataId: beliebig (meist Ganzzahl) 892 893 @return: C{True} wenn der Wert selektiert werden konnte; sonst C{False}. 894 @rtype: Boolean 895 """ 896 897 # 898 # -- gewünschten Wert markieren ------------------------------------------ 899 # 900 for i in range( self.GetCount() ) : 901 902 self.SetSelection( i ) 903 904 if ( self.gibClientData( selection = i, lfdNr = 0 ) == clientDataId ) : 905 906 return True 907 908 909 # 910 # -- Wert wurde nicht gefunden ------------------------------------------ 911 # 912 self.SetSelection( 0 ) 913 return False
914 915 916 917 918 # 919 # 920 # 921 # ---------------------------------------------------------------------------------------- 922 # ---------------------------------------------------------------------------------------- 923 # -- ------------------------------------------ 924 # -- Dialog mit einigen Ergänzungen ------------------------------------------ 925 # -- ------------------------------------------ 926 # ---------------------------------------------------------------------------------------- 927 # ---------------------------------------------------------------------------------------- 928 #
929 -class DialogErg( wx.Dialog ):
930 """ 931 Klasse, die eine C{wx.Dialog} mit weiteren Funktionen versieht. 932 """ 933 934 # 935 # ------------------------------------------------------------------------------------ 936 # -- Initialisierungen -------------------------------------------------- 937 # ------------------------------------------------------------------------------------ 938 #
939 - def __init__( self, parent, title, dbVerbindung, style = wx.RESIZE_BORDER ):
940 wx.Dialog.__init__( self, parent = parent, title = title, style = style ) 941 942 # 943 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 944 # 945 self.SetName( name = "DialogErg" ) 946 947 # 948 # -- SAFEPOINT behandeln -------------------------------------------------- 949 # 950 self.dbVerbindung = dbVerbindung 951 self.nameSafepoint = 'DialogErg' + str( self.GetId() ).replace( "-", "_" ) 952 self.__safepointSetzen__() 953 954 # 955 # -- Button 'Änderungen verwerfen' ------------------------------------------ 956 # 957 self.Button__Verwerfen = wx.Button( parent = self, label = u" Änderungen verwerfen " ) 958 self.Button__Verwerfen.SetMinSize( ( 200, 30 ) ) 959 self.Button__Verwerfen.SetMaxSize( ( 200, 30 ) ) 960 self.Button__Verwerfen.Enable( False ) 961 962 # 963 # -- Button 'Änderungen übernehmen' ------------------------------------------ 964 # 965 self.Button__Sichern = wx.Button( parent = self, label = u" Speichere Änderungen" ) 966 self.Button__Sichern.SetMinSize( ( 200, 30 ) ) 967 self.Button__Sichern.SetMaxSize( ( 200, 30 ) ) 968 self.Button__Sichern.Enable( False ) 969 970 # 971 # -- Button 'Fenster schließen' ------------------------------------------ 972 # 973 self.Button__FensterSchliessen = wx.Button( parent = self 974 , label = u" Fenster schließen " ) 975 self.Button__FensterSchliessen.SetMinSize( ( 150, 30 ) ) 976 self.Button__FensterSchliessen.SetMaxSize( ( 150, 30 ) ) 977 self.Button__FensterSchliessen.SetDefault() 978 self.Button__FensterSchliessen.SetFocus() 979 980 # 981 # -- Layout festlegen (1. Teil) ------------------------------------------ 982 # 983 self.FlexGridSizerButton = wx.FlexGridSizer( rows = 1, cols = 4, vgap = 0, hgap = 5 ) 984 self.FlexGridSizerButton.AddGrowableCol( idx = 0, proportion = 1 ) 985 self.FlexGridSizerButton.AddGrowableRow( idx = 0, proportion = 1 ) 986 987 988 self.FlexGridSizerButton.AddStretchSpacer() 989 self.FlexGridSizerButton.Add( self.Button__Verwerfen, flag = wx.EXPAND ) 990 self.FlexGridSizerButton.Add( self.Button__Sichern, flag = wx.EXPAND ) 991 self.FlexGridSizerButton.Add( self.Button__FensterSchliessen, flag = wx.EXPAND ) 992 993 994 self.FlexGridSizer = wx.FlexGridSizer( rows = 2, cols = 1, vgap = 5, hgap = 0 ) 995 996 self.FlexGridSizer.AddGrowableCol( idx = 0, proportion = 1 ) 997 self.FlexGridSizer.AddGrowableRow( idx = 0, proportion = 1 ) 998 999 1000 # 1001 # -- Ereignisse behandeln -------------------------------------------------- 1002 # 1003 self.Bind( wx.EVT_BUTTON, self.__ereignisVerwerfen__, self.Button__Verwerfen ) 1004 self.Bind( wx.EVT_BUTTON, self.__ereignisSpeichern__, self.Button__Sichern ) 1005 self.Bind( wx.EVT_BUTTON, self.__ereignisSchliessen__, self.Button__FensterSchliessen )
1006 1007 1008 1009 # 1010 # ------------------------------------------------------------------------------------ 1011 # -- Eingabeformular schließen; Änderungen verwerfen ---------------------------------- 1012 # ------------------------------------------------------------------------------------ 1013 #
1014 - def __ereignisSchliessen__( self, ereignis ):
1015 """ 1016 Methode die aufgerufen wird, wenn das Meldungsfenster geschlossen werden soll (sie überschreibt die Standardmethode) 1017 1018 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 1019 @type ereignis: C{wx - Ereignisobjekt} 1020 """ 1021 1022 # 1023 # -- Es liegen nichtgespeicherte Daten vor ---------------------------------- 1024 # 1025 if( self.Button__Verwerfen.IsEnabled() or self.Button__Sichern.IsEnabled() ) : 1026 1027 # 1028 # -- Meldung ausgeben ------------------------------------------ 1029 # 1030 dlg = wx.MessageDialog( parent = self 1031 , message = u"Die Änderungen wurden nicht gesichert. Soll das Fenster trotzdem geschlossen werden ?\n\nDie Änderungen werden dann verworfen." 1032 , caption = u"Änderungen verwerfen ?" 1033 , style = wx.YES_NO | wx.ICON_QUESTION ) 1034 1035 1036 # 1037 # -- Meldungsfenster nicht schließen ---------------------------------- 1038 # 1039 if ( dlg.ShowModal() != wx.ID_YES ): 1040 1041 # 1042 # -- Das Ereignis weiterreichen, damit es weiter ------------------ 1043 # -- ausgewertet werden kann ------------------ 1044 # 1045 ereignis.Skip( skip = True ) 1046 return 1047 1048 1049 # 1050 # -- Alle Änderungen bis zum letzten SAFEPOINT verwerfen ------------------ 1051 # 1052 self.__safepointVerwerfen__() 1053 1054 1055 # 1056 # -- Meldungsfenster schließen ------------------------------------------ 1057 # 1058 self.EndModal( retCode = 0 ) 1059 1060 1061 # 1062 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 1063 # -- ausgewertet werden kann -------------------------- 1064 # 1065 ereignis.Skip( skip = True )
1066 1067 1068 1069 # 1070 # ------------------------------------------------------------------------------------ 1071 # -- Änderungen Speichern -------------------------------------------------- 1072 # ------------------------------------------------------------------------------------ 1073 #
1074 - def __ereignisSpeichern__( self, ereignisDummy = None ):
1075 """ 1076 Methode die aufgerufen wird, wenn die Änderungen gespeichert werden sollen. 1077 1078 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 1079 @type ereignisDummy: C{wx - Ereignisobjekt} 1080 """ 1081 1082 # 1083 # -- Spezielle, in der abgeleiteten Klasse implementierte Aktionen ---------- 1084 # -- ausführen ---------- 1085 # 1086 self.__spezAktionenSpeichern__() 1087 1088 1089 # 1090 # -- Änderungen bis zum SAFEPOINT speichern ---------------------------------- 1091 # 1092 self.__safepointSpeichern__() 1093 1094 1095 # 1096 # -- Postgres-SAFEPOINT setzen, damit die nächsten Änderungen in ---------- 1097 # -- 'Anmerkungen' zurückgesetzt werden können ---------- 1098 # 1099 self.__safepointSetzen__() 1100 1101 1102 # 1103 # -- Button 'Änderungen verwerfen' / 'Änderungen sichern' deaktivieren -- 1104 # 1105 self.Button__Verwerfen.Enable( False ) 1106 self.Button__Sichern.Enable( False )
1107 1108 1109 1110 # 1111 # ------------------------------------------------------------------------------------ 1112 # -- Alle Änderungen verwerfen ------------------------------------------ 1113 # ------------------------------------------------------------------------------------ 1114 #
1115 - def __ereignisVerwerfen__( self, ereignisDummy = None ):
1116 """ 1117 Methode die aufgerufen wird, wenn alle Änderungen verworfen werden sollen.. 1118 1119 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 1120 @type ereignisDummy: C{wx - Ereignisobjekt} 1121 """ 1122 1123 # 1124 # -- Alle Änderungen bis zum letzten SAFEPOINT verwerfen ------------------ 1125 # 1126 self.__safepointVerwerfen__() 1127 1128 1129 # 1130 # -- Postgres-SAFEPOINT setzen, damit die nächsten Änderungen in ---------- 1131 # -- 'Anmerkungen' zurückgesetzt werden können ---------- 1132 # 1133 self.__safepointSetzen__() 1134 1135 1136 # 1137 # -- Spezielle, in der abgeleiteten Klasse implementierte Aktionen ---------- 1138 # -- ausführen ---------- 1139 # 1140 self.__spezAktionenVerwerfen__() 1141 1142 1143 # 1144 # -- Button 'Änderungen verwerfen' / 'Änderungen sichern' deaktivieren -- 1145 # 1146 self.Button__Verwerfen.Enable( False ) 1147 self.Button__Sichern.Enable( False )
1148 1149 1150 1151 # 1152 # ------------------------------------------------------------------------------------ 1153 # -- Safepoint setzen -------------------------------------------------- 1154 # ------------------------------------------------------------------------------------ 1155 #
1156 - def __safepointSetzen__( self ):
1157 """ 1158 Neuen PostgreSQL-SAFEPOINT setzen. 1159 """ 1160 1161 self.dbVerbindung.setzeSafepoint( self.nameSafepoint )
1162 1163 1164 1165 1166 # 1167 # ------------------------------------------------------------------------------------ 1168 # -- Änderungen bis zum aktuellen Safepoint speichern ------------------ 1169 # ------------------------------------------------------------------------------------ 1170 #
1171 - def __safepointSpeichern__( self ):
1172 """ 1173 Die Änderungen bis zum aktuellen PostgreSQL-SAFEPOINT speichern. 1174 """ 1175 1176 self.dbVerbindung.nimmAenderungenSafepoint( self.nameSafepoint )
1177 1178 1179 1180 # 1181 # ------------------------------------------------------------------------------------ 1182 # -- Änderungen bis zum aktuellen Safepoint verwerfen ------------------ 1183 # ------------------------------------------------------------------------------------ 1184 #
1185 - def __safepointVerwerfen__( self ):
1186 """ 1187 Die Änderungen bis zum aktuellen PostgreSQL-SAFEPOINT verwerfen. 1188 """ 1189 1190 self.dbVerbindung.verwerfeAenderungenSafepoint( self.nameSafepoint )
1191 1192 1193 1194 # 1195 # ------------------------------------------------------------------------------------ 1196 # -- Besondere Aktivitäten des abgeleiteten Objektes beim schließen ---------- 1197 # ------------------------------------------------------------------------------------ 1198 #
1199 - def __spezAktionenSpeichern__( self ):
1200 """ 1201 Methode die von der abgeleiteten Klasse überschrieben werden kann, um spezifische Aktionen beim Speichern der Änderungen auszuführen. 1202 """ 1203 1204 # 1205 # -- Erstmal keine Aktionen -------------------------------------------------- 1206 # 1207 None
1208 1209 1210 1211 # 1212 # ------------------------------------------------------------------------------------ 1213 # -- Besondere Aktivitäten des abgeleiteten Objektes beim schließen ---------- 1214 # ------------------------------------------------------------------------------------ 1215 #
1216 - def __spezAktionenVerwerfen__( self ):
1217 """ 1218 Methode die von der abgeleiteten Klasse überschrieben werden kann, um spezifische Aktionen beim Verwerfen der Änderungen auszuführen. 1219 """ 1220 1221 # 1222 # -- Erstmal keine Aktionen -------------------------------------------------- 1223 # 1224 None
1225 1226 1227 1228 # 1229 # ------------------------------------------------------------------------------------ 1230 # -- die frei definierbaren Elemente des Dialogs hinzufügen ------------------ 1231 # ------------------------------------------------------------------------------------ 1232 #
1233 - def nimmDialogElemente( self, elemente ):
1234 """ 1235 Diese Methode fügt dem Dialog die frei definierbaren Elemente hinzu. 1236 """ 1237 1238 # 1239 # -- Layout festlegen (2. Teil) ------------------------------------------ 1240 # 1241 self.FlexGridSizer.Add( elemente 1242 , flag = wx.LEFT|wx.TOP|wx.RIGHT|wx.EXPAND 1243 , border = 10 ) 1244 self.FlexGridSizer.Add( self.FlexGridSizerButton 1245 , flag = wx.LEFT|wx.BOTTOM|wx.RIGHT|wx.EXPAND 1246 , border = 10 ) 1247 1248 self.SetSizerAndFit( self.FlexGridSizer )
1249 1250 1251 1252 1253 1254 1255 # 1256 # ---------------------------------------------------------------------------------------- 1257 # ---------------------------------------------------------------------------------------- 1258 # -- ------------------------------------------ 1259 # -- ListBox mit einigen Ergänzungen ------------------------------------------ 1260 # -- ------------------------------------------ 1261 # ---------------------------------------------------------------------------------------- 1262 # ---------------------------------------------------------------------------------------- 1263 #
1264 -class ListBoxErg( wx.ListBox, __Ergaenzung__ ):
1265 """ 1266 Klasse, die eine C{wx.ListBox} mit weiteren Funktionen versieht. 1267 """ 1268 1269 # 1270 # ------------------------------------------------------------------------------------ 1271 # -- Initialisierungen -------------------------------------------------- 1272 # ------------------------------------------------------------------------------------ 1273 #
1274 - def __init__( self, parent, size, style, Statusleiste, dbVerbindung ):
1275 wx.ListBox.__init__( self, parent = parent, size = size, style = style ) 1276 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 1277 1278 # 1279 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 1280 # 1281 self.SetName( name = "ListBoxErg" ) 1282 1283 # 1284 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 1285 # 1286 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 1287 1288 1289 # 1290 # -- Ereignisse behandeln -------------------------------------------------- 1291 # 1292 self.Bind( wx.EVT_LISTBOX_DCLICK, self.__ereignisAenderung__, self ) 1293 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 1294 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ )
1295 1296 1297 # 1298 # ------------------------------------------------------------------------------------ 1299 # -- ClientData des Eintrages mit der lfdNr zurückgegeben ------------------ 1300 # ------------------------------------------------------------------------------------ 1301 #
1302 - def gibClientData( self, lfdNr = None ):
1303 """ 1304 Mit Aufruf dieser Methode wird C{ClientData} des Eintrages mit der C{lfdNr} zurückgegeben. Wenn C{lfdNr == None} werden alle Einträge zurückgegeben. 1305 1306 @param lfdNr: Es ist die lfd. Nummer des Eintrages anzugeben, dessen C{wx.ClientData} zurückgegeben werden soll. Wird C{None} angegeben, werden alle C{wx.ClientData} zurückgegeben. 1307 @type lfdNr: Ganzzahl 1308 1309 @return: C{wx.ClientData} zur C{lfdNr} 1310 @rtype: Listenobjekt 1311 """ 1312 1313 # 1314 # -- keine Einträge vorhanden ------------------------------------------ 1315 # 1316 if( self.IsEmpty() ) : return None 1317 1318 1319 # 1320 # -- clientData zurückgeben -------------------------------------------------- 1321 # 1322 if( lfdNr == None ) : 1323 clientDataTmp = [] 1324 1325 for i in range( self.GetCount() ): 1326 clientDataTmp.append( self.GetClientData( i )[0] ) 1327 1328 return clientDataTmp 1329 1330 else : 1331 return self.GetClientData( lfdNr )
1332 1333 1334 1335 # 1336 # ------------------------------------------------------------------------------------ 1337 # -- aktuellen Wert zurückgeben ------------------------------------------ 1338 # ------------------------------------------------------------------------------------ 1339 #
1340 - def gibWert( self, lfdNr = None ):
1341 """ 1342 Mit Aufruf dieser Methode wird der Wert des Eintrages mit der C{lfdNr} zurückgegeben. 1343 1344 @param lfdNr: Es ist die lfd. Nummer des Eintrages anzugeben, dessen Wert zurückgegeben werden soll. Wird C{None} angegeben, wird der Wert des aktuell ausgewählten Eintrages zurückgegeben. 1345 @type lfdNr: Ganzzahl 1346 1347 @return: Wert zur C{lfdNr} 1348 @rtype: Zeichenkette 1349 """ 1350 1351 # 1352 # -- aktuellen Wert zurückgeben ------------------------------------------ 1353 # 1354 if( lfdNr != None ) : self.SetSelection( lfdNr ) 1355 return self.GetStringSelection()
1356 1357 1358 1359 # 1360 # ------------------------------------------------------------------------------------ 1361 # -- Alle Einträge löschen -------------------------------------------------- 1362 # ------------------------------------------------------------------------------------ 1363 #
1364 - def loescheAlles( self ):
1365 """ 1366 Mit Aufruf dieser Methode werden alle Einträge aus der C{wx.ListBox} gelöscht, sowie C{self.istVomBenutzerGeaendert = False} und C{self.istBenutzerAenderungJetzt} gesetzt. 1367 """ 1368 1369 1370 # 1371 # -- Alle Einträge löschen -------------------------------------------------- 1372 # 1373 del self.clientData[:] 1374 self.istVomBenutzerGeaendert = False 1375 self.istBenutzerAenderungJetzt = False 1376 del self.wertNichtMod[:] 1377 self.Clear()
1378 1379 1380 1381 1382 # 1383 # ------------------------------------------------------------------------------------ 1384 # -- aktuellen Wert übernehmen ------------------------------------------ 1385 # ------------------------------------------------------------------------------------ 1386 #
1387 - def nimmWert( self, wert, clientData = None ):
1388 """ 1389 Mit Aufruf dieser Methode wird der Wert der C{ListBox} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 1390 1391 @param wert: Es ist der Wert der C{ListBox} anzugeben. 1392 @type wert: Zeichenkette 1393 1394 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 1395 @type clientData: beliebiges Objekt 1396 """ 1397 1398 # 1399 # -- aktuellen Wert übernehmen ------------------------------------------ 1400 # 1401 self.wertNichtMod.append( wert ) 1402 self.Append( wert, clientData ) 1403 1404 1405 # 1406 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 1407 # 1408 self.istVomBenutzerGeaendert = False 1409 self.istBenutzerAenderungJetzt = False
1410 1411 1412 1413 # 1414 # ------------------------------------------------------------------------------------ 1415 # -- Eintrag auswählen anhand des Wertes in clienrData[0] ------------------ 1416 # ------------------------------------------------------------------------------------ 1417 #
1418 - def selektiereWert( self, clientDataId ):
1419 """ 1420 Mit Aufruf dieser Methode wird der Wert der in C{ListBoxErg} selektiert, dem C{clientDataId} in C{clientData} zugeordnet ist . 1421 1422 1423 @param clientDataId: Es ist die Identifikationsnummer in C{clientData} des Eintrages der C{ListBoxErg} anzugeben, der ausgewählt werden soll. 1424 @type clientDataId: beliebig (meist Ganzzahl) 1425 1426 @return: C{True} wenn der Wert selektiert werden konnte; sonst C{False}. 1427 @rtype: Boolean 1428 """ 1429 1430 # 1431 # -- gewünschten Wert markieren ------------------------------------------ 1432 # 1433 for i in range( self.GetCount() ) : 1434 1435 self.SetSelection( i ) 1436 1437 if ( self.gibClientData( lfdNr = i )[0] == clientDataId ) : 1438 1439 return True 1440 1441 1442 # 1443 # -- Wert wurde nicht gefunden ------------------------------------------ 1444 # 1445 self.SetSelection( 0 ) 1446 return False
1447 1448 1449 1450 # 1451 # 1452 # 1453 # ---------------------------------------------------------------------------------------- 1454 # ---------------------------------------------------------------------------------------- 1455 # -- ---------------------------------- 1456 # -- >ListBox< im >SplitterWindow< mit Titel ---------------------------------- 1457 # -- ---------------------------------- 1458 # ---------------------------------------------------------------------------------------- 1459 # ---------------------------------------------------------------------------------------- 1460 #
1461 -class ListBoxSpWTitel( wx.Panel ):
1462 """ 1463 Klasse, die zwei C{ListBox} in einem C{SplitterWindow} darstellt. Weiterhin wird ein Titel zugeordnet. 1464 """ 1465 1466 # 1467 # ------------------------------------------------------------------------------------ 1468 # -- Initialisierungen -------------------------------------------------- 1469 # ------------------------------------------------------------------------------------ 1470 #
1471 - def __init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung, styleLBli = wx.BORDER_SUNKEN | wx.LB_SORT, styleLBre = wx.BORDER_SUNKEN | wx.LB_SORT ):
1472 wx.Panel.__init__( self, parent ) 1473 1474 # 1475 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 1476 # 1477 self.SetName( name = "ListBoxSpWTitel" ) 1478 1479 1480 1481 self.SplitterWindow = wx.SplitterWindow( self, -1, style = wx.SP_LIVE_UPDATE ) 1482 self.SplitterWindow.SetMinimumPaneSize( 20 ) 1483 1484 1485 # 1486 # -- linkes / rechtes Fenster ------------------------------------------ 1487 # 1488 self.ListBox__li = ListBoxErg( self.SplitterWindow 1489 , size = ( -1, -1 ) 1490 # , style = wx.BORDER_SUNKEN | wx.LB_SORT 1491 , style = styleLBli 1492 , Statusleiste = Statusleiste 1493 , dbVerbindung = dbVerbindung ) 1494 self.ListBox__re = ListBoxErg( self.SplitterWindow 1495 , size = ( -1, -1 ) 1496 # , style = wx.BORDER_SUNKEN | wx.LB_SORT 1497 , style = styleLBre 1498 , Statusleiste = Statusleiste 1499 , dbVerbindung = dbVerbindung ) 1500 1501 1502 # 1503 # -- Fenster anordnen -------------------------------------------------- 1504 # 1505 self.SplitterWindow.SplitVertically( self.ListBox__li 1506 , self.ListBox__re 1507 , -100 ) 1508 1509 self.FlexGridSizerWxObjTitel = FlexGridSizerWxObjTitel( parent = self 1510 , wxObj = self.SplitterWindow 1511 , titel = titel 1512 , orient = orient ) 1513 1514 self.FlexGridSizerWxObjTitel.wxObjekt.SetMinSize( minSize ) 1515 1516 BoxSizer = wx.BoxSizer( wx.VERTICAL ) 1517 BoxSizer.Add( self.FlexGridSizerWxObjTitel 1518 , proportion = 1 1519 , flag = wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL 1520 , border = 0 ) 1521 self.SetSizerAndFit( BoxSizer )
1522 1523 1524 1525 # 1526 # ------------------------------------------------------------------------------------ 1527 # -- Titel und wxObjekt (de)aktivieren ---------------------------------- 1528 # ------------------------------------------------------------------------------------ 1529 #
1530 - def Enable( self, enable = True ):
1531 """ 1532 Diese Methode implementiert die Standardfunktion C{Enable(...)} für diese Klasse. 1533 """ 1534 1535 # 1536 # -- Objekte (de)aktivieren -------------------------------------------------- 1537 # 1538 self.FlexGridSizerWxObjTitel.Enable( enable )
1539 1540 1541 1542 1543 # 1544 # 1545 # 1546 # ---------------------------------------------------------------------------------------- 1547 # ---------------------------------------------------------------------------------------- 1548 # -- ------------------ 1549 # -- >ListBox< im >SplitterWindow< mit Titel, bei der im rechten ------------------ 1550 # -- Fenster eine Werteliste bereitgestellt wird ------------------ 1551 # -- ------------------ 1552 # ---------------------------------------------------------------------------------------- 1553 # ---------------------------------------------------------------------------------------- 1554 #
1555 -class ListBoxSpWTitelAL( ListBoxSpWTitel ):
1556 1557 """ 1558 Klasse, die zwei C{ListBox} in einem C{SplitterWindow} darstellt, um aus einer Liste von Vorgabewerten auszuwählen. Weiterhin wird ein Titel zugeordnet. 1559 Wird ein Doppelklick auf einem Eintrag in einer der beiden C{ListBox} ausgeführt, so wird er in die andere C{ListBox} verschoben. 1560 """ 1561 1562 # 1563 # ------------------------------------------------------------------------------------ 1564 # -- Initialisierungen -------------------------------------------------- 1565 # ------------------------------------------------------------------------------------ 1566 #
1567 - def __init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung, styleLBli = wx.BORDER_SUNKEN | wx.LB_SORT, styleLBre = wx.BORDER_SUNKEN | wx.LB_SORT ):
1568 ListBoxSpWTitel.__init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung, styleLBli = styleLBli, styleLBre = styleLBre ) 1569 1570 # 1571 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 1572 # 1573 self.SetName( name = "ListBoxSpWTitelAL" ) 1574 1575 1576 # 1577 # -- linke Auswahlliste darf nicht leer sein ---------------------------------- 1578 # 1579 self.ListBoxLiDarfLeerSein = True 1580 1581 1582 # 1583 # -- Tooltip li/re setzen -------------------------------------------------- 1584 # 1585 self.ListBox__li.SetToolTip(wx.ToolTip( u"Doppelklick:\nEintrag in das Nachbarfenster schieben" )) 1586 self.ListBox__re.SetToolTip(wx.ToolTip( u"Doppelklick:\nEintrag in das Nachbarfenster schieben" )) 1587 1588 1589 # 1590 # -- Auswahlliste: Projektübergreifend gültigen Wert zeigen ist sinnlos -- 1591 # 1592 self.ListBox__re.markiereWertProjUeb = False 1593 1594 1595 # 1596 # -- Hintergrundfarbe re setzen ------------------------------------------ 1597 # 1598 self.ListBox__re.SetBackgroundColour( wx.NamedColour( farbeAuswahlListe ) ) 1599 1600 1601 # 1602 # -- Ereignisse behandeln -------------------------------------------------- 1603 # 1604 self.Bind( wx.EVT_LISTBOX_DCLICK, self.__ereignisSchieben__, self.ListBox__li ) 1605 self.Bind( wx.EVT_LISTBOX_DCLICK, self.__ereignisSchieben__, self.ListBox__re )
1606 1607 1608 1609 # 1610 # ------------------------------------------------------------------------------------ 1611 # -- Eintrag verschieben -------------------------------------------------- 1612 # ------------------------------------------------------------------------------------ 1613 #
1614 - def __ereignisSchieben__( self, ereignis = None ):
1615 """ 1616 Methode die aufgerufen wird, wenn der aktuelle Eintrag in das andere Fenster verschoben werden soll. 1617 1618 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 1619 @type ereignis: C{wx - Ereignisobjekt} 1620 """ 1621 1622 1623 # 1624 # -- Änderung kennzeichnen -------------------------------------------------- 1625 # 1626 self.ListBox__li.istVomBenutzerGeaendert = True 1627 self.ListBox__re.istVomBenutzerGeaendert = True 1628 1629 1630 # 1631 # -- Eintrag nach links verschieben ------------------------------------------ 1632 # 1633 if ereignis.GetId() == self.ListBox__re.GetId(): 1634 self.schiebeLinks( ereignis.GetClientData()[0] ) 1635 1636 1637 # 1638 # -- Eintrag nach rechts verschieben ------------------------------------------ 1639 # 1640 if( ereignis.GetId() == self.ListBox__li.GetId() ): 1641 if( self.ListBox__li.GetCount() > 1 1642 or ( self.ListBox__li.GetCount() == 1 and self.ListBoxLiDarfLeerSein ) ) : 1643 self.schiebeRechts( ereignis.GetClientData()[0] )
1644 1645 1646 1647 # 1648 # ------------------------------------------------------------------------------------ 1649 # -- Alle Einträge nach links schieben ---------------------------------- 1650 # ------------------------------------------------------------------------------------ 1651 # 1684 1685 1686 1687 # 1688 # ------------------------------------------------------------------------------------ 1689 # -- Alle Einträge nach rechts schieben ---------------------------------- 1690 # ------------------------------------------------------------------------------------ 1691 #
1692 - def schiebeAlleRechts( self ):
1693 """ 1694 Mit Aufruf dieser Methode werden alle Einträge des linken Fensters C{ListBox__li} in das rechte Fenster C{ListBox__re} verschoben und C{self.istVomBenutzerGeaendert = False} und C{self.istBenutzerAenderungJetzt} gesetzt. 1695 """ 1696 1697 1698 # 1699 # -- Historie zurücksetzen -------------------------------------------------- 1700 # 1701 self.ListBox__li.istVomBenutzerGeaendert = False 1702 self.ListBox__re.istVomBenutzerGeaendert = False 1703 1704 1705 # 1706 # -- die Routine verlassen, wenn das rechte Fenster leer ist ------------------ 1707 # 1708 if self.ListBox__li.IsEmpty(): 1709 return 1710 1711 1712 # 1713 # -- alle Einträge nach rechts schieben ---------------------------------- 1714 # 1715 for i in range( self.ListBox__li.GetCount() ) : 1716 self.ListBox__re.Append( self.ListBox__li.GetString( i ) 1717 , self.ListBox__li.GetClientData( i ) ) 1718 1719 1720 # 1721 # -- >ListBox__li< leeren -------------------------------------------------- 1722 # 1723 self.ListBox__li.Clear()
1724 1725 1726 1727 # 1728 # ------------------------------------------------------------------------------------ 1729 # -- Eintrag nach links schieben ------------------------------------------ 1730 # ------------------------------------------------------------------------------------ 1731 # 1779 1780 1781 1782 # 1783 # ------------------------------------------------------------------------------------ 1784 # -- Eintrag nach rechts schieben ------------------------------------------ 1785 # ------------------------------------------------------------------------------------ 1786 #
1787 - def schiebeRechts( self, cdNullId = None ):
1788 """ 1789 Mit Aufruf dieser Methode werden die Einträge des linken C{ListBox__li} anhand der in C{ListBox__li.wxClientData[0]} gespeicherten Identifikationsnummer C{cdNullId} in das rechte Fenster C{ListBox__re} verschoben. 1790 Wird C{cdNullId = None} übergeben, wird der erste Eintrag der Liste verschoben. 1791 1792 @param cdNullId: Es ist die in C{ListBox__re.wxClientData[0]} gespeicherte Identifikationsnummer anzugeben, die nach rechts verschoben werden soll. 1793 @type cdNullId: Ganzzahl 1794 """ 1795 1796 1797 # 1798 # -- die Routine verlassen, wenn das rechte Fenster leer ist ------------------ 1799 # 1800 if self.ListBox__li.IsEmpty(): 1801 return 1802 1803 1804 # 1805 # -- Wenn >cdNullId< nicht spezifiziert ist, den ersten Eintrag ---------- 1806 # -- verschieben ... ---------- 1807 # 1808 nrEintrag = 0 1809 1810 1811 # 1812 # -- ... sonst die lfd. Nr. des Eintrags ermitteln -------------------------- 1813 # 1814 if cdNullId != None: 1815 for nrEintrag in range( self.ListBox__li.GetCount() ) : 1816 if self.ListBox__li.GetClientData( nrEintrag )[0] == cdNullId: 1817 break 1818 1819 1820 # 1821 # -- die Routine verlassen, wenn die übergebene >cdNullId< nicht ---------- 1822 # -- gefunden wurde ---------- 1823 # 1824 if ( nrEintrag == self.ListBox__li.GetCount() - 1 ) and ( self.ListBox__li.GetClientData( nrEintrag )[0] != cdNullId ): 1825 return 1826 1827 1828 # 1829 # -- Eintrag verschieben -------------------------------------------------- 1830 # 1831 self.ListBox__re.Append( self.ListBox__li.GetString( nrEintrag ) 1832 , self.ListBox__li.GetClientData( nrEintrag ) ) 1833 self.ListBox__li.Delete( nrEintrag )
1834 1835 1836 1837 # 1838 # 1839 # 1840 # ---------------------------------------------------------------------------------------- 1841 # ---------------------------------------------------------------------------------------- 1842 # -- ------------------ 1843 # -- >ListBox< im >SplitterWindow< mit Titel, bei der der rechte ------------------ 1844 # -- und linke Eintrag synchronisiert ist ------------------ 1845 # -- ------------------ 1846 # ---------------------------------------------------------------------------------------- 1847 # ---------------------------------------------------------------------------------------- 1848 #
1849 -class ListBoxSpWTitelSync( ListBoxSpWTitel ):
1850 """ 1851 Klasse, die zwei C{ListBox} in einem C{SplitterWindow} darstellt, wobei die Einträge beider C{ListBox} inhaltlich miteinander verbunden sind. Weiterhin wird ein Titel zugeordnet. 1852 Der linke und rechte Eintrag ist synchronisiert (beide Einträge sind über eine Identifikationsnummer ansprechbar) 1853 """ 1854 1855 1856 # 1857 # ------------------------------------------------------------------------------------ 1858 # -- Initialisierungen -------------------------------------------------- 1859 # ------------------------------------------------------------------------------------ 1860 #
1861 - def __init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung, styleLBli = wx.BORDER_SUNKEN | wx.LB_SORT, styleLBre = wx.BORDER_SUNKEN | wx.LB_SORT ):
1862 ListBoxSpWTitel.__init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung, styleLBli = styleLBli, styleLBre = styleLBre ) 1863 1864 # 1865 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 1866 # 1867 self.SetName( name = "ListBoxSpWTitelSync" )
1868 1869 1870 1871 1872 1873 # 1874 # 1875 # 1876 # ---------------------------------------------------------------------------------------- 1877 # ---------------------------------------------------------------------------------------- 1878 # -- ------------------ 1879 # -- >ListBox< im >SplitterWindow< mit Titel, bei der rechter ------------------ 1880 # -- und linker Eintrag unabhängig voneinander sind ------------------ 1881 # -- ------------------ 1882 # ---------------------------------------------------------------------------------------- 1883 # ---------------------------------------------------------------------------------------- 1884 #
1885 -class ListBoxSpWTitelUnabh( ListBoxSpWTitel ):
1886 """ 1887 Klasse, die zwei C{ListBox} in einem C{SplitterWindow} miteinander verbindet, wobei die Einträge beider C{ListBox} inhaltlich unabhängig voneinander sind. Weiterhin wird ein Titel zugeordnet. 1888 Der linke und rechte Eintrag sind unabhängig voneinander. 1889 """ 1890 1891 1892 # 1893 # ------------------------------------------------------------------------------------ 1894 # -- Initialisierungen -------------------------------------------------- 1895 # ------------------------------------------------------------------------------------ 1896 #
1897 - def __init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung ):
1898 ListBoxSpWTitel.__init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung ) 1899 1900 # 1901 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 1902 # 1903 self.SetName( name = "ListBoxSpWTitelUnabh" )
1904 1905 1906 1907 1908 1909 # 1910 # 1911 # 1912 # ---------------------------------------------------------------------------------------- 1913 # ---------------------------------------------------------------------------------------- 1914 # -- ------------------------------------------ 1915 # -- MaskedTextCtrl mit einigen Ergänzungen ------------------------------------------ 1916 # -- ------------------------------------------ 1917 # ---------------------------------------------------------------------------------------- 1918 # ---------------------------------------------------------------------------------------- 1919 #
1920 -class MaskedTextCtrlErg( wxmsk.TextCtrl, __Ergaenzung__ ):
1921 """ 1922 Klasse, die eine C{MaskedTextCtrl} mit weiteren Funktionen versieht. 1923 """ 1924 1925 # 1926 # ------------------------------------------------------------------------------------ 1927 # -- Initialisierungen -------------------------------------------------- 1928 # ------------------------------------------------------------------------------------ 1929 #
1930 - def __init__( self, parent, validRequired, autoformat, Statusleiste, dbVerbindung ):
1931 wxmsk.TextCtrl.__init__( self, parent = parent 1932 , validRequired = validRequired 1933 , autoformat = autoformat ) 1934 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 1935 1936 # 1937 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 1938 # 1939 self.SetName( name = "MaskedTextCtrlErg" ) 1940 1941 1942 # 1943 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 1944 # 1945 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 1946 1947 1948 # 1949 # -- Ereignisse behandeln -------------------------------------------------- 1950 # 1951 self.Bind( wx.EVT_TEXT, self.__ereignisAenderung__, self ) 1952 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 1953 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ )
1954 1955 1956 1957 # 1958 # ------------------------------------------------------------------------------------ 1959 # -- aktuellen Wert zurückgeben ------------------------------------------ 1960 # ------------------------------------------------------------------------------------ 1961 #
1962 - def gibWert( self ):
1963 """ 1964 Mit Aufruf dieser Methode wird der Wert des C{wxmsk.TextCtrl} zurückgegeben. 1965 """ 1966 1967 # 1968 # -- aktuellen Wert zurückgeben ------------------------------------------ 1969 # 1970 return self.GetValue()
1971 1972 1973 1974 # 1975 # ------------------------------------------------------------------------------------ 1976 # -- Alle Einträge löschen -------------------------------------------------- 1977 # ------------------------------------------------------------------------------------ 1978 #
1979 - def loescheAlles( self ):
1980 """ 1981 Mit Aufruf dieser Methode wird der Text aus dem C{MaskedTextCtrl} gelöscht, sowie C{self.istVomBenutzerGeaendert = False} und C{self.istBenutzerAenderungJetzt} gesetzt. 1982 """ 1983 1984 1985 # 1986 # -- Alle Einträge löschen -------------------------------------------------- 1987 # 1988 self.istVomBenutzerGeaendert = False 1989 self.istBenutzerAenderungJetzt = False 1990 del self.wertNichtMod[:] 1991 self.Clear()
1992 1993 1994 1995 1996 # 1997 # ------------------------------------------------------------------------------------ 1998 # -- aktuellen Wert übernehmen ------------------------------------------ 1999 # ------------------------------------------------------------------------------------ 2000 #
2001 - def nimmWert( self, wert, clientData = None ):
2002 """ 2003 Mit Aufruf dieser Methode wird der Wert der C{MaskedTextCtrl} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 2004 2005 @param wert: Es ist der Wert der C{MaskedTextCtrl} anzugeben. 2006 @type wert: Zeichenkette 2007 2008 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 2009 @type clientData: beliebiges Objekt 2010 """ 2011 2012 # 2013 # -- Alles löschen ---------------------------------------------------------- 2014 # 2015 self.loescheAlles() 2016 2017 2018 # 2019 # -- aktuellen Wert übernehmen ------------------------------------------ 2020 # 2021 self.wertNichtMod.insert( 0, wert ) 2022 self.ChangeValue( wert ) 2023 self.clientData = clientData 2024 2025 2026 # 2027 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 2028 # 2029 self.istVomBenutzerGeaendert = False 2030 self.istBenutzerAenderungJetzt = False
2031 2032 2033 2034 2035 # 2036 # 2037 # 2038 # ---------------------------------------------------------------------------------------- 2039 # ---------------------------------------------------------------------------------------- 2040 # -- ---------- 2041 # -- Mehrere Menüs verwalten ---------- 2042 # -- ---------- 2043 # ---------------------------------------------------------------------------------------- 2044 # ---------------------------------------------------------------------------------------- 2045 #
2046 -class MultiMenu():
2047 """ 2048 Klasse, die mehrere C{wx.Menu} bereitstellt. 2049 """ 2050 2051 # 2052 # ------------------------------------------------------------------------------------ 2053 # -- Initialisierungen -------------------------------------------------- 2054 # ------------------------------------------------------------------------------------ 2055 #
2056 - def __init__( self ):
2057 2058 # 2059 # -- Identifikationsnummern -------------------------------------------------- 2060 # 2061 self.menu = [] 2062 2063 # 2064 # -- Identifikationsnummern -------------------------------------------------- 2065 # 2066 self.basisMenuId = 10
2067 2068 2069 2070 2071 # 2072 # ------------------------------------------------------------------------------------ 2073 # -- aktuellen Menüeintrag übernehmen ---------------------------------- 2074 # ------------------------------------------------------------------------------------ 2075 #
2076 - def aktiviereMenuEintrag( self, aktivieren, lfdNrMenu, lfdNrEintrag ):
2077 """ 2078 Mit Aufruf dieser Methode wird der Menüeintrag mit der laufenden Nummer C{lfdNrEintrag} des Menüs mit der laufenden Nummer C{lfdNrMenu} (de)aktiviert. 2079 2080 @param aktivieren: Menüeintrag aktivieren C{aktivieren = True}. Menüeintrag deaktivieren C{aktivieren = False}. 2081 @type aktivieren: Ganzzahl 2082 2083 @param lfdNrMenu: lfd. Nummer des Menüs (beginnt mit Null) 2084 @type lfdNrMenu: Ganzzahl 2085 2086 @param lfdNrEintrag: lfd. Nummer des Menüeintrages (beginnt mit Null) 2087 @type lfdNrEintrag: Ganzzahl 2088 """ 2089 2090 # 2091 # -- Menüeintrag (de)aktivieren ------------------------------------------ 2092 # 2093 self.menu[lfdNrMenu].Enable( self.gibMenuEintragId( lfdNrMenu, lfdNrEintrag ), aktivieren )
2094 2095 2096 2097 # 2098 # ------------------------------------------------------------------------------------ 2099 # -- aktuellen Menüeintrag übernehmen ---------------------------------- 2100 # ------------------------------------------------------------------------------------ 2101 #
2102 - def gibMenu( self, lfdNrMenu ):
2103 """ 2104 Mit Aufruf dieser Methode wird das Menü mit der laufenden Nummer C{lfdNrMenu} der Menüeintrag C{eintrag} übergebenzurückgegeben. 2105 2106 @param lfdNrMenu: lfd. Nummer des Menüs 2107 @type lfdNrMenu: wx.Menu 2108 """ 2109 2110 # 2111 # -- Menü zurückgeben -------------------------------------------------- 2112 # 2113 return self.menu[lfdNrMenu]
2114 2115 2116 2117 # 2118 # ------------------------------------------------------------------------------------ 2119 # -- Initialisierungen -------------------------------------------------- 2120 # ------------------------------------------------------------------------------------ 2121 #
2122 - def gibMenuEintragId( self, lfdNrMenu, lfdNrEintrag ):
2123 """ 2124 Mit Aufruf dieser Methode wird die Id des Menüeintrages mit der laufenden Nummer C{lfdNrEintrag} des Menüs mit der laufenden Nummer C{lfdNrMenu} zurückgegeben. 2125 2126 @param lfdNrMenu: lfd. Nummer des Menüs (beginnt mit Null) 2127 @type lfdNrMenu: Ganzzahl 2128 2129 @param lfdNrEintrag: lfd. Nummer des Menüeintrages (beginnt mit Null) 2130 @type lfdNrEintrag: Ganzzahl 2131 2132 @return: Id des Menüeintrages 2133 @rtype: Ganzzahl 2134 """ 2135 2136 # 2137 # -- Id berechnen und zurückgeben ------------------------------------------ 2138 # 2139 return self.basisMenuId * ( lfdNrMenu + 1 ) + lfdNrEintrag
2140 2141 2142 2143 # 2144 # ------------------------------------------------------------------------------------ 2145 # -- neues Menü erstellen -------------------------------------------------- 2146 # ------------------------------------------------------------------------------------ 2147 #
2148 - def initMenu( self ):
2149 """ 2150 Mit Aufruf dieser Methode ein neues Menü hinzugefügt. 2151 """ 2152 2153 # 2154 # -- neues Menü erstellen -------------------------------------------------- 2155 # 2156 self.menu.append( wx.Menu() )
2157 2158 2159 # 2160 # ------------------------------------------------------------------------------------ 2161 # -- aktuellen Menüeintrag übernehmen ---------------------------------- 2162 # ------------------------------------------------------------------------------------ 2163 #
2164 - def nimmMenuEintrag( self, eintrag, lfdNrMenu ):
2165 """ 2166 Mit Aufruf dieser Methode wird dem Menü mit der laufenden Nummer C{lfdNrMenu} der Menüeintrag C{eintrag} übergeben 2167 2168 @param eintrag: Es ist der Menüeintrag anzugeben. 2169 @type eintrag: Zeichenkette 2170 2171 @param lfdNrMenu: lfd. Nummer des Menüs 2172 @type lfdNrMenu: Ganzzahl 2173 """ 2174 2175 # 2176 # -- Eintrag hinzufügen -------------------------------------------------- 2177 # 2178 self.menu[lfdNrMenu].Append( self.gibMenuEintragId( lfdNrMenu, self.menu[lfdNrMenu].GetMenuItemCount() ), eintrag )
2179 2180 2181 2182 # 2183 # ------------------------------------------------------------------------------------ 2184 # -- aktuelle Ereignisbehandlung zum Menüeintrag übernehmen ------------------ 2185 # ------------------------------------------------------------------------------------ 2186 #
2187 - def nimmMenuEreignis( self, ereignisMethode, lfdNrMenu, lfdNrEintrag ):
2188 """ 2189 Mit Aufruf dieser Methode wird dem Menü mit der laufenden Nummer C{lfdNrMenu} der Menüeintrag C{eintrag} übergeben 2190 2191 @param ereignisMethode: Es ist die Methode zur Ereignisbehandlung zu übergeben. 2192 @type ereignisMethode: Zeichenkette 2193 2194 @param lfdNrMenu: lfd. Nummer des Menüs 2195 @type lfdNrMenu: Ganzzahl 2196 2197 @param lfdNrEintrag: lfd. Nummer des Menüeintrages (beginnt mit Null) 2198 @type lfdNrEintrag: Ganzzahl 2199 """ 2200 2201 # 2202 # -- Eintrag hinzufügen -------------------------------------------------- 2203 # 2204 self.menu[lfdNrMenu].Bind( wx.EVT_MENU 2205 , ereignisMethode 2206 , id = self.gibMenuEintragId( lfdNrMenu, lfdNrEintrag ) )
2207 2208 2209 2210 2211 # 2212 # ------------------------------------------------------------------------------------ 2213 # -- Trennlinie übernehmen -------------------------------------------------- 2214 # ------------------------------------------------------------------------------------ 2215 #
2216 - def nimmTrennlinie( self, lfdNrMenu ):
2217 """ 2218 Mit Aufruf dieser Methode wird dem Menü mit der laufenden Nummer C{lfdNrMenu} eine Trennlinie hinugefügt 2219 2220 @param lfdNrMenu: lfd. Nummer des Menüs 2221 @type lfdNrMenu: Ganzzahl 2222 """ 2223 2224 # 2225 # -- Trennlinie hinzufügen -------------------------------------------------- 2226 # 2227 self.menu[lfdNrMenu].AppendSeparator()
2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 # 2239 # 2240 # 2241 # ---------------------------------------------------------------------------------------- 2242 # ---------------------------------------------------------------------------------------- 2243 # -- ---------- 2244 # -- Fenster zur Auswahl der Eingabefelder, die durchsucht / gefiltert ---------- 2245 # -- werden sollen ---------- 2246 # -- ---------- 2247 # ---------------------------------------------------------------------------------------- 2248 # ---------------------------------------------------------------------------------------- 2249 #
2250 -class PopupTransientWindowFilterSuche( wx.PopupTransientWindow ):
2251 """ 2252 Klasse, die das Fenster zur Auswahl der Eingabefelder, die durchsucht / gefiltert werden sollen repräsentiert. 2253 """ 2254 2255 # 2256 # ------------------------------------------------------------------------------------ 2257 # -- Initialisierungen -------------------------------------------------- 2258 # ------------------------------------------------------------------------------------ 2259 #
2260 - def __init__( self, parent, style ):
2261 wx.PopupTransientWindow.__init__( self, parent, style ) 2262 2263 # 2264 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 2265 # 2266 self.SetName( name = "PopupTransientWindowFilterSuche" ) 2267 2268 # 2269 # Test 2270 # 2271 self.SetBackgroundColour("#FFB6C1") 2272 2273 self.cb1 = wx.CheckBox(self, -1, "Apples")#, (65, 40), (150, 20), wx.NO_BORDER) 2274 self.cb2 = wx.CheckBox(self, -1, "Oranges")#, (65, 60), (150, 20), wx.NO_BORDER) 2275 self.cb3 = wx.CheckBox(self, -1, "Pears")#, (65, 80), (150, 20), wx.NO_BORDER) 2276 2277 sizer = wx.BoxSizer(wx.VERTICAL) 2278 sizer.Add( self.cb1 ) 2279 sizer.Add( self.cb2 ) 2280 sizer.Add( self.cb3 ) 2281 self.SetSizerAndFit( sizer ) 2282 self.Layout()
2283 2284 2285 2286 2287 2288 2289 2290 # 2291 # 2292 # 2293 # ---------------------------------------------------------------------------------------- 2294 # ---------------------------------------------------------------------------------------- 2295 # -- -------------------------- 2296 # -- Spezielles Eingabeformular für Sicherheitsanforderungen -------------------------- 2297 # -- Es werden Strukturpunkte / Dokumente zugeordnet -------------------------- 2298 # -- -------------------------- 2299 # ---------------------------------------------------------------------------------------- 2300 # ---------------------------------------------------------------------------------------- 2301 #
2302 -class SiAnfStrktDok( wx.Panel ):
2303 """ 2304 Klasse zur Abbildung des Teil-Eingabeformulars der Sicherheitsanforderungen für die Strukturpunkte bzw. Dokumente 2305 """ 2306 2307 # 2308 # ------------------------------------------------------------------------------------ 2309 # -- Eingabeformular initialisieren ---------------------------------- 2310 # ------------------------------------------------------------------------------------ 2311 #
2312 - def __init__( self, parent, varId, Statusleiste, dbVerbindung, prjProjekteId, sprSprachenId, psGefszenarioId ):
2313 wx.Panel.__init__( self, parent = parent ) 2314 2315 # 2316 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 2317 # 2318 self.SetName( name = "SiAnfStrktDok" ) 2319 2320 2321 # 2322 # -- Interne Variablen -------------------------------------------------- 2323 # 2324 self.varId = varId 2325 2326 2327 2328 # 2329 # -- Verfügbare Sicherheitsanforderungen ---------------------------------- 2330 # 2331 if( self.varId == 1 ): 2332 titel = u"Verfügbare Sicherheitsanforderungen" 2333 2334 ComboBox__Titel = u"Typ der Sicherheitsanforderung:" 2335 ComboBox__Zweck = u"Verfügbare Sicherheitsanforderungen anhand des Typs einschränken." 2336 2337 CheckBox__Text = u"Alle im Projekt:" 2338 CheckBox__Zweck = u"Es wird die projektübergreifende Einschränkung auf das aktuelle Gefahrenszenario aufgehoben und alle im Projekt verfügbaren Sicherheitsanforderungen angezeigt." 2339 2340 ListBox__Titel = u"SiAnf-Id" 2341 ListBox__Zweck = u"Eineindeutige Identifikationsnummer der verfügbaren Sicherheitsanforderungen zum Gefahrenszenario." 2342 ListBox__ToolTip = u"Doppelklick:\nSicherheitsanforderung(en) der aktuell gewählten Sicherheitsanforderung bzw. dem aktuellen Gefahrenszenario zuordnen.\n\nMittlere Maustaste:\nSicherheitsanforderung (org. Maßnahme) dem aktuellen Gefahrenszenario zuordnen." 2343 2344 # 2345 # -- Zugeordnete Strukturpunkte / Dokumente / Protokolleinträge ---------- 2346 # 2347 elif( self.varId == 2 ): 2348 titel = u"Zugeordnete Strukturpunkte / Dokumente / Protokolleinträge" 2349 2350 ComboBox__Titel = u"Nicht verwendet" 2351 ComboBox__Zweck = u"Nicht verwendet" 2352 2353 CheckBox__Text = u"Nicht verwendet" 2354 CheckBox__Zweck = u"Nicht verwendet" 2355 2356 ListBox__Titel = u"Zugeordnete Strukturpunkte / Dokumente / Protokolleinträge" 2357 ListBox__Zweck = u"Eineindeutige Identifikationsnummer der zugeordneten Strukturpunkte/Dokumente/Protokolleinträge." 2358 ListBox__ToolTip = "" 2359 2360 # 2361 # -- Verfügbare Strukturpunkte ------------------------------------------ 2362 # 2363 elif( self.varId == 3 ): 2364 titel = u"Verfügbare Strukturpunkte" 2365 2366 ComboBox__Titel = u"Strukturbezeichnung:" 2367 ComboBox__Zweck = u"Verfügbare Strukturpunkte anhand der Bezeichnung einschränken." 2368 2369 CheckBox__Text = u"Alle im Projekt:" 2370 CheckBox__Zweck = u"Es wird die projektübergreifende Einschränkung auf das aktuelle Gefahrenszenario aufgehoben und alle im Projekt verfügbaren Strukturpunkte angezeigt." 2371 2372 ListBox__Titel = u"StrNr/Id" 2373 ListBox__Zweck = u"Eineindeutige Identifikationsnummer der verfügbaren Strukturpunkte zum Gefahrenszenario." 2374 ListBox__ToolTip = u"Doppelklick:\nStrukturpunkt der gewählten Sicherheitsanforderung zuordnen." 2375 2376 # 2377 # -- Verfügbare Dokumente ------------------------------------------ 2378 # 2379 elif( self.varId == 4 ): 2380 titel = u"Verfügbare Dokumente" 2381 2382 ComboBox__Titel = u"Ersteller (Firma):" 2383 ComboBox__Zweck = u"Verfügbare Dokumente anhand der Bezeichnung einschränken." 2384 2385 CheckBox__Text = u"Alle im Projekt:" 2386 CheckBox__Zweck = u"Es wird die projektübergreifende Einschränkung auf das aktuelle Gefahrenszenario aufgehoben und alle im Projekt verfügbaren Dokumente angezeigt." 2387 2388 ListBox__Titel = u"Dok-Id" 2389 ListBox__Zweck = u"Eineindeutige Identifikationsnummer der verfügbaren Dokumente zum Gefahrenszenario." 2390 ListBox__ToolTip = u"Doppelklick:\nDokument der gewählten Sicherheitsanforderung zuordnen." 2391 2392 2393 # 2394 # -- Verfügbare Protokolleinträge ------------------------------------------ 2395 # 2396 elif( self.varId == 5 ): 2397 titel = u"Verfügbare Protokolleinträge" 2398 2399 ComboBox__Titel = u"Typ der Protokolleinträge:" 2400 ComboBox__Zweck = u"Verfügbare Protokolleinträge anhand des Typs einschränken." 2401 2402 CheckBox__Text = u"Alle im Projekt:" 2403 CheckBox__Zweck = u"Es wird die projektübergreifende Einschränkung auf das aktuelle Gefahrenszenario aufgehoben und alle im Projekt verfügbaren Protokolleinträge angezeigt." 2404 2405 ListBox__Titel = u"Protokolleinträge" 2406 ListBox__Zweck = u"Eineindeutige Identifikationsnummern der verfügbaren Protokolleinträge zum Gefahrenszenario." 2407 ListBox__ToolTip = u"Doppelklick:\nProtokolleintrag dem aktuell gewählten Protokolleintrag bzw. dem aktuellen Gefahrenszenario zuordnen." 2408 2409 2410 # 2411 # -- Protokolleinträge -------------------------------------------------- 2412 # 2413 elif( self.varId == 6 ): 2414 titel = u"Protokolleintrag | Interne Notizen" 2415 2416 ComboBox__Titel = u"Nicht verwendet" 2417 ComboBox__Zweck = u"Nicht verwendet" 2418 2419 CheckBox__Text = u"Nicht verwendet" 2420 CheckBox__Zweck = u"Nicht verwendet" 2421 2422 ListBox__Titel = u"Protokolleintrag | Interne Notizen" 2423 ListBox__Zweck = u"Relevante Aufzeichnungen (Notizen, Aufgabenstellungen, Vereinbarungen, ...) zum aktuellen Gefahrenszenario und/oder Sicherheitsanforderung." 2424 ListBox__ToolTip = u"Doppelklick:\nProtokolleintrag bearbeiten\n\nEinfg:\nNeuen Protokolleintrag anlegen, der dem markierten Protokolleintrag untergeordnet ist." 2425 2426 2427 # 2428 # -- Sicherheitsanfordeungen -------------------------------------------------- 2429 # 2430 elif( self.varId == 7 ): 2431 titel = u"Sicherheitsanforderungen | Interne Notizen" 2432 2433 ComboBox__Titel = u"Nicht verwendet" 2434 ComboBox__Zweck = u"Nicht verwendet" 2435 2436 CheckBox__Text = u"Nicht verwendet" 2437 CheckBox__Zweck = u"Nicht verwendet" 2438 2439 ListBox__Titel = u"Sicherheitsanforderungen | Interne Notizen" 2440 ListBox__Zweck = u"Technisch/Organisatorische Maßnahmen zur Risikominderung." 2441 ListBox__ToolTip = u"Doppelklick:\tSicherheitsanforderungen bearbeiten" 2442 2443 2444 2445 # 2446 # -------------------------------------------------------------------------------- 2447 # -- Randbedingungen übernehmen ------------------------------------------ 2448 # -------------------------------------------------------------------------------- 2449 # 2450 self.Statusleiste = Statusleiste 2451 self.dbVerbindung = dbVerbindung 2452 self.prjProjekteId = prjProjekteId 2453 self.sprSprachenId = sprSprachenId 2454 self.psGefszenarioId = psGefszenarioId 2455 2456 2457 2458 2459 # 2460 # -------------------------------------------------------------------------------- 2461 # -- Eingabeobjekte anlegen -------------------------------------------------- 2462 # -------------------------------------------------------------------------------- 2463 # 2464 if( self.varId in [ 1, 3, 4, 5 ] ): 2465 2466 # 2467 # -- Alle Sicherheitsanforderungen / Strukturpunkte ------------------ 2468 # -- / Dokumente / Protokolleinträge ------------------ 2469 # -- im Projekt zeigen ------------------ 2470 # -- Objekt-Id = - -------------------------- 2471 # 2472 self.CheckBox__Alle = FlexGridSizerWxObjTitel( parent = self 2473 , wxObj = CheckBoxErg( self 2474 , Statusleiste = self.Statusleiste 2475 , dbVerbindung = self.dbVerbindung ) 2476 , titel = CheckBox__Text 2477 , orient = wx.VERTICAL ) 2478 2479 self.CheckBox__Alle.wxObjekt.statusLeisteDBSpNameErlaeuterung = CheckBox__Zweck 2480 2481 self.Bind( wx.EVT_CHECKBOX 2482 , self.__ereignisLiesDBVerfSiAnf__ 2483 , self.CheckBox__Alle.wxObjekt ) 2484 2485 self.Bind( wx.EVT_CHECKBOX 2486 , self.__ereignisLiesDBVerfStrkt__ 2487 , self.CheckBox__Alle.wxObjekt ) 2488 2489 self.Bind( wx.EVT_CHECKBOX 2490 , self.__ereignisLiesDBVerfDok__ 2491 , self.CheckBox__Alle.wxObjekt ) 2492 2493 self.Bind( wx.EVT_CHECKBOX 2494 , self.__ereignisLiesDBVerfProtokolleintraege__ 2495 , self.CheckBox__Alle.wxObjekt ) 2496 2497 2498 2499 # 2500 # -- Sicherheitsanforderungen / Strukturpunkte ------------------ 2501 # -- / Dokumente / Protokolleinträge einschränken ------------------ 2502 # -- Objekt-Id = - ------------------ 2503 # 2504 self.ComboBox__Selektion = FlexGridSizerWxObjTitel( parent = self 2505 , wxObj = ComboBoxErg( self 2506 , choices = [] 2507 , style = wx.CB_DROPDOWN|wx.CB_READONLY 2508 , Statusleiste = self.Statusleiste 2509 , dbVerbindung = self.dbVerbindung ) 2510 , orient = wx.VERTICAL 2511 , titel = ComboBox__Titel ) 2512 2513 self.ComboBox__Selektion.wxObjekt.SetMaxSize( ( 400, -1 ) ) 2514 2515 self.ComboBox__Selektion.wxObjekt.statusLeisteDBSpNameErlaeuterung = ComboBox__Zweck 2516 2517 self.Bind( wx.EVT_COMBOBOX 2518 , self.__ereignisLiesDBVerfSiAnf__ 2519 , self.ComboBox__Selektion.wxObjekt ) 2520 2521 self.Bind( wx.EVT_COMBOBOX 2522 , self.__ereignisLiesDBVerfStrkt__ 2523 , self.ComboBox__Selektion.wxObjekt ) 2524 2525 self.Bind( wx.EVT_COMBOBOX 2526 , self.__ereignisLiesDBVerfDok__ 2527 , self.ComboBox__Selektion.wxObjekt ) 2528 2529 self.Bind( wx.EVT_COMBOBOX 2530 , self.__ereignisLiesDBVerfProtokolleintraege__ 2531 , self.ComboBox__Selektion.wxObjekt ) 2532 2533 2534 # 2535 # -- ---------------------------------- 2536 # -- Ab hier für alle Varianten gültig ---------------------------------- 2537 # -- ---------------------------------- 2538 # 2539 2540 # 2541 # -- Sicherheitsanforderungen / Strukturpunkte -------------------------- 2542 # -- / Dokumente / Protokolleinträge - Id -------------------------- 2543 # -- Objekt-Id = - -------------------------- 2544 # 2545 self.TreeCtrlErg__Id = FlexGridSizerWxObjTitel( parent = self 2546 , wxObj = TreeCtrlErg( self 2547 , Statusleiste = self.Statusleiste 2548 , dbVerbindung = self.dbVerbindung ) 2549 , titel = ListBox__Titel 2550 , orient = wx.VERTICAL ) 2551 2552 if( self.varId in [ 5, 6, 7 ] ) : 2553 2554 self.TreeCtrlErg__Id.wxObjekt.SetMinSize( ( -1, 300 ) ) 2555 2556 2557 2558 self.TreeCtrlErg__Id.wxObjekt.statusLeisteDBSpNameErlaeuterung = ListBox__Zweck 2559 2560 self.TreeCtrlErg__Id.wxObjekt.SetToolTip( wx.ToolTip( ListBox__ToolTip ) ) 2561 2562 if( self.varId == 6, 7 ) : 2563 2564 self.TreeCtrlErg__Id.wxObjekt.SetBackgroundColour( wx.NamedColour( farbeBearbeiten ) ) 2565 2566 else : 2567 2568 self.TreeCtrlErg__Id.wxObjekt.SetBackgroundColour( wx.NamedColour( farbeAuswahlListe ) ) 2569 2570 2571 2572 2573 # 2574 # -------------------------------------------------------------------------------- 2575 # -- Layout setzen ---------------------------------------------------------- 2576 # -------------------------------------------------------------------------------- 2577 # 2578 2579 # 2580 # -- Varianten 1, 3, 4, 5 -------------------------------------------------- 2581 # 2582 if( self.varId in [ 1, 3, 4, 5 ] ): 2583 2584 FlexGridSizerH = wx.FlexGridSizer( rows = 1, cols = 2, vgap = 0, hgap = 10 ) 2585 2586 FlexGridSizerH.AddGrowableCol( idx = 0, proportion = 0 ) 2587 FlexGridSizerH.AddGrowableCol( idx = 1, proportion = 0 ) 2588 FlexGridSizerH.AddGrowableRow( idx = 0, proportion = 1 ) 2589 2590 FlexGridSizerH.Add( self.CheckBox__Alle 2591 , flag = wx.EXPAND ) 2592 2593 FlexGridSizerH.Add( self.ComboBox__Selektion 2594 , flag = wx.EXPAND ) 2595 2596 2597 FlexGridSizer = wx.FlexGridSizer( rows = 4, cols = 1, vgap = 10, hgap = 0 ) 2598 2599 FlexGridSizer.AddGrowableCol( idx = 0, proportion = 1 ) 2600 FlexGridSizer.AddGrowableRow( idx = 2, proportion = 0 ) 2601 FlexGridSizer.AddGrowableRow( idx = 3, proportion = 0 ) 2602 2603 tmp = wx.StaticText( parent = self, label = titel ) 2604 FlexGridSizer.Add( tmp 2605 , flag = wx.LEFT|wx.TOP|wx.RIGHT|wx.EXPAND 2606 , border = 10 ) 2607 2608 FlexGridSizer.Add( FlexGridSizerH 2609 , flag = wx.LEFT|wx.RIGHT|wx.EXPAND 2610 , border = 10 ) 2611 2612 FlexGridSizer.Add( self.TreeCtrlErg__Id 2613 , flag = wx.LEFT|wx.BOTTOM|wx.RIGHT|wx.EXPAND 2614 , border = 10 ) 2615 2616 self.SetSizerAndFit( FlexGridSizer ) 2617 2618 2619 # 2620 # -- Variante 2 ---------------------------------------------------------- 2621 # 2622 elif( self.varId in [ 2, 6, 7 ] ): 2623 2624 FlexGridSizer = wx.FlexGridSizer( rows = 1, cols = 1, vgap = 0, hgap = 0 ) 2625 2626 FlexGridSizer.AddGrowableCol( idx = 0, proportion = 1 ) 2627 FlexGridSizer.AddGrowableRow( idx = 0, proportion = 1 ) 2628 2629 FlexGridSizer.Add( self.TreeCtrlErg__Id 2630 , flag = wx.EXPAND ) 2631 2632 self.SetSizerAndFit( FlexGridSizer ) 2633 2634 2635 2636 # 2637 # -- Verfügbaren Typ der Sicherheitsanforderung auslesen ------------------ 2638 # 2639 if( self.varId == 1 ): 2640 2641 self.dbVerbindung.init_prtTyp( self.ComboBox__Selektion.wxObjekt 2642 , self.sprSprachenId 2643 , "SF" 2644 , hatAlle = True ) 2645 self.__ereignisLiesDBVerfSiAnf__() 2646 2647 2648 # 2649 # -- Strukturen auslesen ------------------------------------------ 2650 # -- Verfügbare Strukturen auslesen ------------------------------------------ 2651 # 2652 if( self.varId == 3 ): 2653 2654 self.dbVerbindung.init_strName( self.ComboBox__Selektion.wxObjekt ) 2655 self.__ereignisLiesDBVerfStrkt__() 2656 2657 2658 # 2659 # -- Firmen auslesen ------------------------------------------ 2660 # -- Verfügbare Dokumente auslesen ------------------------------------------ 2661 # 2662 if( self.varId == 4 ): 2663 2664 self.dbVerbindung.init_internFirma( self.ComboBox__Selektion.wxObjekt ) 2665 self.__ereignisLiesDBVerfDok__() 2666 2667 2668 2669 # 2670 # -- Typ der Protokolleinträge auselesen ---------------------------------- 2671 # -- Verfügbare Protokolleinträge ---------------------------------- 2672 # 2673 if( self.varId == 5 ): 2674 2675 self.dbVerbindung.init_prtTyp( self.ComboBox__Selektion.wxObjekt 2676 , self.sprSprachenId 2677 , "PE" 2678 , hatAlle = True ) 2679 self.__ereignisLiesDBVerfProtokolleintraege__()
2680 2681 2682 2683 2684 # 2685 # ------------------------------------------------------------------------------------ 2686 # -- Datenbank auslesen 'Verfügbare Dokumente' -------------------------- 2687 # ------------------------------------------------------------------------------------ 2688 #
2689 - def __ereignisLiesDBVerfDok__( self, ereignis = None ):
2690 """ 2691 Methode die aufgerufen wird, wenn nach Änderung des Zustandes der C{wx.CheckBox} 'Alle' bzw. der C{wx.ComboBox} 'Firma' die Datenbank ausgelesen werden muß. 2692 2693 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 2694 @type ereignis: C{wx - Ereignisobjekt} 2695 """ 2696 2697 2698 # 2699 # -- Routine verlassen, wenn Karteikarte 'Dokumente' nicht aktiv ist ---------- 2700 # 2701 if( self.varId != 4 ) : 2702 2703 # 2704 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2705 # -- ausgewertet werden kann -------------------------- 2706 # 2707 if( ereignis != None ) : ereignis.Skip( skip = True ) 2708 2709 return 2710 2711 2712 # 2713 # -- Gefahrenszenario berücksichtigen ? ---------------------------------- 2714 # 2715 gefszenario = None 2716 if( self.CheckBox__Alle.wxObjekt.gibWert() == False ) : 2717 gefszenario = self.psGefszenarioId 2718 2719 2720 # 2721 # -- Firma berücksichtigen ? ------------------------------------------ 2722 # 2723 firma = None 2724 if( self.ComboBox__Selektion.wxObjekt.gibClientData() > 0 ) : 2725 firma = self.ComboBox__Selektion.wxObjekt.gibClientData() 2726 2727 2728 2729 # 2730 # -- alle zugeordneten Strukturpunkte / Dokumente / -------------------------- 2731 # -- Protokolleinträge löschen -------------------------- 2732 # 2733 self.TreeCtrlErg__Id.wxObjekt.loescheBaum() 2734 2735 2736 2737 # 2738 # -- Verfügbare Dokumente auslesen ------------------ 2739 # -- Die Dokumente werden projektübergreifend ausgelesen ------------------ 2740 # 2741 self.dbVerbindung.selektiere__prjPrtDoku( 2742 TreeCtrlErg = self.TreeCtrlErg__Id.wxObjekt 2743 , prjProjekteId = None 2744 , sprSprachenId = self.sprSprachenId 2745 , prtProtokollId = None 2746 , psGefszenarioId = gefszenario 2747 , internFirmaId = firma ) 2748 2749 2750 2751 # 2752 # -- Baum anzeigen ---------------------------------------------------------- 2753 # 2754 self.TreeCtrlErg__Id.wxObjekt.erzeugeBaum() 2755 self.TreeCtrlErg__Id.wxObjekt.markiereWert() 2756 2757 2758 2759 # 2760 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2761 # -- ausgewertet werden kann -------------------------- 2762 # 2763 if( ereignis != None ) : ereignis.Skip( skip = True )
2764 2765 2766 2767 2768 # 2769 # ------------------------------------------------------------------------------------ 2770 # -- Datenbank auslesen 'Verfügbare Protokolleinträge' ------------------ 2771 # ------------------------------------------------------------------------------------ 2772 #
2773 - def __ereignisLiesDBVerfProtokolleintraege__( self, ereignis = None ):
2774 """ 2775 Methode die aufgerufen wird, wenn nach Änderung des Zustandes der C{wx.CheckBox} 'Alle' bzw. der C{wx.ComboBox} 'Typ des Protkolleintrages' die Datenbank ausgelesen werden muß. 2776 2777 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 2778 @type ereignis: C{wx - Ereignisobjekt} 2779 """ 2780 2781 # 2782 # -- Routine verlassen, wenn Karteikarte 'Protkolleinträge' ------------------ 2783 # -- nicht aktiv ist ------------------ 2784 # 2785 if( self.varId != 5 ) : 2786 2787 # 2788 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2789 # -- ausgewertet werden kann -------------------------- 2790 # 2791 if( ereignis != None ) : ereignis.Skip( skip = True ) 2792 2793 return 2794 2795 2796 # 2797 # -- Auf Gefahrenszenario einschränken ? ---------------------------------- 2798 # 2799 gefszenario = None 2800 projekt = self.prjProjekteId 2801 if( self.CheckBox__Alle.wxObjekt.gibWert() == False ) : 2802 2803 gefszenario = self.psGefszenarioId 2804 projekt = None 2805 2806 2807 # 2808 # -- Auf Typ der Protokolleinträge einschränken ? -------------------------- 2809 # 2810 prtTyp = None 2811 if( self.ComboBox__Selektion.wxObjekt.gibClientData() > 0 ) : 2812 2813 prtTyp = self.ComboBox__Selektion.wxObjekt.gibClientData() 2814 2815 2816 2817 # 2818 # -- alle zugeordneten Strukturpunkte / Dokumente / -------------------------- 2819 # -- Protokolleinträge löschen -------------------------- 2820 # 2821 self.TreeCtrlErg__Id.wxObjekt.loescheBaum() 2822 2823 2824 # 2825 # -- Verfügbare Protokolleinträge auslesen ------------------ 2826 # 2827 self.dbVerbindung.selektiere__psGefProt( TreeCtrlErg = self.TreeCtrlErg__Id.wxObjekt 2828 , prjProjekteId = projekt 2829 , sprSprachenId = self.sprSprachenId 2830 , psGefszenarioId = gefszenario 2831 , aspekt = 'PE' 2832 , prtTypId = prtTyp ) 2833 2834 2835 # 2836 # -- Baum anzeigen ---------------------------------------------------------- 2837 # 2838 self.TreeCtrlErg__Id.wxObjekt.erzeugeBaum() 2839 self.TreeCtrlErg__Id.wxObjekt.markiereWert() 2840 2841 2842 # 2843 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2844 # -- ausgewertet werden kann -------------------------- 2845 # 2846 if( ereignis != None ) : ereignis.Skip( skip = True )
2847 2848 2849 2850 2851 # 2852 # ------------------------------------------------------------------------------------ 2853 # -- Datenbank auslesen 'Verfügbare Sicherheitsanforderungen' ---------- 2854 # ------------------------------------------------------------------------------------ 2855 #
2856 - def __ereignisLiesDBVerfSiAnf__( self, ereignis = None ):
2857 """ 2858 Methode die aufgerufen wird, wenn nach Änderung des Zustandes der C{wx.CheckBox} 'Alle' bzw. der C{wx.ComboBox} 'Typ der Sicherheitsanforderung' die Datenbank ausgelesen werden muß. 2859 2860 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 2861 @type ereignis: C{wx - Ereignisobjekt} 2862 """ 2863 2864 2865 # 2866 # -- Routine verlassen, wenn Karteikarte 'Sicherheitsanforderungen' ---------- 2867 # -- nicht aktiv ist ---------- 2868 # 2869 if( self.varId != 1 ) : 2870 2871 # 2872 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2873 # -- ausgewertet werden kann -------------------------- 2874 # 2875 if( ereignis != None ) : ereignis.Skip( skip = True ) 2876 2877 return 2878 2879 2880 # 2881 # -- Auf Gefahrenszenario einschränken ? ---------------------------------- 2882 # 2883 gefszenario = None 2884 projekt = self.prjProjekteId 2885 if( self.CheckBox__Alle.wxObjekt.gibWert() == False ) : 2886 gefszenario = self.psGefszenarioId 2887 projekt = None 2888 2889 2890 # 2891 # -- Auf Typ der Sicherheitsanforderung einschränken ? ------------------ 2892 # 2893 prtTyp = None 2894 if( self.ComboBox__Selektion.wxObjekt.gibClientData() > 0 ) : 2895 prtTyp = self.ComboBox__Selektion.wxObjekt.gibClientData() 2896 2897 2898 # 2899 # -- Verfügbare Sicherheitsanforderungen auslesen -------------------------- 2900 # 2901 self.dbVerbindung.selektiere__psPrtProtokoll( 2902 TreeCtrlErg = self.TreeCtrlErg__Id.wxObjekt 2903 , prjProjekteId = projekt 2904 , sprSprachenId = self.sprSprachenId 2905 , psGefszenarioId = gefszenario 2906 , prtTypId = prtTyp ) 2907 2908 2909 # 2910 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2911 # -- ausgewertet werden kann -------------------------- 2912 # 2913 if( ereignis != None ) : ereignis.Skip( skip = True )
2914 2915 2916 2917 2918 # 2919 # ------------------------------------------------------------------------------------ 2920 # -- Datenbank auslesen 'Verfügbare Strukturen' -------------------------- 2921 # ------------------------------------------------------------------------------------ 2922 #
2923 - def __ereignisLiesDBVerfStrkt__( self, ereignis = None ):
2924 """ 2925 Methode die aufgerufen wird, wenn nach Änderung des Zustandes der C{wx.CheckBox} 'Alle' bzw. der C{wx.ComboBox} 'Strukturen' die Datenbank ausgelesen werden muß. 2926 2927 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 2928 @type ereignis: C{wx - Ereignisobjekt} 2929 """ 2930 2931 2932 # 2933 # -- Routine verlassen, wenn Karteikarte 'Strukturen' nicht aktiv ist ---------- 2934 # 2935 if( self.varId != 3 ) : 2936 2937 # 2938 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2939 # -- ausgewertet werden kann -------------------------- 2940 # 2941 if( ereignis != None ) : ereignis.Skip( skip = True ) 2942 2943 return 2944 2945 2946 2947 # 2948 # -- Auf Gefahrenszenario einschränken ? ---------------------------------- 2949 # 2950 gefszenario = None 2951 if( self.CheckBox__Alle.wxObjekt.gibWert() == False ) : 2952 gefszenario = self.psGefszenarioId 2953 2954 2955 2956 # 2957 # -- Auf Strukturbezeichnung einschränken ? ---------------------------------- 2958 # 2959 strName = None 2960 if( self.ComboBox__Selektion.wxObjekt.gibClientData() > 0 ) : 2961 strName = self.ComboBox__Selektion.wxObjekt.gibClientData() 2962 2963 2964 2965 # 2966 # -- alle zugeordneten Strukturpunkte / Dokumente / -------------------------- 2967 # -- Protokolleinträge löschen -------------------------- 2968 # 2969 self.TreeCtrlErg__Id.wxObjekt.loescheBaum() 2970 2971 2972 2973 # 2974 # -- Verfügbare Strukturpunkte auslesen ------------------ 2975 # 2976 self.dbVerbindung.selektiere__psPrtStrkt( 2977 TreeCtrlErg = self.TreeCtrlErg__Id.wxObjekt 2978 , prjProjekteId = self.prjProjekteId 2979 , sprSprachenId = self.sprSprachenId 2980 , prtProtokollId = None 2981 , psGefszenarioId = gefszenario 2982 , strNameId = strName ) 2983 2984 2985 # 2986 # -- Baum anzeigen ---------------------------------------------------------- 2987 # 2988 self.TreeCtrlErg__Id.wxObjekt.erzeugeBaum() 2989 self.TreeCtrlErg__Id.wxObjekt.markiereWert() 2990 2991 2992 2993 # 2994 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2995 # -- ausgewertet werden kann -------------------------- 2996 # 2997 if( ereignis != None ) : ereignis.Skip( skip = True )
2998 2999 3000 3001 3002 3003 3004 3005 # 3006 # 3007 # 3008 # ---------------------------------------------------------------------------------------- 3009 # ---------------------------------------------------------------------------------------- 3010 # -- -------------------------- 3011 # -- Sicherheitsanforderungen einschliesslich zugeordneter -------------------------- 3012 # -- Strukturpunkte / Dokumente / Protokolleinträge -------------------------- 3013 # -- -------------------------- 3014 # ---------------------------------------------------------------------------------------- 3015 # ---------------------------------------------------------------------------------------- 3016 #
3017 -class SiAnf( wx.Panel ):
3018 """ 3019 Klasse zur Abbildung des Eingabeformulars der Sicherheitsanforderungen einschließlich Darstellung der zugeordneten Strukturpunkte, Dokumente, Protkolleinträge. 3020 """ 3021 3022 # 3023 # ------------------------------------------------------------------------------------ 3024 # -- Eingabeformular initialisieren ---------------------------------- 3025 # ------------------------------------------------------------------------------------ 3026 #
3027 - def __init__( self, parent, Statusleiste, dbVerbindung, prjProjekteId, sprSprachenId, psGefszenarioId, varId = 7, dlgBearbeiteSicherheitsanf = None ):
3028 wx.Panel.__init__( self, parent = parent ) 3029 3030 # 3031 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 3032 # 3033 self.SetName( name = "SiAnf" ) 3034 3035 3036 # 3037 # -------------------------------------------------------------------------------- 3038 # -- Randbedingungen übernehmen ------------------------------------------ 3039 # -------------------------------------------------------------------------------- 3040 # 3041 self.Statusleiste = Statusleiste 3042 self.dbVerbindung = dbVerbindung 3043 self.prjProjekteId = prjProjekteId 3044 self.sprSprachenId = sprSprachenId 3045 self.psGefszenarioId = psGefszenarioId 3046 self.dlgBearbeiteSicherheitsanf = dlgBearbeiteSicherheitsanf 3047 3048 3049 # 3050 # -- Sicherheitsanforderungen ------------------------------------------ 3051 # -- Objekt-Id = -255 / -256 ------------------ 3052 # 3053 self.SiAnfStrktDok__SiAnf = SiAnfStrktDok( parent = self 3054 , varId = varId 3055 , Statusleiste = self.Statusleiste 3056 , dbVerbindung = self.dbVerbindung 3057 , prjProjekteId = self.prjProjekteId 3058 , sprSprachenId = self.sprSprachenId 3059 , psGefszenarioId = self.psGefszenarioId ) 3060 3061 self.SiAnfStrktDok__SiAnf.SetMinSize( ( -1, 350 ) ) 3062 3063 3064 self.Bind( wx.EVT_TREE_SEL_CHANGED 3065 , self.__ereignisNavigation__ 3066 , self.SiAnfStrktDok__SiAnf.TreeCtrlErg__Id.wxObjekt ) 3067 3068 3069 # 3070 # -- Bearbeiten nur bei Dialogen der Klasse ---------------------------------- 3071 # -- >BearbeiteSicherheitsanf()< ausführen ---------------------------------- 3072 # 3073 # if( self.dlgBearbeiteSicherheitsanf.GetName() == "BearbeiteSicherheitsanf" ) : 3074 if( self.dlgBearbeiteSicherheitsanf is not None ) : 3075 3076 self.Bind( wx.EVT_TREE_ITEM_ACTIVATED 3077 , self.__ereignisBearbeiten__ 3078 , self.SiAnfStrktDok__SiAnf.TreeCtrlErg__Id.wxObjekt ) 3079 3080 3081 # 3082 # -- Zugeordnete Strukturpunkte, Dokumente / ------------------ 3083 # -- Interne Notizen zu den Strukturpunkten, Dokumenten ------------------ 3084 # -- Objekt-Id = - ------------------ 3085 # 3086 self.SiAnfStrktDok__Zugeordnet = SiAnfStrktDok( parent = self 3087 , varId = 2 3088 , Statusleiste = self.Statusleiste 3089 , dbVerbindung = self.dbVerbindung 3090 , prjProjekteId = self.prjProjekteId 3091 , sprSprachenId = self.sprSprachenId 3092 , psGefszenarioId = self.psGefszenarioId ) 3093 3094 self.SiAnfStrktDok__Zugeordnet.TreeCtrlErg__Id.wxObjekt.SetBackgroundColour( self.GetBackgroundColour() ) 3095 3096 self.SiAnfStrktDok__Zugeordnet.SetMinSize( ( -1, 300 ) ) 3097 3098 3099 3100 # 3101 # -------------------------------------------------------------------------------- 3102 # -- Layout setzen ---------------------------------------------------------- 3103 # -------------------------------------------------------------------------------- 3104 # 3105 FlexGridSizer = wx.FlexGridSizer( rows = 2, cols = 1, vgap = 10, hgap = 0 ) 3106 3107 FlexGridSizer.AddGrowableCol( idx = 0, proportion = 1 ) 3108 FlexGridSizer.AddGrowableRow( idx = 0, proportion = 0 ) 3109 FlexGridSizer.AddGrowableRow( idx = 1, proportion = 0 ) 3110 3111 FlexGridSizer.Add( self.SiAnfStrktDok__SiAnf 3112 , flag = wx.EXPAND ) 3113 3114 FlexGridSizer.Add( self.SiAnfStrktDok__Zugeordnet 3115 , flag = wx.EXPAND ) 3116 3117 self.SetSizerAndFit( FlexGridSizer )
3118 3119 3120 3121 3122 3123 # 3124 # ------------------------------------------------------------------------------------ 3125 # -- Sicherheitsanforderungen bearbeiten ---------------------------------- 3126 # ------------------------------------------------------------------------------------ 3127 #
3128 - def __ereignisBearbeiten__( self, ereignis ):
3129 """ 3130 Sicherheitsaforderungen zum Gefahrenszenario bearbeiten. 3131 3132 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 3133 @type ereignis: C{wx - Ereignisobjekt} 3134 """ 3135 3136 3137 # 3138 # -- Meldung ausgeben -------------------------------------------------- 3139 # 3140 self.dlgBearbeiteSicherheitsanf.SiAnf__SiAnf.liesDB( psGefszenarioId = self.psGefszenarioId ) 3141 self.dlgBearbeiteSicherheitsanf.SetMinSize( ( 800, 700 ) ) 3142 self.dlgBearbeiteSicherheitsanf.ShowModal() 3143 3144 3145 # 3146 # -- Sicherheitsanforderungen aktualisieren ---------------------------------- 3147 # 3148 self.dbVerbindung.selektiere__psPrtProtokoll( TreeCtrlErg = self.SiAnfStrktDok__SiAnf.TreeCtrlErg__Id.wxObjekt 3149 , prjProjekteId = self.prjProjekteId 3150 , sprSprachenId = self.sprSprachenId 3151 , psGefszenarioId = self.psGefszenarioId 3152 , prtTypId = None ) 3153 3154 3155 # 3156 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 3157 # -- ausgewertet werden kann -------------------------- 3158 # 3159 ereignis.Skip( skip = True )
3160 3161 3162 3163 3164 # 3165 # ------------------------------------------------------------------------------------ 3166 # -- Innerhalb der Sicherheitsanforderungen navigieren ------------------ 3167 # ------------------------------------------------------------------------------------ 3168 #
3169 - def __ereignisNavigation__( self, ereignis = None ):
3170 """ 3171 Innerhalb der Sicherheitsaforderungen die Dokumente / Strukturpunkte anzeigen. 3172 3173 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 3174 @type ereignis: C{wx - Ereignisobjekt} 3175 """ 3176 3177 # 3178 # -- prt_protokoll_id übernehmen ------------------------------------------ 3179 # 3180 prt_protokoll_id = self.SiAnfStrktDok__SiAnf.TreeCtrlErg__Id.wxObjekt.gibDbId() 3181 3182 3183 # 3184 # -- alle zugeordneten Strukturpunkte / Dokumente / -------------------------- 3185 # -- Protokolleinträge löschen -------------------------- 3186 # 3187 self.SiAnfStrktDok__Zugeordnet.TreeCtrlErg__Id.wxObjekt.loescheBaum() 3188 3189 3190 # 3191 # -- Zugeordnete Strukturpunkte / Dokumente / -------------------------- 3192 # -- Protokolleinträge eintragen -------------------------- 3193 # 3194 self.dbVerbindung.selektiere__psPrtStrkt( 3195 TreeCtrlErg = self.SiAnfStrktDok__Zugeordnet.TreeCtrlErg__Id.wxObjekt 3196 , prjProjekteId = self.prjProjekteId 3197 , sprSprachenId = self.sprSprachenId 3198 , prtProtokollId = prt_protokoll_id 3199 , psGefszenarioId = None 3200 , strNameId = None ) 3201 3202 self.dbVerbindung.selektiere__prjPrtDoku( 3203 TreeCtrlErg = self.SiAnfStrktDok__Zugeordnet.TreeCtrlErg__Id.wxObjekt 3204 , prjProjekteId = self.prjProjekteId 3205 , sprSprachenId = self.sprSprachenId 3206 , prtProtokollId = prt_protokoll_id 3207 , psGefszenarioId = None 3208 , internFirmaId = None ) 3209 3210 self.dbVerbindung.selektiere__psGefProt( 3211 TreeCtrlErg = self.SiAnfStrktDok__Zugeordnet.TreeCtrlErg__Id.wxObjekt 3212 , prjProjekteId = self.prjProjekteId 3213 , sprSprachenId = self.sprSprachenId 3214 , psGefszenarioId = self.psGefszenarioId 3215 , aspekt = 'PE' 3216 , prtTypId = None 3217 , prtProtokollIdVorg = prt_protokoll_id ) 3218 3219 3220 3221 # 3222 # -- Baum anzeigen ---------------------------------------------------------- 3223 # 3224 self.SiAnfStrktDok__Zugeordnet.TreeCtrlErg__Id.wxObjekt.erzeugeBaum() 3225 self.SiAnfStrktDok__Zugeordnet.TreeCtrlErg__Id.wxObjekt.markiereWert() 3226 3227 3228 3229 # 3230 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 3231 # -- ausgewertet werden kann -------------------------- 3232 # 3233 if( ereignis != None ) : ereignis.Skip( skip = True )
3234 3235 3236 3237 # 3238 # ------------------------------------------------------------------------------------ 3239 # -- Gefahrenszenario-Id übernehmen ------------------------------------------ 3240 # ------------------------------------------------------------------------------------ 3241 #
3242 - def nimmPsGefszenarioId( self, psGefszenarioId ):
3243 """ 3244 Methode die aufgerufen wird, um die C{ps.gefszenario.id} zu übernehmen. 3245 3246 @param psGefszenarioId: Es ist die Identifikationsnummer des Gefahrenszenarios anzugeben. 3247 @type psGefszenarioId: Ganzzahl 3248 """ 3249 3250 # 3251 # -- Gefahrenszenario-Id übernehmen ------------------------------------------ 3252 # 3253 self.psGefszenarioId = psGefszenarioId 3254 3255 if( self.dlgBearbeiteSicherheitsanf is not None ) : 3256 3257 self.dlgBearbeiteSicherheitsanf.nimmPsGefszenarioId( psGefszenarioId = psGefszenarioId )
3258 3259 3260 3261 # 3262 # ------------------------------------------------------------------------------------ 3263 # -- Datenbank auslesen -------------------------------------------------- 3264 # ------------------------------------------------------------------------------------ 3265 #
3266 - def liesDB( self, psGefszenarioId = None ):
3267 """ 3268 Methode die aufgerufen wird, wenn die Datenbankwerte im Fenster dargestellt werden sollen. 3269 3270 @param psGefszenarioId: Es ist die Identifikationsnummer des Gefahrenszenarios anzugeben. 3271 @type psGefszenarioId: Ganzzahl 3272 """ 3273 3274 self.psGefszenarioId = psGefszenarioId 3275 3276 # 3277 # -- Gefahrenszenario auslesen (>prj.zeige__psgefszenario<) ------------------ 3278 # 3279 if self.psGefszenarioId != None: 3280 3281 # 3282 # -- Sicherheitsanforderungen ---------------------------------- 3283 # 3284 self.dbVerbindung.selektiere__psPrtProtokoll( TreeCtrlErg = self.SiAnfStrktDok__SiAnf.TreeCtrlErg__Id.wxObjekt 3285 , prjProjekteId = self.prjProjekteId 3286 , sprSprachenId = self.sprSprachenId 3287 , psGefszenarioId = self.psGefszenarioId 3288 , prtTypId = None )
3289 3290 3291 3292 3293 # 3294 # ---------------------------------------------------------------------------------------- 3295 # ---------------------------------------------------------------------------------------- 3296 # -- ------------------------------------------ 3297 # -- wx.TextCtrl mit einigen Ergänzungen ------------------------------------------ 3298 # -- ------------------------------------------ 3299 # ---------------------------------------------------------------------------------------- 3300 # ---------------------------------------------------------------------------------------- 3301 #
3302 -class TextCtrlAuswStatisch( wx.TextCtrl, __Ergaenzung__ ):
3303 """ 3304 Klasse, die einem C{wx.TextCtrl} eine Auswahlliste zuordnet, aus der die anzuzeigenden Wert entnommen werden. 3305 """ 3306 3307 # 3308 # ------------------------------------------------------------------------------------ 3309 # -- Initialisierungen -------------------------------------------------- 3310 # ------------------------------------------------------------------------------------ 3311 #
3312 - def __init__( self, parent, size, Statusleiste, dbVerbindung ):
3313 wx.TextCtrl.__init__( self, parent = parent, size = size, style = wx.TE_READONLY ) 3314 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 3315 3316 # 3317 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 3318 # 3319 self.SetName( name = "TextCtrlAuswStatisch" ) 3320 3321 3322 # 3323 # -- Hintergrundfarbe auf 'Nicht bearbeitbar' setzen -------------------------- 3324 # 3325 self.SetBackgroundColour( self.GetParent().GetBackgroundColour() ) 3326 3327 3328 # 3329 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 3330 # 3331 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 3332 3333 3334 # 3335 # -- die Auswahlliste -------------------------------------------------- 3336 # 3337 self.__Auswahlliste__ = [] 3338 3339 3340 # 3341 # -- Lfd. Nr. des aktuell gewählten Wertes ---------------------------------- 3342 # 3343 self.__aktLfdNr__ = 0 3344 3345 3346 # 3347 # -- Ereignisse behandeln -------------------------------------------------- 3348 # 3349 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 3350 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ ) 3351 3352 self.Bind( wx.EVT_CONTEXT_MENU, self.__ereignisKMenueNicht__ )
3353 3354 3355 3356 # 3357 # ------------------------------------------------------------------------------------ 3358 # -- Anzahl der Einträge der Auswahlliste angeben -------------------------- 3359 # ------------------------------------------------------------------------------------ 3360 #
3361 - def gibAnzahl( self ):
3362 """ 3363 Mit Aufruf dieser Methode wird die Gesamtzahl der Einträge der Auswahlliste des C{wx.TextCtrl} zurückgegeben. 3364 3365 @return: Es wird die Gesamtzahl der Einträge der Auswahlliste zurückgegeben. 3366 @rtype: Ganzzahl 3367 """ 3368 3369 # 3370 # -- Anzahl ermitteln -------------------------------------------------- 3371 # 3372 return len( self.__Auswahlliste__ )
3373 3374 3375 # 3376 # ------------------------------------------------------------------------------------ 3377 # -- ClientData des Eintrages mit der lfdNr zurückgegeben ------------------ 3378 # ------------------------------------------------------------------------------------ 3379 #
3380 - def gibClientData( self, lfdNr = None, gibAktWert = True ):
3381 """ 3382 Mit Aufruf dieser Methode wird C{ClientData} des Eintrages mit der C{lfdNr} zurückgegeben. Wenn C{lfdNr == None UND gibAktWert == True} wird C{ClientData} des aktuellen Wertes zurückgegebene. Wenn C{lfdNr == None UND gibAktWert == False} wird C{ClientData} zu allen Einträgen zurückgegeben. 3383 3384 @param gibAktWert : Wird C{True} angegeben (UND C{lfdNr == None}) wird der aktuelle Wert zurückgegeben. Wird C{False} angegeben (UND C{lfdNr == None}) 3385 @type gibAktWert : 3386 3387 @param lfdNr: Es ist die lfd. Nummer des Eintrages anzugeben, dessen C{wx.ClientData} zurückgegeben werden soll. 3388 @type lfdNr: Ganzzahl 3389 3390 @return: C{wx.ClientData} zur C{lfdNr} 3391 @rtype: Listenobjekt 3392 """ 3393 3394 # 3395 # -- keine Einträge vorhanden ------------------------------------------ 3396 # 3397 if( len( self.__Auswahlliste__ ) == 0 ) : return None 3398 3399 3400 # 3401 # -- clientData zurückgeben -------------------------------------------------- 3402 # 3403 if( lfdNr == None ) : 3404 if( gibAktWert ) : return self.clientData[self.__aktLfdNr__] 3405 else : return self.clientData 3406 else : 3407 return self.clientData[lfdNr]
3408 3409 3410 3411 # 3412 # ------------------------------------------------------------------------------------ 3413 # -- aktuellen Wert zurückgeben ------------------------------------------ 3414 # ------------------------------------------------------------------------------------ 3415 #
3416 - def gibWert( self ):
3417 """ 3418 Mit Aufruf dieser Methode wird der Wert der C{TextCtrl} zurückgegeben. 3419 """ 3420 3421 # 3422 # -- aktuellen Wert zurückgeben ------------------------------------------ 3423 # 3424 return self.GetValue()
3425 3426 3427 3428 # 3429 # ------------------------------------------------------------------------------------ 3430 # -- Alle Einträge löschen -------------------------------------------------- 3431 # ------------------------------------------------------------------------------------ 3432 #
3433 - def loescheAlles( self ):
3434 """ 3435 Mit Aufruf dieser Methode werden alle Einträge aus dem C{wx.TextCtrl} gelöscht, sowie C{self.istVomBenutzerGeaendert = False} und C{self.istBenutzerAenderungJetzt} gesetzt. 3436 """ 3437 3438 3439 # 3440 # -- Alle Einträge löschen -------------------------------------------------- 3441 # 3442 self.istVomBenutzerGeaendert = False 3443 self.istBenutzerAenderungJetzt = False 3444 self.__Auswahlliste__ = [] 3445 self.__aktLfdNr__ = 0 3446 del self.wertNichtMod[:] 3447 self.ChangeValue( "" )
3448 3449 3450 3451 # 3452 # ------------------------------------------------------------------------------------ 3453 # -- aktuellen Wert übernehmen ------------------------------------------ 3454 # ------------------------------------------------------------------------------------ 3455 #
3456 - def nimmWert( self, wert, clientData = None ):
3457 """ 3458 Mit Aufruf dieser Methode werden die Werte der C{wx.TextCtrl} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 3459 3460 @param wert: Es ist ein Wert der Auswahlliste des C{wx.TextCtrl} anzugeben. 3461 @type wert: Zeichenkette 3462 3463 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 3464 @type clientData: beliebiges Objekt 3465 """ 3466 3467 # 3468 # -- aktuellen Wert übernehmen ------------------------------------------ 3469 # 3470 self.wertNichtMod.append( wert ) 3471 self.__Auswahlliste__.append( wert ) 3472 self.clientData.append( clientData ) 3473 3474 3475 # 3476 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 3477 # 3478 self.istVomBenutzerGeaendert = False 3479 self.istBenutzerAenderungJetzt = False
3480 3481 3482 3483 # 3484 # ------------------------------------------------------------------------------------ 3485 # -- ClientData des Eintrages mit der lfdNr zurückgegeben ------------------ 3486 # ------------------------------------------------------------------------------------ 3487 #
3488 - def selektiereWert( self, lfdNr ):
3489 """ 3490 Mit Aufruf dieser Methode wird der Wert des Eintrages mit der C{lfdNr} ausgewählt. 3491 3492 @param lfdNr: Es ist die lfd. Nummer des Eintrages anzugeben, dessen Wert ausgewählt werden soll. 3493 @type lfdNr: Ganzzahl 3494 """ 3495 3496 # 3497 # -- Wert setzen -------------------------------------------------- 3498 # 3499 self.__aktLfdNr__ = lfdNr 3500 self.ChangeValue( self.__Auswahlliste__[lfdNr] )
3501 3502 3503 3504 # 3505 # 3506 # 3507 # ---------------------------------------------------------------------------------------- 3508 # ---------------------------------------------------------------------------------------- 3509 # -- ------------------------------------------ 3510 # -- wx.TextCtrl mit einigen Ergänzungen ------------------------------------------ 3511 # -- ------------------------------------------ 3512 # ---------------------------------------------------------------------------------------- 3513 # ---------------------------------------------------------------------------------------- 3514 #
3515 -class TextCtrlErg( wx.TextCtrl, __TextFunktionen__ ):
3516 """ 3517 Klasse, die eine C{wx.TextCtrl} mit weiteren Funktionen versieht. 3518 """ 3519 3520 # 3521 # ------------------------------------------------------------------------------------ 3522 # -- Initialisierungen -------------------------------------------------- 3523 # ------------------------------------------------------------------------------------ 3524 #
3525 - def __init__( self, parent, size, style, Statusleiste, dbVerbindung ):
3526 wx.TextCtrl.__init__( self, parent = parent, size = size, style = style ) 3527 __TextFunktionen__.__init__( self, Statusleiste = Statusleiste ) 3528 3529 # 3530 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 3531 # 3532 self.SetName( name = "TextCtrlErg" ) 3533 3534 3535 # 3536 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 3537 # 3538 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 3539 3540 3541 # 3542 # -- Ereignisse behandeln -------------------------------------------------- 3543 # 3544 self.Bind( wx.EVT_TEXT, self.__ereignisAenderung__, self ) 3545 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 3546 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ ) 3547 self.Bind( wx.EVT_LEAVE_WINDOW, self.__frageRechtschreibfehlerkorrekur__ )
3548 3549 3550 # 3551 # ------------------------------------------------------------------------------------ 3552 # -- ClientData zurückgegeben ------------------------------------------ 3553 # ------------------------------------------------------------------------------------ 3554 #
3555 - def gibClientData( self ):
3556 """ 3557 Mit Aufruf dieser Methode wird C{self.clientData} zurückgegeben. 3558 3559 @return: self.clientData 3560 @rtype: Listenobjekt 3561 """ 3562 3563 return self.clientData
3564 3565 3566 3567 # 3568 # ------------------------------------------------------------------------------------ 3569 # -- aktuellen Wert zurückgeben ------------------------------------------ 3570 # ------------------------------------------------------------------------------------ 3571 #
3572 - def gibWert( self ):
3573 """ 3574 Mit Aufruf dieser Methode wird der Wert des C{TextCtrl} zurückgegeben. 3575 """ 3576 3577 # 3578 # -- aktuellen Wert übernehmen ------------------------------------------ 3579 # 3580 return self.GetValue()
3581 3582 3583 3584 # 3585 # ------------------------------------------------------------------------------------ 3586 # -- Alle Einträge löschen -------------------------------------------------- 3587 # ------------------------------------------------------------------------------------ 3588 #
3589 - def loescheAlles( self ):
3590 """ 3591 Mit Aufruf dieser Methode werden alle Einträge aus dem C{wx.TextCtrl} gelöscht, sowie C{self.istVomBenutzerGeaendert = False} und C{self.istBenutzerAenderungJetzt} gesetzt. 3592 """ 3593 3594 3595 # 3596 # -- Alle Einträge löschen -------------------------------------------------- 3597 # 3598 self.istVomBenutzerGeaendert = False 3599 self.istBenutzerAenderungJetzt = False 3600 del self.wertNichtMod[:] 3601 self.ChangeValue( "" ) # kein wx.EVENT erzeugen !
3602 3603 3604 3605 3606 # 3607 # ------------------------------------------------------------------------------------ 3608 # -- aktuellen Wert übernehmen ------------------------------------------ 3609 # ------------------------------------------------------------------------------------ 3610 #
3611 - def nimmWert( self, wert, clientData = None ):
3612 """ 3613 Mit Aufruf dieser Methode wird der Wert der C{wx.TextCtrl} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 3614 3615 @param wert: Es ist der Wert der C{wx.TextCtrl} anzugeben. 3616 @type wert: Zeichenkette 3617 3618 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 3619 @type clientData: beliebiges Objekt 3620 """ 3621 3622 # 3623 # -- Alles löschen ---------------------------------------------------------- 3624 # 3625 self.loescheAlles() 3626 3627 # 3628 # -- aktuellen Wert übernehmen ------------------------------------------ 3629 # 3630 self.wertNichtMod.insert( 0, wert ) 3631 self.ChangeValue( wert ) # kein wx.EVENT erzeugen ! 3632 self.clientData = clientData 3633 3634 3635 # 3636 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 3637 # 3638 self.istVomBenutzerGeaendert = False 3639 self.istBenutzerAenderungJetzt = False
3640 3641 3642 3643 3644 # 3645 # 3646 # 3647 # ---------------------------------------------------------------------------------------- 3648 # ---------------------------------------------------------------------------------------- 3649 # -- ---------------------------------- 3650 # -- >TextCtrl< im >SplitterWindow< mit Titel ---------------------------------- 3651 # -- ---------------------------------- 3652 # ---------------------------------------------------------------------------------------- 3653 # ---------------------------------------------------------------------------------------- 3654 #
3655 -class TextCtrlSpWTitel( wx.Panel ):
3656 """ 3657 Klasse, die zwei C{TextCtrl} in einem C{SplitterWindow} miteinander verbindet. Weiterhin wird ein Titel zugeordnet. 3658 """ 3659 3660 # 3661 # ------------------------------------------------------------------------------------ 3662 # -- Initialisierungen -------------------------------------------------- 3663 # ------------------------------------------------------------------------------------ 3664 #
3665 - def __init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung ):
3666 wx.Panel.__init__( self, parent ) 3667 3668 # 3669 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 3670 # 3671 self.SetName( name = "TextCtrlSpWTitel" ) 3672 3673 3674 3675 # 3676 # -- Layout setzen ---------------------------------------------------------- 3677 # 3678 self.SplitterWindow = wx.SplitterWindow( self, -1, style = wx.SP_LIVE_UPDATE ) 3679 self.SplitterWindow.SetMinimumPaneSize( 20 ) 3680 3681 self.TextCtrl__li = TextCtrlErg( self.SplitterWindow 3682 , size = (-1, -1 ) 3683 , style = wx.TE_MULTILINE|wx.BORDER_SUNKEN 3684 , Statusleiste = Statusleiste 3685 , dbVerbindung = dbVerbindung ) 3686 3687 self.TextCtrl__re = TextCtrlErg( self.SplitterWindow 3688 , size = (-1, -1 ) 3689 , style = wx.TE_MULTILINE|wx.BORDER_SUNKEN 3690 , Statusleiste = Statusleiste 3691 , dbVerbindung = dbVerbindung ) 3692 3693 self.SplitterWindow.SplitVertically( self.TextCtrl__li 3694 , self.TextCtrl__re 3695 , -100 ) 3696 3697 self.FlexGridSizerWxObjTitel = FlexGridSizerWxObjTitel( parent = self 3698 , wxObj = self.SplitterWindow 3699 , titel = titel 3700 , orient = orient ) 3701 3702 self.FlexGridSizerWxObjTitel.wxObjekt.SetMinSize( minSize ) 3703 3704 BoxSizer = wx.BoxSizer( wx.VERTICAL ) 3705 BoxSizer.Add( self.FlexGridSizerWxObjTitel 3706 , proportion = 1 3707 , flag = wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL 3708 , border = 0 ) 3709 self.SetSizerAndFit( BoxSizer )
3710 3711 3712 3713 # 3714 # ------------------------------------------------------------------------------------ 3715 # -- Titel und wxObjekt (de)aktivieren ---------------------------------- 3716 # ------------------------------------------------------------------------------------ 3717 #
3718 - def Enable( self, enable = True ):
3719 """ 3720 Diese Methode implementiert die Standardfunktion C{Enable(...)} für diese Klasse. 3721 """ 3722 3723 # 3724 # -- Objekte (de)aktivieren -------------------------------------------------- 3725 # 3726 self.FlexGridSizerWxObjTitel.Enable( enable )
3727 3728 3729 3730 3731 # 3732 # 3733 # 3734 # ---------------------------------------------------------------------------------------- 3735 # ---------------------------------------------------------------------------------------- 3736 # -- ------------------------------------------ 3737 # -- TreeCtrl mit einigen Ergänzungen ------------------------------------------ 3738 # -- ------------------------------------------ 3739 # ---------------------------------------------------------------------------------------- 3740 # ---------------------------------------------------------------------------------------- 3741 #
3742 -class TreeCtrlErg( wx.TreeCtrl, __Ergaenzung__ ):
3743 """ 3744 Klasse, die ein C{wx.TreeCtrl} mit weiteren Funktionen versieht. 3745 """ 3746 3747 # 3748 # ------------------------------------------------------------------------------------ 3749 # -- Initialisierungen -------------------------------------------------- 3750 # ------------------------------------------------------------------------------------ 3751 #
3752 - def __init__( self, parent, Statusleiste, dbVerbindung, style = wx.BORDER_SUNKEN|wx.TR_DEFAULT_STYLE ):
3753 3754 # 3755 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 3756 # 3757 # self.SetName( name = "TreeCtrlErg" ) 3758 3759 3760 # 3761 # -- Konstanten, extern verwendbar ------------------------------------------ 3762 # 3763 self.HK_DOK = u'Dok' 3764 self.HK_PE = u'Protokolleinträge' 3765 self.HK_STR = u'Strukturpunkte' 3766 3767 3768 # 3769 # -- Notlösung ! -------------------------- 3770 # -- Dem Fehler in >comctl32.dll< ausweichen -------------------------- 3771 # 3772 if( os.name == 'nt' ) : 3773 wx.TreeCtrl.__init__( self, parent = parent, style = style ) 3774 else : 3775 wx.TreeCtrl.__init__( self, parent = parent, style = style|wx.TR_HIDE_ROOT ) 3776 3777 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 3778 3779 3780 3781 # 3782 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 3783 # 3784 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 3785 3786 3787 3788 # 3789 # -- Die (unsichtbare) Wurzel des darzustellenden Baumes ------------------ 3790 # 3791 self.elementListe = [] 3792 self.dbIdListe = [] 3793 self.wertIdListe = [] 3794 3795 self.wertIdIntern = 0 # zur Bildung der internen wertId 3796 self.dictWertIdIntern = dict() # zur Verwaltung der Vorgänger bei Verwendung der internen wertId 3797 self.wertIdInternAktHKnoten = 0 # Startpunkt in >self.wertIdListe< des ersten Strkt.Punktes des akt. Hauptknotens 3798 self.bezAktHKnoten = None # Bezeichnung des aktuellen Hauptknotens 3799 3800 self.dictWertIdHK = dict() # lfd. Nummer der Hauptknoten einschl. Bezeichnung 3801 3802 self.loescheBaum() 3803 3804 3805 3806 # 3807 # -- Ereignisse behandeln -------------------------------------------------- 3808 # 3809 self.Bind( wx.EVT_TREE_SEL_CHANGED, self.__ereignisAenderung__, self ) 3810 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 3811 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ ) 3812 3813 3814 # 3815 # -- Notlösung ! ---------------------------------- 3816 # -- Dem Fehler in >comctl32.dll< ausweichen ---------------------------------- 3817 # 3818 if( os.name == 'nt' ) : 3819 self.Bind( wx.EVT_TREE_SEL_CHANGED, self.__ereignisFehlerWINDOWS__, self ) 3820 self.Bind( wx.EVT_TREE_ITEM_ACTIVATED, self.__ereignisFehlerWINDOWS__, self ) 3821 self.Bind( wx.EVT_TREE_ITEM_RIGHT_CLICK, self.__ereignisFehlerWINDOWS__, self ) 3822 self.Bind( wx.EVT_TREE_ITEM_MIDDLE_CLICK, self.__ereignisFehlerWINDOWS__, self ) 3823 self.Bind( wx.EVT_TREE_KEY_DOWN, self.__ereignisFehlerWINDOWS__, self )
3824 3825 3826 3827 # 3828 # ------------------------------------------------------------------------------------ 3829 # -- Fehler in >comctl32< abfangen ------------------------------------------ 3830 # ------------------------------------------------------------------------------------ 3831 #
3832 - def __ereignisFehlerWINDOWS__( self, ereignis = None ):
3833 """ 3834 Methode die aufgerufen wird, um den Fehler in der >comctl32< abzufangen. 3835 3836 @param ereignis: Es ist das C{wx-Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 3837 @type ereignis: C{wx-Ereignisobjekt} 3838 """ 3839 3840 # 3841 # -- Wenn das root-Element aktiviert wurde, ---------- 3842 # -- - Selektion auf das nächste Element setzen (wenn möglich) ---------- 3843 # -- - das Ereignis nicht weiterreichen ---------- 3844 # 3845 if( ereignis.GetEventObject().GetSelection() == self.GetRootItem() ): 3846 3847 if( self.GetChildrenCount( item = self.GetRootItem(), recursively = True ) > 0 ) : 3848 self.SelectItem( item = self.GetFirstChild( self.GetRootItem() )[0], select = True ) 3849 3850 ereignis.Skip( skip = False ) 3851 3852 return 3853 3854 3855 # 3856 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 3857 # -- ausgewertet werden kann -------------------------- 3858 # 3859 ereignis.Skip( skip = True )
3860 3861 3862 3863 # 3864 # ------------------------------------------------------------------------------------ 3865 # -- Methode zum Ordnen der internen >wertIdVorgaenger< ------------------ 3866 # ------------------------------------------------------------------------------------ 3867 #
3868 - def __ersetzeWertIdVorgaenger__( self ):
3869 """ 3870 Methode die aufgerufen wird, um die C{wertIdVorgaenger} zu ersetzen . 3871 """ 3872 3873 3874 # 3875 # -- interne >wertId< werden nicht verwendet -------------------------- 3876 # 3877 if( len( self.dictWertIdIntern ) == 0 ) : return 3878 3879 3880 # 3881 # -- >wertIdVorgänger< ersetzen ------------------------------------------ 3882 # 3883 for i in range( self.wertIdInternAktHKnoten, len( self.elementListe ) ) : 3884 3885 if( self.elementListe[i][1][1] in self.dictWertIdIntern ) : 3886 3887 self.elementListe[i][1][1] = self.dictWertIdIntern[ self.elementListe[i][1][1] ] 3888 3889 elif( self.elementListe[i][1][0] != self.dictWertIdIntern[0] ) : 3890 3891 self.elementListe[i][1][1] = self.dictWertIdIntern[0] 3892 3893 3894 # 3895 # -- der nächste Hauptknoten kann gebildet werden -------------------------- 3896 # 3897 self.dictWertIdIntern.clear()
3898 3899 3900 3901 # 3902 # ------------------------------------------------------------------------------------ 3903 # -- Methode zum Übernehmen de Einträge ---------------------------------- 3904 # ------------------------------------------------------------------------------------ 3905 #
3906 - def __nimmEintrag__( self, lfdNr, eintragVorg ):
3907 """ 3908 Methode die aufgerufen wird, um die Einträge zu übernehmen. 3909 3910 @param lfdNr: Es ist die lfd. Nummer des zu übernehmenden Eintrages in C{self.elementListe} anzugeben. 3911 @type lfdNr: Gazzahl 3912 3913 @param eintragVorg: Es ist der Vorgänger des zu übernehmenden Eintrages anzugeben. 3914 @type eintragVorg: wx.TreeItemId 3915 3916 @return: Es wird der übernommene Eintrag zurückgegeben. 3917 @rtype: wx.TreeItemId 3918 """ 3919 3920 # 3921 # -- Eintrag übernehmen -------------------------------------------------- 3922 # 3923 eintrag = None 3924 if( self.elementListe[lfdNr][1][5] ) : 3925 3926 eintrag = self.AppendItem( eintragVorg, self.elementListe[lfdNr][0] ) 3927 self.SetPyData( eintrag, self.elementListe[lfdNr][1] ) 3928 3929 3930 # 3931 # -- Eintrag zurückgeben -------------------------------------------------- 3932 # 3933 return eintrag
3934 3935 3936 3937 3938 # 3939 # ------------------------------------------------------------------------------------ 3940 # -- Den Baum erzeugen -------------------------------------------------- 3941 # ------------------------------------------------------------------------------------ 3942 #
3943 - def erzeugeBaum( self ):
3944 """ 3945 Diese Methode erzeugt aus den Einträgen der Ebene 0 (auf Wurzelebene) den Baum 3946 """ 3947 3948 # 3949 # -- Notlösung ! -------------------------- 3950 # -- Dem Fehler in >comctl32.dll< ausweichen -------------------------- 3951 # 3952 if( os.name == 'nt' ) : 3953 3954 if( len( self.elementListe ) < 1 ) : 3955 self.Enable( False ) 3956 return 3957 3958 self.Enable( True ) 3959 3960 else: 3961 3962 if( len( self.elementListe ) < 1 ) : 3963 return 3964 3965 3966 3967 # 3968 # -- Aus der Liste der Strukturelemente die mehrfach vorhandenen ---------- 3969 # -- >dbId< entfernen. ---------- 3970 # -- Es werden alle Einträge entfernt, die keinen Vorgänger ---------- 3971 # -- besitzen. Hauptknoten werden ignoriert. ---------- 3972 # 3973 for i in range( len( self.elementListe ) ) : 3974 3975 if( self.dbIdListe.count( self.elementListe[i][1][3] ) > 1 3976 and self.elementListe[i][1][3] > 0 3977 and self.elementListe[i][1][1] is None ) : 3978 3979 self.elementListe[i][1][5] = False 3980 3981 3982 3983 # 3984 # -- Wenn interne >wertId< verwendet werden ------------------ 3985 # -- >wertIdVorgaenger< mittels interner >wertId< ersetzen ------------------ 3986 # 3987 self.__ersetzeWertIdVorgaenger__() 3988 3989 3990 3991 # 3992 # -- Alle Einträge auf Ebene 0 übernehmen -------------------------- 3993 # -- 1.) die keinen Vorgänger besitzen -------------------------- 3994 # -- 2.) deren >wertIdVorgaenger< nicht mittels -------------------------- 3995 # -- >nimmWert()< übernommen wurde -------------------------- 3996 # 3997 tmpElementListe = [] 3998 for i in range( len( self.elementListe ) ) : 3999 4000 # 4001 # -- >wertIdVorgaenger< ist gültig, deshalb nicht auf ------------------ 4002 # -- Ebene 0 übernehmen ------------------ 4003 # 4004 # 4005 if( self.elementListe[i][1][1] in self.wertIdListe ) : 4006 4007 tmpElementListe.append( self.elementListe[i] ) 4008 continue 4009 4010 # 4011 # -- >wertId< ist in der Liste der gültigen Id nicht enthalten ---------- 4012 # -- bzw. es ist kein Vorgänger vorhanden ---------- 4013 # 4014 if( self.elementListe[i][1][0] not in self.wertIdListe 4015 or self.elementListe[i][1][1] is None ) : 4016 4017 self.__nimmEintrag__( lfdNr = i, eintragVorg = self.wurzel ) 4018 4019 4020 self.elementListe = tmpElementListe 4021 4022 4023 4024 # 4025 # -- Baum spaltenweise aufbauen ---------- 4026 # -- Es wird vorrausgesetzt, dass alle Abhängigkeiten korrekt ---------- 4027 # -- abgebildet sind. ---------- 4028 # -- Es ist nicht notwendig, dass der Vorgänger vor dem ---------- 4029 # -- Nachfolger aufgelistet ist ---------- 4030 # 4031 4032 # 4033 # -- alle Elemente der ersten Ebene unterhalb >root< zusammenstellen ---------- 4034 # 4035 aktElement = None 4036 aktElemente = [] 4037 for i in range( self.GetChildrenCount( item = self.GetRootItem(), recursively = False ) ): 4038 4039 if( i == 0 ) : aktElement = self.GetFirstChild( self.GetRootItem() )[0] 4040 else : aktElement = self.GetNextSibling( item = aktElement ) 4041 4042 aktElemente.append( aktElement ) 4043 4044 4045 4046 # 4047 # -- Baum spaltenweise aufbauen ------------------------------------------ 4048 # 4049 tmpAktElemente = [] 4050 elementListeUebernommen = [] 4051 while( len( elementListeUebernommen ) < len( self.elementListe ) ) : 4052 4053 # 4054 # -- Spalte durchsuchen ------------------ 4055 # -- Mit dem ersten Element unterhalb >root< beginnen ------------------ 4056 # 4057 tmpAktElemente = [] 4058 for i in range( len( aktElemente ) ): 4059 4060 # 4061 # -- Alle direkt zugeordneten Elemente suchen / übernehmen ---------- 4062 # 4063 for j in range( len( self.elementListe ) ) : 4064 4065 if( self.elementListe[j][1][1] == self.GetPyData( aktElemente[i] )[0] ) : 4066 4067 neu = self.__nimmEintrag__( lfdNr = j, eintragVorg = aktElemente[i] ) 4068 4069 if( neu is not None ) : tmpAktElemente.append( neu ) 4070 4071 elementListeUebernommen.append( self.elementListe[j][1][0] ) 4072 4073 4074 # 4075 # -- Mit nächster Spalte fortfahren ---------------------------------- 4076 # 4077 aktElemente = tmpAktElemente
4078 4079 4080 4081 4082 # 4083 # ------------------------------------------------------------------------------------ 4084 # -- Bezeichnung des Hauptknotens zurückgeben -------------------------- 4085 # ------------------------------------------------------------------------------------ 4086 #
4087 - def gibBezeichnungHauptknoten( self, eintrag = None ):
4088 """ 4089 Diese Methode gibt die Bezeichnung des Hauptkontens zurück, dem der aktuell gewählte Eintrag des C{TreeCtrl} zugeordnet ist. 4090 4091 @param eintrag: Es ist der zu prüfende Eintrag anzugeben. Wird C{None} angegeben, wird der aktuell ausgewählte Eintrag verwendet. 4092 @type eintrag: wx.TreeItemId 4093 4094 @return: Es wird die Bezeichnung des Hauptknotens (C{self.HK_DOK, self.HK_PE, self.HK_STR}) zurückgegeben. Wird der mechanismus der internen Vergabe der C{wertId} nicht verwendet, oder ist kein gültiges Element übergeben, wird C{None} zurückgegeben. 4095 @rtype: Boolean 4096 4097 """ 4098 4099 # 4100 # -- Element untersuchen -------------------------------------------------- 4101 # 4102 eintragIntern = eintrag 4103 if( eintragIntern is None ) : 4104 4105 # 4106 # -- keine gültige Auswahl bzw. keine Verwendung der Hauptknoten -- 4107 # 4108 if( not self.GetSelection().IsOk() 4109 or len( self.dictWertIdHK ) == 0 ) : 4110 4111 return None 4112 4113 4114 # 4115 # -- aktuell gewählten Eintrag übernehmen ---------------------------------- 4116 # 4117 eintragIntern = self.GetSelection() 4118 4119 4120 # 4121 # -- Bezeichnung des Hauptknotens zurückgeben -------------------------- 4122 # 4123 return( self.GetPyData( eintragIntern )[4] )
4124 4125 4126 4127 4128 4129 # 4130 # ------------------------------------------------------------------------------------ 4131 # -- ClientData zurückgegeben ------------------------------------------ 4132 # ------------------------------------------------------------------------------------ 4133 #
4134 - def gibClientData( self, eintrag = None ):
4135 """ 4136 Mit Aufruf dieser Methode wird C{ClientData} zum aktuell gewählten Eintrages zurückgegeben. 4137 4138 @param eintrag: Es ist der Eintrag anzugeben, dessen C{ClientData} zurückgegeben werden soll. Wird C{None} angegeben, wird der aktuell ausgewählte Eintrag verwendet. 4139 @type eintrag: wx.TreeItemId 4140 4141 @return: C{wx.ClientData} 4142 @rtype: Listenobjekt 4143 """ 4144 4145 # 4146 # -- keine gültige Auswahl -------------------------------------------------- 4147 # 4148 if( not self.GetSelection().IsOk() ) : 4149 return 4150 4151 4152 # 4153 # -- clientData zurückgeben -------------------------------------------------- 4154 # 4155 if( eintrag is None ) : return self.GetPyData( self.GetSelection() )[2] 4156 4157 return self.GetPyData( eintrag )[2]
4158 4159 4160 4161 # 4162 # ------------------------------------------------------------------------------------ 4163 # -- >dbId< zurückgeben -------------------------------------------------- 4164 # ------------------------------------------------------------------------------------ 4165 #
4166 - def gibDbId( self, eintrag = None ):
4167 """ 4168 Mit Aufruf dieser Methode wird C{dbId} zum aktuell gewählten Eintrages zurückgegeben. 4169 4170 4171 @param eintrag: Es ist der Eintrag anzugeben, dessen C{dbId} zurückgegeben werden soll. Wird C{None} angegeben, wird der aktuell ausgewählte Eintrag verwendet. 4172 @type eintrag: wx.TreeItemId 4173 4174 @return: C{self.dbId} 4175 @rtype: Python-Objekt 4176 """ 4177 4178 4179 # 4180 # -- aktuellen Eintrag verwenden ------------------------------------------ 4181 # 4182 if( eintrag is None ) : 4183 4184 # 4185 # -- keine gültige Auswahl ------------------------------------------ 4186 # 4187 if( not self.GetSelection().IsOk() ) : 4188 return None 4189 4190 4191 # 4192 # -- dbId zurückgeben ------------------------------------------ 4193 # 4194 return self.GetPyData( self.GetSelection() )[3] 4195 4196 4197 4198 # 4199 # -- eintrag verwenden -------------------------------------------------- 4200 # 4201 return self.GetPyData( eintrag )[3]
4202 4203 4204 4205 # 4206 # ------------------------------------------------------------------------------------ 4207 # -- >wert< zurückgeben -------------------------------------------------- 4208 # ------------------------------------------------------------------------------------ 4209 #
4210 - def gibWert( self, eintrag = None ):
4211 """ 4212 Mit Aufruf dieser Methode wird der C{wert} zum aktuell gewählten Eintrages zurückgegeben. 4213 4214 4215 @param eintrag: Es ist der Eintrag anzugeben, dessen C{wert} zurückgegeben werden soll. Wird C{None} angegeben, wird der aktuell ausgewählte Eintrag verwendet. 4216 @type eintrag: wx.TreeItemId 4217 4218 @return: C{self.dbId} 4219 @rtype: Python-Objekt 4220 """ 4221 4222 4223 # 4224 # -- aktuellen Eintrag verwenden ------------------------------------------ 4225 # 4226 if( eintrag is None ) : 4227 4228 # 4229 # -- keine gültige Auswahl ------------------------------------------ 4230 # 4231 if( not self.GetSelection().IsOk() ) : 4232 return None 4233 4234 4235 # 4236 # -- dbId zurückgeben ------------------------------------------ 4237 # 4238 return self.GetPyData( self.GetSelection() )[0] 4239 4240 4241 4242 # 4243 # -- eintrag verwenden -------------------------------------------------- 4244 # 4245 return self.GetPyData( eintrag )[0]
4246 4247 4248 4249 4250 # 4251 # ------------------------------------------------------------------------------------ 4252 # -- >eintrag< und eine Liste von Einträgen zurückgeben, die dem ---------- 4253 # -- aktuell gegebenen >eintrag< zugeordnet sind ---------- 4254 # ------------------------------------------------------------------------------------ 4255 #
4256 - def gibZweig( self ):
4257 """ 4258 Mit Aufruf dieser Methode wird der Eintrag C{eintrag} einschließlich der untergeordneten Einträge (d.h. der gesamte Zweig) zurückgegeben. 4259 4260 @param eintrag: Es ist der Eintrag anzugeben, dessen untergeordneten Einträge zurückgegeben werden sollen. 4261 @type eintrag: wx.TreeItemId 4262 4263 @return: liste der C{wx.TreeItemId} 4264 @rtype: Python-Liste 4265 """ 4266 4267 # 4268 # -- aktuell selektieren Eintrag ermitteln ---------------------------------- 4269 # 4270 eintrag = self.GetSelection() 4271 4272 4273 # 4274 # -- Liste der Einträge -------------------------------------------------- 4275 # 4276 eintragListe = [] 4277 eintragListe.append( eintrag ) 4278 4279 4280 # 4281 # -- Es sind keine weiteren Einträge zugeordnet -------------------------- 4282 # 4283 if( not self.ItemHasChildren( eintrag ) ) : return eintragListe 4284 4285 4286 # 4287 # -- Ersten Eintrag übernehmen ------------------------------------------ 4288 # 4289 eintragListe.append( self.GetFirstChild( eintrag )[0] ) 4290 cookie = self.GetFirstChild( eintrag )[1] 4291 4292 4293 # 4294 # -- die nächsten Einträge übernehmen ---------------------------------- 4295 # 4296 item = self.GetNextChild( eintrag, cookie )[0] 4297 cookie = self.GetNextChild( eintrag, cookie )[1] 4298 4299 while( item.IsOk() ) : 4300 4301 eintragListe.append( item ) 4302 item = self.GetNextChild( eintrag, cookie )[0] 4303 cookie = self.GetNextChild( eintrag, cookie )[1] 4304 4305 4306 # 4307 # -- Einträge zurückgeben -------------------------------------------------- 4308 # 4309 return eintragListe
4310 4311 4312 4313 4314 # 4315 # ------------------------------------------------------------------------------------ 4316 # -- alle Daten zu >eintrag<, sowie die Daten aller Einträge -- 4317 # -- zurückgeben, die dem aktuell gegebenen >eintrag< zugeordnet sind -- 4318 # ------------------------------------------------------------------------------------ 4319 #
4320 - def gibZweigDaten( self ):
4321 """ 4322 Mit Aufruf dieser Methode werden die Daten zu Eintrag C{eintrag} einschließlich der Daten der untergeordneten Einträge (d.h. die Daten des gesamten Zweiges) zurückgegeben. 4323 4324 @param eintrag: Es ist der Eintrag anzugeben 4325 @type eintrag: wx.TreeItemId 4326 4327 @return: Liste der Daten zu allen Einträgen (Elementen) des Zweiges, welche wie folgt gebildet ist [self.gibDbId(), self.gibClientData()] 4328 @rtype: Python-Liste 4329 """ 4330 4331 # 4332 # -- Zweig auslesen ---------------------------------------------------------- 4333 # 4334 zweig = self.gibZweig() 4335 4336 4337 # 4338 # -- Daten zusammenstellen -------------------------------------------------- 4339 # 4340 erg = [] 4341 for i in range( len( zweig ) ) : 4342 4343 tmp = [self.gibDbId( zweig[i] )] 4344 erg.append( tmp + self.gibClientData( zweig[i] ) ) 4345 4346 4347 # 4348 # -- Werte zurückgeben -------------------------------------------------- 4349 # 4350 return erg
4351 4352 4353 4354 4355 4356 # 4357 # ------------------------------------------------------------------------------------ 4358 # -- >dbId< ist vorhanden -------------------------------------------------- 4359 # ------------------------------------------------------------------------------------ 4360 #
4361 - def istDbIdVorhanden( self, dbId ):
4362 """ 4363 Mit Aufruf dieser Methode wird geprüft, ob C{dbId} im Baum vorhanden ist. 4364 4365 @param dbId: Es wird C{True} zurückgegeben, wenn C{dbId} vorhanden ist. 4366 @type dbId: Ganzzahl 4367 4368 @return: C{wx.ClientData} 4369 @rtype: Listenobjekt 4370 """ 4371 4372 # 4373 # -- Prüfung ausführen -------------------------------------------------- 4374 # 4375 return( dbId in self.dbIdListe )
4376 4377 4378 4379 4380 4381 # 4382 # ------------------------------------------------------------------------------------ 4383 # -- aktuell gewähltes TreeCtrl-Element ist ein Hauptknoten ------------------ 4384 # -- oder root ------------------ 4385 # ------------------------------------------------------------------------------------ 4386 #
4387 - def istHauptknoten( self, eintrag = None ):
4388 """ 4389 Diese Methode prüft, ob das aktuell gewählte Element ein Hauptknoten bzw C{root} ist. 4390 4391 @param eintrag: Es ist der zu prüfende Eintrag anzugeben. Wird C{None} angegeben, wird der aktuell ausgewählte Eintrag verwendet. 4392 @type eintrag: wx.TreeItemId 4393 4394 @return: Es wird C{True} zurückgegeben, wenn der aktuell gewählte Eintrag ein Hauptknoten ist, andernfalls C{False}. Wird der mechanismus der internen Vergabe der C{wertId} nicht verwendet, oder ist kein gültiges Element übergeben, wird C{None} zurückgegeben. 4395 @rtype: Boolean 4396 """ 4397 4398 # 4399 # -- Element untersuchen -------------------------------------------------- 4400 # 4401 eintragIntern = eintrag 4402 if( eintragIntern is None ) : 4403 4404 # 4405 # -- keine gültige Auswahl bzw. keine Verwendung der Hauptknoten -- 4406 # 4407 if( not self.GetSelection().IsOk() 4408 or len( self.dictWertIdHK ) == 0 ) : 4409 4410 return None 4411 4412 4413 # 4414 # -- aktuell gewählten Eintrag übernehmen ---------------------------------- 4415 # 4416 eintragIntern = self.GetSelection() 4417 4418 4419 # 4420 # -- Es liegt ein Hauptknoten vor ? ------------------------------------------ 4421 # 4422 return( eintragIntern == self.GetRootItem() 4423 or self.GetPyData( eintragIntern )[0] in self.dictWertIdHK )
4424 4425 4426 4427 4428 4429 # 4430 # ------------------------------------------------------------------------------------ 4431 # -- Den Baum löschen -------------------------------------------------- 4432 # ------------------------------------------------------------------------------------ 4433 #
4434 - def loescheBaum( self ):
4435 """ 4436 Diese Methode löscht den gesamten Baum und fügt die Wurzel (C{self.wurzel}) ein. 4437 """ 4438 4439 # 4440 # -- Baum löschen und Wurzel einfügen ---------------------------------- 4441 # 4442 self.DeleteAllItems() 4443 4444 # 4445 # -- Notlösung ! ---------------------------------- 4446 # -- Dem Fehler in >comctl32.dll< ausweichen ---------------------------------- 4447 # 4448 if( os.name == 'nt' ) : 4449 self.wurzel = self.AddRoot( u"---" ) 4450 else : 4451 self.wurzel = self.AddRoot( u"Wird nicht angezeigt (style = wx.TR_HIDE_ROOT ) !" ) 4452 4453 4454 self.elementListe = [] 4455 self.dbIdListe = [] 4456 self.wertIdListe = [] 4457 4458 self.wertIdIntern = 0 4459 self.dictWertIdIntern = dict() 4460 self.wertIdInternAktHKnoten = 0 4461 self.bezAktHKnoten = None 4462 4463 self.dictWertIdHK = dict()
4464 4465 4466 4467 4468 # 4469 # ------------------------------------------------------------------------------------ 4470 # -- Eintrag markieren -------------------------------------------------- 4471 # ------------------------------------------------------------------------------------ 4472 #
4473 - def markiereWert( self, eintrag = None ):
4474 """ 4475 Mit Aufruf dieser Methode wird der Eintrag mit der C{lfdNr} markiert. 4476 ACHTUNG ! Noch nicht vollständig implementiert ! 4477 4478 @param eintrag: Es ist der Eintrag anzugeben, der markiert werden soll. 4479 @type eintrag: wx.TreeItemId 4480 """ 4481 4482 # 4483 # -- keine Einträge vorhanden ------------------------------------------ 4484 # 4485 if( self.IsEmpty() ) : return 4486 4487 4488 # 4489 # -- lfd. Nr. ist nicht vorhanden ------------------------------------------ 4490 # 4491 # if( lfdNr not in range( 1, self.GetCount() - 1 ) ) : 4492 if( eintrag is None ) : 4493 4494 self.ExpandAll() 4495 self.SelectItem( self.GetNextVisible( self.GetRootItem() ) ) 4496 return
4497 4498 4499 # 4500 # -- lfd. Nr. markieren -------------------------------------------------- 4501 # -> später korrekt implementieren ! 4502 # 4503 # self.SelectItem( ... ) 4504 4505 4506 # 4507 # ------------------------------------------------------------------------------------ 4508 # -- Eintrag anhand Datenbank-Id markieren ---------------------------------- 4509 # ------------------------------------------------------------------------------------ 4510 #
4511 - def markiereWertDbId( self, dbId ) :
4512 """ 4513 Mit Aufruf dieser Methode wird der Eintrag markiert, der der Bedingung C{self.gibDbId() == dbId} genügt. 4514 4515 @param dbId: Es ist der Eintrag anzugeben, der markiert werden soll. 4516 @type dbId: Ganzzahl 4517 4518 @return: C{True} wenn der Wert selektiert werden konnte; sonst C{False}. 4519 @rtype: Boolean 4520 """ 4521 4522 # 4523 # -- keine Einträge vorhanden ------------------------------------------ 4524 # 4525 if( self.IsEmpty() ) : return 4526 4527 4528 # 4529 # -- Alle Einträge anzeigen -------------------------------------------------- 4530 # 4531 self.ExpandAll() 4532 4533 4534 # 4535 # -- gewünschten Wert markieren ------------------------------------------ 4536 # 4537 for i in range( self.GetCount() ) : 4538 4539 self.SetSelection( i ) 4540 4541 if ( self.GetPyData( i )[3] == dbId ) : 4542 4543 return True 4544 4545 4546 4547 # 4548 # -- Wert wurde nicht gefunden ------------------------------------------ 4549 # 4550 self.SetSelection( 0 ) 4551 return False
4552 4553 4554 4555 # 4556 # ------------------------------------------------------------------------------------ 4557 # -- (den nächsten) Hauptknoten bilden ---------------------------------- 4558 # ------------------------------------------------------------------------------------ 4559 #
4560 - def nimmHauptknoten( self, wert, bezHK, dbId = 0, wertIdVorgaenger = None, clientData = None ):
4561 """ 4562 Mit Aufruf dieser Methode wird ein Hauptknoten im C{self.TreeCtrlErg__Id.wxObjekt} angelegt. 4563 4564 @param wert: Es ist der Name (die Bezeichnung) des Knotens anzugeben. 4565 @type wert: Zeichenkette 4566 4567 @param bezHK : Es ist die Bezeichnung des Hauptknotens anzugeben (C{self.HK_DOK, self.HK_PE, self.HK_STR}) 4568 @type bezHK : Zeichenkette 4569 4570 @param dbId: Eineindeutige Identifikationsnummer des Eintrages welche zum Beispiel in der Datenbank verwendet wird. Einträge mit derselben Identifikationsnummer dürfen mehrfach auftreten. 4571 @type dbId: Ganzzahl 4572 4573 @param wertIdVorgaenger: Eineindeutige Identifikationsnummer des Vorgängers des Wertes 4574 @type wertIdVorgaenger: Ganzzahl 4575 4576 @param clientData: Ein beliebiges C{Python-Objekt}, welches weitere Zusatzinformationen zum Wert enthält 4577 @type clientData: C{Python-Objekt} 4578 """ 4579 4580 # 4581 # -- >wertIdVorgaenger< mittels interner >wertId< ersetzen ------------------ 4582 # 4583 self.__ersetzeWertIdVorgaenger__() 4584 4585 4586 # 4587 # -- Position des ersten Strukturpunktes des aktuellen ------------------ 4588 # -- Hauptknotens speichern ------------------ 4589 # 4590 self.wertIdInternAktHKnoten = len( self.elementListe ) 4591 4592 4593 # 4594 # -- Bezeichnung des Hauptknotens übernehmen -------------------------- 4595 # 4596 self.bezAktHKnoten = bezHK 4597 4598 4599 # 4600 # -- Knoten einfügen -------------------------------------------------- 4601 # 4602 self.nimmWert( wert = wert 4603 , wertId = None 4604 , dbId = dbId 4605 , wertIdVorgaenger = wertIdVorgaenger 4606 , clientData = clientData ) 4607 4608 4609 # 4610 # -- lfd. Nr. (Pos) einschl. Bezeichnung des Hauptknotens speichern ---------- 4611 # 4612 self.dictWertIdHK[self.wertIdIntern] = wert
4613 4614 4615 4616 4617 4618 # 4619 # ------------------------------------------------------------------------------------ 4620 # -- Eintrag auf Wurzelebene hinzufügen ---------------------------------- 4621 # ------------------------------------------------------------------------------------ 4622 #
4623 - def nimmWert( self, wert, wertId, dbId, wertIdVorgaenger = None, clientData = None ):
4624 """ 4625 Diese Methode übernimmt den kompletten Wert, ohne ihn im C{TreeCtrl} darzustellen. Er muß eine eineindeutige Identifikationsnummer (C{wertId}) besitzen. 4626 4627 Sollte er einen Vorgänger besitzen, ist dessen Identifikationsnummer (C{wertIdVorgaenger}) anzugeben. Zur Darstellung aller Einträge im C{TreeCtrl} ist C{TreeCtrlErg.erzeugeBaum(...)} aufzurufen 4628 4629 @param wert: Es ist die Zeichenkette anzugeben, die im Baum sichtbar ist. 4630 @type wert: Zeichenkette 4631 4632 @param wertId: Eineindeutige Identifikationsnummer des Wertes (zur internen Organisation). Wenn er C{None} ist, wird C{self.wertIdIntern} verwendet. 4633 @type wertId: Ganzzahl 4634 4635 @param dbId: Eineindeutige Identifikationsnummer des Eintrages welche zum Beispiel in der Datenbank verwendet wird. Einträge mit derselben Identifikationsnummer dürfen mehrfach auftreten. 4636 @type dbId: Ganzzahl 4637 4638 @param wertIdVorgaenger: Eineindeutige Identifikationsnummer des Vorgängers des Wertes 4639 @type wertIdVorgaenger: Ganzzahl 4640 4641 @param clientData: Ein beliebiges C{Python-Objekt}, welches weitere Zusatzinformationen zum Wert enthält 4642 @type clientData: C{Python-Objekt} 4643 """ 4644 4645 4646 4647 # 4648 # -- >wertId< übernehmen -------------------------------------------------- 4649 # 4650 tmpWertId = wertId 4651 4652 if( wertIdVorgaenger == 0 4653 or len( str( wertIdVorgaenger ) ) == 0 ) : tmpWertIdVorgaenger = None 4654 else : 4655 tmpWertIdVorgaenger = wertIdVorgaenger 4656 4657 4658 4659 # 4660 # -- >wertId< soll intern gebildet werden ---------------------------------- 4661 # 4662 if( wertId is None ) : 4663 4664 self.wertIdIntern += 1 4665 tmpWertId = self.wertIdIntern 4666 4667 self.dictWertIdIntern[dbId] = tmpWertId 4668 4669 4670 # 4671 # -- Wert in >self.elementListe< übernehmen ---------------------------------- 4672 # 4673 self.elementListe.append( [ wert, [ tmpWertId, tmpWertIdVorgaenger, clientData, dbId, self.bezAktHKnoten, True ] ] ) 4674 4675 4676 # 4677 # -- >wertId/dbId< übernehmen, damit vorhandene >wertId/dbId< ---------- 4678 # -- schneller gefunden werden können ---------- 4679 # 4680 self.dbIdListe.append( dbId ) 4681 self.wertIdListe.append( tmpWertId )
4682