Categorías
Architecture & Design

Decipher Eclipse Architecture: IAdaptable – Parte 3 – Mostrar propiedades de elementos en una vista

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;
	}
}
  Patrones de diseño de Eclipse: proxy y puente en el espacio de trabajo

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;
	}
}
  Arquitectura de complementos de Eclipse: procesamiento de extensiones

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.

  Patrones de diseño de Eclipse: compuesto en el espacio de trabajo

Referencia:

IPropertySource

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *