IEvaluationService

G

Gast2

Gast
Hallo,

ich adde in meinem Editor dem EvulationService einen SourceProvider (DeleteSourceProvider)...
und bei einem dispose remove ich ihn wieder...
Java:
	@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
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

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

Gast2

Gast
Also vielleicht nochmal ausfürhlicher mein Anliegen =)...
Ich habe mehrere Views und Editoren und ein Interface
Java:
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
Java:
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
Java:
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

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

Gast2

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

Neue Themen


Oben