org.eclipse.ant.internal.ui.AntSourceViewerConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ant.internal.ui.AntSourceViewerConfiguration.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ant.internal.ui;

import org.eclipse.ant.internal.ui.editor.text.AntDocumentSetupParticipant;
import org.eclipse.ant.internal.ui.editor.text.AntEditorPartitionScanner;
import org.eclipse.ant.internal.ui.editor.text.AntEditorProcInstrScanner;
import org.eclipse.ant.internal.ui.editor.text.AntEditorTagScanner;
import org.eclipse.ant.internal.ui.editor.text.IAntEditorColorConstants;
import org.eclipse.ant.internal.ui.editor.text.MultilineDamagerRepairer;
import org.eclipse.ant.internal.ui.preferences.AntEditorPreferenceConstants;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextDoubleClickStrategy;
import org.eclipse.jface.text.TextAttribute;
import org.eclipse.jface.text.presentation.IPresentationReconciler;
import org.eclipse.jface.text.presentation.PresentationReconciler;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;

public class AntSourceViewerConfiguration extends TextSourceViewerConfiguration {

    private AntEditorTagScanner tagScanner;
    private AntEditorProcInstrScanner instructionScanner;
    private MultilineDamagerRepairer damageRepairer;
    private MultilineDamagerRepairer dtdDamageRepairer;
    private TextAttribute xmlCommentAttribute;
    private TextAttribute xmlDtdAttribute;

    public AntSourceViewerConfiguration() {
        super(AntUIPlugin.getDefault().getCombinedPreferenceStore());
    }

    private AntEditorProcInstrScanner getDefaultScanner() {
        if (instructionScanner == null) {
            instructionScanner = new AntEditorProcInstrScanner();
        }
        return instructionScanner;
    }

