# IEvaluationService



## Gast2 (1. Jan 2010)

Hallo,

ich adde in meinem Editor dem EvulationService einen SourceProvider (DeleteSourceProvider)...
und bei einem dispose remove ich ihn wieder...

```
@Override
	public void init(IEditorSite site, IEditorInput input)
			throws PartInitException {
		final IEvaluationService evaluationService = (IEvaluationService) getSite()
		.getWorkbenchWindow().getWorkbench().getService(
		IEvaluationService.class);
		deleteSourceProvider = new DeleteSourceProvider();
		evaluationService.addSourceProvider(deleteSourceProvider);
	}

        public void dipose(){
        super.dipose();
        final IEvaluationService evaluationService = (IEvaluationService) getSite()
		.getWorkbenchWindow().getWorkbench().getService(
		IEvaluationService.class);
		evaluationService.removeSourceProvider(deleteSourceProvider);
}
```

Das Problem ist, dass dann meine anderen Editoren diesen auch nicht mehr haben warum???
Ich adde doch jedesmal eine neue Instanz und nehm die auch wieder weg... Was mach ich falsch?

Wenn jemand weiß wies mit Extension Point gehts wärs auch gut =)...

Danke


----------



## Gast2 (1. Jan 2010)

Also wenn jemand eine gute Quelle hat oder mir richtig erklären könnte wie das richtig funktioniert, wäre ich echt dankbar ^^... Ich kapier es einfach nicht...

Wenn ich beim dispose sie nicht wegnehmen, dann bekomme ich immer eine SWT dipose exception...


----------



## Gast2 (4. Feb 2010)

Also vielleicht nochmal ausfürhlicher mein Anliegen =)...
Ich habe mehrere Views und Editoren und ein Interface

```
public interface IDeletable {

	public boolean isDeleteable();
	public void delete();
}
```
So jede View oder Editor, welcher dieses Interface implementiert und die Methode isDeleteable true zurückliefert soll der Command enable sein.
Also hab ich einen PropertyTester

```
public class DeleteProperyTester extends PropertyTester {

	public static final String IS_DELETE = "delete";

	@Override
	public boolean test(Object receiver, String property, Object[] args,
			Object expectedValue) {
		if (property.equals(IS_DELETE))
			return ((IDeletable) receiver).isDeleteable();
		
		return false;
	}

}
```

Und den entsprechenden Handler

```
public class DeleteHandler extends AbstractHandler{

	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		IWorkbenchPart edi = HandlerUtil.getActivePart(event);

		if (null != edi) {
			if (edi instanceof IDeletable) {
				IDeletable deletable = (IDeletable) edi;
				deletable.delete();
			}
		}
		return null;
	}

}
```
So das klappt schon ganz gut jedes mal wenn ich den Edtior oder View wechsel testet der Propertytester die Methode erneut und setzt so den command.
Was mir jetzt noch fehlt ist dass ich innherhalb der View, wenn ich z.B. etwas in ein Textfeld eingebe ein Event geworfen wird(sowas wie das PROP_DIRTY), wo der PropertyTester dann erneut prüft.
Ich weiß dass das anscheinend mit einem IEvaluationService gehen soll.
Weiß jemand wie man so einen registriert und wieder abmeldet?
Und was man genau dazu braucht? Einen AbstractSourceProvider? Und was man mit diesem genau machen soll?

Danke schonmal


----------



## SegFault (7. Feb 2010)

was mir spontan dazu einfallen würde wäre folgendes.

du machst das wie in post 1 angedacht indem du einen SourceProvider nimmst, welchen dur dir über den EvaluationService holen kannst. Prinzipell scheinen diese Services eine art Singleton verhalten an den Tag zu legen. Daher gibts wohl probleme mit dem Dispose. Ich würde für den Service ein PropertyChangeListener anlegen und die eigentlichen klassen implementieren PropertyChangeSupport so das du ein Prop "IS_DELETE" feuern kannst. 

Beim Init holst du dir also deinen Service, meldest die View oder den Editor beim dem Service an so das dieser auf die propertyChanges des Editors hört und kannst bei bedarf das event feuern. beim dispose entfernst du den propchange krams vom service wieder.


----------



## Gast2 (7. Feb 2010)

SegFault hat gesagt.:


> was mir spontan dazu einfallen würde wäre folgendes.
> 
> du machst das wie in post 1 angedacht indem du einen SourceProvider nimmst, welchen dur dir über den EvaluationService holen kannst. Prinzipell scheinen diese Services eine art Singleton verhalten an den Tag zu legen. Daher gibts wohl probleme mit dem Dispose. Ich würde für den Service ein PropertyChangeListener anlegen und die eigentlichen klassen implementieren PropertyChangeSupport so das du ein Prop "IS_DELETE" feuern kannst.
> 
> Beim Init holst du dir also deinen Service, meldest die View oder den Editor beim dem Service an so das dieser auf die propertyChanges des Editors hört und kannst bei bedarf das event feuern. beim dispose entfernst du den propchange krams vom service wieder.



Nee man kann im SourceProvider schon Events feuern die wiederum den PropertyTester aufrufen, ich sollte nur wissen wie man den Service gescheit registriert und wieder abmeldet, am Besten über extension points...


----------



## Gast2 (10. Feb 2010)

Hier ist die Lösung. Eigentlich recht einfach wenn man es weiß...
Eclipse Community Forums


----------

