5.27 按步就搬 Editor如何保存和打開文件

http://www.benisoft.net/day10/index.htmlhtml

Eclipse經過文件後綴名來決定該文件該用哪一個Editor打開,在實現org.eclipse.ui.editors 擴展點時,指定extensions爲iti,這樣,Eclipse碰到以.iti爲文件後綴的文件,就會調用ItineraryEditor打開。eclipse

 

Eclipse首先調用ItineraryEditor.init(...)方法。這個方法的實現通常都會調用基類的init(...)方法 來保存site。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的標題設置爲文件名。工具

protected void setInput(IEditorInput editorInput) {
        super.setInput(editorInput);
        
    // Referred by DAY10 <<< 
    if (editorInput instanceof FileStoreEditorInput) {
      // For "File -> Open File"
      try {
        FileStoreEditorInput pathEditorInput = (FileStoreEditorInput) editorInput;
        ItineraryParser parser = new ItineraryParser();
        File file = new File(pathEditorInput.getURI().toURL().getFile());
        itinerary = parser.parse(file);
        setPartName(file.getName());
      } catch (IOException e) {
        e.printStackTrace();
      }
    } 

到這裏爲止,ItineraryEditor成功打開.iti文件。接下來看一下如何保存文件。ui

 

保存文件

提及來也很簡單,兩大部分。首先須要告訴Eclipse,打開的文件用戶已經編輯過了,須要保存, 其次就是調用方法將Itinerary內容寫入iti文件。spa

第一步,若是須要支持Save As,則ItineraryEditor繼承isSaveAsAllowed()方法。.net

public boolean isSaveAsAllowed() { 
        return true; 
    } 

第二步,ItineraryEditor繼承isDirty()方法,Eclipse會調用這個方法來知道打開的文件是否須要保存。 這裏咱們直接返回Itinerary的isDirty()方法(Itinerary維護一個boolean變量dirty, 任何修改Itinerary對象的方法都會將這個boolean變量設置爲true)。code

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了。htm

public void doSave(IProgressMonitor monitor) {

    IEditorInput editorInput = getEditorInput();
    ...
    } else if (editorInput instanceof ExternalFileEditorInput) {
      try {
        ExternalFileEditorInput pathEditorInput = (ExternalFileEditorInput) editorInput;
        File file = pathEditorInput.getFile();
        OutputStream os = new FileOutputStream(file);

        ItineraryWriter writer = new ItineraryWriter(itinerary);
        writer.write(os);
        os.close();
        itinerary.setDirty(false);
        firePropertyChange(PROP_DIRTY);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }

doSaveAs()方法,須要彈出文件保存對話框,提示用戶輸入新文件路徑名,其餘和doSave()相似。 二者代碼由不少類似,實際開發時,應該考慮代碼合併,這裏爲了示例清楚起見,就保留重複代碼了。對象

public void doSaveAs() {

        IEditorInput editorInput = getEditorInput();
      if (editorInput instanceof ExternalFileEditorInput || editorInput instanceof FileStoreEditorInput) {

        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);
            ExternalFileEditorInput input = new ExternalFileEditorInput(file);
            setInput(input);
            firePropertyChange(PROP_DIRTY);
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      } 
相關文章
相關標籤/搜索