O ponto de extensão de rotinas de tratamento é uma elaboração do elemento handlerSubmission
experimental definido no Eclipse 3.0. Uma rotina de tratamento é o comportamento de um comando em um ponto específico no tempo. Um comando pode ter zero ou mais rotinas de tratamento associadas a ele. A qualquer ponto no tempo, um comando não terá nenhuma rotina de tratamento ativa ou uma rotina de tratamento ativa. A rotina de tratamento ativa é a que é responsável atualmente por executar o comportamento do comando. Isso é muito semelhante ao conceito de uma rotina de tratamento de ação e a uma ação que pode ser redestinada.
O ponto de extensão de rotinas de tratamento permite que um desenvolvedor de plug-in especifique uma rotina de tratamento que deve se tornar ativa e/ou ativada em determinadas circunstâncias. Se uma rotina de tratamento estiver inativa, nenhum comando delegará seu comportamento para a rotina de tratamento. Se uma rotina de tratamento estiver desativada, não será pedido que a rotina de tratamento execute. A execução da rotina de tratamento será bloqueada. As condições são definidas utilizando a facilidade da linguagem de expressão incluída durante o 3.0. Elas são expressas utilizando as cláusulas activeWhen
e enabledWhen
.
O workbench fornece algumas variáveis com as quais essas expressões podem contar. As variáveis suportadas são: os contextos ativos, o editor ativo, a parte ativa e a seleção atual. Embora não seja suportado neste design inicial é fácil ver como seria possível incluir outras variáveis ou mesmo permitir que desenvolvedores de plug-in contribuam com outras variáveis.
Uma rotina de tratamento que não especifica nenhuma condição é uma rotina de tratamento padrão. Uma rotina de tratamento padrão estará ativa apenas se nenhuma outra rotina de tratamento tiver todas as suas condições atendidas. Se duas rotinas de tratamento ainda tiverem condições que são atendidas, as condições serão comparadas. A idéia é selecionar uma rotina de tratamento cuja condição seja mais específica ou mais local. Para fazer isso, as variáveis referidas pela condição são examinadas. A condição que faz referência à variável mais específica "vence". A ordem de especificação (da menos específica para a mais específica) é definida em org.eclipse.ui.ISources
.
Se isso ainda não resolver o conflito, nenhuma rotina de tratamento estará ativa. Se uma opção de rastreio específica estiver ligada, isso levará a uma mensagem no registro. Um conflito também poderá ocorrer se houver duas rotinas de tratamento padrão. É responsabilidade dos desenvolvedores de plug-in e testadores de integração garantir que isso não aconteça. Essas condições são utilizadas para evitar carregamento desnecessário de plug-in. Essas definições da rotina de tratamento são agrupadas em um proxy. Para que um proxy carregue sua rotina de tratamento subjacente, duas coisas devem ocorrer: as condições do proxy devem ser atendidas para que ele se torne ativo e deve ser pedido ao comando para fazer algo que ele deve delegar (por exemplo, execute()).
<!ELEMENT extension (handler*)>
<!ATTLIST extension
point CDATA #REQUIRED
id CDATA #IMPLIED
name CDATA #IMPLIED>
<!ELEMENT handler (activeWhen? , class? , enabledWhen?)>
<!ATTLIST handler
commandId CDATA #REQUIRED
class CDATA #IMPLIED
helpContextId CDATA #IMPLIED>
O identificador do contexto da ajuda relacionado a essa rotina de tratamento específica. Embora um comando possa fornecer uma descrição geral do comportamento de um comando, às vezes, é apropriado a uma rotina de tratamento fornecer ajuda mais específica a sua implementação.
Desde: 3.2
<!ELEMENT activeWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
<!ELEMENT enabledWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
<!ATTLIST class
class CDATA #IMPLIED>
<!ELEMENT parameter EMPTY>
<!ATTLIST parameter
name CDATA #REQUIRED
value CDATA #REQUIRED>
<!ELEMENT enablement (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Um elemento de raiz genérico. O elemento pode ser utilizado dentro de um ponto de extensão para definir sua expressão de ativação. Os filhos de uma expressão de ativação são combinados utilizando o operador and.
<!ELEMENT not (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
Esse elemento representa uma operação NOT como resultado da avaliação da expressão do subelemento.
<!ELEMENT and (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Esse elemento representa uma operação AND como resultado da avaliação de todas as expressões dos subelementos.
<!ELEMENT or (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Esse elemento representa uma operação OR como resultado da avaliação de todas as expressões do subelemento.
<!ELEMENT instanceof EMPTY>
<!ATTLIST instanceof
value CDATA #REQUIRED>
Este elemento é utilizado para executar uma instância de verificação do objeto em foco. A expressão retornará EvaluationResult.TRUE se o tipo do objeto for um subtipo do tipo especificado pelo valor do atributo. Caso contrário, EvaluationResult.FALSE será retornado.
<!ELEMENT test EMPTY>
<!ATTLIST test
property CDATA #REQUIRED
args CDATA #IMPLIED
value CDATA #IMPLIED>
Esse elemento é utilizado para avaliar o estado da propriedade do objeto em foco. O conjunto de propriedades testáveis pode ser estendido utilizando o ponto de extensão do testador de propriedade. A expressão de teste retornará EvaluationResult.NOT_LOADED se o testador de propriedade que realiza o teste real ainda não estiver carregado.
<!ELEMENT systemTest EMPTY>
<!ATTLIST systemTest
property CDATA #REQUIRED
value CDATA #REQUIRED>
Testa uma propriedade do sistema chamando o método System.getProperty e compara o resultado com o valor especificado por meio do atributo de valor.
<!ELEMENT equals EMPTY>
<!ATTLIST equals
value CDATA #REQUIRED>
Esse elemento é utilizado para executar uma verificação equals do objeto em foco. A expressão retorna EvaluationResult.TRUE se o objeto for igual ao valor fornecido pelo valor do atributo. Caso contrário, EvaluationResult.FALSE será retornado.
<!ELEMENT count EMPTY>
<!ATTLIST count
value CDATA #REQUIRED>
Esse elemento é utilizado para testar o número de elementos em uma coleta.
<!ELEMENT with (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST with
variable CDATA #REQUIRED>
O elemento altera o objeto, a ser inspecionado para todos os seus elementos filho, para o objeto referido pela variável fornecida. Se a variável não puder ser resolvida, a expressão lançará um ExpressionException ao avaliá-la. Os filhos de uma expressão são combinados utilizando o operador and.
<!ELEMENT resolve (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST resolve
variable CDATA #REQUIRED
args CDATA #IMPLIED>
O elemento altera o objeto, a ser inspecionado para todos os seus elementos filho, para o objeto referido pela variável fornecida. Se a variável não puder ser resolvida, a expressão lançará um ExpressionException ao avaliá-la. Os filhos de uma expressão são combinados utilizando o operador and.
<!ELEMENT adapt (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST adapt
type CDATA #REQUIRED>
Este elemento é utilizado para adaptar o objeto em foco ao tipo especificado pelo tipo de atributo. A expressão será retornada sem carregar, se o adaptador ou o tipo referido ainda não estiver carregado. Isso lança um ExpressionException durante a avaliação se o nome do tipo não existir. Os filhos de uma expressão de adaptação são combinados utilizando o operador and.
<!ELEMENT iterate (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST iterate
operator (or|and) >
Esse elemento é utilizado para repetir uma variável do tipo java.util.Collection. Se o objeto em foco não for do tipo java.util.Collection uma ExpressionException será lançada durante a avaliação da expressão.
<extension point=
"org.eclipse.ui.handlers"
>
<handler commandId=
"commandId"
class=
"org.eclipse.compare.Command"
>
<activeWhen>
<with variable=
"selection"
>
<count value=
"1"
/>
<iterate operator=
"and"
>
<adapt type=
"IResource"
/>
</iterate>
</with>
</activeWhen>
</handler>
</extension>
Para evitar mais o carregamento de plug-in, é possível especificar quando a rotina de tratamento está ativada. Se o proxy ainda não tiver carregado a rotina de tratamento, apenas a sintaxe de expressões será utilizada para decidir se a rotina de tratamento está ativada. Se o proxy tiver carregado a rotina de tratamento, a sintaxe de expressões será consultada primeiro. Se a sintaxe de expressões for avaliada como verdadeira, a rotina de tratamento será pedida se estiver ativada. (Essa é uma operação "and" booleana de circuito curto entre a sintaxe de expressões e o estado ativado da rotina de tratamento).
<extension point=
"org.eclipse.ui.handlers"
>
<handler commandId=
"commandId"
class=
"org.eclipse.Handler"
>
<enabledWhen>
<with variable=
"context"
>
<property id=
"id"
value=
"debugging"
/>
</with>
</enabledWhen>
</handler>
</extension>
Todas as rotinas de tratamento implementam o org.eclipse.core.commands.IHandler
. Dentro do workbench, é possível ativar e desativar rotinas de tratamento utilizando a interface org.eclipse.ui.handlers.IHandlerService
. Essa interface pode ser recuperada de objetos que suportam o workbench, como o próprio IWorkbench
. Para recuperar o serviço, você deve fazer uma chamada como IWorkbench.getAdapter(IHandlerService.class)
.
Também é possível ativar e desativar rotinas de tratamento utilizando código legado no workbench. Isso pode ser feito por meio do mecanismo legado mostrado a seguir. Esse mecanismo é útil para clientes que utilizam ações para contribuir com menus ou barras de ferramentas.
IWorkbenchPartSite mySite; IAction myAction; myAction.setActionDefinitionId(commandId); IKeyBindingService service = mySite.getKeyBindingService(); service.registerAction(myAction);
Direitos Autorais (c) 2005 IBM Corporation e outros.
Todos os direitos reservados. Este programa e os materiais fornecidos com ele são
disponibilizados sob os termos da Licença Pública do Eclipse v1.0 que acompanha
esta distribuição e está disponível em
http://www.eclipse.org/legal/epl-v10.html