/*******************************************************************************
 * Copyright (c) 2002, 2005 GEBIT Gesellschaft fuer EDV-Beratung
 * und Informatik-Technologien mbH, 
 * Berlin, Duesseldorf, Frankfurt (Germany) and others.
 *
 * This program and the accompanying materials 
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     GEBIT Gesellschaft fuer EDV-Beratung und Informatik-Technologien mbH - initial API and implementation
 * 	   IBM Corporation - bug fixes
 *******************************************************************************/

package org.eclipse.ant.internal.ui.editor.text;

import org.eclipse.ant.internal.ui.preferences.AntEditorPreferenceConstants;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.MultiLineRule;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WhitespaceRule;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;

/**
 * The scanner to tokenize for XML processing instructions and text
 */
public class AntEditorProcInstrScanner extends AbstractAntEditorScanner {

	Token fProcInstructionToken = null;

	public AntEditorProcInstrScanner() {
		IRule[] rules = new IRule[2];
		fProcInstructionToken = new Token(createTextAttribute(IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR, IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR
				+ AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX, IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR
				+ AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX));

		// Add rule for processing instructions
		rules[0] = new MultiLineRule("<?", "?>", fProcInstructionToken); //$NON-NLS-1$ //$NON-NLS-2$

		// Add generic whitespace rule.
		rules[1] = new WhitespaceRule(new AntEditorWhitespaceDetector());

		setRules(rules);

		setDefaultReturnToken(new Token(createTextAttribute(IAntEditorColorConstants.TEXT_COLOR, IAntEditorColorConstants.TEXT_COLOR
				+ AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX, IAntEditorColorConstants.TEXT_COLOR
				+ AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX)));
	}

	private Token getTokenAffected(PropertyChangeEvent event) {
		if (event.getProperty().startsWith(IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR)) {
			return fProcInstructionToken;
		}
		return (Token) fDefaultReturnToken;
	}

	public void adaptToPreferenceChange(PropertyChangeEvent event) {
		String property = event.getProperty();
		if (property.startsWith(IAntEditorColorConstants.TEXT_COLOR) || property.startsWith(IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR)) {
			if (property.endsWith(AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX)) {
				adaptToStyleChange(event, getTokenAffected(event), SWT.BOLD);
			} else if (property.endsWith(AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX)) {
				adaptToStyleChange(event, getTokenAffected(event), SWT.ITALIC);
			} else {
				adaptToColorChange(event, getTokenAffected(event));
			}
		}
	}
}