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