blob: c1c811b55c537780d7f046d3c9872bc581a236e0 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.ide.structureView.impl.xml;
import com.intellij.ide.structureView.StructureViewTreeElement;
import com.intellij.ide.structureView.impl.common.PsiTreeElementBase;
import com.intellij.openapi.util.Comparing;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiNamedElement;
import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.xml.*;
import com.intellij.util.PlatformIcons;
import com.intellij.xml.impl.dtd.XmlElementDescriptorImpl;
import com.intellij.xml.util.XmlUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.*;
public class DtdFileTreeElement extends PsiTreeElementBase<XmlFile> {
public DtdFileTreeElement(XmlFile file) {
super(file);
}
@Override
@NotNull
public Collection<StructureViewTreeElement> getChildrenBase() {
return collectElements(getElement().getDocument());
}
static List<StructureViewTreeElement> collectElements(final XmlElement element) {
final List<StructureViewTreeElement> elements = new ArrayList<StructureViewTreeElement>();
XmlUtil.processXmlElements(element, new PsiElementProcessor() {
@Override
public boolean execute(@NotNull final PsiElement element) {
if (element instanceof XmlElementDecl ||
element instanceof XmlEntityDecl) {
elements.add(new DtdTreeElement((PsiNamedElement)element));
}
return true;
}
}, false);
return elements;
}
@Override
public String getPresentableText() {
return getElement().getName();
}
private static class DtdTreeElement extends PsiTreeElementBase<PsiNamedElement> {
@NonNls private static final String IMPLIED = "implied";
@NonNls private static final String REQUIRED = "required";
@NonNls private static final String FIXED = "fixed";
@NonNls private static final String ID = "id";
@NonNls private static final String IDREF = "idref";
@NonNls private static final String ENUM = "enum";
public DtdTreeElement(final PsiNamedElement element) {
super(element);
}
@Override
@NotNull
public Collection<StructureViewTreeElement> getChildrenBase() {
return Collections.emptyList();
}
@Override
public String getPresentableText() {
final PsiNamedElement namedElement = getElement();
return namedElement != null ? namedElement.getName():"";
}
@Override
public Icon getIcon(final boolean open) {
return PlatformIcons.XML_TAG_ICON;
}
@Override
public String getLocationString() {
final XmlElement owner = (XmlElement)getElement();
final XmlAttlistDecl[] attLists= owner instanceof XmlElementDecl ? XmlElementDescriptorImpl.getCachedAttributeDeclarations(owner): XmlAttlistDecl.EMPTY_ARRAY;
if (attLists.length > 0) {
Map<String,XmlAttributeDecl> attrMap = null;
final String name = getElement().getName();
for(XmlAttlistDecl a:attLists) {
final String aname = a.getName();
if (!Comparing.equal(aname, name)) continue;
if (attrMap == null) attrMap = new LinkedHashMap<String, XmlAttributeDecl>();
for(XmlAttributeDecl d : a.getAttributeDecls()) {
attrMap.put(d.getName(), d);
}
}
StringBuilder b = null;
if (attrMap != null) {
for(Map.Entry<String,XmlAttributeDecl> e:attrMap.entrySet()) {
if (b == null) b = new StringBuilder();
else b.append(", ");
b.append(e.getKey());
final XmlAttributeDecl attributeDecl = e.getValue();
String type = null;
if (attributeDecl.isIdAttribute()) {
type = ID;
} else if (attributeDecl.isIdRefAttribute()) {
type = IDREF;
} else if (attributeDecl.isEnumerated()) {
type = ENUM;
}
if (attributeDecl.isAttributeFixed()) {
if (type == null) type = FIXED;
else type += " " + FIXED;
} else if (attributeDecl.isAttributeRequired()) {
if (type == null) type = REQUIRED;
else type += " " + REQUIRED;
} else if (attributeDecl.isAttributeImplied()) {
if (type == null) type = IMPLIED;
else type += " " + IMPLIED;
}
if (type != null) b.append(':').append(type);
final XmlAttributeValue value = attributeDecl.getDefaultValue();
if (value != null) b.append("=").append(value);
}
}
if (b != null) return b.toString();
}
return super.getLocationString();
}
public String toString() {
final String s = getLocationString();
final String name = getElement().getName();
if (s == null || s.length() == 0) return name;
return name + " (" + s + ")";
}
}
}