La infraestructura de editores de texto proporciona muchas clases de utilidad que facilitan la presentación y actualización de texto y código fuente. Ahora centraremos nuestra atención en el entorno de trabajo, del que el editor no es sino un componente. ¿Cómo interactúa el editor con otras características del entorno de trabajo, como por ejemplo menús de contexto, barras de menús y barras de herramientas?
Para entender la forma en que los editores se registran en el entorno de trabajo y suministran acciones a la barra de menús del mismo, consulte la sección que describe org.eclipse.ui.editors. No volveremos a describir esa información en este apartado. Sólo echaremos una mirada al código en el que el editor de ejemplo Java registra su editor.
<extension point="org.eclipse.ui.editors"> <editor name="%javaEditorName" icon="icons/obj16/java.png" extensions="jav" contributorClass="org.eclipse.ui.examples.javaeditor.JavaActionContributor" class="org.eclipse.ui.examples.javaeditor.JavaEditor" id="org.eclipse.ui.JavaEditor"> </editor> </extension>
JavaActionContributor aporta las acciones de barra de menús del entorno de trabajo. Implementa acciones que se colocan en el menú Editar y en la barra de herramientas del entorno de trabajo.
public JavaActionContributor() { super(); fContentAssistProposal= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal."); //$NON-NLS-1$ ... fContentAssistTip= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip."); //$NON-NLS-1$ ... fTogglePresentation= new PresentationAction(); }
Las dos primeras acciones se definen como acciones de editor de texto redireccionables. El concepto es parecido al de las acciones redireccionables suministradas por el entorno de trabajo. Las acciones redireccionables del editor de texto representan entradas de menú que el contribuyente de las acciones enlaza dinámicamente con las acciones correspondientes suministradas por el editor activo. Cuando cambia el editor activo, cambia a su vez la acción a la que está enlazada una acción redireccionable del editor de texto. El fragmento de código que figura a continuación muestra cómo el contribuyente de acciones del editor busca la acción correspondiente solicitando al editor una acción con un ID determinado:
protected final IAction getAction(ITextEditor editor, String actionId) {
return (editor == null ? null : editor.getAction(actionId));
} public void setActiveEditor(IEditorPart part) {
super.setActiveEditor(part);
ITextEditor editor= null;
if (part instanceof ITextEditor)
editor= (ITextEditor) part;
fContentAssistProposal.setAction(getAction(editor, "ContentAssistProposal"));
fContentAssistTip.setAction(getAction(editor, "ContentAssistTip"));
fTogglePresentation.setEditor(editor);
fTogglePresentation.update();
}
El ID debe ser el mismo con el que se ha registrado la acción en el editor, indicado aquí por JavaTextEditor. (Consulte también la próxima sección).:
protected void createActions() { super.createActions(); IAction a= new TextOperationAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal.", this, ISourceViewer.CONTENTASSIST_PROPOSALS); //$NON-NLS-1$ a.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS); setAction("ContentAssistProposal", a); a= new TextOperationAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip.", this, ISourceViewer.CONTENTASSIST_CONTEXT_INFORMATION); //$NON-NLS-1$ a.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_CONTEXT_INFORMATION); setAction("ContentAssistTip", a); }
La tercera acción del contribuyente es una acción concreta añadida a la barra de herramientas del entorno de trabajo. Conmuta el estado del editor entre mostrar el rango resaltado (según lo indicado por el esquematizador de contenido del ejemplo Java) y mostrar todo el archivo. Esta acción sólo aparece en la barra de herramientas.
El método createActions se utiliza para registrar acciones en el editor. Esto incluye las acciones adecuadas para los menús de contexto del editor o las definiciones aportadas en las definiciones de extensión. En el editor de ejemplo Java, sólo se crean las acciones que se enlazan a las acciones redireccionables. Sin embargo, el editor de ejemplo Java también hereda las acciones creadas por TextEditor y sus superclases. Estas acciones pueden utilizarse en los menús de contexto del editor.
El método de TextEditor editorContextMenuAboutToShow se utiliza en la infraestructura para permitir que los editores añadan acciones al menú de contexto para el área de edición. Puede utilizar una vía de acceso de menú para decidir exactamente dónde debe aparecer la acción. Las vías de acceso de menú válidas del menú de contexto del editor se definen en la implementación de este método en AbstractTextEditor.
Existen varias formas de añadir una acción a este menú. La primera de ellas consiste en añadir una acción utilizando sólo el ID con el que está registrada en el editor. Por ejemplo, JavaTextEditor añade sus acciones de asistencia de contenido al menú cuando se llama a este método. Las acciones no aparecerán en el menú si no existe ninguna acción registrada con el ID utilizado.
public void editorContextMenuAboutToShow(MenuManager menu) { super.editorContextMenuAboutToShow(menu); addAction(menu, "ContentAssistProposal"); addAction(menu, "ContentAssistTip"); }
La superclase TextEditor añade acciones siguiendo un segundo método: especificando un grupo de menús en el menú de contexto para colocar la acción. En este caso, las acciones (Shift Left (desplazamiento a la izquierda), Shift Right (desplazamiento a la derecha)) aparecen en el menú de contexto en el grupo definido por AbstractTextEditor.
protected void editorContextMenuAboutToShow(IMenuManager menu) { super.editorContextMenuAboutToShow(menu); addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_RIGHT); addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_LEFT); }
El método rulerContextMenuAboutToShow se utiliza de la misma forma antes de que se muestre el menú de contexto de la regla. La implementación de este método en AbstractTextEditor define los grupos en los que pueden añadirse elementos al menú.
Pueden asignarse ID a los menús de contexto del editor y de la regla a fin de que otros conectores puedan efectuar aportaciones a estos menús en sus extensiones. El esquema para establecer los ID de menú es más flexible a partir de la versión original de la plataforma. Sin embargo, la infraestructura puede ejecutarse en modalidad de compatibilidad para que siga siendo compatible con los conectores desarrollados para la versión original. Puede utilizar AbstractTextEditor.setCompatibilityMode() para controlar este comportamiento. El valor por omisión es true.
Si la modalidad de compatibilidad es true, los ID de los menús de contexto del editor y la regla pueden establecerse mediante el protocolo AbstractTextEditor. Con este fin, pueden utilizarse los métodos setEditorContextMenuId y setRulerContextMenuId. El hecho de restablecer los ID puede ser de utilidad si desea evitar que se hereden menús que se añadieron a menús de superclase. Por ejemplo, el JavaTextEditor del ejemplo restablece sus ID de menú de contexto como específicos de Java, a fin de evitar heredar contribuciones de texto genéricas procedentes de otros conectores.
protected void initializeEditor() { super.initializeEditor(); JavaEditorEnvironment.connect(this); setSourceViewerConfiguration(new JavaSourceViewerConfiguration()); setEditorContextMenuId("#JavaEditorContext"); setRulerContextMenuId("#JavaRulerContext"); }
Si no se ha establecido ningún ID en ningún lugar de la jerarquía concreta, se utilizarán los ID por omisión definidos por AbstractTextEditor.
El ID de menú de contexto del editor es siempre <ID editor>.EditorContext
, donde <ID editor>
es el ID del editor. El ID de un editor se define en la declaración XML del editor. El ID de menú de contexto de la regla es siempre <ID editor>.RulerContext
.