+package org.simantics.document.ui;\r
+\r
+import org.eclipse.jface.preference.IPreferenceStore;\r
+import org.eclipse.jface.text.DefaultInformationControl;\r
+import org.eclipse.jface.text.IDocument;\r
+import org.eclipse.jface.text.IInformationControl;\r
+import org.eclipse.jface.text.IInformationControlCreator;\r
+import org.eclipse.jface.text.ITextHover;\r
+import org.eclipse.jface.text.TextAttribute;\r
+import org.eclipse.jface.text.contentassist.ContentAssistant;\r
+import org.eclipse.jface.text.contentassist.IContentAssistant;\r
+import org.eclipse.jface.text.presentation.IPresentationReconciler;\r
+import org.eclipse.jface.text.presentation.PresentationReconciler;\r
+import org.eclipse.jface.text.rules.DefaultDamagerRepairer;\r
+import org.eclipse.jface.text.rules.EndOfLineRule;\r
+import org.eclipse.jface.text.rules.IRule;\r
+import org.eclipse.jface.text.rules.ITokenScanner;\r
+import org.eclipse.jface.text.rules.IWordDetector;\r
+import org.eclipse.jface.text.rules.MultiLineRule;\r
+import org.eclipse.jface.text.rules.PatternRule;\r
+import org.eclipse.jface.text.rules.RuleBasedScanner;\r
+import org.eclipse.jface.text.rules.Token;\r
+import org.eclipse.jface.text.rules.WordRule;\r
+import org.eclipse.jface.text.source.DefaultAnnotationHover;\r
+import org.eclipse.jface.text.source.IAnnotationHover;\r
+import org.eclipse.jface.text.source.ISharedTextColors;\r
+import org.eclipse.jface.text.source.ISourceViewer;\r
+import org.eclipse.jface.text.source.SourceViewerConfiguration;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.Device;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.RGB;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.ui.editors.text.EditorsUI;\r
+import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;\r
+\r
+public class CSSSourceViewerConfiguration extends SourceViewerConfiguration {\r
+\r
+ public static final char[] CONTENT_ASSIST_AUTO_CHARS = new char[] { '.' };\r
+ Device device;\r
+ \r
+ ISharedTextColors sharedTextColors;\r
+ IPreferenceStore preferenceStore;\r
+ \r
+ private CSSTextEditorEnvironment editorEnvironment;\r
+ \r
+ public CSSSourceViewerConfiguration(Device device,\r
+ ISharedTextColors sharedTextColors) {\r
+ this.device = device;\r
+ this.sharedTextColors = sharedTextColors;\r
+ this.preferenceStore = EditorsUI.getPreferenceStore();\r
+ \r
+ this.editorEnvironment = new CSSTextEditorEnvironment();\r
+ }\r
+\r
+ public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {\r
+ return new String[] {\r
+ IDocument.DEFAULT_CONTENT_TYPE\r
+ };\r
+ }\r
+ \r
+ @Override\r
+ public int getTabWidth(ISourceViewer sourceViewer) {\r
+ if (preferenceStore == null)\r
+ return super.getTabWidth(sourceViewer);\r
+ return preferenceStore.getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH);\r
+ }\r
+\r
+ @Override\r
+ public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) {\r
+ String[] indentPrefixes = getIndentPrefixesForTab(getTabWidth(sourceViewer));\r
+ if (indentPrefixes == null)\r
+ return null;\r
+\r
+ int length = indentPrefixes.length;\r
+ if (length > 2) {\r
+ // Swap first with second last\r
+ String first = indentPrefixes[0];\r
+ indentPrefixes[0] = indentPrefixes[length - 2];\r
+ indentPrefixes[length - 2] = first;\r
+ }\r
+\r
+ return indentPrefixes;\r
+ }\r
+ \r
+ public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {\r
+ PresentationReconciler reconciler = new PresentationReconciler();\r
+ \r
+ DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getSclTokenScanner());\r
+ \r
+ reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);\r
+ reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);\r
+ \r
+ return reconciler;\r
+ }\r
+ \r
+ ITokenScanner getSclTokenScanner() {\r
+ RuleBasedScanner scanner = new RuleBasedScanner();\r
+ \r
+ Font font = new Font(device, "Courier New", 10, SWT.NORMAL);\r
+ Font boldFont = new Font(device, "Courier New", 10, SWT.BOLD);\r
+\r
+ Token defaultToken = new Token(\r
+ new TextAttribute(\r
+ sharedTextColors.getColor(new RGB(0, 0, 0)),\r
+ null,\r
+ 0,\r
+ font\r
+ ));\r
+ Token string = new Token(new TextAttribute(\r
+ sharedTextColors.getColor(new RGB(42, 0, 255)),\r
+ null,\r
+ 0,\r
+ font\r
+ ));\r
+ Token reserved = new Token(\r
+ new TextAttribute(\r
+ sharedTextColors.getColor(new RGB(127, 0, 85)),\r
+ null,\r
+ SWT.BOLD,\r
+ boldFont\r
+ ));\r
+ Token comment = new Token(new TextAttribute(\r
+ sharedTextColors.getColor(new RGB(63, 127, 95)),\r
+ null,\r
+ 0,\r
+ font\r
+ ));\r
+\r
+ WordRule reservedWord = new WordRule(new IWordDetector() { \r
+ @Override\r
+ public boolean isWordStart(char c) {\r
+ return Character.isJavaIdentifierStart(c);\r
+ }\r
+ \r
+ @Override\r
+ public boolean isWordPart(char c) {\r
+ return Character.isJavaIdentifierPart(c) || c=='.';\r
+ }\r
+ });\r
+\r
+ reservedWord.addWord("if", reserved);\r
+ reservedWord.addWord("then", reserved);\r
+ reservedWord.addWord("else", reserved);\r
+ reservedWord.addWord("match", reserved);\r
+ reservedWord.addWord("with", reserved);\r
+ reservedWord.addWord("data", reserved);\r
+ reservedWord.addWord("type", reserved);\r
+ reservedWord.addWord("class", reserved);\r
+ \r
+ IRule[] rules = new IRule[] {\r
+ //new MultiLineRule("\"\"\"", "\"\"\"", string),\r
+ new PatternRule("\"", "\"", string, '\\', true),\r
+ new MultiLineRule("/*", "*/", comment),\r
+ new EndOfLineRule("//", comment),\r
+ reservedWord\r
+ };\r
+ scanner.setRules(rules);\r
+ scanner.setDefaultReturnToken(defaultToken);\r
+ \r
+ return scanner;\r
+ }\r
+ \r
+ @Override\r
+ public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {\r
+ return new CSSEditorTextHover(sourceViewer, editorEnvironment);\r
+ }\r
+ \r
+ @Override\r
+ public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {\r
+ return new DefaultAnnotationHover();\r
+ }\r
+ \r
+ @Override\r
+ public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {\r
+ ContentAssistant assistant = new ContentAssistant();\r
+ assistant.enableColoredLabels(true);\r
+ assistant.setStatusLineVisible(true);\r
+\r
+ assistant.enableAutoActivation(true);\r
+ assistant.enableAutoInsert(true);\r
+ assistant.setContentAssistProcessor(new CSSCompletionAssistProcessor(editorEnvironment), IDocument.DEFAULT_CONTENT_TYPE);\r
+ assistant.setInformationControlCreator(CREATOR);\r
+ assistant.setRestoreCompletionProposalSize(Activator.getDefault().getDialogSettings()); \r
+ return assistant;\r
+ }\r
+ \r
+ private static final IInformationControlCreator CREATOR = new IInformationControlCreator() {\r
+ \r
+ @Override\r
+ public IInformationControl createInformationControl(Shell parent) {\r
+ return new DefaultInformationControl(parent);\r
+ }\r
+ };\r
+\r
+// @Override\r
+// public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {\r
+// return new ContentFormatter();\r
+// }\r
+}\r