# Eclipse Editor Plugin selektiert Projekt nicht



## 3n00b (7. Feb 2012)

Hallo!

Ich habe ein Multipage-Editor Plugin für Eclipse geschrieben um Konfigurationsdateien komfortabel editieren zu können. Wenn der Editor aktiv ist wird jedoch das Projekt welches die editierte Datei enthält nicht selektiert/aktiviert. Das äußert sich z.B. darin das der Build-Button ausgegraut ist wärend man im Editor arbeitet.

Ich habe nun schon Stunden mit der Suche verbracht, habe aber leider keine Idee was ich ändern muss um die Beziehung zwischen Editor, Datei und Projekt herstellen zu können. Ich hoffe hier im Forum hat jemand eine Idee und kann mir weiterhelfen?


----------



## Wildcard (7. Feb 2012)

Du redest von Project Explorer/Package Explorer?
Diese beiden Views haben einen 'Link Selection' Button. Der führt dazu, dass die aktuell editierte Datei selektiert wird, nicht jedoch das Projekt. Insofern weiß ich nicht wie du auf die Idee kommst, dass das Projekt selektiert werden sollte.


----------



## 3n00b (8. Feb 2012)

Der "Link with Editor"-Button im Project Explorer arbeitet korrekt. Also die Datei wird richtig selektiert wenn mein Editor aktiv ist. Was ich aber leider nicht hinbekomme ist, dass der Project-Build-Button zusammen mit meinem Editor funktioniert.

Wenn eine Datei aus dem Project Explorer in meinem Editor geöffnet wurde, sollte man in der Lage sein über den "Build"-Button ("Build the active configurations of the selected projects") das aktuelle Projekt zu bauen, so wie es mit dem Default-Editor auch möglich ist. Wenn jetzt aber mein eigener Editor aktiv ist wird der Build-Button ausgegraut, da Eclipse die Datei vermutlich keinem Projekt zuordnen kann, bzw. mein Editor kein Projekt "selektiert". Meine Frage ist wie ich genau das bewerkstelligen kann.


----------



## Wildcard (8. Feb 2012)

Ich hab keine Ahnung was der 'Build Button' sein soll. Kannst du mal ein Screenshot posten


----------



## 3n00b (9. Feb 2012)

Das ist der Button mit dem Hammer-Symbol in der Symbol-Leiste des Hauptfensters. Auch zu finden über das Menü (project >> make target >> build...) oder durch drücken von SHIFT+F9.

Diese Aktion startet den Build-Vorgang der aktuell selektierten Projekte, abhängig von den jeweiligen Projekt-Einstellungen.


----------



## 3n00b (9. Feb 2012)

Der Build-Button ist zum Beispiel in der C/C++ Perspective sichtbar (CDT Plugins).

Das der Build Button nicht funktioniert ist aber nur ein Effekt. Ein weiterer ist das die Projekt-Team-Verwaltung keine Benachrichtigung bekommt wenn eine Datei unter Versionskontrolle in meinem Editor bearbeitet wird (für ein automatisches Check-out notwendig). Vermutlich geschieht dies aus denselben Gründen warum auch der Build-Button nicht funktioniert, da die Zuordnung von Datei zum Projekt und damit der Team-Kontrolle nicht funktioniert.


----------



## Wildcard (9. Feb 2012)

Dieser Build Button ist dann C spezifisch. Du musst dir also dessen Implementierung ansehen, oder in der CDT Developer Doku falls dazu etwas vermerkt ist.



> Ein weiterer ist das die Projekt-Team-Verwaltung keine Benachrichtigung bekommt wenn eine Datei unter Versionskontrolle in meinem Editor bearbeitet wird (für ein automatisches Check-out notwendig). Vermutlich geschieht dies aus denselben Gründen warum auch der Build-Button nicht funktioniert, da die Zuordnung von Datei zum Projekt und damit der Team-Kontrolle nicht funktioniert.


Ich weiß wirklich nicht was du dir darunter vorstellst. Es gibt keine Datei Projektzuordnung, ausser das ein IFile sein Projekt kennt (und das geschieht ohne dein Zutun).
Es gibt auch nicht *die* Teamkontrolle, alles in Eclipse ist Modular. Es gibt verschiedene Team Provider wie CVS, SVN, Git. Die funktionieren normalerweise über Resource Change Events, werden also aktiv wenn du eine Datei über die IFile API veränderst. Aber was genau passiert hängt vom konkreten Team Provider ab. Also ohne mehr Informationen zu haben kann ich dir nicht helfen.


----------



## 3n00b (10. Feb 2012)

Es gibt zwar nicht "die" Team-Kontrolle, aber alle sollten auf demselben Mechansimus (IFile Events?) aufbauen (oder gibt es noch andere Möglichkeiten Dateiänderungen mitgeteilt zu bekommen?). Somit sollte das eigentlich für meinen Editor auch funktionieren, zumindest wenn ich dort keinen Fehler habe. Ich werde mir mal die CDT Implementierung genauer ansehen, vielleicht finde ich dort heraus warum der Build-Button nicht funktioniert.

Vielen Dank für die Hilfe!


----------



## 3n00b (10. Feb 2012)

Für das Problem mit dem CDT Build-Button könnten die folgenden Zeilen aus org.eclipse.cdt.ui.actions.ChangeBuildConfigActionBase relevant sein. Für meinen Form-Editor wird anscheinend kein Projekt zur Liste (fProjects) hinzugefügt. Ich werde das mal näher untersuchen.

[JAVA=151]
	/**
	 * selectionChanged() event handler. Fills the list of managed-built projects 
	 * based on the selection. If some non-managed-built projects are selected,
	 * disables the action. 
	 * @param action The action
	 * @param selection The selection
	 */
	protected void onSelectionChanged(IAction action, ISelection selection) {
		fProjects.clear();

		boolean badObject = false;

		if (selection != null )
		{
			if (selection instanceof IStructuredSelection) {
				if (selection.isEmpty()) {
					// could be a form editor or something.  try to get the project from the active part
					IWorkbenchPage page = CUIPlugin.getActivePage();
					if (page != null) {
						IWorkbenchPart part = page.getActivePart();
						if (part != null) {
							Object o = part.getAdapter(IResource.class);
							if (o != null && o instanceof IResource) {
								fProjects.add(((IResource)o).getProject());
							}
						}
					}
				}
[/code]


----------



## 3n00b (10. Feb 2012)

Wie es aussieht fehlt meiner EditorPart Klasse nur das IResource Adapter. CDT ermittelt das zugehörige Projekt über die Funktion IResource.getProject(). Die Lösung meines Problems ist folgende Methode in meiner EditorPart Klasse:


```
public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
      if (IResource.class.equals(adapter)) {
         try {   
            return ((IFileEditorInput)getEditorInput()).getFile().getAdapter(adapter);
         }
         catch(Exception e) {
         }
      }
      
      return super.getAdapter(adapter);
   }
```


----------



## Wildcard (10. Feb 2012)

Eher so:

```
if (IResource.class.equals(adapter)) {
         try {   
            return ((IFileEditorInput)getEditorInput()).getFile();
         }
         catch(Exception e) {
         }
      }
```


----------

