ec11f3c783eb1c66209d7ab6f7d997cef186ba3c
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / ui / text / JavaTextTools.java
1 package net.sourceforge.phpdt.ui.text;
2
3 /*
4  * (c) Copyright IBM Corp. 2000, 2001.
5  * All Rights Reserved.
6  */
7
8 import net.sourceforge.phpdt.internal.ui.text.FastJavaPartitionScanner;
9 import net.sourceforge.phpdt.internal.ui.text.JavaColorManager;
10 import net.sourceforge.phpdt.internal.ui.text.phpdoc.PHPDocCodeScanner;
11 import net.sourceforge.phpeclipse.IPreferenceConstants;
12 import net.sourceforge.phpeclipse.phpeditor.php.HTMLCodeScanner;
13 import net.sourceforge.phpeclipse.phpeditor.php.IPHPPartitionScannerConstants;
14 import net.sourceforge.phpeclipse.phpeditor.php.PHPCodeScanner;
15 import net.sourceforge.phpeclipse.phpeditor.php.PHPPartitionScanner;
16 import net.sourceforge.phpeclipse.phpeditor.php.SmartyCodeScanner;
17 import net.sourceforge.phpeclipse.phpeditor.php.SmartyDocCodeScanner;
18
19 import org.eclipse.core.runtime.Preferences;
20 import org.eclipse.jface.preference.IPreferenceStore;
21 import org.eclipse.jface.text.IDocument;
22 import org.eclipse.jface.text.IDocumentExtension3;
23 import org.eclipse.jface.text.IDocumentPartitioner;
24 import org.eclipse.jface.text.rules.DefaultPartitioner;
25 import org.eclipse.jface.text.rules.IPartitionTokenScanner;
26 import org.eclipse.jface.text.rules.RuleBasedScanner;
27 import org.eclipse.jface.util.IPropertyChangeListener;
28 import org.eclipse.jface.util.PropertyChangeEvent;
29 //
30 //import org.phpeclipse.phpdt.internal.ui.text.FastJavaPartitionScanner;
31 //import org.phpeclipse.phpdt.internal.ui.text.JavaColorManager;
32 //import org.phpeclipse.phpdt.internal.ui.text.JavaPartitionScanner;
33 //import org.phpeclipse.phpdt.internal.ui.text.SingleTokenJavaScanner;
34 //import org.phpeclipse.phpdt.internal.ui.text.php.JavaCodeScanner;
35 //import org.phpeclipse.phpdt.internal.ui.text.phpdoc.JavaDocScanner;
36
37 /**
38  * Tools required to configure a Java text viewer. 
39  * The color manager and all scanner exist only one time, i.e.
40  * the same instances are returned to all clients. Thus, clients
41  * share those tools.
42  * <p>
43  * This class may be instantiated; it is not intended to be subclassed.
44  * </p>
45  */
46 public class JavaTextTools {
47
48   private static PHPPartitionScanner HTML_PARTITION_SCANNER = null;
49
50   private static PHPPartitionScanner PHP_PARTITION_SCANNER = null;
51   private static PHPPartitionScanner SMARTY_PARTITION_SCANNER = null;
52
53   // private final static String[] TYPES= new String[] { PHPPartitionScanner.PHP, PHPPartitionScanner.JAVA_DOC, PHPPartitionScanner.JAVA_MULTILINE_COMMENT };
54   private final static String[] TYPES =
55     new String[] {
56       IPHPPartitionScannerConstants.PHP,
57       IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT,
58       IPHPPartitionScannerConstants.HTML,
59       IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT,
60       IPHPPartitionScannerConstants.JAVASCRIPT,
61       IPHPPartitionScannerConstants.CSS,
62       IPHPPartitionScannerConstants.SMARTY,
63       IPHPPartitionScannerConstants.SMARTY_MULTILINE_COMMENT };
64   private static PHPPartitionScanner XML_PARTITION_SCANNER = null;
65
66   /**
67    * This tools' preference listener. 
68    */
69   private class PreferenceListener implements IPropertyChangeListener, Preferences.IPropertyChangeListener {
70     public void propertyChange(PropertyChangeEvent event) {
71       adaptToPreferenceChange(event);
72     }
73     public void propertyChange(Preferences.PropertyChangeEvent event) {
74       adaptToPreferenceChange(
75         new PropertyChangeEvent(event.getSource(), event.getProperty(), event.getOldValue(), event.getNewValue()));
76     }
77   };
78
79   /** The color manager */
80   private JavaColorManager fColorManager;
81   /** The PHP source code scanner */
82   private PHPCodeScanner fCodeScanner;
83   /** The PHP multiline comment scanner */
84   private SingleTokenPHPScanner fMultilineCommentScanner;
85   /** The Java singleline comment scanner */
86   private SingleTokenPHPScanner fSinglelineCommentScanner;
87   /** The Java string scanner */
88   private SingleTokenPHPScanner fStringScanner;
89   /** The PHPDoc scanner */
90   private PHPDocCodeScanner fPHPDocScanner;
91   /** The HTML scanner */
92   private HTMLCodeScanner fHTMLScanner;
93   /** The Smarty scanner */
94   private SmartyCodeScanner fSmartyScanner;
95   /** The SmartyDoc scanner */
96   private SmartyDocCodeScanner fSmartyDocScanner;
97   /** The Java partitions scanner */
98   private FastJavaPartitionScanner fPartitionScanner;
99
100   /** The preference store */
101   private IPreferenceStore fPreferenceStore;
102   /**
103    * The core preference store.
104    * @since 2.1
105    */
106   private Preferences fCorePreferenceStore;
107   /** The preference change listener */
108   private PreferenceListener fPreferenceListener = new PreferenceListener();
109
110   /**
111    * Creates a new Java text tools collection.
112    * 
113    * @param store the preference store to initialize the text tools. The text tool
114    * instance installs a listener on the passed preference store to adapt itself to 
115    * changes in the preference store. In general <code>PreferenceConstants.
116    * getPreferenceStore()</code> shoould be used to initialize the text tools.
117    * 
118    * @see org.phpeclipse.phpdt.ui.PreferenceConstants#getPreferenceStore()
119    * @since 2.0
120    */
121   public JavaTextTools(IPreferenceStore store) {
122     fPreferenceStore = store;
123     fPreferenceStore.addPropertyChangeListener(fPreferenceListener);
124
125     fColorManager = new JavaColorManager();
126     fCodeScanner = new PHPCodeScanner(fColorManager, store);
127     fMultilineCommentScanner = new SingleTokenPHPScanner(fColorManager, store, IPreferenceConstants.PHP_MULTILINE_COMMENT);
128     fSinglelineCommentScanner = new SingleTokenPHPScanner(fColorManager, store, IPreferenceConstants.PHP_SINGLELINE_COMMENT);
129     fStringScanner = new SingleTokenPHPScanner(fColorManager, store, IPreferenceConstants.PHP_STRING);
130     fPHPDocScanner = new PHPDocCodeScanner(fColorManager, store);
131     fHTMLScanner = new HTMLCodeScanner(fColorManager, store);
132     fSmartyScanner = new SmartyCodeScanner(fColorManager, store);
133     fSmartyDocScanner = new SmartyDocCodeScanner(fColorManager, store);
134     fPartitionScanner = new FastJavaPartitionScanner();
135   }
136
137   /**
138    * Creates a new Java text tools collection.
139    * 
140    * @param store the preference store to initialize the text tools. The text tool
141    *                    instance installs a listener on the passed preference store to adapt itself to 
142    *                    changes in the preference store. In general <code>PreferenceConstants.
143    *                    getPreferenceStore()</code> shoould be used to initialize the text tools.
144    * @param coreStore optional preference store to initialize the text tools. The text tool
145    *                    instance installs a listener on the passed preference store to adapt itself to 
146    *                    changes in the preference store.
147    * @param autoDisposeOnDisplayDispose         if <code>true</code>  the color manager
148    *                    automatically disposes all managed colors when the current display gets disposed
149    *                    and all calls to {@link org.eclipse.jface.text.source.ISharedTextColors#dispose()} are ignored.
150    * @see org.eclipse.jdt.ui.PreferenceConstants#getPreferenceStore()
151    * @since 2.1
152    */
153   public JavaTextTools(IPreferenceStore store, Preferences coreStore, boolean autoDisposeOnDisplayDispose) {
154     fPreferenceStore = store;
155     fPreferenceStore.addPropertyChangeListener(fPreferenceListener);
156
157     fCorePreferenceStore = coreStore;
158     if (fCorePreferenceStore != null)
159       fCorePreferenceStore.addPropertyChangeListener(fPreferenceListener);
160
161     fColorManager = new JavaColorManager(autoDisposeOnDisplayDispose);
162     fCodeScanner = new PHPCodeScanner(fColorManager, store);
163     fMultilineCommentScanner = new SingleTokenPHPScanner(fColorManager, store, IPreferenceConstants.PHP_MULTILINE_COMMENT);
164     fSinglelineCommentScanner = new SingleTokenPHPScanner(fColorManager, store, IPreferenceConstants.PHP_SINGLELINE_COMMENT);
165     fStringScanner = new SingleTokenPHPScanner(fColorManager, store, IPreferenceConstants.PHP_STRING);
166     fPHPDocScanner = new PHPDocCodeScanner(fColorManager, store);
167     fHTMLScanner = new HTMLCodeScanner(fColorManager, store);
168     fSmartyScanner = new SmartyCodeScanner(fColorManager, store);
169     fSmartyDocScanner = new SmartyDocCodeScanner(fColorManager, store);
170     fPartitionScanner = new FastJavaPartitionScanner();
171   }
172
173   /**
174    * Disposes all the individual tools of this tools collection.
175    */
176   public void dispose() {
177
178     fCodeScanner = null;
179     fMultilineCommentScanner = null;
180     fSinglelineCommentScanner = null;
181     fStringScanner = null;
182     fPHPDocScanner = null;
183     fPartitionScanner = null;
184
185     if (fColorManager != null) {
186       fColorManager.dispose();
187       fColorManager = null;
188     }
189
190     if (fPreferenceStore != null) {
191       fPreferenceStore.removePropertyChangeListener(fPreferenceListener);
192       fPreferenceStore = null;
193
194       if (fCorePreferenceStore != null) {
195         fCorePreferenceStore.removePropertyChangeListener(fPreferenceListener);
196         fCorePreferenceStore = null;
197       }
198
199       fPreferenceListener = null;
200     }
201   }
202
203   /**
204    * Returns the color manager which is used to manage
205    * any Java-specific colors needed for such things like syntax highlighting.
206    *
207    * @return the color manager to be used for Java text viewers
208    */
209   public IColorManager getColorManager() {
210     return fColorManager;
211   }
212
213   /**
214    * Returns a scanner which is configured to scan Java source code.
215    *
216    * @return a Java source code scanner
217    */
218   public RuleBasedScanner getCodeScanner() {
219     return fCodeScanner;
220   }
221
222   /**
223    * Returns a scanner which is configured to scan Java multiline comments.
224    *
225    * @return a Java multiline comment scanner
226    * 
227    * @since 2.0
228    */
229   public RuleBasedScanner getMultilineCommentScanner() {
230     return fMultilineCommentScanner;
231   }
232
233   /**
234    * Returns a scanner which is configured to scan HTML code.
235    *
236    * @return a HTML scanner
237    * 
238    * @since 2.0
239    */
240   public RuleBasedScanner getHTMLScanner() {
241     return fHTMLScanner;
242   }
243
244   /**
245    * Returns a scanner which is configured to scan Smarty code.
246    *
247    * @return a Smarty scanner
248    * 
249    * @since 2.0
250    */
251   public RuleBasedScanner getSmartyScanner() {
252     return fSmartyScanner;
253   }
254
255   /**
256          * Returns a scanner which is configured to scan Smarty code.
257          *
258          * @return a Smarty scanner
259          * 
260          * @since 2.0
261          */
262   public RuleBasedScanner getSmartyDocScanner() {
263     return fSmartyDocScanner;
264   }
265   /**
266    * Returns a scanner which is configured to scan Java singleline comments.
267    *
268    * @return a Java singleline comment scanner
269    * 
270    * @since 2.0
271    */
272   public RuleBasedScanner getSinglelineCommentScanner() {
273     return fSinglelineCommentScanner;
274   }
275
276   /**
277    * Returns a scanner which is configured to scan Java strings.
278    *
279    * @return a Java string scanner
280    * 
281    * @since 2.0
282    */
283   public RuleBasedScanner getStringScanner() {
284     return fStringScanner;
285   }
286
287   /**
288    * Returns a scanner which is configured to scan JavaDoc compliant comments.
289    * Notes that the start sequence "/**" and the corresponding end sequence
290    * are part of the JavaDoc comment.
291    *
292    * @return a JavaDoc scanner
293    */
294   public RuleBasedScanner getJavaDocScanner() {
295     return fPHPDocScanner;
296   }
297
298   /**
299    * Returns a scanner which is configured to scan 
300    * Java-specific partitions, which are multi-line comments,
301    * JavaDoc comments, and regular Java source code.
302    *
303    * @return a Java partition scanner
304    */
305   public IPartitionTokenScanner getPartitionScanner() {
306     return fPartitionScanner;
307   }
308
309   /**
310    * Factory method for creating a PHP-specific document partitioner
311    * using this object's partitions scanner. This method is a 
312    * convenience method.
313    *
314    * @return a newly created Java document partitioner
315    */
316   public IDocumentPartitioner createDocumentPartitioner() {
317     return createDocumentPartitioner(".php");
318   }
319
320   /**
321    * Factory method for creating a PHP-specific document partitioner
322    * using this object's partitions scanner. This method is a 
323    * convenience method.
324    *
325    * @return a newly created Java document partitioner
326    */
327   public IDocumentPartitioner createDocumentPartitioner(String extension) {
328
329     //    String[] types =
330     //      new String[] {
331     //        FastJavaPartitionScanner.JAVA_DOC,
332     //        FastJavaPartitionScanner.JAVA_MULTI_LINE_COMMENT,
333     //        FastJavaPartitionScanner.JAVA_SINGLE_LINE_COMMENT,
334     //        FastJavaPartitionScanner.JAVA_STRING };
335     //
336     //    return new DefaultPartitioner(getPartitionScanner(), types);
337     IDocumentPartitioner partitioner = null;
338     //  System.out.println(extension);
339     if (extension.equalsIgnoreCase(".html") || extension.equalsIgnoreCase(".htm")) {
340       // html
341       partitioner = createHTMLPartitioner();
342     } else if (extension.equalsIgnoreCase(".xml")) {
343       // xml
344       partitioner = createXMLPartitioner();
345     } else if (extension.equalsIgnoreCase(".js")) {
346       // javascript
347       partitioner = createJavaScriptPartitioner();
348     } else if (extension.equalsIgnoreCase(".css")) {
349       // cascading style sheets
350       partitioner = createCSSPartitioner();
351     } else if (extension.equalsIgnoreCase(".tpl")) {
352       // smarty ?
353       partitioner = createSmartyPartitioner();
354     } else if (extension.equalsIgnoreCase(".inc")) {
355       // php include files ?
356       partitioner = createIncludePartitioner();
357     }
358
359     if (partitioner == null) {
360       partitioner = createPHPPartitioner();
361     }
362
363     return partitioner;
364   }
365
366         /**
367          * Sets up the Java document partitioner for the given document for the given partitioning.
368          * 
369          * @param document the document to be set up
370          * @param partitioning the document partitioning
371          * @since 3.0
372          */
373         public void setupJavaDocumentPartitioner(IDocument document, String partitioning) {
374                 IDocumentPartitioner partitioner= createDocumentPartitioner();
375                 if (document instanceof IDocumentExtension3) {
376                         IDocumentExtension3 extension3= (IDocumentExtension3) document;
377                         extension3.setDocumentPartitioner(partitioning, partitioner);
378                 } else {
379                         document.setDocumentPartitioner(partitioner);
380                 }
381                 partitioner.connect(document);
382         }
383         
384   /**
385    * Returns the names of the document position categories used by the document
386    * partitioners created by this object to manage their partition information.
387    * If the partitioners don't use document position categories, the returned
388    * result is <code>null</code>.
389    *
390    * @return the partition managing position categories or <code>null</code> 
391    *                    if there is none
392    */
393   public String[] getPartitionManagingPositionCategories() {
394     return new String[] { DefaultPartitioner.CONTENT_TYPES_CATEGORY };
395   }
396
397   /**
398    * Determines whether the preference change encoded by the given event
399    * changes the behavior of one its contained components.
400    * 
401    * @param event the event to be investigated
402    * @return <code>true</code> if event causes a behavioral change
403    * 
404    * @since 2.0
405    */
406   public boolean affectsBehavior(PropertyChangeEvent event) {
407     return fCodeScanner.affectsBehavior(event)
408       || fMultilineCommentScanner.affectsBehavior(event)
409       || fSinglelineCommentScanner.affectsBehavior(event)
410       || fStringScanner.affectsBehavior(event)
411       || fPHPDocScanner.affectsBehavior(event);
412   }
413
414   /**
415    * Adapts the behavior of the contained components to the change
416    * encoded in the given event.
417    * 
418    * @param event the event to which to adapt
419    * @since 2.0
420    */
421   protected void adaptToPreferenceChange(PropertyChangeEvent event) {
422     if (fCodeScanner.affectsBehavior(event))
423       fCodeScanner.adaptToPreferenceChange(event);
424     if (fMultilineCommentScanner.affectsBehavior(event))
425       fMultilineCommentScanner.adaptToPreferenceChange(event);
426     if (fSinglelineCommentScanner.affectsBehavior(event))
427       fSinglelineCommentScanner.adaptToPreferenceChange(event);
428     if (fStringScanner.affectsBehavior(event))
429       fStringScanner.adaptToPreferenceChange(event);
430     if (fPHPDocScanner.affectsBehavior(event))
431       fPHPDocScanner.adaptToPreferenceChange(event);
432   }
433
434   /**
435          * Return a partitioner for .html files.
436          */
437   private static IDocumentPartitioner createHTMLPartitioner() {
438     return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES);
439   }
440
441   private static IDocumentPartitioner createIncludePartitioner() {
442     return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
443   }
444
445   private static IDocumentPartitioner createJavaScriptPartitioner() {
446     return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES);
447   }
448
449   /**
450         * Return a partitioner for .php files.
451         */
452   private static IDocumentPartitioner createPHPPartitioner() {
453     return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
454   }
455
456   private static IDocumentPartitioner createSmartyPartitioner() {
457     return new DefaultPartitioner(getSmartyPartitionScanner(), TYPES);
458   }
459
460   private static IDocumentPartitioner createXMLPartitioner() {
461     return new DefaultPartitioner(getXMLPartitionScanner(), TYPES);
462   }
463
464   private static IDocumentPartitioner createCSSPartitioner() {
465     return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES);
466   }
467   /**
468         * Return a scanner for creating html partitions.
469         */
470   private static PHPPartitionScanner getHTMLPartitionScanner() {
471     if (HTML_PARTITION_SCANNER == null)
472       HTML_PARTITION_SCANNER = new PHPPartitionScanner(IPHPPartitionScannerConstants.HTML_FILE);
473     return HTML_PARTITION_SCANNER;
474   }
475   /**
476         * Return a scanner for creating php partitions.
477         */
478   private static PHPPartitionScanner getPHPPartitionScanner() {
479     if (PHP_PARTITION_SCANNER == null)
480       PHP_PARTITION_SCANNER = new PHPPartitionScanner(IPHPPartitionScannerConstants.PHP_FILE);
481     return PHP_PARTITION_SCANNER;
482   }
483
484   /**
485         * Return a scanner for creating smarty partitions.
486         */
487   private static PHPPartitionScanner getSmartyPartitionScanner() {
488     if (SMARTY_PARTITION_SCANNER == null)
489       SMARTY_PARTITION_SCANNER = new PHPPartitionScanner(IPHPPartitionScannerConstants.SMARTY_FILE);
490     return SMARTY_PARTITION_SCANNER;
491   }
492
493   /**
494         * Return a scanner for creating xml partitions.
495         */
496   private static PHPPartitionScanner getXMLPartitionScanner() {
497     if (XML_PARTITION_SCANNER == null)
498       XML_PARTITION_SCANNER = new PHPPartitionScanner(IPHPPartitionScannerConstants.XML_FILE);
499     return XML_PARTITION_SCANNER;
500   }
501
502 }