`
eclipsesbs
  • 浏览: 19826 次
社区版块
存档分类
最新评论

第十天:Editor是怎么打开文件,保存文件的

阅读更多

作者:梁祺 (eclipsesbs@gmail.com)

 

来自:http://www.benisoft.net/day10/index.html

 

在Itinerary的例子里,所以行程计划都保存在后缀为.iti的XML文件中。用户打开.iti文件, 编辑后可以选择保存,或者另存为新的文件。今天就来看一下整个过程。

打开文件

前面我们介绍过,Eclipse通过文件后缀名来决定该文件该用哪个Editor打开,在实现org.eclipse.ui.editors 扩展点时,指定extensions为iti,这样,Eclipse碰到以.iti为文件后缀的文件,就会调用ItineraryEditor打开。

Eclipse首先调用ItineraryEditor.init(...)方法。这个方法的实现一般都会调用基类的init(...)方法 来保存site和editorInput。site是Eclipse提供的IEditorSite对象,通过这个对象, Editor可以获得Eclipse窗口的一些功能,比如工具栏。 接下来,检查editorInput类型。Eclipse对于导入到Eclipse项目(或者说由Eclipse管理的文件), 和未导入到Eclipse项目的(也就是说直接在文件系统上,没有纳入Eclipse管理的文件)是区别对待的。 它们所对应的IEditorInput是不同的,这个我们会在介绍Resource的时候专门讨论。 因为Itinerary例子不需要将文件导入到Eclipse项目中,可以直接打开文件系统上的文件, 所以我们检查editorInput是否是FileStoreEditorInput实例。请记住,非Eclipse管理的文件所对应的 IEditorInput是FileStoreEditorInput。然后生成一个ItineraryParser对象, 从FileStoreEditorInput获取File对象,并交由parser打开,最后将Editor的标题设置为文件名。

    public void init(IEditorSite site, IEditorInput editorInput)
            throws PartInitException {
        super.init(site, editorInput);

        if (editorInput instanceof FileStoreEditorInput) {
            FileStoreEditorInput pathEditorInput = (FileStoreEditorInput) editorInput;
            ItineraryParser parser = new ItineraryParser();
            try {
                file = new File(pathEditorInput.getURI().toURL().getFile());
                itinerary = parser.parse(file);
                setPartName(file.getName());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

到这里为止,ItineraryEditor成功打开.iti文件。接下来看一下如何保存文件。

保存文件

说起来也很简单,两大部分。首先需要告诉Eclipse,打开的文件用户已经编辑过了,需要保存, 其次就是调用方法将Itinerary内容写入iti文件。

第一步,如果需要支持Save As,则ItineraryEditor继承isSaveAsAllowed()方法。

    public boolean isSaveAsAllowed() {
        return true;
    }

第二步,ItineraryEditor继承isDirty()方法,Eclipse会调用这个方法来知道打开的文件是否需要保存。 这里我们直接返回Itinerary的isDirty()方法(Itinerary维护一个boolean变量dirty, 任何修改Itinerary对象的方法都会将这个boolean变量设置为true)。

    public boolean isDirty() {
        return itinerary.isDirty();
    }

第三步,需要重载doSave(...)和doSaveAs()这两个方法,分别对应于File菜单里的Save和Save As这两个菜单。 当用户选择Save或Save As菜单时,会分别调用SaveAction或SaveAsAction,它们分别会调用Editor的 doSave(...)和doSaveAs()方法。我们重载doSave(...)方法, 将用户编辑过的Itinerary对象写入文件保存,然后发送PROP_DIRTY事件,通知EditorPart清除文件已修改标记。 另外,doSave(...)方法接受IProgressMonitor对象,当文件保存非常耗时的情况下, 就可以及时通知用户文件保存的状态。我们假设Itinerary的文件都很小,所以就忽略这个monitor了。

    public void doSave(IProgressMonitor monitor) {
        try {
            ItineraryWriter writer = new ItineraryWriter(itinerary);
            writer.write(file);
            firePropertyChange(PROP_DIRTY);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

doSaveAs()方法,需要弹出文件保存对话框,提示用户输入新文件路径名,其他和doSave()类似。 两者代码由很多相似,实际开发时,应该考虑代码合并,这里为了示例清楚起见,就保留重复代码了。

    public void doSaveAs() {
        
        FileDialog fileDialog = new FileDialog(getSite().getShell(), SWT.SAVE);
        fileDialog.setFileName(\"myitinerary.iti\");
        fileDialog.setFilterExtensions(new String[] { \"iti\", \"*\" });
        fileDialog.setFilterIndex(0);
        fileDialog.setFilterNames(new String[] { \"Itinerary Files (*.iti)\",
                \"All Files (*.*)\" });
        fileDialog.setText(\"Save File\");
        fileDialog.setOverwrite(true);
        String filePath = fileDialog.open();
        if (filePath != null) {
            try {
                ItineraryWriter writer = new ItineraryWriter(itinerary);
                File file = new File(filePath);
                writer.write(file);
                PathEditorInput input = new PathEditorInput(file);
                setInput(input);
                firePropertyChange(PROP_DIRTY);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

到这里,我们介绍了文件打开和保存所涉及的基本步骤,一个设计良好的plug-in还需要处理文件在打开或保存时可能发生的异常, 以便告诉用户发生的错误和需要采取的措施。这一点比较容易忽略,需要重视。

分享到:
评论

相关推荐

    网管教程 从入门到精通软件篇.txt

    ASD:Microsoft Word的自动保存文件;Microsoft高级流媒体格式(microsoft advanced streaming format,ASF)的描述文件;可用NSREX打开 Velvet Studio例子文件 ASF:Microsoft高级流媒体格式文件 ASM:汇编语言...

    MicrosoftHTMLHelpWorkshopV1.3汉化版.rar

    将工程文件保存在某一目录下并给予文件名。此时弹出主编辑窗口,如图1。  2.单击右边的“选项”按钮,在弹出的对话框中我们可以设置文件的属性。包括文件标题、压缩率、排序、各种文件信息、搜索支持、宏定义、...

    KODExplorer 芒果云-资源管理器

    - 标签关闭提示:检测是否有未保存文件,文件修改实时修改是否修修改的按钮状态 ####fix bug:(bug解决和程序优化) - 文本文件编辑 文件名含有url编码则出错bug - 右键菜单在最下面时,右键位置重叠导致点击...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    找到mingwm10.dll 文件,将其复制到C:\WINDOWS\system 文件夹下,即可。下 面再提示缺少什么dll 文件,都像这样解决就可以了。 二、Qt Creator 编写多窗口程序(原创) 实现功能: 程序开始出现一个对话框,按下按钮...

    python常用快捷键

    #新建工程第一步操作 1. module设置把空包分层去掉,compact empty middle package 2. 设置当前的工程是utf-8,设置的Editor-->File Encodings-->全部改成utf-8, #注释 1. ctrl+/:单行注释 #光标操作 1. ...

    Altium Designer Beta 19.0.10完整版安装包+安装教程+和谐文件

    固定组件面板错误,在执行基于文件的库搜索后无法重新打开所选组件类别。 进口商/出口商 17619 修复了导致P-CAD导入导出错误和PCAD16LD.DLL访问冲突的错误。 24746 修复了导入xDxDesigner项目时未正确转换总线的...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    ecshop更换ueditor

    备注:如需修改上传图片、视频、文件等保存路径,请打开includes/ueditor/php/config.json修改即可,默认保存路径是/images/upload/,可以修改为你想要的路径,的人也可以不用改。 2、把admin/js/jquery.js,...

    代码语法错误分析工具pclint8.0

    和前面第一步中的方法基本一样,不过这里我们需要用到unix中的find等命令来查找当前目录下的C和C++文件,然后再将它们送给lint程序处理,所以得先从http://www.weihenstephan.de/~syring/win32/UnxUtils.zip下载...

    Ghost 8.3 系统备份软件

     Ghost 还提供了一项硬盘备份功能,就是将整个硬盘的数据备份成一个文件保存在硬盘上(菜单 Local→Disk→To Image),然后就可以随时还原到其他硬盘或源硬盘上,这对安装多个系统很方便。使用方法与分区备份相似。...

    Ghost 8.3 Enterprise

     Ghost 还提供了一项硬盘备份功能,就是将整个硬盘的数据备份成一个文件保存在硬盘上(菜单 Local→Disk→To Image),然后就可以随时还原到其他硬盘或源硬盘上,这对安装多个系统很方便。使用方法与分区备份相似。...

    动易SiteWeaver仿百度文库豆丁网控件

    4、如果是多工作表的EXCEL文件的话,要先用excel打开文件,然后把下面的工作表全选中,保存一下,再上传,不然只能转换一页。 5、本控件针对会员中心的添加文章的时候也给出了生成Flash的选项。只是还需要修改动易的...

    visio教程PDF

    第10章 使用标尺、网格和辅助线 10.1 设置标尺 10.1.1 选择度量单位 10.1.2 应用各种单位 10.1.3 放置标尺零点 IO.2 使用网格 10.2.1 设置网格间距 10.2.2 设置网格线的最小间距 10.2.3 设置...

    arcgis工具

    在做外联如EXCEL等的时候对数据有一些要求,确保第一行包含字段名,这些字段名不能超过十个字母,不能出现特殊字符。最好把EXCEL保存为.csv文件去除一些不兼容的内容再连接。 转载ESRI论坛Lucy1114帖子说明: 12...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    Visio 2000 技术大全

    第10章 使用标尺、网格和辅助线 10.1 设置标尺 10.1.1 选择度量单位 10.1.2 应用各种单位 10.1.3 放置标尺零点 IO.2 使用网格 10.2.1 设置网格间距 10.2.2 设置网格线的最小间距 ...

    Toad 使用快速入门

    10. 方便的同时打开多个存储过程,通过页面快速切换 11. 快速编译存储过程,快速定位错误所在,自己选择是否同时编译依赖的存储过程 12. 内置对PL/Formatter,可以用PL/Formatter对存储过程进行格式化,并且可以...

    FLAC3D5.00培训教程.pptx

    FLAC3D5全文共130页,当前为第10页。 1.1.3 the menus FLAC3D5全文共130页,当前为第11页。 Options Dialog: General: Destroy Button, System Title Colors Editor: Font, Colors, Highlighting, New File Header ...

    基于hhww改进版的传统五笔输入法(新版支持WIN7)

    (保存为reg文件,导入) 4、如果不想通过注册表,而在文件中强制定义码表目录: 第一步:0x023C58:EB 00 改为 EB 66 第二步:0x0241D0:Unicode码的C:\Temp 改为自设目录,最长24个字符 20061205新性: * 更正有...

Global site tag (gtag.js) - Google Analytics