Frage zu IEditorInput

G

Gast2

Gast
Hallo zusammen,

ich möchte einen Editor nur öffnen wenn ein Editor mit dieser Id noch nicht offen ist. Wie kann ich sowas machen?
Wenn ich sowas hier mache kann ich nur einen Editor öffnen, auch wenn die Ids unterschiedlich sind.

Java:
public class TeamEditorSite implements IEditorInput{

	private Bean team;
		
	public void setTeam(TeamObjectModel team) {
		this.team = team;
	}

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

	@Override
	public ImageDescriptor getImageDescriptor() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getName() {
		return team == null ? "": team.getPlayername();
	}

	@Override
	public IPersistableElement getPersistable() {
		return null;
	}

	@Override
	public String getToolTipText() {
		return getName();
	}

	@Override
	public Object getAdapter(Class adapter) {
		return Platform.getAdapterManager().getAdapter(this, adapter);
	}
	
    public int hashCode() {
        return team.getId();
    }

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null || getClass() != obj.getClass())
            return false;
        return team.equals(((TeamEditorSite) obj).team.getId());
    }
}
 
G

Gast2

Gast
Ja in einem Handler
Java:
public class CreateTeamEditor extends AbstractHandler{

	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {	
		try {
			HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().openEditor(new TeamEditorSite(), TeamEditor.ID);
		} catch (PartInitException e) {
			e.printStackTrace();
		}
		return null;
	}

}
 
M

maki

Gast
Entweder ich habe dich falsch verstanden, oder du benutzt den Begriff "id" falsch.
Die "id" ist das, was du in der plugin.xml angibst.
Nun, wenn du jedesmal eine neue TeamEditorSite übergibst, kann die openEditor Methode nur feststellen, dass es keinen geöffneten Editor gibt der bereits diesen IEditorInput (==) geöffnet hat.

Oder willst nur einen speziellen Editor nur ein einziges mal (Singleton) erlauben?
 
G

Gast2

Gast
Entweder ich habe dich falsch verstanden, oder du benutzt den Begriff "id" falsch.
Die "id" ist das, was du in der plugin.xml angibst.
Nun, wenn du jedesmal eine neue TeamEditorSite übergibst, kann die openEditor Methode nur feststellen, dass es keinen geöffneten Editor gibt der bereits diesen IEditorInput (==) geöffnet hat.

Oder willst nur einen speziellen Editor nur ein einziges mal (Singleton) erlauben?

Ach verdammt sind ja 2 ids, ich meinte nicht die EditorID...

Ich hab zB ein Datenbank Objekt mit einer eindeutigen ID.
Jetzt will ich nicht dass man den Editor 2 mal mit der gleichen ID öffnen kann.
Also das heißt der Editor kann öfters offen sein wenn die DB Id unterschiedlich ist.

Beispiel:
Java:
public class Tier implements...
{

  public Integer getId(){
     return id;
  }

}

Man in dem Dialog mehrer Tiere erfassen/ändern usw., aber es darf nicht 2 mal der Editor Giraffe mit der id 2 offen sein.

Hoffe verständlicher ^^
 
M

maki

Gast
Ach so... jetzt ist der Groschen gefallen :)

Java:
team.equals(((TeamEditorSite) obj).team.getId());
Du vergleichst team mit einem Integer ;)
 
G

Gast2

Gast
Ach so... jetzt ist der Groschen gefallen :)

Java:
team.equals(((TeamEditorSite) obj).team.getId());
Du vergleichst team mit einem Integer ;)

wuäh das ist ausversehen da reingekommen. habs auch schon mit getId() versucht ändert nichts daran, aber ich teste es nochmal ^^...
 
M

maki

Gast
Verwendest du Spring(DM), Hibernate sonst etwas was einen dyn. Proxy erzeugen würde und diesen Vergleich fehlschlagen lassen würde:
Java:
getClass() != obj.getClass()
Ansosnten mal im Debugger gucken was equals so liefert.
 
G

Gast2

Gast
Verwendest du Spring(DM), Hibernate sonst etwas was einen dyn. Proxy erzeugen würde und diesen Vergleich fehlschlagen lassen würde:
Java:
getClass() != obj.getClass()
Ansosnten mal im Debugger gucken was equals so liefert.

Ja muss ich mal machen. Ich wollte mir mal kurz das obj ausgeben lassen, das hat aber irgendwie gar nicht geklappt.
Nee habs eigentlich mal ganz normal versucht ohne irgendwelche Persistenten Objekte und auch ohne Spring(DM)
 
G

Gast2

