[326602] Auto activation does not work in javascript regions in webpages [326817] [editor] Leading and trailing HTML style comments in a JS region are not syntax highlighted as expected [326818] [validation] Text after HTML style comment in JavaScript region marked as validation error
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.web.ui/META-INF/MANIFEST.MF index 6fee1c7..9f0c0e6 100644 --- a/bundles/org.eclipse.wst.jsdt.web.ui/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.wst.jsdt.web.ui/META-INF/MANIFEST.MF
@@ -2,11 +2,12 @@ Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name.0 Bundle-SymbolicName: org.eclipse.wst.jsdt.web.ui; singleton:=true -Bundle-Version: 1.0.302.qualifier +Bundle-Version: 1.0.303.qualifier Bundle-Activator: org.eclipse.wst.jsdt.web.ui.internal.JsUIPlugin Bundle-Vendor: %Bundle-Vendor.0 Bundle-Localization: plugin Export-Package: org.eclipse.wst.jsdt.web.ui;x-internal:=true, + org.eclipse.wst.jsdt.web.ui.contentassist, org.eclipse.wst.jsdt.web.ui.internal;x-internal:=true, org.eclipse.wst.jsdt.web.ui.internal.autoedit;x-internal:=true, org.eclipse.wst.jsdt.web.ui.internal.contentassist;x-internal:=true,
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/StructuredTextViewerConfigurationJSDT.java b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/StructuredTextViewerConfigurationJSDT.java index a1d8070..825550e 100644 --- a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/StructuredTextViewerConfigurationJSDT.java +++ b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/StructuredTextViewerConfigurationJSDT.java
@@ -11,9 +11,12 @@ package org.eclipse.wst.jsdt.web.ui; import org.eclipse.jface.text.IAutoEditStrategy; +import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.wst.html.core.text.IHTMLPartitions; import org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML; +import org.eclipse.wst.jsdt.web.core.text.IJsPartitions; +import org.eclipse.wst.jsdt.web.ui.contentassist.JSDTStructuredContentAssistProcessor; import org.eclipse.wst.jsdt.web.ui.internal.autoedit.AutoEditStrategyForJs; /** @@ -54,4 +57,32 @@ return super.getAutoEditStrategies(sourceViewer, contentType); } } + + /** + * @see org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML#getContentAssistProcessors(org.eclipse.jface.text.source.ISourceViewer, java.lang.String) + */ + protected IContentAssistProcessor[] getContentAssistProcessors( + ISourceViewer sourceViewer, String partitionType) { + + IContentAssistProcessor[] processors; + + if(isJavascriptPartitionType(partitionType)) { + IContentAssistProcessor processor = new JSDTStructuredContentAssistProcessor( + this.getContentAssistant(), partitionType, sourceViewer); + processors = new IContentAssistProcessor[]{processor}; + } else { + processors = super.getContentAssistProcessors(sourceViewer, partitionType); + } + + return processors; + } + + /** + * @param partitionTypeID check to see if this partition type ID is for a Javascript partition type + * @return <code>true</code> if the given partiton type is a Javascript partition type, + * <code>false</code> otherwise + */ + private static boolean isJavascriptPartitionType(String partitionTypeID) { + return IJsPartitions.HtmlJsPartition.equals(partitionTypeID); + } }
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/contentassist/JSDTStructuredContentAssistProcessor.java b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/contentassist/JSDTStructuredContentAssistProcessor.java new file mode 100644 index 0000000..f677cb4 --- /dev/null +++ b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/contentassist/JSDTStructuredContentAssistProcessor.java
@@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2010 IBM Corporation 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.jsdt.web.ui.contentassist; + +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.contentassist.ContentAssistant; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.wst.jsdt.ui.PreferenceConstants; +import org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor; + +/** + * <p>Content assist processor for Javascript regions so that autoactivation will work in those regions.</p> + * + * <p><b>NOTE:</b> This class does not check that the given partition type is a javascript region, it just + * assumes it is, so the instantiator of this class must be sure they want the given partition type to be + * treated as if it was Javascript.</p> + */ +public class JSDTStructuredContentAssistProcessor extends StructuredContentAssistProcessor { + /** auto activation characters */ + private char[] fCompletionPropoaslAutoActivationCharacters; + + /** + * @param assistant {@link ContentAssistant} to use + * @param partitionTypeID the Javascript partition type this processor is for + * @param viewer {@link ITextViewer} this processor is acting in + */ + public JSDTStructuredContentAssistProcessor(ContentAssistant assistant, + String partitionTypeID, ITextViewer viewer) { + super(assistant, partitionTypeID, viewer, PreferenceConstants.getPreferenceStore()); + + //get the current user preference + getAutoActivationCharacterPreferences(); + } + + /** + * @see org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor#getCompletionProposalAutoActivationCharacters() + */ + public char[] getCompletionProposalAutoActivationCharacters() { + return this.fCompletionPropoaslAutoActivationCharacters; + } + + /** + * @see org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor#propertyChange( + * org.eclipse.jface.util.PropertyChangeEvent) + */ + public void propertyChange(PropertyChangeEvent event) { + String property = event.getProperty(); + if(property.equals(PreferenceConstants.CODEASSIST_AUTOACTIVATION) || + property.equals(PreferenceConstants.CODEASSIST_AUTOACTIVATION_TRIGGERS_JAVA)) { + + getAutoActivationCharacterPreferences(); + } + } + + /** + * <p>Gets the auto activation character user preferences for Javascript and stores them for later use</p> + */ + private void getAutoActivationCharacterPreferences() { + IPreferenceStore store = getPreferenceStore(); + + boolean doAuto = store.getBoolean(PreferenceConstants.CODEASSIST_AUTOACTIVATION); + if (doAuto) { + fCompletionPropoaslAutoActivationCharacters = + store.getString(PreferenceConstants.CODEASSIST_AUTOACTIVATION_TRIGGERS_JAVA).toCharArray(); + } else { + fCompletionPropoaslAutoActivationCharacters = null; + } + } +}
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/format/FormattingStrategyJSDT.java b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/format/FormattingStrategyJSDT.java index 6ff69e0..6993d66 100644 --- a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/format/FormattingStrategyJSDT.java +++ b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/format/FormattingStrategyJSDT.java
@@ -56,14 +56,8 @@ * (repeatedly) as the API evolves. */ public class FormattingStrategyJSDT extends ContextBasedFormattingStrategy { - private static final String XML_COMMENT_START = "<!--"; //$NON-NLS-1$ - private static final String XML_COMMENT_END = "//-->"; //$NON-NLS-1$ - - /** matches on <!-- at beginning of script region */ - private static final Pattern START_PATTERN = Pattern.compile("(\\A(\\s*<!--))"); - - /** matches on //--> or --> at end of script region */ - private static final Pattern END_PATTERN = Pattern.compile("(((//\\s*)?-->\\s*)\\z)"); + /** matches on //--> at end of script region */ + private static final Pattern END_PATTERN = Pattern.compile("((//.*-->\\s*)\\z)"); private static final int regionStartIndentLevel = 1; /** Documents to be formatted by this strategy */ @@ -114,17 +108,18 @@ String postText = lineDelim; //find start comment tag - Matcher matcher = START_PATTERN.matcher(jsTextNotTranslated); + Pattern startPattern = Pattern.compile("(\\A(\\s*<!--.*(" + lineDelim + ")?))"); + Matcher matcher = startPattern.matcher(jsTextNotTranslated); if(matcher.find()) { - jsTextNotTranslated = matcher.replaceAll(""); - preText = lineDelim + XML_COMMENT_START; + jsTextNotTranslated = matcher.replaceFirst(""); + preText = lineDelim + matcher.group().trim(); } //find end tag matcher = END_PATTERN.matcher(jsTextNotTranslated); if(matcher.find()) { - jsTextNotTranslated = matcher.replaceAll(""); - postText = lineDelim + XML_COMMENT_END + lineDelim; + jsTextNotTranslated = matcher.replaceFirst(""); + postText = lineDelim + matcher.group().trim() + lineDelim; } //replace the text in the document with the none-translated JS text but without HTML leading and trailing comments
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/IStyleConstantsJSDT.java b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/IStyleConstantsJSDT.java index 625fec6..6ec51cb 100644 --- a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/IStyleConstantsJSDT.java +++ b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/IStyleConstantsJSDT.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2007 IBM Corporation and others. + * Copyright (c) 2005, 2010 IBM Corporation 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 @@ -22,5 +22,6 @@ String JAVA_DEFAULT = "default"; //$NON-NLS-1$ String JAVA_KEYWORD = "keyword"; //$NON-NLS-1$ String JAVA_SINGLE_LINE_COMMENT = "single_line_comment"; //$NON-NLS-1$ + String JAVA_MULTI_LINE_COMMENT = "multi_line_comment"; //$NON-NLS-1$ String JAVA_STRING = "string"; //$NON-NLS-1$ }
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/JSDTCodeScanner.java b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/JSDTCodeScanner.java index f74f1b0..d6d50e3 100644 --- a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/JSDTCodeScanner.java +++ b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/JSDTCodeScanner.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2008 IBM Corporation and others. + * Copyright (c) 2004, 2010 IBM Corporation 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 @@ -14,13 +14,17 @@ import java.util.List; import org.eclipse.jface.text.rules.EndOfLineRule; +import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.IWordDetector; import org.eclipse.jface.text.rules.MultiLineRule; +import org.eclipse.jface.text.rules.PatternRule; import org.eclipse.jface.text.rules.SingleLineRule; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WordRule; import org.eclipse.wst.jsdt.web.core.javascript.JsDataTypes; +import org.eclipse.wst.xml.ui.internal.style.IStyleConstantsXML; /** * @@ -37,8 +41,10 @@ private IToken fDefaultToken; private IToken fKeywordToken; private IToken fSingleLineCommentToken; + private IToken fMultiLineCommentToken; private IToken fStringToken; private IToken fTypeToken; + private IToken fHTMLCommentBorderToken; /** * Creates a Java code scanner @@ -50,9 +56,9 @@ public void initializeRules() { List rules = new ArrayList(); // Add rule for multiple line comments. - rules.add(new MultiLineRule("/*", "*/", fSingleLineCommentToken));//$NON-NLS-1$ //$NON-NLS-2$ + rules.add(new MultiLineRule("/*", "*/", fMultiLineCommentToken));//$NON-NLS-1$ //$NON-NLS-2$ // Add rule for single line comments. - rules.add(new EndOfLineRule("//", fSingleLineCommentToken));//$NON-NLS-1$ + rules.add(new NoneInclusiveEndSequenceSingleLineRule("//", "-->", fSingleLineCommentToken));//$NON-NLS-1$ // Add rule for strings and character constants. rules.add(new SingleLineRule("\"", "\"", fStringToken, '\\'));//$NON-NLS-2$//$NON-NLS-1$ rules.add(new SingleLineRule("'", "'", fStringToken, '\\'));//$NON-NLS-2$//$NON-NLS-1$ @@ -70,6 +76,13 @@ wordRule.addWord(JSDTCodeScanner.fgConstants[i], fTypeToken); } rules.add(wordRule); + + //add word rule for HTML style comment delimiters + rules.add(new WordRule(new HTMLCommentDetector(), this.fHTMLCommentBorderToken)); + + //add rule for text after leading HTML comment delimiter + rules.add(new NoneInclusiveStartSequenceEndOfLineRule("<!--", this.fSingleLineCommentToken)); + IRule[] result = new IRule[rules.size()]; rules.toArray(result); setRules(result); @@ -83,8 +96,121 @@ fStringToken = new Token(data); } else if (tokenKey == IStyleConstantsJSDT.JAVA_SINGLE_LINE_COMMENT) { fSingleLineCommentToken = new Token(data); + } else if (tokenKey == IStyleConstantsJSDT.JAVA_MULTI_LINE_COMMENT) { + fMultiLineCommentToken = new Token(data); } else if (tokenKey == IStyleConstantsJSDT.JAVA_DEFAULT) { fDefaultToken = new Token(data); + } else if(tokenKey == IStyleConstantsXML.COMMENT_BORDER) { + fHTMLCommentBorderToken = new Token(data); + } + } + + /** + * <p>Detector for HTML comment delimiters.</p> + */ + private static class HTMLCommentDetector implements IWordDetector { + + /** + * @see IWordDetector#isWordStart(char) + */ + public boolean isWordStart(char c) { + return (c == '<' || c == '-'); + } + + /** + * @see IWordDetector#isWordPart(char) + */ + public boolean isWordPart(char c) { + return (c == '-' || c == '!' || c == '>'); + } + } + + /** + * <p>Same as a {@link SingleLineRule} except the given end sequence is not counted as part of the match.</p> + * + * @see SingleLineRule + */ + private static class NoneInclusiveEndSequenceSingleLineRule extends SingleLineRule { + + /** + * @param startSequence start sequence included in rule match + * @param endSequence end sequence that will end this rule but will not be counted as part of the match + * @param token to return on a match by this rule + */ + public NoneInclusiveEndSequenceSingleLineRule(String startSequence, String endSequence, IToken token) { + super(startSequence, endSequence, token); + } + + /** + * <p>If the end sequence is detected then scanner is rewind to just before the end sequence, + * otherwise acts the same as {@link PatternRule#endSequenceDetected}</p> + * + * @see PatternRule#endSequenceDetected + */ + protected boolean endSequenceDetected(ICharacterScanner scanner) { + boolean success = super.endSequenceDetected(scanner); + if(success) { + for (int length = this.fEndSequence.length-1; length > 0; length--) { + scanner.unread(); + } + + if(this.sequenceDetected(scanner, this.fEndSequence, false)) { + for (int length = this.fEndSequence.length; length > 0; length--) { + scanner.unread(); + } + } + } + return success; + } + } + + /** + * <p>Same as an {@link EndOfLineRule} except the given start sequence is not counted as part of the match.</p> + * + * @see EndOfLineRule + */ + private static class NoneInclusiveStartSequenceEndOfLineRule extends EndOfLineRule { + + /** + * @param startSequence start sequence the identifies the start of this match but is not counted as part of the match + * @param token to return on a match by this rule + */ + public NoneInclusiveStartSequenceEndOfLineRule(String startSequence, IToken token) { + super(startSequence, token); + } + + /** + * <p>Same as overridden function except unreads the scanner back the length of the start sequence + * since the start sequence is not counted as part of the match.</p> + * + * @see org.eclipse.jface.text.rules.PatternRule#doEvaluate(org.eclipse.jface.text.rules.ICharacterScanner, boolean) + */ + protected IToken doEvaluate(ICharacterScanner scanner, boolean resume) { + if (resume) { + if (endSequenceDetected(scanner)) + return fToken; + } else { + //unread the length of the start sequence since it is not counted as part of the match + for(int i = 0; i < this.fStartSequence.length && scanner.getColumn() >= 0; ++i) { + scanner.unread(); + } + + int c= scanner.read(); + if (c == fStartSequence[0]) { + if (sequenceDetected(scanner, fStartSequence, false)) { + if (endSequenceDetected(scanner)) + return fToken; + } + } + + //be sure to re-read the length of the start sequence if we did not match + for(int i = 0; i < this.fStartSequence.length && scanner.getColumn() >= 0; ++i) { + scanner.read(); + } + } + + scanner.unread(); + return Token.UNDEFINED; } } }
diff --git a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/LineStyleProviderForJSDT.java b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/LineStyleProviderForJSDT.java index fe6ad6d..75357fc 100644 --- a/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/LineStyleProviderForJSDT.java +++ b/bundles/org.eclipse.wst.jsdt.web.ui/src/org/eclipse/wst/jsdt/web/ui/internal/style/java/LineStyleProviderForJSDT.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2008 IBM Corporation and others. + * Copyright (c) 2004, 2010 IBM Corporation 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 @@ -24,11 +24,12 @@ import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; -import org.eclipse.wst.html.ui.internal.style.IStyleConstantsHTML; +import org.eclipse.wst.html.ui.internal.HTMLUIPlugin; import org.eclipse.wst.jsdt.ui.PreferenceConstants; import org.eclipse.wst.jsdt.web.ui.internal.JsUIPlugin; import org.eclipse.wst.jsdt.web.ui.internal.style.IStyleConstantsJs; import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion; +import org.eclipse.wst.sse.ui.internal.preferences.ui.ColorHelper; import org.eclipse.wst.sse.ui.internal.provisional.style.AbstractLineStyleProvider; import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider; import org.eclipse.wst.xml.ui.internal.style.IStyleConstantsXML; @@ -67,17 +68,17 @@ * * @param colorKey */ - private void addJavaTextAttribute(String colorKey) { - IPreferenceStore store = getJavaColorPreferences(); - if (store != null && colorKey != null) { + protected void addTextAttribute(String colorKey) { + IPreferenceStore javaStore = getJavaColorPreferences(); + if (javaStore != null && colorKey != null) { TextAttribute ta = null; if (colorKey == IStyleConstantsJSDT.JAVA_KEYWORD) { // keyword - RGB foreground = PreferenceConverter.getColor(store, PreferenceConstants.EDITOR_JAVA_KEYWORD_COLOR); - boolean bold = store.getBoolean(PreferenceConstants.EDITOR_JAVA_KEYWORD_BOLD); - boolean italics = store.getBoolean(PreferenceConstants.EDITOR_JAVA_KEYWORD_ITALIC); - boolean strikethrough = store.getBoolean(PreferenceConstants.EDITOR_JAVA_KEYWORD_STRIKETHROUGH); - boolean underline = store.getBoolean(PreferenceConstants.EDITOR_JAVA_KEYWORD_UNDERLINE); + RGB foreground = PreferenceConverter.getColor(javaStore, PreferenceConstants.EDITOR_JAVA_KEYWORD_COLOR); + boolean bold = javaStore.getBoolean(PreferenceConstants.EDITOR_JAVA_KEYWORD_BOLD); + boolean italics = javaStore.getBoolean(PreferenceConstants.EDITOR_JAVA_KEYWORD_ITALIC); + boolean strikethrough = javaStore.getBoolean(PreferenceConstants.EDITOR_JAVA_KEYWORD_STRIKETHROUGH); + boolean underline = javaStore.getBoolean(PreferenceConstants.EDITOR_JAVA_KEYWORD_UNDERLINE); int style = SWT.NORMAL; if (bold) { style = style | SWT.BOLD; @@ -94,11 +95,11 @@ ta = createTextAttribute(foreground, null, style); } else if (colorKey == IStyleConstantsJSDT.JAVA_STRING) { // string - RGB foreground = PreferenceConverter.getColor(store, PreferenceConstants.EDITOR_STRING_COLOR); - boolean bold = store.getBoolean(PreferenceConstants.EDITOR_STRING_BOLD); - boolean italics = store.getBoolean(PreferenceConstants.EDITOR_STRING_ITALIC); - boolean strikethrough = store.getBoolean(PreferenceConstants.EDITOR_STRING_STRIKETHROUGH); - boolean underline = store.getBoolean(PreferenceConstants.EDITOR_STRING_UNDERLINE); + RGB foreground = PreferenceConverter.getColor(javaStore, PreferenceConstants.EDITOR_STRING_COLOR); + boolean bold = javaStore.getBoolean(PreferenceConstants.EDITOR_STRING_BOLD); + boolean italics = javaStore.getBoolean(PreferenceConstants.EDITOR_STRING_ITALIC); + boolean strikethrough = javaStore.getBoolean(PreferenceConstants.EDITOR_STRING_STRIKETHROUGH); + boolean underline = javaStore.getBoolean(PreferenceConstants.EDITOR_STRING_UNDERLINE); int style = SWT.NORMAL; if (bold) { style = style | SWT.BOLD; @@ -115,11 +116,32 @@ ta = createTextAttribute(foreground, null, style); } else if (colorKey == IStyleConstantsJSDT.JAVA_SINGLE_LINE_COMMENT) { // single line comment - RGB foreground = PreferenceConverter.getColor(store, PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_COLOR); - boolean bold = store.getBoolean(PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_BOLD); - boolean italics = store.getBoolean(PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_ITALIC); - boolean strikethrough = store.getBoolean(PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_STRIKETHROUGH); - boolean underline = store.getBoolean(PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_UNDERLINE); + RGB foreground = PreferenceConverter.getColor(javaStore, PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_COLOR); + boolean bold = javaStore.getBoolean(PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_BOLD); + boolean italics = javaStore.getBoolean(PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_ITALIC); + boolean strikethrough = javaStore.getBoolean(PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_STRIKETHROUGH); + boolean underline = javaStore.getBoolean(PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_UNDERLINE); + int style = SWT.NORMAL; + if (bold) { + style = style | SWT.BOLD; + } + if (italics) { + style = style | SWT.ITALIC; + } + if (strikethrough) { + style = style | TextAttribute.STRIKETHROUGH; + } + if (underline) { + style = style | TextAttribute.UNDERLINE; + } + ta = createTextAttribute(foreground, null, style); + } else if (colorKey == IStyleConstantsJSDT.JAVA_MULTI_LINE_COMMENT) { + // multi line comment + RGB foreground = PreferenceConverter.getColor(javaStore, PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_COLOR); + boolean bold = javaStore.getBoolean(PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_BOLD); + boolean italics = javaStore.getBoolean(PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_ITALIC); + boolean strikethrough = javaStore.getBoolean(PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_STRIKETHROUGH); + boolean underline = javaStore.getBoolean(PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_UNDERLINE); int style = SWT.NORMAL; if (bold) { style = style | SWT.BOLD; @@ -136,11 +158,11 @@ ta = createTextAttribute(foreground, null, style); } else if (colorKey == IStyleConstantsJSDT.JAVA_DEFAULT) { // default - RGB foreground = PreferenceConverter.getColor(store, PreferenceConstants.EDITOR_JAVA_DEFAULT_COLOR); - boolean bold = store.getBoolean(PreferenceConstants.EDITOR_JAVA_DEFAULT_BOLD); - boolean italics = store.getBoolean(PreferenceConstants.EDITOR_JAVA_DEFAULT_ITALIC); - boolean strikethrough = store.getBoolean(PreferenceConstants.EDITOR_JAVA_DEFAULT_STRIKETHROUGH); - boolean underline = store.getBoolean(PreferenceConstants.EDITOR_JAVA_DEFAULT_UNDERLINE); + RGB foreground = PreferenceConverter.getColor(javaStore, PreferenceConstants.EDITOR_JAVA_DEFAULT_COLOR); + boolean bold = javaStore.getBoolean(PreferenceConstants.EDITOR_JAVA_DEFAULT_BOLD); + boolean italics = javaStore.getBoolean(PreferenceConstants.EDITOR_JAVA_DEFAULT_ITALIC); + boolean strikethrough = javaStore.getBoolean(PreferenceConstants.EDITOR_JAVA_DEFAULT_STRIKETHROUGH); + boolean underline = javaStore.getBoolean(PreferenceConstants.EDITOR_JAVA_DEFAULT_UNDERLINE); int style = SWT.NORMAL; if (bold) { style = style | SWT.BOLD; @@ -155,6 +177,36 @@ style = style | TextAttribute.UNDERLINE; } ta = createTextAttribute(foreground, null, style); + } else if(colorKey == IStyleConstantsXML.COMMENT_BORDER || + colorKey == IStyleConstantsJs.JSP_CONTENT) { + + /** @see AbstractLineStyleProvider#addTextAttribute */ + ta = (TextAttribute)getTextAttributes().get(colorKey); + String prefString = getHTMLColorPreferences().getString(colorKey); + String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString); + if (stylePrefs != null) { + RGB foreground = ColorHelper.toRGB(stylePrefs[0]); + RGB background = ColorHelper.toRGB(stylePrefs[1]); + boolean bold = Boolean.valueOf(stylePrefs[2]).booleanValue(); + boolean italic = Boolean.valueOf(stylePrefs[3]).booleanValue(); + boolean strikethrough = Boolean.valueOf(stylePrefs[4]).booleanValue(); + boolean underline = Boolean.valueOf(stylePrefs[5]).booleanValue(); + int style = SWT.NORMAL; + if (bold) { + style = style | SWT.BOLD; + } + if (italic) { + style = style | SWT.ITALIC; + } + if (strikethrough) { + style = style | TextAttribute.STRIKETHROUGH; + } + if (underline) { + style = style | TextAttribute.UNDERLINE; + } + + ta = createTextAttribute(foreground, background, style); + } } if (ta != null) { getTextAttributes().put(colorKey, ta); @@ -200,6 +252,10 @@ return PreferenceConstants.getPreferenceStore(); } + private IPreferenceStore getHTMLColorPreferences() { + return HTMLUIPlugin.getDefault().getPreferenceStore(); + } + /** * Returns a text attribute encoded in the given token. If the token's data * is not <code>null</code> and a text attribute it is assumed that it is @@ -223,52 +279,42 @@ protected void handlePropertyChange(PropertyChangeEvent event) { String styleKey = null; - String javaStyleKey = null; if (event != null) { String prefKey = event.getProperty(); // check if preference changed is a style preference - if (IStyleConstantsHTML.SCRIPT_AREA_BORDER.equals(prefKey)) { - styleKey = IStyleConstantsHTML.SCRIPT_AREA_BORDER; - } else if (IStyleConstantsXML.TAG_ATTRIBUTE_NAME.equals(prefKey)) { - styleKey = IStyleConstantsXML.TAG_ATTRIBUTE_NAME; - } else if (IStyleConstantsXML.TAG_ATTRIBUTE_VALUE.equals(prefKey)) { - styleKey = IStyleConstantsXML.TAG_ATTRIBUTE_VALUE; - } else if (IStyleConstantsJs.JSP_CONTENT.equals(prefKey)) { - styleKey = IStyleConstantsJs.JSP_CONTENT; + if(IStyleConstantsXML.COMMENT_BORDER.equals(prefKey)) { + styleKey = IStyleConstantsXML.COMMENT_BORDER; + } else if(IStyleConstantsXML.COMMENT_TEXT.equals(prefKey)) { + styleKey = IStyleConstantsXML.COMMENT_TEXT; } else if (PreferenceConstants.EDITOR_JAVA_KEYWORD_COLOR.equals(prefKey) || (PreferenceConstants.EDITOR_JAVA_KEYWORD_BOLD.equals(prefKey)) || (PreferenceConstants.EDITOR_JAVA_KEYWORD_ITALIC.equals(prefKey))) { - javaStyleKey = IStyleConstantsJSDT.JAVA_KEYWORD; + styleKey = IStyleConstantsJSDT.JAVA_KEYWORD; } else if (PreferenceConstants.EDITOR_STRING_COLOR.equals(prefKey) || (PreferenceConstants.EDITOR_STRING_BOLD.equals(prefKey)) || (PreferenceConstants.EDITOR_STRING_ITALIC.equals(prefKey))) { - javaStyleKey = IStyleConstantsJSDT.JAVA_STRING; + styleKey = IStyleConstantsJSDT.JAVA_STRING; } else if (PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_COLOR.equals(prefKey) || (PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_BOLD.equals(prefKey)) || (PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_ITALIC.equals(prefKey))) { - javaStyleKey = IStyleConstantsJSDT.JAVA_SINGLE_LINE_COMMENT; + styleKey = IStyleConstantsJSDT.JAVA_SINGLE_LINE_COMMENT; + } else if (PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_COLOR.equals(prefKey) || (PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_BOLD.equals(prefKey)) || (PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_ITALIC.equals(prefKey))) { + styleKey = IStyleConstantsJSDT.JAVA_MULTI_LINE_COMMENT; } else if (PreferenceConstants.EDITOR_JAVA_DEFAULT_COLOR.equals(prefKey) || (PreferenceConstants.EDITOR_JAVA_DEFAULT_BOLD.equals(prefKey)) || (PreferenceConstants.EDITOR_JAVA_DEFAULT_ITALIC.equals(prefKey))) { - javaStyleKey = IStyleConstantsJSDT.JAVA_DEFAULT; + styleKey = IStyleConstantsJSDT.JAVA_DEFAULT; } } if (styleKey != null) { // overwrite style preference with new value addTextAttribute(styleKey); - } - if (javaStyleKey != null) { - // overwrite style preference with new value - addJavaTextAttribute(javaStyleKey); + fRecHighlighter.refreshDisplay(); fScanner.initializeRules(); } - if (styleKey != null || javaStyleKey != null) { - // force a full update of the text viewer - super.getHighlighter().refreshDisplay(); - } } protected void loadColors() { - addTextAttribute(IStyleConstantsHTML.SCRIPT_AREA_BORDER); - addTextAttribute(IStyleConstantsXML.TAG_ATTRIBUTE_NAME); - addTextAttribute(IStyleConstantsXML.TAG_ATTRIBUTE_VALUE); + addTextAttribute(IStyleConstantsXML.COMMENT_BORDER); + addTextAttribute(IStyleConstantsXML.COMMENT_TEXT); addTextAttribute(IStyleConstantsJs.JSP_CONTENT); - addJavaTextAttribute(IStyleConstantsJSDT.JAVA_KEYWORD); - addJavaTextAttribute(IStyleConstantsJSDT.JAVA_STRING); - addJavaTextAttribute(IStyleConstantsJSDT.JAVA_SINGLE_LINE_COMMENT); - addJavaTextAttribute(IStyleConstantsJSDT.JAVA_DEFAULT); + addTextAttribute(IStyleConstantsJSDT.JAVA_KEYWORD); + addTextAttribute(IStyleConstantsJSDT.JAVA_STRING); + addTextAttribute(IStyleConstantsJSDT.JAVA_SINGLE_LINE_COMMENT); + addTextAttribute(IStyleConstantsJSDT.JAVA_MULTI_LINE_COMMENT); + addTextAttribute(IStyleConstantsJSDT.JAVA_DEFAULT); fScanner.initializeRules(); } @@ -325,6 +371,7 @@ protected void registerPreferenceManager() { getColorPreferences().addPropertyChangeListener(fPreferenceListener); getJavaColorPreferences().addPropertyChangeListener(fPreferenceListener); + this.getHTMLColorPreferences().addPropertyChangeListener(fPreferenceListener); } public void release() { @@ -335,5 +382,6 @@ protected void unRegisterPreferenceManager() { getColorPreferences().removePropertyChangeListener(fPreferenceListener); getJavaColorPreferences().removePropertyChangeListener(fPreferenceListener); + this.getHTMLColorPreferences().removePropertyChangeListener(fPreferenceListener); } } \ No newline at end of file