blob: 0491c0f018a1576fdefde5a319739015732e1eea [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 ILOG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Joel Cheuoua - Initial API and implementation
*******************************************************************************/
package org.eclipse.jet.internal.editor.partition;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jdt.ui.text.JavaSourceViewerConfiguration;
import org.eclipse.jdt.ui.text.JavaTextTools;
import org.eclipse.jet.internal.editor.JETTextEditor;
import org.eclipse.jet.internal.editor.autoedit.JETTemplateAutoEditStrategy;
import org.eclipse.jet.internal.editor.configuration.delegates.IJETDefaultTextColorerDelegate;
import org.eclipse.jet.internal.editor.contentassist.JETCustomTagAssistProcessor;
import org.eclipse.jet.internal.editor.contentassist.JETDirectiveAssistProcessor;
import org.eclipse.jet.internal.editor.contentassist.JETJavaDeclarationAssistProcessor;
import org.eclipse.jet.internal.editor.contentassist.JETJavaExpressionAssistProcessor;
import org.eclipse.jet.internal.editor.contentassist.JETJavaScriptletAssistProcessor;
import org.eclipse.jet.internal.editor.formatter.JETCustomTagFormattingStrategy;
import org.eclipse.jet.internal.editor.formatter.JETDirectiveFormattingStrategy;
import org.eclipse.jet.internal.editor.formatter.JETJavaDeclarationFormattingStrategy;
import org.eclipse.jet.internal.editor.formatter.JETJavaExpressionFormattingStrategy;
import org.eclipse.jet.internal.editor.formatter.JETJavaScriptletFormattingStrategy;
import org.eclipse.jet.internal.editor.rules.ASTJETCommentRule;
import org.eclipse.jet.internal.editor.rules.ASTJETCustomTagRule;
import org.eclipse.jet.internal.editor.rules.ASTJETDirectiveRule;
import org.eclipse.jet.internal.editor.rules.ASTJETJavaDeclarationRule;
import org.eclipse.jet.internal.editor.rules.ASTJETJavaExpressionRule;
import org.eclipse.jet.internal.editor.rules.ASTJETJavaScriptletRule;
import org.eclipse.jet.internal.editor.scanners.JETCommentScanner;
import org.eclipse.jet.internal.editor.scanners.JETCustomTagScanner;
import org.eclipse.jet.internal.editor.scanners.JETDirectiveScanner;
import org.eclipse.jet.internal.editor.scanners.JETJavaDeclarationScanner;
import org.eclipse.jet.internal.editor.scanners.JETJavaExpressionScanner;
import org.eclipse.jet.internal.editor.scanners.JETJavaScriptletScanner;
import org.eclipse.jface.text.IAutoEditStrategy;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.ContentAssistant;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.formatter.IFormattingStrategy;
import org.eclipse.jface.text.presentation.IPresentationDamager;
import org.eclipse.jface.text.presentation.IPresentationRepairer;
import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
import org.eclipse.jface.text.rules.IPredicateRule;
import org.eclipse.jface.text.rules.ITokenScanner;
import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
import org.eclipse.jface.text.rules.Token;
/**
* @author pelder
*
*/
public class JETDocumentPartitionScanner extends RuleBasedPartitionScanner {
public static final String JET_COMMENT = "__jet_comment";
public static final String JET_CUSTOM_TAG = "__jet_xml_tag";
public static final String JET_DIRECTIVE = "__jet_directive";
public static final String JET_JAVA_DECLARATION = "__jet_java_declaration";
public static final String JET_JAVA_EXPRESSION = "__jet_java_expression";
public static final String JET_JAVA_SCRIPTLET = "__jet_java_scriptlet";
private Map tokenScanners;
private Map damagerRepairers;
private Map damagersOnly;
private Map repairersOnly;
private Map completionProcessors;
private Map formattingStrategies;
private JETTextEditor editor;
private List contentTypes;
private JETCustomTagScanner tagScanner;
private JETDirectiveScanner directiveScanner;
private JETJavaDeclarationScanner declarationScanner;
private JETJavaExpressionScanner expressionScanner;
private JETJavaScriptletScanner scriptletScanner;
private JETCommentScanner commentScanner;
private IContentAssistProcessor tagAssistProcessor;
private IContentAssistProcessor scriptletAssistProcessor;
private IContentAssistProcessor expressionAssistProcessor;
private IContentAssistProcessor declarationAssistProcessor;
private IContentAssistProcessor directiveAssistProcessor;
private IFormattingStrategy tagFormattingStrategy;
private IFormattingStrategy scriptletFormattingStrategy;
private IFormattingStrategy expressionFormattingStrategy;
private IFormattingStrategy declarationFormattingStrategy;
private IFormattingStrategy directiveFormattingStrategy;
private PartitionScannerBasedDamagerRepairer jetTextContentDamagerRepairer;
private JavaSourceViewerConfiguration javaSourceViewConfig;
public JETDocumentPartitionScanner(JETTextEditor editor) {
this.editor = editor;
List rules = new ArrayList();
org.eclipse.jface.text.rules.IToken jetComments = new Token(
"__jet_comment");
org.eclipse.jface.text.rules.IToken jetCustomTags = new Token(
"__jet_xml_tag");
org.eclipse.jface.text.rules.IToken jetDirective = new Token(
"__jet_directive");
org.eclipse.jface.text.rules.IToken jetJavaDeclaration = new Token(
"__jet_java_declaration");
org.eclipse.jface.text.rules.IToken jetJavaExpression = new Token(
"__jet_java_expression");
org.eclipse.jface.text.rules.IToken jetJavaScriptlet = new Token(
"__jet_java_scriptlet");
rules.add(new ASTJETCommentRule(editor, jetComments));
rules.add(new ASTJETCustomTagRule(editor, jetCustomTags));
rules.add(new ASTJETDirectiveRule(editor, jetDirective));
rules.add(new ASTJETJavaDeclarationRule(editor, jetJavaDeclaration));
rules.add(new ASTJETJavaExpressionRule(editor, jetJavaExpression));
rules.add(new ASTJETJavaScriptletRule(editor, jetJavaScriptlet));
IPredicateRule result[] = new IPredicateRule[rules.size()];
result = (IPredicateRule[]) rules.toArray(result);
setPredicateRules(result);
// used to get Java auto edit strategies without using internal JDT
// APIs.
javaSourceViewConfig = new JavaSourceViewerConfiguration(
new JavaTextTools(editor.getEditorPreferenceStore())
.getColorManager(), editor.getEditorPreferenceStore(),
editor, "__dftl_partitioning");
}
public int getNextCharacterOffset() {
return fOffset;
}
public String[] getContentTypes() {
if (contentTypes == null) {
contentTypes = new ArrayList();
contentTypes.add(IDocument.DEFAULT_CONTENT_TYPE);
contentTypes.add("__jet_comment");
contentTypes.add("__jet_xml_tag");
contentTypes.add("__jet_directive");
contentTypes.add("__jet_java_declaration");
contentTypes.add("__jet_java_expression");
contentTypes.add("__jet_java_scriptlet");
}
String result[] = new String[contentTypes.size()];
result = (String[]) contentTypes.toArray(result);
return result;
}
private void initTokenScanners() {
tokenScanners = new HashMap();
tokenScanners.put("__jet_comment", getCommentScanner());
tokenScanners.put("__jet_xml_tag", getCustomTagScanner());
tokenScanners.put("__jet_directive", getDirectiveScanner());
tokenScanners
.put("__jet_java_declaration", getJavaDeclarationScanner());
tokenScanners.put("__jet_java_expression", getJavaExpressionScanner());
tokenScanners.put("__jet_java_scriptlet", getJavaScriptletScanner());
}
private void initCompletionProcessors(ContentAssistant assistant) {
completionProcessors = new HashMap();
completionProcessors.put(IDocument.DEFAULT_CONTENT_TYPE,
getTextElementAssistProcessor(assistant));
completionProcessors.put("__jet_comment",
getCommentAssistProcessor(assistant));
completionProcessors.put("__jet_xml_tag",
getCustomTagAssistProcessor(assistant));
completionProcessors.put("__jet_directive",
getDirectiveAssistProcessor(assistant));
completionProcessors.put("__jet_java_declaration",
getJavaDeclarationAssistProcessor(assistant));
completionProcessors.put("__jet_java_expression",
getJavaExpressionAssistProcessor(assistant));
completionProcessors.put("__jet_java_scriptlet",
getJavaScriptletAssistProcessor(assistant));
}
private void initFormattingStrategies() {
formattingStrategies = new HashMap();
formattingStrategies.put(IDocument.DEFAULT_CONTENT_TYPE,
getTextElementFormattingStrategy());
formattingStrategies.put("__jet_comment",
getCommentFormattingStrategy());
formattingStrategies.put("__jet_xml_tag",
getCustomTagFormattingStrategy());
formattingStrategies.put("__jet_directive",
getDirectiveFormattingStrategy());
formattingStrategies.put("__jet_java_declaration",
getJavaDeclarationFormattingStrategy());
formattingStrategies.put("__jet_java_expression",
getJavaExpressionFormattingStrategy());
formattingStrategies.put("__jet_java_scriptlet",
getJavaScriptletFormattingStrategy());
}
private void initDamagerRepairers() {
damagerRepairers = new HashMap();
damagerRepairers.put("__jet_comment",
createDefaultDamagerRepairer("__jet_comment"));
damagerRepairers.put("__jet_xml_tag",
createDefaultDamagerRepairer("__jet_xml_tag"));
damagerRepairers.put("__jet_directive",
createDefaultDamagerRepairer("__jet_directive"));
damagerRepairers.put("__jet_java_declaration",
createDefaultDamagerRepairer("__jet_java_declaration"));
damagerRepairers.put("__jet_java_expression",
createDefaultDamagerRepairer("__jet_java_expression"));
damagerRepairers.put("__jet_java_scriptlet",
createDefaultDamagerRepairer("__jet_java_scriptlet"));
if (createJETTextContentDamagerRepairer() != null)
damagerRepairers.put(IDocument.DEFAULT_CONTENT_TYPE,
jetTextContentDamagerRepairer);
}
private void initDamagersOnly() {
damagersOnly = new HashMap();
}
protected void initRepairersOnly() {
repairersOnly = new HashMap();
}
protected IFormattingStrategy getTextElementFormattingStrategy() {
return null;
}
protected IFormattingStrategy getCommentFormattingStrategy() {
return null;
}
protected IFormattingStrategy getCustomTagFormattingStrategy() {
if (tagFormattingStrategy == null)
tagFormattingStrategy = new JETCustomTagFormattingStrategy();
return tagFormattingStrategy;
}
protected IFormattingStrategy getJavaScriptletFormattingStrategy() {
if (scriptletFormattingStrategy == null)
scriptletFormattingStrategy = new JETJavaScriptletFormattingStrategy();
return scriptletFormattingStrategy;
}
protected IFormattingStrategy getJavaExpressionFormattingStrategy() {
if (expressionFormattingStrategy == null)
expressionFormattingStrategy = new JETJavaExpressionFormattingStrategy();
return expressionFormattingStrategy;
}
protected IFormattingStrategy getJavaDeclarationFormattingStrategy() {
if (declarationFormattingStrategy == null)
declarationFormattingStrategy = new JETJavaDeclarationFormattingStrategy();
return declarationFormattingStrategy;
}
protected IFormattingStrategy getDirectiveFormattingStrategy() {
if (directiveFormattingStrategy == null)
directiveFormattingStrategy = new JETDirectiveFormattingStrategy();
return directiveFormattingStrategy;
}
protected IContentAssistProcessor getTextElementAssistProcessor(
ContentAssistant assistant) {
return null;
}
protected IContentAssistProcessor getCommentAssistProcessor(
ContentAssistant assistant) {
return null;
}
protected IContentAssistProcessor getCustomTagAssistProcessor(
ContentAssistant assistant) {
if (tagAssistProcessor == null)
tagAssistProcessor = new JETCustomTagAssistProcessor(editor);
return tagAssistProcessor;
}
protected IContentAssistProcessor getJavaScriptletAssistProcessor(
ContentAssistant assistant) {
if (scriptletAssistProcessor == null)
scriptletAssistProcessor = new JETJavaScriptletAssistProcessor(
editor);
return scriptletAssistProcessor;
}
protected IContentAssistProcessor getJavaExpressionAssistProcessor(
ContentAssistant assistant) {
if (expressionAssistProcessor == null)
expressionAssistProcessor = new JETJavaExpressionAssistProcessor(
editor);
return expressionAssistProcessor;
}
protected IContentAssistProcessor getJavaDeclarationAssistProcessor(
ContentAssistant assistant) {
if (declarationAssistProcessor == null)
declarationAssistProcessor = new JETJavaDeclarationAssistProcessor(
editor);
return declarationAssistProcessor;
}
protected IContentAssistProcessor getDirectiveAssistProcessor(
ContentAssistant assistant) {
if (directiveAssistProcessor == null)
directiveAssistProcessor = new JETDirectiveAssistProcessor(editor);
return directiveAssistProcessor;
}
protected ITokenScanner getCommentScanner() {
org.eclipse.jet.internal.editor.configuration.JETTokenStyleManager tokenStyleManager = editor
.getTokenStyleManager();
org.eclipse.jface.preference.IPreferenceStore preferenceStore = editor
.getEditorPreferenceStore();
if (commentScanner == null)
commentScanner = new JETCommentScanner(tokenStyleManager,
preferenceStore);
return commentScanner;
}
protected ITokenScanner getCustomTagScanner() {
org.eclipse.jet.internal.editor.configuration.JETTokenStyleManager tokenStyleManager = editor
.getTokenStyleManager();
org.eclipse.jface.preference.IPreferenceStore preferenceStore = editor
.getEditorPreferenceStore();
if (tagScanner == null)
tagScanner = new JETCustomTagScanner(tokenStyleManager,
preferenceStore);
return tagScanner;
}
protected ITokenScanner getJavaScriptletScanner() {
org.eclipse.jet.internal.editor.configuration.JETTokenStyleManager tokenStyleManager = editor
.getTokenStyleManager();
org.eclipse.jface.preference.IPreferenceStore preferenceStore = editor
.getEditorPreferenceStore();
if (scriptletScanner == null)
scriptletScanner = new JETJavaScriptletScanner(tokenStyleManager,
preferenceStore);
return scriptletScanner;
}
protected ITokenScanner getJavaExpressionScanner() {
org.eclipse.jet.internal.editor.configuration.JETTokenStyleManager tokenStyleManager = editor
.getTokenStyleManager();
org.eclipse.jface.preference.IPreferenceStore preferenceStore = editor
.getEditorPreferenceStore();
if (expressionScanner == null)
expressionScanner = new JETJavaExpressionScanner(tokenStyleManager,
preferenceStore);
return expressionScanner;
}
protected ITokenScanner getJavaDeclarationScanner() {
org.eclipse.jet.internal.editor.configuration.JETTokenStyleManager tokenStyleManager = editor
.getTokenStyleManager();
org.eclipse.jface.preference.IPreferenceStore preferenceStore = editor
.getEditorPreferenceStore();
if (declarationScanner == null)
declarationScanner = new JETJavaDeclarationScanner(
tokenStyleManager, preferenceStore);
return declarationScanner;
}
protected ITokenScanner getDirectiveScanner() {
org.eclipse.jet.internal.editor.configuration.JETTokenStyleManager tokenStyleManager = editor
.getTokenStyleManager();
org.eclipse.jface.preference.IPreferenceStore preferenceStore = editor
.getEditorPreferenceStore();
if (directiveScanner == null)
directiveScanner = new JETDirectiveScanner(tokenStyleManager,
preferenceStore);
return directiveScanner;
}
public ITokenScanner getTokenScanner(String contentType) {
if (tokenScanners == null)
initTokenScanners();
ITokenScanner scanner = (ITokenScanner) tokenScanners.get(contentType);
return scanner;
}
private PartitionScannerBasedDamagerRepairer createJETTextContentDamagerRepairer() {
if (jetTextContentDamagerRepairer == null) {
IJETDefaultTextColorerDelegate delegate = editor
.getCurrentColorerDelegate();
if (delegate != null) {
RuleBasedPartitionScanner partitionScanner = new RuleBasedPartitionScanner();
partitionScanner.setPredicateRules(delegate
.getPartitioningRules());
jetTextContentDamagerRepairer = new PartitionScannerBasedDamagerRepairer(
partitionScanner, delegate);
}
}
return jetTextContentDamagerRepairer;
}
public void updateJETTextContentDamagerRepairer() {
if (jetTextContentDamagerRepairer != null) {
IJETDefaultTextColorerDelegate delegate = editor
.getCurrentColorerDelegate();
if (delegate != null) {
RuleBasedPartitionScanner partitionScanner = new RuleBasedPartitionScanner();
partitionScanner.setPredicateRules(delegate
.getPartitioningRules());
jetTextContentDamagerRepairer
.setPartitionScanner(partitionScanner);
jetTextContentDamagerRepairer.setTokenScannerProvider(delegate);
}
}
}
private DefaultDamagerRepairer createDefaultDamagerRepairer(
String contentType) {
ITokenScanner tokenScanner = getTokenScanner(contentType);
return tokenScanner != null ? new DefaultDamagerRepairer(tokenScanner)
: null;
}
public IPresentationDamager getDamager(String contentType) {
if (damagerRepairers == null)
initDamagerRepairers();
IPresentationDamager damager = (IPresentationDamager) damagerRepairers
.get(contentType);
if (damager == null) {
if (damagersOnly == null)
initDamagersOnly();
damager = (IPresentationDamager) damagersOnly.get(contentType);
}
return damager;
}
public IPresentationRepairer getRepairer(String contentType) {
if (damagerRepairers == null)
initDamagerRepairers();
IPresentationRepairer repairer = (IPresentationRepairer) damagerRepairers
.get(contentType);
if (repairer == null) {
if (repairersOnly == null)
initRepairersOnly();
repairer = (IPresentationRepairer) repairersOnly.get(contentType);
}
return repairer;
}
public IContentAssistProcessor getCompletionProcessor(String contentType,
ContentAssistant assistant) {
if (completionProcessors == null)
initCompletionProcessors(assistant);
IContentAssistProcessor processor = (IContentAssistProcessor) completionProcessors
.get(contentType);
return processor;
}
public IFormattingStrategy getFormattingStrategy(String contentType) {
if (formattingStrategies == null)
initFormattingStrategies();
IFormattingStrategy formatter = (IFormattingStrategy) formattingStrategies
.get(contentType);
return formatter;
}
public IAutoEditStrategy[] getAutoEditStrategies(String contentType) {
IAutoEditStrategy result[] = (IAutoEditStrategy[]) null;
if ("__jet_directive".equals(contentType))
result = (new IAutoEditStrategy[] { new JETTemplateAutoEditStrategy() });
else if ("__jet_java_scriptlet".equals(contentType)) {
final List resultList = new ArrayList();
resultList.addAll(Arrays.asList(javaSourceViewConfig
.getAutoEditStrategies(null, "__dftl_partitioning")));
resultList.add(new JETTemplateAutoEditStrategy());
result = (IAutoEditStrategy[]) resultList
.toArray(new IAutoEditStrategy[resultList.size()]);
} else if ("__jet_java_declaration".equals(contentType)) {
final List resultList = new ArrayList();
resultList.addAll(Arrays.asList(javaSourceViewConfig
.getAutoEditStrategies(null, "__dftl_partitioning")));
resultList.add(new JETTemplateAutoEditStrategy());
result = (IAutoEditStrategy[]) resultList
.toArray(new IAutoEditStrategy[resultList.size()]);
}
return result;
}
}