private void proposeStatementText(ContentAssistRequest contentAssistRequest, Node statementNode) { int offset = contentAssistRequest.getReplacementBeginPosition(); String text = contentAssistRequest.getText(); int offsetInText = offset - contentAssistRequest.getStartOffset() - 1; ExpressionProposalParser parser = new ExpressionProposalParser(text, offsetInText); if (parser.isProposable()) { String matchString = parser.getMatchString(); offset -= matchString.length(); int length = parser.getReplacementLength(); final IJavaProject project = getJavaProject(contentAssistRequest); String proposalTarget = parser.getProposalTarget(); if (proposalTarget == null || proposalTarget.length() == 0) addProposals( contentAssistRequest, ProposalComputorHelper.proposeOptionName(offset, length, matchString)); else if ("property".equals(proposalTarget)) addProposals( contentAssistRequest, proposeParameter(project, offset, length, statementNode, true, matchString)); else if ("jdbcType".equals(proposalTarget)) addProposals( contentAssistRequest, ProposalComputorHelper.proposeJdbcType(offset, length, matchString)); else if ("javaType".equals(proposalTarget)) addProposals( contentAssistRequest, ProposalComputorHelper.proposeJavaType(project, offset, length, true, matchString)); else if ("typeHandler".equals(proposalTarget)) addProposals( contentAssistRequest, ProposalComputorHelper.proposeTypeHandler(project, offset, length, matchString)); } }
protected void addAttributeValueProposals( ContentAssistRequest contentAssistRequest, CompletionProposalInvocationContext context) { IDOMNode node = (IDOMNode) contentAssistRequest.getNode(); String tagName = node.getNodeName(); IStructuredDocumentRegion open = node.getFirstStructuredDocumentRegion(); ITextRegionList openRegions = open.getRegions(); int i = openRegions.indexOf(contentAssistRequest.getRegion()); if (i < 0) return; ITextRegion nameRegion = null; while (i >= 0) { nameRegion = openRegions.get(i--); if (nameRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) break; } // get the attribute in question (first attr name to the left of the cursor) String attributeName = null; if (nameRegion != null) attributeName = open.getText(nameRegion); ProposalType proposalType = resolveProposalType(tagName, attributeName); if (ProposalType.None.equals(proposalType)) { return; } String currentValue = null; if (contentAssistRequest.getRegion().getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) currentValue = contentAssistRequest.getText(); else currentValue = ""; String matchString = null; int matchStrLen = contentAssistRequest.getMatchString().length(); int start = contentAssistRequest.getReplacementBeginPosition(); int length = contentAssistRequest.getReplacementLength(); if (currentValue.length() > StringUtils.strip(currentValue).length() && (currentValue.startsWith("\"") || currentValue.startsWith("'")) && matchStrLen > 0) { // Value is surrounded by (double) quotes. matchString = currentValue.substring(1, matchStrLen); start++; length = currentValue.length() - 2; currentValue = currentValue.substring(1, length + 1); } else { matchString = currentValue.substring(0, matchStrLen); } IJavaProject project = getJavaProject(contentAssistRequest); try { switch (proposalType) { case Package: proposePackage(contentAssistRequest, project, matchString, start, length); break; case TypeAlias: addProposals( contentAssistRequest, ProposalComputorHelper.proposeJavaType(project, start, length, false, matchString)); break; case ResultType: addProposals( contentAssistRequest, ProposalComputorHelper.proposeJavaType(project, start, length, true, matchString)); break; case ResultProperty: proposeProperty(contentAssistRequest, matchString, start, length, node); break; case TypeHandlerType: addProposals( contentAssistRequest, ProposalComputorHelper.proposeTypeHandler(project, start, length, matchString)); break; case CacheType: addProposals( contentAssistRequest, ProposalComputorHelper.proposeCacheType(project, start, length, matchString)); break; case SettingName: addProposals( contentAssistRequest, ProposalComputorHelper.proposeSettingName(start, length, matchString)); break; case ObjectFactory: addProposals( contentAssistRequest, ProposalComputorHelper.proposeObjectFactory(project, start, length, matchString)); break; case ObjectWrapperFactory: addProposals( contentAssistRequest, ProposalComputorHelper.proposeObjectWrapperFactory( project, start, length, matchString)); break; case StatementId: proposeStatementId(contentAssistRequest, project, matchString, start, length, node); break; case MapperNamespace: proposeMapperNamespace(contentAssistRequest, project, start, length); break; case ResultMap: String ownId = "resultMap".equals(tagName) && "extends".equals(attributeName) ? XpathUtil.xpathString(node, "@id") : null; addProposals( contentAssistRequest, proposeResultMapReference( project, node.getOwnerDocument(), start, currentValue, matchString.length(), ownId)); break; case Include: addProposals( contentAssistRequest, ProposalComputorHelper.proposeReference( project, node.getOwnerDocument(), matchString, start, length, "sql", null)); break; case SelectId: // TODO: include mapper methods with @Select. addProposals( contentAssistRequest, ProposalComputorHelper.proposeReference( project, node.getOwnerDocument(), matchString, start, length, "select", null)); break; case KeyProperty: String nodeName = node.getNodeName(); Node statementNode = "update".equals(nodeName) || "insert".equals(nodeName) ? node : MybatipseXmlUtil.findEnclosingStatementNode(node.getParentNode()); addProposals( contentAssistRequest, proposeParameter(project, start, length, statementNode, false, matchString)); break; case ParamProperty: addProposals( contentAssistRequest, proposeParameter( project, start, length, MybatipseXmlUtil.findEnclosingStatementNode(node), true, matchString)); break; case ParamPropertyPartial: AttrTextParser parser = new AttrTextParser(currentValue, matchString.length()); addProposals( contentAssistRequest, proposeParameter( project, start + parser.getMatchStringStart(), parser.getReplacementLength(), MybatipseXmlUtil.findEnclosingStatementNode(node.getParentNode()), true, parser.getMatchString())); break; default: break; } } catch (Exception e) { Activator.log(Status.ERROR, e.getMessage(), e); } }