/******************************************************************************* * Copyright (c) 2009, 2011 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.wst.xml.ui.internal.text; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion; import org.eclipse.wst.sse.ui.typing.AbstractCharacterPairInserter; import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; import org.eclipse.wst.xml.ui.internal.XMLUIPlugin; import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames; public class CharacterPairInserter extends AbstractCharacterPairInserter implements IPropertyChangeListener { // preferences private boolean fCloseStrings = true; private boolean fCloseBrackets = true; protected boolean shouldPair(ISourceViewer viewer, char c) { switch (c) { case '\'': case '"': return fCloseStrings ? checkRegion(viewer, c) : false; default: return fCloseBrackets; } } /** * Checks if the region should support paired quotes * @param viewer the viewer * @return true if the region is not in an XML attribute value */ private boolean checkRegion(ISourceViewer viewer, char c) { IDocument doc = viewer.getDocument(); final Point selection= viewer.getSelectedRange(); final int offset= selection.x; if (doc instanceof IStructuredDocument) { IStructuredDocumentRegion[] regions = ((IStructuredDocument) doc).getStructuredDocumentRegions(offset, 0); if (regions != null && regions.length > 0) { ITextRegion region = regions[0].getRegionAtCharacterOffset(offset); if (region != null) { final String type = region.getType(); if (DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS.equals(type)) return true; else if (DOMRegionContext.XML_TAG_CLOSE.equals(type) || DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(type)) { if (regions[0].containsOffset(offset - 1)) { region = regions[0].getRegionAtCharacterOffset(offset - 1); if (region != null && DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS.equals(region.getType())) return true; } } return c != '\'' && DOMRegionContext.XML_CONTENT.equals(type); } } } return true; } public boolean hasPair(char c) { switch (c) { case '"': case '\'': case '[': case '(': return true; default: return false; } } protected char getPair(char c) { switch (c) { case '\'': case '"': return c; case '(': return ')'; case '[': return ']'; default: throw new IllegalArgumentException(); } } public void initialize() { IPreferenceStore store = XMLUIPlugin.getInstance().getPreferenceStore(); fCloseStrings = store.getBoolean(XMLUIPreferenceNames.TYPING_CLOSE_STRINGS); fCloseBrackets = store.getBoolean(XMLUIPreferenceNames.TYPING_CLOSE_BRACKETS); store.addPropertyChangeListener(this); } public void dispose() { XMLUIPlugin.getInstance().getPreferenceStore().removePropertyChangeListener(this); } public void propertyChange(PropertyChangeEvent event) { if (XMLUIPreferenceNames.TYPING_CLOSE_BRACKETS.equals(event.getProperty())) fCloseBrackets = ((Boolean) event.getNewValue()).booleanValue(); else if (XMLUIPreferenceNames.TYPING_CLOSE_STRINGS.equals(event.getProperty())) fCloseStrings = ((Boolean) event.getNewValue()).booleanValue(); } }