IWorkbenchWindowActionDelegate selectionChanged

Status
Nicht offen für weitere Antworten.
G

Guest

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

Vayu

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

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

Guest

Gast
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 ...
 
G

Guest

Gast
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 :p
 
V

Vayu

Gast
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.
 
G

Guest

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

Vayu

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

Vayu

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

Vayu

Gast
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.

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

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

Vayu

Gast
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.
In einer View z.b. so:

getSite().setSelectionProvider(myTree);

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

Guest

Gast
okay mit TableViewer und TreeViewer versteh ich dass sobald ich sowas mache
Code:
        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?
 
G

Guest

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

Vayu

Gast
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.
 
G

Guest

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

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

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

Guest

Gast
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

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

Guest

Gast
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

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

Guest

Gast
Ja der Action kann für eine View oder einen Editor aktiv sein das hängt von einem flag ab.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben