# ActionSet,commands,IWorkbenchWindowActionDelegate



## Gast2 (12. Sep 2008)

hallo zusammen,

Irgendwie versteh ich die ganze Sache noch nicht...

help.eclipse.org/ganymede/index.jsp

wenn ich das verstehe kann ich doch jetzt meine commands einem actionSet übergeben oder muss ich alle meine commands in IWorkbenchWindowActionDelegate umwandeln??? oder wie bekomme ich das am besten hin???
Also wenn ich das Beispiel ausführe legt er mir eine class an die IWorkbenchWindowActionDelegate implementiert 
aber was ich dann genau machen muss damit der save button wieder funkioniert kp hab ihm actionId mitgeben... aber passieren tut nichts  :?:  :?: ... versteh den zusammenhang noch nicht so ganz also wenn was sinnlos ist sry ^^


meine 2 te frage wenn ich die von eclipse verwendete action benutze exit,save usw...
wie bekommt man die in einen actionset???


----------



## foobar (12. Sep 2008)

> meine 2 te frage wenn ich die von eclipse verwendete action benutze exit,save usw...
> wie bekommt man die in einen actionset???


Gar nicht. Die Saveactions sind programatische Actions und können nicht in actionSets verwendet werden.
In einem anderen Thread habe ich auf den Unterschied zwischen programatischen und deklarativen Actions bereits hingewiesen.
Warum willst du überhaupt die Saveaction einem ActionSet zuweisen? Die wird doch bereits von der Workbench gemanaged.


----------



## Gast2 (12. Sep 2008)

ja wollte in einer Perspektive dass die Buttons nicht angezeigt werden...

ok d.h. dass meine commands die programmtische Actions sind umwandeln müsste damit ich sich einem action set vrewenden könnte...

EDIT: hab gad gemerkt dass der link oben total schwachsinnig ist hie rmal ein auschnitt =)


```
public SaveAction(IWorkbenchWindow window) {
	...
	setText...
	setToolTipText...
	setImageDescriptor...
	setActionDefinitionId("org.eclipse.ui.file.save"); 
}

(Note:  The method name setActionDefinitionID could more appropriately be named setCommandID.  The method name reflects the original implementation of key bindings and uses outdated terminology.)

<extension point = "org.eclipse.ui.actionSets">
	   <actionSet id="com.example.actions.actionSet"
		   label="Example Actions"
		   visible="true">
		   <action id="com.example.actions.action1"
			   menubarPath="additions"
			   label="Example Save Action"
			   class="org.example.actions.ExampleActionDelegate"
		           definitionId="org.eclipse.ui.file.save">
		   </action>
		   ...
	   </actionSet>
   </extension>
```


was macht das  definitionId="org.eclipse.ui.file.save"... ???


----------



## foobar (12. Sep 2008)

SirWayne hat gesagt.:
			
		

> ja wollte in einer Perspektive dass die Buttons nicht angezeigt werden...
> 
> ok d.h. dass meine commands die programmtische Actions sind umwandeln müsste damit ich sich einem action set vrewenden könnte...


Commands haben sowieso erstmal nichts mit Actions zu tun. Es geht hier nur um die Differenzierung zwischen programatischen(IAction) und deklarativen Actions (IWorkbenchWindowActionDelegate)




```
public SaveAction(IWorkbenchWindow window) {
	...
	setText...
	setToolTipText...
	setImageDescriptor...
	setActionDefinitionId("org.eclipse.ui.file.save"); 
}

(Note:  The method name setActionDefinitionID could more appropriately be named setCommandID.  The method name reflects the original implementation of key bindings and uses outdated terminology.)

<extension point = "org.eclipse.ui.actionSets">
	   <actionSet id="com.example.actions.actionSet"
		   label="Example Actions"
		   visible="true">
		   <action id="com.example.actions.action1"
			   menubarPath="additions"
			   label="Example Save Action"
			   class="org.example.actions.ExampleActionDelegate"
		           definitionId="org.eclipse.ui.file.save">
		   </action>
		   ...
	   </actionSet>
   </extension>
```


Also entweder du verwendest die SaveAction aus Eclipse oder schreibst deine eigene aber eine eigene Klasse implementieren und die ID der vorhandenen zu verwenden ist krude.



> was macht das  definitionId="org.eclipse.ui.file.save"... ???



Das ist die eindeutige ID deiner Action, um später Keybindings und Commands daran zu binden.


----------



## Gast2 (12. Sep 2008)

help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/wrkAdv_keyBindings_actionDef.htm

ja des war halt im dem beispiel so darum dacht ich des hat nen sinn...


warum haben commands nicht mit Action zu  tun???


```
public class Command extends Action
```


Also nur nochmal kurz ich kann die eclipse Actions nicht in einem ActionSet verwenden...
Oder gibt es eine möglichkeit die in IWorkbenchDelegateActions zu verwenden/umzuwandeln...


