#author("2021-12-14T02:38:58+00:00","","") #author("2022-03-09T11:07:50+00:00","","") #topicpath ---- #contents **プロパティシートって [#f5d07bcd] プロパティシートとは、ビューで選択されているオブジェクトや、エディタの内容などを表示するためのビューです。具体的にはたとえばビューの場合は「ビューが外部にSelectionProviderとして公開しているviewerにsetInputされたオブジェクト」の情報を表示することができます。 #ref(pic.png) プロパティシートの例。パッケージ・エクスプローラで選択されているオブジェクトの内容が表示されている。 **実装方法 [#i8f0fd99] まずはビューでの実装方法をまとめていきます。 ***モデルとなるオブジェクト [#cd2098e7] モデルオブジェクトを 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;} } こんな感じです。これをビュー上のビューワに複数インスタンス表示し、選択したらプロパティシートに内容を表示させることを考えます。 #ref(pic02.png) モデルの内容がプロパティシートに表示されている。 ~ *** getSite().setSelectionProvider(viewer)させる [#y114783a] さて、実装の手順ですが、先のとおりSelectionProviderとして公開されているビューの情報を表示するので、そのviewerが getSite().setSelectionProvider(viewer); されていることがまず必要です((これでプロパティシートとviewerが関連づけられます))。 *** getAdapterを実装する [#md0f93f4] 次に、そのビュー(クラス名はModelViewとしました)がプロパティシートを使えるの?という質問に対して、使えるよーというのを答える記述を追加します。だんだん慣れてきましたが、[[IAdaptable>Eclipse/プラグイン開発のTIPS集/org.eclipse.core.runtime.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。」と返答することになります。 ***モデルを修正する [#a34f3a8b] 実はプロパティシートに表示するには、以下の条件のどれかが必要です。 -モデルのオブジェクトがIPropertySourceを実装していること -モデルのオブジェクトがIAdaptableを実装していて、IPropertySourceを返すこと これって実は厳しい条件ですよね。というのはモデルとなるオブジェクトは他人が作ったモノとか、修正できないモノとか、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); } ....省略 } さて表示させてみると、 #ref(pic02.png) 確かに表示されました。 *** IPropertySource の実装 [#q2743568] さっき長いので省略とした、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;} }; 重要なのは -IPropertyDescriptor[] getPropertyDescriptors()で、表示したいモノのキー値(とその表示名)の一覧を作成すること -Object getPropertyValue(Object id)でキー値が渡されるので、そのキー値に対するValueを返すように実装すること です。その他いろいろメソッドがありますが、とりあえずこんな感じでよいでしょう。 **まとめ [#ub322395] まとめると、だいたい以下の感じです。 -viewerをSelectionProviderとして外部に公開しておく getSite().setSelectionProvider(viewer)を使って、公開しておくのでした。 -ViewPartでgetAdapterを実装する IPropertySheetPageに対してPropertySheetPageを返すよう実装するんでしたね。 -モデルオブジェクトをIAdaptableかIPropertySource を実装する なんらかの方法でIPropertySource を返すようモデルを修正する必要がありました。 **モデルをEclipseなクラスから分離したい [#e35aa463] ちょっと書きましたが、モデルオブジェクトはいじりたくないし、Eclipseのクラスを拡張とかもしたくないわけです。IAdaptableなどを勉強して、どうも別のやり方があることがわかってきました。次はそれをまとめたいと思います。 [[IAdaptableなどをimplementsしていないモデルオブジェクトのプロパティシートへの表示>Eclipse/プラグイン開発のTIPS集/org.eclipse.core.runtime.IAdaptable(cont.)2]] **関連リンク [#n27ad0df] -[[プロパティ・シートの使用:http://www13.plala.or.jp/observe/PDE/PDEPropertySheet.html]] ---- この記事は #vote(おもしろかった[5],そうでもない[2]) #vote(おもしろかった[6],そうでもない[2]) -すでに存在するモデルや、他のヒトが作ったモデルを表示しているビューワの場合、どうやるのかなぁ? -- [[きの]] &new{2005-03-03 (木) 01:16:30}; -やっぱDelegateするラッパを作るのかなぁ -- [[きの]] &new{2005-03-17 19:56:37 (木)}; -やり方がわかりました。IPropertySourceを作って返すように実装するんですね。詳細は上のリンク先にまとめました。 -- [[きの]] &new{2006-03-29 11:12:07 (水)}; - そもそもプロパティ・シートのビューはどうやって追加できるのでしょうか? -- [[koi]] &new{2010-07-10 (土) 05:44:14}; #comment #topicpath SIZE(10){現在のアクセス:&