Wizard のクラスを調べる
昨日、作成したクラス LG3DProjectWizard は Wizard クラスの派生クラスで、INewWizard インタフェースをインプリメントしています。
これらがどういうクラス/インタフェースなのか少し調べてみたいと思います。
まずは手始めに INewWizard インタフェースから。で、このインタフェースのソース見てみたら... 何もメソッドは定義されていませんでした ^^;; 一種のマーカーインタフェースなのでしょう。
INewWizard インタフェースの親インタフェースは IWorkbenchWizard インタフェースです。こちらには
void init(IWorkbench workbench, IStructuredSelection selection);
が定義してありました。で、IWorkbenchWizard インタフェースの親が IWizard インタフェースです。
ところで、このインタフェース名の頭に I がつくのはどうにかならないのでしょうか。命名のセンスを疑ってしまいます。IWizard インタフェースでなくて Wizard インタフェースとするべきでしょう、やっぱり。
逆にいえば、Wizard クラスは DefaultWizrd クラスとか AbstractWizard クラスとかにすべきだと思います。
主客が逆転してるんですよね。
まぁ、いいや。ここでぼやいてもしかたないし。
で、IWizard インタフェースです。このインタフェースはいっぱいメソッドが定義されています。まず、getter, setter らしきものを抜き出してみると
public IWizardContainer getContainer(); public Image getDefaultPageImage(); public IDialogSettings getDialogSettings(); public IWizardPage getNextPage(IWizardPage page); public IWizardPage getPage(String pageName); public int getPageCount(); public IWizardPage[] getPages(); public IWizardPage getPreviousPage(IWizardPage page); public IWizardPage getStartingPage(); public RGB getTitleBarColor(); public String getWindowTitle(); public boolean isHelpAvailable(); public boolean needsPreviousAndNextButtons(); public boolean needsProgressMonitor(); public void setContainer(IWizardContainer wizardContainer);
そして、普通のメソッドが
public void addPages(); public boolean canFinish(); public void createPageControls(Composite pageContainer); public void dispose(); public boolean performCancel(); public boolean performFinish();
となっています。
なんで、addPages メソッドは引数がないのでしょう。何か変な感じ。
さて、Wizard クラスではこれらのメソッドのうちのいくつかがすでに実装されているようです。Javadoc を見ると、次のメソッドを必要に応じてオーバライド/実装しなさいと書いてあります。
- createPageControls
- performCancel
- addPages
- performFinish
- dispose
getter は setter を使って設定するようですね。次のメソッドをコールして設定しろと書いてありました。
- addPage
- setHelpAvailable
- setDefaultPageImageDescriptor
- setDialogSettings
- setNeedsProgressMonitor
- setTitleBarColor
- setWindowTitle
一番上のメソッドは addPages でなくて addPage です。これらのメソッドは Wizard クラスで定義されているようです。
昨日の LG3DProjectWizard クラスのテンプレートによれば、performFinish と init だけが定義されていました。実際に上記のメソッドを実装してみるのは明日にします。