2011-04-08 16 views
8

Estoy intentando configurar la visibilidad de un comando dentro del menú contextual usando la expresión 'visibleCuando' dentro de un menúContribución. Lo que estoy tratando de hacer es que el comando visible en el menú contextual sólo si:visibleCuando aparece el comando en el menú contextual

  1. Haga clic con ciertos tipos de archivos (recursos) en la vista de recursos (o ver el paquete)
  2. Haga clic en el editor apropiado que tiene el tipo de archivo abierto. Puede detectar que mi editor está abierto o que el editor tiene un cierto recurso abierto.

que he logrado la 'selección (con)' primero usando 'visibleWhen'>> 'iterate'> 'org.eclipse.core.resources.IResource (adaptación)', entonces el control de la extensión de archivo para el recurso . El código se enumera a continuación. Sin embargo, no estoy seguro de cómo hacer que el mismo comando aparezca solo cuando hace clic con el botón derecho en el editor correcto que tiene un archivo abierto con las extensiones correctas: ext1, ext2.

La comprobación de si mi editor está activo resuelve el segundo problema, pero no parece ayudar, ya que si hago clic en archivos que no son de mi tipo, se mostrará el comando en el menú contextual.

¿Alguna recomendación? El "Eclipse Plug-ins (3rd Edition)" muestra algunos ejemplos para el menú contextual del editor, pero utiliza acciones y quiero seguir con los comandos.

Gracias!


<menuContribution 
     allPopups="false" 
     locationURI="popup:org.eclipse.ui.popup.any?before=additions"> 
    <separator 
      name="com.test.ide.separator1" 
      visible="true"> 
    </separator> 
    <menu 
      icon="icons/sample.gif" 
      label="Test Menu"> 
     <command 
       commandId="com.test.commands.testCommand1" 
       icon="icons/sample.gif" 
       label="testCommand1" 
       style="push" 
       tooltip="This is a test command"> 
      <visibleWhen 
       checkEnabled="false"> 
       <with 
        variable="selection"> 
       <iterate 
         ifEmpty="false" 
         operator="or"> 
        <adapt 
          type="org.eclipse.core.resources.IResource"> 
         <or> 
          <test 
           property="org.eclipse.core.resources.extension" 
           value="ext1"> 
          </test> 
          <test 
           property="org.eclipse.core.resources.extension" 
           value="ext2"> 
          </test> 
         </or> 
        </adapt> 
       </iterate> 
       </with> 
      </visibleWhen> 
     </command> 
    </menu> 
    </menuContribution> 

Respuesta

1

Pude hacerlo con una variable with que encontré. Usando el mismo ejemplo de código anterior:

  • Añadir un bloque <or> dentro del bloque <iterate>
  • Coloque el <adapt> bloque existente en la nueva <or> bloque
  • añadir un nuevo with variable llamada activeEditorInput

Aquí está el nuevo ejemplo de código.

<iterate ifEmpty="false" operator="or"> 
    <or> 
    <adapt type="org.eclipse.core.resources.IResource"> 
     <or> 
     ...test extensions 
     </or> 
    </adapt> 
    <with variable="activeEditorInput"> 
     <adapt type="org.eclipse.core.resources.IResource"> 
     <or> 
      ...test extensions 
     </or> 
     </adapt> 
    </with> 
    </or> 
</iterate> 
+0

Correcto, pero sugeriría una ligera optimización de la reestructuración: –

1

Se podría implementar su propio PropertyTester.

+0

Gracias. Todavía no estoy demasiado familiarizado con PropertyTester personalizado, o incluso con gran parte de la API de complemento. ¡Me encontré con otra variable "con" que me ayudó a hacer esto! – blissfool

+0

¿Te importaría poner un ejemplo ...? – Campa

9

@blissfool, Sugeriría una reestructuración leve. Usted puede poner su prueba básica (que es correcto) en un bloque org.eclipse.core.expressions.definitions:

<extension point="org.eclipse.core.expressions.definitions"> 
    <definition id="org.eclipse.example.testExtension"> 
     <adapt type="org.eclipse.core.resources.IResource"> 
     <or> 
      <test property="org.eclipse.core.resources.extension" 
        value="ext1"> 
      </test> 
      <test property="org.eclipse.core.resources.extension" 
        value="ext2"> 
      </test> 
     </or> 
     </adapt> 
    </definition> 
</extension> 

Luego, en sus visibleWhen mover la prueba activeEditorInput hasta la parte superior:

<visibleWhen> 
    <or> 
     <with variable="selection"> 
     <iterate ifEmtpy="false"> 
      <reference definitionId="org.eclipse.example.testExtension"/> 
     </iterate> 
     </with> 
     <with variable="activeEditorInput"> 
     <reference definitionId="org.eclipse.example.testExtension"/> 
     </with> 
    </or> 
</visibleWhen> 
+0

Ah. Derecha. Gracias por eso. Leí acerca de org.eclipse.core.expressions.definitions y pensé en cómo podía reducir las condiciones repetidas pero no las puse juntas.Estaba demasiado concentrado en hacer funcionar la funcionalidad. Saludos ~ :) – blissfool

Cuestiones relacionadas