• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 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 
17 package com.android.ide.eclipse.adt.internal.resources.manager;
18 
19 import com.android.ide.eclipse.adt.internal.resources.ResourceType;
20 
21 import java.util.ArrayList;
22 import java.util.HashMap;
23 import java.util.List;
24 import java.util.Set;
25 
26 /**
27  * This class gives access to the bi directional relationship between {@link ResourceType} and
28  * {@link ResourceFolderType}.
29  */
30 public final class FolderTypeRelationship {
31 
32     private final static HashMap<ResourceType, ResourceFolderType[]> mTypeToFolderMap =
33         new HashMap<ResourceType, ResourceFolderType[]>();
34 
35     private final static HashMap<ResourceFolderType, ResourceType[]> mFolderToTypeMap =
36         new HashMap<ResourceFolderType, ResourceType[]>();
37 
38     // generate the relationships.
39     static {
40         HashMap<ResourceType, List<ResourceFolderType>> typeToFolderMap =
41             new HashMap<ResourceType, List<ResourceFolderType>>();
42 
43         HashMap<ResourceFolderType, List<ResourceType>> folderToTypeMap =
44             new HashMap<ResourceFolderType, List<ResourceType>>();
45 
add(ResourceType.ANIM, ResourceFolderType.ANIM, typeToFolderMap, folderToTypeMap)46         add(ResourceType.ANIM, ResourceFolderType.ANIM, typeToFolderMap, folderToTypeMap);
add(ResourceType.ARRAY, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap)47         add(ResourceType.ARRAY, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap);
add(ResourceType.COLOR, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap)48         add(ResourceType.COLOR, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap);
add(ResourceType.COLOR, ResourceFolderType.COLOR, typeToFolderMap, folderToTypeMap)49         add(ResourceType.COLOR, ResourceFolderType.COLOR, typeToFolderMap, folderToTypeMap);
add(ResourceType.DIMEN, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap)50         add(ResourceType.DIMEN, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap);
add(ResourceType.DRAWABLE, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap)51         add(ResourceType.DRAWABLE, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap);
add(ResourceType.DRAWABLE, ResourceFolderType.DRAWABLE, typeToFolderMap, folderToTypeMap)52         add(ResourceType.DRAWABLE, ResourceFolderType.DRAWABLE, typeToFolderMap, folderToTypeMap);
add(ResourceType.ID, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap)53         add(ResourceType.ID, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap);
add(ResourceType.LAYOUT, ResourceFolderType.LAYOUT, typeToFolderMap, folderToTypeMap)54         add(ResourceType.LAYOUT, ResourceFolderType.LAYOUT, typeToFolderMap, folderToTypeMap);
add(ResourceType.MENU, ResourceFolderType.MENU, typeToFolderMap, folderToTypeMap)55         add(ResourceType.MENU, ResourceFolderType.MENU, typeToFolderMap, folderToTypeMap);
add(ResourceType.RAW, ResourceFolderType.RAW, typeToFolderMap, folderToTypeMap)56         add(ResourceType.RAW, ResourceFolderType.RAW, typeToFolderMap, folderToTypeMap);
add(ResourceType.STRING, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap)57         add(ResourceType.STRING, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap);
add(ResourceType.STYLE, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap)58         add(ResourceType.STYLE, ResourceFolderType.VALUES, typeToFolderMap, folderToTypeMap);
add(ResourceType.XML, ResourceFolderType.XML, typeToFolderMap, folderToTypeMap)59         add(ResourceType.XML, ResourceFolderType.XML, typeToFolderMap, folderToTypeMap);
60 
optimize(typeToFolderMap, folderToTypeMap)61         optimize(typeToFolderMap, folderToTypeMap);
62     }
63 
64     /**
65      * Returns a list of {@link ResourceType}s that can be generated from files inside a folder
66      * of the specified type.
67      * @param folderType The folder type.
68      * @return an array of {@link ResourceType}
69      */
getRelatedResourceTypes(ResourceFolderType folderType)70     public static ResourceType[] getRelatedResourceTypes(ResourceFolderType folderType) {
71         ResourceType[] array = mFolderToTypeMap.get(folderType);
72         if (array != null) {
73             return array;
74         }
75         return new ResourceType[0];
76     }
77 
78     /**
79      * Returns a list of {@link ResourceFolderType} that can contain files generating resources
80      * of the specified type.
81      * @param resType the type of resource.
82      * @return an array of {@link ResourceFolderType}
83      */
getRelatedFolders(ResourceType resType)84     public static ResourceFolderType[] getRelatedFolders(ResourceType resType) {
85         ResourceFolderType[] array = mTypeToFolderMap.get(resType);
86         if (array != null) {
87             return array;
88         }
89         return new ResourceFolderType[0];
90     }
91 
92     /**
93      * Returns true if the {@link ResourceType} and the {@link ResourceFolderType} values match.
94      * @param resType the resource type.
95      * @param folderType the folder type.
96      * @return true if files inside the folder of the specified {@link ResourceFolderType}
97      * could generate a resource of the specified {@link ResourceType}
98      */
match(ResourceType resType, ResourceFolderType folderType)99     public static boolean match(ResourceType resType, ResourceFolderType folderType) {
100         ResourceFolderType[] array = mTypeToFolderMap.get(resType);
101 
102         if (array != null && array.length > 0) {
103             for (ResourceFolderType fType : array) {
104                 if (fType == folderType) {
105                     return true;
106                 }
107             }
108         }
109 
110         return false;
111     }
112 
113     /**
114      * Adds a {@link ResourceType} - {@link ResourceFolderType} relationship. this indicates that
115      * a file in the folder can generate a resource of the specified type.
116      * @param type The resourceType
117      * @param folder The {@link ResourceFolderType}
118      * @param folderToTypeMap
119      * @param typeToFolderMap
120      */
add(ResourceType type, ResourceFolderType folder, HashMap<ResourceType, List<ResourceFolderType>> typeToFolderMap, HashMap<ResourceFolderType, List<ResourceType>> folderToTypeMap)121     private static void add(ResourceType type, ResourceFolderType folder,
122             HashMap<ResourceType, List<ResourceFolderType>> typeToFolderMap,
123             HashMap<ResourceFolderType, List<ResourceType>> folderToTypeMap) {
124         // first we add the folder to the list associated with the type.
125         List<ResourceFolderType> folderList = typeToFolderMap.get(type);
126         if (folderList == null) {
127             folderList = new ArrayList<ResourceFolderType>();
128             typeToFolderMap.put(type, folderList);
129         }
130         if (folderList.indexOf(folder) == -1) {
131             folderList.add(folder);
132         }
133 
134         // now we add the type to the list associated with the folder.
135         List<ResourceType> typeList = folderToTypeMap.get(folder);
136         if (typeList == null) {
137             typeList = new ArrayList<ResourceType>();
138             folderToTypeMap.put(folder, typeList);
139         }
140         if (typeList.indexOf(type) == -1) {
141             typeList.add(type);
142         }
143     }
144 
145     /**
146      * Optimize the map to contains array instead of lists (since the api returns arrays)
147      * @param typeToFolderMap
148      * @param folderToTypeMap
149      */
optimize(HashMap<ResourceType, List<ResourceFolderType>> typeToFolderMap, HashMap<ResourceFolderType, List<ResourceType>> folderToTypeMap)150     private static void optimize(HashMap<ResourceType, List<ResourceFolderType>> typeToFolderMap,
151             HashMap<ResourceFolderType, List<ResourceType>> folderToTypeMap) {
152         Set<ResourceType> types = typeToFolderMap.keySet();
153         for (ResourceType type : types) {
154             List<ResourceFolderType> list = typeToFolderMap.get(type);
155             mTypeToFolderMap.put(type, list.toArray(new ResourceFolderType[list.size()]));
156         }
157 
158         Set<ResourceFolderType> folders = folderToTypeMap.keySet();
159         for (ResourceFolderType folder : folders) {
160             List<ResourceType> list = folderToTypeMap.get(folder);
161             mFolderToTypeMap.put(folder, list.toArray(new ResourceType[list.size()]));
162         }
163     }
164 }
165