    private AntEditorTagScanner getTagScanner() {
        if (tagScanner == null) {
            tagScanner = new AntEditorTagScanner();
        }
        return tagScanner;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getPresentationReconciler(org.eclipse.jface.text.source.ISourceViewer)
     */
    @Override
    public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
        PresentationReconciler reconciler = new PresentationReconciler();
        reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));

        MultilineDamagerRepairer dr = new MultilineDamagerRepairer(getDefaultScanner());
        reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
        reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);

        dr = new MultilineDamagerRepairer(getTagScanner());
        reconciler.setDamager(dr, AntEditorPartitionScanner.XML_TAG);
        reconciler.setRepairer(dr, AntEditorPartitionScanner.XML_TAG);

        int style = getStyle(IAntEditorColorConstants.XML_COMMENT_COLOR);
        xmlCommentAttribute = new TextAttribute(
                AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.XML_COMMENT_COLOR), null, style);
        damageRepairer = new MultilineDamagerRepairer(null, xmlCommentAttribute);
        reconciler.setDamager(damageRepairer, AntEditorPartitionScanner.XML_COMMENT);
        reconciler.setRepairer(damageRepairer, AntEditorPartitionScanner.XML_COMMENT);

        style = getStyle(IAntEditorColorConstants.XML_DTD_COLOR);
        xmlDtdAttribute = new TextAttribute(AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.XML_DTD_COLOR),
                null, style);
        dtdDamageRepairer = new MultilineDamagerRepairer(null, xmlDtdAttribute);
        reconciler.setDamager(dtdDamageRepairer, AntEditorPartitionScanner.XML_DTD);
        reconciler.setRepairer(dtdDamageRepairer, AntEditorPartitionScanner.XML_DTD);

        return reconciler;
    }

    private int getStyle(String pref) {
        int style = SWT.NORMAL;
        if (fPreferenceStore.getBoolean(pref + AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX)) {
            style |= SWT.BOLD;
        }
        if (fPreferenceStore.getBoolean(pref + AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX)) {
            style |= SWT.ITALIC;
        }
        return style;
    }

    /**
     * Preference colors have changed. Update the default tokens of the scanners.
     */
    public void adaptToPreferenceChange(PropertyChangeEvent event) {
        if (tagScanner == null) {
            return; // property change before the editor is fully created
        }
        tagScanner.adaptToPreferenceChange(event);
        instructionScanner.adaptToPreferenceChange(event);
        String property = event.getProperty();
        if (property.startsWith(IAntEditorColorConstants.XML_COMMENT_COLOR)) {
            xmlCommentAttribute = adaptTextAttribute(event, property, xmlCommentAttribute, damageRepairer);
        } else if (property.startsWith(IAntEditorColorConstants.XML_DTD_COLOR)) {
            xmlDtdAttribute = adaptTextAttribute(event, property, xmlDtdAttribute, dtdDamageRepairer);
        }
    }

    private TextAttribute adaptTextAttribute(PropertyChangeEvent event, String property,
            TextAttribute textAttribute, MultilineDamagerRepairer repairer) {
        if (property.endsWith(AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX)) {
            textAttribute = adaptToStyleChange(event, SWT.BOLD, textAttribute);
        } else if (property.endsWith(AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX)) {
            textAttribute = adaptToStyleChange(event, SWT.ITALIC, textAttribute);
        } else {
            textAttribute = adaptToColorChange(event, textAttribute);
        }
        repairer.setDefaultTextAttribute(textAttribute);
        return textAttribute;
    }

    private TextAttribute adaptToStyleChange(PropertyChangeEvent event, int styleAttribute,
            TextAttribute textAttribute) {
        boolean eventValue = false;
        Object value = event.getNewValue();
        if (value instanceof Boolean) {
            eventValue = ((Boolean) value).booleanValue();
        } else if (IPreferenceStore.TRUE.equals(value)) {
            eventValue = true;
        }

        boolean activeValue = (textAttribute.getStyle() & styleAttribute) == styleAttribute;
        if (activeValue != eventValue) {
            textAttribute = new TextAttribute(textAttribute.getForeground(), textAttribute.getBackground(),
                    eventValue ? textAttribute.getStyle() | styleAttribute
                            : textAttribute.getStyle() & ~styleAttribute);
        }
        return textAttribute;
    }

    /**
     * Update the text attributes associated with the tokens of this scanner as a color preference has been changed.
     */
    private TextAttribute adaptToColorChange(PropertyChangeEvent event, TextAttribute textAttribute) {
        RGB rgb = null;

        Object value = event.getNewValue();
        if (value instanceof RGB) {
            rgb = (RGB) value;
        } else if (value instanceof String) {
            rgb = StringConverter.asRGB((String) value);
        }

        if (rgb != null) {
            textAttribute = new TextAttribute(ColorManager.getDefault().getColor(rgb),
                    textAttribute.getBackground(), textAttribute.getStyle());
        }
        return textAttribute;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getConfiguredContentTypes(org.eclipse.jface.text.source.ISourceViewer)
     */
    @Override
    public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
        return new String[] { IDocument.DEFAULT_CONTENT_TYPE, AntEditorPartitionScanner.XML_COMMENT,
                AntEditorPartitionScanner.XML_TAG, AntEditorPartitionScanner.XML_CDATA,
                AntEditorPartitionScanner.XML_DTD };
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getTabWidth(org.eclipse.jface.text.source.ISourceViewer)
     */
    @Override
    public int getTabWidth(ISourceViewer sourceViewer) {
        return fPreferenceStore.getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH);
    }

    public boolean affectsTextPresentation(PropertyChangeEvent event) {
        String property = event.getProperty();
        return property.startsWith(IAntEditorColorConstants.TEXT_COLOR)
                || property.startsWith(IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR)
                || property.startsWith(IAntEditorColorConstants.STRING_COLOR)
                || property.startsWith(IAntEditorColorConstants.TAG_COLOR)
                || property.startsWith(IAntEditorColorConstants.XML_COMMENT_COLOR)
                || property.startsWith(IAntEditorColorConstants.XML_DTD_COLOR);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getConfiguredDocumentPartitioning(org.eclipse.jface.text.source.ISourceViewer)
     */
    @Override
    public String getConfiguredDocumentPartitioning(ISourceViewer sourceViewer) {
        return AntDocumentSetupParticipant.ANT_PARTITIONING;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getDoubleClickStrategy(org.eclipse.jface.text.source.ISourceViewer,
     * java.lang.String)
     */
    @Override
    public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
        if (AntEditorPartitionScanner.XML_TAG.equals(contentType)) {
            return new AntDoubleClickStrategy();
        }
        return super.getDoubleClickStrategy(sourceViewer, contentType);
    }
}