문서 편집기 프레임워크는 텍스트 및 소스 코드를 제시하고 갱신하는 데 도움이 되는 여러 가지 유틸리티 클래스를 제공합니다. 이제부터 편집기가 단지 하나의 파트인 Workbench를 다룹니다. 편집기가 컨텍스트 메뉴, 메뉴 표시줄 및 도구 모음과 같은 다른 Workbench 기능과 상호 작용하는 방법은 무엇입니까?
편집기가 자체를 Workbench에 등록하고 Workbenc 메뉴 표시줄에 조치를 제공하는 방법을 이해하려면, org.eclipse.ui.editors 논의 절을 참조하십시오. 여기서 해당 정보를 다루지 않습니다. Java 예제 편집기가 해당 편집기를 등록하는 마크업을 간략하게 살펴봅니다.
<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>
Workbench 메뉴 표시줄 조치는 JavaActionContributor에서 제공됩니다. 이 항목은 Workbench 편집 메뉴 및 Workbench 도구 모음에 있는 조치를 구현합니다.
public JavaActionContributor() { super(); fContentAssistProposal= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal."); //$NON-NLS-1$ ... fContentAssistTip= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip."); //$NON-NLS-1$ ... fTogglePresentation= new PresentationAction(); }
처음 두 가지 조치는 새로 대상 지정 가능한 문서 편집기 조치로서 정의됩니다. 원리는 Workbench에서 제공되는 새로 대상 지정 가능한 조치와 비슷합니다. 새로 대상 지정 가능한 문서 편집기는 조치 지시자가 활성화 편집기에서 제공하는 해당 조치를 동적으로 바인드하는 메뉴 항목을 나타냅니다. 활성 편집기가 변경되면 새로 대상 지정 가능한 문서 편집기 조치가 바인드되는 조치도 변경됩니다. 다음 스니펫은 편집기에 지정된 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();
}
ID는 여기서 JavaTextEditor에 지정된 대로 조치가 편집기에
등록된 ID와 동일해야 합니다 (다음 섹션도 참조).
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); }
지시자의 세 번째 조치는 Workbench 도구 모음에 추가된 구체적 조치입니다. 이 조치는 Java 예제의 컨텐츠 아웃라이너에 지시된 대로 강조된 범위를 표시하고 전체 파일을 표시하는 사이에서 편집기 상태를 토글합니다. 이 조치는 도구 모음에서만 나타납니다.
조치를 편집기에 등록하는 데 메소드 createActions가 사용됩니다. 여기에는 편집기 컨텍스트 메뉴에 적절한 조치 또는 확장 정의에서 제공된 조치가 포함됩니다. Java 예제 편집기에서는 새로 대상 지정 가능한 조치에 바인드되는 조치만 작성됩니다. 그러나 Java 예제 편집기는 TextEditor 및 해당 수퍼클래스에서 작성된 조치도 상속합니다. 편집기 컨텍스트 메뉴에서 이러한 조치를 사용할 수 있습니다.
TextEditor메소드 editorContextMenuAboutToShow는 편집기가 편집 영역에 대한 컨텍스트 메뉴에 조치를 추가할 수 있도록 프레임워크에서 사용됩니다. 메뉴 경로를 사용하여 조치가 표시될 정확한 위치를 결정할 수 있습니다. 편집기 컨텍스트 메뉴 내부의 올바른 메뉴 경로는 AbstractTextEditor의 이 메소드의 구현에서 정의됩니다.
이 메뉴에 조치를 추가할 수 있는 여러 가지 방법이 있습니다. 첫 번째는 편집기에 등록된 ID만 사용하여 조치를 추가하는 방법입니다. 예를 들어, JavaTextEditor는 이 메소드가 호출될 때 컨텐츠 지원에 해당하는 조치를 메뉴에 추가합니다. 사용된 ID로 조치를 등록하지 않으면 메뉴에 조치가 표시되지 않습니다.
public void editorContextMenuAboutToShow(MenuManager menu) { super.editorContextMenuAboutToShow(menu); addAction(menu, "ContentAssistProposal"); addAction(menu, "ContentAssistTip"); }
수퍼클래스 TextEditor는 조치를 배치하는 데 필요한 메뉴 그룹을 컨텍스트 메뉴에 지정하여 조치를 두 번째 방법으로 추가합니다. 이런 경우 조치(왼쪽으로 이동, 오른쪽으로 이동)가 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); }
눈금자의 컨텍스트 메뉴가 표시되기 전에 같은 방법으로 메소드 rulerContextMenuAboutToShow가 사용됩니다. AbstractTextEditor에서 이 메소드의 구현은 항목이 메뉴에 추가될 수 있는 그룹을 정의합니다.
해당 확장의 이러한 메뉴에 다른 플러그인을 제공할 수 있도록 편집기 컨텍스트 및 눈금자 컨텍스트 메뉴에는 ID를 지정할 수 있습니다. 메뉴 ID를 설정하기 위한 설계는 플랫폼의 원래 버전 이후 융통성이 확대되었습니다. 그러나 프레임워크는 원래 버전용으로 개발된 플러그인과 계속 호환할 수 있도록 호환성 모드에서 실행할 수 있습니다. AbstractTextEditor.setCompatibilityMode()를 사용하여 이 동작을 제어할 수 있습니다. 기본 설정은 true입니다.
호환성 모드가 true인 경우 편집기 및 눈금자 컨텍스트 메뉴의 ID는 AbstractTextEditor 프로토콜을 사용하여 설정될 수 있습니다. 메소드 setEditorContextMenuId 및 setRulerContextMenuId는 이러한 목적에 맞게 사용될 수 있습니다. 수퍼클래스 메뉴에 제공된 메뉴가 상속되지 않게 하려면 ID를 재설정하는 것이 유용합니다. 예를 들어, 예제의 JavaTextEditor는 다른 플러그인으로부터 일반 텍스트 컨트리뷰션을 상속하지 않도록 해당 컨텍스트 메뉴 ID가 Java 특정 ID가 되도록 재설정합니다.
protected void initializeEditor() { super.initializeEditor(); JavaEditorEnvironment.connect(this); setSourceViewerConfiguration(new JavaSourceViewerConfiguration()); setEditorContextMenuId("#JavaEditorContext"); setRulerContextMenuId("#JavaRulerContext"); }
구체적 계층 구조에 ID가 설정되지 않으면 AbstractTextEditor가 정의하는 기본 ID가 사용됩니다.
편집기 컨텍스트 메뉴 ID는 항상 <editor id>.EditorContext
이며,
여기서 <editor id>
는 편집기 ID입니다. 편집기의 ID는 편집기의 xml 선언에서 정의됩니다. 눈금자 컨텍스트 메뉴 ID는
항상 <editor id>.RulerContext
입니다.