플랫폼 텍스트 프레임워크는 텍스트의 문서 모델을 정의하고 이 모델을 사용하여 텍스트를 표시하는 표시기를 제공합니다. 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의 클래스를 참조하십시오. 구문 색상을 살펴 볼 때 스캐너를 다시 살펴 보겠습니다.