# Wiederverwendung von Eclipse Images & "Öffnen mit..."



## Gonzo17 (14. Dez 2009)

Hallihallo,

ich hab mal zwei kleine Fragen, wobei sich die erste vielleicht allgemein auf Plug-Ins bezieht, die zweite jedoch speziell auf RCP, weil es darum geht, wie ich meine Standalone Anwendung modifizieren kann.

Im Titel steht es schon, ich würde gerne erstmal wissen, wie man Images von Eclipse wiederverwenden kann. Ich hab bisher nur die Klassen "WorkbenchImages" und "IDEInternalWorkbenchImages" gefunden, aber beide beinhalten nicht die Images, die ich gerade bräuchte. Ich persönlich bräuchte gerade das Image, das unter New > General > Project zu sehen ist. Aber auch generell stellt sich mir die Frage, wie ich relativ problemlos Bilder von Eclipse und auch von anderen Plug-Ins nutzen kann. 
Ich habe das jetzt mal so gelöst: 


```
URL imageURL = Platform.getBundle("org.eclipse.wst.xml.ui")
				.getResource("/icons/XMLFile.gif");
		ImageDescriptor imageDesc = imageURL == null ? null : ImageDescriptor
				.createFromURL(imageURL);
```

Da krieg ich jetzt das Image (bzw den ImageDescriptor) für das XML aus dem entsprechenden Plug-In. Geht das nur so? Gerade bei Eclipse-Images hatte ich gehofft, dass das einfacher geht.

Meine nächste Frage ist jetzt etwas spezieller auf RCP bezogen. Wenn ich mein Product exportiere, dann hab ich ja ein Standalone, das sich über eine .exe öffnen lässt. Jetzt möchte ich aber auch, dass ich ne beliebige Datei aus dem Explorer per Rechtsklick > "Öffnen mit" in meinem Standalone öffnen kann. Ich hab leider garkeinen Ansatz, wie das funktionieren soll. Ich schätze mal da wird ganz normal das Programm gestartet (zumindest sah das bei den Tests so aus), allerdings muss wohl irgendwo ein Parameter übergeben werden (vll steht da URI drin oder so?), damit ich auch was damit anfangen kann. Hat jemand ne Idee? Oder geht das garnich? Ich wäre schon dankbar, wenn jemand nen Ansatz hätte, wo ich forschen könnte.


----------



## Sonecc (14. Dez 2009)

ich hab jetzt nicht nachgeschaut oder es überprüft, aber ich meine mich erinnern zu können, dass eclipse die Kommandozeilenargumente irgendwo sichert, so dass man sie in der RCP abrufen kann...
Wenn du nun beim Start der Anwendung prüfst, ob ein Parameter "openFile" (o.ä. wie auch immer der bei dir heißen soll) existiert und den Pfad ermittelst (der vl im Parameter steht), dann kannst du sicher auch den passenden Editor öffnen.

Edit meint ich soll erwähnen, dass es Platform.getCommandLineArguments() ö.ä war
Und nochmal Edit... Sie meint ich sollte auch noch das hier erwähnen: Eclipse-Icons - Nur Scheuer Blog


----------



## Gonzo17 (14. Dez 2009)

Sonecc hat gesagt.:


> ich hab jetzt nicht nachgeschaut oder es überprüft, aber ich meine mich erinnern zu können, dass eclipse die Kommandozeilenargumente irgendwo sichert, so dass man sie in der RCP abrufen kann...
> Wenn du nun beim Start der Anwendung prüfst, ob ein Parameter "openFile" (o.ä. wie auch immer der bei dir heißen soll) existiert und den Pfad ermittelst (der vl im Parameter steht), dann kannst du sicher auch den passenden Editor öffnen.
> 
> Edit meint ich soll erwähnen, dass es Platform.getCommandLineArguments() ö.ä war



Ja, wie ich nen Editor dann öffne, wenn ich das entsprechende File hab, das bekomme ich hin. Vielen Dank für deine Idee, ich werds mir anschauen. 



Sonecc hat gesagt.:


> Und nochmal Edit... Sie meint ich sollte auch noch das hier erwähnen: Eclipse-Icons - Nur Scheuer Blog



