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(); } } }