RCP開発のポリシー
いざRCPで開発だといっても、何をどうすればよいかが分からないかもしれません。そのため、次の事項をなるべく守るように設計していくと良いと思います。
- 複雑なビューは作るな、複雑なパースペクティブにせよ
- ボタンよりもアクションを使え
- ビュー、エディタは直接参照を行ってはいけない
アーキテクチャ
RCPアプリケーションが採用すべきアーキテクチャは次のようになります。

- マウスクリックやキー操作によってアクションが実行される
- アクションはオブジェクト群に対して何らかの変更を行う
- オブジェクト群はすべてのビューに対して変更の通知を行う
- それぞれのビューは変更内容に興味がある場合に表示を更新する
ViewCVS専用ブラウザの作成
実際にViewCVS専用ブラウザの作成を通して、ポリシーの実現方法について説明します。
"モデル"を考える
まずは、今回作るViewCVSの機能を実現するためのモデルを考えます。
画面イメージをざっくりと考える
何はともあれ、画面イメージを最初に考える必要はあります。しかし、ここは本当にざっくりで充分です。なぜなら、RCPにおいて画面のレイアウトや、新しいビューの追加は容易に実施できるからです。
とりあえず、直感的に思いつく画面イメージはこんなところです。

ドメインモデルを考える
次にViewCVSが持っている情報をクラス化してみましょう。ここではGUIを考慮する必要は無く、通常のクラス分析から割り出します。割り出したクラス構成は次のようになります。

イベント通知機能を追加する
JDKのAPIとして、JavaBeansにイベント通知を付加するjava.beans.PropertyChangeEvent、java.beans.PropertyChangeListenerがあります。今回はこれらを利用して、クラスにイベント通知機能を追加していきましょう。
public class CVSModule extends CVSFolder { public static final String EVENT_UPDATE_URL = "url"; @Override public void setUrl(String url) { super.setUrl(url); firePropertyChange(this, EVENT_UPDATE_URL, url); } /** * PropertyChangeListener. */ private List<PropertyChangeListener> listeners = new ArrayList<PropertyChangeListener>(); /** * リスナーの追加. * @param listener リスナー. */ public void addPropertyChangeListener( PropertyChangeListener listener) { listeners.add(listener); } /** * リスナーの除去. * @param listener リスナー. */ public void removePropertyChangeListener( PropertyChangeListener listener) { listeners.remove(listener); } /** * プロパティ変更イベントの発行. * @param name * @param value */ protected void firePropertyChange( Object source, String name, Object value) { for (PropertyChangeListener listener : listeners) { listener.propertyChange(new PropertyChangeEvent( source, name, null, value)); } } }
