use of com.intellij.pom.xml.XmlAspect in project intellij-community by JetBrains.
the class XmlTagImpl method deleteChildInternal.
@Override
public void deleteChildInternal(@NotNull final ASTNode child) {
final PomModel model = PomManager.getModel(getProject());
final XmlAspect aspect = model.getModelAspect(XmlAspect.class);
if (child.getElementType() == XmlElementType.XML_ATTRIBUTE) {
try {
model.runTransaction(new PomTransactionBase(this, aspect) {
@Override
public PomModelEvent runInner() {
final String name = ((XmlAttribute) child).getName();
XmlTagImpl.super.deleteChildInternal(child);
return XmlAttributeSetImpl.createXmlAttributeSet(model, XmlTagImpl.this, name, null);
}
});
} catch (IncorrectOperationException e) {
LOG.error(e);
}
} else {
final ASTNode treePrev = child.getTreePrev();
final ASTNode treeNext = child.getTreeNext();
super.deleteChildInternal(child);
if (treePrev != null && treeNext != null && treePrev.getElementType() == XmlElementType.XML_TEXT && treeNext.getElementType() == XmlElementType.XML_TEXT) {
final XmlText prevText = (XmlText) treePrev.getPsi();
final XmlText nextText = (XmlText) treeNext.getPsi();
final String newValue = prevText.getValue() + nextText.getValue();
// merging two XmlText-s should be done in one transaction to preserve smart pointers
ChangeUtil.prepareAndRunChangeAction(new ChangeUtil.ChangeAction() {
@Override
public void makeChange(TreeChangeEvent destinationTreeChange) {
PsiElement anchor = prevText.getPrevSibling();
prevText.delete();
nextText.delete();
XmlText text = (XmlText) addAfter(XmlElementFactory.getInstance(getProject()).createDisplayText("x"), anchor);
text.setValue(newValue);
}
}, this);
}
}
}
use of com.intellij.pom.xml.XmlAspect in project intellij-community by JetBrains.
the class XmlDocumentImpl method deleteChildInternal.
@Override
public void deleteChildInternal(@NotNull final ASTNode child) {
final PomModel model = PomManager.getModel(getProject());
final XmlAspect aspect = model.getModelAspect(XmlAspect.class);
try {
model.runTransaction(new PomTransactionBase(this, aspect) {
@Override
public PomModelEvent runInner() {
XmlDocumentImpl.super.deleteChildInternal(child);
return XmlDocumentChangedImpl.createXmlDocumentChanged(model, XmlDocumentImpl.this);
}
});
} catch (IncorrectOperationException ignored) {
}
}
use of com.intellij.pom.xml.XmlAspect in project intellij-community by JetBrains.
the class XmlTextImpl method doSetValue.
public void doSetValue(final String s, final XmlPsiPolicy policy) throws IncorrectOperationException {
final PomModel model = PomManager.getModel(getProject());
final XmlAspect aspect = model.getModelAspect(XmlAspect.class);
model.runTransaction(new PomTransactionBase(this, aspect) {
@Override
public PomModelEvent runInner() {
final String oldText = getText();
final ASTNode firstEncodedElement = policy.encodeXmlTextContents(s, XmlTextImpl.this);
if (firstEncodedElement == null) {
delete();
} else {
replaceAllChildrenToChildrenOf(firstEncodedElement.getTreeParent());
}
clearCaches();
return XmlTextChangedImpl.createXmlTextChanged(model, XmlTextImpl.this, oldText);
}
});
}
use of com.intellij.pom.xml.XmlAspect in project intellij-community by JetBrains.
the class XmlTextImpl method _splitText.
@Nullable
private XmlText _splitText(final int displayOffset) throws IncorrectOperationException {
final XmlTag xmlTag = (XmlTag) getParent();
if (displayOffset == 0)
return this;
final int length = getValue().length();
if (displayOffset >= length) {
return null;
}
final PomModel model = PomManager.getModel(xmlTag.getProject());
final XmlAspect aspect = model.getModelAspect(XmlAspect.class);
class MyTransaction extends PomTransactionBase {
private XmlTextImpl myRight;
MyTransaction() {
super(xmlTag, aspect);
}
@Override
@Nullable
public PomModelEvent runInner() throws IncorrectOperationException {
final String oldText = getValue();
final int physicalOffset = displayToPhysical(displayOffset);
PsiElement childElement = findElementAt(physicalOffset);
if (childElement != null && childElement.getNode().getElementType() == XmlTokenType.XML_DATA_CHARACTERS) {
FileElement holder = DummyHolderFactory.createHolder(getManager(), null).getTreeElement();
int splitOffset = physicalOffset - childElement.getStartOffsetInParent();
myRight = (XmlTextImpl) ASTFactory.composite(XmlElementType.XML_TEXT);
CodeEditUtil.setNodeGenerated(myRight, true);
holder.rawAddChildren(myRight);
PsiElement e = childElement;
while (e != null) {
CodeEditUtil.setNodeGenerated(e.getNode(), true);
e = e.getNextSibling();
}
String leftText = childElement.getText().substring(0, splitOffset);
String rightText = childElement.getText().substring(splitOffset);
LeafElement rightElement = ASTFactory.leaf(XmlTokenType.XML_DATA_CHARACTERS, holder.getCharTable().intern(rightText));
CodeEditUtil.setNodeGenerated(rightElement, true);
LeafElement leftElement = ASTFactory.leaf(XmlTokenType.XML_DATA_CHARACTERS, holder.getCharTable().intern(leftText));
CodeEditUtil.setNodeGenerated(leftElement, true);
rawInsertAfterMe(myRight);
myRight.rawAddChildren(rightElement);
if (childElement.getNextSibling() != null) {
myRight.rawAddChildren((TreeElement) childElement.getNextSibling());
}
((TreeElement) childElement).rawRemove();
XmlTextImpl.this.rawAddChildren(leftElement);
} else {
final PsiFile containingFile = xmlTag.getContainingFile();
final FileElement holder = DummyHolderFactory.createHolder(containingFile.getManager(), null, ((PsiFileImpl) containingFile).getTreeElement().getCharTable()).getTreeElement();
final XmlTextImpl rightText = (XmlTextImpl) ASTFactory.composite(XmlElementType.XML_TEXT);
CodeEditUtil.setNodeGenerated(rightText, true);
holder.rawAddChildren(rightText);
((ASTNode) xmlTag).addChild(rightText, getTreeNext());
final String value = getValue();
setValue(value.substring(0, displayOffset));
rightText.setValue(value.substring(displayOffset));
CodeEditUtil.setNodeGenerated(rightText, true);
myRight = rightText;
}
clearCaches();
myRight.clearCaches();
return createEvent(new XmlTextChangedImpl(XmlTextImpl.this, oldText), new XmlTagChildAddImpl(xmlTag, myRight));
}
public XmlText getResult() {
return myRight;
}
}
final MyTransaction transaction = new MyTransaction();
model.runTransaction(transaction);
return transaction.getResult();
}
use of com.intellij.pom.xml.XmlAspect in project intellij-community by JetBrains.
the class XmlTagImpl method setName.
@Override
public PsiElement setName(@NotNull final String name) throws IncorrectOperationException {
final PomModel model = PomManager.getModel(getProject());
final XmlAspect aspect = model.getModelAspect(XmlAspect.class);
model.runTransaction(new PomTransactionBase(this, aspect) {
@Override
public PomModelEvent runInner() throws IncorrectOperationException {
final String oldName = getName();
final XmlTagImpl dummyTag = (XmlTagImpl) XmlElementFactory.getInstance(getProject()).createTagFromText(XmlTagUtil.composeTagText(name, "aa"));
final XmlTagImpl tag = XmlTagImpl.this;
final CharTable charTableByTree = SharedImplUtil.findCharTableByTree(tag);
ASTNode child = XmlChildRole.START_TAG_NAME_FINDER.findChild(tag);
LOG.assertTrue(child != null, "It seems '" + name + "' is not a valid tag name");
TreeElement tagElement = (TreeElement) XmlChildRole.START_TAG_NAME_FINDER.findChild(dummyTag);
LOG.assertTrue(tagElement != null, "What's wrong with it? '" + name + "'");
tag.replaceChild(child, ChangeUtil.copyElement(tagElement, charTableByTree));
final ASTNode childByRole = XmlChildRole.CLOSING_TAG_NAME_FINDER.findChild(tag);
if (childByRole != null) {
final TreeElement treeElement = (TreeElement) XmlChildRole.CLOSING_TAG_NAME_FINDER.findChild(dummyTag);
if (treeElement != null) {
tag.replaceChild(childByRole, ChangeUtil.copyElement(treeElement, charTableByTree));
}
}
return XmlTagNameChangedImpl.createXmlTagNameChanged(model, tag, oldName);
}
});
return this;
}
Aggregations