第十天: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还需要处理文件在打开或保存时可能发生的异常,以便告诉用户发生的错误和需要采取的措施。这一点比较容易忽略,需要重视。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值