




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
eclipse插件开发-打开编辑器(上)【打开editor的接口讨论】 先来看一下workbench吧,workbench从静态划分应该大致如下: 从结构图我们大致就可以猜测出来,workbench page作为一个IWorkbenchPart(无论是eidtor part还是view part)的容器,肯定会接受workbench page的管理。看了一下,IWorkbenchPage接口定义中确实提供给了如下打开编辑器的操作:【IWokbenchPage提供的接口】1publicinterfaceIWorkbenchPageextendsIPartService, ISelectionService,ICompatibleWorkbenchPage 23publicIEditorPart openEdito(IEditorInput input, String editorId)throwsPartInitException;45publicIEditorPart openEdito(IEditorInput input, String editorId,booleanactivate)throwsPartInitException;67publicIEditorPart openEditor(finalIEditorInput input,finalString editorId,finalbooleanactivate,finalintmatchFlags)throwsPartInitException;8 那到这边,可能很多人已经知道了怎么调用这些接口了:PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(.) (说明:PlatformUI可以看作是整个eclipse ui框架的门面类,当然最核心的作用就是让用户获取到workbench。Eclipse中存在的其他一些门面类如:ResourcesPlugin、Platform、JavaCore、JavaUI等) 我们再仔细看一下IWorkbenchPage对应的实现类(ernal.WorkbenchPage)中的以上接口的实现代码,真正在管理Editor的是一个叫做EditorManager的东东(同理,view part对应的管理器角色类是叫做ViewFactory的东东)。这里的EditorManager和View Factory是workbench实现中非常精华的部分,看一下里面的实现就会很大程度上理解workbench所谓懒加载、懒初始化是如何实现的了,如何实现part 复用的.等等。 上图就用来说明workbench是如何来管理各种part的,其中descriptor角色的核心作用是延迟加载扩展(延迟加载用户通过editors或者views提供的扩展),reference角色的核心作用是用来延迟初时化具体的part(例如避免过早的创建对应的control等等)。再说下去有点偏离主题了,这部分,以后有时间再写【IDE工具类提供的接口】 上面IWorkbenchPage提供接口都需要用户准备两样东西:一是创建IEditorInput实例,二是指定editor id。有些用户可能不想干这两件事情,所以在工具类org.eclipse.ui.ide.IDE中提供了其他的接口:1publicstaticIEditorPart openEditor(IWorkbenchPage page, IFile input)throwsPartInitException 23publicstaticIEditorPart openEditor(IWorkbenchPage page, IFile input,booleanactivate)throwsPartInitException 45publicstaticIEditorPart openEditor(IWorkbenchPage page, IFile input,booleanactivate,booleandetermineContentType) 67publicstaticIEditorPart openEditor(IWorkbenchPage page, IFile input, String editorId)throwsPartInitException 89publicstaticIEditorPart openEditor(IWorkbenchPage page, IFile input, String editorId,booleanactivate)throwsPartInitException 1011 上面5个接口操作中, 对于上面的三个操作,Eclipse会自动为你准备IEditorInput实例,并动态绑定合适的编辑器类型。对于下面的两个操作,Eclipse会为你自动准备IEditorInput实例,但是需要用户自己指定editor id。 接下来我们看两个问题,一是如何创建IEditorInput实例的;而是如何动态计算对应的editor id的。 【有关FileEditorInput】 在IDE工具类中提供的5个接受IFile对象的openEditor接口中,在对应的实现中都是默认构造了一个FileEditorInput(org.eclipse.ui.part.FileEditorInput)实例,这个实例也是org.eclipse.ui.IFileEditorInput接口的默认实现类(注意:Eclipse中很多地方都使用这种Interface/Default Impl的方式,Interface会暴露,Default Impl则根据情况选择是否暴露,一般是如果Interface希望用户来扩展继承,则会暴露对应的Default Impl,如果Interface不希望用户来扩展继承,例如IResource系列接口,则一般会将Default Impl丢如对应的internal包中)。 我们看一下org.eclipse.ui.part.FileEditorInput中是如何实现IEditorInput.exists()接口的:1publicclassFileEditorInputimplementsIFileEditorInput,IPathEditorInput,IPersistableElement 2privateIFile file;34publicbooleanexists() 5returnfile.exists();6 7 我们看到内部的实现是持有了IFile句柄,如果IFile代表的资源没有存在于工作区之内,那么就会返回false。(疑问:如果我们打开工作区外部的文件呢?显然,FileEditorInput并不合适,稍后看.) 【动态计算editor id】 下面,我们再来看一下IDE类是如何计算所谓的默认eidtor id的。追踪实现,我们看到了IDE.getDefaultEditor1publicstaticIEditorDescriptor getDefaultEditor(IFile file,booleandetermineContentType) 2/Try file specific editor.3 IEditorRegistry editorReg=PlatformUI.getWorkbench()4 .getEditorRegistry();5try6 String editorID=file.getPersistentProperty(EDITOR_KEY);7if(editorID!=null) 8 IEditorDescriptor desc=editorReg.findEditor(editorID);9if(desc!=null) 10returndesc;11 12 13 catch(CoreException e) 14/do nothing15 1617 IContentType contentType=null;18if(determineContentType) 19 contentType=getContentType(file);20 21/Try lookup with filename22returneditorReg.getDefaultEditor(file.getName(), contentType);23 上面的代码大致赶了如下两件事情: 1、如果对应的资源设定了一个特定的持久化属性EDITOR_KEY,则会使用EDITOR_KEY属性值所代表的编辑器(说明:有关Eclipse资源的属性支持,请参阅其他文档)。那如果一个资源不在工作区之内,又如何设定EDITOR_KEY属性呢? (_确实没法设定) 2、查找对应的content type,用户通过org.eclipse.core.runtime.contentTypes扩展点来注册自定义的内容类型,在内容类型中会指定对应的文件扩展名和默认编码,例如JDT中注册了如下内容类型(摘自org.eclipse.jdt.core/plugin.xml): 那如果我们在注册编辑器的时候和对应的content type绑定,这不就联系起来了吗_。那我们看一下java源码编辑器扩展描述(摘自org.eclipse.jdt.ui/plugin.xml): 我们看到上面的xml中有contentTypeBinding元素,里面指定了绑定java源码content type。那如果我们在注册编辑器的时候,没有绑定对应的content type呢?Eclipse允许你配置,往下看: 我想看到这边对eclipse如何动态计算一个文件对应的editor应该是明白了吧,再回顾一下吧: 1、查看资源本身是否有EIDTOR_ID持久属性(注意:一、只有工作区中存在的资源才允许设置持久属性;二、资源属性知识针对特定资源,不会影响同类型资源,即你对工作区中特定的.java文件设定了EIDTOR_ID持久属性,并不会影响工作区中其他.java文件资源的编辑器绑定操作) 2、查找对应的content type,然后查找对应的editor扩展或者查找Eclipse中的Content Types和File Associations配置 3、如果都找不到,则直接给一个默认的编辑器。例如,我们经常碰到是org.eclipse.ui.DefaultTextEditor【IDE工具类提供的接口 VS IWorkbenchPage提供的接口】看一下以上提到的各个角色之间的调用关系图吧:【使用Eclipse提供的打开editor的接口】还是那句话,需求决定一切。我们看一下打开编辑器的需求: 1、打开工作区中工程内的文件资源 2、打开工作区.metadata目录中的文件资源 3、打开工作区外部的文件资源 【说明】Eclipse工作区实际上是有数据区和元数据区两个区域组成的,示意如下: 对于Eclipse来说,.metadata目录下存放的是插件运行时的关键状态数据,不建议用户再工作区实例运行期间做相应修改,为此eclipse干了两件事情:1、运行期间会自动在.metadata目录下产生一个进程锁定的.lock文件;2、Eclipse不允许用户通过IResource系列接口直接访问或修改.meatadata目录下的资源 【打开工作区工程内的资源】假设工作区中有测试工程TestProject,工程下有文本文件java_file.txt。对应创建代码如下:1try2/创建工程3 IProject project=ResourcesPlugin.getWorkspace().getRoot().getProject(TestProject);4if(!project.exists()5 project.create(null);6if(!project.isOpen()7 project.open(null);89/创建文件10 IFile java_file=project.getFile(newPath(/java_file.txt);11 InputStream inputStreamJava=newByteArrayInputStream(class MyType.getBytes();12if(!java_file.exists()13 java_file.create(inputStreamJava,false,null);14 catch(CoreException e) 15 IStatus status=newStatus(IStatus.ERROR,myplugin,101,创建资源失败, e);16 Activator.getDefault().getLog().log(status);17 打开方式一:Eclipse默认计算对应的editor id,会用default text editor打开1try2 IWorkbenchPage page=PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();3 IProject project=ResourcesPlugin.getWorkspace().getRoot().getProject(TestProject);45 IFile java_file=project.getFile(newPath(/java_file.txt);6 IDE.openEditor(page, java_file);7 catch(CoreException e) 8 IStatus status=newStatus(IStatus.ERROR,myplugin,102,打开工作区内文件出错, e);9 Activator.getDefault().getLog().log(status);10 打开方式二:指定java源码编辑器打开,会用java源码编辑器打开1try2 IWorkbenchPage page=PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();3 IProject project=ResourcesPlugin.getWorkspace().getRoot().getProject(TestProject);45 IFile java_file=project.getFile(newPath(/java_file.txt);6 IDE.openEditor(page, java_file,org.eclipse.jdt.ui.CompilationUnitEditor);7 catch(CoreException e) 8 IStatus status=newStatus(IStatus.ERROR,myplugin,102,打开工作区内文件出错, e);9 Activator.getDefault().getLog().log(status);10 打开方式三:设定editor id属性,该文件以后默认都用此editor id打开1try2 IWorkbenchPage page=PlatformUI.getWorkbench().getActiveWorkbenchWindow(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 皮料烫印技术考核试卷及答案
- 综采集控工理论知识考核试卷及答案
- 饮料制作工职业考核试卷及答案
- 2025颅内动脉粥样硬化性狭窄诊治指南解读课件
- 信息技术教招试题及答案
- 橡塑制品公司合同付款管理办法
- 银行职业道德试题及答案
- 银行债务员面试题及答案
- 耳鼻喉专业试题及答案
- 护士专业试题及答案
- 临床胸腔闭式引流护理-中华护理学会团体标准
- 电气自动化基础知识课件
- 2025年住建部:房屋租赁合同的新规定
- 铸铁机安装方案
- 甘肃省合理用药管理办法
- 重症科健康宣教专题
- 软件升级与迭代更新协议说明
- 第十三章 三角形 单元测试 2025-2026学年人教版(2024)八年级数学上册
- (2025)学宪法讲宪法知识竞赛试题库及参考答案
- 女生的青春期健康教育
- 乡村医生法律法规知识
评论
0/150
提交评论