1 package net.sourceforge.phpdt.ui.text;
4 * (c) Copyright IBM Corp. 2000, 2001.
8 import net.sourceforge.phpdt.internal.ui.text.FastJavaPartitionScanner;
9 import net.sourceforge.phpdt.internal.ui.text.IPHPPartitions;
10 import net.sourceforge.phpdt.internal.ui.text.JavaColorManager;
11 import net.sourceforge.phpdt.internal.ui.text.phpdoc.PHPDocCodeScanner;
12 import net.sourceforge.phpeclipse.IPreferenceConstants;
13 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
14 import net.sourceforge.phpeclipse.phpeditor.php.HTMLPartitionScanner;
15 import net.sourceforge.phpeclipse.phpeditor.php.PHPDocumentPartitioner;
16 import net.sourceforge.phpeclipse.phpeditor.php.PHPPartitionScanner;
17 import net.sourceforge.phpeclipse.phpeditor.php.PHPCodeScanner;
18 import net.sourceforge.phpeclipse.phpeditor.php.SmartyCodeScanner;
19 import net.sourceforge.phpeclipse.phpeditor.php.SmartyDocCodeScanner;
20 import net.sourceforge.phpeclipse.xml.ui.XMLPlugin;
21 import net.sourceforge.phpeclipse.xml.ui.internal.text.SingleTokenScanner;
22 import net.sourceforge.phpeclipse.xml.ui.internal.text.XMLPartitionScanner;
23 import net.sourceforge.phpeclipse.xml.ui.text.XMLTextTools;
25 import org.eclipse.core.runtime.Preferences;
26 import org.eclipse.jface.preference.IPreferenceStore;
27 import org.eclipse.jface.text.IDocument;
28 import org.eclipse.jface.text.IDocumentExtension3;
29 import org.eclipse.jface.text.IDocumentPartitioner;
30 import org.eclipse.jface.text.rules.DefaultPartitioner;
31 import org.eclipse.jface.text.rules.IPartitionTokenScanner;
32 import org.eclipse.jface.text.rules.RuleBasedScanner;
33 import org.eclipse.jface.text.rules.Token;
34 import org.eclipse.jface.util.IPropertyChangeListener;
35 import org.eclipse.jface.util.PropertyChangeEvent;
38 //import org.phpeclipse.phpdt.internal.ui.text.FastJavaPartitionScanner;
39 //import org.phpeclipse.phpdt.internal.ui.text.JavaColorManager;
40 //import org.phpeclipse.phpdt.internal.ui.text.JavaPartitionScanner;
41 //import org.phpeclipse.phpdt.internal.ui.text.SingleTokenJavaScanner;
42 //import org.phpeclipse.phpdt.internal.ui.text.php.JavaCodeScanner;
43 //import org.phpeclipse.phpdt.internal.ui.text.phpdoc.JavaDocScanner;
46 * Tools required to configure a Java text viewer. The color manager and all scanner exist only one time, i.e. the same instances
47 * are returned to all clients. Thus, clients share those tools.
49 * This class may be instantiated; it is not intended to be subclassed.
52 public class JavaTextTools implements IPHPPartitions {
53 // private static final String[] TOKENS = {
54 // JSPScriptScanner.JSP_DEFAULT,
55 // JSPScriptScanner.JSP_BRACKET };
56 private final static String[] LEGAL_CONTENT_TYPES = new String[] {
58 PHP_MULTILINE_COMMENT,
59 PHP_SINGLELINE_COMMENT,
63 private static XMLPartitionScanner HTML_PARTITION_SCANNER = null;
65 private static FastJavaPartitionScanner PHP_PARTITION_SCANNER = null;
67 private static HTMLPartitionScanner SMARTY_PARTITION_SCANNER = null;
69 private static XMLPartitionScanner XML_PARTITION_SCANNER = null;
71 // private final static String[] TYPES= new String[] { PHPPartitionScanner.PHP, PHPPartitionScanner.JAVA_DOC,
72 // PHPPartitionScanner.JAVA_MULTILINE_COMMENT };
73 // private final static String[] TYPES = new String[] {
74 // IPHPPartitions.PHP_PARTITIONING,
75 // IPHPPartitions.PHP_PHPDOC_COMMENT,
76 // // IPHPPartitions.HTML,
77 // // IPHPPartitions.HTML_MULTILINE_COMMENT,
78 // IPHPPartitions.JAVASCRIPT,
79 // IPHPPartitions.CSS,
80 // IPHPPartitions.SMARTY,
81 // IPHPPartitions.SMARTY_MULTILINE_COMMENT };
84 * This tools' preference listener.
86 private class PreferenceListener implements IPropertyChangeListener, Preferences.IPropertyChangeListener {
87 public void propertyChange(PropertyChangeEvent event) {
88 adaptToPreferenceChange(event);
91 public void propertyChange(Preferences.PropertyChangeEvent event) {
92 adaptToPreferenceChange(new PropertyChangeEvent(event.getSource(), event.getProperty(), event.getOldValue(), event
97 // /** The color manager */
98 private JavaColorManager colorManager;
100 /** The PHP source code scanner */
101 private PHPCodeScanner fCodeScanner;
103 /** The PHP multiline comment scanner */
104 private SingleTokenPHPScanner fMultilineCommentScanner;
106 /** The Java singleline comment scanner */
107 private SingleTokenPHPScanner fSinglelineCommentScanner;
109 /** The Java string scanner */
110 private SingleTokenPHPScanner fStringScanner;
112 /** The PHPDoc scanner */
113 private PHPDocCodeScanner fPHPDocScanner;
115 /** The HTML scanner */
116 // private HTMLCodeScanner fHTMLScanner;
117 /** The Smarty scanner */
118 private SmartyCodeScanner fSmartyScanner;
120 /** The SmartyDoc scanner */
121 private SmartyDocCodeScanner fSmartyDocScanner;
123 /** The Java partitions scanner. */
124 private FastJavaPartitionScanner fPartitionScanner;
126 /** The preference store */
127 private IPreferenceStore fPreferenceStore;
129 /** The XML Language text tools */
130 private XMLTextTools xmlTextTools;
132 * The core preference store.
136 private Preferences fCorePreferenceStore;
138 /** The preference change listener */
139 private PreferenceListener fPreferenceListener = new PreferenceListener();
141 /** The JSP partitions scanner */
142 private PHPPartitionScanner jspPartitionScanner = null;
144 /** The JSP script subpartitions scanner */
145 // private JSPScriptScanner jspScriptScanner;
147 /** The PHP plain text scanner */
148 // private RuleBasedScanner jspTextScanner;
150 /** The PHP brackets scanner */
151 // private RuleBasedScanner jspBracketScanner;
154 * Creates a new Java text tools collection.
157 * the preference store to initialize the text tools. The text tool instance installs a listener on the passed preference
158 * store to adapt itself to changes in the preference store. In general <code>PreferenceConstants.
159 * getPreferenceStore()</code>
160 * should be used to initialize the text tools.
162 * optional preference store to initialize the text tools. The text tool instance installs a listener on the passed
163 * preference store to adapt itself to changes in the preference store.
164 * @see org.eclipse.jdt.ui.PreferenceConstants#getPreferenceStore()
167 public JavaTextTools(IPreferenceStore store, Preferences coreStore) {
168 this(store, coreStore, true);
172 * Creates a new Java text tools collection.
175 * the preference store to initialize the text tools. The text tool instance installs a listener on the passed preference
176 * store to adapt itself to changes in the preference store. In general <code>PreferenceConstants.
177 * getPreferenceStore()</code>
178 * shoould be used to initialize the text tools.
180 * optional preference store to initialize the text tools. The text tool instance installs a listener on the passed
181 * preference store to adapt itself to changes in the preference store.
182 * @param autoDisposeOnDisplayDispose
183 * if <code>true</code> the color manager automatically disposes all managed colors when the current display gets
184 * disposed and all calls to {@link org.eclipse.jface.text.source.ISharedTextColors#dispose()}are ignored.
185 * @see org.eclipse.jdt.ui.PreferenceConstants#getPreferenceStore()
188 public JavaTextTools(IPreferenceStore store, Preferences coreStore, boolean autoDisposeOnDisplayDispose) {
189 // super(store, TOKENS, );
190 // REVISIT: preference store
191 xmlTextTools = new XMLTextTools(
192 XMLPlugin.getDefault().getPreferenceStore());
194 colorManager = new JavaColorManager(autoDisposeOnDisplayDispose);
195 fPreferenceStore = store;
196 fPreferenceStore.addPropertyChangeListener(fPreferenceListener);
198 fCorePreferenceStore = coreStore;
199 if (fCorePreferenceStore != null)
200 fCorePreferenceStore.addPropertyChangeListener(fPreferenceListener);
202 fCodeScanner = new PHPCodeScanner((JavaColorManager) colorManager, store);
203 fMultilineCommentScanner = new SingleTokenPHPScanner((JavaColorManager) colorManager, store,
204 IPreferenceConstants.PHP_MULTILINE_COMMENT);
205 fSinglelineCommentScanner = new SingleTokenPHPScanner((JavaColorManager) colorManager, store,
206 IPreferenceConstants.PHP_SINGLELINE_COMMENT);
207 fStringScanner = new SingleTokenPHPScanner((JavaColorManager) colorManager, store, IPreferenceConstants.PHP_STRING);
208 fPHPDocScanner = new PHPDocCodeScanner((JavaColorManager) colorManager, store);
209 // fHTMLScanner = new HTMLCodeScanner((JavaColorManager)fColorManager, store);
210 fSmartyScanner = new SmartyCodeScanner((JavaColorManager) colorManager, store);
211 fSmartyDocScanner = new SmartyDocCodeScanner((JavaColorManager) colorManager, store);
213 fPartitionScanner= new FastJavaPartitionScanner();
215 // jspScriptScanner = new JSPScriptScanner();
216 // fPartitionScanner = new FastJavaPartitionScanner();
217 // fPartitionScanner = new PHPPartitionScanner();
219 // jspBracketScanner = new RuleBasedScanner();
220 // jspBracketScanner.setDefaultReturnToken(new Token(JSPScriptScanner.JSP_BRACKET));
221 // jspTextScanner = new RuleBasedScanner();
222 // jspTextScanner.setDefaultReturnToken(new Token(JSPScriptScanner.JSP_DEFAULT));
228 public XMLTextTools getXMLTextTools() {
232 * Disposes all the individual tools of this tools collection.
234 public void dispose() {
237 fMultilineCommentScanner = null;
238 fSinglelineCommentScanner = null;
239 fStringScanner = null;
240 fPHPDocScanner = null;
241 // fPartitionScanner = null;
243 if (colorManager != null) {
244 colorManager.dispose();
248 if (fPreferenceStore != null) {
249 fPreferenceStore.removePropertyChangeListener(fPreferenceListener);
250 fPreferenceStore = null;
252 if (fCorePreferenceStore != null) {
253 fCorePreferenceStore.removePropertyChangeListener(fPreferenceListener);
254 fCorePreferenceStore = null;
257 fPreferenceListener = null;
262 * Returns the color manager which is used to manage any Java-specific colors needed for such things like syntax highlighting.
264 * @return the color manager to be used for Java text viewers
266 public JavaColorManager getColorManager() {
267 return (JavaColorManager) colorManager;
271 * Returns a scanner which is configured to scan Java source code.
273 * @return a Java source code scanner
275 public RuleBasedScanner getCodeScanner() {
280 * Returns a scanner which is configured to scan Java multiline comments.
282 * @return a Java multiline comment scanner
286 public RuleBasedScanner getMultilineCommentScanner() {
287 return fMultilineCommentScanner;
291 * Returns a scanner which is configured to scan HTML code.
293 * @return a HTML scanner
297 // public RuleBasedScanner getHTMLScanner() {
298 // return fHTMLScanner;
301 * Returns a scanner which is configured to scan Smarty code.
303 * @return a Smarty scanner
307 public RuleBasedScanner getSmartyScanner() {
308 return fSmartyScanner;
312 * Returns a scanner which is configured to scan Smarty code.
314 * @return a Smarty scanner
318 public RuleBasedScanner getSmartyDocScanner() {
319 return fSmartyDocScanner;
323 * Returns a scanner which is configured to scan Java singleline comments.
325 * @return a Java singleline comment scanner
329 public RuleBasedScanner getSinglelineCommentScanner() {
330 return fSinglelineCommentScanner;
334 * Returns a scanner which is configured to scan Java strings.
336 * @return a Java string scanner
340 public RuleBasedScanner getStringScanner() {
341 return fStringScanner;
345 * Returns a scanner which is configured to scan JavaDoc compliant comments. Notes that the start sequence "/**" and the
346 * corresponding end sequence are part of the JavaDoc comment.
348 * @return a JavaDoc scanner
350 public RuleBasedScanner getJavaDocScanner() {
351 return fPHPDocScanner;
355 * Returns a scanner which is configured to scan Java-specific partitions, which are multi-line comments, JavaDoc comments, and
356 * regular Java source code.
358 * @return a Java partition scanner
360 // public IPartitionTokenScanner getPartitionScanner() {
361 // return fPartitionScanner;
364 * Factory method for creating a PHP-specific document partitioner using this object's partitions scanner. This method is a
365 * convenience method.
367 * @return a newly created Java document partitioner
369 public IDocumentPartitioner createDocumentPartitioner() {
370 return createDocumentPartitioner(".php");
374 * Factory method for creating a PHP-specific document partitioner using this object's partitions scanner. This method is a
375 * convenience method.
377 * @return a newly created Java document partitioner
379 public IDocumentPartitioner createDocumentPartitioner(String extension) {
383 // FastJavaPartitionScanner.JAVA_DOC,
384 // FastJavaPartitionScanner.JAVA_MULTI_LINE_COMMENT,
385 // FastJavaPartitionScanner.JAVA_SINGLE_LINE_COMMENT,
386 // FastJavaPartitionScanner.JAVA_STRING };
388 // return new DefaultPartitioner(getPartitionScanner(), types);
389 IDocumentPartitioner partitioner = null;
390 // System.out.println(extension);
391 if (extension.equalsIgnoreCase(".html") || extension.equalsIgnoreCase(".htm")) {
393 partitioner = createHTMLPartitioner();
394 partitioner = createJSPPartitioner();
395 } else if (extension.equalsIgnoreCase(".xml")) {
397 partitioner = createXMLPartitioner();
398 // } else if (extension.equalsIgnoreCase(".js")) {
400 // partitioner = createJavaScriptPartitioner();
401 // } else if (extension.equalsIgnoreCase(".css")) {
402 // // cascading style sheets
403 // partitioner = createCSSPartitioner();
404 } else if (extension.equalsIgnoreCase(".tpl")) {
406 partitioner = createSmartyPartitioner();
407 // } else if (extension.equalsIgnoreCase(".inc")) {
408 // // php include files ?
409 // partitioner = createIncludePartitioner();
412 if (partitioner == null) {
413 partitioner = createJSPPartitioner();
421 * Sets up the Java document partitioner for the given document for the given partitioning.
424 * the document to be set up
425 * @param partitioning
426 * the document partitioning
432 // public void setupJavaDocumentPartitioner(IDocument document, String partitioning, Object element) {
433 // IDocumentPartitioner partitioner = createDocumentPartitioner(".php");
435 // // if (document instanceof IDocumentExtension3) {
436 // // IDocumentExtension3 extension3= (IDocumentExtension3) document;
437 // // extension3.setDocumentPartitioner(partitioning, partitioner);
439 // document.setDocumentPartitioner(partitioner);
441 // partitioner.connect(document);
444 public void setupHTMLDocumentPartitioner(IDocument document, String partitioning, Object element) {
445 IDocumentPartitioner partitioner = createDocumentPartitioner(".html");
447 // if (document instanceof IDocumentExtension3) {
448 // IDocumentExtension3 extension3= (IDocumentExtension3) document;
449 // extension3.setDocumentPartitioner(partitioning, partitioner);
451 document.setDocumentPartitioner(partitioner);
453 partitioner.connect(document);
456 public void setupSmartyDocumentPartitioner(IDocument document, String partitioning, Object element) {
457 IDocumentPartitioner partitioner = createDocumentPartitioner(".tpl");
459 // if (document instanceof IDocumentExtension3) {
460 // IDocumentExtension3 extension3= (IDocumentExtension3) document;
461 // extension3.setDocumentPartitioner(partitioning, partitioner);
463 document.setDocumentPartitioner(partitioner);
465 partitioner.connect(document);
469 * Returns the names of the document position categories used by the document partitioners created by this object to manage their
470 * partition information. If the partitioners don't use document position categories, the returned result is <code>null</code>.
472 * @return the partition managing position categories or <code>null</code> if there is none
474 public String[] getPartitionManagingPositionCategories() {
475 return new String[] { DefaultPartitioner.CONTENT_TYPES_CATEGORY };
479 * Determines whether the preference change encoded by the given event changes the behavior of one its contained components.
482 * the event to be investigated
483 * @return <code>true</code> if event causes a behavioral change
487 public boolean affectsBehavior(PropertyChangeEvent event) {
488 return fCodeScanner.affectsBehavior(event) || fMultilineCommentScanner.affectsBehavior(event)
489 || fSinglelineCommentScanner.affectsBehavior(event) || fStringScanner.affectsBehavior(event)
490 || fPHPDocScanner.affectsBehavior(event);
494 * Adapts the behavior of the contained components to the change encoded in the given event.
497 * the event to which to adapt
500 protected void adaptToPreferenceChange(PropertyChangeEvent event) {
501 if (fCodeScanner.affectsBehavior(event))
502 fCodeScanner.adaptToPreferenceChange(event);
503 if (fMultilineCommentScanner.affectsBehavior(event))
504 fMultilineCommentScanner.adaptToPreferenceChange(event);
505 if (fSinglelineCommentScanner.affectsBehavior(event))
506 fSinglelineCommentScanner.adaptToPreferenceChange(event);
507 if (fStringScanner.affectsBehavior(event))
508 fStringScanner.adaptToPreferenceChange(event);
509 if (fPHPDocScanner.affectsBehavior(event))
510 fPHPDocScanner.adaptToPreferenceChange(event);
511 // if (fHTMLScanner.affectsBehavior(event))
512 // fHTMLScanner.adaptToPreferenceChange(event);
513 if (fSmartyScanner.affectsBehavior(event))
514 fSmartyScanner.adaptToPreferenceChange(event);
515 if (fSmartyDocScanner.affectsBehavior(event))
516 fSmartyDocScanner.adaptToPreferenceChange(event);
517 XMLPlugin.getDefault().getXMLTextTools().affectsBehavior(event);
521 * Return a partitioner for .html files.
523 public IDocumentPartitioner createHTMLPartitioner() {
524 // return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES);
525 return xmlTextTools.createXMLPartitioner();
528 // private static IDocumentPartitioner createIncludePartitioner() {
529 // // return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
530 // return new DefaultPartitioner(getPHPPartitionScanner(), FastJavaPartitionScanner.PHP_PARTITION_TYPES);
534 // private static IDocumentPartitioner createJavaScriptPartitioner() {
535 // return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES);
539 * Return a partitioner for .php files.
541 public IDocumentPartitioner createPHPPartitioner() {
542 // return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
543 return new DefaultPartitioner(getPHPPartitionScanner(), LEGAL_CONTENT_TYPES);
546 private IDocumentPartitioner createJSPPartitioner() {
547 return new PHPDocumentPartitioner(
548 getJSPPartitionScanner(), getPHPPartitionScanner());
549 // return new JSPDocumentPartitioner(getJSPPartitionScanner(), jspScriptScanner);
555 // public IPartitionTokenScanner getJSPScriptScanner() {
556 // return jspScriptScanner;
559 private IDocumentPartitioner createSmartyPartitioner() {
560 return new DefaultPartitioner(getSmartyPartitionScanner(), XMLTextTools.TYPES);
563 private IDocumentPartitioner createXMLPartitioner() {
564 // return new DefaultPartitioner(getXMLPartitionScanner(), XMLTextTools.TYPES);
565 return xmlTextTools.createXMLPartitioner();
568 // private IDocumentPartitioner createCSSPartitioner() {
569 // return new DefaultPartitioner(getHTMLPartitionScanner(), XMLTextTools.TYPES);
573 * Return a scanner for creating html partitions.
575 // private static XMLPartitionScanner getHTMLPartitionScanner() {
576 // // if (HTML_PARTITION_SCANNER == null)
577 // // HTML_PARTITION_SCANNER = new HTMLPartitionScanner(IPHPPartitions.HTML_FILE);
578 // // return HTML_PARTITION_SCANNER;^
579 // if (HTML_PARTITION_SCANNER == null)
580 // HTML_PARTITION_SCANNER = new XMLPartitionScanner(false);
581 // return HTML_PARTITION_SCANNER;
585 * Return a scanner for creating php partitions.
587 private FastJavaPartitionScanner getPHPPartitionScanner() {
588 // if (PHP_PARTITION_SCANNER == null)
589 // PHP_PARTITION_SCANNER = new FastJavaPartitionScanner(); //new PHPPartitionScanner(IPHPPartitions.PHP_FILE);
590 // return PHP_PARTITION_SCANNER;
591 return fPartitionScanner;
595 * Returns a scanner which is configured to scan plain text in JSP.
597 * @return a JSP text scanner
599 // public RuleBasedScanner getJSPTextScanner() {
600 // return jspTextScanner;
604 * Returns a scanner which is configured to scan plain text in JSP.
606 * @return a JSP text scanner
608 // public RuleBasedScanner getJSPBracketScanner() {
609 // return jspBracketScanner;
613 * Return a scanner for creating smarty partitions.
615 private static HTMLPartitionScanner getSmartyPartitionScanner() {
616 if (SMARTY_PARTITION_SCANNER == null)
617 SMARTY_PARTITION_SCANNER = new HTMLPartitionScanner(IPHPPartitions.SMARTY_FILE);
618 return SMARTY_PARTITION_SCANNER;
622 * Return a scanner for creating xml partitions.
624 private static XMLPartitionScanner getXMLPartitionScanner() {
625 // if (XML_PARTITION_SCANNER == null)
626 // XML_PARTITION_SCANNER = new HTMLPartitionScanner(IPHPPartitions.XML_FILE);
627 // return XML_PARTITION_SCANNER;
628 if (XML_PARTITION_SCANNER == null)
629 XML_PARTITION_SCANNER = new XMLPartitionScanner(false);
630 return XML_PARTITION_SCANNER;
633 private PHPPartitionScanner getJSPPartitionScanner() {
634 if (jspPartitionScanner == null)
635 jspPartitionScanner = new PHPPartitionScanner();
636 return jspPartitionScanner;
640 * Sets up the Java document partitioner for the given document for the default partitioning.
642 * @param document the document to be set up
645 public void setupJavaDocumentPartitioner(IDocument document) {
646 setupJavaDocumentPartitioner(document, IDocumentExtension3.DEFAULT_PARTITIONING);
650 * Sets up the Java document partitioner for the given document for the given partitioning.
652 * @param document the document to be set up
653 * @param partitioning the document partitioning
656 public void setupJavaDocumentPartitioner(IDocument document, String partitioning) {
657 IDocumentPartitioner partitioner= createDocumentPartitioner();
658 if (document instanceof IDocumentExtension3) {
659 IDocumentExtension3 extension3= (IDocumentExtension3) document;
660 extension3.setDocumentPartitioner(partitioning, partitioner);
662 document.setDocumentPartitioner(partitioner);
664 partitioner.connect(document);
668 * Returns this text tool's preference store.
670 * @return the preference store
673 protected IPreferenceStore getPreferenceStore() {
674 return fPreferenceStore;
678 * Returns this text tool's core preference store.
680 * @return the core preference store
683 protected Preferences getCorePreferenceStore() {
684 return fCorePreferenceStore;