Gast
Okay habs jetzt mal zu probiert
Java:
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		TeamEditorInput other = (TeamEditorInput) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

Das klappt =)...
 
M

maki

Gast
:)
Nebenbei bemerkt, es ist nur in ausnahmefällen ok equals auf der DB id (technischer schlüssel) basieren zu lassen, meistens ist es nicht was man möchte.
Collections und Maps reagieren nicht so gut im allgemeinen wenn man zB. versucht 2 transiente Objekte ohne ID abzulegen, zu vergleichen, etc. pp.
 
G

Gast2

Gast
Har grad ga rnichts mit DB zu tun. Ich hatte einfach ein Objekt mit einer eindeutigen ID und ich wollte dass es dafür keine 2 Editoren gibt zum bearbeiten. Sonst muss ich ja immer alle offenen Editoren miteinander synchronisieren. Weißt wie ich mein?
 
G

Gast2

Gast
:oops:

Ok, jetzt hab ich verstanden ;)

haha um 3.49 uhr beantwortest du fragen...respekt!!! ;)

Aber irgendwie weiß ich noch nicht so recht, wo ich mein neues Objekt erzeugen soll? Also wenn ein neuer Editor aufgeht gibts es auch ein neues Objet, darum hab ich mit Spring(DM) und @Autowired im Editor selber drin, damit jedes wenn ein neuer Editor aufgeht ein neues Objekt erstellt wird. Aber irgendwie ist das mit der Id dann dumm, weil die bekomm ich ja eigentlich aus dem Objekt... Weißt du vielleicht wie man sowas am saubersten löst?
 
Zuletzt bearbeitet von einem Moderator:
M

maki

Gast
Bin mir nicht sicher ob ich dich richtig verstehe ;)

Prinzipiell ist das ja kein Eclispe RCP oder SpringDM Problem, sondern eher ein Problem deines Modells.
Hast du denn keine Factory oder ähnliches die deine Objekte erzeugt?

Nebenbei, als Hinweis zu Eclipse RCP & SpringDM, falls du das noch nicht kanntest: Tutorial: Spring OSGi + Eclipse RCP
 
G

Gast2

Gast
Bin mir nicht sicher ob ich dich richtig verstehe ;)

Prinzipiell ist das ja kein Eclispe RCP oder SpringDM Problem, sondern eher ein Problem deines Modells.
Hast du denn keine Factory oder ähnliches die deine Objekte erzeugt?

Nebenbei, als Hinweis zu Eclipse RCP & SpringDM, falls du das noch nicht kanntest: Tutorial: Spring OSGi + Eclipse RCP

Doch kenn ich schon =)...
Ja ne Factory hab ich mir auch überlegt,weiß aber nicht wie ich die gescheit mit Spring mach dazu hab ich einen Thread bei Spring aufgemacht... Ja eigentlich schon ein eclipseRCP Problem find ich.
Also wie kann ich so einen Handler mit SpringDM initalisieren damit ich die Facorty injezieren lassen kann?? Mit Views und Editoren habe ich es wie in dem Link gemacht. Aber mit nem Handler weiß ich es nicht.
Also würdemir sowas dann vorstellen.
Java:
public class CreateTeamEditor extends AbstractHandler{
 
@Autowired
    Factory factory;

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException { 
        try {
            HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().openEditor(new TeamEditorSite(factory.createFoo()), TeamEditor.ID);
        } catch (PartInitException e) {
            e.printStackTrace();
        }
        return null;
    }

Boah nur ab und zu mal privat was mit den Themen zu machen ist echt zu wenig ;)... Muss mal schauen ich eine Firma finde die sowas professionell macht, weil das Themengebiet echt interessant ist =)...
 
Zuletzt bearbeitet von einem Moderator:
M

maki

Gast
Also wie kann ich so einen Handler mit SpringDM initalisieren damit ich die Facorty injezieren lassen kann?? Mit Views und Editoren habe ich es wie in dem Link gemacht. Aber mit nem Handler weiß ich es nicht.
Würde sagen genauso wie mit Views & Editoren.

Boah nur ab und zu mal privat was mit den Themen zu machen ist echt zu wenig ... Muss mal schauen ich eine Firma finde die sowas professionell macht, weil das Themengebiet echt interessant ist =)...
Ja, das Thema ist wirklich interessant :)
Spring ist ja mehr oder weniger universell, man könnte anstatt SpringDM auch Declarative Services einsetzen.
Eclipse RCP finde ich sehr gut, wenn man sich mal auskennt kommt man sehr schnell voran, weil vieles schon fertig geliefert wird.
Die Lernkurve ist natürlich steil, sollten sich aber genug Firmen geben die sich dafür interessieren ;)
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Würde sagen genauso wie mit Views & Editoren.

