Changes:
[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.PHPCodeScanner;
14 import net.sourceforge.phpeclipse.phpeditor.php.SmartyCodeScanner;
15 import net.sourceforge.phpeclipse.phpeditor.php.SmartyDocCodeScanner;
16
17 import org.eclipse.jface.preference.IPreferenceStore;
18 import org.eclipse.jface.text.IDocumentPartitioner;
19 import org.eclipse.jface.text.rules.DefaultPartitioner;
20 import org.eclipse.jface.text.rules.IPartitionTokenScanner;
21 import org.eclipse.jface.text.rules.RuleBasedScanner;
22 import org.eclipse.jface.util.IPropertyChangeListener;
23 import org.eclipse.jface.util.PropertyChangeEvent;
24 //
25 //import org.phpeclipse.phpdt.internal.ui.text.FastJavaPartitionScanner;
26 //import org.phpeclipse.phpdt.internal.ui.text.JavaColorManager;
27 //import org.phpeclipse.phpdt.internal.ui.text.JavaPartitionScanner;
28 //import org.phpeclipse.phpdt.internal.ui.text.SingleTokenJavaScanner;
29 //import org.phpeclipse.phpdt.internal.ui.text.php.JavaCodeScanner;
30 //import org.phpeclipse.phpdt.internal.ui.text.phpdoc.JavaDocScanner;
31
32 /**
33  * Tools required to configure a Java text viewer. 
34  * The color manager and all scanner exist only one time, i.e.
35  * the same instances are returned to all clients. Thus, clients
36  * share those tools.
37  * <p>
38  * This class may be instantiated; it is not intended to be subclassed.
39  * </p>
40  */
41 public class JavaTextTools {
42
43   private class PreferenceListener implements IPropertyChangeListener {
44     public void propertyChange(PropertyChangeEvent event) {
45       adaptToPreferenceChange(event);
46     }
47   };
48
49   /** The color manager */
50   private JavaColorManager fColorManager;
51   /** The PHP source code scanner */
52   private PHPCodeScanner fCodeScanner;
53   /** The PHP multiline comment scanner */
54   private SingleTokenPHPScanner fMultilineCommentScanner;
55   /** The Java singleline comment scanner */
56   private SingleTokenPHPScanner fSinglelineCommentScanner;
57   /** The Java string scanner */
58   private SingleTokenPHPScanner fStringScanner;
59   /** The PHPDoc scanner */
60   private PHPDocCodeScanner fPHPDocScanner;
61   /** The HTML scanner */
62   private HTMLCodeScanner fHTMLScanner;
63   /** The Smarty scanner */
64   private SmartyCodeScanner fSmartyScanner;
65   /** The SmartyDoc scanner */
66   private SmartyDocCodeScanner fSmartyDocScanner;
67   /** The Java partitions scanner */
68   private FastJavaPartitionScanner fPartitionScanner;
69
70   /** The preference store */
71   private IPreferenceStore fPreferenceStore;
72   /** The preference change listener */
73   private PreferenceListener fPreferenceListener = new PreferenceListener();
74
75   /**
76    * Creates a new Java text tools collection.
77    * 
78    * @param store the preference store to initialize the text tools. The text tool
79    * instance installs a listener on the passed preference store to adapt itself to 
80    * changes in the preference store. In general <code>PreferenceConstants.
81    * getPreferenceStore()</code> shoould be used to initialize the text tools.
82    * 
83    * @see org.phpeclipse.phpdt.ui.PreferenceConstants#getPreferenceStore()
84    * @since 2.0
85    */
86   public JavaTextTools(IPreferenceStore store) {
87     fPreferenceStore = store;
88     fPreferenceStore.addPropertyChangeListener(fPreferenceListener);
89
90     fColorManager = new JavaColorManager();
91     fCodeScanner = new PHPCodeScanner(fColorManager, store);
92     fMultilineCommentScanner = new SingleTokenPHPScanner(fColorManager, store, IPreferenceConstants.PHP_MULTILINE_COMMENT);
93     fSinglelineCommentScanner = new SingleTokenPHPScanner(fColorManager, store, IPreferenceConstants.PHP_SINGLELINE_COMMENT);
94     fStringScanner = new SingleTokenPHPScanner(fColorManager, store, IPreferenceConstants.PHP_STRING);
95     fPHPDocScanner = new PHPDocCodeScanner(fColorManager, store);
96     fHTMLScanner = new HTMLCodeScanner(fColorManager, store);
97     fSmartyScanner = new SmartyCodeScanner(fColorManager, store);
98     fSmartyDocScanner = new SmartyDocCodeScanner(fColorManager, store);
99     fPartitionScanner = new FastJavaPartitionScanner();
100   }
101
102   /**
103    * Disposes all the individual tools of this tools collection.
104    */
105   public void dispose() {
106
107     fCodeScanner = null;
108     fMultilineCommentScanner = null;
109     fSinglelineCommentScanner = null;
110     fStringScanner = null;
111     fPHPDocScanner = null;
112     fPartitionScanner = null;
113
114     if (fColorManager != null) {
115       fColorManager.dispose();
116       fColorManager = null;
117     }
118
119     if (fPreferenceStore != null) {
120       fPreferenceStore.removePropertyChangeListener(fPreferenceListener);
121       fPreferenceStore = null;
122       fPreferenceListener = null;
123     }
124   }
125
126   /**
127    * Returns the color manager which is used to manage
128    * any Java-specific colors needed for such things like syntax highlighting.
129    *
130    * @return the color manager to be used for Java text viewers
131    */
132   public IColorManager getColorManager() {
133     return fColorManager;
134   }
135
136   /**
137    * Returns a scanner which is configured to scan Java source code.
138    *
139    * @return a Java source code scanner
140    */
141   public RuleBasedScanner getCodeScanner() {
142     return fCodeScanner;
143   }
144
145   /**
146    * Returns a scanner which is configured to scan Java multiline comments.
147    *
148    * @return a Java multiline comment scanner
149    * 
150    * @since 2.0
151    */
152   public RuleBasedScanner getMultilineCommentScanner() {
153     return fMultilineCommentScanner;
154   }
155
156   /**
157    * Returns a scanner which is configured to scan HTML code.
158    *
159    * @return a HTML scanner
160    * 
161    * @since 2.0
162    */
163   public RuleBasedScanner getHTMLScanner() {
164     return fHTMLScanner;
165   }
166
167   /**
168    * Returns a scanner which is configured to scan Smarty code.
169    *
170    * @return a Smarty scanner
171    * 
172    * @since 2.0
173    */
174   public RuleBasedScanner getSmartyScanner() {
175     return fSmartyScanner;
176   }
177
178   /**
179          * Returns a scanner which is configured to scan Smarty code.
180          *
181          * @return a Smarty scanner
182          * 
183          * @since 2.0
184          */
185   public RuleBasedScanner getSmartyDocScanner() {
186     return fSmartyDocScanner;
187   }
188   /**
189    * Returns a scanner which is configured to scan Java singleline comments.
190    *
191    * @return a Java singleline comment scanner
192    * 
193    * @since 2.0
194    */
195   public RuleBasedScanner getSinglelineCommentScanner() {
196     return fSinglelineCommentScanner;
197   }
198
199   /**
200    * Returns a scanner which is configured to scan Java strings.
201    *
202    * @return a Java string scanner
203    * 
204    * @since 2.0
205    */
206   public RuleBasedScanner getStringScanner() {
207     return fStringScanner;
208   }
209
210   /**
211    * Returns a scanner which is configured to scan JavaDoc compliant comments.
212    * Notes that the start sequence "/**" and the corresponding end sequence
213    * are part of the JavaDoc comment.
214    *
215    * @return a JavaDoc scanner
216    */
217   public RuleBasedScanner getJavaDocScanner() {
218     return fPHPDocScanner;
219   }
220
221   /**
222    * Returns a scanner which is configured to scan 
223    * Java-specific partitions, which are multi-line comments,
224    * JavaDoc comments, and regular Java source code.
225    *
226    * @return a Java partition scanner
227    */
228   public IPartitionTokenScanner getPartitionScanner() {
229     return fPartitionScanner;
230   }
231
232   /**
233    * Factory method for creating a Java-specific document partitioner
234    * using this object's partitions scanner. This method is a 
235    * convenience method.
236    *
237    * @return a newly created Java document partitioner
238    */
239   public IDocumentPartitioner createDocumentPartitioner() {
240
241     String[] types =
242       new String[] {
243         FastJavaPartitionScanner.JAVA_DOC,
244         FastJavaPartitionScanner.JAVA_MULTI_LINE_COMMENT,
245         FastJavaPartitionScanner.JAVA_SINGLE_LINE_COMMENT,
246         FastJavaPartitionScanner.JAVA_STRING };
247
248     return new DefaultPartitioner(getPartitionScanner(), types);
249   }
250
251   /**
252    * Returns the names of the document position categories used by the document
253    * partitioners created by this object to manage their partition information.
254    * If the partitioners don't use document position categories, the returned
255    * result is <code>null</code>.
256    *
257    * @return the partition managing position categories or <code>null</code> 
258    *                    if there is none
259    */
260   public String[] getPartitionManagingPositionCategories() {
261     return new String[] { DefaultPartitioner.CONTENT_TYPES_CATEGORY };
262   }
263
264   /**
265    * Determines whether the preference change encoded by the given event
266    * changes the behavior of one its contained components.
267    * 
268    * @param event the event to be investigated
269    * @return <code>true</code> if event causes a behavioral change
270    * 
271    * @since 2.0
272    */
273   public boolean affectsBehavior(PropertyChangeEvent event) {
274     return fCodeScanner.affectsBehavior(event)
275       || fMultilineCommentScanner.affectsBehavior(event)
276       || fSinglelineCommentScanner.affectsBehavior(event)
277       || fStringScanner.affectsBehavior(event)
278       || fPHPDocScanner.affectsBehavior(event);
279   }
280
281   /**
282    * Adapts the behavior of the contained components to the change
283    * encoded in the given event.
284    * 
285    * @param event the event to which to adapt
286    * @since 2.0
287    */
288   protected void adaptToPreferenceChange(PropertyChangeEvent event) {
289     if (fCodeScanner.affectsBehavior(event))
290       fCodeScanner.adaptToPreferenceChange(event);
291     if (fMultilineCommentScanner.affectsBehavior(event))
292       fMultilineCommentScanner.adaptToPreferenceChange(event);
293     if (fSinglelineCommentScanner.affectsBehavior(event))
294       fSinglelineCommentScanner.adaptToPreferenceChange(event);
295     if (fStringScanner.affectsBehavior(event))
296       fStringScanner.adaptToPreferenceChange(event);
297     if (fPHPDocScanner.affectsBehavior(event))
298       fPHPDocScanner.adaptToPreferenceChange(event);
299   }
300 }