1 55 56 package freemarker.eclipse.editors; 57 58 import org.eclipse.jface.text.DocumentEvent; 59 import org.eclipse.jface.text.IDocument; 60 import org.eclipse.jface.text.IRegion; 61 import org.eclipse.jface.text.ITypedRegion; 62 import org.eclipse.jface.text.presentation.IPresentationReconciler; 63 import org.eclipse.jface.text.presentation.PresentationReconciler; 64 import org.eclipse.jface.text.reconciler.IReconciler; 65 import org.eclipse.jface.text.reconciler.MonoReconciler; 66 import org.eclipse.jface.text.rules.DefaultDamagerRepairer; 67 import org.eclipse.jface.text.rules.IToken; 68 import org.eclipse.jface.text.rules.ITokenScanner; 69 import org.eclipse.jface.text.rules.RuleBasedScanner; 70 import org.eclipse.jface.text.source.IAnnotationHover; 71 import org.eclipse.jface.text.source.ISourceViewer; 72 import org.eclipse.jface.text.source.SourceViewerConfiguration; 73 74 import freemarker.eclipse.FreemarkerPlugin; 75 import freemarker.eclipse.preferences.IPreferenceConstants; 76 77 88 public class Configuration extends SourceViewerConfiguration 89 implements IPreferenceConstants { 90 91 private DirectiveScanner directiveScanner; 92 private RuleBasedScanner commentScanner; 93 private RuleBasedScanner interpolationScanner; 94 private RuleBasedScanner defaultScanner; 95 private RuleBasedScanner xmlCommentScanner; 96 private XmlScanner xmlTagScanner; 97 private ITokenManager tokenManager; 98 private FreemarkerEditor fEditor; 99 100 108 public Configuration(FreemarkerEditor anEditor, ITokenManager tokenManager) { 109 this.fEditor = anEditor; 110 this.tokenManager = tokenManager; 111 } 112 113 117 public String [] getConfiguredContentTypes(ISourceViewer sourceViewer) { 118 return PartitionScanner.PARTITIONS; 119 } 120 121 125 public IAnnotationHover getAnnotationHover(ISourceViewer aSourceViewer) { 126 return new AnnotationHover(); 127 } 128 129 133 public IReconciler getReconciler(ISourceViewer aSourceViewer) { 134 return new MonoReconciler(fEditor.getReconcilingStrategy(), false); 135 } 136 137 144 protected ITokenScanner getDefaultScanner() { 145 IToken token; 146 147 if (defaultScanner == null) { 148 defaultScanner = new RuleBasedScanner(); 149 token = tokenManager.getTextToken(); 150 defaultScanner.setDefaultReturnToken(token); 151 } 152 return defaultScanner; 153 } 154 155 161 protected DirectiveScanner getDirectiveScanner() { 162 IToken token; 163 164 if (directiveScanner == null) { 165 directiveScanner = new DirectiveScanner(tokenManager); 166 token = tokenManager.getDirectiveToken(); 167 directiveScanner.setDefaultReturnToken(token); 168 } 169 return directiveScanner; 170 } 171 172 178 protected ITokenScanner getCommentScanner() { 179 IToken token; 180 181 if (commentScanner == null) { 182 commentScanner = new RuleBasedScanner(); 183 token = tokenManager.getCommentToken(); 184 commentScanner.setDefaultReturnToken(token); 185 } 186 return commentScanner; 187 } 188 189 195 protected ITokenScanner getInterpolationScanner() { 196 IToken token; 197 198 if (interpolationScanner == null) { 199 interpolationScanner = new RuleBasedScanner(); 200 token = tokenManager.getInterpolationToken(); 201 interpolationScanner.setDefaultReturnToken(token); 202 } 203 return interpolationScanner; 204 } 205 206 212 protected ITokenScanner getXmlCommentScanner() { 213 IToken token; 214 215 if (xmlCommentScanner == null) { 216 xmlCommentScanner = new XmlCommentScanner(tokenManager); 217 token = tokenManager.getXmlCommentToken(); 218 xmlCommentScanner.setDefaultReturnToken(token); 219 } 220 return xmlCommentScanner; 221 } 222 223 229 protected XmlScanner getXmlTagScanner() { 230 IToken token; 231 232 if (xmlTagScanner == null) { 233 xmlTagScanner = new XmlScanner(tokenManager); 234 token = tokenManager.getXmlToken(); 235 xmlTagScanner.setDefaultReturnToken(token); 236 } 237 return xmlTagScanner; 238 } 239 240 244 public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) { 245 PresentationReconciler reconciler = new PresentationReconciler(); 246 DefaultDamagerRepairer dr; 247 248 boolean xmlHighlighting = true; 249 try { 250 xmlHighlighting = FreemarkerPlugin.getInstance().getPreferenceStore().getBoolean(XML_HIGHLIGHTING); 251 } catch (NullPointerException npe) { 252 253 } 254 255 dr = new DefaultDamagerRepairer(getDefaultScanner()); 256 reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); 257 reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); 258 259 dr = new DefaultDamagerRepairer(getDirectiveScanner()); 260 reconciler.setDamager(dr, PartitionScanner.FTL_DIRECTIVE); 261 reconciler.setRepairer(dr, PartitionScanner.FTL_DIRECTIVE); 262 263 dr = new DefaultDamagerRepairer(getCommentScanner()); 264 reconciler.setDamager(dr, PartitionScanner.FTL_COMMENT); 265 reconciler.setRepairer(dr, PartitionScanner.FTL_COMMENT); 266 267 dr = new DefaultDamagerRepairer(getInterpolationScanner()); 268 reconciler.setDamager(dr, PartitionScanner.FTL_INTERPOLATION); 269 reconciler.setRepairer(dr, PartitionScanner.FTL_INTERPOLATION); 270 271 if(xmlHighlighting) { 272 dr = new DefaultDamagerRepairer(getXmlCommentScanner()); 273 reconciler.setDamager(dr, PartitionScanner.XML_COMMENT); 274 reconciler.setRepairer(dr, PartitionScanner.XML_COMMENT); 275 276 dr = new SimpleDamagerRepairer(getXmlTagScanner()); 277 reconciler.setDamager(dr, PartitionScanner.XML_TAG); 278 reconciler.setRepairer(dr, PartitionScanner.XML_TAG); 279 } 280 281 return reconciler; 282 } 283 284 285 295 private class SimpleDamagerRepairer extends DefaultDamagerRepairer { 296 297 302 public SimpleDamagerRepairer(ITokenScanner scanner) { 303 super(scanner); 304 } 305 306 316 public IRegion getDamageRegion(ITypedRegion partition, 317 DocumentEvent e, 318 boolean documentPartitioningChanged) { 319 320 return partition; 321 } 322 } 323 } | Popular Tags |