Come utilizzare JFace FileDialog da un plug-in Eclipse in modo non modale?
Domanda
Sto scrivendo un plugin Eclipse, e in risposta ad alcune azioni sono interessante iniziare una serie di operazioni (all'interno di un lavoro separato). Una di queste operazioni è richiedere all'utente di fornire un nome file, che sto cercando di fare con JFia JDialog.
Tuttavia, non sono chiaro come farlo in un modo non modale; per esempio, dove posso ottenere un display e una shell? Come posso garantire che l'interfaccia utente continui a funzionare mentre lo sviluppatore può modificare elementi nella finestra di dialogo?
Soluzione
Forse potresti vedere come lo fa Eclipse:
/**
* Creates a new dialog with the given shell as parent.
* @param parentShell the parent shell
*/
public FindReplaceDialog(Shell parentShell) {
super(parentShell);
fParentShell= null;
[...]
readConfiguration();
setShellStyle(SWT.CLOSE | SWT.MODELESS | SWT.BORDER | SWT.TITLE | SWT.RESIZE);
setBlockOnOpen(false);
}
/**
* Returns this dialog's parent shell.
* @return the dialog's parent shell
*/
public Shell getParentShell() {
return super.getParentShell();
}
/**
* Sets the parent shell of this dialog to be the given shell.
*
* @param shell the new parent shell
*/
public void setParentShell(Shell shell) {
if (shell != fParentShell) {
if (fParentShell != null)
fParentShell.removeShellListener(fActivationListener);
fParentShell= shell;
fParentShell.addShellListener(fActivationListener);
}
fActiveShell= shell;
}
Gestisce la shell madre in base al focus della finestra di dialogo.
/**
* Updates the find replace dialog on activation changes.
*/
class ActivationListener extends ShellAdapter {
/*
* @see ShellListener#shellActivated(ShellEvent)
*/
public void shellActivated(ShellEvent e) {
fActiveShell= (Shell)e.widget;
updateButtonState();
if (fGiveFocusToFindField && getShell() == fActiveShell &&
okToUse(fFindField))
fFindField.setFocus();
}
/*
* @see ShellListener#shellDeactivated(ShellEvent)
*/
public void shellDeactivated(ShellEvent e) {
fGiveFocusToFindField= false;
storeSettings();
[...]
fActiveShell= null;
updateButtonState();
}
}
A ShellAdapter
fornisce implementazioni predefinite per i metodi descritti da ShellListener
, che fornisce metodi che gestiscono i cambiamenti nello stato di Shell
.
Altri suggerimenti
L'importante è che il valore dello stile includa SWT.MODELESS.
Lo stile è una delle cose più importanti in SWT che dovresti prendere in considerazione, perché puoi controllare e inizializzare molto solo grazie al valore dello styel.