http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLCompletionProcessor.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLCompletionProcessor.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLCompletionProcessor.java new file mode 100644 index 0000000..1eefd68 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLCompletionProcessor.java @@ -0,0 +1,331 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Stack; +import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.contentassist.CompletionProposal; +import org.eclipse.jface.text.contentassist.ContextInformation; +import org.eclipse.jface.text.contentassist.ContextInformationValidator; +import org.eclipse.jface.text.contentassist.ICompletionProposal; +import org.eclipse.jface.text.contentassist.IContextInformation; +import org.eclipse.jface.text.contentassist.IContextInformationValidator; + +public class HTMLCompletionProcessor extends HTMLTemplateAssistProcessor { + + private int offset; + private boolean xhtmlMode = false; + private char[] chars = {}; + private boolean assistCloseTag = true; + protected String[] getLastWord(final String text) { + StringBuilder sb = new StringBuilder(); + Stack<String> stack = new Stack<String>(); + String word = ""; + String prevTag = ""; + String lastTag = ""; + String attr = ""; + String temp1 = ""; // temporary + String temp2 = ""; // temporary + for (int i = 0; i < text.length(); i++) { + char c = text.charAt(i); + // skip scriptlet + if (c == '<' && text.length() > i + 1 && text.charAt(i + 1) == '%') { + i = text.indexOf("%>", i + 2); + if (i == -1) { + i = text.length(); + } + continue; + } + // skip XML declaration + if (c == '<' && text.length() > i + 1 && text.charAt(i + 1) == '?') { + i = text.indexOf("?>", i + 2); + if (i == -1) { + i = text.length(); + } + continue; + } + + if (isDelimiter(c)) { + temp1 = sb.toString(); + + // skip whitespaces in the attribute value + if (temp1.length() > 1 + && ((temp1.startsWith("\"") && !temp1.endsWith("\"") && c != '"') + || (temp1.startsWith("'") && !temp1.endsWith("'") && c != '\''))) { + sb.append(c); + continue; + } + if (temp1.length() == 1 && ((temp1.equals("\"") || (temp1.equals("'"))))) { + sb.append(c); + continue; + } + + if (!temp1.equals("")) { + temp2 = temp1; + if (temp2.endsWith("=") && !prevTag.equals("") && !temp2.equals("=")) { + attr = temp2.substring(0, temp2.length() - 1); + } + } + if (temp1.startsWith("<") && !temp1.startsWith("</") && !temp1.startsWith("<!")) { + prevTag = temp1.substring(1); + if (!temp1.endsWith("/")) { + stack.push(prevTag); + } + } else if (temp1.startsWith("</") && stack.size() != 0) { + stack.pop(); + } else if ((!temp1.startsWith("\"") && !temp1.startsWith("'")) + && temp1.endsWith("/") && stack.size() != 0) { + stack.pop(); + } + sb.setLength(0); + + if (c == '<') { + sb.append(c); + } else if (c == '"' || c == '\'') { + if (temp1.startsWith("\"") || temp1.startsWith("'")) { + sb.append(temp1); + } + sb.append(c); + } else if (c == '>') { + prevTag = ""; + attr = ""; + } + } else { + if (c == '=' && !prevTag.equals("")) { + attr = temp2.trim(); + } + temp1 = sb.toString(); + if (temp1.length() > 1 + && (temp1.startsWith("\"") && temp1.endsWith("\"")) + || (temp1.startsWith("'") && temp1.endsWith("'"))) { + sb.setLength(0); + } + sb.append(c); + } + } + + if (stack.size() != 0) { + lastTag = (String) stack.pop(); + } + // Hmm... it's not perfect... + if (attr.endsWith("=")) { + attr = attr.substring(0, attr.length() - 1); + } + word = sb.toString(); + + return new String[]{word, prevTag, lastTag, attr}; + } + + //Tests a character is delimiter or not delimiter. + protected boolean isDelimiter(final char c) { + return (c == ' ' || c == '(' || c == ')' || c == ',' //|| c == '.' + || c == ';' || c == '\n' || c == '\r' || c == '\t' || c == '+' + || c == '>' || c == '<' || c == '*' || c == '^' //|| c == '{' + //|| c == '}' + || c == '[' || c == ']' || c == '"' || c == '\''); + } + + protected List<TagInfo> getTagList() { + return TagDefinition.getTagInfoAsList(); + } + + protected TagInfo getTagInfo(final String name) { + List<TagInfo> tagList = TagDefinition.getTagInfoAsList(); + for (int i = 0; i < tagList.size(); i++) { + TagInfo info = (TagInfo) tagList.get(i); + if (info.getTagName().equals(name)) { + return info; + } + } + + return null; + } + + public ICompletionProposal[] computeCompletionProposals(final ITextViewer viewer, + final int documentOffset) { + + String text = viewer.getDocument().get().substring(0, documentOffset); + String[] dim = getLastWord(text); + String word = dim[0].toLowerCase(); + String prev = dim[1].toLowerCase(); + String last = dim[2]; + + this.offset = documentOffset; + + List<ICompletionProposal> list = new ArrayList<ICompletionProposal>(); + List<TagInfo> tagList = getTagList(); + + // attribute value + if (word.startsWith("<") && !word.equals("</")) { + + TagInfo parent = getTagInfo(last); + //tagList = new ArrayList < TagInfo>(); + if (parent != null) { + String[] childNames = parent.getChildTagNames(); + for (int i = 0; i < childNames.length; i++) { + tagList.add(getTagInfo(childNames[i])); + } + + } + for (int i = 0; i < tagList.size(); i++) { + TagInfo tagInfo = (TagInfo) tagList.get(i); + if (tagInfo instanceof TextInfo) { + TextInfo textInfo = (TextInfo) tagInfo; + if ((textInfo.getText().toLowerCase()).indexOf(word) == 0) { + list.add(new CompletionProposal( + textInfo.getText(), documentOffset - word.length(), + word.length(), textInfo.getPosition())); + } + continue; + } + String tagName = tagInfo.getTagName(); + if (("<" + tagInfo.getTagName().toLowerCase()).indexOf(word) == 0) { + String assistKeyword = tagName; + int position = 0; + // required attributes + AttributeInfo[] requierAttrs = tagInfo.getRequiredAttributeInfo(); + for (int j = 0; j < requierAttrs.length; j++) { + assistKeyword = assistKeyword + " " + requierAttrs[j].getAttributeName(); + if (requierAttrs[j].hasValue()) { + assistKeyword = assistKeyword + "=\"\""; + if (j == 0) { + position = tagName.length() + requierAttrs[j].getAttributeName().length() + 3; + } + } + } + if (tagInfo.hasBody()) { + assistKeyword = assistKeyword + ">"; + if (true) { + if (position == 0) { + position = assistKeyword.length(); + } + assistKeyword = assistKeyword + "</" + tagName + ">"; + } + } else { + if (tagInfo.isEmptyTag() && !xhtmlMode) { + assistKeyword += ">"; + } else { + assistKeyword += "/>"; + } + } + if (position == 0) { + position = assistKeyword.length(); + } + try { + list.add(new CompletionProposal( + assistKeyword, documentOffset - word.length() + 1, + word.length() - 1, position)); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + // attribute + } else if (!prev.equals("")) { + String tagName = prev; + TagInfo tagInfo = getTagInfo(tagName); + if (tagInfo != null) { + AttributeInfo[] attrList = tagInfo.getAttributeInfo(); + for (int j = 0; j < attrList.length; j++) { + if (attrList[j].getAttributeName().toLowerCase().indexOf(word) == 0) { + String assistKeyword = null; + int position = 0; + if (attrList[j].hasValue()) { + assistKeyword = attrList[j].getAttributeName() + "=\"\""; + position = 2; + } else { + assistKeyword = attrList[j].getAttributeName(); + position = 0; + } + list.add(new CompletionProposal( + assistKeyword, documentOffset - word.length(), word.length(), + attrList[j].getAttributeName().length() + position)); + } + } + } + // close tag + } else if (!last.equals("")) { + TagInfo info = getTagInfo(last); + if (info == null || xhtmlMode || info.hasBody() || !info.isEmptyTag()) { + String assistKeyword = "</" + last + ">"; + int length = 0; + if (word.equals("</")) { + length = 2; + } + list.add(new CompletionProposal( + assistKeyword, documentOffset - length, length, + assistKeyword.length())); + } + } + + sortCompilationProposal(list); + + ICompletionProposal[] templates = super.computeCompletionProposals(viewer, documentOffset); + for (int i = 0; i < templates.length; i++) { + list.add(templates[i]); + } + + ICompletionProposal[] prop = list.toArray(new ICompletionProposal[list.size()]); + return prop; + } + + @Override public IContextInformation[] computeContextInformation(final ITextViewer viewer, + final int documentOffset) { + ContextInformation[] info = new ContextInformation[0]; + return info; + } + + @Override public char[] getCompletionProposalAutoActivationCharacters() { + return chars; + } + + @Override public char[] getContextInformationAutoActivationCharacters() { + return chars; + } + + @Override public IContextInformationValidator getContextInformationValidator() { + return new ContextInformationValidator(this); + } + + @Override public String getErrorMessage() { + return "Error"; + } + + public static void sortCompilationProposal(final List<ICompletionProposal> prop) { + Collections.sort(prop, new Comparator<ICompletionProposal>() { + public int compare(final ICompletionProposal o1, final ICompletionProposal o2) { + return o1.getDisplayString().compareTo(o2.getDisplayString()); + } + }); + } + + public void setAutoAssistChars(final char[] chars) { + if (chars != null) { + this.chars = chars; + } + } + + public void setAssistCloseTag(final boolean assistCloseTag) { + this.assistCloseTag = assistCloseTag; + } +}
http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLContextType.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLContextType.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLContextType.java new file mode 100644 index 0000000..c355623 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLContextType.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import org.apache.syncope.ide.eclipse.plugin.Activator; +import org.eclipse.jface.text.templates.GlobalTemplateVariables; +import org.eclipse.jface.text.templates.TemplateContextType; + +public class HTMLContextType extends TemplateContextType { + + public static final String CONTEXT_TYPE + = Activator.PLUGIN_ID + ".templateContextType.html"; + + public HTMLContextType() { + addResolver(new GlobalTemplateVariables.Cursor()); + addResolver(new GlobalTemplateVariables.WordSelection()); + addResolver(new GlobalTemplateVariables.LineSelection()); + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLFileDocumentProvider.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLFileDocumentProvider.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLFileDocumentProvider.java new file mode 100644 index 0000000..2256915 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLFileDocumentProvider.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IDocumentPartitioner; +import org.eclipse.jface.text.rules.FastPartitioner; +import org.eclipse.ui.editors.text.FileDocumentProvider; + +public class HTMLFileDocumentProvider extends FileDocumentProvider { + + public IDocument createDocument(final Object element) throws CoreException { + IDocument document = super.createDocument(element); + if (document != null) { + IDocumentPartitioner partitioner = + new FastPartitioner( + new HTMLPartitionScanner(), + new String[]{ + HTMLPartitionScanner.HTML_TAG, + HTMLPartitionScanner.HTML_COMMENT, + HTMLPartitionScanner.HTML_SCRIPT, + HTMLPartitionScanner.HTML_DOCTYPE, + HTMLPartitionScanner.HTML_DIRECTIVE, + HTMLPartitionScanner.JAVASCRIPT, + HTMLPartitionScanner.HTML_CSS, + HTMLPartitionScanner.SYNCOPE_TAG}); + partitioner.connect(document); + document.setDocumentPartitioner(partitioner); + } + return document; + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLPartitionScanner.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLPartitionScanner.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLPartitionScanner.java new file mode 100644 index 0000000..ac52527 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLPartitionScanner.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.text.rules.EndOfLineRule; +import org.eclipse.jface.text.rules.IPredicateRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.MultiLineRule; +import org.eclipse.jface.text.rules.RuleBasedPartitionScanner; +import org.eclipse.jface.text.rules.Token; + +public class HTMLPartitionScanner extends RuleBasedPartitionScanner { + + public static final String HTML_DEFAULT = "__html_default"; + public static final String HTML_COMMENT = "__html_comment"; + public static final String HTML_TAG = "__html_tag"; + public static final String HTML_SCRIPT = "__html_script"; + public static final String HTML_DOCTYPE = "__html_doctype"; + public static final String HTML_DIRECTIVE = "__html_directive"; + public static final String JAVASCRIPT = "__html_javascript"; + public static final String HTML_CSS = "__html_css"; + public static final String PREFIX_TAG = "__prefix_tag"; + public static final String SYNCOPE_TAG = "__syncope_tag"; + + public HTMLPartitionScanner() { + + IToken htmlComment = new Token(HTML_COMMENT); + IToken htmlTag = new Token(HTML_TAG); + IToken prefixTag = new Token(PREFIX_TAG); + IToken htmlScript = new Token(HTML_SCRIPT); + IToken htmlDoctype = new Token(HTML_DOCTYPE); + IToken htmlDirective = new Token(HTML_DIRECTIVE); + IToken javaScript = new Token(JAVASCRIPT); + IToken htmlCss = new Token(HTML_CSS); + IToken syncopeTag = new Token(SYNCOPE_TAG); + + List<IPredicateRule> rules = new ArrayList<IPredicateRule>(); + + rules.add(new MultiLineRule(" <!--", "-->", htmlComment)); + rules.add(new MultiLineRule(" <%--", "--%>", htmlComment)); + rules.add(new DocTypeRule(htmlDoctype)); + rules.add(new MultiLineRule(" <%@", "%>", htmlDirective)); + rules.add(new MultiLineRule(" <%", "%>", htmlScript)); + rules.add(new MultiLineRule(" <![CDATA[", "]]>", htmlDoctype)); + rules.add(new MultiLineRule(" <?xml", "?>", htmlDoctype)); + rules.add(new MultiLineRule(" <script", " </script>", javaScript)); + rules.add(new MultiLineRule(" <style", " </style>", htmlCss)); + //rules.add(new MultiLineRule("${", "}", syncopeTag)); + rules.add(new EndOfLineRule("$$", syncopeTag)); + rules.add(new TagRule(prefixTag, TagRule.PREFIX)); + rules.add(new TagRule(htmlTag, TagRule.NO_PREFIX)); + rules.add(new SyncopeTagRule(syncopeTag, SyncopeTagRule.PREFIX)); + rules.add(new SyncopeTagRule(syncopeTag, SyncopeTagRule.NO_PREFIX)); + + setPredicateRules(rules.toArray(new IPredicateRule[rules.size()])); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLScanner.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLScanner.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLScanner.java new file mode 100644 index 0000000..6444ddb --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLScanner.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.RuleBasedScanner; +import org.eclipse.jface.text.rules.WhitespaceRule; + +public class HTMLScanner extends RuleBasedScanner { + + public HTMLScanner() { + + IRule[] rules = new IRule[1]; + rules[0] = new WhitespaceRule(new HTMLWhitespaceDetector()); + setRules(rules); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTagDamagerRepairer.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTagDamagerRepairer.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTagDamagerRepairer.java new file mode 100644 index 0000000..9a6f155 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTagDamagerRepairer.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import org.eclipse.jface.text.DocumentEvent; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITypedRegion; +import org.eclipse.jface.text.Region; +import org.eclipse.jface.text.rules.DefaultDamagerRepairer; +import org.eclipse.jface.text.rules.ITokenScanner; + +public class HTMLTagDamagerRepairer extends DefaultDamagerRepairer { + + public HTMLTagDamagerRepairer(final ITokenScanner scanner) { + super(scanner); + } + + public IRegion getDamageRegion(final ITypedRegion partition, final DocumentEvent e, + final boolean documentPartitioningChanged) { + if (!documentPartitioningChanged) { + String source = fDocument.get(); + int start = source.substring(0, e.getOffset()).lastIndexOf('<'); + if (start == -1) { + start = 0; + } + int end = source.indexOf('>', e.getOffset()); + int nextEnd = source.indexOf('>', end + 1); + if (nextEnd >= 0 && nextEnd > end) { + end = nextEnd; + } + int end2 = e.getOffset() + (e.getText() == null ? e.getLength() : e.getText().length()); + if (end == -1) { + end = source.length(); + } else if (end2 > end) { + end = end2; + } else { + end++; + } + + return new Region(start, end - start); + } + return partition; + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTagScanner.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTagScanner.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTagScanner.java new file mode 100644 index 0000000..e40d35b --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTagScanner.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import org.eclipse.jface.text.TextAttribute; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.MultiLineRule; +import org.eclipse.jface.text.rules.RuleBasedScanner; +import org.eclipse.jface.text.rules.Token; +import org.eclipse.jface.text.rules.WhitespaceRule; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.widgets.Display; + +public class HTMLTagScanner extends RuleBasedScanner { + + public HTMLTagScanner(final boolean bold) { + IToken string = null; + if (bold) { + RGB rgb = IHTMLColorConstants.TAGLIB_ATTR; + Color color = new Color(Display.getCurrent(), rgb); + string = new Token(new TextAttribute(color)); + } else { + RGB rgb = IHTMLColorConstants.STRING; + Color color = new Color(Display.getCurrent(), rgb); + string = new Token(new TextAttribute(color)); + } + IRule[] rules = new IRule[3]; + rules[0] = new MultiLineRule("\"" , "\"" , string, '\\'); + rules[1] = new MultiLineRule("'" , "'" , string, '\\'); + rules[2] = new WhitespaceRule(new HTMLWhitespaceDetector()); + setRules(rules); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTemplateAssistProcessor.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTemplateAssistProcessor.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTemplateAssistProcessor.java new file mode 100644 index 0000000..164c44c --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTemplateAssistProcessor.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.Region; +import org.eclipse.jface.text.contentassist.ICompletionProposal; +import org.eclipse.jface.text.templates.Template; +import org.eclipse.jface.text.templates.TemplateCompletionProcessor; +import org.eclipse.jface.text.templates.TemplateContext; +import org.eclipse.jface.text.templates.TemplateContextType; +import org.eclipse.jface.text.templates.TemplateException; +import org.eclipse.swt.graphics.Image; + +public class HTMLTemplateAssistProcessor extends TemplateCompletionProcessor { + + protected Template[] getTemplates(final String contextTypeId) { + HTMLTemplateManager manager = HTMLTemplateManager.getInstance(); + return manager.getTemplateStore().getTemplates(); + } + + protected TemplateContextType getContextType(final ITextViewer viewer, final IRegion region) { + HTMLTemplateManager manager = HTMLTemplateManager.getInstance(); + return manager.getContextTypeRegistry().getContextType(HTMLContextType.CONTEXT_TYPE); + } + + public ICompletionProposal[] computeCompletionProposals(final ITextViewer viewer, final int offsetinp) { + + int offset = offsetinp; + ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection(); + + // adjust offset to end of normalized selection + if (selection.getOffset() == offset) { + offset = selection.getOffset() + selection.getLength(); + } + + String prefix = extractPrefix(viewer, offset); + Region region = new Region(offset - prefix.length(), prefix.length()); + TemplateContext context = createContext(viewer, region); + if (context == null) { + return new ICompletionProposal[0]; + } + context.setVariable("selection", selection.getText()); + Template[] templates = getTemplates(context.getContextType().getId()); + List<ICompletionProposal> matches = new ArrayList<ICompletionProposal>(); + for (int i = 0; i < templates.length; i++) { + Template template = templates[i]; + try { + context.getContextType().validate(template.getPattern()); + } catch (final TemplateException e) { + continue; + } + if (template.getName().startsWith(prefix) + && template.matches(prefix, context.getContextType().getId())) { + matches.add(createProposal(template, context, (IRegion) region, getRelevance(template, prefix))); + } + } + return matches.toArray(new ICompletionProposal[matches.size()]); + } + + @Override + protected Image getImage(final Template arg0) { + return null; + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTemplateManager.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTemplateManager.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTemplateManager.java new file mode 100644 index 0000000..86bcda8 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLTemplateManager.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import java.io.IOException; + +import org.apache.syncope.ide.eclipse.plugin.Activator; +import org.eclipse.jface.text.templates.ContextTypeRegistry; +import org.eclipse.jface.text.templates.persistence.TemplateStore; +import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry; +import org.eclipse.ui.editors.text.templates.ContributionTemplateStore; + +public final class HTMLTemplateManager { + + private static final String CUSTOM_TEMPLATES_KEY + = Activator.PLUGIN_ID + ".customtemplates"; + private static HTMLTemplateManager INSTANCE; + private TemplateStore fStore; + private ContributionContextTypeRegistry fRegistry; + + private HTMLTemplateManager() { + } + + public static HTMLTemplateManager getInstance() { + if (INSTANCE == null) { + INSTANCE = new HTMLTemplateManager(); + } + return INSTANCE; + } + + public TemplateStore getTemplateStore() { + if (fStore == null) { + fStore = new ContributionTemplateStore(getContextTypeRegistry(), + Activator.getDefault().getPreferenceStore(), CUSTOM_TEMPLATES_KEY); + try { + fStore.load(); + } catch (final IOException e) { + e.printStackTrace(); + } + } + return fStore; + } + + public ContextTypeRegistry getContextTypeRegistry() { + if (fRegistry == null) { + fRegistry = new ContributionContextTypeRegistry(); + fRegistry.addContextType(HTMLContextType.CONTEXT_TYPE); + } + return fRegistry; + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLWhitespaceDetector.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLWhitespaceDetector.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLWhitespaceDetector.java new file mode 100644 index 0000000..ac944be --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/HTMLWhitespaceDetector.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import org.eclipse.jface.text.rules.IWhitespaceDetector; + +public class HTMLWhitespaceDetector implements IWhitespaceDetector { + public boolean isWhitespace(final char c) { + return (c == ' ' || c == '\t' || c == '\n' || c == '\r'); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/IHTMLColorConstants.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/IHTMLColorConstants.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/IHTMLColorConstants.java new file mode 100644 index 0000000..4e8624a --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/IHTMLColorConstants.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import org.eclipse.swt.graphics.RGB; + +/** Defines initial colors used in editors. */ +public interface IHTMLColorConstants { + RGB HTML_COMMENT = new RGB(128, 0, 0); + RGB PROC_INSTR = new RGB(128, 128, 128); + RGB STRING = new RGB(0, 128, 0); + RGB DEFAULT = new RGB(0, 0, 0); + RGB TAG = new RGB(0, 0, 128); + RGB SCRIPT = new RGB(255, 0, 0); + RGB CSS_PROP = new RGB(0, 0, 255); + RGB CSS_COMMENT = new RGB(128, 0, 0); + RGB CSS_VALUE = new RGB(0, 128, 0); + RGB FOREGROUND = new RGB(0, 0, 0); + RGB BACKGROUND = new RGB(255, 255, 255); + RGB JAVA_COMMENT = new RGB(0, 128, 0); + RGB JAVA_STRING = new RGB(0, 0, 255); + RGB JAVA_KEYWORD = new RGB(128, 0, 128); + RGB TAGLIB = new RGB(255, 0, 0); + RGB TAGLIB_ATTR = new RGB(128, 128, 0); + RGB JSDOC = new RGB(128, 128, 255); +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/InnerCSSScanner.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/InnerCSSScanner.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/InnerCSSScanner.java new file mode 100644 index 0000000..819a293 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/InnerCSSScanner.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.text.TextAttribute; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.MultiLineRule; +import org.eclipse.jface.text.rules.SingleLineRule; +import org.eclipse.jface.text.rules.Token; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.widgets.Display; + +public class InnerCSSScanner extends CSSBlockScanner { + + public InnerCSSScanner() { + super(); + } + + @Override protected List<IRule> createRules() { + RGB rgb = IHTMLColorConstants.TAGLIB; + Color color = new Color(Display.getCurrent(), rgb); + IToken tag = new Token(new TextAttribute(color)); + rgb = IHTMLColorConstants.CSS_COMMENT; + color = new Color(Display.getCurrent(), rgb); + IToken comment = new Token(new TextAttribute(color)); + List<IRule> rules = new ArrayList<IRule>(); + rules.add(new SingleLineRule(" <style", ">", tag)); + rules.add(new SingleLineRule(" </style", ">", tag)); + rules.add(new MultiLineRule("/*", "*/", comment)); + rules.addAll(super.createRules()); + return rules; + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/InnerJavaScriptScanner.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/InnerJavaScriptScanner.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/InnerJavaScriptScanner.java new file mode 100644 index 0000000..e681eca --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/InnerJavaScriptScanner.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import java.util.List; + +import org.eclipse.jface.text.TextAttribute; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.MultiLineRule; +import org.eclipse.jface.text.rules.SingleLineRule; +import org.eclipse.jface.text.rules.Token; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Display; + +public class InnerJavaScriptScanner extends JavaScriptScanner { + + public InnerJavaScriptScanner() { + super(); + } + + @Override protected List<IRule> createRules() { + IToken tag = new Token(new TextAttribute(new Color(Display.getCurrent(), + IHTMLColorConstants.TAG))); + IToken comment = new Token(new TextAttribute(new Color(Display.getCurrent(), + IHTMLColorConstants.JAVA_COMMENT))); + IToken jsdoc = new Token(new TextAttribute(new Color(Display.getCurrent(), + IHTMLColorConstants.JSDOC))); + List<IRule> rules = super.createRules(); + rules.add(new SingleLineRule(" <script", ">", tag)); + rules.add(new SingleLineRule(" </script", ">", tag)); + rules.add(new MultiLineRule("/**", "*/", jsdoc)); + rules.add(new MultiLineRule("/*", "*/", comment)); + return rules; + } + + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaScriptDamagerRepairer.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaScriptDamagerRepairer.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaScriptDamagerRepairer.java new file mode 100644 index 0000000..99cc481 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaScriptDamagerRepairer.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import org.eclipse.jface.text.DocumentEvent; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITypedRegion; +import org.eclipse.jface.text.Region; +import org.eclipse.jface.text.rules.DefaultDamagerRepairer; +import org.eclipse.jface.text.rules.ITokenScanner; + +public class JavaScriptDamagerRepairer extends DefaultDamagerRepairer { + + public JavaScriptDamagerRepairer(final ITokenScanner scanner) { + super(scanner); + } + + public IRegion getDamageRegion(final ITypedRegion partition, final DocumentEvent e, + final boolean documentPartitioningChanged) { + if (!documentPartitioningChanged) { + String source = fDocument.get(); + int start = source.substring(0, e.getOffset()).lastIndexOf("/*"); + if (start == -1) { + start = 0; + } + int end = source.indexOf("*/", e.getOffset()); + int end2 = e.getOffset() + (e.getText() == null ? e.getLength() : e.getText().length()); + if (end == -1) { + end = source.length(); + } else if (end2 > end) { + end = end2; + } else { + end++; + } + + return new Region(start, end - start); + } + return partition; + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaScriptScanner.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaScriptScanner.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaScriptScanner.java new file mode 100644 index 0000000..921dc68 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaScriptScanner.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.text.TextAttribute; +import org.eclipse.jface.text.rules.EndOfLineRule; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.RuleBasedScanner; +import org.eclipse.jface.text.rules.SingleLineRule; +import org.eclipse.jface.text.rules.Token; +import org.eclipse.jface.text.rules.WordRule; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Display; + +public class JavaScriptScanner extends RuleBasedScanner { + + public static final String[] KEYWORDS = { + "abstract", + "boolean", "break", "byte", + "case", "catch", "char", "class", "const", "continue", + "debugger", "default", "delete", "do", "double", + "else", "enum", "export", "extends", + "false", "final", "finally", "float", "for", "function", + "goto", "if", "implements", "import", "in", "instanceof", "int", "interface", + "let", "long", + "native", "new", "null", + "package", "private", "protected", "prototype", "public", + "return", "short", "static", "super", "switch", "synchronized", + "this", "throw", "throws", "transient", "true", "try", "typeof", + "var", "void", "while", "with", + "typeof", "yield", "undefined", "Infinity", "NaN" + }; + + public JavaScriptScanner() { + List<IRule> rules = createRules(); + setRules(rules.toArray(new IRule[rules.size()])); + } + + /** + * Creates the list of <code>IRule < /code>. + * If you have to customize rules, override this method. + * + * @param colorProvider ColorProvider + * @return the list of <code>IRule < /code> + */ + protected List<IRule> createRules() { + IToken normal = new Token(new TextAttribute(new Color(Display.getCurrent(), + IHTMLColorConstants.FOREGROUND))); + IToken string = new Token(new TextAttribute(new Color(Display.getCurrent(), + IHTMLColorConstants.JAVA_STRING))); + IToken comment = new Token(new TextAttribute(new Color(Display.getCurrent(), + IHTMLColorConstants.JAVA_COMMENT))); + IToken keyword = new Token(new TextAttribute(new Color(Display.getCurrent(), + IHTMLColorConstants.JAVA_KEYWORD))); + List<IRule> rules = new ArrayList<IRule>(); + rules.add(new SingleLineRule("\"", "\"", string, '\\')); + rules.add(new SingleLineRule("'", "'", string, '\\')); + rules.add(new SingleLineRule("\\//", null, normal)); + rules.add(new EndOfLineRule("//", comment)); + WordRule wordRule = new WordRule(new JavaWordDetector(), normal); + for (int i = 0; i < KEYWORDS.length; i++) { + wordRule.addWord(KEYWORDS[i], keyword); + } + rules.add(wordRule); + return rules; + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaWordDetector.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaWordDetector.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaWordDetector.java new file mode 100644 index 0000000..5043925 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/JavaWordDetector.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import org.eclipse.jface.text.rules.IWordDetector; + +public class JavaWordDetector implements IWordDetector { + + public boolean isWordStart(final char c) { + return Character.isJavaIdentifierStart(c); + } + + public boolean isWordPart(final char c) { + return Character.isJavaIdentifierPart(c); + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/SyncopeTagRule.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/SyncopeTagRule.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/SyncopeTagRule.java new file mode 100644 index 0000000..8567ed0 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/SyncopeTagRule.java @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import org.eclipse.jface.text.rules.ICharacterScanner; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.MultiLineRule; + +public class SyncopeTagRule extends MultiLineRule { + + public static final int PREFIX = 0; + public static final int NO_PREFIX = 1; + public static final int BOTH = 2; + private int prefix; + + public SyncopeTagRule(final IToken token, final int prefix) { + super("${", "}", token); + this.prefix = prefix; + } + + protected boolean sequenceDetected(final ICharacterScanner scanner, + final char[] sequence, final boolean eofAllowed) { + if (sequence[0] == '$' && sequence[1] == '{') { + int c = scanner.read(); + if (c == '?' || c == '!' || c == '%') { + scanner.unread(); + return false; + } + int back = 1; + try { + while (true) { + c = scanner.read(); + back++; + if (c == -1) { + return false; + } + if (Character.isWhitespace(c) || c == '}') { + if (prefix == PREFIX) { + return false; + } + break; + } else if (c == ':') { + if (prefix == NO_PREFIX) { + return false; + } + break; + } + } + } finally { + for (int i = 0; i < back; i++) { + scanner.unread(); + } + } + } else if (sequence[0] == '}') { + // read previous char + scanner.unread(); + scanner.unread(); + int c = scanner.read(); + // repair position + scanner.read(); + + if (c == '%') { + return false; + } + } + return super.sequenceDetected(scanner, sequence, eofAllowed); + } + + protected boolean endSequenceDetected(final ICharacterScanner scanner) { + int c; + boolean doubleQuoted = false; + boolean singleQuoted = false; + char[][] delimiters = scanner.getLegalLineDelimiters(); + boolean previousWasEscapeCharacter = false; + while ((c = scanner.read()) != ICharacterScanner.EOF) { + if (c == fEscapeCharacter) { + // Skip the escaped character. + scanner.read(); + } else if (c == '"' && !singleQuoted) { + doubleQuoted = !doubleQuoted; + } else if (c == '\'' && !doubleQuoted) { + singleQuoted = !singleQuoted; + } else if (fEndSequence.length > 0 && c == fEndSequence[0] && !doubleQuoted + && !singleQuoted && sequenceDetected(scanner, fEndSequence, true)) { + return true; + } else if (fBreaksOnEOL) { + // Check for end of line since it can be used to terminate the pattern. + for (int i = 0; i < delimiters.length; i++) { + if (c == delimiters[i][0] && sequenceDetected(scanner, delimiters[i], true) + && (!fEscapeContinuesLine || !previousWasEscapeCharacter)) { + return true; + } + } + } + previousWasEscapeCharacter = (c == fEscapeCharacter); + } + if (fBreaksOnEOF) { + return true; + } + scanner.unread(); + return false; + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/6fee50d7/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/SyncopeTagScanner.java ---------------------------------------------------------------------- diff --git a/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/SyncopeTagScanner.java b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/SyncopeTagScanner.java new file mode 100644 index 0000000..8d7da79 --- /dev/null +++ b/ide/eclipse/bundles/org.apache.syncope.ide.eclipse.plugin/src/main/java/org/apache/syncope/ide/eclipse/plugin/editors/htmlhelpers/SyncopeTagScanner.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.ide.eclipse.plugin.editors.htmlhelpers; + +import org.eclipse.jface.text.TextAttribute; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.MultiLineRule; +import org.eclipse.jface.text.rules.RuleBasedScanner; +import org.eclipse.jface.text.rules.Token; +import org.eclipse.jface.text.rules.WhitespaceRule; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.widgets.Display; + +public class SyncopeTagScanner extends RuleBasedScanner { + + public SyncopeTagScanner(final boolean bold) { + IToken string = null; + if (bold) { + RGB rgb = IHTMLColorConstants.TAGLIB_ATTR; + Color color = new Color(Display.getCurrent(), rgb); + string = new Token(new TextAttribute(color)); + } else { + RGB rgb = IHTMLColorConstants.STRING; + Color color = new Color(Display.getCurrent(), rgb); + string = new Token(new TextAttribute(color)); + } + IRule[] rules = new IRule[3]; + rules[0] = new MultiLineRule("\"" , "\"" , string, '\\'); + rules[1] = new MultiLineRule("'" , "'" , string, '\\'); + rules[2] = new WhitespaceRule(new HTMLWhitespaceDetector()); + setRules(rules); + } +}
