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.phpeditor.php.HTMLPartitionScanner;
14 import net.sourceforge.phpeclipse.phpeditor.php.PHPCodeScanner;
15 import net.sourceforge.phpeclipse.phpeditor.php.PHPDocumentPartitioner;
16 import net.sourceforge.phpeclipse.phpeditor.php.PHPPartitionScanner;
17 import net.sourceforge.phpeclipse.phpeditor.php.SmartyCodeScanner;
18 import net.sourceforge.phpeclipse.phpeditor.php.SmartyDocCodeScanner;
19 import net.sourceforge.phpeclipse.ui.WebUI;
20 //import net.sourceforge.phpeclipse.xml.ui.XMLPlugin;
21 import net.sourceforge.phpeclipse.xml.ui.text.XMLTextTools;
23 import org.eclipse.core.runtime.Preferences;
24 import org.eclipse.jface.preference.IPreferenceStore;
25 import org.eclipse.jface.text.IDocument;
26 import org.eclipse.jface.text.IDocumentExtension3;
27 import org.eclipse.jface.text.IDocumentPartitioner;
28 import org.eclipse.jface.text.rules.DefaultPartitioner;
29 import org.eclipse.jface.text.rules.FastPartitioner;
30 import org.eclipse.jface.text.rules.RuleBasedScanner;
31 import org.eclipse.jface.util.IPropertyChangeListener;
32 import org.eclipse.jface.util.PropertyChangeEvent;
35 // import org.phpeclipse.phpdt.internal.ui.text.FastJavaPartitionScanner;
36 // import org.phpeclipse.phpdt.internal.ui.text.JavaColorManager;
37 // import org.phpeclipse.phpdt.internal.ui.text.JavaPartitionScanner;
38 // import org.phpeclipse.phpdt.internal.ui.text.SingleTokenJavaScanner;
39 // import org.phpeclipse.phpdt.internal.ui.text.php.JavaCodeScanner;
40 // import org.phpeclipse.phpdt.internal.ui.text.phpdoc.JavaDocScanner;
43 * Tools required to configure a Java text viewer. The color manager and all
44 * scanner exist only one time, i.e. the same instances are returned to all
45 * clients. Thus, clients share those tools.
47 * This class may be instantiated; it is not intended to be subclassed.
50 public class JavaTextTools implements IPHPPartitions {
51 // private static final String[] TOKENS = {
52 // JSPScriptScanner.JSP_DEFAULT,
53 // JSPScriptScanner.JSP_BRACKET };
54 private final static String[] LEGAL_CONTENT_TYPES = new String[] {
55 PHP_PHPDOC_COMMENT, PHP_MULTILINE_COMMENT, PHP_SINGLELINE_COMMENT,
56 PHP_STRING_DQ, PHP_STRING_SQ, PHP_STRING_HEREDOC };
58 // private static XMLPartitionScanner HTML_PARTITION_SCANNER = null;
60 // private static FastJavaPartitionScanner PHP_PARTITION_SCANNER = null;
62 private static HTMLPartitionScanner SMARTY_PARTITION_SCANNER = null;
64 // private static XMLPartitionScanner XML_PARTITION_SCANNER = null;
66 // private final static String[] TYPES= new String[] {
67 // PHPPartitionScanner.PHP, PHPPartitionScanner.JAVA_DOC,
68 // PHPPartitionScanner.JAVA_MULTILINE_COMMENT };
69 // private final static String[] TYPES = new String[] {
70 // IPHPPartitions.PHP_PARTITIONING,
71 // IPHPPartitions.PHP_PHPDOC_COMMENT,
72 // // IPHPPartitions.HTML,
73 // // IPHPPartitions.HTML_MULTILINE_COMMENT,
74 // IPHPPartitions.JAVASCRIPT,
75 // IPHPPartitions.CSS,
76 // IPHPPartitions.SMARTY,
77 // IPHPPartitions.SMARTY_MULTILINE_COMMENT };
80 * This tools' preference listener.
82 private class PreferenceListener implements IPropertyChangeListener,
83 Preferences.IPropertyChangeListener {
84 public void propertyChange(PropertyChangeEvent event) {
85 adaptToPreferenceChange(event);
88 public void propertyChange(Preferences.PropertyChangeEvent event) {
89 adaptToPreferenceChange(new PropertyChangeEvent(event.getSource(),
90 event.getProperty(), event.getOldValue(), event
95 // /** The color manager */
96 private JavaColorManager colorManager;
98 /** The PHP source code scanner */
99 private PHPCodeScanner fCodeScanner;
101 /** The PHP multiline comment scanner */
102 private SingleTokenPHPScanner fMultilineCommentScanner;
104 /** The Java singleline comment scanner */
105 private SingleTokenPHPScanner fSinglelineCommentScanner;
107 /** The PHP double quoted string scanner */
108 // private SingleTokenPHPScanner fStringDQScanner;
109 /** The PHP single quoted string scanner */
110 // private SingleTokenPHPScanner fStringSQScanner;
111 /** The PHPDoc scanner */
112 private PHPDocCodeScanner fPHPDocScanner;
114 /** The HTML scanner */
115 // private HTMLCodeScanner fHTMLScanner;
116 /** The Smarty scanner */
117 private SmartyCodeScanner fSmartyScanner;
119 /** The SmartyDoc scanner */
120 private SmartyDocCodeScanner fSmartyDocScanner;
122 /** The Java partitions scanner. */
123 private FastJavaPartitionScanner fPartitionScanner;
125 /** The preference store */
126 private IPreferenceStore fPreferenceStore;
128 /** The XML Language text tools */
129 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;
146 /** The PHP plain text scanner */
147 // private RuleBasedScanner jspTextScanner;
148 /** The PHP brackets scanner */
149 // private RuleBasedScanner jspBracketScanner;
151 * Creates a new Java text tools collection.
154 * the preference store to initialize the text tools. The text
155 * tool instance installs a listener on the passed preference
156 * store to adapt itself to changes in the preference store. In
157 * general <code>PreferenceConstants.
158 * getPreferenceStore()</code>
159 * should be used to initialize the text tools.
161 * optional preference store to initialize the text tools. The
162 * text tool instance installs a listener on the passed
163 * preference store to adapt itself to changes in the preference
165 * @see net.sourceforge.phpdt.ui.PreferenceConstants#getPreferenceStore()
168 public JavaTextTools(IPreferenceStore store, Preferences coreStore) {
169 this(store, coreStore, true);
173 * Creates a new Java text tools collection.
176 * the preference store to initialize the text tools. The text
177 * tool instance installs a listener on the passed preference
178 * store to adapt itself to changes in the preference store. In
179 * general <code>PreferenceConstants.
180 * getPreferenceStore()</code>
181 * shoould be used to initialize the text tools.
183 * optional preference store to initialize the text tools. The
184 * text tool instance installs a listener on the passed
185 * preference store to adapt itself to changes in the preference
187 * @param autoDisposeOnDisplayDispose
188 * if <code>true</code> the color manager automatically
189 * disposes all managed colors when the current display gets
190 * disposed and all calls to
191 * {@link org.eclipse.jface.text.source.ISharedTextColors#dispose()}are
193 * @see net.sourceforge.phpdt.ui.PreferenceConstants#getPreferenceStore()
196 public JavaTextTools(IPreferenceStore store, Preferences coreStore,
197 boolean autoDisposeOnDisplayDispose) {
198 // super(store, TOKENS, );
199 // REVISIT: preference store
200 xmlTextTools = new XMLTextTools(/*XMLPlugin*/WebUI.getDefault()
201 .getPreferenceStore());
203 colorManager = new JavaColorManager(autoDisposeOnDisplayDispose);
204 fPreferenceStore = store;
205 fPreferenceStore.addPropertyChangeListener(fPreferenceListener);
207 fCorePreferenceStore = coreStore;
208 if (fCorePreferenceStore != null)
209 fCorePreferenceStore.addPropertyChangeListener(fPreferenceListener);
211 fCodeScanner = new PHPCodeScanner((JavaColorManager) colorManager,
213 fMultilineCommentScanner = new SingleTokenPHPScanner(
214 (JavaColorManager) colorManager, store,
215 IPreferenceConstants.PHP_MULTILINE_COMMENT);
216 fSinglelineCommentScanner = new SingleTokenPHPScanner(
217 (JavaColorManager) colorManager, store,
218 IPreferenceConstants.PHP_SINGLELINE_COMMENT);
219 // fStringDQScanner = new SingleTokenPHPScanner((JavaColorManager)
220 // colorManager, store, IPreferenceConstants.PHP_STRING);
221 // fStringSQScanner = new SingleTokenPHPScanner((JavaColorManager)
222 // colorManager, store, IPreferenceConstants.PHP_STRING);
224 fPHPDocScanner = new PHPDocCodeScanner((JavaColorManager) colorManager,
226 // fHTMLScanner = new HTMLCodeScanner((JavaColorManager)fColorManager,
228 fSmartyScanner = new SmartyCodeScanner((JavaColorManager) colorManager,
230 fSmartyDocScanner = new SmartyDocCodeScanner(
231 (JavaColorManager) colorManager, store);
233 fPartitionScanner = new FastJavaPartitionScanner();
235 // jspScriptScanner = new JSPScriptScanner();
236 // fPartitionScanner = new FastJavaPartitionScanner();
237 // fPartitionScanner = new PHPPartitionScanner();
239 // jspBracketScanner = new RuleBasedScanner();
240 // jspBracketScanner.setDefaultReturnToken(new
241 // Token(JSPScriptScanner.JSP_BRACKET));
242 // jspTextScanner = new RuleBasedScanner();
243 // jspTextScanner.setDefaultReturnToken(new
244 // Token(JSPScriptScanner.JSP_DEFAULT));
250 public XMLTextTools getXMLTextTools() {
255 * Disposes all the individual tools of this tools collection.
257 public void dispose() {
260 fMultilineCommentScanner = null;
261 fSinglelineCommentScanner = null;
262 // fStringDQScanner = null;
263 // fStringSQScanner = null;
264 fPHPDocScanner = null;
265 // fPartitionScanner = null;
267 if (colorManager != null) {
268 colorManager.dispose();
272 if (fPreferenceStore != null) {
273 fPreferenceStore.removePropertyChangeListener(fPreferenceListener);
274 fPreferenceStore = null;
276 if (fCorePreferenceStore != null) {
278 .removePropertyChangeListener(fPreferenceListener);
279 fCorePreferenceStore = null;
282 fPreferenceListener = null;
287 * Returns the color manager which is used to manage any Java-specific
288 * colors needed for such things like syntax highlighting.
290 * @return the color manager to be used for Java text viewers
292 public JavaColorManager getColorManager() {
293 return (JavaColorManager) colorManager;
297 * Returns a scanner which is configured to scan Java source code.
299 * @return a Java source code scanner
301 public RuleBasedScanner getCodeScanner() {
306 * Returns a scanner which is configured to scan Java multiline comments.
308 * @return a Java multiline comment scanner
312 public RuleBasedScanner getMultilineCommentScanner() {
313 return fMultilineCommentScanner;
317 * Returns a scanner which is configured to scan HTML code.
319 * @return a HTML scanner
323 // public RuleBasedScanner getHTMLScanner() {
324 // return fHTMLScanner;
327 * Returns a scanner which is configured to scan Smarty code.
329 * @return a Smarty scanner
333 public RuleBasedScanner getSmartyScanner() {
334 return fSmartyScanner;
338 * Returns a scanner which is configured to scan Smarty code.
340 * @return a Smarty scanner
344 public RuleBasedScanner getSmartyDocScanner() {
345 return fSmartyDocScanner;
349 * Returns a scanner which is configured to scan Java singleline comments.
351 * @return a Java singleline comment scanner
355 public RuleBasedScanner getSinglelineCommentScanner() {
356 return fSinglelineCommentScanner;
360 * Returns a scanner which is configured to scan Java strings.
362 * @return a Java string scanner
366 // public RuleBasedScanner getStringScanner() {
367 // return fStringDQScanner;
370 * Returns a scanner which is configured to scan JavaDoc compliant comments.
371 * Notes that the start sequence "/**" and the corresponding end sequence
372 * are part of the JavaDoc comment.
374 * @return a JavaDoc scanner
376 public RuleBasedScanner getJavaDocScanner() {
377 return fPHPDocScanner;
381 * Returns a scanner which is configured to scan Java-specific partitions,
382 * which are multi-line comments, JavaDoc comments, and regular Java source
385 * @return a Java partition scanner
387 // public IPartitionTokenScanner getPartitionScanner() {
388 // return fPartitionScanner;
391 * Factory method for creating a PHP-specific document partitioner using
392 * this object's partitions scanner. This method is a convenience method.
394 * @return a newly created Java document partitioner
396 public IDocumentPartitioner createDocumentPartitioner() {
397 return createDocumentPartitioner(".php");
401 * Factory method for creating a PHP-specific document partitioner using
402 * this object's partitions scanner. This method is a convenience method.
404 * @return a newly created Java document partitioner
406 public IDocumentPartitioner createDocumentPartitioner(String extension) {
410 // FastJavaPartitionScanner.JAVA_DOC,
411 // FastJavaPartitionScanner.JAVA_MULTI_LINE_COMMENT,
412 // FastJavaPartitionScanner.JAVA_SINGLE_LINE_COMMENT,
413 // FastJavaPartitionScanner.JAVA_STRING };
415 // return new DefaultPartitioner(getPartitionScanner(), types);
416 IDocumentPartitioner partitioner = null;
417 // System.out.println(extension);
418 if (extension.equalsIgnoreCase(".html")
419 || extension.equalsIgnoreCase(".htm")) {
421 partitioner = createHTMLPartitioner();
422 partitioner = createJSPPartitioner();
423 } else if (extension.equalsIgnoreCase(".xml")) {
425 partitioner = createXMLPartitioner();
426 // } else if (extension.equalsIgnoreCase(".js")) {
428 // partitioner = createJavaScriptPartitioner();
429 // } else if (extension.equalsIgnoreCase(".css")) {
430 // // cascading style sheets
431 // partitioner = createCSSPartitioner();
432 } else if (extension.equalsIgnoreCase(".tpl")) {
434 partitioner = createSmartyPartitioner();
435 // } else if (extension.equalsIgnoreCase(".inc")) {
436 // // php include files ?
437 // partitioner = createIncludePartitioner();
440 if (partitioner == null) {
441 partitioner = createJSPPartitioner();
448 * Sets up the Java document partitioner for the given document for the
449 * given partitioning.
452 * the document to be set up
453 * @param partitioning
454 * the document partitioning
460 // public void setupJavaDocumentPartitioner(IDocument document, String
461 // partitioning, Object element) {
462 // IDocumentPartitioner partitioner = createDocumentPartitioner(".php");
464 // // if (document instanceof IDocumentExtension3) {
465 // // IDocumentExtension3 extension3= (IDocumentExtension3) document;
466 // // extension3.setDocumentPartitioner(partitioning, partitioner);
468 // document.setDocumentPartitioner(partitioner);
470 // partitioner.connect(document);
472 public void setupHTMLDocumentPartitioner(IDocument document,
473 String partitioning, Object element) {
474 IDocumentPartitioner partitioner = createDocumentPartitioner(".html");
476 // if (document instanceof IDocumentExtension3) {
477 // IDocumentExtension3 extension3= (IDocumentExtension3) document;
478 // extension3.setDocumentPartitioner(partitioning, partitioner);
480 document.setDocumentPartitioner(partitioner);
482 partitioner.connect(document);
485 public void setupSmartyDocumentPartitioner(IDocument document,
486 String partitioning, Object element) {
487 IDocumentPartitioner partitioner = createDocumentPartitioner(".tpl");
489 // if (document instanceof IDocumentExtension3) {
490 // IDocumentExtension3 extension3= (IDocumentExtension3) document;
491 // extension3.setDocumentPartitioner(partitioning, partitioner);
493 document.setDocumentPartitioner(partitioner);
495 partitioner.connect(document);
499 * Returns the names of the document position categories used by the
500 * document partitioners created by this object to manage their partition
501 * information. If the partitioners don't use document position categories,
502 * the returned result is <code>null</code>.
504 * @return the partition managing position categories or <code>null</code>
507 public String[] getPartitionManagingPositionCategories() {
508 return new String[] { DefaultPartitioner.CONTENT_TYPES_CATEGORY };
512 * Determines whether the preference change encoded by the given event
513 * changes the behavior of one its contained components.
516 * the event to be investigated
517 * @return <code>true</code> if event causes a behavioral change
519 * @deprecated As of 3.0, replaced by
520 * {@link net.sourceforge.phpdt.ui.text.JavaSourceViewerConfiguration#affectsTextPresentation(PropertyChangeEvent)}
522 // public boolean affectsBehavior(PropertyChangeEvent event) {
523 // return fCodeScanner.affectsBehavior(event)
524 // || fMultilineCommentScanner.affectsBehavior(event)
525 // || fSinglelineCommentScanner.affectsBehavior(event)
526 // || fStringDQScanner.affectsBehavior(event)
527 // || fPHPDocScanner.affectsBehavior(event);
530 * Adapts the behavior of the contained components to the change encoded in
534 * the event to which to adapt
537 protected void adaptToPreferenceChange(PropertyChangeEvent event) {
538 if (fCodeScanner.affectsBehavior(event))
539 fCodeScanner.adaptToPreferenceChange(event);
540 if (fMultilineCommentScanner.affectsBehavior(event))
541 fMultilineCommentScanner.adaptToPreferenceChange(event);
542 if (fSinglelineCommentScanner.affectsBehavior(event))
543 fSinglelineCommentScanner.adaptToPreferenceChange(event);
544 // if (fStringDQScanner.affectsBehavior(event))
545 // fStringDQScanner.adaptToPreferenceChange(event);
546 if (fPHPDocScanner.affectsBehavior(event))
547 fPHPDocScanner.adaptToPreferenceChange(event);
548 // if (fHTMLScanner.affectsBehavior(event))
549 // fHTMLScanner.adaptToPreferenceChange(event);
550 if (fSmartyScanner.affectsBehavior(event))
551 fSmartyScanner.adaptToPreferenceChange(event);
552 if (fSmartyDocScanner.affectsBehavior(event))
553 fSmartyDocScanner.adaptToPreferenceChange(event);
554 // if (XMLPlugin.getDefault().getXMLTextTools().affectsBehavior(event))
556 // XMLPlugin.getDefault().getXMLTextTools().adaptToPreferenceChange(event);
561 * Return a partitioner for .html files.
563 public IDocumentPartitioner createHTMLPartitioner() {
564 // return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES);
565 return xmlTextTools.createXMLPartitioner();
568 // private static IDocumentPartitioner createIncludePartitioner() {
569 // // return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
570 // return new DefaultPartitioner(getPHPPartitionScanner(),
571 // FastJavaPartitionScanner.PHP_PARTITION_TYPES);
575 // private static IDocumentPartitioner createJavaScriptPartitioner() {
576 // return new DefaultPartitioner(getHTMLPartitionScanner(), TYPES);
580 * Return a partitioner for .php files.
582 public IDocumentPartitioner createPHPPartitioner() {
583 // return new DefaultPartitioner(getPHPPartitionScanner(), TYPES);
584 return new /*DefaultPartitioner*/FastPartitioner(getPHPPartitionScanner(),
585 LEGAL_CONTENT_TYPES);
588 private IDocumentPartitioner createJSPPartitioner() {
589 return new PHPDocumentPartitioner(getJSPPartitionScanner());
590 // return new JSPDocumentPartitioner(getJSPPartitionScanner(),
591 // jspScriptScanner);
597 // public IPartitionTokenScanner getJSPScriptScanner() {
598 // return jspScriptScanner;
600 private IDocumentPartitioner createSmartyPartitioner() {
601 return new /*DefaultPartitioner*/FastPartitioner(getSmartyPartitionScanner(),
605 private IDocumentPartitioner createXMLPartitioner() {
606 // return new DefaultPartitioner(getXMLPartitionScanner(),
607 // XMLTextTools.TYPES);
608 return xmlTextTools.createXMLPartitioner();
611 // private IDocumentPartitioner createCSSPartitioner() {
612 // return new DefaultPartitioner(getHTMLPartitionScanner(),
613 // XMLTextTools.TYPES);
617 * Return a scanner for creating html partitions.
619 // private static XMLPartitionScanner getHTMLPartitionScanner() {
620 // // if (HTML_PARTITION_SCANNER == null)
621 // // HTML_PARTITION_SCANNER = new
622 // HTMLPartitionScanner(IPHPPartitions.HTML_FILE);
623 // // return HTML_PARTITION_SCANNER;^
624 // if (HTML_PARTITION_SCANNER == null)
625 // HTML_PARTITION_SCANNER = new XMLPartitionScanner(false);
626 // return HTML_PARTITION_SCANNER;
629 * Return a scanner for creating php partitions.
631 private FastJavaPartitionScanner getPHPPartitionScanner() {
632 // if (PHP_PARTITION_SCANNER == null)
633 // PHP_PARTITION_SCANNER = new FastJavaPartitionScanner(); //new
634 // PHPPartitionScanner(IPHPPartitions.PHP_FILE);
635 // return PHP_PARTITION_SCANNER;
636 return fPartitionScanner;
640 * Returns a scanner which is configured to scan plain text in JSP.
642 * @return a JSP text scanner
644 // public RuleBasedScanner getJSPTextScanner() {
645 // return jspTextScanner;
648 * Returns a scanner which is configured to scan plain text in JSP.
650 * @return a JSP text scanner
652 // public RuleBasedScanner getJSPBracketScanner() {
653 // return jspBracketScanner;
656 * Return a scanner for creating smarty partitions.
658 private static HTMLPartitionScanner getSmartyPartitionScanner() {
659 if (SMARTY_PARTITION_SCANNER == null)
660 SMARTY_PARTITION_SCANNER = new HTMLPartitionScanner(
661 IPHPPartitions.SMARTY_FILE);
662 return SMARTY_PARTITION_SCANNER;
666 * Return a scanner for creating xml partitions.
668 // private static XMLPartitionScanner getXMLPartitionScanner() {
669 // // if (XML_PARTITION_SCANNER == null)
670 // // XML_PARTITION_SCANNER = new
671 // HTMLPartitionScanner(IPHPPartitions.XML_FILE);
672 // // return XML_PARTITION_SCANNER;
673 // if (XML_PARTITION_SCANNER == null)
674 // XML_PARTITION_SCANNER = new XMLPartitionScanner(false);
675 // return XML_PARTITION_SCANNER;
677 private PHPPartitionScanner getJSPPartitionScanner() {
678 if (jspPartitionScanner == null)
679 jspPartitionScanner = new PHPPartitionScanner();
680 return jspPartitionScanner;
684 * Sets up the Java document partitioner for the given document for the
685 * default partitioning.
688 * the document to be set up
691 public void setupJavaDocumentPartitioner(IDocument document) {
692 setupJavaDocumentPartitioner(document,
693 IDocumentExtension3.DEFAULT_PARTITIONING);
697 * Sets up the Java document partitioner for the given document for the
698 * given partitioning.
701 * the document to be set up
702 * @param partitioning
703 * the document partitioning
706 public void setupJavaDocumentPartitioner(IDocument document,
707 String partitioning) {
708 IDocumentPartitioner partitioner = createDocumentPartitioner();
709 if (document instanceof IDocumentExtension3) {
710 IDocumentExtension3 extension3 = (IDocumentExtension3) document;
711 extension3.setDocumentPartitioner(partitioning, partitioner);
713 document.setDocumentPartitioner(partitioner);
715 partitioner.connect(document);
719 * Returns this text tool's preference store.
721 * @return the preference store
724 protected IPreferenceStore getPreferenceStore() {
725 return fPreferenceStore;
729 * Returns this text tool's core preference store.
731 * @return the core preference store
734 protected Preferences getCorePreferenceStore() {
735 return fCorePreferenceStore;