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 com.android.SdkConstants;
19 import com.android.ide.common.resources.platform.DeclareStyleableInfo;
20 import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
21 import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
22 import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
23 
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
27 import java.util.Map;
28 
29 /** Descriptors for the res/anim resources */
30 public class AnimDescriptors implements IDescriptorProvider {
31     /** The root element descriptor */
32     private ElementDescriptor mDescriptor;
33     /** The root element descriptors */
34     private ElementDescriptor[] mRootDescriptors;
35     private Map<String, ElementDescriptor> nameToDescriptor;
36 
37     /** @return the root descriptor. */
38     @Override
getDescriptor()39     public ElementDescriptor getDescriptor() {
40         if (mDescriptor == null) {
41             mDescriptor = new ElementDescriptor("", getRootElementDescriptors()); //$NON-NLS-1$
42         }
43 
44         return mDescriptor;
45     }
46 
47     @Override
getRootElementDescriptors()48     public ElementDescriptor[] getRootElementDescriptors() {
49         return mRootDescriptors;
50     }
51 
getElementDescriptor(String mRootTag)52     public ElementDescriptor getElementDescriptor(String mRootTag) {
53         if (nameToDescriptor == null) {
54             nameToDescriptor = new HashMap<String, ElementDescriptor>();
55             for (ElementDescriptor descriptor : getRootElementDescriptors()) {
56                 nameToDescriptor.put(descriptor.getXmlName(), descriptor);
57             }
58         }
59 
60         ElementDescriptor descriptor = nameToDescriptor.get(mRootTag);
61         if (descriptor == null) {
62             descriptor = getDescriptor();
63         }
64         return descriptor;
65     }
66 
updateDescriptors(Map<String, DeclareStyleableInfo> styleMap)67     public synchronized void updateDescriptors(Map<String, DeclareStyleableInfo> styleMap) {
68         if (styleMap == null) {
69             return;
70         }
71 
72         XmlnsAttributeDescriptor xmlns = new XmlnsAttributeDescriptor(SdkConstants.ANDROID_NS_NAME,
73                 SdkConstants.ANDROID_URI);
74 
75         List<ElementDescriptor> descriptors = new ArrayList<ElementDescriptor>();
76 
77         String sdkUrl =
78             "http://developer.android.com/guide/topics/graphics/view-animation.html"; //$NON-NLS-1$
79         ElementDescriptor set = AnimatorDescriptors.addElement(descriptors, styleMap,
80                 "set", "Set", "AnimationSet", "Animation", //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-4$
81                 "A container that holds other animation elements (<alpha>, <scale>, "
82                     + "<translate>, <rotate>) or other <set> elements. ",
83                 sdkUrl,
84                 xmlns, null, true /*mandatory*/);
85 
86         AnimatorDescriptors.addElement(descriptors, styleMap,
87                 "alpha", "Alpha", "AlphaAnimation", "Animation", //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-4$
88                 "A fade-in or fade-out animation.",
89                 sdkUrl,
90                 xmlns, null, true /*mandatory*/);
91 
92         AnimatorDescriptors.addElement(descriptors, styleMap,
93                 "scale", "Scale", "ScaleAnimation", "Animation", //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-4$
94                 "A resizing animation. You can specify the center point of the image from "
95                     + "which it grows outward (or inward) by specifying pivotX and pivotY. "
96                     + "For example, if these values are 0, 0 (top-left corner), all growth "
97                     + "will be down and to the right.",
98                 sdkUrl,
99                 xmlns, null, true /*mandatory*/);
100 
101         AnimatorDescriptors.addElement(descriptors, styleMap,
102                 "rotate", "Rotate", "RotateAnimation", "Animation", //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-4$
103                 "A rotation animation.",
104                 sdkUrl,
105                 xmlns, null, true /*mandatory*/);
106 
107         AnimatorDescriptors.addElement(descriptors, styleMap,
108                 "translate", "Translate", "TranslateAnimation", "Animation", //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-4$
109                 "A vertical and/or horizontal motion. Supports the following attributes in "
110                     + "any of the following three formats: values from -100 to 100 ending "
111                     + "with \"%\", indicating a percentage relative to itself; values from "
112                     + "-100 to 100 ending in \"%p\", indicating a percentage relative to its "
113                     + "parent; a float value with no suffix, indicating an absolute value.",
114                 sdkUrl,
115                 xmlns, null, true /*mandatory*/);
116 
117         mRootDescriptors = descriptors.toArray(new ElementDescriptor[descriptors.size()]);
118 
119         // Allow <set> to nest the others (and other sets)
120         if (set != null) {
121             set.setChildren(mRootDescriptors);
122         }
123     }
124 }
125