プロパティシートって †プロパティシートとは、ビューで選択されているオブジェクトや、エディタの内容などを表示するためのビューです。具体的にはたとえばビューの場合は「ビューが外部にSelectionProvider?として公開しているviewerにsetInputされたオブジェクト」の情報を表示することができます。 プロパティシートの例。パッケージ・エクスプローラで選択されているオブジェクトの内容が表示されている。 実装方法 †まずはビューでの実装方法をまとめていきます。 モデルとなるオブジェクト †モデルオブジェクトを public interface Model {
String getId();
String getName();
String getMail();
}
としました。実装クラスは public class ModelImpl implements Model {
private String id;
private String name;
private String mail;
public ModelImpl(String id, String name, String mail) {
this.id = id;
this.name = name;
this.mail = mail;
}
public String getId() {return id;}
public String getMail() {return mail;}
public String getName() {return name;}
}
こんな感じです。これをビュー上のビューワに複数インスタンス表示し、選択したらプロパティシートに内容を表示させることを考えます。 モデルの内容がプロパティシートに表示されている。 getSite().setSelectionProvider?(viewer)させる †さて、実装の手順ですが、先のとおりSelectionProvider?として公開されているビューの情報を表示するので、そのviewerが getSite().setSelectionProvider(viewer); されていることがまず必要です*1。 getAdapterを実装する †次に、そのビュー(クラス名はModelView?としました)がプロパティシートを使えるの?という質問に対して、使えるよーというのを答える記述を追加します。だんだん慣れてきましたが、IAdaptableを使うわけですね。ビューの実装クラスViewPart?はIAdaptableなので、getAdapterをOverrideします。 ModelViewe?に以下を実装: public Object getAdapter(Class adapter) {
logger.debug("getAdapter(Class) - start");
if (adapter.equals(IPropertySheetPage.class)) {
logger.debug("getAdapter(Class) - end");
return new PropertySheetPage();
↑これはEclipseで提供されているモノ。自前ではない。
}
logger.debug("getAdapter(Class) - end");
return super.getAdapter(adapter);
}
これで、EclipseプラットフォームがModelView?に「IPropertySheetPage?サポートしてる?」と問い合わせたときに「もってるよ。はいPropertySheetPage?。」と返答することになります。 モデルを修正する †実はプロパティシートに表示するには、以下の条件のどれかが必要です。 これって実は厳しい条件ですよね。というのはモデルとなるオブジェクトは他人が作ったモノとか、修正できないモノとか、Eclipse以外でも使いたいモノである可能性が高く、その場合はおいそれとEclipseのインタフェースを実装なんてできないわけです。 実はソースを見てたら上記2以外の条件もあったのですが、とりあえずここではIAdaptableの方式でやってみようと思います。 ModelインタフェースでIAdaptableを拡張します。 public interface Model extends IAdaptable {
String getId();
String getName();
String getMail();
}
実装クラスでは以下のようにします。 public class ModelImpl implements Model {
private String id;
private String name;
private String mail;
public ModelImpl(String id, String name, String mail) {
this.id = id;
this.name = name;
this.mail = mail;
}
public String getId() {return id;}
public String getMail() {return mail;}
public String getName() {return name;}
// IPropertySourceを返すように実装
public Object getAdapter(Class adapter) {
if (adapter.equals(IPropertySource.class)) {
return source;
}
return null;
}
private IPropertySource source = new IPropertySource() {
....長いので、後述。
};
}
以上で、モデル側は準備ができました。ちなみにModelView?は以下の通り実装されました。 public class ModelView extends ViewPart {
private List models;
public void createPartControl(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new FillLayout());
initializeModel();
final TableViewer tableViewer = new TableViewer(container, SWT.BORDER);
tableViewer.setContentProvider(new ArrayContentProvider());
tableViewer.setInput(models);
getSite().setSelectionProvider(tableViewer);
....省略
}
private void initializeModel() {
models = new ArrayList();
models.add(new ModelImpl("000", "Root", "root@localhost"));
models.add(new ModelImpl("001", "masatomi", "masatomi@localhost"));
}
public Object getAdapter(Class adapter) {
if (adapter.equals(IPropertySheetPage.class)) {
return new PropertySheetPage();
}
return super.getAdapter(adapter);
}
....省略
}
さて表示させてみると、 確かに表示されました。 IPropertySource? の実装 †さっき長いので省略とした、IPropertySource? の実装についてです。 private IPropertySource source = new IPropertySource() {
public IPropertyDescriptor[] getPropertyDescriptors() {
IPropertyDescriptor[] descriptor = new IPropertyDescriptor[] {
new TextPropertyDescriptor("id", "コード"),
new TextPropertyDescriptor("name", "名前"),
new TextPropertyDescriptor("mail", "メール") };
return descriptor;
}
public Object getPropertyValue(Object id) {
if (id.equals("id")) {
return getId();
}
if (id.equals("name")) {
return getName();
}
if (id.equals("mail")) {
return getMail();
}
return null;
}
public boolean isPropertySet(Object id) {return false;}
public void resetPropertyValue(Object id) {}
public void setPropertyValue(Object id, Object value) {}
public Object getEditableValue() {return null;}
};
重要なのは
です。その他いろいろメソッドがありますが、とりあえずこんな感じでよいでしょう。 まとめ †まとめると、だいたい以下の感じです。
getSite().setSelectionProvider?(viewer)を使って、公開しておくのでした。
IPropertySheetPage?に対してPropertySheetPage?を返すよう実装するんでしたね。
なんらかの方法でIPropertySource? を返すようモデルを修正する必要がありました。 モデルをEclipseなクラスから分離したい †ちょっと書きましたが、モデルオブジェクトはいじりたくないし、Eclipseのクラスを拡張とかもしたくないわけです。IAdaptableなどを勉強して、どうも別のやり方があることがわかってきました。次はそれをまとめたいと思います。 IAdaptableなどをimplementsしていないモデルオブジェクトのプロパティシートへの表示 関連リンク †この記事は
現在のアクセス:15243 |