我有一个 RCP 项目。我目前想修改项目资源管理器。我写了一个附加的 ContentProvider(实现 ICommonContentProvider)和一个附加的 LabelProvider(实现 ICommonLabelProvider)。在我的 plugin.xml 中,我添加了以下内容:
<extension
id="navigator-viewbinding"
point="org.eclipse.ui.navigator.viewer">
<viewerContentBinding
viewerId="org.eclipse.ui.navigator.ProjectExplorer">
<includes>
<contentExtension
isRoot="true"
pattern="de.myapp.application.EditorResourceContent">
</contentExtension>
</includes>
</viewerContentBinding>
</extension>
和:
<extension
id="navigator-content"
point="org.eclipse.ui.navigator.navigatorContent">
<navigatorContent
activeByDefault="true"
contentProvider="de.myapp.application.ProjectExplorerContentProvider"
icon="icon.gif"
id="de.myapp.application.EditorResourceContent"
labelProvider="de.myapp.application.ProjectExplorerLabelProvider"
name="Editor Decoration"
priority="highest">
<triggerPoints>
<or>
<instanceof
value="org.eclipse.core.resources.IFile">
</instanceof>
<instanceof
value="org.eclipse.core.resources.IFolder">
</instanceof>
<instanceof
value="org.eclipse.jdt.internal.core.PackageFragment">
</instanceof>
<instanceof
value="org.eclipse.core.resources.IWorkspaceRoot" />
<instanceof
value="org.eclipse.core.resources.IProject" />
</or>
</triggerPoints>
<possibleChildren>
<or>
<instanceof
value="org.eclipse.core.resources.IWorkspaceRoot" />
<instanceof
value="org.eclipse.core.resources.IProject" />
<instanceof
value="org.eclipse.core.resources.IResource" />
<instanceof
value="org.eclipse.core.resources.IFolder" />
<instanceof
value="org.eclipse.core.resources.IFile" />
<instanceof
value="org.eclipse.jdt.internal.core.PackageFragment" />
</or>
</possibleChildren>
</navigatorContent>
</extension>
当我启动编辑器时,项目资源管理器不会显示任何项目,直到我单击鼠标右键。然后加载所有项目。当我打开树时,我在修改后的图标上看不到错误标记,但会显示图标本身。我还看到包上的错误标记(未修改)。我什至看到了 egit 装饰器,但没有看到错误的红色标记。
我还提供了两个提供者,也许它会帮助我为我的两个问题提供一些提示。
内容提供商:
public class ProjectExplorerContentProvider implements
ICommonContentProvider
{
private static final Object[] NO_CHILDREN = {};
@Override
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
@Override
public Object[] getChildren(Object parentElement) {
Object[] children = null;
if(IWorkspaceRoot.class.isInstance(parentElement))
{
IProject[] projects = ((IWorkspaceRoot)parentElement).getProjects();
children = createParents(projects);
}
else
{
children = NO_CHILDREN;
}
return children;
}
private Object[] createParents(IProject[] projects)
{
Object[] result;
List<Object> list = new ArrayList<Object>();
for (int i = 0; i < projects.length; i++) {
try {
if(projects[i].hasNature("org.eclipse.xtext.ui.shared.xtextNature"))
list.add(projects[i]);
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
result = new Object[list.size()];
list.toArray(result);
return result;
}
@Override
public Object getParent(Object element) {
Object parent = null;
if(IProject.class.isInstance(element))
{
parent = ((IProject)element).getWorkspace().getRoot();
}
return parent;
}
@Override
public boolean hasChildren(Object element) {
boolean hasChildren = false;
if(IWorkspaceRoot.class.isInstance(element))
{
hasChildren = ((IWorkspaceRoot)element).getProjects().length > 0;
}
return hasChildren;
}
@Override
public void restoreState(IMemento aMemento) {
}
@Override
public void saveState(IMemento aMemento) {
}
@Override
public void init(ICommonContentExtensionSite aConfig) {
}
}
这里是 LabelProvider:
public class ProjectExplorerLabelProvider implements ICommonLabelProvider{
/****/
@Override
public void addListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public boolean isLabelProperty(Object element, String property) {
// TODO Auto-generated method stub
return false;
}
@Override
public void removeListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub
}
@Override
public Image getImage(Object anElement) {
if (anElement instanceof File) {
File fi = (File) anElement;
if (fi.getFileExtension().equalsIgnoreCase("mydsl")) {
return Activator.getImage("icons/img1.png");
} else {
try {
InputStream inputStream = fi.getContents();
String content =
ContentFactory.getInstance().toStringInputStream(inputStream);
inputStream.close();
if (content.contains("some string")) {
return Activator.getImage("icons/img2.png");
} else if (content.contains("some other string")) {
return Activator.getImage("icons/img3.png");
} else if (content.contains("some other string")) {
return Activator.getImage("icons/img4.png");
}
} catch (CoreException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
} else if (anElement instanceof Folder) {
Folder fo = (Folder) anElement;
}
else if (anElement instanceof PackageFragment) {
PackageFragment pf = (PackageFragment) anElement;
}
}
return null;
}
@Override
public String getText(Object element) {
// TODO Auto-generated method stub
return null;
}
@Override
public void restoreState(IMemento aMemento) {
// TODO Auto-generated method stub
}
@Override
public void saveState(IMemento aMemento) {
// TODO Auto-generated method stub
}
@Override
public String getDescription(Object anElement) {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ICommonContentExtensionSite aConfig) {
}
}