----------



## foobar (12. Sep 2008)

> Oder gibt es eine möglichkeit die in IWorkbenchDelegateActions zu verwenden/umzuwandeln...


NEIN, siehe Eclipsedoku



> warum haben commands nicht mit Action zu tun???


Weil das Commandframework nichts mit Actions zu tun hat. 

http://wiki.eclipse.org/index.php/Platform_Command_Framework
http://pweclipse.blogspot.com/2006/06/what-can-command-framework-do-for-you.html

Ich finde das ganze Action/Commandframework auch etwas umständlich und teilweise unflexibel. Besonders das Setzen von Keybindngs ist nicht gerade nobelpreisverdächtig.


----------



## Gast2 (12. Sep 2008)

hm okay...

zu dem command framework warum erben die dann von Action????


----------



## foobar (12. Sep 2008)

Wo erbt denn Command von Action?

http://kickjava.com/src/org/eclipse/core/commands/Command.java.htm

Vergiss die Commands erstmal, das ist im Moment nicht relevant.


----------



## Gast2 (12. Sep 2008)

mhm ich glaub ich mische da irgendwas was nicht gut ist....

so siehts bei mir aus z.B.


```
</extension>
   <extension
         point="org.eclipse.ui.commands">
      <command
            id="HelloCommand"
            name="Hello">
      </command>
```


```
public class HelloAction extends Action
{
  public static final String ID="HelloCommand";

  public HelloAction (final IWorkbenchWindow window)
  {
    setId(ID);
    setActionDefinitionId(ID);
    setToolTipText("Hallo Welt");
    setImageDescriptor(Activator.getImageDescriptor("/icons/hello.gif"));
  }

  public void run()
  {

      final IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
      try {
    page.showView(HALLO.ID);
  } catch (PartInitException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }


  }

}
```


```
public class ApplicationActionBarAdvisor extends ActionBarAdvisor
{

  private HelloAction action;

  protected void makeActions(IWorkbenchWindow window)
  {

    action= new HelloAction();
    register(action);


}
```


----------



## foobar (12. Sep 2008)

> mhm ich glaub ich mische da irgendwas was nicht gut ist....


Das sehe ich auch so *gg*

Du brauchst den Command überhaupt nicht. Wofür soll der gut sein? Du hast doch bereits eine Action erstellt und registriert. Mehr brauchst du doch gar nicht.


----------



## Gast2 (12. Sep 2008)

hehe lol hab ich mich am anfang auch gefragt wo da die vebrindung ist dachte über die ids aber wenn ich den command weglasse bekomm ich immer in der console einen fehler schreib poste ihn wenn ich daheim bin...
irgendwie command mit der id in meinem besipeil HelloCommand ist nicht vorhanden.... oder sowas


----------



## foobar (12. Sep 2008)

Wenn du Probleme mit Actions haste kannste dir auch weitere Logmeldungen ausgeben lassen. Guck mal unter Run Configurations =>Tracing => Enable Tracing
Da kannste für jedes Plugin einstellen welche Logmeldungen ausgegeben werden sollen. Das ist besonders bei Keybindings praktisch, da die oft mehrfach belegt sind.


----------



## Gast2 (12. Sep 2008)

mhm ok schau ich mir die tage mal an


----------



## Guest (13. Sep 2008)

Das bekomm ich wenn ich die commands im plugin.xml weglasse


```
!MESSAGE The command ("HelloCommand") is undefined
!STACK 0
java.lang.Exception
	at org.eclipse.jface.action.ExternalActionManager$CommandCallback.isActive(ExternalActionManager.java:369)
	at org.eclipse.jface.action.ActionContributionItem.isCommandActive(ActionContributionItem.java:646)
	at org.eclipse.jface.action.ActionContributionItem.isVisible(ActionContributionItem.java:702)
	at org.eclipse.jface.action.ToolBarManager.update(ToolBarManager.java:257)
	at org.eclipse.jface.action.ToolBarManager.createControl(ToolBarManager.java:111)
	at org.eclipse.jface.action.ToolBarContributionItem.fill(ToolBarContributionItem.java:192)
	at org.eclipse.jface.action.CoolBarManager.update(CoolBarManager.java:919)
	at org.eclipse.jface.action.CoolBarManager.createControl(CoolBarManager.java:244)
	at org.eclipse.jface.internal.provisional.action.CoolBarManager2.createControl2(CoolBarManager2.java:76)
	at org.eclipse.jface.window.ApplicationWindow.createCoolBarControl(ApplicationWindow.java:522)
	at org.eclipse.ui.internal.WorkbenchWindow.createDefaultContents(WorkbenchWindow.java:1051)
	at org.eclipse.ui.internal.WorkbenchWindowConfigurer.createDefaultContents(WorkbenchWindowConfigurer.java:625)
	at org.eclipse.ui.application.WorkbenchWindowAdvisor.createWindowContents(WorkbenchWindowAdvisor.java:268)
	at org.eclipse.ui.internal.WorkbenchWindow.createContents(WorkbenchWindow.java:998)
	at org.eclipse.jface.window.Window.create(Window.java:431)
	at org.eclipse.ui.internal.Workbench$20.runWithException(Workbench.java:1014)
	at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:133)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3800)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3425)
	at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:803)
	at org.eclipse.ui.internal.Workbench$27.runWithException(Workbench.java:1361)
	at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:133)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3800)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3425)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2293)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2198)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:493)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:488)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at tippspiel_rcp.Application.start(Application.java:26)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1236)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1212)
```