Hm, das möchte ich eben möglichst vermeiden. Ich will nicht Icons nochmal verwenden müssen, die schonmal irgendwo in irgendnem Plug-In liegen, ich möchte mein Programm möglichst klein halten. Deswegen tu ich auch lieber so wie oben beschrieben dann das Image im Plug-In suchen als es neu einzubinden.


----------



## Sonecc (14. Dez 2009)

Hast irgendwie recht, vl hilft dir folgender Link (ebenfalls nicht getestet)
Sag bitte bescheid, ob das geht oder nicht 

[news.eclipse.platform.swt] Re: Eclipse Icons


----------



## Gonzo17 (14. Dez 2009)

Generell funktioniert es, danke. Ich verstehe nicht so ganz, weshalb man das in so viele Klassen einteilt, aber gut. Allerdings funktioniert es nicht bei den Projekt-Images im normalen Navigator View. Die wurden vorher schon nicht angezeigt und werden es jetzt immer noch nicht. Erster Lösungsvorschlag:


```
Bundle ideBundle = Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH);

		String banner = "icons/full/obj16/prj_obj.gif"; //$NON-NLS-1$
		URL url = ideBundle.getEntry(banner);
		ImageDescriptor desc = ImageDescriptor.createFromURL(url);
		configurer.declareImage(SharedImages.IMG_OBJ_PROJECT, desc, true);
```

Wenn man jetzt aber aufs Verrecken die Grafik eines geschlossenen Projekts nicht findet, dann bringt das auch nicht viel. :autsch:


----------



## Gonzo17 (17. Dez 2009)

Gonzo17 hat gesagt.:


> Meine nächste Frage ist jetzt etwas spezieller auf RCP bezogen. Wenn ich mein Product exportiere, dann hab ich ja ein Standalone, das sich über eine .exe öffnen lässt. Jetzt möchte ich aber auch, dass ich ne beliebige Datei aus dem Explorer per Rechtsklick > "Öffnen mit" in meinem Standalone öffnen kann. Ich hab leider garkeinen Ansatz, wie das funktionieren soll. Ich schätze mal da wird ganz normal das Programm gestartet (zumindest sah das bei den Tests so aus), allerdings muss wohl irgendwo ein Parameter übergeben werden (vll steht da URI drin oder so?), damit ich auch was damit anfangen kann. Hat jemand ne Idee? Oder geht das garnich? Ich wäre schon dankbar, wenn jemand nen Ansatz hätte, wo ich forschen könnte.



Bezüglich diesem Thema hätte ich noch ne Frage. Also prinzipiell funktionierts wunderbar, wenn ich die Kommandozeilen-Argumente auswerte und die Dateien im Editor öffne. Aber nun gibts ein Problem, das wohl eclipse-spezifisch ist. Wähle ich eine beliebige Datei im Dateisystem, macht Rechtsklickt und wähle bei "Öffnen mit" meine Anwendung, dann startet meine Anwendung zwar brav, aber der Workspace ist nun auf einmal dort, wo die Datei liegt. Ich möchte nicht, dass der Workspace überhaupt irgendwie ohne nachzufragen geändert wird und am liebsten wär mirs, wenn er erstmal so oder so fest bleibt. Wie kann ich verhindern, dass der Workspace sicher ändert?


----------



## Wildcard (17. Dez 2009)

Wie ist dein RCP Konfiguriert? In /configuration/config.ini kann zB eine Default Workspace Location hinterlegt werden:
osgi.instance.area.default=@user.home/workspace
Zusätzlich kann (wenn dein RCP so konfiguriert wurde) auch einfach der letzte verwendet werden. Siehe dazu in /configuration/.settings/org.eclipse.ui.ide.prefs
Die dritte Möglichkeit ist die Kommandozeile. Der -data Parameter steuert den Workspace.
Die Frage ist also wie ist dein RCP Konfiguriert und wie genau wird er gestartet (Kommandozeile).

Zu Images: Ja, das ist kompliziert, weil diese Icons nicht öffentlich sind, sondern interna des Bundles. Sie zu verwenden setzt dich dem Risiko aus das sie im nächsten Release einfach verschwunden sind.
Wenn ein Bundle Images explizit veröffentlichen will und dir zusichert das es dort auch ein Zukunft ein Bild gibt, dann hat es in der Regel ein ISharedImages Interface aus dem du dich bedienen darfst (wenn es nicht als internal markiert ist).


