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

Source Code for Module wxuniversal

   1  # -*- coding: utf-8 -*- 
   2  # 
   3  # 
   4  #    filename:  wxuniversal.py 
   5  # 
   6  #    version:   see wxvf.py 
   7  # 
   8  # 
   9  # ---------------------------------------------------------------------------------------- 
  10  # 
  11  # 
  12  #    Copyright (C) 2010  Michael Bellair 
  13  # 
  14  #    This file is part of wxvf. 
  15  # 
  16  #    wxvf is free software: you can redistribute it and/or modify 
  17  #    it under the terms of the GNU General Public License as published by 
  18  #    the Free Software Foundation, either version 3 of the License, or 
  19  #    (at your option) any later version. 
  20  # 
  21  #    wxvf is distributed in the hope that it will be useful, 
  22  #    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  23  #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  24  #    GNU General Public License for more details. 
  25  # 
  26  #    You should have received a copy of the GNU General Public License 
  27  #    along with wxvf.  If not, see <http://www.gnu.org/licenses/>. 
  28  # 
  29  #    Michael Bellair 
  30  #    Sportplatzstrasse 11 
  31  #    01259 Dresden 
  32  # 
  33  #    E-Mail:    bellair@freenet.de 
  34  #    homepage:  http://freenet-homepage.de/bellair/vf/index.html 
  35  # 
  36  # 
  37  # ---------------------------------------------------------------------------------------- 
  38  # 
  39  import wx 
  40  import wx.lib.masked as  wxmsk          # MaskedCtrl 
  41   
  42  from universal import zk                # Zeichenketten bearbeiten 
  43   
  44   
  45  # 
  46  # 
  47  # 
  48  # ---------------------------------------------------------------------------------------- 
  49  # ---------------------------------------------------------------------------------------- 
  50  # --                                    -------------------------------------------------- 
  51  # --    Offene Punkte / Aufgaben        -------------------------------------------------- 
  52  # --                                    -------------------------------------------------- 
  53  # ---------------------------------------------------------------------------------------- 
  54  # ---------------------------------------------------------------------------------------- 
  55  # 
  56  #  
  57  #       -- siehe TODO 'wxuniversal.py' -- 
  58  # 
  59  # 
  60  # ---------------------------------------------------------------------------------------- 
  61  # 
  62   
  63   
  64   
  65  # 
  66  # 
  67  # 
  68  # ---------------------------------------------------------------------------------------- 
  69  # ---------------------------------------------------------------------------------------- 
  70  # --                            ---------------------------------------------------------- 
  71  # --    Globale Variablen       ---------------------------------------------------------- 
  72  # --                            ---------------------------------------------------------- 
  73  # ---------------------------------------------------------------------------------------- 
  74  # ---------------------------------------------------------------------------------------- 
  75  # 
  76  # 
  77  # ------------------------------------------------------------------------------------ 
  78  # --    Farben                                                          -------------- 
  79  # --    Eine Liste der verfügbaren Farben kann dem wxPython-Demo       -------------- 
  80  # --    Miscellaneous -> ColourDB entnommen werden                      -------------- 
  81  # ------------------------------------------------------------------------------------ 
  82  # 
  83  farbeAuswahlListe = "LIGHT STEEL BLUE"  # Farbe der Objekte, die Vorgabewerte enthalten 
  84  farbeBearbeiten = "LIGHT YELLOW"        # Farbe der Objekte, die bearbeitet werden können 
  85   
  86  # 
  87  # 
  88  # 
  89  # ---------------------------------------------------------------------------------------- 
  90  # ---------------------------------------------------------------------------------------- 
  91  # --                                            ------------------------------------------ 
  92  # --    interne Basisklasse der Ergänzungen    ------------------------------------------ 
  93  # --                                            ------------------------------------------ 
  94  # ---------------------------------------------------------------------------------------- 
  95  # ---------------------------------------------------------------------------------------- 
  96  # 
