-
Notifications
You must be signed in to change notification settings - Fork 24
/
HaskellDocumentProvider.java
67 lines (57 loc) · 2.38 KB
/
HaskellDocumentProvider.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Copyright (c) 2003-2005 by Leif Frenzel - see http://leiffrenzel.de
package net.sf.eclipsefp.haskell.ui.editor;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitioner;
import org.eclipse.jface.text.rules.*;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.editors.text.FileDocumentProvider;
import de.leiffrenzel.fp.haskell.core.util.ResourceUtil;
import net.sf.eclipsefp.haskell.ui.editor.text.HaskellPartitionScanner;
import net.sf.eclipsefp.haskell.ui.editor.text.LiterateHaskellPartitionScanner;
/** <p>The HaskellDocumentProvides knows how to create a Haskell document
* (a model for the editor) from a file resource.</p>
*
* @author Leif Frenzel
*/
public class HaskellDocumentProvider extends FileDocumentProvider {
private static final String[] TOKEN_TYPES = new String[] {
IDocument.DEFAULT_CONTENT_TYPE,
IPartitionTypes.HS_COMMENT,
IPartitionTypes.HS_LITERATE_COMMENT
};
public static IDocumentPartitioner createDocumentPartitioner() {
IPartitionTokenScanner partitionScanner = new HaskellPartitionScanner();
return new FastPartitioner( partitionScanner, TOKEN_TYPES );
}
protected IDocument createDocument( final Object elem ) throws CoreException {
IDocument result = super.createDocument( elem );
if( result != null ) {
IDocumentPartitioner partitioner = getPartitioner( elem );
partitioner.connect( result );
result.setDocumentPartitioner( partitioner );
}
return result;
}
// helping methods
//////////////////
private IDocumentPartitioner getPartitioner( final Object elem ) {
IPartitionTokenScanner partitionScanner;
if( isLiterate( elem ) ) {
partitionScanner = new LiterateHaskellPartitionScanner();
} else {
partitionScanner = new HaskellPartitionScanner();
}
return new FastPartitioner( partitionScanner, TOKEN_TYPES );
}
private boolean isLiterate( final Object elem ) {
boolean isLiterate = false;
if( elem instanceof IFileEditorInput ) {
IFile input = ( ( IFileEditorInput )elem ).getFile();
String literateExt = ResourceUtil.EXTENSION_LHS;
isLiterate = input.getFileExtension().equals( literateExt );
}
return isLiterate;
}
}