# Toolbar Button gegenseitig verriegeln



## Nud3l (19. Aug 2009)

Hallo


ich mochte in der Toolbar einen Start und Stop Button einbauen. Nur soll eben der Startbutton nur gedrückt werden wenn das ding noch nicht läuft und umgekehrt der Stopbutton.

Ich habe versucht mit


```
selectionChanged(IAction action, ISelection selection)
```

zuarbeiten aber irgendwie bekomme ich nur Fenster wechsel mit, aber nicht mit wenn ich was in der Toolbar drücke.

Mein nächster Ansatz war dann mit meine observer zuarbeiten den ich wieso brauch um mein ding zu starten nur komme ich nicht an die Action rann.

Zum Schluss habe ich es mit Commands probiert aber ich habe irgendwie voll die Probleme damit bekommen



```
public class StopCommand extends AbstractHandler {

  public Object execute(ExecutionEvent event) throws ExecutionException {
    System.out.println("StopCommand -- execute");
    this.setEnabled(true);
    return null;
  }
}[
```

[XML]
 <extension
         point="org.eclipse.ui.commands">
      <command
            defaultHandler="sbh.ocit.mockups.commands.StopCommand"
            id="myOcitSimulation.Stoppcommand"
            name="Stopp ">
      </command>
   </extension>
   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            locationURI="toolbarrg.eclipse.ui.main.toolbar">
         <toolbar
               id="myOcitSimulation.toolbar">
            <command
                  commandId="myOcitSimulation.Stoppcommand"
                  disabledIcon="icons/bundles/114/1/.cp/icons/full/etool16/new_testcase.gif"
                  icon="icons/eclipse/org.eclipse.ant.ui/icons/full/dlcl16/refresh.gif"
                  label="Stopp"
                  style="push">
            </command>
         </toolbar>
      </menuContribution>
   </extension>
[/XML]

Irgendwie bekomme ich keine Reaktion wenn ich auf dem Button in der Toolbar drücke.

Bei CommandID kann ich mit Browse meinen Command finden und auswählen aber es läuft trotzdem nicht..

Ich weiß so langsam nicht mehr weiter...


----------



## Gonzo17 (19. Aug 2009)

Was ist denn "das Ding"? Gibts irgendnen Status, an dem man erkennen kann, ob es läuft oder nicht? Weil wenn ja, dann könntest du nen Listener auf "das Ding" setzen und je nach Status die Buttons aktivieren/deaktivieren.


----------



## Nud3l (20. Aug 2009)

Ja, daran habe ich auch schon gedacht. Nur weiß ich nicht wie ich auf die Button zu greife ist ja ähnlich mit den Ansatz der observer. 

In der Action Klasse komme ich nie an den Button ran nur in der Methode 
	
	
	
	





```
public void run(IAction action) {
```
 in der Übergebenen IAction schaffe ich es den Button Status zu ändern.


----------



## Gonzo17 (20. Aug 2009)

Nud3l hat gesagt.:


> In der Action Klasse komme ich nie an den Button ran



Warum nicht?

Wie gesagt, es wäre hilfreich, wenn du ein bisschen mehr über "das Ding" erzählst, weil sonst ist das irgendwie Kaffeesatzleserei und wird dir nicht viel helfen.


----------



## Nud3l (20. Aug 2009)

Ok das Ding ist eine Simulation ich habe eine boolean Variable isrunning auf der ich eigentlich von überall zu greifen kann. 

Das Problem ist ja nicht das ich nicht mit bekomme ob die Simulation läuft oder nicht nur das die tollbar Buttons für mich nicht erreichbar sind.

Hier mein rum probier Klasse


