Fábricas de elementos

As fábricas de elementos são utilizadas para recriar objectos de modelo de área de trabalho a partir de dados que foram guardados durante o encerramento da área de trabalho.

Antes de abordarmos a extensão da fábrica de elementos, temos de rever uma técnica geral que é usada em toda a plataforma para adicionar comportamento específico de plug-in a objectos de modelo de plataforma comuns.

IAdaptables e adaptadores de área de trabalho

Ao procurar as diversas classes de área de trabalho, irá reparar que muitas das interfaces de área de trabalho estendem a interface IAdaptable.

Os plug-ins utilizam adaptadores para adicionar comportamento específico a tipos pré-existentes no sistema. Por exemplo, a área de trabalho poderá querer que os recursos respondam a uma etiqueta e imagem para fins de apresentação. Sabemos que não é boa ideia adicionar comportamento específico de UI a objectos de baixo nível, por isso como podemos adicionar este comportamento aos tipos de recursos?

Os plug-ins podem registar adaptadores que adicionam comportamento a tipos pré-existentes. O código da aplicação em seguida pode consultar um objecto relativamente a determinado adaptador. Se houver um registado para ele, a aplicação poderá obter o adaptador e utilizar os novos comportamentos definidos no adaptador.

Ao facultar uma função para consultar dinamicamente um adaptador para um objecto, podemos melhorar a flexibilidade do sistema enquanto este evolui. Podem ser registados novos adaptadores para tipos de plataforma por novos plug-ins, sem ter de alterar as definições dos tipos originais. O padrão para pedir um objecto relativamente a determinado adaptador é o seguinte:

   //perante um objecto o, queremos realizar acções de "área de trabalho" com ele.
   if (!(o instanceof IAdaptable)) {
     return null;
   }
   IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
   if (adapter == null)
     return null;
   // agora posso tratar o como IWorkbenchAdapter
   ...

Se não houver adaptador registado para o objecto em questão, será devolvido nulo (null) como adaptador. Os clientes devem estar preparados para obviar a este caso. Pode haver alturas em que um adaptador esperado não tenha sido registado.

A área de trabalho utiliza adaptadores para obter informações de UI dos tipos de plataforma base como, por exemplo, IResource. Os adaptadores escudam os tipos base de conhecimentos específicos de UI e permitem à área de trabalho evoluir com as suas interfaces sem alterar as definições da base.

Sem adaptadores, qualquer classe que pudesse ser transmitida na API da área de trabalho teria de implementar as interfaces da UI, o que iria aumentar o número de definições de classes, introduzir acoplamento apertado, e criar dependências circulares entre as classes de núcleo e de UI. Com adaptadores, cada classe implementa IAdaptable e utiliza o registo do adaptador para permitir a plug-ins estenderem o comportamento dos tipos base.

Ao longo do código da área de trabalho, verá casos em que o tipo de núcleo de plataforma é consultado relativamente a um adaptador. A consulta é utilizada para obter um objecto que saiba como responder a informações sobre o tipo orientadas para a UI.

Fábricas de elementos

Quando a área de trabalho é encerrada pelo utilizador, deve guardar o actual estado dos objectos IAdaptable que estejam apresentados na área de trabalho. O estado de um objecto é armazenado mediante salvaguarda dos parâmetros de dados primitivos do objecto em formato especial, um IMemento. O ID de uma fábrica que pode recriar um objecto a partir de um IMemento também é armazenado e os dados guardados no sistema de ficheiros.

Quando a plataforma é reiniciada, a área de trabalho encontra a fábrica de elementos associada ao ID de fábrica do IMemento. Encontra a fábrica verificando no registo de plug-ins a existência de contributos para a extensão org.eclipse.ui.elementFactories.

A marcação é muito simples. Só temos de especificar o ID da fábrica e a classe correspondente que implementa a fábrica.

A porção de código seguinte é oriunda do ficheiro plugin.xml da área de trabalho.

<extension
         point="org.eclipse.ui.elementFactories">
      <factory
            class="org.eclipse.ui.internal.model.ResourceFactory"
            id="org.eclipse.ui.internal.model.ResourceFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.model.WorkspaceFactory"
            id="org.eclipse.ui.internal.model.WorkspaceFactory">
      </factory>
      <factory
            class="org.eclipse.ui.part.FileEditorInputFactory"
            id="org.eclipse.ui.part.FileEditorInputFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"
            id="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.WorkingSetFactory"
            id="org.eclipse.ui.internal.WorkingSetFactory">
      </factory>
</extension>