Este ejemplo muestra cómo se usa IAdaptable en Eclipse en un ejemplo real. Para tener una idea de cómo funciona el patrón de diseño del adaptador en Eclipse, vaya a esas publicaciones: post1 post2.
Suponga que ha creado una vista utilizando el «Asistente de extensión» de eclipse. (Si no sabe esto, intente jugar y hacer esto).
Y ahora cambie el código en SampleView.java para que sea el siguiente:
package adapterview.views; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.part.*; import org.eclipse.jface.viewers.*; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.*; import org.eclipse.swt.SWT; public class SampleView extends ViewPart { private TableViewer viewer; class ViewLabelProvider extends LabelProvider implements ITableLabelProvider { public String getColumnText(Object obj, int index) { TestItem testItem = (TestItem) obj; return testItem.getSummary(); } public Image getColumnImage(Object obj, int index) { return getImage(obj); } public Image getImage(Object obj) { return PlatformUI.getWorkbench().getSharedImages() .getImage(ISharedImages.IMG_OBJ_ELEMENT); } } /** * This is a callback that will allow us to create the viewer and initialize it. */ public void createPartControl(Composite parent) { viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); getSite().setSelectionProvider(viewer); viewer.setInput(getElements()); } /** * Passing the focus request to the viewer's control. */ public void setFocus() { viewer.getControl().setFocus(); } // Build up a simple data model private TestItem[] getElements() { TestItem[] testItems = new TestItem[2]; TestItem testItem = new TestItem(); testItem.setSummary("First Item"); testItem.setDescription("A very good description"); testItems[0] = testItem; testItem = new TestItem(); testItem.setSummary("Second Item"); testItem.setDescription("Another very good description"); testItems[1] = testItem; return testItems; } } |
TestItem.java
package adapterview.views; public class TestItem { private String summary; private String description; public String getSummary() { return summary; } public void setSummary(String summary) { this.summary = summary; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } |
Básicamente, esto creará una vista y se mostrará como esta figura.
¿Qué sucede si quiero mostrar el resumen y la descripción en una vista de propiedad cuando se hace clic en cada elemento? Puede pensar en cambiar alguna parte del código en SampleView, pero la plataforma Eclipse es increíble y no hay necesidad de cambiar en esta clase.
Lo que necesitamos es agregar un adaptador para TestItem Class.
Ahora agregue el siguiente fragmento al archivo plugin.xml.
<extension point="org.eclipse.core.runtime.adapters"> <factory adaptableType="adapterview.views.TestItem" class="adapterplace.TestItemAdapterFactory"> <adapter type="org.eclipse.ui.views.properties.IPropertySource"> </adapter> </factory> </extension> |
Esto declara las siguientes tres clases:
1. adaptableType es TestItem
2. la fábrica para crear el adaptador para adaptableType (TestItem) es TestItemAdapterFactory
3. El adaptador es IPropertySource, que es necesario para que la vista de propiedades muestre propiedades.
Recuerde el ejemplo de manzana y naranja en mi publicación anterior, ahora aquí queremos ir de TestItem a IPropertySource.
La jerarquía de archivos de archivos es así:
TestItemAdapterFactory.java
package adapterplace; import org.eclipse.core.runtime.IAdapterFactory; import org.eclipse.ui.views.properties.IPropertySource; import adapterview.views.*; public class TestItemAdapterFactory implements IAdapterFactory { @Override public Object getAdapter(Object adaptableObject, Class adapterType) { if (adapterType== IPropertySource.class && adaptableObject instanceof TestItem){ return new TestItemAdapter((TestItem) adaptableObject); } return null; } @Override public Class[] getAdapterList() { // TODO Auto-generated method stub return null; } } |
TestItemAdapter.java: esta clase envuelve un objeto TestItem con los métodos de IPropertySource, que a su vez son requeridos por la vista de propiedades.
package adapterplace; import adapterview.views.TestItem; import org.eclipse.ui.views.properties.IPropertyDescriptor; import org.eclipse.ui.views.properties.IPropertySource; import org.eclipse.ui.views.properties.TextPropertyDescriptor; public class TestItemAdapter implements IPropertySource { private final TestItem testItem; public TestItemAdapter(TestItem testItem) { this.testItem = testItem; } @Override public boolean isPropertySet(Object id) { return false; } @Override public Object getEditableValue() { return this; } @Override public IPropertyDescriptor[] getPropertyDescriptors() { return new IPropertyDescriptor[] { new TextPropertyDescriptor("summary", "Summary"), new TextPropertyDescriptor("description", "Description") }; } @Override public Object getPropertyValue(Object id) { if (id.equals("summary")) { return testItem.getSummary(); } if (id.equals("description")) { return testItem.getDescription(); } return null; } @Override public void resetPropertyValue(Object id) { } @Override public void setPropertyValue(Object id, Object value) { String s = (String) value; if (id.equals("summary")) { testItem.setSummary(s); } if (id.equals("description")) { testItem.setDescription(s); } } } |
Resultado: cuando se selecciona un elemento en la vista de muestra, la vista de propiedades muestra su propiedad.
Referencia: