# Source Provider



## Gast2 (15. Dez 2009)

Hallo zusammen,

ich verstehe die Sache mit dem SourceProvider noch nicht so richtig vielleicht kann mir jemand auf die Sprünge helfen...
Also ich wollte einen eigenen SourceProvider schreiben, so ähnlich wie hier
SourceProviders  Eclipse Stuff
Nur nicht für eine Table sondern für ein Textfeld.
Ich möchte immer noch erreichen, dass wenn ich in ein Textfeld etwas hinschreibe sich ein command in der toolbar deaktiviert bzw. aktiviert. Da sah die Methode mit dem Provider ganz gut aus...
Also mit einem PropertyTester hab ich es hinbekommen, dass ich den aktivenPart abfragen kann ob ein bestimmtest interface implementiert ist und eine methode true zurück liefert, dann wird der comman aktiviert/deaktiviert... Da klappt aber halt nur wenn man den aktivenPart wechselt, aber innerhalb diesen aktivenPart zu steuern brauch ich so wie ich das sehe noch so einen Provider...
Mein problem ist hauptsächlich wie ich einen eigenen Provider für ein Textfeld machen kann?


----------



## Gast2 (22. Dez 2009)

Noch nie jemand mit dem IEvaluationService gearbeitet????


----------



## Gast2 (23. Dez 2009)

So ich hab mal was gemacht, weiß nicht ob es 100 pro perfekt ist:
Bin für weitere Tips dankbar und Verbesserungsvorschläge dankbar=)...
Also ich wollte command das nur aktiv ist wenn eine View oder Editor ein bestimmtes Interface implementiert und davon eine Methode true zurück liefert: Leider weiß ich noch nicht wie ich mein SourceProvider mit extensions point hinzufüge...Ich versuchs grad mit org.eclipse.ui.services


Hier mal ein kleines Beispiel sobald man auf save drückt geht der command an wenn man den aktiven Part wechselt geht er wieder aus:

Interface

```
public interface IPushable {

	boolean isPushable();
	void push();
}
```

View

```
public class MyView extends ViewPart implements IPushable, ISaveablePart2{
	public static final String ID = "myview";

	private PushSourceProvider p;
	private boolean push;
	
	public void createPartControl(Composite parent) {
		//Unschön sollte iwie über extesnsion point gehen
		final IEvaluationService evaluationService = (IEvaluationService) getSite()
		.getWorkbenchWindow().getWorkbench().getService(
		IEvaluationService.class);
		p = new PushSourceProvider();
		evaluationService.addSourceProvider(p);
	}

	public void setFocus() {
	}

	@Override
	public boolean isPushable() {
		return push;
	}

	@Override
	public void push() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public int promptToSaveOnClose() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void doSave(IProgressMonitor monitor) {
		push = true;
		p.firePushChanged(this);
		
	}
	
	@Override
	public void dispose() {
		super.dispose();
		final IEvaluationService evaluationService = (IEvaluationService) getSite()
		.getWorkbenchWindow().getWorkbench().getService(
		IEvaluationService.class);
		evaluationService.removeSourceProvider(p);
	}

	@Override
	public void doSaveAs() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean isDirty() {
		return true;
	}

	@Override
	public boolean isSaveAsAllowed() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean isSaveOnCloseNeeded() {
		// TODO Auto-generated method stub
		return false;
	}
}
```

SourceProvider

```
package dn;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.ui.AbstractSourceProvider;
import org.eclipse.ui.ISources;


public class PushSourceProvider extends AbstractSourceProvider {

	public static final String ID = "services.pushsourceprovider";
	public static final String PUSH_ID = "currentPush";
	private IPushable push = null;



	@Override
	public void dispose() {
		push = null;
	}

	@Override
	public Map<String, IPushable> getCurrentState() {
		Map<String, IPushable> map = new HashMap<String, IPushable>();
		map.put(PUSH_ID, push);
		return map;
	}

	@Override
	public String[] getProvidedSourceNames() {
		return new String[] { ID };
	}
	
	public void firePushChanged(IPushable iPushable){
		push = iPushable;
		fireSourceChanged(ISources.ACTIVE_PART, PUSH_ID, push);
	}

}
```

PropertyTester welcher die methode testet

```
public class PropertyTester extends org.eclipse.core.expressions.PropertyTester{

	public static final String IS_PUSH = "push";
	
	@Override
	public boolean test(Object receiver, String property, Object[] args,
			Object expectedValue) {
		if (IS_PUSH.equals(property)) {
			return 	((IPushable)receiver).isPushable();
		}
		return false;
	}
}
```

[XML]
<extension
         point="org.eclipse.core.expressions.propertyTesters">
      <propertyTester
            class="dn.PropertyTester"
            id="push.tester"
            namespace="dn"
            properties="push"
            type="dn.IPushable">
      </propertyTester>
   </extension>
[/XML]

Handler Der die methode push ausführen soll

```
public class PushHandler extends AbstractHandler{

	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		IWorkbenchPart activePart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
		if(activePart instanceof IPushable){
			((IPushable)activePart).push();
		}
		return null;
	}

}
```

[XML]
 <extension
         point="org.eclipse.ui.handlers">
      <handler
            class="dn.PushHandler"
            commandId="Push">
         <activeWhen>
            <with
                  variable="currentPush">
               <test
                     forcePluginActivation="true"
                     property="dn.push">
               </test>
               <and>
                  <with
                        variable="activePart">
                     <test
                           forcePluginActivation="true"
                           property="dn.push">
                     </test>
                  </with>
               </and>
            </with>
         </activeWhen>
      </handler>
   </extension>
[/XML]


Wie gesagt wenn jemand ein Verbesserungsvorschlag hat gerne wilkommen


----------

