2009-03-16 4 views
4

In meiner Eclipse RCP 3.3-Anwendung möchte ich eine Schaltfläche "Speichern" in der Symbolleiste nach dem aktuellen Editor dirty flag aktivieren oder deaktivieren.In Eclipse RCP, wie ich eine Schaltfläche zum Speichern in der "schmutzigen" Eigenschaft in Editor deaktivieren

Ich versuche, das < enabledWhen> Tag zu verwenden, aber ich kann es nicht funktionieren lassen.

Hier ist der Teil des Codes in plugin.xml:

<command 
commandId="org.acme.command.save" 
icon="icons/save.png" 
id="org.acme.command.save" 
style="push"> 
<enabledWhen> 
    <instanceof value="activeEditor"/> 
    <test property="dirty" value="true"/> 
</enabledWhen> 
</command> 

Haben Sie eine Ahnung, wie das funktionieren soll?

+0

Ich möchte den deklarativen/XML-Weg nur verwenden, nicht von Java – paulgreg

Antwort

0

Ich bin nicht sicher, dass es vollständig deklarativ sein kann.

saveAction = ActionFactory.SAVE.create(PlatformUI.getWorkbench().getActiveWorkbenchWindow()); 
configurer.registerGlobalAction(saveAction); 

Ca Sie überprüfen, ob die following thread can help you?
Bei der Aktion Speichern kann es sich um eine Retargetable action handeln.

+0

Vielen Dank für Ihre Antwort. Allerdings würde ich gerne den deklarativen Weg benutzen (nebenbei habe ich es auch mit einem PropertyTester bisher ohne Glück versucht). Der Thread war für mein spezifisches Problem nicht hilfreich. – paulgreg

0

versuchen Sie dies:

org.eclipse.core.variables.dynamicVariables 
-(variable) [here you should implement resolver class to return active editor] 

org.eclipse.core.expressions.definitions 
-(definition) 
--(with) [reference here your variable] 
---(test) [test if dirty] 

org.eclipse.ui.commands !mistake: not commands, but handlers 
-(handler) 
--(enabledWhen) 
---(reference) [reference your definition here] 

**(updated)** 
org.eclipse.core.properties.propertyTesters 
-(propertyTester) 

Ich bin nicht sicher, ob es funktionieren wird, aber es gibt eine Chance, ...

+0

gefunden, dass es eine vordefinierte Variable für den aktiven Editor "ActiveEditor" gibt, so dass Schritt 1 nicht benötigt wird. – Imaskar

+0

Danke. Ich habe gerade versucht, aber scheint nicht zu funktionieren ... – paulgreg

+0

Übrigens, auch wenn ich meine Antwort dort nicht gefunden habe, ist diese URL nützlich für Eclipse-Core-Ausdrücke (http://wiki.eclipse.org/Command_Core_Expressions). – paulgreg

5

Unterstützung für das ‚Speichern‘ und "Speichern Alle Aktionen vorgesehen durch die Werkbank, so müssen Sie es nicht selbst implementieren, wie Sie es versuchen.

Der empfohlene Weg besteht darin, die Unterstützung in Ihrer Klasse hinzuzufügen, die ActionBarAdvisor erweitert. Der genaue Code hängt von der Struktur der Klasse ab, aber die Code-Bits, die Sie benötigen, sind wie folgt.

in Ihrem Bereich Erklärungen:

private IWorkbenchAction saveAction; 
private IWorkbenchAction saveAllAction; 

in Ihrem makeActions Methode:

saveAction = ActionFactory.SAVE.create(window); 
    register(saveAction); 

    saveAllAction = ActionFactory.SAVE_ALL.create(window); 
    register(saveAllAction); 

in Ihrem fillActionBars Methode:

IToolBarManager saveToolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT); 
    saveToolbar.add(saveAction); 
    saveToolbar.add(saveAllAction); 
    coolBar.add(new ToolBarContributionItem(saveToolbar, "save")); 

Die Werkbank kümmert sich um die Aktivierung und Deaktivierung für dich.

Wenn Sie Ihren eigenen Code implementieren möchten, aus welchem ​​Grund auch immer, dann wird der von Ihnen gewählte Ansatz funktionieren. Sie müssen das XML korrigieren (zum Beispiel prüft das instanceof-Element, dass das ausgewählte Objekt eine Instanz einer Klasse namens "activeEditor" ist, was wahrscheinlich nicht beabsichtigt ist).

+0

Danke. Ich würde gerne den deklarativen XML-Weg verwenden, aber es scheint, dass es keinen Weg gibt. Also könnte dein Code nützlich sein. – paulgreg

4

Ein brillanter Kollege von mir fand gerade die Antwort für Eclipse> = 3.3:

Hier ist, wie Sie den Befehl in der plugin.xml zu definieren:

<command 
     commandId="com.acme.bo.command.done" 
     id="com.acme.bo.menu.done" 
     label="Command to do"> 
    <visibleWhen> 
     <with variable="activeMenuSelection"> 
      <iterate> 
       <adapt type="com.acme.bo.model.Pojo"></adapt> 
       <test 
        args="valueThatYouWantToPassTest" 
        property="com.acme.namespace.testedProperty" 
        value="something"> 
       </test> 
      </iterate> 
     </with> 
    </visibleWhen> 
    </command> 

Dann haben Sie die propertyTester zu definieren, wieder im Plugin.xml:

<extension 
     point="org.eclipse.core.expressions.propertyTesters"> 
    <propertyTester 
      class="com.acme.namespace.tester.YourPropertyTester" 
      id="com.acme.namespace.tester.testedPropertyTester" 
      namespace="com.acme.namespace" 
      properties="testedProperty" 
      type="com.acme.bo.model.Pojo"> 
    </propertyTester> 
</extension> 

Und hier ist YourPropertyTester Klasse, die den Test durchführen:

package com.acme.namespace.tester; 

import org.eclipse.core.expressions.PropertyTester; 

import com.acme.bo.model.Pojo; 

public class YourPropertyTester extends PropertyTester { 

    @Override 
    public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { 
     if (receiver == null || !(receiver instanceof Pojo)) 
     return false; 

     Pojo pojo = (Pojo) receiver; 
     if (args != null) { 
     for (Object object : args) { 
      if (pojo.getYourProperty().contains((String)object)) 
       return true; 
     } 
     } 
     return false; 
    } 
} 
0

Wenn Sie Probleme mit Eigentum Tester Aktivierung auftreten beachten Sie, dass Ihr Eigentum Tester Implementierung im gleichen Plugin befinden müssen in dem es zu org.eclipse.core.expressions.propertyTesters Erweiterungspunkt beiträgt.

Verwandte Themen