Mhm muss ich mal testen, glaub zwar net wirklich so dran. Weil bei Views und Editoren man immer eine eindeutige ID mitgeben muss. Und die SpringExtensionFactory ja eine externe lib ist. Darum ka ob des so einfach klappt.

Aber leider weiß ich immer noch nicht wie man mit Spring so ne Factory gescheit aufbaut...

Die Lernkurve ist natürlich steil, sollten sich aber genug Firmen geben die sich dafür interessieren ;)

Ja muss ich mal schauen ;) denke lohnen würde sich sowas auf jeden Fall ;)... Bin jetzt erstmal auf dem javaforum in Stuttgart da gibt es auch 3 Beiträge zu dem Thema, bin ich auch mal gespannt =).
 
Zuletzt bearbeitet von einem Moderator:
M

maki

Gast
Mhm muss ich mal testen, glaub zwar net wirklich so dran. Weil bei Views und Editoren man immer eine eindeutige ID mitgeben muss. Und die SpringExtensionFactory ja eine externe lib ist. Darum ka ob des so einfach klappt.
Die id die du meinst ist die Comand ID, da steht ja auch der (Default-)Handler.

Könnte es morgen mal in der Arbeit testen, wüsste aber spontan keinen Grund, warum das nciht gehen sollte.
 
G

Gast2

Gast
Die id die du meinst ist die Comand ID, da steht ja auch der (Default-)Handler.

Könnte es morgen mal in der Arbeit testen, wüsste aber spontan keinen Grund, warum das nciht gehen sollte.

Habs hinbekommen, im plugin.xml im command wo die die klasse angibst macht man einfach genau das gleiche wie mit views und editoren. Die id kann man ja selber wählen hatte ich ganz vergessen, ist ja nur das mapping zu spring.xml.
org.eclipse.springframework.util.SpringExtensionFactory:(id in der spring.xml)

Okay jetzt hab ich einen Handler mit einer Factory. Aber da der Handler nur einmal erzeugt wird hat die facorty immer die gleiche Instanz. Wie muss dann die Factory aussehen, damit ich immer neue Instanzen bekomme. Hab mir gedacht ich kann in der Factory immer meine EditorInputs erzeugen lassen. Aber ich weiß noch nicht wie ich dann immer eine neue Instanz bekomme?

Handler
Java:
public class EditorHandler extends AbstractHandler{

	@Autowired
	private Factory factory;
	
	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {	
		System.out.println(factory);
		try {
			HandlerUtil.getActiveWorkbenchWindow(event).
			getActivePage().openEditor();
		} catch (PartInitException e) {
			e.printStackTrace();
		}
		return null;
	}

}

Java:
public class Factory {

	@Autowired
	private MyEditorInput editorInput;

	public MyEditorInput getMyEditorInput() {
		return editorInput;
	}
	
}
 
M

maki

Gast
Okay jetzt hab ich einen Handler mit einer Factory. Aber da der Handler nur einmal erzeugt wird hat die facorty immer die gleiche Instanz. Wie muss dann die Factory aussehen, damit ich immer neue Instanzen bekomme. Hab mir gedacht ich kann in der Factory immer meine EditorInputs erzeugen lassen. Aber ich weiß noch nicht wie ich dann immer eine neue Instanz bekomme?
Eigentlich ist es ja egal, ob der Handler & die Factory Singletons sind (hat aber vorteile ;)), die Factory braucht doch nur eine createBlaBlubbObject Methode, und liefert dann eine neue Instanz inkl. ID zurück.
Mit Spring muss diese Methode nicht statisch sein, kann aber, denn klassische Factoriy Methoden sind statisch.
 
G

Gast2

Gast
Eigentlich ist es ja egal, ob der Handler & die Factory Singletons sind (hat aber vorteile ;)), die Factory braucht doch nur eine createBlaBlubbObject Methode, und liefert dann eine neue Instanz inkl. ID zurück.
Mit Spring muss diese Methode nicht statisch sein, kann aber, denn klassische Factoriy Methoden sind statisch.

Joa das ist mir soweit klar =)...

Aber sowas hier ist doch nicht sauber?
Java:
public class Factory {

	public static X getX() {
		return new XImpl();
	}
	
}

Wie mach ich so eine Factory mit Spring ohne den Applicationcontext zu benutzen??? Geht sowas überhaupt?
 

Ähnliche Java Themen


Oben