O quadro do editor de texto proporciona muitas classes utilitárias que ajudam na apresentação e actualização de texto e código fonte. Agora passamos a abordar a área de trabalho da qual o editor constitui uma parte. Como é que o editor interage com outras funções da área de trabalho como, por exemplo, menus de contexto, barras de menus e barras de ferramentas?
Para compreender como é que os editores se registam a si próprios junto da área de trabalho e facultam acções para a barra de menus da área de trabalho, consulte a secção que aborda org.eclipse.ui.editors. Não voltaremos a essas informações aqui. Iremos somente ver a marcação em que o editor exemplo Java regista o respectivo 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>
As acções da barra de menus da área de trabalho são contributos do JavaActionContributor. Este implementa acções que são colocadas no menu Editar da área de trabalho e na barra de ferramentas da mesma.
public JavaActionContributor() { super(); fContentAssistProposal= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal."); //$NON-NLS-1$ ... fContentAssistTip= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip."); //$NON-NLS-1$ ... fTogglePresentation= new PresentationAction(); }
As primeiras duas acções estão definidas como acções de editor de texto redestináveis. O princípio é semelhante ao das acções redestináveis fornecidas pela área de trabalho. As acções redestináveis do editor de texto representam entradas de menus que o contribuinte de acções associa dinamicamente às acções correspondentes fornecidas pelo editor activo. Quando o editor activo é alterado, a acção à qual é associada um editor de texto redestinável também se altera. A porção de código seguinte mostra que o contribuinte da acção de editor localiza a acção correspondente pedindo ao editor uma acção com determinado ID:
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();
}
O ID deve ser o mesmo sob o qual a acção está registada junto do editor, tal como indicado aqui para o JavaTextEditor. (Consulte também a secção seguinte.) :
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); }
A terceira acção no contribuinte é uma acção concreta adicionada à barra de ferramentas da área de trabalho. Alterna o estado do editor entre mostrar o intervalo destacado (tal como indicado pelo destacador de conteúdo do exemplo Java) e mostrar o ficheiro inteiro. Esta acção só aparece na barra de ferramentas.
O método createActions é utilizado para registar acções junto do editor. Estas incluem acções apropriadas para os menus de contexto do editor ou eventuais acções que sejam contributos em definições de extensão. No editor exemplo Java, só são criadas as acções que forem associadas às acções redestináveis. Todavia, o editor exemplo Java também herda as acções criadas pelo TextEditor e respectivas superclasses. Estas acções podem ser utilizadas nos menus de contexto do editor.
O método editorContextMenuAboutToShow do TextEditor é utilizado no quadro para permitir aos editores adicionarem acções ao menu de contexto para a área de edição. Pode utilizar um caminho de menus para decidir exactamente onde deve aparecer a sua acção. Os caminhos de menus válidos dentro do menu de contexto do editor estão definidos na implementação deste método em AbstractTextEditor.
Existem várias formas de adicionar uma acção a este menu. A primeira forma é adicionando uma acção somente com o ID sob o qual está registada junto do editor. Por exemplo, o JavaTextEditor adiciona as suas acções para assistência a conteúdos ao menu quando este método é chamado. As acções não aparecem no menu quando não há acções registadas sob o ID utilizado.
public void editorContextMenuAboutToShow(MenuManager menu) { super.editorContextMenuAboutToShow(menu); addAction(menu, "ContentAssistProposal"); addAction(menu, "ContentAssistTip"); }
A superclasse TextEditor adiciona acções de uma segunda forma - especificando um grupo de menus no menu de contexto para colocar a acção. Neste caso, as acções (Shift Left, Shift Right) aparecem no menu de contexto no grupo definido pelo 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); }
O método rulerContextMenuAboutToShow é utilizado da mesma forma antes de ser mostrado o menu de contexto da régua. A implementação deste método no AbstractTextEditor define os grupos nos quais podem ser adicionados artigos ao menu.
Podem ser atribuídos IDs aos menus de contexto do editor e de contexto da régua para que os outros plug-ins possam contribuir para estes menus nas respectivas extensões. O esquema para estabelecer IDs de menu está mais flexível desde a versão original da plataforma. No entanto, o quadro pode ser executado em modo de compatibilidade de modo a permanecer compatível com plug-ins desenvolvidos para a versão original. Pode utilizar AbstractTextEditor.setCompatibilityMode() para controlar este comportamento. A predefinição é verdadeiro (true).
Quando o modo de compatibilidade está definido como true, os IDs dos menus de contexto do editor e de contexto da régua podem ser definidos com o protocolo AbstractTextEditor. Os métodos setEditorContextMenuId e setRulerContextMenuId podem ser utilizados para este fim. Poderá ser útil repor os IDs se quiser impedir a herança de menus que foram contributos para menus de superclasses. Por exemplo, o JavaTextEditor no exemplo repõe os seus IDs de menu de contexto para serem específicos de Java, no intuito de impedir a herança de quaisquer contributos de texto genérico oriundos de outros plug-ins.
protected void initializeEditor() { super.initializeEditor(); JavaEditorEnvironment.connect(this); setSourceViewerConfiguration(new JavaSourceViewerConfiguration()); setEditorContextMenuId("#JavaEditorContext"); setRulerContextMenuId("#JavaRulerContext"); }
Se não estiver definido ID nenhum na hierarquia concreta, serão utilizados os IDs predefinidos estabelecidos pelo AbstractTextEditor.
O ID do menu de contexto do editor é sempre <ID editor>.EditorContext
, em que <ID editor>
é o ID do editor. O ID de um editor é definido na declaração XML do editor. O ID do menu de contexto da régua é sempre <ID editor>.RulerContext
.