X-Git-Url: http://git.phpeclipse.com diff --git a/archive/net.sourceforge.phpeclipse.css.ui/src/net/sourceforge/phpeclipse/css/ui/text/CssTextTools.java b/archive/net.sourceforge.phpeclipse.css.ui/src/net/sourceforge/phpeclipse/css/ui/text/CssTextTools.java new file mode 100644 index 0000000..34448bd --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.css.ui/src/net/sourceforge/phpeclipse/css/ui/text/CssTextTools.java @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2003-2004 Christopher Lenz and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Christopher Lenz - initial API and implementation + * + * $Id: CssTextTools.java,v 1.1 2004-09-02 18:11:51 jsurfer Exp $ + */ + +package net.sourceforge.phpeclipse.css.ui.text; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import net.sourceforge.phpeclipse.css.core.CssCore; +import net.sourceforge.phpeclipse.css.core.profiles.IProfile; +import net.sourceforge.phpeclipse.css.ui.internal.text.CssCodeScanner; +import net.sourceforge.phpeclipse.css.ui.internal.text.CssColorManager; +import net.sourceforge.phpeclipse.css.ui.internal.text.CssCommentScanner; +import net.sourceforge.phpeclipse.css.ui.internal.text.CssPartitionScanner; +import net.sourceforge.phpeclipse.css.ui.internal.text.CssStringScanner; + +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IDocumentExtension3; +import org.eclipse.jface.text.IDocumentPartitioner; +import org.eclipse.jface.text.rules.DefaultPartitioner; +import org.eclipse.jface.text.rules.IPartitionTokenScanner; +import org.eclipse.jface.text.rules.RuleBasedScanner; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; + +/** + * Tools required to configure a CSS text viewer. + * + *

+ * The color manager and all scanners exist only one time, i.e. the same + * instances are returned to all clients. Thus, clients share those tools. + *

+ */ +public class CssTextTools { + + // Instance Variables ------------------------------------------------------ + + /** + * The preference store to use. + */ + private IPreferenceStore store; + + /** + * Listener for changes to the preference store. + */ + private IPropertyChangeListener propertyChangeListener = + new IPropertyChangeListener() { + public void propertyChange(PropertyChangeEvent event) { + adaptToPreferenceChange(event); + } + }; + + /** + * The color manager. + */ + private IColorManager colorManager; + + /** + * The partition scanner. + */ + private CssPartitionScanner partitionScanner; + + /** + * Map of the code scanners, keyed by profile ID. + */ + private Map codeScanners = new HashMap(); + + /** + * The token scanner for syntax highlighting comments in CSS source. + */ + private CssCommentScanner commentScanner; + + /** + * The token scanner for syntax highlighting string literals in CSS source. + */ + private CssStringScanner stringScanner; + + // Constructors ------------------------------------------------------------ + + /** + * Creates a new CSS text tools collection. + * + * @param store the preference store to initialize the text tools. The text + * tools instance installs a listener on the passed preference store + * to adapt itself to changes in the preference store. + */ + public CssTextTools(IPreferenceStore store) { + this(store, true); + } + + /** + * Creates a new CSS text tools collection. + * + * @param store the preference store to initialize the text tools. The text + * tool instance installs a listener on the passed preference store + * to adapt itself to changes in the preference store. + * @param autoDisposeOnDisplayDispose if true the color + * manager automatically disposes all managed colors when the current + * display gets disposed and all calls to + * {@link org.eclipse.jface.text.source.ISharedTextColors#dispose()} + * are ignored. + */ + public CssTextTools(IPreferenceStore store, + boolean autoDisposeOnDisplayDispose) { + store.addPropertyChangeListener(propertyChangeListener); + this.store = store; + + colorManager = new CssColorManager(autoDisposeOnDisplayDispose); + partitionScanner = new CssPartitionScanner(); + commentScanner = new CssCommentScanner(store, colorManager); + stringScanner = new CssStringScanner(store, colorManager); + } + + // Public Methods ---------------------------------------------------------- + + /** + * Returns whether the specified change to the preference store would effect + * the presentation of CSS text. + * + * @param event the preference store change event + * @return true if the specified event affects the presentation + * of CSS text, false otherwise + */ + public boolean affectsPresentation(PropertyChangeEvent event) { + for (Iterator i = codeScanners.keySet().iterator(); i.hasNext();) { + CssCodeScanner scanner = (CssCodeScanner) + codeScanners.get(i.next()); + if (scanner.affectsPresentation(event)) { + return true; + } + } + if (commentScanner.affectsPresentation(event) + || stringScanner.affectsPresentation(event)) { + return true; + } + return false; + } + + /** + * Factory method for creating a Java-specific document partitioner + * using this object's partitions scanner. This method is a + * convenience method. + * + * @return a newly created Java document partitioner + */ + public IDocumentPartitioner createDocumentPartitioner() { + String[] types = new String[] { + CssPartitionScanner.CSS_COMMENT, + CssPartitionScanner.CSS_STRING + }; + return new DefaultPartitioner(getPartitionScanner(), types); + } + + /** + * Disposes all the individual tools of this tools collection. + */ + public void dispose() { + + // dispose the scanners + codeScanners.clear(); + commentScanner = null; + stringScanner = null; + partitionScanner = null; + + // dispose the color manager + if (colorManager != null) { + colorManager.dispose(); + colorManager = null; + } + + // detach from the preference store + if (store != null) { + store.removePropertyChangeListener(propertyChangeListener); + propertyChangeListener = null; + store = null; + } + } + + /** + * Returns the color manager which is used to manage + * any Java-specific colors needed for such things like syntax highlighting. + * + * @return the color manager to be used for Java text viewers + */ + public IColorManager getColorManager() { + return colorManager; + } + + /** + * Returns a scanner which is configured to scan CSS source code. + * + * @param profile the profile for which to retrieve the code scanner + * @return a CSS source code scanner + */ + public RuleBasedScanner getCodeScanner(IProfile profile) { + if (profile == null) { + // use the default profile + profile = CssCore.getDefault().getProfileManager().getProfile(null); + } + String profileId = profile.getDescriptor().getId(); + RuleBasedScanner codeScanner = (RuleBasedScanner) + codeScanners.get(profileId); + if (codeScanner == null) { + codeScanner = new CssCodeScanner(store, this.colorManager, profile); + codeScanners.put(profileId, codeScanner); + } + return codeScanner; + } + + /** + * Returns a scanner which is configured to scan CSS comments. + * + * @return a CSS comment scanner + */ + public RuleBasedScanner getCommentScanner() { + return commentScanner; + } + + /** + * Returns a scanner which is configured to scan CSS strings. + * + * @return a CSS string scanner + */ + public RuleBasedScanner getStringScanner() { + return stringScanner; + } + + /** + * Returns a scanner which is configured to scan CSS-specific partitions, + * which are comments, strings and regular code. + * + * @return a CSS partition scanner + */ + public IPartitionTokenScanner getPartitionScanner() { + return partitionScanner; + } + + /** + * Sets up the given document for the default partitioning. + * + * @param document the document to be set up + */ + public void setupDocument(IDocument document) { + setupDocument(document, IDocumentExtension3.DEFAULT_PARTITIONING); + } + + /** + * Sets up the given document for the given partitioning. + * + * @param document the document to be set up + * @param partitioning the document partitioning + */ + public void setupDocument(IDocument document, String partitioning) { + IDocumentPartitioner partitioner = createDocumentPartitioner(); + if (document instanceof IDocumentExtension3) { + IDocumentExtension3 extension = (IDocumentExtension3) document; + extension.setDocumentPartitioner(partitioning, partitioner); + } else { + document.setDocumentPartitioner(partitioner); + } + partitioner.connect(document); + } + + // Protected Methods ------------------------------------------------------- + + /** + * Adapts the behavior of the contained components to the change according + * to the given event. + * + * @param event the event to which to adapt + */ + protected void adaptToPreferenceChange(PropertyChangeEvent event) { + for (Iterator i = codeScanners.keySet().iterator(); i.hasNext();) { + CssCodeScanner scanner = (CssCodeScanner) + codeScanners.get(i.next()); + if (scanner.affectsPresentation(event)) { + scanner.adaptToPreferenceChange(event); + } + } + if (commentScanner.affectsPresentation(event)) { + commentScanner.adaptToPreferenceChange(event); + } + if (stringScanner.affectsPresentation(event)) { + stringScanner.adaptToPreferenceChange(event); + } + } + +}