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 log. 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>
<!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 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 de suas expressões de subelementos.
<!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 suas expressões de 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 suas expressões de subelementos.
<!ELEMENT instanceof EMPTY>
<!ATTLIST instanceof
value CDATA #REQUIRED>
Esse elemento é utilizado para executar uma verificação instanceof do objeto em foco. A expressão retornará EvaluationResult.TRUE se o tipo de 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 capazes de serem testadas pode ser estendido utilizando o ponto de extensão do testador da propriedade. Uma expressão test retornará EvaluationResult.NOT_LOADED se o testador da propriedade que executa 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 pelo 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 retornará 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>
Esse elemento altera o objeto para ser inspecionado para obter todo seu elemento filho para o objeto referenciado pela determinada variável. Se a variável não puder ser resolvida, então a expressão lançará uma 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>
Esse elemento altera o objeto para ser inspecionado para obter todo seu elemento filho para o objeto referenciado pela determinada variável. Se a variável não puder ser resolvida, então a expressão lançará uma 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>
Esse elemento é utilizado para adaptar o objeto em foco ao tipo especificado pelo tipo de atributo. A expressão retornará não carregado se o adaptador ou o tipo referido ainda não estiver carregado. Ela lançará uma ExpressionException durante a avaliação se o nome do tipo ainda não existir. Os filhos de uma expressão adapt 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 iterar sobre uma variável do tipo java.util.Collection. Se o objeto em foco não for do tipo java.util.Collection, então uma ExpressionException será lançada ao avaliar a 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 que o acompanham são disponibilizados
sob os termos da Eclipse Public License v1.0 que acompanha esta
distribuição e estão disponíveis no endereço http://www.eclipse.org/legal/epl-v10.html