Um editor é uma parte da área de trabalho que permite a um utilizador editar um objecto (geralmente um ficheiro). Os editores funcionam de modo semelhante às ferramentas de edição do sistema de ficheiros, salvo que se encontram estreitamente integrados na UI da área de trabalho da plataforma. Um editor está sempre associado a um objecto de entrada de dados (IEditorInput). Podemos pensar no objecto de entrada de dados como o documento ou ficheiro que esteja a ser editado. As alterações efectuadas num editor só são consolidadas quando o utilizador as guardar.
Só pode estar aberto um editor para determinada entrada de dados de editor numa página de área de trabalho. Por exemplo, se o utilizador estiver a editar o ficheiro readme.txt na área de trabalho, abri-lo outra vez na mesma perspectiva activará o mesmo editor. (Pode abrir outro editor no mesmo ficheiro a partir de uma janela ou perspectiva de área de trabalho). Todavia, e ao invés das vistas, poderá abrir-se o mesmo tipo de editor como, por exemplo, editor de texto, muitas vezes numa página de área de trabalho para diferentes entradas de dados.
O ponto de extensão de área de trabalho org.eclipse.ui.editors é utilizado por plug-ins para adicionar editores à área de trabalho. Os plug-ins que contribuem com um editor devem registar a extensão do editor no ficheiro plugin.xml, junto com informações de configuração do editor. Algumas das informações do editor como, por exemplo, a classe de implementação e nome e ícone a utilizar nos menus e etiquetas de área de trabalho, são semelhantes às informações sobre vistas. Além disso, as extensões do editor especificam as extensões de ficheiro ou os padrões de nomes de ficheiro dos tipos de ficheiros que o editor compreende. os editores também podem definir uma contributorClass, a qual é uma classe que adiciona acções a menus e barras de ferramentas de área de trabalho quando o editor está activo.
A interface para editores é definida na IEditorPart, mas os plug-ins podem optar por estender a classe EditorPart em vez de implementar uma IEditorPart de raiz.
Nota: Uma extensão de editor também pode ser configurada para lançar um programa externo ou para chamar código Java pré-existente. Nesta abordagem, concentramo-nos nos editores que estão realmente integrados na área de trabalho e são implementados com IEditorPart.
A ferramenta readme faculta um editor personalizado principalmente com a finalidade de contribuir com a sua própria página de destacador de conteúdo para a vista do destacador da área de trabalho.
A configuração para a extensão do editor é definida como se segue.
<extension point = "org.eclipse.ui.editors"> <editor id = "org.eclipse.ui.examples.readmetool.ReadmeEditor" name="%Editors.ReadmeEditor" icon="icons/obj16/editor.png" class="org.eclipse.ui.examples.readmetool.ReadmeEditor" extensions="readme" contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor"> </editor> </extension>
Vemos a marcação de configuração já conhecida para id, nome, ícone e classe. O atributo extensions descreve os tipos de ficheiro que o editor compreende. (Também se pode especificar filenames (nomes de ficheiros) se for preciso mais especificidade.) A classe implementa o editor, e a contributorClass é responsável pr facultar acções relacionadas com editores. Vejamos o contribuinte em mais detalhe.
A classe do contribuinte adiciona acções relacionadas com editores ao menu e à barra de ferramentas da área de trabalho. Deve implementar a interface IEditorActionBarContributor. O contribuinte é separado do próprio editor dado que cada página da área de trabalho pode ter vários editores do mesmo tipo. Um único contribuinte é partilhado por todos os editores de um tipo específico, em vez de ter cada instância de um editor a criar acções e imagens. .
No ReadmeEditorActionBarContributor, contribuímos com três acções. "Editor Action1," "Editor Action2" e "Editor Action3". Estas são configuradas no construtor.
public ReadmeEditorActionBarContributor() { ... action1 = new EditorAction(MessageUtil.getString("Editor_Action1")); action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1")); action1.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE); action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE); ... action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil.getString("Editor_Action2")); action2.setToolTipText(MessageUtil.getString("Readme_Editor_Action2")); action2.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_DISABLE); action2.setImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_ENABLE); ... action3 = new LabelRetargetAction(IReadmeConstants.LABELRETARGET3, MessageUtil.getString("Editor_Action3")); action3.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE); action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE); ... }
Os nomes e ícones das acções são configurados no código e não no ficheiro plugin.xml. (Vamos ignorar as diferenças nas classes de acções por agora até vermos as acções redestináveis.)
Repare como são semelhantes as informações sobre acções àquela sobre viewActions que vimos na marcação da acção vista. As acções são configuradas no código dado que temos de gerir a partilha das mesmas por diferentes instâncias do mesmo editor. Quando as acções são criadas no construtor, são independentes de qualquer instância do editor.
Quando um editor se torna activo e tem acções que devem ser instaladas nos menus e na barra de ferramentas da área de trabalho, a mensagem setActiveEditor é enviada ao contribuinte. O contribuinte liga as acções do editor a um editor específico.
public void setActiveEditor(IEditorPart editor) { ... action1.setActiveEditor(editor); ... }
Como podemos ver, as acções aparecem nos menus e na barra de ferramentas da área de trabalho quando um editor readme está activo.
Estes artigos de menu e barra de ferramentas só são mostrados quando o editor está activo. A localização dos artigos de menu e barra de ferramentas podem ser especificadas como se descreve em Caminhos de menu e barra de ferramentas.
O próprio editor do readme, ReadmeEditor, não é muito complicado, pois estende a classe TextEditor para poder contribuir com uma página de destacador de conteúdo personalizada para a vista de destacador quando se está a editar um ficheiro readme. Não altera nenhum comportamento dentro do editor de texto.
Os editores costumam ter esquematizadores de conteúdo correspondentes que facultam uma vista estruturada do conteúdo do editor e ajudam o utilizador a navegar pelo conteúdo do editor. Consulte Destacadores de conteúdo para mais detalhes.
Veremos a implementação de editores de texto em Editores de texto e texto de plataforma.