Home | History | Annotate | Download | only in animator
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Eclipse Public License, Version 1.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.eclipse.org/org/documents/epl-v10.php
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.ide.eclipse.adt.internal.editors.animator;
     17 
     18 import static com.android.ide.common.layout.LayoutConstants.ANDROID_NS_NAME;
     19 
     20 import com.android.ide.common.resources.platform.DeclareStyleableInfo;
     21 import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
     22 import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
     23 import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
     24 import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
     25 import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
     26 import com.android.sdklib.SdkConstants;
     27 
     28 import java.util.ArrayList;
     29 import java.util.HashMap;
     30 import java.util.List;
     31 import java.util.Map;
     32 
     33 /**
     34  * Descriptors for /res/animator XML files.
     35  */
     36 public class AnimatorDescriptors implements IDescriptorProvider {
     37     /** The root element descriptor */
     38     private ElementDescriptor mDescriptor;
     39     /** The root element descriptors */
     40     private ElementDescriptor[] mRootDescriptors;
     41     private Map<String, ElementDescriptor> nameToDescriptor;
     42 
     43     /** @return the root descriptor. */
     44     @Override
     45     public ElementDescriptor getDescriptor() {
     46         if (mDescriptor == null) {
     47             mDescriptor = new ElementDescriptor("", getRootElementDescriptors()); //$NON-NLS-1$
     48         }
     49 
     50         return mDescriptor;
     51     }
     52 
     53     @Override
     54     public ElementDescriptor[] getRootElementDescriptors() {
     55         return mRootDescriptors;
     56     }
     57 
     58     public ElementDescriptor getElementDescriptor(String mRootTag) {
     59         if (nameToDescriptor == null) {
     60             nameToDescriptor = new HashMap<String, ElementDescriptor>();
     61             for (ElementDescriptor descriptor : getRootElementDescriptors()) {
     62                 nameToDescriptor.put(descriptor.getXmlName(), descriptor);
     63             }
     64         }
     65 
     66         ElementDescriptor descriptor = nameToDescriptor.get(mRootTag);
     67         if (descriptor == null) {
     68             descriptor = getDescriptor();
     69         }
     70         return descriptor;
     71     }
     72 
     73     public synchronized void updateDescriptors(Map<String, DeclareStyleableInfo> styleMap) {
     74         if (styleMap == null) {
     75             return;
     76         }
     77 
     78         XmlnsAttributeDescriptor xmlns = new XmlnsAttributeDescriptor(ANDROID_NS_NAME,
     79                 SdkConstants.NS_RESOURCES);
     80 
     81         List<ElementDescriptor> descriptors = new ArrayList<ElementDescriptor>();
     82 
     83         String sdkUrl =
     84             "http://developer.android.com/guide/topics/graphics/animation.html"; //$NON-NLS-1$
     85 
     86         ElementDescriptor set = addElement(descriptors, styleMap,
     87                 "set", "Animator Set", "AnimatorSet", null, //$NON-NLS-1$ //$NON-NLS-3$
     88                 null /* tooltip */, sdkUrl,
     89                 xmlns, null, true /*mandatory*/);
     90 
     91         ElementDescriptor objectAnimator = addElement(descriptors, styleMap,
     92                 "objectAnimator", "Object Animator", //$NON-NLS-1$
     93                 "PropertyAnimator", "Animator", //$NON-NLS-1$ //$NON-NLS-2$
     94                 null /* tooltip */, sdkUrl,
     95                 xmlns, null, true /*mandatory*/);
     96 
     97         ElementDescriptor animator = addElement(descriptors, styleMap,
     98                 "animator", "Animator", "Animator", null, //$NON-NLS-1$ //$NON-NLS-3$
     99                 null /* tooltip */, sdkUrl,
    100                 xmlns, null, true /*mandatory*/);
    101 
    102         mRootDescriptors = descriptors.toArray(new ElementDescriptor[descriptors.size()]);
    103 
    104         // Allow arbitrary nesting: the children of all of these element can include
    105         // any of the others
    106         if (objectAnimator != null) {
    107             objectAnimator.setChildren(mRootDescriptors);
    108         }
    109         if (animator != null) {
    110             animator.setChildren(mRootDescriptors);
    111         }
    112         if (set != null) {
    113             set.setChildren(mRootDescriptors);
    114         }
    115     }
    116 
    117     /**
    118      * Looks up the given style, and if found creates a new {@link ElementDescriptor}
    119      * corresponding to the style. It can optionally take an extra style to merge in
    120      * additional attributes from, and an extra attribute to add in as well. The new
    121      * element, if it exists, can also be optionally added into a list.
    122      *
    123      * @param descriptors an optional list to add the element into, or null
    124      * @param styleMap The map style => attributes from the attrs.xml file
    125      * @param xmlName the XML tag name to use for the element
    126      * @param uiName the UI name to display the element as
    127      * @param styleName the name of the style which must exist for this style
    128      * @param extraStyle an optional extra style to merge in attributes from, or null
    129      * @param tooltip the tooltip or documentation for this element, or null
    130      * @param sdkUrl an optional SDK url to display for the element, or null
    131      * @param extraAttribute an extra attribute to add to the attributes list, or null
    132      * @param childrenElements an array of children allowed by this element, or null
    133      * @param mandatory if true, this element is mandatory
    134      * @return a newly created element, or null if the style does not exist
    135      */
    136     public static ElementDescriptor addElement(
    137             List<ElementDescriptor> descriptors,
    138             Map<String, DeclareStyleableInfo> styleMap,
    139             String xmlName, String uiName, String styleName, String extraStyle,
    140             String tooltip, String sdkUrl,
    141             AttributeDescriptor extraAttribute,
    142             ElementDescriptor[] childrenElements,
    143             boolean mandatory) {
    144         DeclareStyleableInfo style = styleMap.get(styleName);
    145         if (style == null) {
    146             return null;
    147         }
    148         ElementDescriptor element = new ElementDescriptor(xmlName, uiName, tooltip, sdkUrl,
    149                 null, childrenElements, mandatory);
    150 
    151         ArrayList<AttributeDescriptor> descs = new ArrayList<AttributeDescriptor>();
    152 
    153         DescriptorsUtils.appendAttributes(descs,
    154                 null,   // elementName
    155                 SdkConstants.NS_RESOURCES,
    156                 style.getAttributes(),
    157                 null,   // requiredAttributes
    158                 null);  // overrides
    159         element.setTooltip(style.getJavaDoc());
    160 
    161         if (extraStyle != null) {
    162             style = styleMap.get(extraStyle);
    163             if (style != null) {
    164                 DescriptorsUtils.appendAttributes(descs,
    165                         null,   // elementName
    166                         SdkConstants.NS_RESOURCES,
    167                         style.getAttributes(),
    168                         null,   // requiredAttributes
    169                         null);  // overrides
    170             }
    171         }
    172 
    173         if (extraAttribute != null) {
    174             descs.add(extraAttribute);
    175         }
    176 
    177         element.setAttributes(descs.toArray(new AttributeDescriptor[descs.size()]));
    178         if (descriptors != null) {
    179             descriptors.add(element);
    180         }
    181 
    182         return element;
    183     }
    184 }
    185