# IWorkbenchWindowActionDelegate selectionChanged



## Guest (4. Jan 2009)

Hallo @all,

wann wird die Methode selectionChanged aufgerufen?? Wie kann man diese aus einem Editor/View aufrufen welches Event braucht man dafür???z.B. soll diese methode ausgeführt werden wenn jemand auf einem Button in einem Editor klickt...
Könnte es jemand kurz erklären wie sowas funktioniert vielleicht sogar mit ein paar code Fragementen

```
public class TestAction implements IWorkbenchWindowActionDelegate
{

  public static final String ID="TestAction";

  public void dispose()
  {
    // TODO Auto-generated method stub

  }
  public void run(IAction action)
  {
   System.out.println("Action wurde gedrückt");

  }
  
  public void init(IWorkbenchWindow window) 
  {
		
  }

  public void selectionChanged(IAction action, ISelection selection)
  {
    System.out.println("selectionChanged");
  }


}
```

thx  :toll:


----------



## Vayu (4. Jan 2009)

Javadoc Kommentar der Methode, der sagt doch schon alles oder?


```
/**
     * Notifies this action delegate that the selection in the workbench has changed.
     * 


     * Implementers can use this opportunity to change the availability of the
     * action or to modify other presentation properties.
     * </p>


     * When the selection changes, the action enablement state is updated based on
     * the criteria specified in the plugin.xml file. Then the delegate is notified
     * of the selection change regardless of whether the enablement criteria in the
     * plugin.xml file is met.
     * </p>
     *
     * @param action the action proxy that handles presentation portion of 
     * 		the action
     * @param selection the current selection, or <code>null</code> if there
     * 		is no selection.
     */
```


----------



## Guest (4. Jan 2009)

nein leider nicht so ganz sonst würde ich ja nicht fragen  :bahnhof: ...
wenn ich zwischen einem editor oder view switche wird es nicht aufgerufen ...


----------



## Guest (4. Jan 2009)

wenn das alles so einleuchtend für dich ist, könntest mir doch bestimmt kurz zeigen wie das geht und mich an deinem wissen teilhaben


----------



## Vayu (5. Jan 2009)

wenn du ein action enablement in deinem plugin.xml angegeben hast sollte die Methode aufgerufen werden, wie dort auch steht. hast du kein enablement definiert wird sie auch nicht aufgerufen.


----------



## Guest (5. Jan 2009)

Ein enablement state find ich nicht wie soll der definiert werden?
Ich habe nur ein enablesFor und da ist ein leeres Textfeld...


----------



## Vayu (5. Jan 2009)

du kannst im plugin.xml editor mit rechtsklick auf die action im extension point -> new enablement


----------



## foobar (5. Jan 2009)

Du brauchst einen SelectionProvider: http://www.java-forum.org/de/viewtopic.php?p=359435


----------



## Vayu (5. Jan 2009)

die IWorkbenchWindowActionDelegate ist aber kein SelectionListener, hat zwar die Methode, ist aber kein Listener.


----------



## Vayu (5. Jan 2009)

also eigentlich ist alles schwachsinn, was bisher geschrieben wurde, das von mir eingeschlossen 

hab grad mal ne eigene action gebaut und registriert.

das selectionChanged wird IMMER aufgerufen, sobald man iiirgendwo hinklickt.


```
<extension
         point="org.eclipse.ui.actionSets">
      <actionSet
            id="my.id.bla.actionSet1"
            label="label"
            visible="true">
         <action
               allowLabelUpdate="true"
               class="my.id.bla.TestAction"
               enablesFor="+"
               id="my.id.bla.action1"
               label="BLABLA"
               pulldown="false"
               retarget="false"
               state="true"
               style="push"
              toolbarPath="org.eclipse.ui.workbench.file/save.group">
         </action>
      </actionSet>
   </extension>
```

der toolbar path, ist der für die save group in der eclipse toolbar


----------



## foobar (5. Jan 2009)

> die IWorkbenchWindowActionDelegate ist aber kein SelectionListener, hat zwar die Methode, ist aber kein Listener.


Die selectionChanged-Methode wird dann aufgerufen, wenn irgendwo in der Anwendung ein SelectionProvider einen Event feuert. Jeder Viewer ist automatisch auch ein SelectionProvider und kann über eine View oder Editor registriert werden.
In einer View z.b. so: 



> getSite().setSelectionProvider(myTree);


----------



## Vayu (5. Jan 2009)

foobar hat gesagt.:
			
		

> > die IWorkbenchWindowActionDelegate ist aber kein SelectionListener, hat zwar die Methode, ist aber kein Listener.
> 
> 
> Die selectionChanged-Methode wird dann aufgerufen, wenn irgendwo in der Anwendung ein SelectionProvider einen Event feuert. Jeder Viewer ist automatisch auch ein SelectionProvider und kann über eine View oder Editor registriert werden.
> ...



