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