----------



## Guest (16. Sep 2008)

mhm ich bekomm die fehlermeldung nicht weg erst wenn ich das command wieder anlege =(


----------



## Gast2 (16. Sep 2008)

:shock:  :shock:  hat es aufgegeben mit zu erklären ????


----------



## foobar (16. Sep 2008)

Gib mir mal deine Emailaddy, dann schicke ich dir ein Beispielprojekt.


----------



## Gast2 (17. Sep 2008)

erstmal danke für die email 

2 Sachen noch 

1. Zum Verständniss


```
public class MessagePopupAction extends Action {

    private final IWorkbenchWindow window;

    MessagePopupAction(String text, IWorkbenchWindow window) {
        super(text);
        this.window = window;
        // The id is used to refer to the action in a menu or toolbar
        setId(ICommandIds.CMD_OPEN_MESSAGE);
        // Associate the action with a pre-defined command, to allow key bindings.
        setActionDefinitionId(ICommandIds.CMD_OPEN_MESSAGE);
        setImageDescriptor(rcpactiondemo.Activator.getImageDescriptor("/icons/sample3.gif"));
    }

    public void run() {
        MessageDialog.openInformation(window.getShell(), "Open", "Open Message Dialog!");
    }
}
```

setActionDefinitionId(ICommandIds.CMD_OPEN_MESSAGE); 
ist zuständig für die keybindings und dafür brauch ich die commands...???
Aber so ein Action kann ich keinem ActionSet hinzufügen... richtig?

2. Hab ich mir dein ActionSet angeschaut 


```
public void selectionChanged(IAction action, ISelection selection)
    {
          IEditorPart edi = window.getActivePage().getActiveEditor();

          if (null != edi)
          {
              // wenn der Editor einen bestimmten Zustand hat action aktivieren
              //.....
              action.setEnabled(true);
          }
          action.setEnabled(false);
    }
```

ich versteh nicht wie ich diese Methode aufrufen kann des mit dem Selection war letztes mal schon mein Problem.
 :?:  :?: z.B. wenn ich aus einem Editor in ein Textfeld etwas hineinschreibe soll der Status geprüft werden also das selectionChanged aufgerufen werden...

thx


----------



## foobar (17. Sep 2008)

> setActionDefinitionId(ICommandIds.CMD_OPEN_MESSAGE);
> ist zuständig für die keybindings und dafür brauch ich die commands...???


Ja, für die Keybindings braucht man commands siehe plugin.xml im Beispiel.



> Aber so ein Action kann ich keinem ActionSet hinzufügen... richtig?


Genau, nur die IWorkbenchActionDelegates sind deklarative Actions und somit in ActionSets verwendbar. Guck dir die Javadocs zu den entsprechenden Klassen an, da wird alles erklärt.



> ich versteh nicht wie ich diese Methode aufrufen kann des mit dem Selection war letztes mal schon mein Problem.
> icon_question.gif icon_question.gif z.B. wenn ich aus einem Editor in ein Textfeld etwas hineinschreibe soll der Status geprüft werden also das selectionChanged aufgerufen werden...


Du rufst die Methode überhaupt nicht auf. Die Methode wird aufgerufen, wenn sich die Selection in der Anwendung ändert das habe ich aber schon mal ausführlich erklärt. Guck dir die SelectionProvider an.
Anscheinend ist das Listenerkonzept nicht ganz klar.

Also nochmal: Wenn deine Action abhängig von einem Editor sein soll, mußt du im Editor einen SelectionProvider implementieren und diesen in der Site registrieren. In der Action kannst du dann je nachdem welchen Status z.b. der Editor hat die Action aktivieren.
Du kannst aber nicht in einem Editor XYZ auf eine Action ABC zugreifen und den Zustand der Action ändern. Dafür gibts die Listener (SelectionListener, SelectionProvider)


----------



## Gast2 (18. Sep 2008)

ja ich schau mir den SelectionProvider mal an hab damit noch nichts gemacht.


----------

