2 * Copyright (c) 2000-2005 by JetBrains s.r.o. All Rights Reserved.
3 * Use is subject to license terms.
5 package com
.intellij
.util
.xml
.impl
;
7 import com
.intellij
.psi
.xml
.XmlTag
;
8 import com
.intellij
.util
.xml
.EvaluatedXmlName
;
10 import java
.lang
.reflect
.Type
;
16 class AddToCompositeCollectionInvocation
implements Invocation
{
17 private final CollectionChildDescriptionImpl myMainDescription
;
18 private final Set
<CollectionChildDescriptionImpl
> myQnames
;
19 private final Type myType
;
21 public AddToCompositeCollectionInvocation(final CollectionChildDescriptionImpl tagName
, final Set
<CollectionChildDescriptionImpl
> qnames
, final Type type
) {
22 myMainDescription
= tagName
;
27 public Object
invoke(final DomInvocationHandler
<?
> handler
, final Object
[] args
) throws Throwable
{
28 for (final CollectionChildDescriptionImpl qname
: myQnames
) {
29 handler
.getCollectionChildren(qname
, qname
.getTagsGetter());
32 final XmlTag tag
= handler
.ensureTagExists();
33 int index
= args
!= null && args
.length
== 1 ?
(Integer
)args
[0] : Integer
.MAX_VALUE
;
35 XmlTag lastTag
= null;
37 final XmlTag
[] tags
= tag
.getSubTags();
38 for (final XmlTag subTag
: tags
) {
39 if (i
== index
) break;
40 if (DomImplUtil
.containsTagName(myQnames
, subTag
, handler
)) {
41 final DomInvocationHandler element
= handler
.getManager().getCachedHandler(subTag
);
42 if (element
instanceof CollectionElementInvocationHandler
) {
48 final DomManagerImpl manager
= handler
.getManager();
49 final boolean b
= manager
.setChanging(true);
51 final EvaluatedXmlName evaluatedXmlName
= handler
.createEvaluatedXmlName(myMainDescription
.getXmlName());
52 final XmlTag emptyTag
= handler
.createChildTag(evaluatedXmlName
);
54 if (lastTag
== null) {
55 if (tags
.length
== 0) {
56 newTag
= (XmlTag
)tag
.add(emptyTag
);
59 newTag
= (XmlTag
)tag
.addBefore(emptyTag
, tags
[0]);
63 newTag
= (XmlTag
)tag
.addAfter(emptyTag
, lastTag
);
66 return new CollectionElementInvocationHandler(myType
, newTag
, myMainDescription
, handler
).getProxy();
69 manager
.setChanging(b
);