Mittwoch, 11. Februar 2015

Modeless (non modal) SWT Dialog


Für ein Projekt nutze ich einen SWT TitleAreaDialog. Der Nutzer kann darin die Verschlagwortung eines Dokuments vornehmen.

Standardmäßig ist der Dialog MODAL, d.h. das öffnende Anwendungsfenster kann nicht mehr bedient werden. Im konkreten Fall ist dies ungünstig, da die Möglichkeit bestehen soll, in der Dokumentansicht zu scrollen während der Dialog ausgefüllt wird.

Damit das klappt muss der Dialog das Style Bit SWT.MODELESS erhalten und darf gleichzeitig nicht die Bits SWT.APPLICATION_MODAL, SWT.SYSTEM_MODAL oder SWT.PRIMARY_MODAL haben.

Eine Erklärung zu diesen Bits gibt es hier:
http://help.eclipse.org/juno/...%2Feclipse%2Fswt%2Fwidgets%2FShell.html

Da der Dialog irgendwo in der Vererbungshierarchie eines der MODAL-Bits erhält habe ich im Konstruktor meiner Dialog Implementierung die Bits entsprechend angepasst:

 public IndexingDialog(Shell parentShell) {  
   super(parentShell);  
   setShellStyle( (getShellStyle() | SWT.RESIZE | SWT.MODELESS) & 
      (~SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL | SWT.PRIMARY_MODAL) );   
 }  


getShellStyle() liefert die aktuell gesetzten Bits. Diese werden durch den OR Operator um RESIZE und MODELESS ergänzt. RESIZE erlaubt dem Nutzer, die Größe der Dialog Shell zu verändern.

Um dann die ggf. gesetzten MODAL Bits los zu werden wird das ganze bitweise AND mit der Negation aus dem OR aller MODAL Bits verknüpft.
Der Satz ist nicht wirklich gelungen aber das Prinzip sollte klar sein ;)


Keine Kommentare:

Kommentar veröffentlichen