/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
*
* 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.eclipse.editors.resources.manager;
import com.android.ide.eclipse.common.resources.ResourceItem;
import com.android.ide.eclipse.common.resources.ResourceType;
import com.android.ide.eclipse.editors.resources.configurations.FolderConfiguration;
import com.android.ide.eclipse.editors.resources.manager.files.IAbstractFile;
import com.android.ide.eclipse.editors.resources.manager.files.IAbstractFolder;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import java.util.ArrayList;
import java.util.Collection;
/**
* Resource Folder class. Contains list of {@link ResourceFile}s,
* the {@link FolderConfiguration}, and a link to the workspace {@link IFolder} object.
*/
public final class ResourceFolder extends Resource {
ResourceFolderType mType;
FolderConfiguration mConfiguration;
IAbstractFolder mFolder;
ArrayList<ResourceFile> mFiles = null;
private final boolean mIsFramework;
/**
* Creates a new {@link ResourceFolder}
* @param type The type of the folder
* @param config The configuration of the folder
* @param folder The associated {@link IAbstractFolder} object.
* @param isFrameworkRepository
*/
public ResourceFolder(ResourceFolderType type, FolderConfiguration config,
IAbstractFolder folder, boolean isFrameworkRepository) {
mType = type;
mConfiguration = config;
mFolder = folder;
mIsFramework = isFrameworkRepository;
}
/**
* Adds a {@link ResourceFile} to the folder.
* @param file The {@link ResourceFile}.
*/
public void addFile(ResourceFile file) {
if (mFiles == null) {
mFiles = new ArrayList<ResourceFile>();
}
mFiles.add(file);
}
/**
* Attempts to remove the {@link ResourceFile} associated with a specified {@link IFile}.
* @param file the IFile object.
*/
public void removeFile(IFile file) {
if (mFiles != null) {
int count = mFiles.size();
for (int i = 0 ; i < count ; i++) {
ResourceFile resFile = mFiles.get(i);
if (resFile != null) {
IFile iFile = resFile.getFile().getIFile();
if (iFile != null && iFile.equals(file)) {
mFiles.remove(i);
touch();
}
}
}
}
}
/**
* Returns the {@link IFolder} associated with this object.
*/
public IAbstractFolder getFolder() {
return mFolder;
}
/**
* Returns the {@link ResourceFolderType} of this object.
*/
public ResourceFolderType getType() {
return mType;
}
/**
* Returns whether the folder is a framework resource folder.
*/
public boolean isFramework() {
return mIsFramework;
}
/**
* Returns the list of {@link ResourceType}s generated by the files inside this folder.
*/
public Collection<ResourceType> getResourceTypes() {
ArrayList<ResourceType> list = new ArrayList<ResourceType>();
if (mFiles != null) {
for (ResourceFile file : mFiles) {
ResourceType[] types = file.getResourceTypes();
// loop through those and add them to the main list,
// if they are not already present
if (types != null) {
for (ResourceType resType : types) {
if (list.indexOf(resType) == -1) {
list.add(resType);
}
}
}
}
}
return list;
}
/*
* (non-Javadoc)
* @see com.android.ide.eclipse.editors.resources.manager.Resource#getConfiguration()
*/
@Override
public FolderConfiguration getConfiguration() {
return mConfiguration;
}
/**
* Returns whether the folder contains a file with the given name.
* @param name the name of the file.
*/
public boolean hasFile(String name) {
return mFolder.hasFile(name);
}
/**
* Returns the {@link ResourceFile} matching a {@link IAbstractFile} object.
* @param file The {@link IFile} object.
* @return the {@link ResourceFile} or null if no match was found.
*/
public ResourceFile getFile(IAbstractFile file) {
if (mFiles != null) {
for (ResourceFile f : mFiles) {
if (f.getFile().equals(file)) {
return f;
}
}
}
return null;
}
/**
* Returns the {@link ResourceFile} matching a {@link IFile} object.
* @param file The {@link IFile} object.
* @return the {@link ResourceFile} or null if no match was found.
*/
public ResourceFile getFile(IFile file) {
if (mFiles != null) {
for (ResourceFile f : mFiles) {
IFile iFile = f.getFile().getIFile();
if (iFile != null && iFile.equals(file)) {
return f;
}
}
}
return null;
}
/**
* Returns the {@link ResourceFile} matching a given name.
* @param filename The name of the file to return.
* @return the {@link ResourceFile} or <code>null</code> if no match was found.
*/
public ResourceFile getFile(String filename) {
if (mFiles != null) {
for (ResourceFile f : mFiles) {
if (f.getFile().getName().equals(filename)) {
return f;
}
}
}
return null;
}
/**
* Returns whether a file in the folder is generating a resource of a specified type.
* @param type The {@link ResourceType} being looked up.
*/
public boolean hasResources(ResourceType type) {
// Check if the folder type is able to generate resource of the type that was asked.
// this is a first check to avoid going through the files.
ResourceFolderType[] folderTypes = FolderTypeRelationship.getRelatedFolders(type);
boolean valid = false;
for (ResourceFolderType rft : folderTypes) {
if (rft == mType) {
valid = true;
break;
}
}
if (valid) {
if (mFiles != null) {
for (ResourceFile f : mFiles) {
if (f.hasResources(type)) {
return true;
}
}
}
}
return false;
}
/**
* Get the list of {@link ResourceItem} of a specific type generated by all the files
* in the folder.
* This method must make sure not to create duplicates.
* @param type The type of {@link ResourceItem} to return.
* @param projectResources The global Project Resource object, allowing the implementation to
* query for already existing {@link ResourceItem}
* @return The list of <b>new</b> {@link ResourceItem}
* @see ProjectResources#findResourceItem(ResourceType, String)
*/
public Collection<ProjectResourceItem> getResources(ResourceType type,
ProjectResources projectResources) {
Collection<ProjectResourceItem> list = new ArrayList<ProjectResourceItem>();
if (mFiles != null) {
for (ResourceFile f : mFiles) {
list.addAll(f.getResources(type, projectResources));
}
}
return list;
}
}