----------



## Gonzo17 (18. Dez 2009)

Wildcard hat gesagt.:


> Wie ist dein RCP Konfiguriert? In /configuration/config.ini kann zB eine Default Workspace Location hinterlegt werden:
> osgi.instance.area.default=@user.home/workspace
> Zusätzlich kann (wenn dein RCP so konfiguriert wurde) auch einfach der letzte verwendet werden. Siehe dazu in /configuration/.settings/org.eclipse.ui.ide.prefs
> Die dritte Möglichkeit ist die Kommandozeile. Der -data Parameter steuert den Workspace.
> Die Frage ist also wie ist dein RCP Konfiguriert und wie genau wird er gestartet (Kommandozeile).



Ok, vielen Dank auf jeden Fall mal.  Ich werde mal ein bisschen experimentieren. 
Zu meinen Konfigurationen kann ich nicht viel sagen, ich habe eigentlich nicht viel an den Standard-Konfigurationen eines RCP Plug-Ins geändert, weil das aktuelle Projekt noch nicht so alt ist. Die Frage ist, ob der User seinen Workspace ändern darf oder nicht, das muss ich mir noch überlegen. Ansonsten könnte ich einfach immer nen festen Parameter in der Kommandozeile hinzufügen. 




Wildcard hat gesagt.:


> Zu Images: Ja, das ist kompliziert, weil diese Icons nicht öffentlich sind, sondern interna des Bundles. Sie zu verwenden setzt dich dem Risiko aus das sie im nächsten Release einfach verschwunden sind.
> Wenn ein Bundle Images explizit veröffentlichen will und dir zusichert das es dort auch ein Zukunft ein Bild gibt, dann hat es in der Regel ein ISharedImages Interface aus dem du dich bedienen darfst (wenn es nicht als internal markiert ist).



Nungut, dann muss ich damit erstmal leben. Klappt bisher ja problemlos.


----------



## Gonzo17 (21. Dez 2009)

Hm, hab mal ein bisschen getestet.



Wildcard hat gesagt.:


> Wie ist dein RCP Konfiguriert? In /configuration/config.ini kann zB eine Default Workspace Location hinterlegt werden:
> osgi.instance.area.default=@user.home/workspace



Ich will nicht das Benutzverzeichnis als Überverzeichnis meines Workspaces, sondern genau den Ordner, in dem meine RCP Application liegt. Das wäre dann statt user.home eben user.dir. Das Problem dabei ist ja aber, dass user.dir sich ändert, wenn ich von einem andern Punkte aus ändere. Öffne ich eine Datei mit dem Pfad F:\test\test.xml, dann ist user.dir doch F:\test, oder nicht? Und genau das ist ja dann das Problem. Ich möchte immer den gleichen Pfad zum Workspace. Nur wie weiss meine Anwendung, wo sie liegt?




Wildcard hat gesagt.:


> Zusätzlich kann (wenn dein RCP so konfiguriert wurde) auch einfach der letzte verwendet werden. Siehe dazu in /configuration/.settings/org.eclipse.ui.ide.prefs



Dazu hab ich leider nichts gefunden, einen Ordner .settings gibts in meinem configuration-Ordner auch nicht. Vielleicht muss ich da irgendwas einstellen, damit diese Einstellung gesetzt und benutzt wird?




Wildcard hat gesagt.:


> Die dritte Möglichkeit ist die Kommandozeile. Der -data Parameter steuert den Workspace.
> Die Frage ist also wie ist dein RCP Konfiguriert und wie genau wird er gestartet (Kommandozeile).



Da hab ich ja wieder ein ähnliches Problem. Klar, funktioniert natürlich auch hier. Aber wie gebe ich einen "nicht hartkodierten" Pfad ein? Gibts irgendne Variable, die meiner Anwendung sagt, wo sie ist?


