use of org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration in project webtools.sourceediting by eclipse.
the class DOMPropertyDescriptorFactory method createAttributePropertyDescriptor.
public IPropertyDescriptor createAttributePropertyDescriptor(Attr attr) {
IPropertyDescriptor result = null;
String attributeName = attr.getName();
ModelQuery mq = ModelQueryUtil.getModelQuery(attr.getOwnerDocument());
if (mq != null) {
CMAttributeDeclaration ad = mq.getCMAttributeDeclaration(attr);
if (ad != null) {
String[] valuesArray = mq.getPossibleDataTypeValues(attr.getOwnerElement(), ad);
if ((valuesArray != null) && (valuesArray.length > 0)) {
result = new EnumeratedStringPropertyDescriptor(attributeName, attributeName, valuesArray);
}
}
}
if (result == null) {
result = createDefaultPropertyDescriptor(attributeName);
}
return result;
}
use of org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration in project webtools.sourceediting by eclipse.
the class AttributeShowingLabelProvider method getText.
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object o) {
StringBuffer text = null;
if (o instanceof Node) {
Node node = (Node) o;
if ((node.getNodeType() == Node.ELEMENT_NODE) && fShowAttributes) {
text = new StringBuffer(super.getText(o));
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88444
if (node.hasAttributes()) {
Element element = (Element) node;
NamedNodeMap attributes = element.getAttributes();
Node idTypedAttribute = null;
Node requiredAttribute = null;
boolean hasId = false;
boolean hasName = false;
Node shownAttribute = null;
// try to get content model element
// declaration
CMElementDeclaration elementDecl = null;
ModelQuery mq = ModelQueryUtil.getModelQuery(element.getOwnerDocument());
if (mq != null) {
elementDecl = mq.getCMElementDeclaration(element);
}
// ID
if (elementDecl != null) {
int i = 0;
while ((i < attributes.getLength()) && (idTypedAttribute == null)) {
Node attr = attributes.item(i);
String attrName = attr.getNodeName();
CMNamedNodeMap attributeDeclarationMap = elementDecl.getAttributes();
CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(attributeDeclarationMap);
List nodes = ModelQueryUtil.getModelQuery(node.getOwnerDocument()).getAvailableContent(element, elementDecl, ModelQuery.INCLUDE_ATTRIBUTES);
for (int k = 0; k < nodes.size(); k++) {
CMNode cmnode = (CMNode) nodes.get(k);
if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
allAttributes.put(cmnode);
}
}
attributeDeclarationMap = allAttributes;
CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) attributeDeclarationMap.getNamedItem(attrName);
if (attrDecl != null) {
if ((attrDecl.getAttrType() != null) && (CMDataType.ID.equals(attrDecl.getAttrType().getDataTypeName()))) {
idTypedAttribute = attr;
} else if ((attrDecl.getUsage() == CMAttributeDeclaration.REQUIRED) && (requiredAttribute == null)) {
// as a backup, keep tabs on
// any required
// attributes
requiredAttribute = attr;
} else {
hasId = hasId || attrName.equals(ATTR_ID);
hasName = hasName || attrName.equals(ATTR_NAME);
}
}
++i;
}
}
/*
* If no suitable attribute was found, try using a
* required attribute, if none, then prefer "id" or
* "name", otherwise just use first attribute
*/
if (idTypedAttribute != null) {
shownAttribute = idTypedAttribute;
} else if (requiredAttribute != null) {
shownAttribute = requiredAttribute;
} else if (hasId) {
shownAttribute = attributes.getNamedItem(ATTR_ID);
} else if (hasName) {
shownAttribute = attributes.getNamedItem(ATTR_NAME);
}
if (shownAttribute == null) {
shownAttribute = attributes.item(0);
}
// display the attribute and value (without quotes)
String attributeName = shownAttribute.getNodeName();
if ((attributeName != null) && (attributeName.length() > 0)) {
// $NON-NLS-1$
text.append(" ");
text.append(attributeName);
String attributeValue = shownAttribute.getNodeValue();
if ((attributeValue != null) && (attributeValue.length() > 0)) {
// $NON-NLS-1$
text.append("=");
text.append(StringUtils.strip(attributeValue));
}
}
// if (XSLCore.XSL_NAMESPACE_URI.equals(node.getNamespaceURI())) {
// Element el = (Element) node;
// Attr attr = el.getAttributeNode("mode"); //$NON-NLS-1$
// if (attr != null) {
// text.append(" "); //$NON-NLS-1$
// text.append(attr.getName());
// text.append("="); //$NON-NLS-1$
// text.append(StringUtils.strip(attr.getNodeValue()));
// }
// }
}
} else {
text = new StringBuffer(super.getText(o));
}
} else {
return super.toString();
}
return text.toString();
}
use of org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration in project webtools.sourceediting by eclipse.
the class AbstractXMLModelQueryCompletionProposalComputer method addAttributeValueProposals.
protected void addAttributeValueProposals(ContentAssistRequest contentAssistRequest, CompletionProposalInvocationContext context) {
IDOMNode node = (IDOMNode) contentAssistRequest.getNode();
// Find the attribute region and name for which this position should
// have a value proposed
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;
}
}
// the name region is REQUIRED to do anything useful
if (nameRegion != null) {
// Retrieve the declaration
CMElementDeclaration elementDecl = getCMElementDeclaration(node);
// String attributeName = nameRegion.getText();
String attributeName = open.getText(nameRegion);
CMAttributeDeclaration attrDecl = null;
// declaration for the attribute otherwise
if (elementDecl != null) {
CMNamedNodeMapImpl allAttributes = new CMNamedNodeMapImpl(elementDecl.getAttributes()) {
private Map caseInsensitive;
private Map getCaseInsensitiveMap() {
if (caseInsensitive == null)
caseInsensitive = new HashMap();
return caseInsensitive;
}
public CMNode getNamedItem(String name) {
CMNode node = super.getNamedItem(name);
if (node == null) {
node = (CMNode) getCaseInsensitiveMap().get(name.toLowerCase(Locale.US));
}
return node;
}
public void put(CMNode cmNode) {
super.put(cmNode);
getCaseInsensitiveMap().put(cmNode.getNodeName().toLowerCase(Locale.US), cmNode);
}
};
this.addModelQueryAttributeDeclarations(node, elementDecl, allAttributes);
String noprefixName = DOMNamespaceHelper.getUnprefixedName(attributeName);
if (allAttributes != null) {
attrDecl = (CMAttributeDeclaration) allAttributes.getNamedItem(attributeName);
if (attrDecl == null) {
attrDecl = (CMAttributeDeclaration) allAttributes.getNamedItem(noprefixName);
}
}
if (attrDecl == null) {
setErrorMessage(XMLUIMessages.No_known_attribute__UI_ + attributeName);
}
}
String currentValue = node.getAttributes().getNamedItem(attributeName).getNodeValue();
String proposedInfo = null;
// get proposal image
Image image = CMImageUtil.getImage(attrDecl);
if (image == null) {
if ((attrDecl != null) && (attrDecl.getUsage() == CMAttributeDeclaration.REQUIRED)) {
image = this.getRequiredAttributeImage();
} else {
image = this.getNotRequiredAttributeImage();
}
}
if ((attrDecl != null) && (attrDecl.getAttrType() != null)) {
// attribute is known, prompt with values from the declaration
proposedInfo = getAdditionalInfo(elementDecl, attrDecl);
List possibleValues = getPossibleDataTypeValues(node, attrDecl);
String defaultValue = attrDecl.getAttrType().getImpliedValue();
// $NON-NLS-1$
String qualifiedDelimiter = (String) attrDecl.getProperty("qualified-delimiter");
if (possibleValues.size() > 0 || defaultValue != null) {
// ENUMERATED VALUES
String matchString = contentAssistRequest.getMatchString();
if (matchString == null) {
// $NON-NLS-1$
matchString = "";
}
if ((matchString.length() > 0) && (matchString.startsWith("\"") || matchString.startsWith("'"))) {
// $NON-NLS-1$ //$NON-NLS-2$
matchString = matchString.substring(1);
}
boolean currentValid = false;
// create suggestions for enumerated values
int rOffset = contentAssistRequest.getReplacementBeginPosition();
int rLength = contentAssistRequest.getReplacementLength();
for (Iterator j = possibleValues.iterator(); j.hasNext(); ) {
String possibleValue = (String) j.next();
String alternateMatch = null;
if (qualifiedDelimiter != null) {
int delimiter = possibleValue.lastIndexOf(qualifiedDelimiter);
if (delimiter >= 0 && delimiter < possibleValue.length() - 1) {
alternateMatch = possibleValue.substring(delimiter + 1);
}
}
if (!possibleValue.equals(defaultValue)) {
currentValid = currentValid || possibleValue.equals(currentValue);
if ((matchString.length() == 0) || possibleValue.startsWith(matchString)) {
// $NON-NLS-1$ //$NON-NLS-2$
String rString = "\"" + possibleValue + "\"";
// $NON-NLS-1$
alternateMatch = "\"" + alternateMatch;
CustomCompletionProposal proposal = new MarkupCompletionProposal(rString, rOffset, rLength, possibleValue.length() + 1, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_ENUM), rString, alternateMatch, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE, true);
contentAssistRequest.addProposal(proposal);
}
}
}
if (defaultValue != null && ((matchString.length() == 0) || defaultValue.startsWith(matchString))) {
// $NON-NLS-1$ //$NON-NLS-2$
String rString = "\"" + defaultValue + "\"";
final String regionText = contentAssistRequest.getDocumentRegion().getText(contentAssistRequest.getRegion());
final int matchStringLength = contentAssistRequest.getMatchString().length();
if (matchString.length() > 0 && matchStringLength < regionText.length()) {
final String remaining = regionText.substring(matchStringLength).trim();
if (remaining.charAt(0) != '\'' && remaining.charAt(0) != '"') {
rLength = matchStringLength;
}
}
CustomCompletionProposal proposal = new MarkupCompletionProposal(rString, rOffset, rLength, defaultValue.length() + 1, XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DEFAULT), rString, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
contentAssistRequest.addProposal(proposal);
}
} else if (((attrDecl.getUsage() == CMAttributeDeclaration.FIXED) || (attrDecl.getAttrType().getImpliedValueKind() == CMDataType.IMPLIED_VALUE_FIXED)) && (attrDecl.getAttrType().getImpliedValue() != null)) {
// FIXED values
String value = attrDecl.getAttrType().getImpliedValue();
if ((value != null) && (value.length() > 0)) {
// $NON-NLS-2$//$NON-NLS-1$
String rValue = "\"" + value + "\"";
CustomCompletionProposal proposal = new MarkupCompletionProposal(rValue, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), rValue.length() + 1, image, rValue, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
contentAssistRequest.addProposal(proposal);
if ((currentValue.length() > 0) && !value.equals(currentValue)) {
// $NON-NLS-2$//$NON-NLS-1$
rValue = "\"" + currentValue + "\"";
proposal = new MarkupCompletionProposal(rValue, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), rValue.length() + 1, image, rValue, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
contentAssistRequest.addProposal(proposal);
}
}
}
} else {
// unknown attribute, so supply nice empty values
proposedInfo = getAdditionalInfo(null, elementDecl);
CustomCompletionProposal proposal = null;
if ((currentValue != null) && (currentValue.length() > 0)) {
final String regionText = open.getText(contentAssistRequest.getRegion());
if (regionText.charAt(0) != '"' && regionText.charAt(0) != '\'') {
// $NON-NLS-2$//$NON-NLS-1$
String rValue = "\"" + currentValue + "\"";
proposal = new MarkupCompletionProposal(rValue, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), 1, image, rValue, null, proposedInfo, XMLRelevanceConstants.R_XML_ATTRIBUTE_VALUE);
contentAssistRequest.addProposal(proposal);
}
}
}
} else {
setErrorMessage(XMLUIMessages.Content_Assist_not_availab_UI_);
}
}
use of org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration in project webtools.sourceediting by eclipse.
the class InsertRequiredAttrsQuickAssistProposal method apply.
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#apply(org.eclipse.jface.text.ITextViewer,
* char, int, int)
*/
public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {
IDOMNode node = (IDOMNode) ContentAssistUtils.getNodeAt(viewer, offset);
IStructuredDocumentRegion startStructuredDocumentRegion = node.getStartStructuredDocumentRegion();
int index = startStructuredDocumentRegion.getEndOffset();
ITextRegion lastRegion = startStructuredDocumentRegion.getLastRegion();
if (lastRegion.getType() == DOMRegionContext.XML_TAG_CLOSE) {
index--;
lastRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(index - 1);
} else if (lastRegion.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
index = index - 2;
lastRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(index - 1);
}
MultiTextEdit multiTextEdit = new MultiTextEdit();
try {
for (int i = 0; i < fRequiredAttrs.size(); i++) {
CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) fRequiredAttrs.get(i);
String requiredAttributeName = attrDecl.getAttrName();
String defaultValue = attrDecl.getDefaultValue();
if (defaultValue == null) {
// $NON-NLS-1$
defaultValue = "";
}
// $NON-NLS-1$
String nameAndDefaultValue = " ";
if ((i == 0) && (lastRegion.getLength() > lastRegion.getTextLength())) {
// $NON-NLS-1$
nameAndDefaultValue = "";
}
// $NON-NLS-1$//$NON-NLS-2$
nameAndDefaultValue += requiredAttributeName + "=\"" + defaultValue + "\"";
multiTextEdit.addChild(new InsertEdit(index, nameAndDefaultValue));
// BUG3381: MultiTextEdit applies all child TextEdit's basing
// on offsets
// in the document before the first TextEdit, not after each
// child TextEdit. Therefore, do not need to advance the
// index.
// index += nameAndDefaultValue.length();
}
multiTextEdit.apply(viewer.getDocument());
} catch (BadLocationException e) {
// log, for now, unless we find there's reasons why we get some
// here.
Logger.log(Logger.INFO, e.getMessage());
}
}
use of org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration in project webtools.sourceediting by eclipse.
the class QuickAssistProcessorXML method getInsertRequiredAttrs.
/**
* @param proposals
* @param viewer
* @param offset
*/
protected void getInsertRequiredAttrs(ArrayList proposals, StructuredTextViewer viewer, int offset) {
IDOMNode node = (IDOMNode) ContentAssistUtils.getNodeAt(viewer, offset);
if ((node != null) && (node.getNodeType() == Node.ELEMENT_NODE)) {
IStructuredDocumentRegion startStructuredDocumentRegion = node.getStartStructuredDocumentRegion();
if ((startStructuredDocumentRegion != null) && startStructuredDocumentRegion.containsOffset(offset)) {
IDOMNode cursorNode = (IDOMNode) ContentAssistUtils.getNodeAt(viewer, offset);
List requiredAttrs = getRequiredAttrs(cursorNode);
if (requiredAttrs.size() > 0) {
NamedNodeMap currentAttrs = node.getAttributes();
List insertAttrs = new ArrayList();
if (currentAttrs.getLength() == 0) {
insertAttrs.addAll(requiredAttrs);
} else {
for (int i = 0; i < requiredAttrs.size(); i++) {
String requiredAttrName = ((CMAttributeDeclaration) requiredAttrs.get(i)).getAttrName();
boolean found = false;
for (int j = 0; j < currentAttrs.getLength(); j++) {
String currentAttrName = currentAttrs.item(j).getNodeName();
if (requiredAttrName.compareToIgnoreCase(currentAttrName) == 0) {
found = true;
break;
}
}
if (!found) {
insertAttrs.add(requiredAttrs.get(i));
}
}
}
if (insertAttrs.size() > 0) {
proposals.add(new InsertRequiredAttrsQuickAssistProposal(insertAttrs));
}
}
}
}
}
Aggregations