/******************************************************************************* * Copyright (c) 2012-2014 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.cdi.ui.ca; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.swt.graphics.Image; import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion; 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.contentassist.CompletionProposalInvocationContext; import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils; import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; import org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest; import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper; import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages; import org.jboss.tools.cdi.core.CDICoreNature; import org.jboss.tools.cdi.core.CDIUtil; import org.jboss.tools.cdi.internal.core.ca.BeansXmlProcessor; import org.jboss.tools.common.el.core.resolver.ELContext; import org.jboss.tools.common.text.TextProposal; import org.jboss.tools.common.ui.CommonUIPlugin; import org.jboss.tools.jst.web.ui.internal.editor.contentassist.AutoContentAssistantProposal; import org.jboss.tools.jst.web.ui.internal.editor.contentassist.computers.XmlTagCompletionProposalComputer; import org.jboss.tools.jst.web.kb.KbQuery; import org.jboss.tools.jst.web.kb.KbQuery.Type; import org.jboss.tools.jst.web.kb.PageContextFactory; import org.w3c.dom.Element; import org.w3c.dom.Text; @SuppressWarnings("restriction") public class BeansXmlCompletionProposalComputer extends XmlTagCompletionProposalComputer { @Override @SuppressWarnings("rawtypes") public List computeCompletionProposals( CompletionProposalInvocationContext context, IProgressMonitor monitor) { IFile file = PageContextFactory.getResource(context.getDocument()); if(file == null || !"beans.xml".equalsIgnoreCase(file.getName())) { return new ArrayList(); } return super.computeCompletionProposals(context, monitor); } @Override protected void addTagInsertionProposals( ContentAssistRequest contentAssistRequest, int childPosition, CompletionProposalInvocationContext context) { String prefix = getTagPrefix(); String uri = getTagUri(); String query = null; String nodeText = null; IndexedRegion treeNode = ContentAssistUtils.getNodeAt(context.getViewer(), context.getInvocationOffset()); int nodeStartOffset = treeNode == null ? -1 : treeNode.getStartOffset(); int localInvocationOffset = nodeStartOffset == -1 ? -1 : context.getInvocationOffset() - nodeStartOffset; if (treeNode instanceof Element) { IStructuredDocumentRegion reg = getStructuredDocumentRegion(context.getInvocationOffset()); ITextRegion firstRegion = reg == null ? null : reg.getFirstRegion(); if (firstRegion == null) return; if (firstRegion.getType() != DOMRegionContext.XML_END_TAG_OPEN ) { return; } IndexedRegion prevTreeNode = context.getInvocationOffset() <= 0 ? null : ContentAssistUtils.getNodeAt(context.getViewer(), context.getInvocationOffset() - 1); if (prevTreeNode instanceof Text) { treeNode = prevTreeNode; localInvocationOffset = ((Text)treeNode).getData() == null ? 0 : ((Text)treeNode).getData().length(); } } else if (!(treeNode instanceof Text)) { return; } nodeText = treeNode instanceof Text ? ((Text)treeNode).getData() : ""; if (localInvocationOffset > 0 && localInvocationOffset <= nodeText.length()) { query = nodeText.substring(0, localInvocationOffset); } if (query == null) query = ""; //$NON-NLS-1$ ELContext elContext = getContext(); IProject project = elContext == null || elContext.getResource() == null ? null : elContext.getResource().getProject(); if (project == null) return; // The following code is made due to make sure that the CDI Model and Project is up-to-date CDICoreNature nature = CDIUtil.getCDINatureWithProgress(project); if (nature == null) return; KbQuery kbQuery = createKbQuery(Type.TAG_BODY, query, query, prefix, uri); TextProposal[] proposals = BeansXmlProcessor.getInstance().getProposals(kbQuery, project); String matchString = leftTrim(query); for (int i = 0; proposals != null && i < proposals.length; i++) { TextProposal textProposal = proposals[i]; String replacementString = textProposal.getReplacementString(); int replacementOffset = contentAssistRequest.getReplacementBeginPosition() - matchString.length(); int replacementLength = matchString.length(); int cursorPosition = getCursorPositionForProposedText(replacementString); Image image = CommonUIPlugin.getImageDescriptorRegistry().get(textProposal.getImageDescriptor()); if (textProposal.getImageDescriptor() == null) { image = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TAG_GENERIC); } String displayString = textProposal.getLabel(); IContextInformation contextInformation = null; String additionalProposalInfo = textProposal.getContextInfo(); int relevance = textProposal.getRelevance(); if (relevance == TextProposal.R_NONE) { relevance = TextProposal.R_TAG_INSERTION; } AutoContentAssistantProposal proposal = new AutoContentAssistantProposal( textProposal, false, replacementString, replacementOffset, replacementLength, cursorPosition, image, displayString, contextInformation, additionalProposalInfo, relevance); contentAssistRequest.addProposal(proposal); } } @Override protected void addAttributeNameProposals( ContentAssistRequest contentAssistRequest, CompletionProposalInvocationContext context) { // No actions required } @Override protected void addAttributeValueProposals( ContentAssistRequest contentAssistRequest, CompletionProposalInvocationContext context) { // No actions required } @Override protected void addTagNameProposals( ContentAssistRequest contentAssistRequest, int childPosition, CompletionProposalInvocationContext context) { // No actions required } @Override protected void addTagNameProposals( ContentAssistRequest contentAssistRequest, int childPosition, boolean insertTagOpenningCharacter, CompletionProposalInvocationContext context) { // No actions required } @Override protected void addAttributeValueELProposals( ContentAssistRequest contentAssistRequest, CompletionProposalInvocationContext context) { // No actions required } @Override protected void addTextELProposals( ContentAssistRequest contentAssistRequest, CompletionProposalInvocationContext context) { // No actions required } private String leftTrim(String value) { int len = value.length(); int st = 0; char[] val = value.toCharArray(); while ((st < len) && (val[st] <= ' ')) { st++; } return (st > 0) ? value.substring(st) : value; } }