Eclipse/プラグイン開発のTIPS集/org.eclipse.core.runtime.IAdaptable
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
// 下階層用テンプレート
#topicpath
----
#contents
//ここにコンテンツを記述します。
**IAdaptableってなに [#e29fa6f9]
Eclipseプラグイン開発をする上で、避けて通ることができない...
public Object getAdapter(Class adapter);
というメソッドだけが宣言されています。このメソッドはEclip...
たとえば[[Eclipse/プラグイン開発のTIPS集/プロパティシート...
public Object getAdapter(Class adapter) {
if(adapter.equals(IPropertySheetPage.class))
return new PropertySheetPage();
return super.getAdapter(adapter);
}
などとやって、このビューはプロパティシートを使えるよー、...
この緩やかさ(疎すぎるところ?)が、またわかりにくいなぁっ...
**PlatformObject ってなに?IAdapterFactory てなに?? [#i...
さて、このIAdaptableインタフェースですが、すべてのClass a...
org.eclipse.core.runtime.IAdaptable インタフェース
org.eclipse.core.runtime.PlatformObject オブジェクト
org.eclipse.core.runtime.IAdapterFactory ファクトリ
を理解する必要があるみたいですね。
org.eclipse.core.runtime.PlatformObjectはgetAdapterのデフ...
詳しく見てみます。まずPlatformObjectのgetAdapter(Class ad...
public Object getAdapter(Class adapter) {
return InternalPlatform.getDefault().getAdapterManager...
} ↑IAdapterManag...
なので、つまりPlatformObjectのインスタンスをthisとしたと...
this#getAdapter(Class adapter);
とするのは
IAdapterManager#getAdapter(this, adapter);
とするのと等価であることがわかります。さらにIAdapterManag...
public Object getAdapter(Object adaptable, Class adapter...
IAdapterFactory factory = (IAdapterFactory) getFactori...
.get(adapterType.getName...
return factory.getAdapter(adaptable, adapterType);
}(多少省略)
とthisのClass型(adaptable.getClass())とともに登録されたIA...
IAdapterFactory factory = new ListAdapterFactory();
Platform.getAdapterManager().registerAdapters(factory, M...
というようにクラスの型クラスをキーに、IAdapterManagerに登...
''この例ではregistのメソッドでMyHashMap.classをキーにfact...
**例1 HashMapをListに変換するアダプタ [#zb5cbeac]
極めてわかりにくい仕組みなので、ためしに以下のIAdaptable...
class MyHashMap implements IAdaptable {
private Map delegate = new HashMap();
public int size() {return delegate.size();}
public Collection values() {return delegate.values();}
public Object getAdapter(Class clazz) {
if (clazz == List.class) {
List list = new ArrayList(delegate.size());
list.addAll(delegate.values());
return list;
}
return null;
}
}
を上の3つのクラスで実現してみたいと思います。ちなみにこの...
MyHashMap map = new MyHashMap();
List list = (List)map.getAdapter(List.class);
なんてことができます。まさにアダプタですね。
さて、上のクラスを3つのクラスの機構で実現しようと思います...
// class MyHashMap implements IAdaptable {
class MyHashMap extends PlatformObject {
private Map delegate = new HashMap();
public int size() {return delegate.size();}
public Collection values() {return delegate.values();}
// ここまでは同じ
// ↓のロジックはファクトリに移動するのでコメントアウト
// public Object getAdapter(Class clazz) {
// if (clazz == List.class) {
// List list = new ArrayList(delegate.size());
// list.addAll(delegate.values());
// return list;
// }
// return null;
// }
}
つぎに、IAdapterFactoryを実装する、ListAdapterFactoryを作...
public class ListAdapterFactory implements IAdapterFacto...
public Object getAdapter(Object adaptableObject, Class...
if (adapterType == List.class && adaptableObject ins...
// 欲しがってるものがListで、MyHashMapに対してのge...
// 以下の処理でListを作って返す
MyHashMap map = (MyHashMap) adaptableObject;
List list = new ArrayList(map.size());
list.addAll(map.values());
return list;
}
return null;
}
public Class[] getAdapterList() {
return new Class[] { List.class };
}
}
以上で完成です。あとは使うときに、このファクトリをEclipse...
IAdapterFactory factory = new ListAdapterFactory();
Platform.getAdapterManager().registerAdapters(factory, M...
これで登録ができました。以上で
MyHashMap map = new MyHashMap();
List list= (List)map.getAdapter(List.class);
とすることができるようになりました。
......この例って、意味ある??使い方は何となくわかったけ...
Platform.getAdapterManager().unregisterAdapters(factory);
でOKです。
**例2 Viewerへの表示に使用するアダプタ org.eclipse.ui.mo...
***Viewerでの使われ方 [#pe086929]
Viewer系のModelと2つのプロバイダで、この機構が使われてい...
#ref(EA46.png)
このようなディレクトリ構造になっているモデルをBaseWorkben...
***BaseWorkbenchContentProviderの実装がどうなってるか [#b...
さて[[BaseWorkbenchContentProviderの実装:http://kickjava....
public Object[] getChildren(Object element);
をみてみると、elementオブジェクトがIAdaptableの場合、
IAdaptable adaptable = (IAdaptable) element;
IWorkbenchAdapter adapter =
(IWorkbenchAdapter) adaptable.getAdapter(IWorkbenchAda...
return adapter.getChildren(element);
というように、IAdaptable に castしてIWorkbenchAdapter をg...
今回はモデルオブジェクトのelementがContactクラス(の拡張ク...
***IAdapterFactoryの実装クラス [#cb0e9618]
ここでは以下のように実装しました。
package org.eclipsercp.hyperbola.model;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.model.IWorkbenchAdapter;
public class HyperbolaAdapterFactory implements IAdapter...
↓ IAdapterFactory とともにregistされたContact.classのg...
↓ がよばれたとき、呼び出される。Contact.classのサブク...
↓ Object adaptableObjectはContactsGroupだったりContact...
public Object getAdapter(Object adaptableObject, Class...
if (adapterType == IWorkbenchAdapter.class
&& adaptableObject instanceof ContactsGroup)
return groupAdapter;
if (adapterType == IWorkbenchAdapter.class
&& adaptableObject instanceof ContactsEntry)
return entryAdapter;
return null;
}
public Class[] getAdapterList() {
return new Class[] { IWorkbenchAdapter.class };
}
private IWorkbenchAdapter groupAdapter = new IWorkbenc...
public Object getParent(Object o) {
return ((ContactsGroup) o).getParent();
}
public Object[] getChildren(Object o) {
return ((ContactsGroup) o).getEntries();
}
public String getLabel(Object o) {
ContactsGroup group = ((ContactsGroup) o);
return group.getName();
}
public ImageDescriptor getImageDescriptor(Object obj...
};
private IWorkbenchAdapter entryAdapter = new IWorkbenc...
public Object getParent(Object o) {
return ((ContactsEntry) o).getParent();
}
public Object[] getChildren(Object o) {
return new Object[0];
}
public String getLabel(Object o) {
ContactsEntry entry = ((ContactsEntry) o);
return entry.getNickname() + " (" + entry.getName(...
+ entry.getServer() + ")";
}
public ImageDescriptor getImageDescriptor(Object obj...
};
}
***ここまでのまとめ [#kd61337a]
このファクトリを
Platform.getAdapterManager().registerAdapters(adapterFac...
と Contact.classに登録することで、以下のことができたこと...
-Contact.classやそのサブクラス(ContactsGroup、ContactsEnt...
-このファクトリにより、Contact((と他のサブクラス))#getAda...
なるほど、各IAdaptableなオブジェクトごとに書くよりかは、...
ちなみに、Viewを破棄するときにはunregisterするのを忘れな...
public void dispose() {
super.dispose();
Platform.getAdapterManager().unregisterAdapters(adapte...
}
**関連リンク [#eda3e973]
-[[What is IAdaptable?:http://www.eclipsezone.com/article...
#ls2(Eclipse/プラグイン開発のTIPS集/org.eclipse.core.runt...
----
この記事は
#vote(おもしろかった[9],そうでもない[1])
-結局、対象となるオブジェクトがPlatformObjectとかIAdaptab...
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
終了行:
// 下階層用テンプレート
#topicpath
----
#contents
//ここにコンテンツを記述します。
**IAdaptableってなに [#e29fa6f9]
Eclipseプラグイン開発をする上で、避けて通ることができない...
public Object getAdapter(Class adapter);
というメソッドだけが宣言されています。このメソッドはEclip...
たとえば[[Eclipse/プラグイン開発のTIPS集/プロパティシート...
public Object getAdapter(Class adapter) {
if(adapter.equals(IPropertySheetPage.class))
return new PropertySheetPage();
return super.getAdapter(adapter);
}
などとやって、このビューはプロパティシートを使えるよー、...
この緩やかさ(疎すぎるところ?)が、またわかりにくいなぁっ...
**PlatformObject ってなに?IAdapterFactory てなに?? [#i...
さて、このIAdaptableインタフェースですが、すべてのClass a...
org.eclipse.core.runtime.IAdaptable インタフェース
org.eclipse.core.runtime.PlatformObject オブジェクト
org.eclipse.core.runtime.IAdapterFactory ファクトリ
を理解する必要があるみたいですね。
org.eclipse.core.runtime.PlatformObjectはgetAdapterのデフ...
詳しく見てみます。まずPlatformObjectのgetAdapter(Class ad...
public Object getAdapter(Class adapter) {
return InternalPlatform.getDefault().getAdapterManager...
} ↑IAdapterManag...
なので、つまりPlatformObjectのインスタンスをthisとしたと...
this#getAdapter(Class adapter);
とするのは
IAdapterManager#getAdapter(this, adapter);
とするのと等価であることがわかります。さらにIAdapterManag...
public Object getAdapter(Object adaptable, Class adapter...
IAdapterFactory factory = (IAdapterFactory) getFactori...
.get(adapterType.getName...
return factory.getAdapter(adaptable, adapterType);
}(多少省略)
とthisのClass型(adaptable.getClass())とともに登録されたIA...
IAdapterFactory factory = new ListAdapterFactory();
Platform.getAdapterManager().registerAdapters(factory, M...
というようにクラスの型クラスをキーに、IAdapterManagerに登...
''この例ではregistのメソッドでMyHashMap.classをキーにfact...
**例1 HashMapをListに変換するアダプタ [#zb5cbeac]
極めてわかりにくい仕組みなので、ためしに以下のIAdaptable...
class MyHashMap implements IAdaptable {
private Map delegate = new HashMap();
public int size() {return delegate.size();}
public Collection values() {return delegate.values();}
public Object getAdapter(Class clazz) {
if (clazz == List.class) {
List list = new ArrayList(delegate.size());
list.addAll(delegate.values());
return list;
}
return null;
}
}
を上の3つのクラスで実現してみたいと思います。ちなみにこの...
MyHashMap map = new MyHashMap();
List list = (List)map.getAdapter(List.class);
なんてことができます。まさにアダプタですね。
さて、上のクラスを3つのクラスの機構で実現しようと思います...
// class MyHashMap implements IAdaptable {
class MyHashMap extends PlatformObject {
private Map delegate = new HashMap();
public int size() {return delegate.size();}
public Collection values() {return delegate.values();}
// ここまでは同じ
// ↓のロジックはファクトリに移動するのでコメントアウト
// public Object getAdapter(Class clazz) {
// if (clazz == List.class) {
// List list = new ArrayList(delegate.size());
// list.addAll(delegate.values());
// return list;
// }
// return null;
// }
}
つぎに、IAdapterFactoryを実装する、ListAdapterFactoryを作...
public class ListAdapterFactory implements IAdapterFacto...
public Object getAdapter(Object adaptableObject, Class...
if (adapterType == List.class && adaptableObject ins...
// 欲しがってるものがListで、MyHashMapに対してのge...
// 以下の処理でListを作って返す
MyHashMap map = (MyHashMap) adaptableObject;
List list = new ArrayList(map.size());
list.addAll(map.values());
return list;
}
return null;
}
public Class[] getAdapterList() {
return new Class[] { List.class };
}
}
以上で完成です。あとは使うときに、このファクトリをEclipse...
IAdapterFactory factory = new ListAdapterFactory();
Platform.getAdapterManager().registerAdapters(factory, M...
これで登録ができました。以上で
MyHashMap map = new MyHashMap();
List list= (List)map.getAdapter(List.class);
とすることができるようになりました。
......この例って、意味ある??使い方は何となくわかったけ...
Platform.getAdapterManager().unregisterAdapters(factory);
でOKです。
**例2 Viewerへの表示に使用するアダプタ org.eclipse.ui.mo...
***Viewerでの使われ方 [#pe086929]
Viewer系のModelと2つのプロバイダで、この機構が使われてい...
#ref(EA46.png)
このようなディレクトリ構造になっているモデルをBaseWorkben...
***BaseWorkbenchContentProviderの実装がどうなってるか [#b...
さて[[BaseWorkbenchContentProviderの実装:http://kickjava....
public Object[] getChildren(Object element);
をみてみると、elementオブジェクトがIAdaptableの場合、
IAdaptable adaptable = (IAdaptable) element;
IWorkbenchAdapter adapter =
(IWorkbenchAdapter) adaptable.getAdapter(IWorkbenchAda...
return adapter.getChildren(element);
というように、IAdaptable に castしてIWorkbenchAdapter をg...
今回はモデルオブジェクトのelementがContactクラス(の拡張ク...
***IAdapterFactoryの実装クラス [#cb0e9618]
ここでは以下のように実装しました。
package org.eclipsercp.hyperbola.model;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.model.IWorkbenchAdapter;
public class HyperbolaAdapterFactory implements IAdapter...
↓ IAdapterFactory とともにregistされたContact.classのg...
↓ がよばれたとき、呼び出される。Contact.classのサブク...
↓ Object adaptableObjectはContactsGroupだったりContact...
public Object getAdapter(Object adaptableObject, Class...
if (adapterType == IWorkbenchAdapter.class
&& adaptableObject instanceof ContactsGroup)
return groupAdapter;
if (adapterType == IWorkbenchAdapter.class
&& adaptableObject instanceof ContactsEntry)
return entryAdapter;
return null;
}
public Class[] getAdapterList() {
return new Class[] { IWorkbenchAdapter.class };
}
private IWorkbenchAdapter groupAdapter = new IWorkbenc...
public Object getParent(Object o) {
return ((ContactsGroup) o).getParent();
}
public Object[] getChildren(Object o) {
return ((ContactsGroup) o).getEntries();
}
public String getLabel(Object o) {
ContactsGroup group = ((ContactsGroup) o);
return group.getName();
}
public ImageDescriptor getImageDescriptor(Object obj...
};
private IWorkbenchAdapter entryAdapter = new IWorkbenc...
public Object getParent(Object o) {
return ((ContactsEntry) o).getParent();
}
public Object[] getChildren(Object o) {
return new Object[0];
}
public String getLabel(Object o) {
ContactsEntry entry = ((ContactsEntry) o);
return entry.getNickname() + " (" + entry.getName(...
+ entry.getServer() + ")";
}
public ImageDescriptor getImageDescriptor(Object obj...
};
}
***ここまでのまとめ [#kd61337a]
このファクトリを
Platform.getAdapterManager().registerAdapters(adapterFac...
と Contact.classに登録することで、以下のことができたこと...
-Contact.classやそのサブクラス(ContactsGroup、ContactsEnt...
-このファクトリにより、Contact((と他のサブクラス))#getAda...
なるほど、各IAdaptableなオブジェクトごとに書くよりかは、...
ちなみに、Viewを破棄するときにはunregisterするのを忘れな...
public void dispose() {
super.dispose();
Platform.getAdapterManager().unregisterAdapters(adapte...
}
**関連リンク [#eda3e973]
-[[What is IAdaptable?:http://www.eclipsezone.com/article...
#ls2(Eclipse/プラグイン開発のTIPS集/org.eclipse.core.runt...
----
この記事は
#vote(おもしろかった[9],そうでもない[1])
-結局、対象となるオブジェクトがPlatformObjectとかIAdaptab...
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
ページ名: