blob: 32b40df11bbd2f7cf05de08dac9ddccb05e8aedb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 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
* Jens Lukowski/Innoopract - initial renaming/restructuring
*
*******************************************************************************/
package org.eclipse.wst.xml.ui.internal.contentassist;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
import org.eclipse.wst.xml.ui.internal.preferences.XMLUIPreferenceNames;
import org.eclipse.wst.xml.ui.internal.templates.TemplateContextTypeIdsXML;
public class XMLContentAssistProcessor extends AbstractContentAssistProcessor implements IPropertyChangeListener {
protected IPreferenceStore fPreferenceStore = null;
protected IResource fResource = null;
private XMLTemplateCompletionProcessor fTemplateProcessor = null;
private List fTemplateContexts = new ArrayList();
public XMLContentAssistProcessor() {
super();
}
protected void addAttributeNameProposals(ContentAssistRequest contentAssistRequest) {
addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.ATTRIBUTE);
super.addAttributeNameProposals(contentAssistRequest);
}
protected void addAttributeValueProposals(ContentAssistRequest contentAssistRequest) {
addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.ATTRIBUTE_VALUE);
super.addAttributeValueProposals(contentAssistRequest);
}
protected void addEmptyDocumentProposals(ContentAssistRequest contentAssistRequest) {
addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.NEW);
super.addEmptyDocumentProposals(contentAssistRequest);
}
protected void addTagInsertionProposals(ContentAssistRequest contentAssistRequest, int childPosition) {
addTemplates(contentAssistRequest, TemplateContextTypeIdsXML.TAG);
super.addTagInsertionProposals(contentAssistRequest, childPosition);
}
/**
* Adds templates to the list of proposals
*
* @param contentAssistRequest
* @param context
*/
private void addTemplates(ContentAssistRequest contentAssistRequest, String context) {
addTemplates(contentAssistRequest, context, contentAssistRequest.getReplacementBeginPosition());
}
/**
* Adds templates to the list of proposals
*
* @param contentAssistRequest
* @param context
* @param startOffset
*/
private void addTemplates(ContentAssistRequest contentAssistRequest, String context, int startOffset) {
if (contentAssistRequest == null)
return;
// if already adding template proposals for a certain context type, do
// not add again
if (!fTemplateContexts.contains(context)) {
fTemplateContexts.add(context);
boolean useProposalList = !contentAssistRequest.shouldSeparate();
if (getTemplateCompletionProcessor() != null) {
getTemplateCompletionProcessor().setContextType(context);
ICompletionProposal[] proposals = getTemplateCompletionProcessor().computeCompletionProposals(fTextViewer, startOffset);
for (int i = 0; i < proposals.length; ++i) {
if (useProposalList)
contentAssistRequest.addProposal(proposals[i]);
else
contentAssistRequest.addMacro(proposals[i]);
}
}
}
}
protected ContentAssistRequest computeCompletionProposals(int documentPosition, String matchString, ITextRegion completionRegion, IDOMNode treeNode, IDOMNode xmlnode) {
ContentAssistRequest request = super.computeCompletionProposals(documentPosition, matchString, completionRegion, treeNode, xmlnode);
// bug115927 use original document position for all/any region templates
addTemplates(request, TemplateContextTypeIdsXML.ALL, documentPosition);
return request;
}
/* (non-Javadoc)
* @see org.eclipse.wst.xml.ui.contentassist.AbstractContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer, int)
*/
public ICompletionProposal[] computeCompletionProposals(ITextViewer textViewer, int documentPosition) {
fTemplateContexts.clear();
return super.computeCompletionProposals(textViewer, documentPosition);
}
protected IPreferenceStore getPreferenceStore() {
if (fPreferenceStore == null)
fPreferenceStore = XMLUIPlugin.getDefault().getPreferenceStore();
return fPreferenceStore;
}
private XMLTemplateCompletionProcessor getTemplateCompletionProcessor() {
if (fTemplateProcessor == null) {
fTemplateProcessor = new XMLTemplateCompletionProcessor();
}
return fTemplateProcessor;
}
protected void init() {
getPreferenceStore().addPropertyChangeListener(this);
reinit();
}
public void propertyChange(PropertyChangeEvent event) {
String property = event.getProperty();
if (property.compareTo(XMLUIPreferenceNames.AUTO_PROPOSE) == 0 || property.compareTo(XMLUIPreferenceNames.AUTO_PROPOSE_CODE) == 0) {
reinit();
}
}
protected void reinit() {
String key = XMLUIPreferenceNames.AUTO_PROPOSE;
boolean doAuto = getPreferenceStore().getBoolean(key);
if (doAuto) {
key = XMLUIPreferenceNames.AUTO_PROPOSE_CODE;
completionProposalAutoActivationCharacters = getPreferenceStore().getString(key).toCharArray();
} else {
completionProposalAutoActivationCharacters = null;
}
}
public void release() {
super.release();
getPreferenceStore().removePropertyChangeListener(this);
}
}