Zu allem Überfluss hab ich jetzt auch noch das seltsame Problem, dass ich meine .exe zwar über "Öffnen Mit" auswählen kann, die erscheint aber dann trotzdem nicht in der Liste, der Programme, die man auswählen kann. Das ist erst seit heute irgendwann so und ich weiss ehrlich gesagt nicht warum. Die Änderung, die ich zuvor gemacht hab (vorher gings, danach nichmehr) war lediglich die Launching Arguments anzupassen. Auch wenn ich die zurücksetze funktionierts nicht. :bahnhof:


----------



## Wildcard (21. Dez 2009)

Du bist dir bewusst das es üblich ist nicht mit root Rechten zu arbeiten? Programme zu installieren ist ein administrativer Task. Ein Benutzer mit root Rechten wird deinen RCP also installieren nach, sagen wir /opt/deinRCP auf einer Linux Kiste oder C:\Programme\deinRCP auf einer Windows Kiste.
Der Benutzer der das Programm später verwenden soll hat dort kein Schreibrecht, kann dort also auch keinen Workspace anlegen. Sicher das du das so haben willst?


----------



## Gonzo17 (22. Dez 2009)

Wildcard hat gesagt.:


> Der Benutzer der das Programm später verwenden soll hat dort kein Schreibrecht, kann dort also auch keinen Workspace anlegen. Sicher das du das so haben willst?



Das stimmt schon, aber so wie ich das beobachtet habe legt jede RCP Application einen eigenen Workspace im Ordner an. 
Anfangs sieht es so aus. Meine Ordner mit der Anwendung liegt meinetwegen unter C:\Programme\meinRCP mit den Unterordnern "configuration" und "plugins", sowie einer .ini-Datei, einer .exe-Datei und einem ".eclipseproduct". Habe ich nun nirgends (zB per Parameter data) einen Workspace festgelegt, dann wird beim Starten der Anwendung automatisch ein Workspace in diesem Ordner "meinRCP" angelegt. Das geschieht doch unabhängig von den Rechten des Nutzers oder der Lage des Ordners oder irre ich mich? Weil das ist ja auch ganz genau das, was ich will. Dieser Workspace soll genutzt werden und vorerst mal kein anderer. Nur das Problem, das jetzt eben auftritt, wenn ich ne beliebige Datei wie oben beschrieben öffnen möchte, ist eben, dass der Workspace sich ändert, obwohl er das nicht soll.


----------



## Wildcard (22. Dez 2009)

Du irrst dich. Wenn deine Applikation einen Workspace anlegen möchte, das aufgrund der Rechte aber nicht kann, dann wird sie wohl gar nicht starten. Brauchst du denn überhaupt einen Workspace? Und wenn ja, warum legst du ihn dann nicht einfach in User Home und konfigurierst das beim Starten kein Prompt nach dem Workspace erfolgen soll?


----------



## Gonzo17 (22. Dez 2009)

Wildcard hat gesagt.:


> Brauchst du denn überhaupt einen Workspace?



Ja, den brauch ich.



Wildcard hat gesagt.:


> Und wenn ja, warum legst du ihn dann nicht einfach in User Home und konfigurierst das beim Starten kein Prompt nach dem Workspace erfolgen soll?



Hm, den ins User-Verzeichnis zu legen wäre ne Überlegung. Aber was ist denn ein "Prompt"?

Edit:
Nungut, ich wollte es jetzt umstellen, dass der Workspace nicht mehr fest ist, sondern (wie in Eclipse) ausgewählt werden kann. Und dazu gleich die Frage. Wie kann ich den Dialog zum Wählen des Workspaces direkt beim Start der Anwendung aufrufen? Und wenn ich dann in meiner Anwendung bin und "Switch Workspace" wähle, dann funktioniert das nur, wenn ich den Parameter vm gesetzt habe, allerdings tut er beim Neustart trotzdem noch den alten Workspace nehmen (der Parameter data ändert sich einfach nicht ???:L). Gibts da vielleicht irgendwo ein kleines Tutorial, wie man die Sache mit den Workspaces in Eclipse regelt bei nem eigenen RCP Projekt?


----------



## Wildcard (22. Dez 2009)

Der Dialog am Anfang bei dem du einen Workspace auswählen kannst. Den kannst du per Konfiguration abschalten.


----------



## Gonzo17 (22. Dez 2009)

Jetzt hast du schneller geantwortet als ich editiert hab.


----------

