關於Eclipse插件開發(五)-----編輯器類方法的使用說明


上面有講ChinaEditor類繼承EditorPart抽象類時,只實現了init,createPartControl兩個方法,本節將逐步講解其他的5個方法的用法.

EditorPart方法的執行情況.

要使用好EditorPart,首先得了解其方法在各種情況下的執行流程,在類的每一個方法中加上一個打印語句.運行后看打印輸出,就可以得到如下方法執行流程.

(1)雙擊列表項打開編輯器時

init--->isDirty--->createPartContorl--->isDirty--->isDirty--->isDirty--->isDirty--->isDirty--->setFocus--->isDirty--->isSaveAsAllowed.

(2)關閉編輯器時,setFocus--->isDirty--->isSaveAsAllowed--->isDirty--->isSaveAsAllowed--->setFocus--->isDirty如果保存保存編輯器,則最后還會執行doSave()方法.

(3)單擊編輯器標題時:setFocus

(4)編輯器失去焦點時:isDirty--->isSavedAsAllowed--->isDirty----->isSaveASAllowed.

(5)編輯器得到焦點時:setFocus---->isDirty---->isSaveAsAllowed---->isDirty----->isSaveAsAllowed.

(6)當編輯器可以保存,選擇主菜單"文件--->保存"或按Ctrl+S快捷鍵時:isDirty--->doSave.

各個方法的作用以及含義:

1.boolean isDirty()

由此方法獲知編輯器是否臟了(所謂"臟"是指編輯器中的值已經發生了改變),true表示臟了,當其返回true時,會出現兩個效果:編輯器的標題出現一個"*"號,主菜單"文件"下的"保存"項可用.

特別要注意的是:編輯器不會自己判斷自己是否臟了,這需要在程序中用語句手動設置,例如:在編輯器的文本框加入一個鍵盤監聽事件,當在文本框中輸入字符時,則將isDirty方法返回值設置為true(臟).

在方法執行的過程中,可以看到此方法的執行是最頻繁的,所以不要在此方法中加入太耗時的執行語句.否則會影響程序執行速度.

2.void doSave()

在這個方法中編寫保存編輯器的代碼,當選擇主菜單"文件---->保存"時也會執行此方法.但因在isDirty返回true時,"保存"菜單和Ctrl+S快捷鍵才能用,也即isDirty方法控制着doSave方法的執行.

當保存成功時,要注意將臟的狀態設置回false,並調用firePropertyChange方法將編輯器的界面狀態更新(編輯器標題前的"*"號以及"保存"菜單).

3.boolean isSaveAsAllowed()

是否允許編輯器使用"另存為"功能,如果此返回false,則不能使用"另存為"功能,而且主菜單"文件"下的"另存為"項被置灰.

4.void doSaveAs()

和doSave的作用相似,在這里書寫"另存為"功能的處理代碼.

5.void setFocus()

當編輯器獲得焦點時執行該方法.

 

一個編輯器實例

在本例子中,當修改ChinaEditor編輯器中文本框的文字時候,編輯器標題前出現"*"而且主菜單"文件---->保存"可用,當編輯器保存后,"*"消失並且"保存"菜單不可用,當編輯器為臟時,關閉編輯器會彈出一個提示保存的對話框.

ChinaEditor.java(前面的我貼的代碼就是全部的,這里再貼 一遍)

 1 public class ChinaEditor extends EditorPart {
 2     private boolean dirty = true; // 編輯器是否為臟的標識
 3 
 4     // Editor的初始化方法。本方法前兩句是固定不變的
 5     public void init(IEditorSite site, IEditorInput input) throws PartInitException {
 6         System.out.println("init");
 7         setSite(site);
 8         setInput(input);
 9         // 下一句設置Editor標題欄的顯示名稱,否則名稱用plugin.xml中的name屬性
10         // setPartName(input.getName());
11         // 下一句設置Editor標題欄的圖標,否則會自動使用一個默認的圖標
12         // setTitleImage(input.getImageDescriptor().createImage());
13     }
14 
15     // 在此方法中創建Editor中的界面組件
16     public void createPartControl(Composite parent) {
17         System.out.println("createPartControl");
18         Composite topComp = new Composite(parent, SWT.NONE);
19         topComp.setLayout(new FillLayout());
20         Text text = new Text(topComp, SWT.BORDER);
21         text.setText("中國之編輯器");
22 
23         text.addKeyListener(new KeyAdapter() {
24             public void keyPressed(KeyEvent e) {
25                 // 如果編輯器不臟(即沒有修改),則標志它臟並刷新界面狀態
26                 if (!isDirty()) {
27                     setDirty(true);
28                     firePropertyChange(IEditorPart.PROP_DIRTY);
29                 }
30             }
31         });
32     }
33 
34     // 保存的處理代碼在這種方法中,當按Ctrl+S鍵時會執行此方法。
35     // 最后別忘記標志為非臟及刷新界面狀態
36     public void doSave(IProgressMonitor monitor) {
37         if (isDirty()) {
38             // ……保存編輯器事件處理代碼(省略)
39             setDirty(false);
40             firePropertyChange(IEditorPart.PROP_DIRTY);
41         }
42     }
43 
44     // 是否允許“另存為”,false不允許
45     public boolean isSaveAsAllowed() {
46         return false;
47     }
48 
49     // “另存為”的代碼寫在這里,本例不實現它
50     public void doSaveAs() {}
51 
52     // dirty標識的set方法,由此方法設置編輯器為臟
53     public void setDirty(boolean dirty) {
54         this.dirty = dirty;
55     }
56 
57     // 編輯器的內容是否臟了。true臟,false不臟
58     public boolean isDirty() {
59         return dirty;
60     }
61 
62     // 當編輯器獲得焦點時會執行此方法,本例空實現
63     public void setFocus() {}
64 }

程序說明:firePropertyChange(IEditorPart.PROP_DIRTY)這一句除了能將界面狀態刷新之外,如果IEditorPart對象添加了如下監聽器,則還可以觸發其中的propertyChange事件.

chinaEditor.addPropertyListener(new IPropertyListener(){

  //此時source為ChinaEditor對象,propId為IEditorPart.PROP_DIRTY這個常量值

  public void propertyChanged(Object source,int propId){

    //......事件處理代碼,這里省略

  }

})

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM