ActionSet,commands,IWorkbenchWindowActionDelegate

Status
Nicht offen für weitere Antworten.
G

Gast2

Gast
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

Top Contributor
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.
 
G

Gast2

Gast
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 =)

Code:
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

Top Contributor
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)



Code:
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.
 
G

Gast2

Gast

foobar

Top Contributor
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.
 
G

Gast2

Gast
hm okay...

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

Gast2

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

so siehts bei mir aus z.B.

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

Code:
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();
  }


  }

}

Code:
public class ApplicationActionBarAdvisor extends ActionBarAdvisor
{

  private HelloAction action;

  protected void makeActions(IWorkbenchWindow window)
  {

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


}
 

foobar

Top Contributor
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.
 
G

Gast2

Gast
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

Top Contributor
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.
 
G

Guest

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

Code:
!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)
 
G

Guest

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

Gast2

Gast
erstmal danke für die email

2 Sachen noch

1. Zum Verständniss

Code:
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

Code:
    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

Top Contributor
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)
 
G

Gast2

Gast
ja ich schau mir den SelectionProvider mal an hab damit noch nichts gemacht.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben