package org.jetbrains.android.refactoring; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlTag; import com.intellij.util.containers.HashMap; import org.jetbrains.android.dom.converters.AndroidResourceReferenceBase; import org.jetbrains.android.dom.resources.ResourceValue; import org.jetbrains.android.dom.resources.Style; import org.jetbrains.android.dom.resources.StyleItem; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Map; /** * @author Eugene.Kudelevsky */ class ParentStyleUsageData implements StyleUsageData { private final AndroidResourceReferenceBase myReference; private final Style myStyle; public ParentStyleUsageData(@NotNull Style style, @NotNull AndroidResourceReferenceBase reference) { myReference = reference; myStyle = style; } @Override public PsiFile getFile() { final XmlTag tag = myStyle.getXmlTag(); return tag != null ? tag.getContainingFile() : null; } @Override public void inline(@NotNull Map<AndroidAttributeInfo, String> attributeValues, @Nullable StyleRefData parentStyleRef) { final Map<String, String> id2Value = toId2ValueMap(attributeValues); for (StyleItem item : myStyle.getItems()) { final String name = item.getName().getStringValue(); if (name != null) { id2Value.remove(name); } } for (Map.Entry<String, String> entry : id2Value.entrySet()) { final StyleItem newItem = myStyle.addItem(); newItem.getName().setStringValue(entry.getKey()); newItem.setStringValue(entry.getValue()); } final String styleName = myStyle.getName().getStringValue(); final boolean implicitInheritance = parentStyleRef != null && parentStyleRef.getStylePackage() == null && styleName != null && (styleName.startsWith(parentStyleRef.getStyleName() + ".") || styleName.equals(parentStyleRef.getStyleName())); myStyle.getParentStyle().setValue(parentStyleRef != null && !implicitInheritance ? ResourceValue.referenceTo((char)0, parentStyleRef.getStylePackage(), null, parentStyleRef.getStyleName()) : null); } private static Map<String, String> toId2ValueMap(Map<AndroidAttributeInfo, String> info2ValueMap) { final Map<String, String> result = new HashMap<String, String>(info2ValueMap.size()); for (Map.Entry<AndroidAttributeInfo, String> entry : info2ValueMap.entrySet()) { result.put(entry.getKey().getAttributeId(), entry.getValue()); } return result; } @NotNull @Override public AndroidResourceReferenceBase getReference() { return myReference; } }