```
public class StopSimulatonActionDelegate extends AbstractHandler implements 
                                        IWorkbenchWindowActionDelegate,
                                        Observer  {

  private IWorkbenchWindow window;


  public void dispose() {
  }

  public void init(IWorkbenchWindow window) {
    this.window = window;
    OcitsimulationSingleton.getInstance().addObserver(this);
//    this.setEnabled(false);
//    this.setBaseEnabled(false);
  }

  public void run(IAction action) {


    if (OcitsimulationSingleton.getInstance().isSimulationRunning()) {

      try {
        OcitServerStart.stop();
        OcitsimulationSingleton.getInstance().stopTimer();
      } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      MessageDialog.openInformation(window.getShell(), "Simulation ", "Simulation wurde gestoppt");
    }
    

  }

  public void update(Observable o, Object arg) {
   
    System.out.println("StopSimulatonActionDelegate -- update"); 
    
    if(OcitsimulationSingleton.getInstance().isSimulationRunning()){
      this.setEnabled(true);
    }else{
    this.setEnabled(false);
  }}

  public Object execute(ExecutionEvent event) throws ExecutionException {
    System.out.println("StopSimulatonActionDelegate -- execute"); 
    return null;
  }

  public void selectionChanged(IAction action, ISelection selection) {
    // TODO Auto-generated method stub
    
  }

}
```

this.setEnabled(true); klappt nicht
mit action.setEnabled(false); in der run Methode schon.

Vielleicht kann man über this.window.getWorkbench(). irgendwie an den Toolbar Butten kommen aber ich weiß nicht wie..


----------



## Gonzo17 (20. Aug 2009)

```
public void selectionChanged(IAction action, ISelection selection) {
// ...	
}
```

Probier doch mal ob du mit dieser Methode weiterkommst.
Ich weiß nicht genau auf welche Selektierungen der reagiert, aber wenn der auf alle möglichen Klicks achtet, dann ja wohl auch, sobald du per Klick deine Simulation ausführst. Probier damit mal rum. Kannst ja auch beim Debuggen mal schaun, welche Werte "selection" und "action" haben.


----------



## Nud3l (20. Aug 2009)

Ok das Ding ist eine Simulation ich habe eine boolean Variable isrunning auf der ich eigentlich von überall zu greifen kann. 

Das Problem ist ja nicht das ich nicht mit bekomme ob die Simulation läuft oder nicht nur das die tollbar Buttons für mich nicht erreichbar sind.

Hier mein rum probier Klasse


```
public class StopSimulatonActionDelegate extends AbstractHandler implements 
                                        IWorkbenchWindowActionDelegate,
                                        Observer  {

  private IWorkbenchWindow window;


  public void dispose() {
  }

  public void init(IWorkbenchWindow window) {
    this.window = window;
    OcitsimulationSingleton.getInstance().addObserver(this);
//    this.setEnabled(false);
//    this.setBaseEnabled(false);
  }

  public void run(IAction action) {


    if (OcitsimulationSingleton.getInstance().isSimulationRunning()) {

      try {
        OcitServerStart.stop();
        OcitsimulationSingleton.getInstance().stopTimer();
      } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      MessageDialog.openInformation(window.getShell(), "Simulation ", "Simulation wurde gestoppt");
    }
    

  }

  public void update(Observable o, Object arg) {
   
    System.out.println("StopSimulatonActionDelegate -- update"); 
    
    if(OcitsimulationSingleton.getInstance().isSimulationRunning()){
      this.setEnabled(true);
    }else{
    this.setEnabled(false);
  }}

  public Object execute(ExecutionEvent event) throws ExecutionException {
    System.out.println("StopSimulatonActionDelegate -- execute"); 
    return null;
  }

  public void selectionChanged(IAction action, ISelection selection) {
    // TODO Auto-generated method stub
    
  }

}
```

this.setEnabled(true); klappt nicht
mit action.setEnabled(false); in der run Methode schon.

Vielleicht kann man über this.window.getWorkbench(). irgendwie an den Toolbar Butten kommen aber ich weiß nicht wie..


----------



## Nud3l (25. Aug 2009)

Ich habe es jetzt ganz anders gelöst habe jetzt nur einen button bei dem ich immer alles ändere also vom start zum stop butten und zurück


----------

