/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.ide.common.resources; import com.android.ide.common.rendering.api.DensityBasedResourceValue; import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.resources.configuration.PixelDensityQualifier; import com.android.io.IAbstractFile; import com.android.resources.FolderTypeRelationship; import com.android.resources.ResourceType; import java.util.Collection; import java.util.List; import javax.xml.parsers.SAXParserFactory; /** * Represents a resource file describing a single resource. *

* This is typically an XML file inside res/anim, res/layout, or res/menu or an image file * under res/drawable. */ public class SingleResourceFile extends ResourceFile { private final static SAXParserFactory sParserFactory = SAXParserFactory.newInstance(); static { sParserFactory.setNamespaceAware(true); } private String mResourceName; private ResourceType mType; private ResourceValue mValue; public SingleResourceFile(IAbstractFile file, ResourceFolder folder) { super(file, folder); // we need to infer the type of the resource from the folder type. // This is easy since this is a single Resource file. List types = FolderTypeRelationship.getRelatedResourceTypes(folder.getType()); mType = types.get(0); // compute the resource name mResourceName = getResourceName(mType); // test if there's a density qualifier associated with the resource PixelDensityQualifier qualifier = folder.getConfiguration().getPixelDensityQualifier(); if (qualifier == null) { mValue = new ResourceValue(mType, getResourceName(mType), file.getOsLocation(), isFramework()); } else { mValue = new DensityBasedResourceValue( mType, getResourceName(mType), file.getOsLocation(), qualifier.getValue(), isFramework()); } } @Override protected void load() { // get a resource item matching the given type and name ResourceItem item = getRepository().getResourceItem(mType, mResourceName); // add this file to the list of files generating this resource item. item.add(this); } @Override protected void update() { // when this happens, nothing needs to be done since the file only generates // a single resources that doesn't actually change (its content is the file path) } @Override protected void dispose() { // only remove this file from the existing ResourceItem. getFolder().getRepository().removeFile(mType, this); // don't need to touch the content, it'll get reclaimed as this objects disappear. // In the mean time other objects may need to access it. } @Override public Collection getResourceTypes() { return FolderTypeRelationship.getRelatedResourceTypes(getFolder().getType()); } @Override public boolean hasResources(ResourceType type) { return FolderTypeRelationship.match(type, getFolder().getType()); } /* * (non-Javadoc) * @see com.android.ide.eclipse.editors.resources.manager.ResourceFile#getValue(com.android.ide.eclipse.common.resources.ResourceType, java.lang.String) * * This particular implementation does not care about the type or name since a * SingleResourceFile represents a file generating only one resource. * The value returned is the full absolute path of the file in OS form. */ @Override public ResourceValue getValue(ResourceType type, String name) { return mValue; } /** * Returns the name of the resources. */ private String getResourceName(ResourceType type) { // get the name from the filename. String name = getFile().getName(); int pos = name.indexOf('.'); if (pos != -1) { name = name.substring(0, pos); } return name; } }