DecoratinScheduler中有ManagedWorkbenchLabelDecorator
DecorationScheduler中有DecorationReference保存和element相关的信息,
DecoratingJavaLabelProvider 继承 DelegatingStyledCellLabelProvider
DelegatingStyledCellLabelProvider代理PackageExplorerLabelProvider
PackageExplorerLabelProvider继承JavaUILabelProvider,其中包含JavaElementLabel
JavaElementLabel对JREContainer的字符串做第一次装饰,除了获取字符内容外,还对vm版本进行颜色装饰。
JavaUILabel中的decorator(是个装饰器的list,但只有一个PackageExplorerProblemsDecorator)叠加
DecoratingStyledCellLabelProvider中对使用DecoratorManager中的ManagedWorkbenchLabelDecorator再进行一次装饰
将TreeItem中的data由原来的只有element数据,改变成数组,将element数据以及stylerange追加到里面
key为org.eclipse.jfacestyled_label_key_0
JavaElementImageProvider中对于ClasspathContainer是通过PackageFragmentRootContainer中的WorkbenchAdapterImpl获取的Image。
JavaUILabelProvider中的PorblemsLabelDecorator对于图片进行二次装饰,computeAdornmentFlags()
对于eclipse原本就支持的一个ProjectExplorer的视图中NavigatorDecoratingLabelProvider也是可以参考的例子,
其中的内置类StyledLabelProviderAdapter中包含的NavigatorContentServiceLabelProvider,会从NavigatorContentService中获取可能的label扩展点findPossibleLabelExtensions(),找到对应的JavaNavigatorLabelProvider(委托给PackageExplorerLabelProvider)来进行装饰,jdt在其基础上进行了基于javaproject的图片装饰,添加了“J“的小图标.
对于ProjectExplorer中的project的图片,Project类的getAdapter是WorkbenchProject(WorkbenchResource),通过该类找到了对应的基础图片。
WorkbenchPlugin中IEclipseContext获取sharedImages,WorkbenchImages持有sharedImages。
读取到了多个natureImage
ImageDescriptorRegistry中将ImageDescriptor转换创建成Image,并缓存起来。
此时已经是符合要求的overlay的图片。通过后续的装饰其实是装饰其他部位,比如该文件是否有问题。通过workspace.getMarkerManager().findMaxProblemSeverity来标记是否有问题,装饰图片的左下角的overlay。
ImageDescriptor的createImage方法中调用其子类的CompositeImageDescriptor的getImageData()方法,然后drawCompositeImage(),最终由JavaElementImageDescriptor实现。
对于PackageExplorerPart中的流程,是在JavaElementImageProvider进行computeDescriptor()中,没有走workbenchAdatper的流程,而是走自身的getJavaImageDescriptor()流程,但是从如下分支最终还是走到了获取WorkbenchAdapter中