97 -class __Ergaenzung__:
98 """ 99 Basisklasse, die die Ergänzungen bereitstellt. 100 """ 101 102 # 103 # ------------------------------------------------------------------------------------ 104 # -- Initialisierungen -------------------------------------------------- 105 # ------------------------------------------------------------------------------------ 106 #
107 - def __init__( self, Statusleiste ):
108 109 110 # 111 # -------------------------------------------------------------------------------- 112 # -- Kontextmenüs einschließlich Ereignisbehandlung -------------------------- 113 # -------------------------------------------------------------------------------- 114 # 115 self.KMenues = MultiMenu() 116 117 # 118 # -- Kontextmenüs unterdrücken (Notlösung) ---------------------------------- 119 # 120 self.KMenues.initMenu() 121 122 123 # 124 # -- Statusleiste -------------------------------------------------- 125 # 126 self.__StatusLeiste__ = Statusleiste 127 self.__statusLeisteDBSpName__ = None 128 self.statusLeisteDBSpNameErlaeuterung = None 129 130 131 # 132 # -- wertNichtMod -------------------------------------------------- 133 # 134 self.wertNichtMod = [] 135 self.wertNichtMod.append( None ) 136 """ 137 @cvar: Aktueller, nichtmodifizierter Wert, wie er beim letzten Aufruf von C{nimmWert(...)} eingelesen wurde. 138 @type: Python - Objekt 139 """ 140 141 142 # 143 # -- ClientData -------------------------------------------------- 144 # 145 self.clientData = [] 146 """ 147 @cvar: Zusatzinformationen, die dem aktuellen Objekt zugeordnet werden können. 148 @type: Python - Objekt 149 """ 150 151 152 # 153 # -- >istVomBenutzerGeaendert = True< ---------------------------------- 154 # -- der Wert wurde vom Benutzer verändert ---------------------------------- 155 # 156 self.istVomBenutzerGeaendert = False 157 """ 158 @cvar: Wenn dieser Wert C{True} ist, wurde der Wert des C{wx-Objektes} vom Benutzer verändert. 159 @type: Boolescher Wert 160 """ 161 162 163 # 164 # -- >istBenutzerAenderungJetzt = True< -------------------------- 165 # -- der Wert wurde gerade vom Benutzer verändert -------------------------- 166 # 167 self.istBenutzerAenderungJetzt = False 168 """ 169 @cvar: Wenn dieser Wert C{True} ist, wurde der Wert des C{wx-Objektes} jetzt vom Benutzer verändert. 170 @type: Boolescher Wert 171 """
172 173 174 175 176 177 # 178 # ------------------------------------------------------------------------------------ 179 # -- Änderung erkennen -------------------------------------------------- 180 # ------------------------------------------------------------------------------------ 181 #
182 - def __ereignisAenderung__( self, ereignis = None ):
183 """ 184 Methode die aufgerufen wird, wenn der Inhalt des C{wx-Objektes} geändert wird. 185 186 @param ereignis: Es ist das C{wx-Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 187 @type ereignis: C{wx-Ereignisobjekt} 188 """ 189 190 # 191 # -- Der Wert des wx-Objektes wurde (jetzt) vom Benutzer verändert ---------- 192 # 193 self.istVomBenutzerGeaendert = True 194 self.istBenutzerAenderungJetzt = True 195 196 197 # 198 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 199 # -- ausgewertet werden kann -------------------------- 200 # 201 ereignis.Skip( skip = True )
202 203 204 205 206 # 207 # ------------------------------------------------------------------------------------ 208 # -- Kontextmenü nicht anzeigen ------------------------------------------ 209 # ------------------------------------------------------------------------------------ 210 #
211 - def __ereignisKMenueNicht__( self, ereignis = None ):
212 """ 213 Kontextmenü nicht anzeigen 214 215 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 216 @type ereignis: C{wx - Ereignisobjekt} 217 """ 218 219 # 220 # -- 'Unsichtbares' Kontextmenü aufrufen ---------------------------------- 221 # 222 self.PopupMenu( self.KMenues.gibMenu( lfdNrMenu = 0 ) ) 223 224 225 # 226 # -- Das Ereignis nicht weiterreichen ----------------------------------------- 227 # 228 ereignis.Skip( skip = False )
229 230 231 232 233 # 234 # ------------------------------------------------------------------------------------ 235 # -- Einträge in der Statusleiste vornehmen ---------------------------------- 236 # ------------------------------------------------------------------------------------ 237 #
238 - def __ereignisStatusleiste__( self, ereignis ):
239 """ 240 Methode die aufgerufen wird, um die Einträge in der Statusleiste darzustellen. 241 242 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 243 @type ereignis: C{wx - Ereignisobjekt} 244 """ 245 246 247 # 248 # -- Mauszeiger verläßt >wx.Objekt< ------------------------------------------ 249 # 250 if ereignis.Leaving(): 251 self.__StatusLeiste__.SetStatusText( "", 0 ) 252 self.__StatusLeiste__.SetStatusText( "", 1 ) 253 254 255 # 256 # -- Mauszeiger berührt >wx.Objekt< ------------------------------------------ 257 # 258 if ereignis.Entering(): 259 260 # 261 # -- PostgreSQL-Datenbakspaltennamen ausgeben ------------------ 262 # 263 self.__StatusLeiste__.SetStatusText( str( self.__statusLeisteDBSpName__ ), 1 ) 264 265 # 266 # -- Erläuterung zum PostgreSQL-Datenbakspaltennamen ausgeben -- 267 # 268 self.__StatusLeiste__.SetStatusText( str( self.statusLeisteDBSpNameErlaeuterung ), 0 ) 269 270 271 # 272 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 273 # -- ausgewertet werden kann -------------------------- 274 # 275 ereignis.Skip( skip = True )
276 277 278 279 # 280 # ------------------------------------------------------------------------------------ 281 # -- Hat der Benutzer eine Änderung durchgeführt ? -------------------------- 282 # ------------------------------------------------------------------------------------ 283 #
284 - def gibIstVomBenutzerGeaendert( self ):
285 """ 286 Hat der Benutzer eine Änderung durchgeführt ? 287 288 @return: Es wird C{True} zurückgegeben, wenn der Benutzer eine Änderung durchgeführt hat; sonst C{False}. 289 @rtype: Boolean 290 """ 291 292 return self.istVomBenutzerGeaendert
293 294 295 296 # 297 # ------------------------------------------------------------------------------------ 298 # -- Den Status der Benutzeränderung explizit setzen -------------------------- 299 # ------------------------------------------------------------------------------------ 300 #
301 - def nimmIstVomBenutzerGeaendert( self, istVomBenutzerGeaendert ):
302 """ 303 Den Status der Benutzeränderung explizit setzen. 304 305 @param istVomBenutzerGeaendert: Es ist der Status der Benutzeränderung zu übergeben. 306 @type istVomBenutzerGeaendert: C{Boolean} 307 """ 308 309 self.istVomBenutzerGeaendert = istVomBenutzerGeaendert
310 311 312 313 # 314 # 315 # 316 # ---------------------------------------------------------------------------------------- 317 # ---------------------------------------------------------------------------------------- 318 # -- ------------------ 319 # -- interne Basisklasse der Funktionen für Texteingabeobjekte ------------------ 320 # -- ------------------ 321 # ---------------------------------------------------------------------------------------- 322 # ---------------------------------------------------------------------------------------- 323 #
324 -class __TextFunktionen__( __Ergaenzung__ ):
325 """ 326 Basisklasse, die zusätzlichen Funktionen für Texteingabeobjekte bereitstellt. 327 """ 328 329 # 330 # ------------------------------------------------------------------------------------ 331 # -- Initialisierungen -------------------------------------------------- 332 # ------------------------------------------------------------------------------------ 333 #
334 - def __init__( self, Statusleiste ):
335 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 336 337 338 # 339 # -- das Texteingabefeld darf leer sein ---------------------------------- 340 # 341 self.darfLeerSein = False 342 343 344 # 345 # -- >istMeldungRechtschreibFehlerKorrektur = True< ---------- 346 # -- Die Meldung zur Rechtschreibfehlerkorrektur wird gezeigt ---------- 347 # 348 self.istMeldungRechtschreibFehlerKorrektur = True 349 350 351 # 352 # -- >istRechtschreibFehlerKorrektur = True< ------------------ 353 # -- Wurde eine Rechtschreibfehlerkorrektur durchgeführt ? ------------------ 354 # 355 self.istRechtschreibFehlerKorrektur = False
356 357 358 359 360 # 361 # ------------------------------------------------------------------------------------ 362 # -- Liegt eine Korrektur von Rechtschreibfehlern vor ? ------------------ 363 # ------------------------------------------------------------------------------------ 364 #
365 - def __frageRechtschreibfehlerkorrekur__( self, ereignis ):
366 """ 367 Wenn eine Benutzeränderung vorliegt wird ein Meldung ausgegeben, um beim Benutzer abzufragen, ob eine Rechtschreibkorrektur vorliegt. 368 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. 369 370 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 371 @type ereignis: C{wx - Ereignisobjekt} 372 """ 373 374 375 # 376 # -- Das Texteingabefeld darf leer sein ------------------ 377 # -- Es wird die Leerzeichenkette hinzugefügt ------------------ 378 # -- Die Änderung ist keine Rechtschreibfehlerkorrektur ------------------ 379 # 380 if( self.istLeer() ) : 381 382 # 383 # -- nichtmodifizierten Wert eintragen -------------------------- 384 # 385 if( zk.istLeer( self.wertNichtMod[0] ) ) : 386 self.nimmWert( wert = zk.LeerZk, clientData = self.clientData ) 387 else: 388 self.nimmWert( wert = self.wertNichtMod[0], clientData = self.clientData ) 389 390 391 # 392 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 393 # -- ausgewertet werden kann -------------------------- 394 # 395 ereignis.Skip( skip = True ) 396 397 398 # 399 # -- Nicht nach der Rechtschreibfehlerkorrektur fragen ---------- 400 # 401 return 402 403 404 405 # 406 # -- Rechtschreibfehlerkorrektur ------------------------------------------ 407 # 408 # -- keine Benutzeränderung ------------------------------------------ 409 # 410 if( ( not self.istBenutzerAenderungJetzt ) 411 or ( not self.istMeldungRechtschreibFehlerKorrektur ) ) : 412 # 413 # -- Das Ereignis weiterreichen, damit es weiter ------------------ 414 # -- ausgewertet werden kann ------------------ 415 # 416 ereignis.Skip( skip = True ) 417 return 418 419 420 # 421 # -- Meldung ---------------------------------------------------------- 422 # 423 dlg = wx.MessageDialog( parent = self 424 , message = "Wurde eine Korrektur von Rechtschreibfehlern durchgeführt ?" 425 , caption = "Rechtschreibfehler ?" 426 , style = wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION ) 427 428 self.istRechtschreibFehlerKorrektur = ( dlg.ShowModal() == wx.ID_YES ) 429 430 dlg.Destroy() 431 432 433 # 434 # -- Farbe setzen ---------------------------------------------------------- 435 # -- keine Rechtschreibfehlerkorrektur führt immer zum ------------------ 436 # -- projektspezifischen Wert ------------------ 437 # 438 # if( not self.istRechtschreibFehlerKorrektur ) : 439 # self.SetBackgroundColour( self.farbeProjektspezifisch ) 440 441 442 # 443 # -- die nächste Benutzeränderung abfragen ---------------------------------- 444 # 445 self.istBenutzerAenderungJetzt = False 446 447 448 # 449 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 450 # -- ausgewertet werden kann -------------------------- 451 # 452 ereignis.Skip( skip = True )
453 454 455 456 # 457 # ------------------------------------------------------------------------------------ 458 # -- Virtuelle Funktion zur Rückgabe der Zusatzinformationen ---------- 459 # ------------------------------------------------------------------------------------ 460 #
461 - def gibClientData( self ):
462 """ 463 Virtuelle Funktion zur Rückgabe der Zusatzinformationen C{clientData}. Diese Funktion muß in der abgeleiteten Klasse implementiert werden (overloading). 464 """ 465 466 return "Muß in der abgeleiteten Klasse implementiert (überschrieben) werden."
467 468 469 470 # 471 # ------------------------------------------------------------------------------------ 472 # -- Virtuelle Funktion zur Rückgabe des Wertes -------------------------- 473 # ------------------------------------------------------------------------------------ 474 #
475 - def gibWert( self ):
476 """ 477 Virtuelle Funktion zur Rückgabe des Wertes. Diese Funktion muß in der abgeleiteten Klasse implementiert werden (overloading). 478 """ 479 480 return "Muß in der abgeleiteten Klasse implementiert (überschrieben) werden."
481 482 483 484 # 485 # ------------------------------------------------------------------------------------ 486 # -- Der Inhalt des Texteingabefeldes ist leer -------------------------- 487 # ------------------------------------------------------------------------------------ 488 #
489 - def istLeer( self ):
490 """ 491 Der Inhalt des Texteingabeobjektes ist leer 492 """ 493 494 return zk.istLeer( self.gibWert() )
495 496 497 498 # 499 # ------------------------------------------------------------------------------------ 500 # -- aktuellen Wert übernehmen ------------------------------------------ 501 # ------------------------------------------------------------------------------------ 502 #
503 - def nimmWert( self, wert, clientData = None ):
504 """ 505 Virtuelle Funktion zur Rückgabe des Wertes. Diese Funktion muß in der abgeleiteten Klasse implementiert werden (overloading). 506 """ 507 508 return "Muß in der abgeleiteten Klasse implementiert (überschrieben) werden."
509 510 511 512 513 # 514 # 515 # 516 # ---------------------------------------------------------------------------------------- 517 # ---------------------------------------------------------------------------------------- 518 # -- -------------------------------------------------- 519 # -- Allgemeines wx-Objekt mit Titel -------------------------------------------------- 520 # -- -------------------------------------------------- 521 # ---------------------------------------------------------------------------------------- 522 # ---------------------------------------------------------------------------------------- 523 #
524 -class FlexGridSizerWxObjTitel( wx.FlexGridSizer ):
525 """ 526 Klasse, die einem beliebigen wx-Objekt einen Titel zuordnet. 527 """ 528 529 # 530 # ------------------------------------------------------------------------------------ 531 # -- Initialisierungen -------------------------------------------------- 532 # ------------------------------------------------------------------------------------ 533 #
534 - def __init__( self, parent, wxObj, titel, orient ):
535 536 # 537 # -- Überschrift ---------------------------------------------------------- 538 # 539 self.wxText = wx.StaticText( parent, label = titel ) 540 """ 541 @cvar: Titel des C{wx-Objektes}. 542 @type: wxPython - wxText 543 """ 544 545 # 546 # -- wx-Objekt ---------------------------------------------------------- 547 # 548 self.wxObjekt = wxObj 549 """ 550 @cvar: Beliebiges C{wx-Objekt}, welchem der Titel zugeordnet wird. 551 @type: wxPython - wx-Objekt 552 """ 553 554 555 # 556 # -- Layout festlegen ------------------ 557 # 558 if( orient == wx.VERTICAL ) : 559 wx.FlexGridSizer.__init__( self, rows = 2, cols = 1, vgap = 5, hgap = 5 ) 560 561 self.AddGrowableCol( idx = 0, proportion = 1 ) 562 self.AddGrowableRow( idx = 1, proportion = 1 ) 563 else : 564 wx.FlexGridSizer.__init__( self, rows = 1, cols = 2, vgap = 5, hgap = 5 ) 565 566 self.AddGrowableCol( idx = 1, proportion = 1 ) 567 self.AddGrowableRow( idx = 0, proportion = 1 ) 568 569 # 570 # -- Zeilen/Spalten ---------------------------------------------------------- 571 # 572 self.Add( self.wxText, flag = wx.EXPAND ) 573 self.Add( self.wxObjekt, flag = wx.EXPAND )
574 575 576 577 # 578 # ------------------------------------------------------------------------------------ 579 # -- Titel und wxObjekt (de)aktivieren ---------------------------------- 580 # ------------------------------------------------------------------------------------ 581 #
582 - def Enable( self, enable = True ):
583 """ 584 Diese Methode implementiert die Standardfunktion C{Enable(...)} für diese Klasse. 585 """ 586 587 # 588 # -- Objekte (de)aktivieren -------------------------------------------------- 589 # 590 self.wxText.Enable( enable ) 591 self.wxObjekt.Enable( enable )
592 593 594 595 # 596 # 597 # 598 # ---------------------------------------------------------------------------------------- 599 # ---------------------------------------------------------------------------------------- 600 # -- ------------------------------------------ 601 # -- CheckBox mit einigen Ergänzungen ------------------------------------------ 602 # -- ------------------------------------------ 603 # ---------------------------------------------------------------------------------------- 604 # ---------------------------------------------------------------------------------------- 605 #
606 -class CheckBoxErg( wx.CheckBox, __Ergaenzung__ ):
607 """ 608 Klasse, die eine C{wx.CheckBox} mit weiteren Funktionen versieht. 609 """ 610 611 # 612 # ------------------------------------------------------------------------------------ 613 # -- Initialisierungen -------------------------------------------------- 614 # ------------------------------------------------------------------------------------ 615 #
616 - def __init__( self, parent, Statusleiste, dbVerbindung ):
617 wx.CheckBox.__init__( self, parent = parent ) 618 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 619 620 621 # 622 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 623 # 624 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 625 626 627 # 628 # -- Ereignisse behandeln -------------------------------------------------- 629 # 630 self.Bind( wx.EVT_CHECKBOX, self.__ereignisAenderung__, self ) 631 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 632 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ )
633 634 635 636 # 637 # ------------------------------------------------------------------------------------ 638 # -- aktuellen Wert zurückgeben ------------------------------------------ 639 # ------------------------------------------------------------------------------------ 640 #
641 - def gibWert( self ):
642 """ 643 Mit Aufruf dieser Methode wird der Wert der C{CheckBox} zurückgegeben. 644 """ 645 646 # 647 # -- aktuellen Wert zurückgeben ------------------------------------------ 648 # 649 return self.GetValue()
650 651 652 653 # 654 # ------------------------------------------------------------------------------------ 655 # -- Alle Einträge löschen -------------------------------------------------- 656 # ------------------------------------------------------------------------------------ 657 #
658 - def loescheAlles( self ):
659 """ 660 Mit Aufruf dieser Methode wird C{wx.CheckBox.SetValue( False )} gesetzt, sowie C{self.istVomBenutzerGeaendert = False} und C{self.istBenutzerAenderungJetzt} gesetzt. 661 """ 662 663 664 # 665 # -- Alle Einträge löschen -------------------------------------------------- 666 # 667 self.istVomBenutzerGeaendert = False 668 self.istBenutzerAenderungJetzt = False 669 del self.wertNichtMod[:] 670 self.SetValue( False )
671 672 673 674 # 675 # ------------------------------------------------------------------------------------ 676 # -- aktuellen Wert übernehmen ------------------------------------------ 677 # ------------------------------------------------------------------------------------ 678 #
679 - def nimmWert( self, wert, clientData = None ):
680 """ 681 Mit Aufruf dieser Methode wird der Wert der C{CheckBox} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 682 683 @param wert: Es ist der Wert der C{CheckBox} anzugeben. 684 @type wert: Boolescher Wert 685 686 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 687 @type clientData: beliebiges Objekt 688 """ 689 690 # 691 # -- aktuellen Wert übernehmen ------------------------------------------ 692 # 693 self.wertNichtMod.insert( 0, wert ) 694 self.SetValue( wert ) 695 self.clientData = clientData 696 697 698 # 699 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 700 # 701 self.istVomBenutzerGeaendert = False 702 self.istBenutzerAenderungJetzt = False
703 704 705 706 # 707 # 708 # 709 # ---------------------------------------------------------------------------------------- 710 # ---------------------------------------------------------------------------------------- 711 # -- ------------------------------------------ 712 # -- ComboBox mit einigen Ergänzungen ------------------------------------------ 713 # -- ------------------------------------------ 714 # ---------------------------------------------------------------------------------------- 715 # ---------------------------------------------------------------------------------------- 716 #
717 -class ComboBoxErg( wx.ComboBox, __Ergaenzung__ ):
718 """ 719 Klasse, die eine C{wx.ComboBox} mit weiteren Funktionen versieht. 720 """ 721 722 # 723 # ------------------------------------------------------------------------------------ 724 # -- Initialisierungen -------------------------------------------------- 725 # ------------------------------------------------------------------------------------ 726 #
727 - def __init__( self, parent, choices, style, Statusleiste, dbVerbindung ):
728 wx.ComboBox.__init__( self, parent = parent, choices = choices, style = style ) 729 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 730 731 732 # 733 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 734 # 735 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 736 737 738 # 739 # -- Ereignisse behandeln -------------------------------------------------- 740 # 741 self.Bind( wx.EVT_COMBOBOX, self.__ereignisAenderung__, self ) 742 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 743 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ ) 744 745 self.Bind( wx.EVT_CONTEXT_MENU, self.__ereignisKMenueNicht__ )
746 747 748 749 # 750 # ------------------------------------------------------------------------------------ 751 # -- Alle Einträge löschen -------------------------------------------------- 752 # ------------------------------------------------------------------------------------ 753 #
754 - def loescheAlles( self ):
755 """ 756 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. 757 """ 758 759 760 # 761 # -- Alle Einträge löschen -------------------------------------------------- 762 # 763 del self.clientData[:] 764 self.istVomBenutzerGeaendert = False 765 self.istBenutzerAenderungJetzt = False 766 del self.wertNichtMod[:] 767 self.Clear()
768 769 770 771 772 # 773 # ------------------------------------------------------------------------------------ 774 # -- aktuellen Wert übernehmen ------------------------------------------ 775 # ------------------------------------------------------------------------------------ 776 #
777 - def nimmWert( self, wert, clientData = None ):
778 """ 779 Mit Aufruf dieser Methode wird der Wert der C{ComboBox} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 780 781 @param wert: Es ist der Wert der C{ComboBox} anzugeben. 782 @type wert: Zeichenkette 783 784 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 785 @type clientData: beliebiges Objekt 786 """ 787 788 # 789 # -- aktuellen Wert übernehmen ------------------------------------------ 790 # 791 self.wertNichtMod.append( wert ) 792 self.Append( wert, clientData ) 793 794 795 # 796 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 797 # 798 self.istVomBenutzerGeaendert = False 799 self.istBenutzerAenderungJetzt = False
800 801 802 803 # 804 # ------------------------------------------------------------------------------------ 805 # -- Virtuelle Funktion zur Rückgabe der Zusatzinformationen ---------- 806 # ------------------------------------------------------------------------------------ 807 #
808 - def gibClientData( self, selection = None, lfdNr = 0 ):
809 """ 810 Mit Aufruf dieser Methode werden die Zusatzinformationen zum aktuell ausgewählten Eintrag der C{ComboBox} zurückgegeben. 811 812 813 @param selection: Es ist die Identifikationsnummer des Eintrages der C{ComboBox} anzugeben, zu dem die Zusatzinformationen ausgegeben werden sollen. Wird C{None} angegeben oder der Wert weggelassen, wird der aktuell gewählte Eintrag verwendet. 814 @type selection: 815 816 @param lfdNr: Sollten mehrere Werte in C{self.clientData} enthalten sein, ist die laufende Nummer des zurückzugebenden Wertes anzugeben. Wird der Wert weggelassen, wird C{0} verwendet. 817 @type lfdNr: Gazzahl 818 """ 819 820 # 821 # -- Zusatzinformationen zurückgeben ------------------------------------------ 822 # 823 if( selection == None ) : return self.GetClientData( self.GetSelection() )[lfdNr] 824 else : return self.GetClientData( selection )[lfdNr]
825 826 827 828 # 829 # ------------------------------------------------------------------------------------ 830 # -- aktuellen Wert zurückgeben ------------------------------------------ 831 # ------------------------------------------------------------------------------------ 832 #
833 - def gibWert( self ):
834 """ 835 Mit Aufruf dieser Methode wird der Wert der C{ComboBox} zurückgegeben. 836 """ 837 838 # 839 # -- aktuellen Wert zurückgeben ------------------------------------------ 840 # 841 return self.GetValue()
842 843 844 845 # 846 # ------------------------------------------------------------------------------------ 847 # -- Eintrag auswählen anhand des Wertes in clienrData[0] ------------------ 848 # ------------------------------------------------------------------------------------ 849 #
850 - def selektiereWert( self, clientDataId ):
851 """ 852 Mit Aufruf dieser Methode wird der Wert der in C{ComboBox} selektiert, dem C{clientDataId} in C{clientData} zugeordnet ist . 853 854 855 @param clientDataId: Es ist die Identifikationsnummer in C{clientData} des Eintrages der C{ComboBox} anzugeben, der ausgewählt werden soll. 856 @type clientDataId: beliebig (meist Ganzzahl) 857 858 @return: C{True} wenn der Wert selektiert werden konnte; sonst C{False}. 859 @rtype: Boolean 860 """ 861 862 # 863 # -- gewünschten Wert markieren ------------------------------------------ 864 # 865 for i in range( self.GetCount() ) : 866 867 self.SetSelection( i ) 868 869 if ( self.gibClientData( selection = i, lfdNr = 0 ) == clientDataId ) : 870 871 return True 872 873 874 # 875 # -- Wert wurde nicht gefunden ------------------------------------------ 876 # 877 self.SetSelection( 0 ) 878 return False
879 880 881 882 883 # 884 # 885 # 886 # ---------------------------------------------------------------------------------------- 887 # ---------------------------------------------------------------------------------------- 888 # -- ------------------------------------------ 889 # -- Dialog mit einigen Ergänzungen ------------------------------------------ 890 # -- ------------------------------------------ 891 # ---------------------------------------------------------------------------------------- 892 # ---------------------------------------------------------------------------------------- 893 #
894 -class DialogErg( wx.Dialog ):
895 """ 896 Klasse, die eine C{wx.Dialog} mit weiteren Funktionen versieht. 897 """ 898 899 # 900 # ------------------------------------------------------------------------------------ 901 # -- Initialisierungen -------------------------------------------------- 902 # ------------------------------------------------------------------------------------ 903 #
904 - def __init__( self, parent, title, dbVerbindung, style = wx.RESIZE_BORDER ):
905 wx.Dialog.__init__( self, parent = parent, title = title, style = style ) 906 907 # 908 # -- SAFEPOINT behandeln -------------------------------------------------- 909 # 910 self.dbVerbindung = dbVerbindung 911 self.nameSafepoint = 'DialogErg' + str( self.GetId() ).replace( "-", "_" ) 912 self.__safepointSetzen__() 913 914 # 915 # -- Button 'Änderungen verwerfen' ------------------------------------------ 916 # 917 self.Button__Verwerfen = wx.Button( parent = self, label = u" Änderungen verwerfen " ) 918 self.Button__Verwerfen.SetMinSize( ( 200, 30 ) ) 919 self.Button__Verwerfen.SetMaxSize( ( 200, 30 ) ) 920 self.Button__Verwerfen.Enable( False ) 921 922 # 923 # -- Button 'Änderungen übernehmen' ------------------------------------------ 924 # 925 self.Button__Sichern = wx.Button( parent = self, label = u" Speichere Änderungen" ) 926 self.Button__Sichern.SetMinSize( ( 200, 30 ) ) 927 self.Button__Sichern.SetMaxSize( ( 200, 30 ) ) 928 self.Button__Sichern.Enable( False ) 929 930 # 931 # -- Button 'Fenster schließen' ------------------------------------------ 932 # 933 self.Button__FensterSchliessen = wx.Button( parent = self 934 , label = u" Fenster schließen " ) 935 self.Button__FensterSchliessen.SetMinSize( ( 150, 30 ) ) 936 self.Button__FensterSchliessen.SetMaxSize( ( 150, 30 ) ) 937 self.Button__FensterSchliessen.SetDefault() 938 self.Button__FensterSchliessen.SetFocus() 939 940 # 941 # -- Layout festlegen (1. Teil) ------------------------------------------ 942 # 943 self.FlexGridSizerButton = wx.FlexGridSizer( rows = 1, cols = 4, vgap = 0, hgap = 5 ) 944 self.FlexGridSizerButton.AddGrowableCol( idx = 0, proportion = 1 ) 945 self.FlexGridSizerButton.AddGrowableRow( idx = 0, proportion = 1 ) 946 947 948 self.FlexGridSizerButton.AddStretchSpacer() 949 self.FlexGridSizerButton.Add( self.Button__Verwerfen, flag = wx.EXPAND ) 950 self.FlexGridSizerButton.Add( self.Button__Sichern, flag = wx.EXPAND ) 951 self.FlexGridSizerButton.Add( self.Button__FensterSchliessen, flag = wx.EXPAND ) 952 953 954 self.FlexGridSizer = wx.FlexGridSizer( rows = 2, cols = 1, vgap = 5, hgap = 0 ) 955 956 self.FlexGridSizer.AddGrowableCol( idx = 0, proportion = 1 ) 957 self.FlexGridSizer.AddGrowableRow( idx = 0, proportion = 1 ) 958 959 960 # 961 # -- Ereignisse behandeln -------------------------------------------------- 962 # 963 self.Bind( wx.EVT_BUTTON, self.__ereignisVerwerfen__, self.Button__Verwerfen ) 964 self.Bind( wx.EVT_BUTTON, self.__ereignisSpeichern__, self.Button__Sichern ) 965 self.Bind( wx.EVT_BUTTON, self.__ereignisSchliessen__, self.Button__FensterSchliessen )
966 967 968 969 # 970 # ------------------------------------------------------------------------------------ 971 # -- Eingabeformular schließen; Änderungen verwerfen ---------------------------------- 972 # ------------------------------------------------------------------------------------ 973 #
974 - def __ereignisSchliessen__( self, ereignis ):
975 """ 976 Methode die aufgerufen wird, wenn das Meldungsfenster geschlossen werden soll (sie überschreibt die Standardmethode) 977 978 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 979 @type ereignis: C{wx - Ereignisobjekt} 980 """ 981 982 # 983 # -- Es liegen nichtgespeicherte Daten vor ---------------------------------- 984 # 985 if( self.Button__Verwerfen.IsEnabled() or self.Button__Sichern.IsEnabled() ) : 986 987 # 988 # -- Meldung ausgeben ------------------------------------------ 989 # 990 dlg = wx.MessageDialog( parent = self 991 , message = """Die Änderungen wurden nicht gesichert. Soll das Fenster trotzdem geschlossen werden ? 992 993 Die Änderungen werden dann verworfen.""" 994 , caption = "Änderungen verwerfen ?" 995 , style = wx.YES_NO | wx.ICON_QUESTION ) 996 997 998 # 999 # -- Meldungsfenster nicht schließen ---------------------------------- 1000 # 1001 if ( dlg.ShowModal() != wx.ID_YES ): 1002 1003 # 1004 # -- Das Ereignis weiterreichen, damit es weiter ------------------ 1005 # -- ausgewertet werden kann ------------------ 1006 # 1007 ereignis.Skip( skip = True ) 1008 return 1009 1010 1011 # 1012 # -- Alle Änderungen bis zum letzten SAFEPOINT verwerfen ------------------ 1013 # 1014 self.__safepointVerwerfen__() 1015 1016 1017 # 1018 # -- Meldungsfenster schließen ------------------------------------------ 1019 # 1020 self.Destroy() 1021 1022 1023 # 1024 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 1025 # -- ausgewertet werden kann -------------------------- 1026 # 1027 ereignis.Skip( skip = True )
1028 1029 1030 1031 # 1032 # ------------------------------------------------------------------------------------ 1033 # -- Änderungen Speichern -------------------------------------------------- 1034 # ------------------------------------------------------------------------------------ 1035 #
1036 - def __ereignisSpeichern__( self, ereignisDummy = None ):
1037 """ 1038 Methode die aufgerufen wird, wenn die Änderungen gespeichert werden sollen. 1039 1040 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 1041 @type ereignisDummy: C{wx - Ereignisobjekt} 1042 """ 1043 1044 # 1045 # -- Spezielle, in der abgeleiteten Klasse implementierte Aktionen ---------- 1046 # -- ausführen ---------- 1047 # 1048 self.__spezAktionenSpeichern__() 1049 1050 1051 # 1052 # -- Änderungen bis zum SAFEPOINT speichern ---------------------------------- 1053 # 1054 self.__safepointSpeichern__() 1055 1056 1057 # 1058 # -- Postgres-SAFEPOINT setzen, damit die nächsten Änderungen in ---------- 1059 # -- 'Anmerkungen' zurückgesetzt werden können ---------- 1060 # 1061 self.__safepointSetzen__() 1062 1063 1064 # 1065 # -- Button 'Änderungen verwerfen' / 'Änderungen sichern' deaktivieren -- 1066 # 1067 self.Button__Verwerfen.Enable( False ) 1068 self.Button__Sichern.Enable( False )
1069 1070 1071 1072 # 1073 # ------------------------------------------------------------------------------------ 1074 # -- Alle Änderungen verwerfen ------------------------------------------ 1075 # ------------------------------------------------------------------------------------ 1076 #
1077 - def __ereignisVerwerfen__( self, ereignisDummy = None ):
1078 """ 1079 Methode die aufgerufen wird, wenn alle Änderungen verworfen werden sollen.. 1080 1081 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 1082 @type ereignisDummy: C{wx - Ereignisobjekt} 1083 """ 1084 1085 # 1086 # -- Alle Änderungen bis zum letzten SAFEPOINT verwerfen ------------------ 1087 # 1088 self.__safepointVerwerfen__() 1089 1090 1091 # 1092 # -- Postgres-SAFEPOINT setzen, damit die nächsten Änderungen in ---------- 1093 # -- 'Anmerkungen' zurückgesetzt werden können ---------- 1094 # 1095 self.__safepointSetzen__() 1096 1097 1098 # 1099 # -- Spezielle, in der abgeleiteten Klasse implementierte Aktionen ---------- 1100 # -- ausführen ---------- 1101 # 1102 self.__spezAktionenVerwerfen__() 1103 1104 1105 # 1106 # -- Button 'Änderungen verwerfen' / 'Änderungen sichern' deaktivieren -- 1107 # 1108 self.Button__Verwerfen.Enable( False ) 1109 self.Button__Sichern.Enable( False )
1110 1111 1112 1113 # 1114 # ------------------------------------------------------------------------------------ 1115 # -- Safepoint setzen -------------------------------------------------- 1116 # ------------------------------------------------------------------------------------ 1117 #
1118 - def __safepointSetzen__( self ):
1119 """ 1120 Neuen PostgreSQL-SAFEPOINT setzen. 1121 """ 1122 1123 self.dbVerbindung.setzeSafepoint( self.nameSafepoint )
1124 1125 1126 1127 1128 # 1129 # ------------------------------------------------------------------------------------ 1130 # -- Änderungen bis zum aktuellen Safepoint speichern ------------------ 1131 # ------------------------------------------------------------------------------------ 1132 #
1133 - def __safepointSpeichern__( self ):
1134 """ 1135 Die Änderungen bis zum aktuellen PostgreSQL-SAFEPOINT speichern. 1136 """ 1137 1138 self.dbVerbindung.nimmAenderungenSafepoint( self.nameSafepoint )
1139 1140 1141 1142 # 1143 # ------------------------------------------------------------------------------------ 1144 # -- Änderungen bis zum aktuellen Safepoint verwerfen ------------------ 1145 # ------------------------------------------------------------------------------------ 1146 #
1147 - def __safepointVerwerfen__( self ):
1148 """ 1149 Die Änderungen bis zum aktuellen PostgreSQL-SAFEPOINT verwerfen. 1150 """ 1151 1152 self.dbVerbindung.verwerfeAenderungenSafepoint( self.nameSafepoint )
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 # -- die frei definierbaren Elemente des Dialogs hinzufügen ------------------ 1193 # ------------------------------------------------------------------------------------ 1194 #
1195 - def nimmDialogElemente( self, elemente ):
1196 """ 1197 Diese Methode fügt dem Dialog die frei definierbaren Elemente hinzu. 1198 """ 1199 1200 # 1201 # -- Layout festlegen (2. Teil) ------------------------------------------ 1202 # 1203 self.FlexGridSizer.Add( elemente 1204 , flag = wx.LEFT|wx.TOP|wx.RIGHT|wx.EXPAND 1205 , border = 10 ) 1206 self.FlexGridSizer.Add( self.FlexGridSizerButton 1207 , flag = wx.LEFT|wx.BOTTOM|wx.RIGHT|wx.EXPAND 1208 , border = 10 ) 1209 1210 self.SetSizerAndFit( self.FlexGridSizer )
1211 1212 1213 1214 1215 1216 1217 # 1218 # ---------------------------------------------------------------------------------------- 1219 # ---------------------------------------------------------------------------------------- 1220 # -- ------------------------------------------ 1221 # -- ListBox mit einigen Ergänzungen ------------------------------------------ 1222 # -- ------------------------------------------ 1223 # ---------------------------------------------------------------------------------------- 1224 # ---------------------------------------------------------------------------------------- 1225 #
1226 -class ListBoxErg( wx.ListBox, __Ergaenzung__ ):
1227 """ 1228 Klasse, die eine C{wx.ListBox} mit weiteren Funktionen versieht. 1229 """ 1230 1231 # 1232 # ------------------------------------------------------------------------------------ 1233 # -- Initialisierungen -------------------------------------------------- 1234 # ------------------------------------------------------------------------------------ 1235 #
1236 - def __init__( self, parent, size, style, Statusleiste, dbVerbindung ):
1237 wx.ListBox.__init__( self, parent = parent, size = size, style = style ) 1238 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 1239 1240 # 1241 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 1242 # 1243 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 1244 1245 1246 # 1247 # -- Ereignisse behandeln -------------------------------------------------- 1248 # 1249 self.Bind( wx.EVT_LISTBOX_DCLICK, self.__ereignisAenderung__, self ) 1250 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 1251 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ )
1252 1253 1254 # 1255 # ------------------------------------------------------------------------------------ 1256 # -- ClientData des Eintrages mit der lfdNr zurückgegeben ------------------ 1257 # ------------------------------------------------------------------------------------ 1258 #
1259 - def gibClientData( self, lfdNr = None ):
1260 """ 1261 Mit Aufruf dieser Methode wird C{ClientData} des Eintrages mit der C{lfdNr} zurückgegeben. Wenn C{lfdNr == None} werden alle Einträge zurückgegeben. 1262 1263 @param lfdNr: Es ist die lfd. Nummer des Eintrages anzugeben, dessen C{wx.ClientData} zurückgegeben werden soll. Wird C{None} angegeben, werden alle C{wx.ClientData} zurückgegeben. 1264 @type lfdNr: Ganzzahl 1265 1266 @return: C{wx.ClientData} zur C{lfdNr} 1267 @rtype: Listenobjekt 1268 """ 1269 1270 # 1271 # -- keine Einträge vorhanden ------------------------------------------ 1272 # 1273 if( self.IsEmpty() ) : return None 1274 1275 1276 # 1277 # -- clientData zurückgeben -------------------------------------------------- 1278 # 1279 if( lfdNr == None ) : 1280 clientDataTmp = [] 1281 1282 for i in range( self.GetCount() ): 1283 clientDataTmp.append( self.GetClientData( i )[0] ) 1284 1285 return clientDataTmp 1286 1287 else : 1288 return self.GetClientData( lfdNr )
1289 1290 1291 1292 # 1293 # ------------------------------------------------------------------------------------ 1294 # -- aktuellen Wert zurückgeben ------------------------------------------ 1295 # ------------------------------------------------------------------------------------ 1296 #
1297 - def gibWert( self, lfdNr = None ):
1298 """ 1299 Mit Aufruf dieser Methode wird der Wert des Eintrages mit der C{lfdNr} zurückgegeben. 1300 1301 @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. 1302 @type lfdNr: Ganzzahl 1303 1304 @return: Wert zur C{lfdNr} 1305 @rtype: Zeichenkette 1306 """ 1307 1308 # 1309 # -- aktuellen Wert zurückgeben ------------------------------------------ 1310 # 1311 if( lfdNr != None ) : self.SetSelection( lfdNr ) 1312 return self.GetStringSelection()
1313 1314 1315 1316 # 1317 # ------------------------------------------------------------------------------------ 1318 # -- Alle Einträge löschen -------------------------------------------------- 1319 # ------------------------------------------------------------------------------------ 1320 #
1321 - def loescheAlles( self ):
1322 """ 1323 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. 1324 """ 1325 1326 1327 # 1328 # -- Alle Einträge löschen -------------------------------------------------- 1329 # 1330 del self.clientData[:] 1331 self.istVomBenutzerGeaendert = False 1332 self.istBenutzerAenderungJetzt = False 1333 del self.wertNichtMod[:] 1334 self.Clear()
1335 1336 1337 1338 1339 # 1340 # ------------------------------------------------------------------------------------ 1341 # -- aktuellen Wert übernehmen ------------------------------------------ 1342 # ------------------------------------------------------------------------------------ 1343 #
1344 - def nimmWert( self, wert, clientData = None ):
1345 """ 1346 Mit Aufruf dieser Methode wird der Wert der C{ListBox} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 1347 1348 @param wert: Es ist der Wert der C{ListBox} anzugeben. 1349 @type wert: Zeichenkette 1350 1351 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 1352 @type clientData: beliebiges Objekt 1353 """ 1354 1355 # 1356 # -- aktuellen Wert übernehmen ------------------------------------------ 1357 # 1358 self.wertNichtMod.append( wert ) 1359 self.Append( wert, clientData ) 1360 1361 1362 # 1363 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 1364 # 1365 self.istVomBenutzerGeaendert = False 1366 self.istBenutzerAenderungJetzt = False
1367 1368 1369 1370 # 1371 # ------------------------------------------------------------------------------------ 1372 # -- Eintrag auswählen anhand des Wertes in clienrData[0] ------------------ 1373 # ------------------------------------------------------------------------------------ 1374 #
1375 - def selektiereWert( self, clientDataId ):
1376 """ 1377 Mit Aufruf dieser Methode wird der Wert der in C{ListBoxErg} selektiert, dem C{clientDataId} in C{clientData} zugeordnet ist . 1378 1379 1380 @param clientDataId: Es ist die Identifikationsnummer in C{clientData} des Eintrages der C{ListBoxErg} anzugeben, der ausgewählt werden soll. 1381 @type clientDataId: beliebig (meist Ganzzahl) 1382 1383 @return: C{True} wenn der Wert selektiert werden konnte; sonst C{False}. 1384 @rtype: Boolean 1385 """ 1386 1387 # 1388 # -- gewünschten Wert markieren ------------------------------------------ 1389 # 1390 for i in range( self.GetCount() ) : 1391 1392 self.SetSelection( i ) 1393 1394 if ( self.gibClientData( lfdNr = i )[0] == clientDataId ) : 1395 1396 return True 1397 1398 1399 # 1400 # -- Wert wurde nicht gefunden ------------------------------------------ 1401 # 1402 self.SetSelection( 0 ) 1403 return False
1404 1405 1406 1407 # 1408 # 1409 # 1410 # ---------------------------------------------------------------------------------------- 1411 # ---------------------------------------------------------------------------------------- 1412 # -- ---------------------------------- 1413 # -- >ListBox< im >SplitterWindow< mit Titel ---------------------------------- 1414 # -- ---------------------------------- 1415 # ---------------------------------------------------------------------------------------- 1416 # ---------------------------------------------------------------------------------------- 1417 #
1418 -class ListBoxSpWTitel( wx.Panel ):
1419 """ 1420 Klasse, die zwei C{ListBox} in einem C{SplitterWindow} darstellt. Weiterhin wird ein Titel zugeordnet. 1421 """ 1422 1423 # 1424 # ------------------------------------------------------------------------------------ 1425 # -- Initialisierungen -------------------------------------------------- 1426 # ------------------------------------------------------------------------------------ 1427 #
1428 - def __init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung, styleLBli = wx.BORDER_SUNKEN | wx.LB_SORT, styleLBre = wx.BORDER_SUNKEN | wx.LB_SORT ):
1429 wx.Panel.__init__( self, parent ) 1430 1431 self.SplitterWindow = wx.SplitterWindow( self, -1, style = wx.SP_LIVE_UPDATE ) 1432 self.SplitterWindow.SetMinimumPaneSize( 20 ) 1433 1434 1435 # 1436 # -- linkes / rechtes Fenster ------------------------------------------ 1437 # 1438 self.ListBox__li = ListBoxErg( self.SplitterWindow 1439 , size = ( -1, -1 ) 1440 # , style = wx.BORDER_SUNKEN | wx.LB_SORT 1441 , style = styleLBli 1442 , Statusleiste = Statusleiste 1443 , dbVerbindung = dbVerbindung ) 1444 self.ListBox__re = ListBoxErg( self.SplitterWindow 1445 , size = ( -1, -1 ) 1446 # , style = wx.BORDER_SUNKEN | wx.LB_SORT 1447 , style = styleLBre 1448 , Statusleiste = Statusleiste 1449 , dbVerbindung = dbVerbindung ) 1450 1451 1452 # 1453 # -- Fenster anordnen -------------------------------------------------- 1454 # 1455 self.SplitterWindow.SplitVertically( self.ListBox__li 1456 , self.ListBox__re 1457 , -100 ) 1458 1459 self.FlexGridSizerWxObjTitel = FlexGridSizerWxObjTitel( parent = self 1460 , wxObj = self.SplitterWindow 1461 , titel = titel 1462 , orient = orient ) 1463 1464 self.FlexGridSizerWxObjTitel.wxObjekt.SetMinSize( minSize ) 1465 1466 BoxSizer = wx.BoxSizer( wx.VERTICAL ) 1467 BoxSizer.Add( self.FlexGridSizerWxObjTitel 1468 , proportion = 1 1469 , flag = wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL 1470 , border = 0 ) 1471 self.SetSizerAndFit( BoxSizer )
1472 1473 1474 1475 # 1476 # ------------------------------------------------------------------------------------ 1477 # -- Titel und wxObjekt (de)aktivieren ---------------------------------- 1478 # ------------------------------------------------------------------------------------ 1479 #
1480 - def Enable( self, enable = True ):
1481 """ 1482 Diese Methode implementiert die Standardfunktion C{Enable(...)} für diese Klasse. 1483 """ 1484 1485 # 1486 # -- Objekte (de)aktivieren -------------------------------------------------- 1487 # 1488 self.FlexGridSizerWxObjTitel.Enable( enable )
1489 1490 1491 1492 1493 # 1494 # 1495 # 1496 # ---------------------------------------------------------------------------------------- 1497 # ---------------------------------------------------------------------------------------- 1498 # -- ------------------ 1499 # -- >ListBox< im >SplitterWindow< mit Titel, bei der im rechten ------------------ 1500 # -- Fenster eine Werteliste bereitgestellt wird ------------------ 1501 # -- ------------------ 1502 # ---------------------------------------------------------------------------------------- 1503 # ---------------------------------------------------------------------------------------- 1504 #
1505 -class ListBoxSpWTitelAL( ListBoxSpWTitel ):
1506 1507 """ 1508 Klasse, die zwei C{ListBox} in einem C{SplitterWindow} darstellt, um aus einer Liste von Vorgabewerten auszuwählen. Weiterhin wird ein Titel zugeordnet. 1509 Wird ein Doppelklick auf einem Eintrag in einer der beiden C{ListBox} ausgeführt, so wird er in die andere C{ListBox} verschoben. 1510 """ 1511 1512 # 1513 # ------------------------------------------------------------------------------------ 1514 # -- Initialisierungen -------------------------------------------------- 1515 # ------------------------------------------------------------------------------------ 1516 #
1517 - def __init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung, styleLBli = wx.BORDER_SUNKEN | wx.LB_SORT, styleLBre = wx.BORDER_SUNKEN | wx.LB_SORT ):
1518 ListBoxSpWTitel.__init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung, styleLBli = styleLBli, styleLBre = styleLBre ) 1519 1520 1521 # 1522 # -- linke Auswahlliste darf nicht leer sein ---------------------------------- 1523 # 1524 self.ListBoxLiDarfLeerSein = True 1525 1526 1527 # 1528 # -- Tooltip li/re setzen -------------------------------------------------- 1529 # 1530 self.ListBox__li.SetToolTip(wx.ToolTip( "Doppelklick:\nEintrag in das Nachbarfenster schieben" )) 1531 self.ListBox__re.SetToolTip(wx.ToolTip( "Doppelklick:\nEintrag in das Nachbarfenster schieben" )) 1532 1533 1534 # 1535 # -- Auswahlliste: Projektübergreifend gültigen Wert zeigen ist sinnlos -- 1536 # 1537 self.ListBox__re.markiereWertProjUeb = False 1538 1539 1540 # 1541 # -- Hintergrundfarbe re setzen ------------------------------------------ 1542 # 1543 self.ListBox__re.SetBackgroundColour( wx.NamedColour( farbeAuswahlListe ) ) 1544 1545 1546 # 1547 # -- Ereignisse behandeln -------------------------------------------------- 1548 # 1549 self.Bind( wx.EVT_LISTBOX_DCLICK, self.__ereignisSchieben__, self.ListBox__li ) 1550 self.Bind( wx.EVT_LISTBOX_DCLICK, self.__ereignisSchieben__, self.ListBox__re )
1551 1552 1553 1554 # 1555 # ------------------------------------------------------------------------------------ 1556 # -- Eintrag verschieben -------------------------------------------------- 1557 # ------------------------------------------------------------------------------------ 1558 #
1559 - def __ereignisSchieben__( self, ereignis = None ):
1560 """ 1561 Methode die aufgerufen wird, wenn der aktuelle Eintrag in das andere Fenster verschoben werden soll. 1562 1563 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 1564 @type ereignis: C{wx - Ereignisobjekt} 1565 """ 1566 1567 1568 # 1569 # -- Änderung kennzeichnen -------------------------------------------------- 1570 # 1571 self.ListBox__li.istVomBenutzerGeaendert = True 1572 self.ListBox__re.istVomBenutzerGeaendert = True 1573 1574 1575 # 1576 # -- Eintrag nach links verschieben ------------------------------------------ 1577 # 1578 if ereignis.GetId() == self.ListBox__re.GetId(): 1579 self.schiebeLinks( ereignis.GetClientData()[0] ) 1580 1581 1582 # 1583 # -- Eintrag nach rechts verschieben ------------------------------------------ 1584 # 1585 if( ereignis.GetId() == self.ListBox__li.GetId() ): 1586 if( self.ListBox__li.GetCount() > 1 1587 or ( self.ListBox__li.GetCount() == 1 and self.ListBoxLiDarfLeerSein ) ) : 1588 self.schiebeRechts( ereignis.GetClientData()[0] )
1589 1590 1591 1592 # 1593 # ------------------------------------------------------------------------------------ 1594 # -- Alle Einträge nach links schieben ---------------------------------- 1595 # ------------------------------------------------------------------------------------ 1596 # 1629 1630 1631 1632 # 1633 # ------------------------------------------------------------------------------------ 1634 # -- Alle Einträge nach rechts schieben ---------------------------------- 1635 # ------------------------------------------------------------------------------------ 1636 #
1637 - def schiebeAlleRechts( self ):
1638 """ 1639 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. 1640 """ 1641 1642 1643 # 1644 # -- Historie zurücksetzen -------------------------------------------------- 1645 # 1646 self.ListBox__li.istVomBenutzerGeaendert = False 1647 self.ListBox__re.istVomBenutzerGeaendert = False 1648 1649 1650 # 1651 # -- die Routine verlassen, wenn das rechte Fenster leer ist ------------------ 1652 # 1653 if self.ListBox__li.IsEmpty(): 1654 return 1655 1656 1657 # 1658 # -- alle Einträge nach rechts schieben ---------------------------------- 1659 # 1660 for i in range( self.ListBox__li.GetCount() ) : 1661 self.ListBox__re.Append( self.ListBox__li.GetString( i ) 1662 , self.ListBox__li.GetClientData( i ) ) 1663 1664 1665 # 1666 # -- >ListBox__li< leeren -------------------------------------------------- 1667 # 1668 self.ListBox__li.Clear()
1669 1670 1671 1672 # 1673 # ------------------------------------------------------------------------------------ 1674 # -- Eintrag nach links schieben ------------------------------------------ 1675 # ------------------------------------------------------------------------------------ 1676 # 1724 1725 1726 1727 # 1728 # ------------------------------------------------------------------------------------ 1729 # -- Eintrag nach rechts schieben ------------------------------------------ 1730 # ------------------------------------------------------------------------------------ 1731 #
1732 - def schiebeRechts( self, cdNullId = None ):
1733 """ 1734 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. 1735 Wird C{cdNullId = None} übergeben, wird der erste Eintrag der Liste verschoben. 1736 1737 @param cdNullId: Es ist die in C{ListBox__re.wxClientData[0]} gespeicherte Identifikationsnummer anzugeben, die nach rechts verschoben werden soll. 1738 @type cdNullId: Ganzzahl 1739 """ 1740 1741 1742 # 1743 # -- die Routine verlassen, wenn das rechte Fenster leer ist ------------------ 1744 # 1745 if self.ListBox__li.IsEmpty(): 1746 return 1747 1748 1749 # 1750 # -- Wenn >cdNullId< nicht spezifiziert ist, den ersten Eintrag ---------- 1751 # -- verschieben ... ---------- 1752 # 1753 nrEintrag = 0 1754 1755 1756 # 1757 # -- ... sonst die lfd. Nr. des Eintrags ermitteln -------------------------- 1758 # 1759 if cdNullId != None: 1760 for nrEintrag in range( self.ListBox__li.GetCount() ) : 1761 if self.ListBox__li.GetClientData( nrEintrag )[0] == cdNullId: 1762 break 1763 1764 1765 # 1766 # -- die Routine verlassen, wenn die übergebene >cdNullId< nicht ---------- 1767 # -- gefunden wurde ---------- 1768 # 1769 if ( nrEintrag == self.ListBox__li.GetCount() - 1 ) and ( self.ListBox__li.GetClientData( nrEintrag )[0] != cdNullId ): 1770 return 1771 1772 1773 # 1774 # -- Eintrag verschieben -------------------------------------------------- 1775 # 1776 self.ListBox__re.Append( self.ListBox__li.GetString( nrEintrag ) 1777 , self.ListBox__li.GetClientData( nrEintrag ) ) 1778 self.ListBox__li.Delete( nrEintrag )
1779 1780 1781 1782 # 1783 # 1784 # 1785 # ---------------------------------------------------------------------------------------- 1786 # ---------------------------------------------------------------------------------------- 1787 # -- ------------------ 1788 # -- >ListBox< im >SplitterWindow< mit Titel, bei der der rechte ------------------ 1789 # -- und linke Eintrag synchronisiert ist ------------------ 1790 # -- ------------------ 1791 # ---------------------------------------------------------------------------------------- 1792 # ---------------------------------------------------------------------------------------- 1793 #
1794 -class ListBoxSpWTitelSync( ListBoxSpWTitel ):
1795 """ 1796 Klasse, die zwei C{ListBox} in einem C{SplitterWindow} darstellt, wobei die Einträge beider C{ListBox} inhaltlich miteinander verbunden sind. Weiterhin wird ein Titel zugeordnet. 1797 Der linke und rechte Eintrag ist synchronisiert (beide Einträge sind über eine Identifikationsnummer ansprechbar) 1798 """ 1799 1800 1801 # 1802 # ------------------------------------------------------------------------------------ 1803 # -- Initialisierungen -------------------------------------------------- 1804 # ------------------------------------------------------------------------------------ 1805 #
1806 - def __init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung, styleLBli = wx.BORDER_SUNKEN | wx.LB_SORT, styleLBre = wx.BORDER_SUNKEN | wx.LB_SORT ):
1807 ListBoxSpWTitel.__init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung, styleLBli = styleLBli, styleLBre = styleLBre )
1808 1809 1810 1811 1812 1813 # 1814 # 1815 # 1816 # ---------------------------------------------------------------------------------------- 1817 # ---------------------------------------------------------------------------------------- 1818 # -- ------------------ 1819 # -- >ListBox< im >SplitterWindow< mit Titel, bei der rechter ------------------ 1820 # -- und linker Eintrag unabhängig voneinander sind ------------------ 1821 # -- ------------------ 1822 # ---------------------------------------------------------------------------------------- 1823 # ---------------------------------------------------------------------------------------- 1824 #
1825 -class ListBoxSpWTitelUnabh( ListBoxSpWTitel ):
1826 """ 1827 Klasse, die zwei C{ListBox} in einem C{SplitterWindow} miteinander verbindet, wobei die Einträge beider C{ListBox} inhaltlich unabhängig voneinander sind. Weiterhin wird ein Titel zugeordnet. 1828 Der linke und rechte Eintrag sind unabhängig voneinander. 1829 """ 1830 1831 1832 # 1833 # ------------------------------------------------------------------------------------ 1834 # -- Initialisierungen -------------------------------------------------- 1835 # ------------------------------------------------------------------------------------ 1836 #
1837 - def __init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung ):
1838 ListBoxSpWTitel.__init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung )
1839 1840 1841 1842 1843 1844 # 1845 # 1846 # 1847 # ---------------------------------------------------------------------------------------- 1848 # ---------------------------------------------------------------------------------------- 1849 # -- ------------------------------------------ 1850 # -- MaskedTextCtrl mit einigen Ergänzungen ------------------------------------------ 1851 # -- ------------------------------------------ 1852 # ---------------------------------------------------------------------------------------- 1853 # ---------------------------------------------------------------------------------------- 1854 #
1855 -class MaskedTextCtrlErg( wxmsk.TextCtrl, __Ergaenzung__ ):
1856 """ 1857 Klasse, die eine C{MaskedTextCtrl} mit weiteren Funktionen versieht. 1858 """ 1859 1860 # 1861 # ------------------------------------------------------------------------------------ 1862 # -- Initialisierungen -------------------------------------------------- 1863 # ------------------------------------------------------------------------------------ 1864 #
1865 - def __init__( self, parent, validRequired, autoformat, Statusleiste, dbVerbindung ):
1866 wxmsk.TextCtrl.__init__( self, parent = parent 1867 , validRequired = validRequired 1868 , autoformat = autoformat ) 1869 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 1870 1871 1872 # 1873 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 1874 # 1875 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 1876 1877 1878 # 1879 # -- Ereignisse behandeln -------------------------------------------------- 1880 # 1881 self.Bind( wx.EVT_TEXT, self.__ereignisAenderung__, self ) 1882 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 1883 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ )
1884 1885 1886 1887 # 1888 # ------------------------------------------------------------------------------------ 1889 # -- aktuellen Wert zurückgeben ------------------------------------------ 1890 # ------------------------------------------------------------------------------------ 1891 #
1892 - def gibWert( self ):
1893 """ 1894 Mit Aufruf dieser Methode wird der Wert des C{wxmsk.TextCtrl} zurückgegeben. 1895 """ 1896 1897 # 1898 # -- aktuellen Wert zurückgeben ------------------------------------------ 1899 # 1900 return self.GetValue()
1901 1902 1903 1904 # 1905 # ------------------------------------------------------------------------------------ 1906 # -- Alle Einträge löschen -------------------------------------------------- 1907 # ------------------------------------------------------------------------------------ 1908 #
1909 - def loescheAlles( self ):
1910 """ 1911 Mit Aufruf dieser Methode wird der Text aus dem C{MaskedTextCtrl} gelöscht, sowie C{self.istVomBenutzerGeaendert = False} und C{self.istBenutzerAenderungJetzt} gesetzt. 1912 """ 1913 1914 1915 # 1916 # -- Alle Einträge löschen -------------------------------------------------- 1917 # 1918 self.istVomBenutzerGeaendert = False 1919 self.istBenutzerAenderungJetzt = False 1920 del self.wertNichtMod[:] 1921 self.Clear()
1922 1923 1924 1925 1926 # 1927 # ------------------------------------------------------------------------------------ 1928 # -- aktuellen Wert übernehmen ------------------------------------------ 1929 # ------------------------------------------------------------------------------------ 1930 #
1931 - def nimmWert( self, wert, clientData = None ):
1932 """ 1933 Mit Aufruf dieser Methode wird der Wert der C{MaskedTextCtrl} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 1934 1935 @param wert: Es ist der Wert der C{MaskedTextCtrl} anzugeben. 1936 @type wert: Zeichenkette 1937 1938 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 1939 @type clientData: beliebiges Objekt 1940 """ 1941 1942 # 1943 # -- Alles löschen ---------------------------------------------------------- 1944 # 1945 self.loescheAlles() 1946 1947 1948 # 1949 # -- aktuellen Wert übernehmen ------------------------------------------ 1950 # 1951 self.wertNichtMod.insert( 0, wert ) 1952 self.ChangeValue( wert ) 1953 self.clientData = clientData 1954 1955 1956 # 1957 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 1958 # 1959 self.istVomBenutzerGeaendert = False 1960 self.istBenutzerAenderungJetzt = False
1961 1962 1963 1964 1965 # 1966 # 1967 # 1968 # ---------------------------------------------------------------------------------------- 1969 # ---------------------------------------------------------------------------------------- 1970 # -- ---------- 1971 # -- Mehrere Menüs verwalten ---------- 1972 # -- ---------- 1973 # ---------------------------------------------------------------------------------------- 1974 # ---------------------------------------------------------------------------------------- 1975 #
1976 -class MultiMenu():
1977 """ 1978 Klasse, die mehrere C{wx.Menu} bereitstellt. 1979 """ 1980 1981 # 1982 # ------------------------------------------------------------------------------------ 1983 # -- Initialisierungen -------------------------------------------------- 1984 # ------------------------------------------------------------------------------------ 1985 #
1986 - def __init__( self ):
1987 1988 # 1989 # -- Identifikationsnummern -------------------------------------------------- 1990 # 1991 self.menu = [] 1992 1993 # 1994 # -- Identifikationsnummern -------------------------------------------------- 1995 # 1996 self.basisMenuId = 10
1997 1998 1999 2000 2001 # 2002 # ------------------------------------------------------------------------------------ 2003 # -- aktuellen Menüeintrag übernehmen ---------------------------------- 2004 # ------------------------------------------------------------------------------------ 2005 #
2006 - def aktiviereMenuEintrag( self, aktivieren, lfdNrMenu, lfdNrEintrag ):
2007 """ 2008 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. 2009 2010 @param aktivieren: Menüeintrag aktivieren C{aktivieren = True}. Menüeintrag deaktivieren C{aktivieren = False}. 2011 @type aktivieren: Ganzzahl 2012 2013 @param lfdNrMenu: lfd. Nummer des Menüs (beginnt mit Null) 2014 @type lfdNrMenu: Ganzzahl 2015 2016 @param lfdNrEintrag: lfd. Nummer des Menüeintrages (beginnt mit Null) 2017 @type lfdNrEintrag: Ganzzahl 2018 """ 2019 2020 # 2021 # -- Menüeintrag (de)aktivieren ------------------------------------------ 2022 # 2023 self.menu[lfdNrMenu].Enable( self.gibMenuEintragId( lfdNrMenu, lfdNrEintrag ), aktivieren )
2024 2025 2026 2027 # 2028 # ------------------------------------------------------------------------------------ 2029 # -- aktuellen Menüeintrag übernehmen ---------------------------------- 2030 # ------------------------------------------------------------------------------------ 2031 #
2032 - def gibMenu( self, lfdNrMenu ):
2033 """ 2034 Mit Aufruf dieser Methode wird das Menü mit der laufenden Nummer C{lfdNrMenu} der Menüeintrag C{eintrag} übergebenzurückgegeben. 2035 2036 @param lfdNrMenu: lfd. Nummer des Menüs 2037 @type lfdNrMenu: wx.Menu 2038 """ 2039 2040 # 2041 # -- Menü zurückgeben -------------------------------------------------- 2042 # 2043 return self.menu[lfdNrMenu]
2044 2045 2046 2047 # 2048 # ------------------------------------------------------------------------------------ 2049 # -- Initialisierungen -------------------------------------------------- 2050 # ------------------------------------------------------------------------------------ 2051 #
2052 - def gibMenuEintragId( self, lfdNrMenu, lfdNrEintrag ):
2053 """ 2054 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. 2055 2056 @param lfdNrMenu: lfd. Nummer des Menüs (beginnt mit Null) 2057 @type lfdNrMenu: Ganzzahl 2058 2059 @param lfdNrEintrag: lfd. Nummer des Menüeintrages (beginnt mit Null) 2060 @type lfdNrEintrag: Ganzzahl 2061 2062 @return: Id des Menüeintrages 2063 @rtype: Ganzzahl 2064 """ 2065 2066 # 2067 # -- Id berechnen und zurückgeben ------------------------------------------ 2068 # 2069 return self.basisMenuId * ( lfdNrMenu + 1 ) + lfdNrEintrag
2070 2071 2072 2073 # 2074 # ------------------------------------------------------------------------------------ 2075 # -- neues Menü erstellen -------------------------------------------------- 2076 # ------------------------------------------------------------------------------------ 2077 #
2078 - def initMenu( self ):
2079 """ 2080 Mit Aufruf dieser Methode ein neues Menü hinzugefügt. 2081 """ 2082 2083 # 2084 # -- neues Menü erstellen -------------------------------------------------- 2085 # 2086 self.menu.append( wx.Menu() )
2087 2088 2089 # 2090 # ------------------------------------------------------------------------------------ 2091 # -- aktuellen Menüeintrag übernehmen ---------------------------------- 2092 # ------------------------------------------------------------------------------------ 2093 #
2094 - def nimmMenuEintrag( self, eintrag, lfdNrMenu ):
2095 """ 2096 Mit Aufruf dieser Methode wird dem Menü mit der laufenden Nummer C{lfdNrMenu} der Menüeintrag C{eintrag} übergeben 2097 2098 @param eintrag: Es ist der Menüeintrag anzugeben. 2099 @type eintrag: Zeichenkette 2100 2101 @param lfdNrMenu: lfd. Nummer des Menüs 2102 @type lfdNrMenu: Ganzzahl 2103 """ 2104 2105 # 2106 # -- Eintrag hinzufügen -------------------------------------------------- 2107 # 2108 self.menu[lfdNrMenu].Append( self.gibMenuEintragId( lfdNrMenu, self.menu[lfdNrMenu].GetMenuItemCount() ), eintrag )
2109 2110 2111 2112 # 2113 # ------------------------------------------------------------------------------------ 2114 # -- aktuelle Ereignisbehandlung zum Menüeintrag übernehmen ------------------ 2115 # ------------------------------------------------------------------------------------ 2116 #
2117 - def nimmMenuEreignis( self, ereignisMethode, lfdNrMenu, lfdNrEintrag ):
2118 """ 2119 Mit Aufruf dieser Methode wird dem Menü mit der laufenden Nummer C{lfdNrMenu} der Menüeintrag C{eintrag} übergeben 2120 2121 @param ereignisMethode: Es ist die Methode zur Ereignisbehandlung zu übergeben. 2122 @type ereignisMethode: Zeichenkette 2123 2124 @param lfdNrMenu: lfd. Nummer des Menüs 2125 @type lfdNrMenu: Ganzzahl 2126 2127 @param lfdNrEintrag: lfd. Nummer des Menüeintrages (beginnt mit Null) 2128 @type lfdNrEintrag: Ganzzahl 2129 """ 2130 2131 # 2132 # -- Eintrag hinzufügen -------------------------------------------------- 2133 # 2134 self.menu[lfdNrMenu].Bind( wx.EVT_MENU 2135 , ereignisMethode 2136 , id = self.gibMenuEintragId( lfdNrMenu, lfdNrEintrag ) )
2137 2138 2139 2140 2141 # 2142 # ------------------------------------------------------------------------------------ 2143 # -- Trennlinie übernehmen -------------------------------------------------- 2144 # ------------------------------------------------------------------------------------ 2145 #
2146 - def nimmTrennlinie( self, lfdNrMenu ):
2147 """ 2148 Mit Aufruf dieser Methode wird dem Menü mit der laufenden Nummer C{lfdNrMenu} eine Trennlinie hinugefügt 2149 2150 @param lfdNrMenu: lfd. Nummer des Menüs 2151 @type lfdNrMenu: Ganzzahl 2152 """ 2153 2154 # 2155 # -- Trennlinie hinzufügen -------------------------------------------------- 2156 # 2157 self.menu[lfdNrMenu].AppendSeparator()
2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 # 2169 # 2170 # 2171 # ---------------------------------------------------------------------------------------- 2172 # ---------------------------------------------------------------------------------------- 2173 # -- ---------- 2174 # -- Fenster zur Auswahl der Eingabefelder, die durchsucht / gefiltert ---------- 2175 # -- werden sollen ---------- 2176 # -- ---------- 2177 # ---------------------------------------------------------------------------------------- 2178 # ---------------------------------------------------------------------------------------- 2179 #
2180 -class PopupTransientWindowFilterSuche( wx.PopupTransientWindow ):
2181 """ 2182 Klasse, die das Fenster zur Auswahl der Eingabefelder, die durchsucht / gefiltert werden sollen repräsentiert. 2183 """ 2184 2185 # 2186 # ------------------------------------------------------------------------------------ 2187 # -- Initialisierungen -------------------------------------------------- 2188 # ------------------------------------------------------------------------------------ 2189 #
2190 - def __init__( self, parent, style ):
2191 wx.PopupTransientWindow.__init__( self, parent, style ) 2192 2193 # 2194 # Test 2195 # 2196 self.SetBackgroundColour("#FFB6C1") 2197 2198 self.cb1 = wx.CheckBox(self, -1, "Apples")#, (65, 40), (150, 20), wx.NO_BORDER) 2199 self.cb2 = wx.CheckBox(self, -1, "Oranges")#, (65, 60), (150, 20), wx.NO_BORDER) 2200 self.cb3 = wx.CheckBox(self, -1, "Pears")#, (65, 80), (150, 20), wx.NO_BORDER) 2201 2202 sizer = wx.BoxSizer(wx.VERTICAL) 2203 sizer.Add( self.cb1 ) 2204 sizer.Add( self.cb2 ) 2205 sizer.Add( self.cb3 ) 2206 self.SetSizerAndFit( sizer ) 2207 self.Layout()
2208 2209 2210 2211 2212 2213 2214 2215 # 2216 # 2217 # 2218 # ---------------------------------------------------------------------------------------- 2219 # ---------------------------------------------------------------------------------------- 2220 # -- -------------------------- 2221 # -- Spezielles Eingabeformular für Sicherheitsanforderungen -------------------------- 2222 # -- Es werden Strukturpunkte / Dokumente zugeordnet -------------------------- 2223 # -- -------------------------- 2224 # ---------------------------------------------------------------------------------------- 2225 # ---------------------------------------------------------------------------------------- 2226 #
2227 -class SiAnfStrktDok( wx.Panel ):
2228 """ 2229 Klasse zur Abbildung des Teil-Eingabeformulars der Sicherheitsanforderungen für die Strukturpunkte bzw. Dokumente 2230 """ 2231 2232 # 2233 # ------------------------------------------------------------------------------------ 2234 # -- Eingabeformular initialisieren ---------------------------------- 2235 # ------------------------------------------------------------------------------------ 2236 #
2237 - def __init__( self, parent, varId, Statusleiste, dbVerbindung, prjProjekteId, sprSprachenId, psGefszenarioId ):
2238 wx.Panel.__init__( self, parent = parent ) 2239 2240 2241 # 2242 # -------------------------------------------------------------------------------- 2243 # -- Variante übernehmen -------------------------------------------------- 2244 # -------------------------------------------------------------------------------- 2245 # 2246 self.varId = varId 2247 2248 # 2249 # -- Verfügbare Sicherheitsanforderungen ---------------------------------- 2250 # 2251 if( self.varId == 1 ): 2252 titel = "Verfügbare Sicherheitsanforderungen" 2253 2254 ComboBox__Titel = "Typ der Sicherheitsanforderung:" 2255 ComboBox__Zweck = """Verfügbare Sicherheitsanforderungen anhand des Typs einschränken.""" 2256 2257 CheckBox__Text = "Alle im Projekt:" 2258 CheckBox__Zweck = "Es wird die projektübergreifende Einschränkung auf das aktuelle Gefahrenszenario aufgehoben und alle im Projekt verfügbaren Sicherheitsanforderungen angezeigt." 2259 2260 ListBox__Titel = "SiAnf-Id" 2261 ListBox__Zweck = "Eineindeutige Identifikationsnummer der verfügbaren Sicherheitsanforderungen zum Gefahrenszenario." 2262 ListBox__ToolTip = "Doppelklick:\nSicherheitsanforderung(en) der aktuell gewählten Sicherheitsanforderung bzw. dem aktuellen Gefahrenszenario zuordnen.\n\nMittlere Maustaste:\nSicherheitsanforderung (org. Maßnahme) dem aktuellen Gefahrenszenario zuordnen." 2263 ListBoxSync__Titel = "Verfügbare Sicherheitsanforderungen / Interne Notizen" 2264 ListBoxSync__ZweckLi = "Verfügbare Sicherheitsanforderung." 2265 ListBoxSync__ZweckRe = "Interne Notizen, Gedanken, Ideen zur Sicherheitsanforderung." 2266 2267 # 2268 # -- Zugeordnete Strukturpunkte / Dokumente ---------------------------------- 2269 # 2270 elif( self.varId == 2 ): 2271 titel = "Zugeordnete Strukturpunkte / Dokumente" 2272 2273 ComboBox__Titel = "Nicht verwendet" 2274 ComboBox__Zweck = "Nicht verwendet" 2275 2276 CheckBox__Text = "Nicht verwendet" 2277 CheckBox__Zweck = "Nicht verwendet" 2278 2279 ListBox__Titel = "Zugeordnete Strukturpunkte / Dokumente" 2280 ListBox__Zweck = "Eineindeutige Identifikationsnummer der zugeordneten Strukturpunkte/Dokumente." 2281 ListBox__ToolTip = "" 2282 2283 ListBoxSync__Titel = "Zugeordnete Strukturpunkte, Dokumente \t / \t Interne Notizen" 2284 ListBoxSync__ZweckLi = "Zugeordnete Strukturpunkte, Dokumente." 2285 ListBoxSync__ZweckRe = "Interne Notizen, Gedanken, Ideen zu den Sicherheitsanforderungen / Dokumenten." 2286 2287 # 2288 # -- Verfügbare Strukturpunkte ------------------------------------------ 2289 # 2290 elif( self.varId == 3 ): 2291 titel = "Verfügbare Strukturpunkte" 2292 2293 ComboBox__Titel = "Strukturbezeichnung:" 2294 ComboBox__Zweck = """Verfügbare Strukturpunkte anhand der Bezeichnung einschränken.""" 2295 2296 CheckBox__Text = "Alle im Projekt:" 2297 CheckBox__Zweck = "Es wird die projektübergreifende Einschränkung auf das aktuelle Gefahrenszenario aufgehoben und alle im Projekt verfügbaren Strukturpunkte angezeigt." 2298 2299 ListBox__Titel = "StrNr/Id" 2300 ListBox__Zweck = "Eineindeutige Identifikationsnummer der verfügbaren Strukturpunkte zum Gefahrenszenario." 2301 ListBox__ToolTip = "Doppelklick:\nStrukturpunkt der gewählten Sicherheitsanforderung zuordnen." 2302 ListBoxSync__Titel = "Verfügbare Strukturpunkte / Interne Notizen" 2303 ListBoxSync__ZweckLi = "Verfügbare Strukturpunkte." 2304 ListBoxSync__ZweckRe = "Interne Notizen, Gedanken, Ideen zu den Strukturpunkten." 2305 2306 # 2307 # -- Verfügbare Dokumente ------------------------------------------ 2308 # 2309 elif( self.varId == 4 ): 2310 titel = "Verfügbare Dokumente" 2311 2312 ComboBox__Titel = "Ersteller (Firma):" 2313 ComboBox__Zweck = """Verfügbare Dokumente anhand der Bezeichnung einschränken.""" 2314 2315 CheckBox__Text = "Alle im Projekt:" 2316 CheckBox__Zweck = "Es wird die projektübergreifende Einschränkung auf das aktuelle Gefahrenszenario aufgehoben und alle im Projekt verfügbaren Dokumente angezeigt." 2317 2318 ListBox__Titel = "Dok-Id" 2319 ListBox__Zweck = "Eineindeutige Identifikationsnummer der verfügbaren Dokumente zum Gefahrenszenario." 2320 ListBox__ToolTip = "Doppelklick:\nDokument der gewählten Sicherheitsanforderung zuordnen." 2321 ListBoxSync__Titel = "DokNr, Ausgabe, Titel / Interne Notizen" 2322 ListBoxSync__ZweckLi = "Verfügbare Dokumente." 2323 ListBoxSync__ZweckRe = "Interne Notizen, Gedanken, Ideen zu den Dokumenten." 2324 2325 2326 2327 # 2328 # -------------------------------------------------------------------------------- 2329 # -- Randbedingungen übernehmen ------------------------------------------ 2330 # -------------------------------------------------------------------------------- 2331 # 2332 self.Statusleiste = Statusleiste 2333 self.dbVerbindung = dbVerbindung 2334 self.prjProjekteId = prjProjekteId 2335 self.sprSprachenId = sprSprachenId 2336 self.psGefszenarioId = psGefszenarioId 2337 2338 2339 2340 2341 # 2342 # -------------------------------------------------------------------------------- 2343 # -- Eingabeobjekte anlegen -------------------------------------------------- 2344 # -------------------------------------------------------------------------------- 2345 # 2346 if( self.varId == 1 or self.varId == 3 or self.varId == 4 ): 2347 2348 # 2349 # -- Alle Sicherheitsanforderungen / Strukturpunkte / Dokumente -- 2350 # -- im Projekt zeigen -- 2351 # -- Objekt-Id = - -------------------------- 2352 # 2353 self.CheckBox__Alle = FlexGridSizerWxObjTitel( parent = self 2354 , wxObj = CheckBoxErg( self 2355 , Statusleiste = self.Statusleiste 2356 , dbVerbindung = self.dbVerbindung ) 2357 , titel = CheckBox__Text 2358 , orient = wx.VERTICAL ) 2359 2360 # self.CheckBox__Alle.wxObjekt.SetMinSize( ( 500, -1 ) ) 2361 2362 self.CheckBox__Alle.wxObjekt.statusLeisteDBSpNameErlaeuterung = CheckBox__Zweck 2363 2364 self.Bind( wx.EVT_CHECKBOX 2365 , self.__ereignisLiesDBVerfSiAnf__ 2366 , self.CheckBox__Alle.wxObjekt ) 2367 2368 self.Bind( wx.EVT_CHECKBOX 2369 , self.__ereignisLiesDBVerfStrkt__ 2370 , self.CheckBox__Alle.wxObjekt ) 2371 2372 self.Bind( wx.EVT_CHECKBOX 2373 , self.__ereignisLiesDBVerfDok__ 2374 , self.CheckBox__Alle.wxObjekt ) 2375 2376 2377 2378 # 2379 # -- Sicherheitsanforderungen / Strukturpunkte / Dokumente einschränken -- 2380 # -- Objekt-Id = - -- 2381 # 2382 self.ComboBox__Selektion = FlexGridSizerWxObjTitel( parent = self 2383 , wxObj = ComboBoxErg( self 2384 , choices = [] 2385 , style = wx.CB_DROPDOWN|wx.CB_READONLY 2386 , Statusleiste = self.Statusleiste 2387 , dbVerbindung = self.dbVerbindung ) 2388 , orient = wx.VERTICAL 2389 , titel = ComboBox__Titel ) 2390 2391 self.ComboBox__Selektion.wxObjekt.SetMaxSize( ( 400, -1 ) ) 2392 2393 self.ComboBox__Selektion.wxObjekt.statusLeisteDBSpNameErlaeuterung = ComboBox__Zweck 2394 2395 self.Bind( wx.EVT_COMBOBOX 2396 , self.__ereignisLiesDBVerfSiAnf__ 2397 , self.ComboBox__Selektion.wxObjekt ) 2398 2399 self.Bind( wx.EVT_COMBOBOX 2400 , self.__ereignisLiesDBVerfStrkt__ 2401 , self.ComboBox__Selektion.wxObjekt ) 2402 2403 self.Bind( wx.EVT_COMBOBOX 2404 , self.__ereignisLiesDBVerfDok__ 2405 , self.ComboBox__Selektion.wxObjekt ) 2406 2407 2408 2409 # 2410 # -- ---------------------------------- 2411 # -- Ab hier für alle Varianten gültig ---------------------------------- 2412 # -- ---------------------------------- 2413 # 2414 2415 # 2416 # -- Sicherheitsanforderungen / Strukturpunkte / Dokumente - Id ---------- 2417 # -- Objekt-Id = - ---------- 2418 # 2419 self.TreeCtrlErg__Id = FlexGridSizerWxObjTitel( parent = self 2420 , wxObj = TreeCtrlErg( self 2421 , Statusleiste = self.Statusleiste 2422 , dbVerbindung = self.dbVerbindung ) 2423 , titel = ListBox__Titel 2424 , orient = wx.VERTICAL ) 2425 2426 # self.TreeCtrlErg__Id.wxObjekt.SetMaxSize( ( 100, -1 ) ) 2427 2428 self.TreeCtrlErg__Id.wxObjekt.statusLeisteDBSpNameErlaeuterung = ListBox__Zweck 2429 2430 self.TreeCtrlErg__Id.wxObjekt.SetToolTip( wx.ToolTip( ListBox__ToolTip ) ) 2431 2432 self.TreeCtrlErg__Id.wxObjekt.SetBackgroundColour( wx.NamedColour( farbeAuswahlListe ) ) 2433 2434 2435 2436 2437 # 2438 # -------------------------------------------------------------------------------- 2439 # -- Layout setzen ---------------------------------------------------------- 2440 # -------------------------------------------------------------------------------- 2441 # 2442 2443 # 2444 # -- Varianten 1, 3, 4 -------------------------------------------------- 2445 # 2446 if( self.varId == 1 or self.varId == 3 or self.varId == 4 ): 2447 2448 FlexGridSizerH = wx.FlexGridSizer( rows = 1, cols = 2, vgap = 0, hgap = 10 ) 2449 2450 FlexGridSizerH.AddGrowableCol( idx = 0, proportion = 0 ) 2451 FlexGridSizerH.AddGrowableCol( idx = 1, proportion = 0 ) 2452 FlexGridSizerH.AddGrowableRow( idx = 0, proportion = 1 ) 2453 2454 FlexGridSizerH.Add( self.CheckBox__Alle 2455 , flag = wx.EXPAND ) 2456 2457 FlexGridSizerH.Add( self.ComboBox__Selektion 2458 , flag = wx.EXPAND ) 2459 2460 2461 FlexGridSizer = wx.FlexGridSizer( rows = 4, cols = 1, vgap = 10, hgap = 0 ) 2462 2463 FlexGridSizer.AddGrowableCol( idx = 0, proportion = 1 ) 2464 FlexGridSizer.AddGrowableRow( idx = 2, proportion = 0 ) 2465 FlexGridSizer.AddGrowableRow( idx = 3, proportion = 0 ) 2466 2467 tmp = wx.StaticText( parent = self, label = titel ) 2468 FlexGridSizer.Add( tmp 2469 , flag = wx.LEFT|wx.TOP|wx.RIGHT|wx.EXPAND 2470 , border = 10 ) 2471 2472 FlexGridSizer.Add( FlexGridSizerH 2473 , flag = wx.LEFT|wx.RIGHT|wx.EXPAND 2474 , border = 10 ) 2475 2476 FlexGridSizer.Add( self.TreeCtrlErg__Id 2477 , flag = wx.LEFT|wx.BOTTOM|wx.RIGHT|wx.EXPAND 2478 , border = 10 ) 2479 2480 self.SetSizerAndFit( FlexGridSizer ) 2481 2482 # 2483 # -- Varianten 1, 3, 4 -------------------------------------------------- 2484 # 2485 elif( self.varId == 2 ): 2486 2487 FlexGridSizer = wx.FlexGridSizer( rows = 1, cols = 1, vgap = 0, hgap = 0 ) 2488 2489 FlexGridSizer.AddGrowableCol( idx = 0, proportion = 1 ) 2490 FlexGridSizer.AddGrowableRow( idx = 0, proportion = 1 ) 2491 2492 FlexGridSizer.Add( self.TreeCtrlErg__Id 2493 , flag = wx.EXPAND ) 2494 2495 self.SetSizerAndFit( FlexGridSizer ) 2496 2497 2498 2499 # 2500 # -- Verfügbaren Typ der Sicherheitsanforderung auslesen ------------------ 2501 # 2502 if( self.varId == 1 ): 2503 self.dbVerbindung.init_prtTyp( self.ComboBox__Selektion.wxObjekt 2504 , self.sprSprachenId 2505 , "SF" 2506 , hatAlle = True ) 2507 self.__ereignisLiesDBVerfSiAnf__() 2508 2509 2510 # 2511 # -- Strukturen auslesen ------------------------------------------ 2512 # -- Verfügbare Strukturen auslesen ------------------------------------------ 2513 # 2514 if( self.varId == 3 ): 2515 self.dbVerbindung.init_strName( self.ComboBox__Selektion.wxObjekt ) 2516 self.__ereignisLiesDBVerfStrkt__() 2517 2518 2519 # 2520 # -- Firmen auslesen ------------------------------------------ 2521 # -- Verfügbare Dokumente auslesen ------------------------------------------ 2522 # 2523 if( self.varId == 4 ): 2524 self.dbVerbindung.init_internFirma( self.ComboBox__Selektion.wxObjekt ) 2525 self.__ereignisLiesDBVerfDok__()
2526 2527 2528 2529 2530 # 2531 # ------------------------------------------------------------------------------------ 2532 # -- Datenbank auslesen 'Verfügbare Dokumente' -------------------------- 2533 # ------------------------------------------------------------------------------------ 2534 #
2535 - def __ereignisLiesDBVerfDok__( self, ereignis = None ):
2536 """ 2537 Methode die aufgerufen wird, wenn nach Änderung des Zustandes der C{wx.CheckBox} 'Alle' bzw. der C{wx.ComboBox} 'Firma' die Datenbank ausgelesen werden muß. 2538 2539 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 2540 @type ereignis: C{wx - Ereignisobjekt} 2541 """ 2542 2543 2544 # 2545 # -- Routine verlassen, wenn Karteikarte 'Dokumente' nicht aktiv ist ---------- 2546 # 2547 if( self.varId != 4 ) : 2548 2549 # 2550 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2551 # -- ausgewertet werden kann -------------------------- 2552 # 2553 if( ereignis != None ) : ereignis.Skip( skip = True ) 2554 2555 return 2556 2557 2558 # 2559 # -- Gefahrenszenario berücksichtigen ? ---------------------------------- 2560 # 2561 gefszenario = None 2562 if( self.CheckBox__Alle.wxObjekt.gibWert() == False ) : 2563 gefszenario = self.psGefszenarioId 2564 2565 2566 # 2567 # -- Firma berücksichtigen ? ------------------------------------------ 2568 # 2569 firma = None 2570 if( self.ComboBox__Selektion.wxObjekt.gibClientData() > 0 ) : 2571 firma = self.ComboBox__Selektion.wxObjekt.gibClientData() 2572 2573 2574 # 2575 # -- Verfügbare Dokumente auslesen ------------------ 2576 # -- Die Dokumente werden projektübergreifend ausgelesen ------------------ 2577 # 2578 self.dbVerbindung.selektiere__prjPrtDoku( 2579 SiAnfStrktDok = self 2580 , prjProjekteId = None 2581 , sprSprachenId = self.sprSprachenId 2582 , prtProtokollId = None 2583 , psGefszenarioId = gefszenario 2584 , internFirmaId = firma ) 2585 2586 2587 # 2588 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2589 # -- ausgewertet werden kann -------------------------- 2590 # 2591 if( ereignis != None ) : ereignis.Skip( skip = True )
2592 2593 2594 2595 2596 # 2597 # ------------------------------------------------------------------------------------ 2598 # -- Datenbank auslesen 'Verfügbare Sicherheitsanforderungen' ---------- 2599 # ------------------------------------------------------------------------------------ 2600 #
2601 - def __ereignisLiesDBVerfSiAnf__( self, ereignis = None ):
2602 """ 2603 Methode die aufgerufen wird, wenn nach Änderung des Zustandes der C{wx.CheckBox} 'Alle' bzw. der C{wx.ComboBox} 'Typ der Sicherheitsanforderung' die Datenbank ausgelesen werden muß. 2604 2605 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 2606 @type ereignis: C{wx - Ereignisobjekt} 2607 """ 2608 2609 2610 # 2611 # -- Routine verlassen, wenn Karteikarte 'Sicherheitsanforderungen' ---------- 2612 # -- nicht aktiv ist ---------- 2613 # 2614 if( self.varId != 1 ) : 2615 2616 # 2617 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2618 # -- ausgewertet werden kann -------------------------- 2619 # 2620 if( ereignis != None ) : ereignis.Skip( skip = True ) 2621 2622 return 2623 2624 2625 # 2626 # -- Auf Gefahrenszenario einschränken ? ---------------------------------- 2627 # 2628 gefszenario = None 2629 projekt = self.prjProjekteId 2630 if( self.CheckBox__Alle.wxObjekt.gibWert() == False ) : 2631 gefszenario = self.psGefszenarioId 2632 projekt = None 2633 2634 2635 # 2636 # -- Auf Typ der Sicherheitsanforderung einschränken ? ------------------ 2637 # 2638 prtTyp = None 2639 if( self.ComboBox__Selektion.wxObjekt.gibClientData() > 0 ) : 2640 prtTyp = self.ComboBox__Selektion.wxObjekt.gibClientData() 2641 2642 2643 # 2644 # -- Verfügbare Sicherheitssnforderungen auslesen -------------------------- 2645 # 2646 self.dbVerbindung.selektiere__psPrtProtokoll( 2647 TreeCtrlErg = self.TreeCtrlErg__Id.wxObjekt 2648 , prjProjekteId = projekt 2649 , sprSprachenId = self.sprSprachenId 2650 , psGefszenarioId = gefszenario 2651 , prtTypId = prtTyp ) 2652 2653 2654 # 2655 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2656 # -- ausgewertet werden kann -------------------------- 2657 # 2658 if( ereignis != None ) : ereignis.Skip( skip = True )
2659 2660 2661 2662 2663 # 2664 # ------------------------------------------------------------------------------------ 2665 # -- Datenbank auslesen 'Verfügbare Strukturen' -------------------------- 2666 # ------------------------------------------------------------------------------------ 2667 #
2668 - def __ereignisLiesDBVerfStrkt__( self, ereignis = None ):
2669 """ 2670 Methode die aufgerufen wird, wenn nach Änderung des Zustandes der C{wx.CheckBox} 'Alle' bzw. der C{wx.ComboBox} 'Strukturen' die Datenbank ausgelesen werden muß. 2671 2672 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 2673 @type ereignis: C{wx - Ereignisobjekt} 2674 """ 2675 2676 2677 # 2678 # -- Routine verlassen, wenn Karteikarte 'Strukturen' nicht aktiv ist ---------- 2679 # 2680 if( self.varId != 3 ) : 2681 2682 # 2683 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2684 # -- ausgewertet werden kann -------------------------- 2685 # 2686 if( ereignis != None ) : ereignis.Skip( skip = True ) 2687 2688 return 2689 2690 2691 # 2692 # -- Auf Gefahrenszenario einschränken ? ---------------------------------- 2693 # 2694 gefszenario = None 2695 if( self.CheckBox__Alle.wxObjekt.gibWert() == False ) : 2696 gefszenario = self.psGefszenarioId 2697 2698 2699 # 2700 # -- Auf Strukturbezeichnung einschränken ? ---------------------------------- 2701 # 2702 strName = None 2703 if( self.ComboBox__Selektion.wxObjekt.gibClientData() > 0 ) : 2704 strName = self.ComboBox__Selektion.wxObjekt.gibClientData() 2705 2706 2707 # 2708 # -- Verfügbare Strukturpunkte auslesen ------------------ 2709 # 2710 self.dbVerbindung.selektiere__psPrtStrkt( 2711 SiAnfStrktDok = self 2712 , prjProjekteId = self.prjProjekteId 2713 , sprSprachenId = self.sprSprachenId 2714 , prtProtokollId = None 2715 , psGefszenarioId = gefszenario 2716 , strNameId = strName ) 2717 2718 2719 # 2720 # -- Das Ereignis weiterreichen, damit es weiter -------------------------- 2721 # -- ausgewertet werden kann -------------------------- 2722 # 2723 if( ereignis != None ) : ereignis.Skip( skip = True )
2724 2725 2726 2727 2728 # 2729 # ------------------------------------------------------------------------------------ 2730 # -- Identifikationsnummer der Strukturelemente bilden ------------------ 2731 # ------------------------------------------------------------------------------------ 2732 #
2733 - def gibId( self, wertId, istStrName = False ):
2734 """ 2735 Diese Methode bildet die gültige Identifikationsnummer der Strukturelemente 2736 2737 @param wertId: Eineindeutige Identifikationsnummer des Wertes 2738 @type wertId: Ganzzahl 2739 2740 @param istStrName: Wenn C{wertId} die Konstante für Strukturnamen hinzugefügt werden soll, ist C{True} anzugeben. Wird C{False} angegeben, wird die Konstante für Strukturpunkte hinzugefügt. 2741 @type istStrName: Boolean 2742 2743 """ 2744 2745 # 2746 # -- Konstante für Strukturnamen ------------------------------------------ 2747 # 2748 if( istStrName ) : 2749 return ( wertId + 10000 ) 2750 2751 # 2752 # -- Konstante für Strukturpunkt ------------------------------------------ 2753 # 2754 else : 2755 return ( wertId + 10100 )
2756 2757 2758 2759 2760 # 2761 # ------------------------------------------------------------------------------------ 2762 # -- aktuell gewähltes TreeCtrl-Element ist ein Strukturpunkt ---------- 2763 # ------------------------------------------------------------------------------------ 2764 #
2765 - def istStrPkt( self, ereignis ):
2766 """ 2767 Diese Methode klassifiziert den aktuell gewählten Eintrag des C{TreeCtrl}. Es wird zwischen Strukturpunkten, Dokumenten und den Hauptknoten unterschieden. 2768 2769 @param ereignis: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. 2770 @type ereignis: C{wx - Ereignisobjekt} 2771 2772 @return: Es wird C{True} zurückgegeben, wenn der aktuell gewählte Eintrag ein Strukturpunkt ist. Es wird C{False} zurückgegeben, wenn der aktuell gewählte Eintrag ein Dokument ist. Es wird C{None} zurückgegeben, wenn der aktuell gewählte Eintrag ein Hauptknoten (C{Dok, Strukturbezeichnung}) ist. 2773 @rtype: Boolean 2774 2775 """ 2776 2777 # 2778 # -- Es liegt ein Hauptknoten vor ------------------------------------------ 2779 # 2780 if( ereignis.GetEventObject().GetPyData( ereignis.GetItem() )[1] is None ) : 2781 return None 2782 2783 2784 # 2785 # -- Strukturpunkt / Dokument unterscheiden (siehe >gibId(...)<) ---------- 2786 # 2787 return( ereignis.GetEventObject().GetPyData( ereignis.GetItem() )[0] >= 10100 )
2788 2789 2790 2791 2792 2793 # 2794 # ---------------------------------------------------------------------------------------- 2795 # ---------------------------------------------------------------------------------------- 2796 # -- ------------------------------------------ 2797 # -- wx.TextCtrl mit einigen Ergänzungen ------------------------------------------ 2798 # -- ------------------------------------------ 2799 # ---------------------------------------------------------------------------------------- 2800 # ---------------------------------------------------------------------------------------- 2801 #
2802 -class TextCtrlAuswStatisch( wx.TextCtrl, __Ergaenzung__ ):
2803 """ 2804 Klasse, die einem C{wx.TextCtrl} eine Auswahlliste zuordnet, aus der die anzuzeigenden Wert entnommen werden. 2805 """ 2806 2807 # 2808 # ------------------------------------------------------------------------------------ 2809 # -- Initialisierungen -------------------------------------------------- 2810 # ------------------------------------------------------------------------------------ 2811 #
2812 - def __init__( self, parent, size, Statusleiste, dbVerbindung ):
2813 wx.TextCtrl.__init__( self, parent = parent, size = size, style = wx.TE_READONLY ) 2814 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 2815 2816 2817 # 2818 # -- Hintergrundfarbe auf 'Nicht bearbeitbar' setzen -------------------------- 2819 # 2820 self.SetBackgroundColour( self.GetParent().GetBackgroundColour() ) 2821 2822 2823 # 2824 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 2825 # 2826 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 2827 2828 2829 # 2830 # -- die Auswahlliste -------------------------------------------------- 2831 # 2832 self.__Auswahlliste__ = [] 2833 2834 2835 # 2836 # -- Lfd. Nr. des aktuell gewählten Wertes ---------------------------------- 2837 # 2838 self.__aktLfdNr__ = 0 2839 2840 2841 # 2842 # -- Ereignisse behandeln -------------------------------------------------- 2843 # 2844 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 2845 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ ) 2846 2847 self.Bind( wx.EVT_CONTEXT_MENU, self.__ereignisKMenueNicht__ )
2848 2849 2850 2851 # 2852 # ------------------------------------------------------------------------------------ 2853 # -- Anzahl der Einträge der Auswahlliste angeben -------------------------- 2854 # ------------------------------------------------------------------------------------ 2855 #
2856 - def gibAnzahl( self ):
2857 """ 2858 Mit Aufruf dieser Methode wird die Gesamtzahl der Einträge der Auswahlliste des C{wx.TextCtrl} zurückgegeben. 2859 2860 @return: Es wird die Gesamtzahl der Einträge der Auswahlliste zurückgegeben. 2861 @rtype: Ganzzahl 2862 """ 2863 2864 # 2865 # -- Anzahl ermitteln -------------------------------------------------- 2866 # 2867 return len( self.__Auswahlliste__ )
2868 2869 2870 # 2871 # ------------------------------------------------------------------------------------ 2872 # -- ClientData des Eintrages mit der lfdNr zurückgegeben ------------------ 2873 # ------------------------------------------------------------------------------------ 2874 #
2875 - def gibClientData( self, lfdNr = None, gibAktWert = True ):
2876 """ 2877 Mit Aufruf dieser Methode wird C{ClientData} des Eintrages mit der C{lfdNr} zurückgegeben. Wenn C{lfdNr == None UND gibAktWert == True} wird C{ClientData} des aktuellen Wertes zurückgegebene. Wenn C{lfdNr == None UND gibAktWert == False} wird C{ClientData} zu allen Einträgen zurückgegeben. 2878 2879 @param gibAktWert : Wird C{True} angegeben (UND C{lfdNr == None}) wird der aktuelle Wert zurückgegeben. Wird C{False} angegeben (UND C{lfdNr == None}) 2880 @type gibAktWert : 2881 2882 @param lfdNr: Es ist die lfd. Nummer des Eintrages anzugeben, dessen C{wx.ClientData} zurückgegeben werden soll. 2883 @type lfdNr: Ganzzahl 2884 2885 @return: C{wx.ClientData} zur C{lfdNr} 2886 @rtype: Listenobjekt 2887 """ 2888 2889 # 2890 # -- keine Einträge vorhanden ------------------------------------------ 2891 # 2892 if( len( self.__Auswahlliste__ ) == 0 ) : return None 2893 2894 2895 # 2896 # -- clientData zurückgeben -------------------------------------------------- 2897 # 2898 if( lfdNr == None ) : 2899 if( gibAktWert ) : return self.clientData[self.__aktLfdNr__] 2900 else : return self.clientData 2901 else : 2902 return self.clientData[lfdNr]
2903 2904 2905 2906 # 2907 # ------------------------------------------------------------------------------------ 2908 # -- aktuellen Wert zurückgeben ------------------------------------------ 2909 # ------------------------------------------------------------------------------------ 2910 #
2911 - def gibWert( self ):
2912 """ 2913 Mit Aufruf dieser Methode wird der Wert der C{TextCtrl} zurückgegeben. 2914 """ 2915 2916 # 2917 # -- aktuellen Wert zurückgeben ------------------------------------------ 2918 # 2919 return self.GetValue()
2920 2921 2922 2923 # 2924 # ------------------------------------------------------------------------------------ 2925 # -- Alle Einträge löschen -------------------------------------------------- 2926 # ------------------------------------------------------------------------------------ 2927 #
2928 - def loescheAlles( self ):
2929 """ 2930 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. 2931 """ 2932 2933 2934 # 2935 # -- Alle Einträge löschen -------------------------------------------------- 2936 # 2937 self.istVomBenutzerGeaendert = False 2938 self.istBenutzerAenderungJetzt = False 2939 self.__Auswahlliste__ = [] 2940 self.__aktLfdNr__ = 0 2941 del self.wertNichtMod[:] 2942 self.ChangeValue( "" )
2943 2944 2945 2946 # 2947 # ------------------------------------------------------------------------------------ 2948 # -- aktuellen Wert übernehmen ------------------------------------------ 2949 # ------------------------------------------------------------------------------------ 2950 #
2951 - def nimmWert( self, wert, clientData = None ):
2952 """ 2953 Mit Aufruf dieser Methode werden die Werte der C{wx.TextCtrl} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 2954 2955 @param wert: Es ist ein Wert der Auswahlliste des C{wx.TextCtrl} anzugeben. 2956 @type wert: Zeichenkette 2957 2958 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 2959 @type clientData: beliebiges Objekt 2960 """ 2961 2962 # 2963 # -- aktuellen Wert übernehmen ------------------------------------------ 2964 # 2965 self.wertNichtMod.append( wert ) 2966 self.__Auswahlliste__.append( wert ) 2967 self.clientData.append( clientData ) 2968 2969 2970 # 2971 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 2972 # 2973 self.istVomBenutzerGeaendert = False 2974 self.istBenutzerAenderungJetzt = False
2975 2976 2977 2978 # 2979 # ------------------------------------------------------------------------------------ 2980 # -- ClientData des Eintrages mit der lfdNr zurückgegeben ------------------ 2981 # ------------------------------------------------------------------------------------ 2982 #
2983 - def setzeWert( self, lfdNr ):
2984 """ 2985 Mit Aufruf dieser Methode wird der Wert des Eintrages mit der C{lfdNr} ausgewählt. 2986 2987 @param lfdNr: Es ist die lfd. Nummer des Eintrages anzugeben, dessen Wert ausgewählt werden soll. 2988 @type lfdNr: Ganzzahl 2989 """ 2990 2991 # 2992 # -- Wert setzen -------------------------------------------------- 2993 # 2994 self.__aktLfdNr__ = lfdNr 2995 self.ChangeValue( self.__Auswahlliste__[lfdNr] )
2996 2997 2998 2999 # 3000 # 3001 # 3002 # ---------------------------------------------------------------------------------------- 3003 # ---------------------------------------------------------------------------------------- 3004 # -- ------------------------------------------ 3005 # -- wx.TextCtrl mit einigen Ergänzungen ------------------------------------------ 3006 # -- ------------------------------------------ 3007 # ---------------------------------------------------------------------------------------- 3008 # ---------------------------------------------------------------------------------------- 3009 #
3010 -class TextCtrlErg( wx.TextCtrl, __TextFunktionen__ ):
3011 """ 3012 Klasse, die eine C{wx.TextCtrl} mit weiteren Funktionen versieht. 3013 """ 3014 3015 # 3016 # ------------------------------------------------------------------------------------ 3017 # -- Initialisierungen -------------------------------------------------- 3018 # ------------------------------------------------------------------------------------ 3019 #
3020 - def __init__( self, parent, size, style, Statusleiste, dbVerbindung ):
3021 wx.TextCtrl.__init__( self, parent = parent, size = size, style = style ) 3022 __TextFunktionen__.__init__( self, Statusleiste = Statusleiste ) 3023 3024 3025 # 3026 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 3027 # 3028 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 3029 3030 3031 # 3032 # -- Ereignisse behandeln -------------------------------------------------- 3033 # 3034 self.Bind( wx.EVT_TEXT, self.__ereignisAenderung__, self ) 3035 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 3036 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ ) 3037 self.Bind( wx.EVT_LEAVE_WINDOW, self.__frageRechtschreibfehlerkorrekur__ )
3038 3039 3040 # 3041 # ------------------------------------------------------------------------------------ 3042 # -- ClientData zurückgegeben ------------------------------------------ 3043 # ------------------------------------------------------------------------------------ 3044 #
3045 - def gibClientData( self ):
3046 """ 3047 Mit Aufruf dieser Methode wird C{self.clientData} zurückgegeben. 3048 3049 @return: self.clientData 3050 @rtype: Listenobjekt 3051 """ 3052 3053 return self.clientData
3054 3055 3056 3057 # 3058 # ------------------------------------------------------------------------------------ 3059 # -- aktuellen Wert zurückgeben ------------------------------------------ 3060 # ------------------------------------------------------------------------------------ 3061 #
3062 - def gibWert( self ):
3063 """ 3064 Mit Aufruf dieser Methode wird der Wert des C{TextCtrl} zurückgegeben. 3065 """ 3066 3067 # 3068 # -- aktuellen Wert übernehmen ------------------------------------------ 3069 # 3070 return self.GetValue()
3071 3072 3073 3074 # 3075 # ------------------------------------------------------------------------------------ 3076 # -- Alle Einträge löschen -------------------------------------------------- 3077 # ------------------------------------------------------------------------------------ 3078 #
3079 - def loescheAlles( self ):
3080 """ 3081 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. 3082 """ 3083 3084 3085 # 3086 # -- Alle Einträge löschen -------------------------------------------------- 3087 # 3088 self.istVomBenutzerGeaendert = False 3089 self.istBenutzerAenderungJetzt = False 3090 del self.wertNichtMod[:] 3091 self.ChangeValue( "" ) # kein wx.EVENT erzeugen !
3092 3093 3094 3095 3096 # 3097 # ------------------------------------------------------------------------------------ 3098 # -- aktuellen Wert übernehmen ------------------------------------------ 3099 # ------------------------------------------------------------------------------------ 3100 #
3101 - def nimmWert( self, wert, clientData = None ):
3102 """ 3103 Mit Aufruf dieser Methode wird der Wert der C{wx.TextCtrl} übernommen. Mittels C{ClientData[0 ... n]} können Zusatzinformationen übergeben werden 3104 3105 @param wert: Es ist der Wert der C{wx.TextCtrl} anzugeben. 3106 @type wert: Zeichenkette 3107 3108 @param clientData: Mittels C{clientData[0...n]} werden weitere Zusatzinformationen übergeben. 3109 @type clientData: beliebiges Objekt 3110 """ 3111 3112 # 3113 # -- Alles löschen ---------------------------------------------------------- 3114 # 3115 self.loescheAlles() 3116 3117 # 3118 # -- aktuellen Wert übernehmen ------------------------------------------ 3119 # 3120 self.wertNichtMod.insert( 0, wert ) 3121 self.ChangeValue( wert ) # kein wx.EVENT erzeugen ! 3122 self.clientData = clientData 3123 3124 3125 # 3126 # -- Der Wert wurde vom Benutzer nicht verändert -------------------------- 3127 # 3128 self.istVomBenutzerGeaendert = False 3129 self.istBenutzerAenderungJetzt = False
3130 3131 3132 3133 3134 # 3135 # 3136 # 3137 # ---------------------------------------------------------------------------------------- 3138 # ---------------------------------------------------------------------------------------- 3139 # -- ---------------------------------- 3140 # -- >TextCtrl< im >SplitterWindow< mit Titel ---------------------------------- 3141 # -- ---------------------------------- 3142 # ---------------------------------------------------------------------------------------- 3143 # ---------------------------------------------------------------------------------------- 3144 #
3145 -class TextCtrlSpWTitel( wx.Panel ):
3146 """ 3147 Klasse, die zwei C{TextCtrl} in einem C{SplitterWindow} miteinander verbindet. Weiterhin wird ein Titel zugeordnet. 3148 """ 3149 3150 # 3151 # ------------------------------------------------------------------------------------ 3152 # -- Initialisierungen -------------------------------------------------- 3153 # ------------------------------------------------------------------------------------ 3154 #
3155 - def __init__( self, parent, titel, minSize, orient, Statusleiste, dbVerbindung ):
3156 wx.Panel.__init__( self, parent ) 3157 3158 3159 3160 # 3161 # -- Layout setzen ---------------------------------------------------------- 3162 # 3163 self.SplitterWindow = wx.SplitterWindow( self, -1, style = wx.SP_LIVE_UPDATE ) 3164 self.SplitterWindow.SetMinimumPaneSize( 20 ) 3165 3166 self.TextCtrl__li = TextCtrlErg( self.SplitterWindow 3167 , size = (-1, -1 ) 3168 , style = wx.TE_MULTILINE|wx.BORDER_SUNKEN 3169 , Statusleiste = Statusleiste 3170 , dbVerbindung = dbVerbindung ) 3171 3172 self.TextCtrl__re = TextCtrlErg( self.SplitterWindow 3173 , size = (-1, -1 ) 3174 , style = wx.TE_MULTILINE|wx.BORDER_SUNKEN 3175 , Statusleiste = Statusleiste 3176 , dbVerbindung = dbVerbindung ) 3177 3178 self.SplitterWindow.SplitVertically( self.TextCtrl__li 3179 , self.TextCtrl__re 3180 , -100 ) 3181 3182 self.FlexGridSizerWxObjTitel = FlexGridSizerWxObjTitel( parent = self 3183 , wxObj = self.SplitterWindow 3184 , titel = titel 3185 , orient = orient ) 3186 3187 self.FlexGridSizerWxObjTitel.wxObjekt.SetMinSize( minSize ) 3188 3189 BoxSizer = wx.BoxSizer( wx.VERTICAL ) 3190 BoxSizer.Add( self.FlexGridSizerWxObjTitel 3191 , proportion = 1 3192 , flag = wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL 3193 , border = 0 ) 3194 self.SetSizerAndFit( BoxSizer )
3195 3196 3197 3198 # 3199 # ------------------------------------------------------------------------------------ 3200 # -- Titel und wxObjekt (de)aktivieren ---------------------------------- 3201 # ------------------------------------------------------------------------------------ 3202 #
3203 - def Enable( self, enable = True ):
3204 """ 3205 Diese Methode implementiert die Standardfunktion C{Enable(...)} für diese Klasse. 3206 """ 3207 3208 # 3209 # -- Objekte (de)aktivieren -------------------------------------------------- 3210 # 3211 self.FlexGridSizerWxObjTitel.Enable( enable )
3212 3213 3214 3215 3216 # 3217 # 3218 # 3219 # ---------------------------------------------------------------------------------------- 3220 # ---------------------------------------------------------------------------------------- 3221 # -- ------------------------------------------ 3222 # -- TreeCtrl mit einigen Ergänzungen ------------------------------------------ 3223 # -- ------------------------------------------ 3224 # ---------------------------------------------------------------------------------------- 3225 # ---------------------------------------------------------------------------------------- 3226 #
3227 -class TreeCtrlErg( wx.TreeCtrl, __Ergaenzung__ ):
3228 """ 3229 Klasse, die ein C{wx.TreeCtrl} mit weiteren Funktionen versieht. 3230 """ 3231 3232 # 3233 # ------------------------------------------------------------------------------------ 3234 # -- Initialisierungen -------------------------------------------------- 3235 # ------------------------------------------------------------------------------------ 3236 #
3237 - def __init__( self, parent, Statusleiste, dbVerbindung, style = wx.BORDER_SUNKEN|wx.TR_DEFAULT_STYLE|wx.TR_HIDE_ROOT ):
3238 wx.TreeCtrl.__init__( self, parent = parent, style = style ) 3239 __Ergaenzung__.__init__( self, Statusleiste = Statusleiste ) 3240 3241 # 3242 # -- den Datenbankspaltennamen übernehmen ---------------------------------- 3243 # 3244 self.__statusLeisteDBSpName__ = dbVerbindung.gibSpaltenName( self.GetId() ) 3245 3246 3247 # 3248 # -- Die (unsichtbare) Wurzel des darzustellenden Baumes ------------------ 3249 # 3250 self.elementListe = [] 3251 self.dbIdListe = [] 3252 self.loescheBaum() 3253 3254 3255 # 3256 # -- Ereignisse behandeln -------------------------------------------------- 3257 # 3258 self.Bind( wx.EVT_TREE_SEL_CHANGED, self.__ereignisAenderung__, self ) 3259 self.Bind( wx.EVT_ENTER_WINDOW, self.__ereignisStatusleiste__ ) 3260 self.Bind( wx.EVT_LEAVE_WINDOW, self.__ereignisStatusleiste__ )
3261 3262 3263 3264 # 3265 # ------------------------------------------------------------------------------------ 3266 # -- Den Baum erzeugen -------------------------------------------------- 3267 # ------------------------------------------------------------------------------------ 3268 #
3269 - def erzeugeBaum( self ):
3270 """ 3271 Diese Methode erzeugt aus den Einträgen der Ebene 0 (auf Wurzelebene) den Baum 3272 """ 3273 3274 # 3275 # -- Es sind keine Nachfolger bzw. ---------------------------------- 3276 # -- keine Einträge auf Ebene 0 vorhanden ---------------------------------- 3277 # 3278 if len( self.elementListe ) < 1 or self.GetCount() < 1 : 3279 return 3280 3281 3282 # 3283 # -- Baum erzeugen ---------------------------------------------------------- 3284 # 3285 # -- Konzept ---------------------------------------------------------- 3286 # -- ....... 3287 # -- 3288 # -- - Alle Einträge der Ebene 0 sind im >ListCtrl< eingetragen. 3289 # -- ACHTUNG ! 3290 # -- Wenn keine Einträge der Ebene 0 vorhanden sind, ist die Liste 3291 # -- fehlerhaft (siehe oben). 3292 # -- 3293 # -- - >self.elementListe< so lange durchlaufen, bis kein Eintrag 3294 # -- mehr vorhanden ist 3295 # -- ACHTUNG ! 3296 # -- Fehlerhafte Listendefinitionen abfangen ! 3297 # -- 3298 # -- - Ein Eintrag aus >self.elementListe< wird dann in das >ListCtrl< 3299 # -- eingetragen, wenn sein Vorgänger gefunden wurde. Der Eintrag 3300 # -- wird dann aus >self.elementListe< entfernt. 3301 # 3302 i = 0 3303 aktLaenge = len( self.elementListe ) 3304 fehllauf = 0 3305 while len( self.elementListe ) > 0 : 3306 3307 # 3308 # -- alle Einträge im >TreeCtrl< anzeigen (sie werden ---------- 3309 # -- sonst nicht mittels >GetNextVisible()< gefunden) ---------- 3310 # 3311 self.ExpandAll() 3312 3313 # 3314 # -- Vorgänger zum aktuellen Eintrag im >TreeCtrl< suchen ---------- 3315 # -- >ScrollTo()< bringt die Einträge in den sichtbaren ---------- 3316 # -- Bereich (sie werden sonst nicht mittels ---------- 3317 # -- >GetNextVisible()< gefunden) ---------- 3318 # 3319 vorgaenger = self.GetRootItem() 3320 self.ScrollTo( vorgaenger ) 3321 for j in range( self.GetCount() ): 3322 3323 # 3324 # -- nächster möglicher Vorgängereintrag -------------------------- 3325 # -- (Wurzeleintrag überspringen) -------------------------- 3326 # 3327 vorgaenger = self.GetNextVisible( vorgaenger ) 3328 self.ScrollTo( vorgaenger ) 3329 3330 # 3331 # -- Vorgängereintrag gefunden: ------------------ 3332 # -- - akt. Eintrag übernehmen ------------------ 3333 # -- - akt. Eintrag aus >self.elementListe< entfernen ------------------ 3334 # 3335 if self.GetPyData( vorgaenger )[0] == self.elementListe[i][1][1] : 3336 3337 neu = self.AppendItem( vorgaenger, str( self.elementListe[i][0] ) ) 3338 self.SetPyData( neu, self.elementListe[i][1] ) 3339 self.elementListe.pop(i) 3340 break 3341 3342 3343 # 3344 # -- stets die Liste von vorn durchsuchen (Sortierfolge behalten) -- 3345 # 3346 i = 0 3347 3348 3349 # 3350 # -- Es konnte kein Vorgänger gefunden werden ------------------ 3351 # -- Baumdefinition ist fehlerhaft ------------------ 3352 # 3353 if( aktLaenge == len( self.elementListe ) 3354 and fehllauf > len( self.elementListe ) ) : 3355 3356 print "Fehlerhafte Baumdefinition ! Der aktuelle Eintrag besitzt keinen Vorgänger: ", self.elementListe[i] 3357 return 3358 3359 aktLaenge = len( self.elementListe ) 3360 fehllauf = fehllauf + 1
3361 3362 3363 # 3364 # ------------------------------------------------------------------------------------ 3365 # -- ClientData zurückgegeben ------------------------------------------ 3366 # ------------------------------------------------------------------------------------ 3367 #
3368 - def gibClientData( self, eintrag = None ):
3369 """ 3370 Mit Aufruf dieser Methode wird C{ClientData} zum aktuell gewählten Eintrages zurückgegeben. 3371 3372 @param eintrag: Es ist der Eintrag anzugeben, dessen C{ClientData} zurückgegeben werden soll. Wird C{None} angegeben, wird der aktuell ausgewählte Eintrag verwendet. 3373 @type eintrag: wx.TreeItemId 3374 3375 @return: C{wx.ClientData} 3376 @rtype: Listenobjekt 3377 """ 3378 3379 # 3380 # -- keine gültige Auswahl -------------------------------------------------- 3381 # 3382 if( not self.GetSelection().IsOk() ) : 3383 return 3384 3385 3386 # 3387 # -- clientData zurückgeben -------------------------------------------------- 3388 # 3389 if( eintrag is None ) : return self.GetPyData( self.GetSelection() )[2] 3390 3391 return self.GetPyData( eintrag )[2]
3392 3393 3394 3395 # 3396 # ------------------------------------------------------------------------------------ 3397 # -- >dbId< zurückgeben -------------------------------------------------- 3398 # ------------------------------------------------------------------------------------ 3399 #
3400 - def gibDbId( self, eintrag = None ):
3401 """ 3402 Mit Aufruf dieser Methode wird C{dbId} zum aktuell gewählten Eintrages zurückgegeben. 3403 3404 3405 @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. 3406 @type eintrag: wx.TreeItemId 3407 3408 @return: C{self.dbId} 3409 @rtype: Python-Objekt 3410 """ 3411 3412 3413 # 3414 # -- aktuellen Eintrag verwenden ------------------------------------------ 3415 # 3416 if( eintrag is None ) : 3417 3418 # 3419 # -- keine gültige Auswahl ------------------------------------------ 3420 # 3421 if( not self.GetSelection().IsOk() ) : 3422 return None 3423 3424 3425 # 3426 # -- dbId zurückgeben ------------------------------------------ 3427 # 3428 return self.GetPyData( self.GetSelection() )[3] 3429 3430 3431 3432 # 3433 # -- eintrag verwenden -------------------------------------------------- 3434 # 3435 return self.GetPyData( eintrag )[3]
3436 3437 3438 3439 # 3440 # ------------------------------------------------------------------------------------ 3441 # -- >wert< zurückgeben -------------------------------------------------- 3442 # ------------------------------------------------------------------------------------ 3443 #
3444 - def gibWert( self, eintrag = None ):
3445 """ 3446 Mit Aufruf dieser Methode wird der C{wert} zum aktuell gewählten Eintrages zurückgegeben. 3447 3448 3449 @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. 3450 @type eintrag: wx.TreeItemId 3451 3452 @return: C{self.dbId} 3453 @rtype: Python-Objekt 3454 """ 3455 3456 3457 # 3458 # -- aktuellen Eintrag verwenden ------------------------------------------ 3459 # 3460 if( eintrag is None ) : 3461 3462 # 3463 # -- keine gültige Auswahl ------------------------------------------ 3464 # 3465 if( not self.GetSelection().IsOk() ) : 3466 return None 3467 3468 3469 # 3470 # -- dbId zurückgeben ------------------------------------------ 3471 # 3472 return self.GetPyData( self.GetSelection() )[0] 3473 3474 3475 3476 # 3477 # -- eintrag verwenden -------------------------------------------------- 3478 # 3479 return self.GetPyData( eintrag )[0]
3480 3481 3482 3483 3484 # 3485 # ------------------------------------------------------------------------------------ 3486 # -- >eintrag< und eine Liste von Einträgen zurückgeben, die dem ---------- 3487 # -- aktuell gegebenen >eintrag< zugeordnet sind ---------- 3488 # ------------------------------------------------------------------------------------ 3489 #
3490 - def gibZweig( self, eintrag ):
3491 """ 3492 Mit Aufruf dieser Methode wird der Eintrag C{eintrag} einschließlich der untergeordneten Einträge (d.h. der gesamte Zweig) zurückgegeben. 3493 3494 @param eintrag: Es ist der Eintrag anzugeben, dessen untergeordneten Einträge zurückgegeben werden sollen. 3495 @type eintrag: wx.TreeItemId 3496 3497 @return: liste der C{wx.TreeItemId} 3498 @rtype: Python-Liste 3499 """ 3500 3501 # 3502 # -- Liste der Einträge -------------------------------------------------- 3503 # 3504 eintragListe = [] 3505 eintragListe.append( eintrag ) 3506 3507 3508 # 3509 # -- Es sind keine weiteren Einträge zugeordnet -------------------------- 3510 # 3511 if( not self.ItemHasChildren( eintrag ) ) : return eintragListe 3512 3513 3514 # 3515 # -- Ersten Eintrag übernehmen ------------------------------------------ 3516 # 3517 eintragListe.append( self.GetFirstChild( eintrag )[0] ) 3518 cookie = self.GetFirstChild( eintrag )[1] 3519 3520 3521 # 3522 # -- die nächsten Einträge übernehmen ---------------------------------- 3523 # 3524 item = self.GetNextChild( eintrag, cookie )[0] 3525 cookie = self.GetNextChild( eintrag, cookie )[1] 3526 3527 while( item.IsOk() ) : 3528 3529 eintragListe.append( item ) 3530 item = self.GetNextChild( eintrag, cookie )[0] 3531 cookie = self.GetNextChild( eintrag, cookie )[1] 3532 3533 3534 # 3535 # -- Einträge zurückgeben -------------------------------------------------- 3536 # 3537 return eintragListe
3538 3539 3540 3541 3542 # 3543 # ------------------------------------------------------------------------------------ 3544 # -- >dbId< ist vorhanden -------------------------------------------------- 3545 # ------------------------------------------------------------------------------------ 3546 #
3547 - def istDbIdVorhanden( self, dbId ):
3548 """ 3549 Mit Aufruf dieser Methode wird geprüft, ob C{dbId} im Baum vorhanden ist. 3550 3551 @param dbId: Es wird C{True} zurückgegeben, wenn C{dbId} vorhanden ist. 3552 @type dbId: Ganzzahl 3553 3554 @return: C{wx.ClientData} 3555 @rtype: Listenobjekt 3556 """ 3557 3558 # 3559 # -- Prüfung ausführen -------------------------------------------------- 3560 # 3561 return( dbId in self.dbIdListe )
3562 3563 3564 # 3565 # ------------------------------------------------------------------------------------ 3566 # -- Den Baum löschen -------------------------------------------------- 3567 # ------------------------------------------------------------------------------------ 3568 #
3569 - def loescheBaum( self ):
3570 """ 3571 Diese Methode löscht den gesamten Baum und fügt die Wurzel (C{self.wurzel}) ein. 3572 """ 3573 3574 # 3575 # -- Baum löschen und Wurzel einfügen ---------------------------------- 3576 # 3577 self.DeleteAllItems() 3578 self.wurzel = self.AddRoot( "Wird nicht angezeigt (style = wx.TR_HIDE_ROOT ) !" ) 3579 self.elementListe = [] 3580 self.dbIdListe = []
3581 3582 3583 # 3584 # ------------------------------------------------------------------------------------ 3585 # -- >dbId< zurückgeben -------------------------------------------------- 3586 # ------------------------------------------------------------------------------------ 3587 #
3588 - def markiereWert( self, eintrag = None ):
3589 """ 3590 Mit Aufruf dieser Methode wird der Eintrag mit der C{lfdNr} markiert. 3591 ACHTUNG ! Noch nicht vollständig implementiert ! 3592 3593 @param eintrag: Es ist der Eintrag anzugeben, der markiert werden soll. 3594 @type eintrag: wx.TreeItemId 3595 """ 3596 3597 # 3598 # -- keine Einträge vorhanden ------------------------------------------ 3599 # 3600 if( self.IsEmpty() ) : return 3601 3602 3603 # 3604 # -- lfd. Nr. ist nicht vorhanden ------------------------------------------ 3605 # 3606 # if( lfdNr not in range( 1, self.GetCount() - 1 ) ) : 3607 if( eintrag is None ) : 3608 3609 self.ExpandAll() 3610 self.SelectItem( self.GetNextVisible( self.GetRootItem() ) ) 3611 return
3612 3613 3614 # 3615 # -- lfd. Nr. markieren -------------------------------------------------- 3616 # -> später korrekt implementieren ! 3617 # 3618 # self.SelectItem( ... ) 3619 3620 3621 3622 3623 # 3624 # ------------------------------------------------------------------------------------ 3625 # -- Eintrag auf Wurzelebene hinzufügen ---------------------------------- 3626 # ------------------------------------------------------------------------------------ 3627 #
3628 - def nimmWert( self, wert, wertId, dbId, wertIdVorgaenger = None, clientData = None ):
3629 """ 3630 Diese Methode übernimmt den kompletten Wert, ohne ihn im C{TreeCtrl} darzustellen. Er muß eine eineindeutige Identifikationsnummer (C{wertId}) besitzen. 3631 3632 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 3633 3634 @param wert: Es ist die Zeichenkette anzugeben, die im Baum sichtbar ist. 3635 @type wert: Zeichenkette 3636 3637 @param wertId: Eineindeutige Identifikationsnummer des Wertes (zur internen Organisation) 3638 @type wertId: Ganzzahl 3639 3640 @param dbId: Eineindeutige Identifikationsnummer des Eintrages welche zum Beispiel in der Datenbank verwendet wird. Einträge mit derselben Identifikationsnummer dürfen mehrfach auftreten. 3641 @type dbId: Ganzzahl 3642 3643 @param wertIdVorgaenger: Eineindeutige Identifikationsnummer des Vorgängers des Wertes 3644 @type wertIdVorgaenger: Ganzzahl 3645 3646 @param clientData: Ein beliebiges C{Python-Objekt}, welches weitere Zusatzinformationen zum Wert enthält 3647 @type clientData: C{Python-Objekt} 3648 """ 3649 3650 3651 # 3652 # -- Wert in >TreeCtrl< übernehmen, wenn er auf Ebene 0 steht ---------- 3653 # -- (keinen Vorgänger hat) ---------- 3654 # 3655 if wertIdVorgaenger == None : 3656 eintr = self.AppendItem( self.wurzel, wert ) 3657 self.SetPyData( eintr, ( wertId, wertIdVorgaenger, clientData, dbId ) ) 3658 3659 # 3660 # -- alle anderen Einträge in >self.elementListe< übernehmen ------------------ 3661 # 3662 else : 3663 self.elementListe.append( ( wert, ( wertId, wertIdVorgaenger, clientData, dbId ) ) ) 3664 3665 # 3666 # -- >dbId< übernehmen, damit vorh. >dbId< schneller ------------------ 3667 # -- gefunden werden können ------------------ 3668 # 3669 self.dbIdListe.append( dbId )
3670