새로 대상 지정 가능한 편집기 조치

readme 도구ReadmeEditorActionBarContributor를 사용하여 Workbench 메뉴 표시줄에 조치를 제공하는 자체 편집기를 정의합니다.  

<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>

지시자 클래스에서 발생하는 작업을 좀 더 자세히 살펴봅니다.

public ReadmeEditorActionBarContributor() {
	...
	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);
	...  
	handler2 = new EditorAction(MessageUtil.getString("Editor_Action2")); 
	...
	handler3 = new EditorAction(MessageUtil.getString("Editor_Action3")); 
	...

지시자가 작성되면 지시자는 두 개의 새로 대상 지정 가능한 조치(레이블 갱신을 허용하는 조치와 허용하지 않는 조치)를 작성합니다. 조치 작성 시 Workbench가 사용하는 방법과 같은 방법을 사용합니다. 편집기가 활성 파트일 경우 조치에 사용되는 두 개의 핸들러도 작성됩니다.  

그러면 조치에 대한 핸들러가 등록되는 위치는 어디입니까? 글로벌 핸들러를 설정하는 작업은 편집기에서 새로 대상 지정된 조치를 정의할 때와는 약간 다르게 수행됩니다. 그 이유는 다른 보기나 편집기가 활성화될 때 지시자가 활성 보기를 추적하고 다른 핸들러를 후크해야 하기 때문입니다. 사용자가 글로벌 조치 중 하나에 대한 핸들러를 설정할 때 Workbench에서 이 작업을 수행합니다. 다음은 ReadmeEditorActionBarContributor에서 이를 설정하는 방법을 보여줍니다.

public void init(IActionBars bars, IWorkbenchPage page) {
	super.init(bars, page);
	bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2);
	bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3);
	...

먼저 지시자는 새로 대상 지정된 조치에 대해 핸들러를 등록합니다. 이렇게 하면 편집기가 활성화될 때 지시자의 조치가 실행됩니다. 다음 단계는 페이지의 파트 리스너로 각 RetargetAction을 등록하는 것입니다.

	...
	// Hook retarget actions as page listeners
	page.addPartListener(action2);
	page.addPartListener(action3);
	IWorkbenchPart activePart = page.getActivePart();
	if (activePart != null) {
		action2.partActivated(activePart);
		action3.partActivated(activePart);
	}
}

RetargetAction을 파트 리스너로 추가하면 활성 파트가 변경될 때 이를 알 수 있습니다. 조치는 새로 활성화된 파트에서 정확한 글로벌 핸들러를 가져올 수 있습니다. 자세한 정보는 RetargetAction의 구현을 참조하십시오. 시작하려면 조치가 현재 활성 파트로 시작되어야 합니다. 

편집기 지시자가 삭제될 때 새로 대상 지정 가능한 조치를 페이지 리스너로 후크 해제해야 합니다.

public void dispose() {
	// Remove retarget actions as page listeners
	getPage().removePartListener(action2);
	getPage().removePartListener(action3);
}

마지막으로 한 편집기 클래스의 여러 인스턴스에서 조치 표시줄 지시자를 공유해야 합니다. 이런 이유로 활성 편집기가 변경되면 지시자가 적절한 편집기 인스턴스에 연결할 수 있도록 핸들러에게 알려야 합니다.

public void setActiveEditor(IEditorPart editor) {
	...
	handler2.setActiveEditor(editor);
	handler3.setActiveEditor(editor);
	...
}

편집기측 설정이 완료되었습니다. 편집기가 열리고 활성화되면 ReadmeEditorActionBarContributor에서 정의된 핸들러(및 레이블)는 Workbench 메뉴 표시줄에 나타납니다.

Workbench 메뉴 표시줄에 세 개의 편집기 조치가 있는 Readme 메뉴

이제 편집기의 지시문이 적절하므로 핸들러를 등록하기 위해 보기에서 수행해야 할 작업은 무엇입니까? 클라이언트측 코드는 Workbench 조치에 대해 핸들러를 등록하는 작업과 비슷하지만 조치 ID가 플러그인의 편집기에서 정의된다는 점이 다릅니다. ReadmeContentOutlinePage는 이 조치에 대해 핸들러를 등록합니다.

    public void createControl(Composite parent) {
	super.createControl(parent);
	...
	getSite().getActionBars().setGlobalActionHandler(
		IReadmeConstants.RETARGET2, 
		new OutlineAction(MessageUtil.getString("Outline_Action2")));  

	OutlineAction action = new OutlineAction(MessageUtil.getString("Outline_Action3")); 
	action.setToolTipText(MessageUtil.getString("Readme_Outline_Action3")); 
	getSite().getActionBars().setGlobalActionHandler(
		IReadmeConstants.LABELRETARGET3, 
		action);  
	...

아웃라이너에서 레이블 변경이 가능하므로 아웃라이너는 두 번째 조치에 대한 레이블 및 도구 팁 텍스트를 설정해야 합니다. readme 아웃라이너 보기가 활성화되면 이의 핸들러 및 레이블이 Workbench 메뉴 표시줄에 나타납니다.

하나의 이름이 바뀐 편집기 조치가 있는 Readme 메뉴

레이블이 다시 지정된 조치는 새 레이블을 표시합니다.