修改 Eclipse Project Explorer 导致启动后出现问题

Modify Eclipse Project Explorer causing Issues after StartUp

我有一个 RCP 项目。我目前想修改 Project Explorer。我写了一个额外的 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>

当我启动编辑器时,Project Explorer 不会显示任何项目,直到我单击鼠标右键。然后加载所有项目。当我打开树时,我在修改后的图标上看不到错误标记,但显示了图标本身。我还看到了包上的错误标记(未修改)。我什至看到了 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) {

}

}

When I start the Editor, the Project Explorer won't show any projects, until I make a right mouse click. Then all projects are loaded.

对于这个问题你可以试试这个:

Update 2015-08-24: if in the final application the ProjectExplorer content is not visible by its own (but only after you forced an updated, e.g., via opening the context menu with a right-click), try this: override the getDefaultPageInput() method of the ApplicationWorkbenchAdvisor and add the following line:

return ResourcesPlugin.getWorkspace().getRoot();

来源:

https://dirksmetric.wordpress.com/2012/08/01/tutorial-eclipse-rcp-e4-with-3-x-views-like-project-explorer-properties-etc/

When I open the tree, I see no error markers on my modified icons, but the icons themself are shown.

我想你用装饰覆盖了图标?所以很明显上面没有装饰