Caixas de diálogo para aplicações

Quando uma caixa de diálogo padrão é demasiado simples para o seu plug-in, poderá construir a sua própria caixa de diálogo com a classe Dialog. Vimos anteriormente como a ferramenta readme contribuiu com uma acção "Abrir Browser Readme" num conjunto de acções.  Este conjunto de acções é apresentado na barra de ferramentas da área de trabalho e no menu Janela->Editor do Ficheiro Readme.   

Agora estamos preparados para abordar a implementação desta acção no WindowActionDelegate da ferramenta readme.

public void run(IAction action) {
      SectionsDialog dialog = new SectionsDialog(window.getShell(),
         ReadmeModelFactory.getInstance().getSections(selection));
      dialog.open();
   }

O delegado da acção de janela relativo ao conjunto de acções utiliza a actual selecção na vista do navegador de recursos ( o ficheiro .readme) para obter uma lista de secções constantes do ficheiro readme. Esta lista e a shell da janela da área de trabalho são transmitidas ao SectionsDialog

Quando o utilizador selecciona a acção, abre-se o SectionsDialog.

O SectionsDialog é implementado no plug-in da ferramenta readme ao constituir subclasse da classe Dialog no pacote org.eclipse.jface.dialogs.

A classe Dialog faculta suporte básico para construir uma janela de shell de caixa de diálogo, criar os botões da caixa de diálogo comuns e lançar a caixa de diálogo. As subclasses são responsáveis pelo tratamento do conteúdo da própria caixa de diálogo:

SectionsDialog não implementa um método okButtonPressed, mas herda a implementação "do-nothing" da classe Dialog. Ora isto não é habitual. A caixa de diálogo geralmente realiza algum processamento em resposta ao premir de um dos seus botões.

As caixas de diálogo podem ser tão simples ou complicadas quanto necessário. Ao implementar uma caixa de diálogo, a maior parte do código da caixa de diálogo está dedicada a criar os controlos de SWT que representam a respectiva área de conteúdos e a tratar eventos necessários enquanto a caixa de diálogo estiver aberta. Quando um utilizador prime um botão, a caixa de diálogo pode consultar o estado dos diversos controlos (ou visualizadores) que a constituem a fim de determinar o que fazer.

Caixas de diálogo emergentes

Em alguns casos, poderá apresentar informações numa caixa de diálogo, mas de uma forma mais "leve" do que numa caixa de diálogo comum. Por exemplo, uma caixa de diálogo poderá destinar-se a facultar informações transientes que podem ser facilmente eliminadas, sem que seja tirado o ênfase do trabalho do utilizador. Se for este o caso, pode utilizar a classe PopupDialog para implementar a caixa de diálogo. O aspecto de uma classe PopupDialog tem várias diferenças em relação ao aspecto de uma Dialog comum. Não contém nenhum botão na parte inferior, não contém a barra de título da janela padrão e os contornos, os espaçamentos e os tipos de letra são mais pequenos e compactos.

Apesar de uma PopupDialog ter um aspecto muito diferente de uma caixa de diálogo comum, o código na subclasse do plug-in que define o conteúdo da caixa de diálogo é quase o mesmo. Também é implementado o método createDialogArea para criar os controlos SWT de uma caixa de diálogo. A principal diferença no código de aplicação é o facto de o construtor que cria a caixa de diálogo conter mais parâmetros do que o construtor de uma classe Dialog comum. Por exemplo, a SectionsDialog pode ser transformada numa PopupDialog simplesmente ao alterar a super-classe da caixa de diálogo e ao configurar a caixa de diálogo no construtor:

   public class SectionsDialog extends PopupDialog {
      protected IAdaptable input;

      /**
      * Creates a new SectionsDialog.
      */
      public SectionsDialog(Shell parentShell, IAdaptable input) {
        super(parentShell, SWT.DEFAULT, false, // do not take focus when
opened
        	false, // do not persist the bounds
        	false, // do not show a resize menu
        	false, // do not show a menu item for persisting bounds
        	null, //  no title
        	null); // no info text
        this.input = input;
      }
      ...