use of org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration in project webtools.sourceediting by eclipse.
the class ElementNodeCleanupHandler method insertRequiredAttrs.
private IDOMNode insertRequiredAttrs(IDOMNode node) {
boolean insertRequiredAttrs = getCleanupPreferences().getInsertRequiredAttrs();
IDOMNode newNode = node;
if (insertRequiredAttrs) {
List requiredAttrs = getRequiredAttrs(newNode);
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) {
IStructuredDocumentRegion startStructuredDocumentRegion = newNode.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 = insertAttrs.size() - 1; i >= 0; i--) {
CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) insertAttrs.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(newNode.getStructuredDocument());
} catch (BadLocationException e) {
// log for now, unless we find reason not to
Logger.log(Logger.INFO, e.getMessage());
}
}
}
}
return newNode;
}
use of org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration in project webtools.sourceediting by eclipse.
the class DOMExtensionDetailsContentProvider method getItems.
public Object[] getItems(Object input) {
HashMap resultMap = new HashMap();
if (input instanceof Element) {
Element element = (Element) input;
// here we compute items for the attributes that physically in the document
//
NamedNodeMap attributes = element.getAttributes();
for (int i = 0; i < attributes.getLength(); i++) {
Attr attr = (Attr) attributes.item(i);
if (// $NON-NLS-1$ //$NON-NLS-2$
!XMLNS.equals(attr.getName()) && !XMLNS.equals(attr.getPrefix())) {
resultMap.put(attr.getName(), DOMExtensionItem.createItemForElementAttribute(element, attr));
}
}
// here we compute an item for the text node that is physically in the document
//
String textNodeValue = new TreeContentHelper().getNodeValue(element);
if (textNodeValue != null) {
resultMap.put(TEXT_NODE_KEY, DOMExtensionItem.createItemForElementText(element));
}
ModelQuery modelQuery = ModelQueryUtil.getModelQuery(element.getOwnerDocument());
if (modelQuery != null) {
CMElementDeclaration ed = modelQuery.getCMElementDeclaration(element);
if (ed != null) {
// here we compute items for the attributes that may be added to the document according to the grammar
//
List list = modelQuery.getAvailableContent(element, ed, ModelQuery.INCLUDE_ATTRIBUTES);
for (Iterator i = list.iterator(); i.hasNext(); ) {
CMAttributeDeclaration ad = (CMAttributeDeclaration) i.next();
if (ad != null && resultMap.get(ad.getNodeName()) == null) {
resultMap.put(ad.getNodeName(), DOMExtensionItem.createItemForElementAttribute(element, ad));
}
}
if (resultMap.get(TEXT_NODE_KEY) == null) {
// here we compute an item for the text node that may be added to the document according to the grammar
//
int contentType = ed.getContentType();
if (contentType == CMElementDeclaration.PCDATA || contentType == CMElementDeclaration.MIXED) {
resultMap.put(TEXT_NODE_KEY, DOMExtensionItem.createItemForElementText(element));
}
}
}
}
Collection collection = resultMap.values();
//
for (Iterator i = collection.iterator(); i.hasNext(); ) {
initPropertyEditorConfiguration((DOMExtensionItem) i.next());
}
DOMExtensionItem[] items = new DOMExtensionItem[collection.size()];
resultMap.values().toArray(items);
//
if (items.length > 0) {
Comparator comparator = new Comparator() {
public int compare(Object arg0, Object arg1) {
DOMExtensionItem a = (DOMExtensionItem) arg0;
DOMExtensionItem b = (DOMExtensionItem) arg1;
// begin special case to ensure 'text nodes' come last
if (a.isTextValue() && !b.isTextValue()) {
return 1;
} else if (b.isTextValue() && !a.isTextValue()) {
return -1;
} else // end special case
{
return Collator.getInstance().compare(a.getName(), b.getName());
}
}
};
Arrays.sort(items, comparator);
}
return items;
} else if (input instanceof Attr) {
Attr attr = (Attr) input;
DOMExtensionItem item = DOMExtensionItem.createItemForAttributeText(attr.getOwnerElement(), attr);
DOMExtensionItem[] items = { item };
return items;
}
return EMPTY_ARRAY;
}
Aggregations