문서 및 파티션

플랫폼 텍스트 프레임워크는 텍스트의 문서 모델을 정의하고 이 모델을 사용하여 텍스트를 표시하는 표시기를 제공합니다. Java 편집기 예제 및 이 모델를 사용하는 방법을 살펴보는 것으로 시작합니다. org.eclipse.ui.editors를 논한 절에서 이미 살펴보았으므로, 편집기 확장을 등록하는 기본 기술에 대해서는 다루지 않겠습니다. 대신, 예제에서 편집기 클래스가 구현되는 방법에 대한 세부사항을 살펴보겠습니다.

문서 제공자 및 문서

Workbench에서는, 사용자가 도메인 요소(예: 파일 또는 아카이브 파일에 저장된 요소)를 선택하고 이 요소를 열면 일반적으로 편집기가 열립니다. 편집기 작성 시 이 편집기는 편집 중인 오브젝트를 설명하는 편집기 입력(IEditorInput)과 연관됩니다.

"*.jav" 확장자를 가진 파일을 열 때 Java 편집기 예제가 열립니다. 이런 경우 편집기의 입력은 IFileEditorInput입니다. 플랫폼 텍스트 프레임워크는 편집기 입력 자체에 대해서는 거의 고려하지 않습니다. 이 프레임워크는 효율적으로 텍스트를 표시하고 조작할 수 있도록 IDocument라고 하는 입력의 프리젠테이션 모델과 함께 작동합니다.

즉, 예상된 도메인 모델(편집기 입력)에서 프리젠테이션 모델로 맵핑할 방법이 있음을 의미합니다. 이 맵핑은 IDocumentProvider에서 정의됩니다. 편집기 입력이 있는 경우 문서 제공자는 적절한 IDocument를 리턴합니다.

Java 편집기 예제는 플러그인 org.eclipse.ui.editors에서 정의하는 TextFileDocumentProvider를 상속합니다. 확장 org.eclipse.ui.editors.documentProviders는 편집기 입력 유형(또는 파일 확장자)과 문서 제공자 간 맵핑을 정의하는 데 사용됩니다. 편집기 플러그인은 해당 문서 제공자를 다음과 같이 정의합니다.

   <extension
         point="org.eclipse.ui.editors.documentProviders">
<provider
            class="org.eclipse.ui.editors.text.TextFileDocumentProvider"
            inputTypes="org.eclipse.ui.IStorageEditorInput"
            id="org.eclipse.ui.editors.text.StorageDocumentProvider">
   </provider>
   </extension>   

이 확장점을 사용하면 플러그인이 문서 제공자를 등록하고 이를 파일 확장자 또는 편집기 입력 클래스와 연관시킬 수 있습니다. Java 편집기 예제는 고유 문서 제공자 확장을 정의하지 않으므로 IStorageEditorInput인 모든 입력 유형에 지정된 일반 문서 제공자를 상속합니다. 사용자가 편집하기 위해 파일을 열 때 플랫폼은 적절한 문서 제공자 인스턴스를 작성하는 세부사항을 관리합니다. 특정 문서 제공자가 파일 확장자에 대해 등록될 경우 이 문서 제공자가 사용됩니다. 파일 확장자에 대한 특정 문서 제공자가 없을 경우 편집기 입력 유형이 적절한 제공자를 찾는 데 사용됩니다.

Java 편집기 예제는 일반 플랫폼 문서 제공자를 사용하여 파일 버퍼링 및 기타 최적화와 같은 문서 제공자의 모든 기능을 이용할 수 있습니다.

문서 설정

Java 편집기가 플랫폼 텍스트 문서 제공자를 사용할 경우 Java 파일을 처리하기 위한 특수 작동을 어떻게 제공할 수 있습니까?

확장 org.eclipse.core.filebuffers.documentSetup은 파일 확장자와 IDocumentSetupParticipant간 맵핑을 정의하는 데 사용됩니다. 설정 참여자가 편집기에 제공되면 설정 참여자는 문서에 모든 특수 기능을 설정합니다.

<extension
	id="ExampleJavaDocumentSetupParticipant"
	name="%documentSetupParticipantName"
	point="org.eclipse.core.filebuffers.documentSetup">
	<participant
		extensions="jav"
		class="org.eclipse.ui.examples.javaeditor.JavaDocumentSetupParticipant">
	</participant>
   </extension>   

이 확장 정의는 Java 특정 타스크에 문서를 설정할 기회를 예제에 제공합니다. 그러면 JavaDocumentSetupParticipant가 수행하는 것은 무엇입니까? 이제 설정 메소드의 단순화된 버전을 살펴 보게 됩니다.

 	public void setup(IDocument document) {
		...
		IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);
		partitioner.connect(document);
		...
	}

설정 코드는 파티셔너라는 오브젝트를 구성합니다.

파티션

파티셔너(IDocumentPartitioner)는 문서를 파티션이라는 겹치지 않는 영역으로 분리합니다.  파티션(ITypedRegion이 나타내는)은 구문 강조표시 또는 형식화처럼 기능과 관련하여 문서의 다른 섹션을 다르게 처리하는 데 유용합니다.

Java 편집기 예제의 경우 문서는 javadoc 주석, 복수행 주석 등을 나타내는 파티션으로 분리됩니다. 각 영역은 컨텐츠 유형 및 문서의 해당 위치에 지정됩니다.  위치는 사용자 편집 텍스트로 갱신됩니다.

규칙 기반 문서 파티셔닝

문서 파티셔녀에 대한 적절한 구현을 판별하는 것은 각 편집기에 달려 있습니다. 규칙 기반 문서 스캐닝을 위한 지원은 org.eclipse.jface.text.rules에 제공됩니다. 규칙 기반 기반 스캐너를 사용하면 편집기는 프레임워크에서 제공하는 FastPartitioner를 사용할 수 있습니다.

IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);

RuleBasedPartitionScanner는 규칙 기반 스캐너의 수퍼클래스입니다. 서브클래스는 문서를 스캔할 때 행 분리문자, 공백 및 일반 패턴 등의 토큰을 구별하는 데 사용해야 할 규칙을 열거하고 구현해야 합니다. 예제의 JavaPartitionScanner는 단일행 주석, 문자 상수, javadoc. 복수행 주석 및 단어를 구별하는 데 필요한 규칙을 정의합니다. 다음과 같이 스캐너의 생성자에서 이를 수행합니다.

public JavaPartitionScanner() {
	super();
	IToken javaDoc= new Token(JAVA_DOC);
	IToken comment= new Token(JAVA_MULTILINE_COMMENT);

	List rules= new ArrayList();
	// Add rule for single line comments.
	rules.add(new EndOfLineRule("//", Token.UNDEFINED)); 

	// Add rule for strings and character constants.
	rules.add(new SingleLineRule("\"", "\"", Token.UNDEFINED, '\\')); 
	rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); 

	// Add special case word rule.
	rules.add(new WordPredicateRule(comment));

	// Add rules for multi-line comments and javadoc.
	rules.add(new MultiLineRule("/**", "*/", javaDoc, (char) 0, true)); 
	rules.add(new MultiLineRule("/*", "*/", comment, (char) 0, true)); 

	IPredicateRule[] result= new IPredicateRule[rules.size()];
	rules.toArray(result);
	setPredicateRules(result);
}

사용 가능한 규칙 유형 및 규칙을 정의하는 데 대한 자세한 내용은 org.eclipse.jface.text.rules의 클래스를 참조하십시오. 구문 색상을 살펴 볼 때 스캐너를 다시 살펴 보겠습니다.