ach so rum meintest du das. jop das ist richtig --> missverständnis. Falls "Gast" also einen eigenen editor gebastelt hat, dann muss er diesen noch als SelectionProvider anmelden.


----------



## Guest (5. Jan 2009)

okay mit TableViewer und TreeViewer versteh ich dass sobald ich sowas mache

```
TableViewer view = new TableViewer(table);
        getSite().setSelectionProvider(view);
```
und eine Zeile auswähle klappt es.

aber was ist wenn ich einen ViewPart habe und einen EditorPart und zwischen den beiden hin und her switche kann ich das Event dann auch irgendwie feuern?


----------



## Guest (5. Jan 2009)

also meine frage ist eher kann ich eine ViewPart oder einen EditorPart zum einem Provider machen???


----------



## Guest (5. Jan 2009)

> das selectionChanged wird IMMER aufgerufen, sobald man iiirgendwo hinklickt.



was meinst du damit?


----------



## Vayu (5. Jan 2009)

naja wenn du deine action per extension point registrierst, und die standard eclipse views, editoren etc verwendest, ohne was eigenes, dann wird deine Action korrekt über einen Selectionwechsel informiert.

was deine View angeht.

dein ViewPart muss das Interface ISelectionProvider implementieren, dann kannst den auch als SelectionProvider einsetzen. Musst dann natürlich auch die zugehörigen Funktionen ausimplementieren.


----------



## Guest (5. Jan 2009)

ja des mit dem implementieren des interface war mit klar...
aber die mthoden sind mir nicht klar


```
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
	// TODO Auto-generated method stub
	
}

@Override
public ISelection getSelection() {
	// TODO Auto-generated method stub
	return null;
}

@Override
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
	// TODO Auto-generated method stub
	
}

@Override
public void setSelection(ISelection selection) {
	// TODO Auto-generated method stub
	
}
```

was kommt in die add/remove methode????
ich denke bei getSelection gibt die ViewPart sich selber zurück oder?


----------



## foobar (6. Jan 2009)

Guck dir doch mal die Implementierungen in Eclipse an!!

In den add und Remove Methoden wird der ISelectionChangedListener einer Liste hinzugefügt respektive entfernt. 
http://help.eclipse.org/help32/inde...eclipse/jface/viewers/ISelectionProvider.html

Wenn du beim Wechsel zwischen Editor und View informiert werden willst, brauchst du in beiden Parts einen SelectionProvider, denn beim Wechsel ändert sich ja auch die Selection. Sowas macht man aber besser mit einem IPartLIstener: http://download.eclipse.org/eclipse...ference/api/org/eclipse/ui/IPartListener.html
Damit kriegste mit wenn Parts geöffnet, geschlossen oder aktiviert werden.


----------



## Guest (6. Jan 2009)

mhm jetzt versteh ich immer noch net mehr  ???:L ...
Das heißt ich soll auf View und Editor einen PartListener registieren 
Okay dann switche ich hin und her wie bekommt dass dann meine Action mit???
Muss ich da noch irgendwas registrieren??
Also mein Problem ist eigentlich nur wie Action das mitbekommt was muss ich wo registrien dass die Action dass auch mitbekommt???


----------



## foobar (7. Jan 2009)

Mit einer Action auf einen PartListener reagieren ist schwierig, das macht man besser ohne Action oder du mußt die Events des PartListeners in SelectionEvents übersetzen. Ist aber nicht die feine Art.

Dann sind mehrere SelectionProvider in den einzelnen Parts (View, Editor) wohl immer noch die bessere Lösung.

Muß es denn unbedingt eine deklarative Action sein? Es gibt ja auch noch programatische Actions und das Commandframework: http://www.vogella.de/articles/RichClientPlatform/article.html#commands


----------



## Guest (7. Jan 2009)

Aber die programmatischen Actions kann ich in keine ActionSet machen, oder?
Das würde ja heißen ich kann die selectionChanged Methode nur verwenden für einen Tree oder Table... Sonst habe ich nie einen Viewer...
Ich wollte halt wenn man zwischen Editor oder View hin und her switcht die Action je nachdem disabled oder enabled machen. Klar kann ich in der run methode überprüfen was gerade aktiv ist und einen Dialog bringen "Aktion nicht möglich" aber ich würde es schöner finden, wenn der Action dann inaktiv ist...


----------



## foobar (8. Jan 2009)

Wenn die Action nur für eine View aktiv sein soll, packst du die Action besser ins Viewmenü. Globale Actions gehören immer zu einer Perspektive oder einem Kontext.

Ja, programatische Actions kann man nicht in ein ActionSet packen.


----------



## Guest (11. Jan 2009)

Ja der Action kann für eine View oder einen Editor aktiv sein das hängt von einem flag ab.


----------



## Guest (23. Jan 2009)

Ich habe leider immer noch keine Lösung


----------

