Una vista es una parte del entorno de trabajo que permite navegar por una jerarquía de información o visualizar propiedades de un objeto. Las vistas se suelen proporcionar para soportar un editor correspondiente. Por ejemplo, una vista de esquema muestra una vista estructurada de la información de un editor. Una vista de propiedades muestra las propiedades de un objeto que se está editando actualmente.
Cuando el usuario efectúa selecciones o, por el contrario, hace cambios en un vista, dichos cambios se reflejan inmediatamente en otras partes relacionadas de la interfaz del usuario. Sólo una instancia de una vista determinada se abre en una página del entorno de trabajo.
El punto de extensión org.eclipse.ui.views permite a los conectores añadir vistas al entorno de trabajo. Los conectores que contribuyen con una vista deben registrarla en el archivo plugin.xml junto con su información de configuración como, por ejemplo, la clase de implementación, la categoría (o grupo) de vistas a la que pertenece y el nombre y el icono que debe utilizarse para describirla en menús y etiquetas.
La interfaz para vistas se define en IViewPart, pero los conectores pueden ampliar la clase ViewPart en lugar de implementar IViewPart desde el principio.
En el ejemplo de Hello World se implementó una extensión mínima de una vista. La que se muestra a continuación tiene en cuenta otras vistas de entorno de trabajo y responde a la navegación y selección que realiza el usuario en el entorno de trabajo. En primer lugar, vea la declaración de la extensión en el plugin.xml.
<extension
point="org.eclipse.ui.views">
<category
id="org.eclipse.ui.examples.readmetool"
name="&Readme">
</category>
<view
id="org.eclipse.ui.examples.readmetool.views.SectionsView"
name="Readme Sections"
icon="icons/basic/view16/sections.gif"
category="org.eclipse.ui.examples.readmetool"
class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
</view>
</extension>
Esto debería resultarle bastante familiar. Vea que se ha contribuido con una vista nueva, ReadmeSectionsView, al entorno de trabajo. El identificador de la vista, el nombre y la categoría se han especificado tal como se ha mostrado anteriormente. También se proporciona un icono a la vista, que utiliza una vía de acceso relativa al directorio de instalación del conector.
Vea ReadmeSectionsView. Se puede mostrar cualquier vista en el entorno de trabajo eligiendo Perspectiva->Mostrar vista->Otros... y seleccionando la vista de la lista Mostrar vista.
Cuando se muestra ReadmeSectionsView, aparece una vista con una lista. La lista está vacía a menos que se pulse en un archivo con la extensión .readme, en cuyo caso la lista se rellena con secciones de dicho archivo.
¿Cómo identifica el conector los cambios de selección y cómo reconoce el archivo readme? Si se puede hacer un seguimiento de esto en el código, se podrá entender cómo construir conectores de entorno de trabajo integrados.
Se debe empezar con el método createPartControl, que le resultará familiar. Tal como se vio en el ejemplo de Hello World, aquí es donde se crean los widgets que representan una vista. Se pasará por alto parte del código para la iniciación.
public void createPartControl(Composite parent) {
viewer = new ListViewer(parent);
...
// add myself as a global selection listener
getSite().getPage().addSelectionListener(this);
// prime the selection
selectionChanged(null, getSite().getPage().getSelection());
}
La vista crea y almacena un visor de listas (ListViewer) y se registra como un escuchador de selección en su página. Obtiene la página de IViewSite, que incluye información sobre el contexto de la vista como, por ejemplo, su ventana de entorno de trabajo, la página que la contiene y el conector. ¿Qué sucede cuando se le notifica de un cambio de selección? Se ejecuta el código siguiente:
public void selectionChanged(IWorkbenchPart part, ISelection sel) {
//si la selección es un archivo readme, obtener sus secciones.
AdaptableList input =
ReadmeModelFactory.getInstance().getSections(sel);
viewer.setInput(input);
}
Parece como si la clase ReadmeModelFactory estuviera implicada en convertir la selección en secciones readme, que actúan como entrada para el visor que se creó en el método createPartControl.
Se sabe que la vista registró los cambios de selección apropiados. De alguna manera, la selección se convirtió en la entrada adecuada para el visor. Y el visor realizó los pasos necesarios para rellenar un widget de lista.
Si quiere obtener toda la información disponible acerca de este visor, vaya a Visores. De momento, basta decir que una vez que al visor se le ha indicado cuál es su elemento de entrada, sabe cómo rellenar un widget de lista con la información que tiene. (Después de todo, es un visor de listas.) Pero ¿cómo se supo que se disponía de un archivo readme y de dónde procedía la información de las secciones para el visor? Para saberlo, vea ReadmeModelFactory.
public AdaptableList getSections(ISelection sel) {
// Si sel no es una selección estructurada, tan sólo ejecutar return.
if (!(sel instanceof IStructuredSelection))
return null;
IStructuredSelection structured = (IStructuredSelection)sel;
//si la selección es un archivo readme, obtener sus secciones.
Object object = structured.getFirstElement();
if (object instanceof IFile) {
IFile file = (IFile) object;
String extension =
file.getFileExtension();
if (extension != null && extension.equals(IReadmeConstants.EXTENSION)) {
return
getSections(file);
}
}
//el objeto seleccionado no es un archivo readme
return null;
}
Se ha comprobado si la selección es una selección estructurada (múltiple). (El concepto de selección estructurada procede de losvisores de JFace.) Respecto al primer objeto de la selección, se comprueba si es un recurso de archivo (IFile). Si lo es, se comprueba si su extensión coincide con la extensión ".readme". En cuanto se tiene la certeza de que es un archivo readme, se pueden utilizar otros métodos para analizar las secciones. Se puede examinar el resto de ReadmeModelFactory, MarkElement y DefaultSectionsParser para obtener información detallada sobre el análisis del archivo.
Al tratar esta extensión se han mostrado muchos conceptos comunes sobre el entorno de trabajo. Ahora se tratarán otras extensiones del entorno de trabajo y se verá cómo el conector puede efectuar más contribuciones a la UI del entorno de trabajo.