# Eigene Projekte



## dzim (30. Jul 2008)

Tach zusammen,

ich wollte mal was loswerden: Wie kann man in einem Eclipse-Plugin / einer eigenen App eigene Projekte verwalten?
Es ist zwar nicht wirklich dringend für mich gerade zu wissen, aber dennoch bin ich da neulich in einige Probleme gerannt.
Ich wollte eine App erstellen, die ein paar einfache projekte mit ein paar xml-Dateien verwaltet (auch wenn ich das IFile-Ding von Eclipse noch nie weiter für solche Tasks verwendet hab).
Aber: Es wurden nie Projekte angezeigt - im workspace-Ordner waren sie präsent, das wars aber auch schon.
Ich hab verschiedene Sachen ausprobiert wie Navigator und andere - aber die Projekte wurden nie angezeigt.
Mir ist klar, das ich da wahrscheinlich viel von meinen bisherigen Gehabe aufgeben müsste, aber ich fände es interessant größere Projekte auch mal "vernünftig" anzugehen.

Wie sinnvoll ist eigentlich das IFile und artverwandte Klassen? Ich habe bisher immer das normale File-Objekt vorgezogen...

Grüße! ;-)
Daniel


----------



## Wildcard (30. Jul 2008)

dzim hat gesagt.:
			
		

> Wie sinnvoll ist eigentlich das IFile und artverwandte Klassen? Ich habe bisher immer das normale File-Objekt vorgezogen...


Dann frag dich mal, warum deine Projekte nirgends auftauchen. Der Eclipse Workspace wird nur über IResource/IFile/IProject/... oder allgemeiner über EFS manipuliert.
Alles andere existiert für Eclipse nicht. Ein Project ist sowieso etwas anderes als ein Verzeichnis im Workspace, ein Project hat Metadaten.


----------



## dzim (30. Jul 2008)

Ok, aber davon mal abgesehen hab ich ja erfolgreich über den new... project-Eintrag des Navigator-Kontextmenüs ein projekt angelegt, dass sogar das .project-File besaß.
Es wurde nur nichts angezeigt - oder ist sogar das Anzeigen des Projekts vollkommen meine Sache - sprich implementierungsabhängig. Ich hatte gedacht, das es erst ab dem Punkt über die Natures, Builder, Marker, blabla... wieder meine Sache wird - wenn ich schon das Navigator-Plug-In plus entsprechende Extensionpoints verwende...


----------



## Wildcard (30. Jul 2008)

Das Projekt anzulegen ist deine Sache, wenn es dein Wizard ist.
Projekte legt man mit der Eclipse API an (über den Workspace-Root), mit File geht das nicht.
Wenn die Antwort nicht zur Frage passt, bitte ich das zu Entschuldigen, du bist IMO sehr wenig konkret.


----------



## dzim (31. Jul 2008)

Also ich denke wir reden ein wenig aneinander vorbei.
Deswegen versuche ich es nochmal von vorne, vielleicht wird es dann etwas klarer:

* Habe das Navigator-Plug-In (Eclipse API) eingebunden (Sehe also den Project Explorer als View in meiner App)
* Nutze dort das Kontextmenü (wie man es von Eclipse schon kennt - es ist nur weitaus leerer (nur New Project, File, u.s.w.) und lege mir ein neues Eclipse-Projekt an (das einfachste, das keine weitere Funktionalität hat, ausser da zu sein)
* Es werden keine Projekte angezeigt, obwohl es auch keine Fehlermeldung beim Anlegen gab - versuche ich es erneut mit dem selben Namen: Eclipse-Fehlermeldung, dass das Projekt schon existiert
* schaue in den Workspace des ausgeführten Programms und sehe einen Ordner mit den Projektnamen und der .project-Datei

--> aber: Davon seh ich in meiner App nichts...

Ich hoffe, dass das mein Problem etwas besser schildern konnte...


----------



## Wildcard (31. Jul 2008)

Der ProjectExplorer ist eine äusserst dynmische View die auf dem CNF basiert. Sie zeigt nur den Content an, der von anderen PlugIns ins CNF eingeklinkt wurde. Klick mal auf Filters und dann available Content. Wenn du dort keinen Resource Content findest, fehlt dir wohl ein PlugIn.


----------



## dzim (31. Jul 2008)

Na gut.
Ich werde mir bei Befarf mal genau das zu Gemüte ziehen, da ich es ja eh noch nicht brauche - wobei ich das ganze schon künftig als Ausgangspunkt nutzen will. Aber man bekommt halt nicht immer was man will und so haben bisher die Programme / Plug-Ins die vollkommen von so was losgelöst waren (mit statischen Aufgaben u.s.w.) völlig ausgereicht...


----------



## dzim (1. Aug 2008)

Sagt mal, nachdem ich hier wohl offenbar Verwirrung gestiftet hab:
Könnt ihr mir verraten ob es wo Tutorials gibt, die den grundsätzlichen Aufbau von Apps mit Project-Explorer beschreiben?

Ich würde mich gern darin einarbeiten, habe aber bisher nix brauchbares gefunden...

Danke schon mal!


----------



## Wildcard (1. Aug 2008)

Es gibt noch nicht sehr viel Doku dazu, vielleicht schreibe ich mal eine.
Das hier ist ein Anfang.
http://scribbledideas.blogspot.com/2006/06/what-does-common-navigator-framework.html
Ansonsten, arbeite dich an den ExtensionPoints entlang, im Prinzip erstellst du erst NavigatorContent und machst dann ein ViewerContentBinding.
Die 3 zentralen Extension Points sind:
-org.eclipse.ui.navigator.viewer (der ProjectExplorer hat die ID org.eclipse.ui.navigator.ProjectExplorer)
-org.eclipse.ui.navigator.navigatorContent
-org.eclipse.ui.navigator.linkHelper

Wenn du lediglich Resourcen darstellen willst, sorg einfach dafür der der Resource Content vorhanden ist, oder verwende den guten alten Navigator.
Die Extension Points für den Content sind für advanced Anforderungen, wie zum Beispiel die Fähigkeit .java Klassen weiter aufklappen zu können.


----------



## dzim (4. Aug 2008)

Über das CNF bin ich irgendwann schon mal beim googlen gestolpert, und ich hatte es dann auch mal ausprobiert.
Aber trotzdem ich die Content und LabelProvider in der navigatorContent-Extension angegeben hatte, ist nix passiert (und ich glaube, da hatte ich tatsächlich mal IFile u.s.w. ausprobiert ;-) ).
Die linkHelper-Extension kannte ich noch nicht - muss ich also mal ausprobieren.
Die allgemeine viewer-Extension hatte mich ein wenig verwirrt, aber ich hatte auch eine eigene Klasse eines Navigators ausprobiert (was mit den restlichen gleichen Einstellungen keinen Unterschied machte).
Was mich aber wirklich etwas verwirrt hatte waren die Unterpunkte content- und actionBinding die bei mir testweise nur aus includes bestanden und dort jeweils content- bzw. actionBindings die wie folgt aussahen:

content (nur pattern - root hatte ich immer leer gelassen):
org.eclipse.ui.navigator.resourceContent
org.eclipse.ui.navigator.resources.filters.*
org.eclipse.ui.navigator.resources.linkHelper

action (nur pattern - root hatte ich immer leer gelassen):
org.eclipse.ui.navigator.resources.*

Wozu ich das allerdings mache - ich hab keine Ahnung... Sagen tut's mir nix (nur aus dem Paper der EclipseCon 2006 woe CNF vorgestellt wurde kopiert...)


----------



## Wildcard (4. Aug 2008)

Neuen Content im ProjectExplorer musst du (wenn du nicht enabledByDefault auf true setzt) in dessen Einstellungen aktivieren.


----------



## dzim (4. Aug 2008)

Sag mal Wildcard - kannst du mir verraten, welche Plug-Ins ich für mein Problemchen einbindem muss? ausser UI, views, ...
Da sind ja bestimmt welche mit Filesystem oder Resource nötig, oder?


----------



## Wildcard (4. Aug 2008)

Der Resource Content wird vom PlugIn org.eclipse.ui.navigator.resources beigesteuert.


----------



## dzim (4. Aug 2008)

Ich hab mir mal aus dem "Hello World RCP"-Template was versucht zu basteln

Meine plugin.xml

```
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>

   <extension
         id="application"
         point="org.eclipse.core.runtime.applications">
      <application>
         <run
               class="navigatortest.Application">
         </run>
      </application>
   </extension>
   <extension
         point="org.eclipse.ui.perspectives">
      <perspective
            name="RCP Perspective"
            class="navigatortest.Perspective"
            id="NavigatorTest.perspective">
      </perspective>
   </extension>
   <extension
         point="org.eclipse.ui.perspectiveExtensions">
      <perspectiveExtension
            targetID="*">
         <view
               closeable="true"
               id="org.eclipse.ui.navigator.ProjectExplorer"
               minimized="false"
               moveable="true"
               ratio="0.25"
               relationship="left"
               relative="org.eclipse.ui.editorss"
               showTitle="true"
               standalone="false"
               visible="true">
         </view>
      </perspectiveExtension>
   </extension>
   <extension
         point="org.eclipse.ui.navigator.navigatorContent">
      <navigatorContent
            activeByDefault="true"
            contentProvider="navigatortest.MainSSDTreeContentProvider"
            id="org.eclipse.ui.navigator.ProjectExplorerContent"
            labelProvider="navigatortest.MainSSDLabelProvider"
            name="Test Navigator Content">
      </navigatorContent>
   </extension>
   <extension
         point="org.eclipse.ui.navigator.linkHelper">
      <linkHelper
            class="navigatortest.NavigatorTestLinkHelper"
            id="NavigatorTest.NavigatorTestLinkHelper">
         <editorInputEnablement></editorInputEnablement>
      </linkHelper>
   </extension>
   <extension
         point="org.eclipse.ui.navigator.viewer">
      <viewer
            viewerId="org.eclipse.ui.navigator.ProjectExplorer">
         <popupMenu
               allowsPlatformContributions="true"
               id="org.eclipse.ui.navigator.ProjectExplorer#PopupMenu">
            <insertionPoint
                  name="group.new">
            </insertionPoint>
            <insertionPoint
                  name="group.open"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.openWith">
            </insertionPoint>
            <insertionPoint
                  name="group.edit"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.reorganize">
            </insertionPoint>
            <insertionPoint
                  name="group.port"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.build"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.generate"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.search"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="additions"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.properties"
                  separator="true">
            </insertionPoint>
         </popupMenu>
      </viewer>
      <viewerContentBinding
            viewerId="org.eclipse.ui.navigator.ProjectExplorer">
         <includes>
            <contentExtension
                  pattern="org.eclipse.ui.navigator.resourceContent">
            </contentExtension>
            <contentExtension
                  pattern="org.eclipse.ui.navigator.resources.filters.*">
            </contentExtension>
            <contentExtension
                  pattern="org.eclipse.ui.navigator.resources.linkHelper">
            </contentExtension>
         </includes>
      </viewerContentBinding>
      <viewerActionBinding
            viewerId="org.eclipse.ui.navigator.ProjectExplorer">
         <includes>
            <actionExtension
                  pattern="org.eclipse.ui.navigator.resources.*">
            </actionExtension>
         </includes>
      </viewerActionBinding>
   </extension>

</plugin>
```

Hab auch ui.navigator und ui.navigator.resource mit eingebunden.
Aber das Ergebnis ist wie immer...

Ach so - Provider:
Content:

```
package navigatortest;

import java.io.File;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;

public class MainSSDTreeContentProvider implements ITreeContentProvider {

	@Override
	public Object[] getChildren(Object parentElement) {

		if (parentElement instanceof IWorkspace) {
			IWorkspace ws = (IWorkspace) parentElement;
			return ws.getRoot().getProjects();
		}

		if (parentElement instanceof IProject) {
			IProject p = (IProject) parentElement;

			try {
				return p.getFolder(p.getProjectRelativePath()).members();
			} catch (CoreException e) {
				return null;
			}
		}

		if (parentElement instanceof IFolder) {
			IFolder iFolder = (IFolder) parentElement;
			IFile iFile = iFolder.getFile(iFolder.getProjectRelativePath());
			return iFile.getProjectRelativePath().toFile().listFiles();
		}

		if (parentElement instanceof IFile) {
			IFile iFile = (IFile) parentElement;
			return iFile.getProjectRelativePath().toFile().listFiles();
		}

		if (parentElement instanceof File) {

			File f = (File) parentElement;

			if (f.isFile()) {

				return null;

			} else if (f.isDirectory()) {

				return f.listFiles();
			}
		}

		return null;
	}

	@Override
	public Object getParent(Object element) {

		if (element instanceof IWorkspace) {
			return null;
		}

		if (element instanceof IProject) {
			IProject p = (IProject) element;
			return p.getWorkspace();
		}

		if (element instanceof IFolder) {
			IFolder f = (IFolder) element;
			return f.getProject();
		}

		if (element instanceof IFile) {
			IFile f = (IFile) element;
			return f.getProject().getFolder(f.getProjectRelativePath());
		}

		if (element instanceof File) {

			File f = (File) element;

			IProject[] ps = ResourcesPlugin.getWorkspace().getRoot()
					.getProjects();

			for (IProject p : ps) {

				if (p.getLocation().toFile().getAbsolutePath().equals(
						f.getAbsolutePath())) {
					return p;
				}
			}

			return f.getParentFile();

			// if
			// (!f.getParentFile().equals(Activator.getModel().getWorkspace()))
			// {
			// return f.getParentFile();
			//
			// }
		}

		return null;
	}

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

	@Override
	public Object[] getElements(Object inputElement) {
		return getChildren(inputElement);
	}

	@Override
	public void dispose() {

	}

	@Override
	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

	}

}
```

Label:

```
package navigatortest;

import java.io.File;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.graphics.Image;

public class MainSSDLabelProvider implements ILabelProvider {

	@Override
	public Image getImage(Object element) {
		return null;
	}

	@Override
	public String getText(Object element) {

		if (element instanceof String) {

			return (String) element;

		} else if (element instanceof File) {

			return ((File) element).getName();

		} else {

			if (element instanceof IProject) {
				return ((IProject) element).getName();
			}

			if (element instanceof IWorkspace) {
				return "";
			}

			if (element instanceof IFile) {
				return ((IFile) element).getName();
			}

			if (element instanceof IFolder) {
				return ((IFolder) element).getName();
			}

			return "";
		}
	}

	@Override
	public void addListener(ILabelProviderListener listener) {

	}

	@Override
	public void dispose() {

	}

	@Override
	public boolean isLabelProperty(Object element, String property) {
		return false;
	}

	@Override
	public void removeListener(ILabelProviderListener listener) {

	}
}
```

Ich hoffe es ist nicht zu großer Müll, was ich hier verzapft hab...

VG, Daniel


----------



## Wildcard (5. Aug 2008)

> Hab auch ui.navigator und ui.navigator.resource mit eingebunden.


Und wenn du die Filters im ProjectExplorer anklickst, was wird dann bei avaible content angezeigt?


----------



## dzim (7. Aug 2008)

eigentlich steht das "working sets" und "resources" - beides angeklickt.
Trotzdem nix. Aber vielleicht bin ich da auch gerade zu blöd zu...


----------



## Wildcard (7. Aug 2008)

Dann sollten eigentlich alle Projekte angezeigt werden (ohne zusätzlichen Code von dir).
Sind die Projekte vielleicht frisch erstellt und daher noch closed?
Mach mal den Filter für Closed Projects aus (falls aktiv)


----------



## dzim (7. Aug 2008)

hab keinen...

edit: hab doch einen  aber egal wie rum ich es mache - keine Änderung.
Hab auch einen *.class-Filter und den .*-Filter, aber egal ob ich da was an oder ausschalte, es passiert nichts...
Ehrlich - ich hab keine Ahnung was ich falsch mache.


----------



## dzim (8. Aug 2008)

Ich hab jetzt noch mal mir die extensions im navigator-plugin angeschaut und mir das enablement rauskopiert - no difference...


```
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>

   <extension
         id="application"
         point="org.eclipse.core.runtime.applications">
      <application>
         <run
               class="navigatortest.Application">
         </run>
      </application>
   </extension>
   <extension
         point="org.eclipse.ui.perspectives">
      <perspective
            name="RCP Perspective"
            class="navigatortest.Perspective"
            id="NavigatorTest.perspective">
      </perspective>
   </extension>
   <extension
         point="org.eclipse.ui.perspectiveExtensions">
      <perspectiveExtension
            targetID="*">
         <view
               closeable="true"
               id="org.eclipse.ui.navigator.ProjectExplorer"
               minimized="false"
               moveable="true"
               ratio="0.25"
               relationship="left"
               relative="org.eclipse.ui.editorss"
               showTitle="true"
               standalone="false"
               visible="true">
         </view>
      </perspectiveExtension>
   </extension>
   <extension
         point="org.eclipse.ui.navigator.navigatorContent">
      <navigatorContent
            activeByDefault="true"
            contentProvider="navigatortest.MainSSDTreeContentProvider"
            icon="icons/alt_window_16.gif"
            id="org.eclipse.ui.navigator.ProjectExplorerContent"
            labelProvider="navigatortest.MainSSDLabelProvider"
            name="Test Navigator Content">
         <enablement>
            <or>
               <adapt
                     type="org.eclipse.core.resources.IProject">
               </adapt>
               <instanceof
                     value="org.eclipse.core.resources.IResource">
               </instanceof>
            </or>
         </enablement>
      </navigatorContent>
   </extension>
   <extension
         point="org.eclipse.ui.navigator.linkHelper">
      <linkHelper
            class="navigatortest.NavigatorTestLinkHelper"
            id="NavigatorTest.NavigatorTestLinkHelper">
         <editorInputEnablement></editorInputEnablement>
      </linkHelper>
   </extension>
   <extension
         point="org.eclipse.ui.navigator.viewer">
      <viewer
            viewerId="org.eclipse.ui.navigator.ProjectExplorer">
         <popupMenu
               allowsPlatformContributions="true"
               id="org.eclipse.ui.navigator.ProjectExplorer#PopupMenu">
            <insertionPoint
                  name="group.new">
            </insertionPoint>
            <insertionPoint
                  name="group.open"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.openWith">
            </insertionPoint>
            <insertionPoint
                  name="group.edit"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.reorganize">
            </insertionPoint>
            <insertionPoint
                  name="group.port"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.build"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.generate"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.search"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="additions"
                  separator="true">
            </insertionPoint>
            <insertionPoint
                  name="group.properties"
                  separator="true">
            </insertionPoint>
         </popupMenu>
      </viewer>
      <viewerContentBinding
            viewerId="org.eclipse.ui.navigator.ProjectExplorer">
         <includes>
            <contentExtension
                  pattern="org.eclipse.ui.navigator.resourceContent">
            </contentExtension>
            <contentExtension
                  pattern="org.eclipse.ui.navigator.resources.filters.*">
            </contentExtension>
            <contentExtension
                  pattern="org.eclipse.ui.navigator.resources.linkHelper">
            </contentExtension>
            <contentExtension
                  pattern="org.eclipse.ui.navigator.resources.workingSets">
            </contentExtension>
         </includes>
      </viewerContentBinding>
      <viewerActionBinding
            viewerId="org.eclipse.ui.navigator.ProjectExplorer">
         <includes>
            <actionExtension
                  pattern="org.eclipse.ui.navigator.resources.*">
            </actionExtension>
         </includes>
      </viewerActionBinding>
      <dragAssistant
            class="org.eclipse.ui.navigator.resources.ResourceDragAdapterAssistant"
            viewerId="org.eclipse.ui.navigator.ProjectExplorer">
      </dragAssistant>
   </extension>

</plugin>
```

Ob es vielleicht was bringt, wenn ich einfach mal den CommonNavigator einbinde als View? Der hieß doch so, oder? der sollte ja unabhängig von meinem Mist gerade ja funktionieren...


----------



## ATR (4. Jan 2011)

Hallo dzim,

dein Post ist leider schon alt, ich stoße jetzt auch auf das gleiche Problem. Hast du mittlerweile eine Lösung gefunden?

Gruß,
Anna


----------

