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
480 * changes the behavior of one its contained components.
482 * @param event the event to be investigated
483 * @return <code>true</code> if event causes a behavioral change
485 * @deprecated As of 3.0, replaced by {@link org.eclipse.jdt.ui.text.JavaSourceViewerConfiguration#affectsTextPresentation(PropertyChangeEvent)}
487 // public boolean affectsBehavior(PropertyChangeEvent event) {
488 // return fCodeScanner.affectsBehavior(event)
489 // || fMultilineCommentScanner.affectsBehavior(event)
490 // || fSinglelineCommentScanner.affectsBehavior(event)
491 // || fStringScanner.affectsBehavior(event)
492 // || fPHPDocScanner.affectsBehavior(event);
496 * Adapts the behavior of the contained components to the change encoded in the given event.
499 * the event to which to adapt
502 protected void adaptToPreferenceChange(PropertyChangeEvent event) {
503 if (fCodeScanner.affectsBehavior(event))
504 fCodeScanner.adaptToPreferenceChange(event);
505 if (fMultilineCommentScanner.affectsBehavior(event))
506 fMultilineCommentScanner.adaptToPreferenceChange(event);
507 if (fSinglelineCommentScanner.affectsBehavior(event))
508 fSinglelineCommentScanner.adaptToPreferenceChange(event);
509 // if (fStringScanner.affectsBehavior(event))
510 // fStringScanner.adaptToPreferenceChange(event);
511 if (fPHPDocScanner.affectsBehavior(event))
512 fPHPDocScanner.adaptToPreferenceChange(event);
513 // if (fHTMLScanner.affectsBehavior(event))
514 // fHTMLScanner.adaptToPreferenceChange(event);
515 if (fSmartyScanner.affectsBehavior(event))
516 fSmartyScanner.adaptToPreferenceChange(event);
517 if (fSmartyDocScanner.affectsBehavior(event))
518 fSmartyDocScanner.adaptToPreferenceChange(event);
519 XMLPlugin.getDefault().getXMLTextTools().affectsBehavior(event);
523 * Return a partitioner for .html files.
525 public IDocumentPartitioner createHTMLPartitioner() {
526 // return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES);
527 return xmlTextTools.createXMLPartitioner();
530 // private static IDocumentPartitioner createIncludePartitioner() {
531 // // return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
532 // return new DefaultPartitioner(getPHPPartitionScanner(), FastJavaPartitionScanner.PHP_PARTITION_TYPES);
536 // private static IDocumentPartitioner createJavaScriptPartitioner() {
537 // return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES);
541 * Return a partitioner for .php files.
543 public IDocumentPartitioner createPHPPartitioner() {
544 // return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
545 return new DefaultPartitioner(getPHPPartitionScanner(), LEGAL_CONTENT_TYPES);
548 private IDocumentPartitioner createJSPPartitioner() {
549 return new PHPDocumentPartitioner(
550 getJSPPartitionScanner(), getPHPPartitionScanner());
551 // return new JSPDocumentPartitioner(getJSPPartitionScanner(), jspScriptScanner);
557 // public IPartitionTokenScanner getJSPScriptScanner() {
558 // return jspScriptScanner;
561 private IDocumentPartitioner createSmartyPartitioner() {
562 return new DefaultPartitioner(getSmartyPartitionScanner(), XMLTextTools.TYPES);
565 private IDocumentPartitioner createXMLPartitioner() {
566 // return new DefaultPartitioner(getXMLPartitionScanner(), XMLTextTools.TYPES);
567 return xmlTextTools.createXMLPartitioner();
570 // private IDocumentPartitioner createCSSPartitioner() {
571 // return new DefaultPartitioner(getHTMLPartitionScanner(), XMLTextTools.TYPES);
575 * Return a scanner for creating html partitions.
577 // private static XMLPartitionScanner getHTMLPartitionScanner() {
578 // // if (HTML_PARTITION_SCANNER == null)
579 // // HTML_PARTITION_SCANNER = new HTMLPartitionScanner(IPHPPartitions.HTML_FILE);
580 // // return HTML_PARTITION_SCANNER;^
581 // if (HTML_PARTITION_SCANNER == null)
582 // HTML_PARTITION_SCANNER = new XMLPartitionScanner(false);
583 // return HTML_PARTITION_SCANNER;
587 * Return a scanner for creating php partitions.
589 private FastJavaPartitionScanner getPHPPartitionScanner() {
590 // if (PHP_PARTITION_SCANNER == null)
591 // PHP_PARTITION_SCANNER = new FastJavaPartitionScanner(); //new PHPPartitionScanner(IPHPPartitions.PHP_FILE);
592 // return PHP_PARTITION_SCANNER;
593 return fPartitionScanner;
597 * Returns a scanner which is configured to scan plain text in JSP.
599 * @return a JSP text scanner
601 // public RuleBasedScanner getJSPTextScanner() {
602 // return jspTextScanner;
606 * Returns a scanner which is configured to scan plain text in JSP.
608 * @return a JSP text scanner
610 // public RuleBasedScanner getJSPBracketScanner() {
611 // return jspBracketScanner;
615 * Return a scanner for creating smarty partitions.
617 private static HTMLPartitionScanner getSmartyPartitionScanner() {
618 if (SMARTY_PARTITION_SCANNER == null)
619 SMARTY_PARTITION_SCANNER = new HTMLPartitionScanner(IPHPPartitions.SMARTY_FILE);
620 return SMARTY_PARTITION_SCANNER;
624 * Return a scanner for creating xml partitions.
626 private static XMLPartitionScanner getXMLPartitionScanner() {
627 // if (XML_PARTITION_SCANNER == null)
628 // XML_PARTITION_SCANNER = new HTMLPartitionScanner(IPHPPartitions.XML_FILE);
629 // return XML_PARTITION_SCANNER;
630 if (XML_PARTITION_SCANNER == null)
631 XML_PARTITION_SCANNER = new XMLPartitionScanner(false);
632 return XML_PARTITION_SCANNER;
635 private PHPPartitionScanner getJSPPartitionScanner() {
636 if (jspPartitionScanner == null)
637 jspPartitionScanner = new PHPPartitionScanner();
638 return jspPartitionScanner;
642 * Sets up the Java document partitioner for the given document for the default partitioning.
644 * @param document the document to be set up
647 public void setupJavaDocumentPartitioner(IDocument document) {
648 setupJavaDocumentPartitioner(document, IDocumentExtension3.DEFAULT_PARTITIONING);
652 * Sets up the Java document partitioner for the given document for the given partitioning.
654 * @param document the document to be set up
655 * @param partitioning the document partitioning
658 public void setupJavaDocumentPartitioner(IDocument document, String partitioning) {
659 IDocumentPartitioner partitioner= createDocumentPartitioner();
660 if (document instanceof IDocumentExtension3) {
661 IDocumentExtension3 extension3= (IDocumentExtension3) document;
662 extension3.setDocumentPartitioner(partitioning, partitioner);
664 document.setDocumentPartitioner(partitioner);
666 partitioner.connect(document);
670 * Returns this text tool's preference store.
672 * @return the preference store
675 protected IPreferenceStore getPreferenceStore() {
676 return fPreferenceStore;
680 * Returns this text tool's core preference store.
682 * @return the core preference store
685 protected Preferences getCorePreferenceStore() {
686 return fCorePreferenceStore;