package okj.easy.core;
import org.ege.utils.ArrayDeque;
import com.badlogic.gdx.assets.AssetLoaderParameters;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.ObjectMap.Entry;
/**
*
* @FileName: Context.java
* @CreateOn: Sep 15, 2012 - 11:06:15 AM
* @Author: TrungNT
*/
public class Context implements ResourceContext
{
public final String name;
final ObjectMap<String, Data> mDataMap = new ObjectMap<String, Data>();
final ArrayDeque<String> mUnloadedData = new ArrayDeque<String>();
/**
* When this mode is enable , the load function just push to references not
* load the data until you calll reload
*/
boolean isReferencesMode = false;
public Context(String name) {
this.name = name;
eAdmin.econtext.addContext(this);
}
/**
* When this mode enable , the references of data will only be store not
* load
*/
public Context(String name, boolean isRefStore) {
this(name);
this.isReferencesMode = isRefStore;
}
public void setRefStoreMode (boolean isRefStore)
{
this.isReferencesMode = isRefStore;
if (isRefStore)
unload();
else
reload();
}
public boolean isRefStoreMode ()
{
return isReferencesMode;
}
/*************************************************************
* Data manage method
*************************************************************/
/**
* Prepend an array of data to data list
*
* @param data
* data's array
*/
public <T> void load (String linkName, Class<T> clazz)
{
if (!isReferencesMode) {
mDataMap.put(linkName, new Data<T>(clazz, null));
eAdmin.econtext.loadContextData(linkName, clazz);
} else {
mDataMap.put(linkName, new Data<T>(clazz, null));
mUnloadedData.add(linkName);
}
}
/**
* Prepend an array of data to data list
*
* @param data
* data's array
*/
public <T> void load (String linkName, Class<T> clazz, AssetLoaderParameters<T> param)
{
if (!isReferencesMode) {
mDataMap.put(linkName, new Data<T>(clazz, param));
eAdmin.econtext.loadContextData(linkName, clazz, param);
} else {
mDataMap.put(linkName, new Data<T>(clazz, null));
mUnloadedData.add(linkName);
}
}
public void reload ()
{
isReferencesMode = false;
String tmp = null;
while (mUnloadedData.size() > 0) {
tmp = mUnloadedData.poll();
eAdmin.econtext.loadGraphicsData(tmp, mDataMap.get(tmp));
}
}
/**
* remove the given data
*
* @param data
* the data you want
*/
public void unload ()
{
eAdmin.econtext.unloadContext(this);
for (String s : mDataMap.keys())
if (!mUnloadedData.contains(s))
mUnloadedData.add(s);
}
public void unload (String... linkName)
{
for (String s : linkName) {
if (eAdmin.econtext.isLoaded(s, mDataMap.get(s).clazz)) {
mUnloadedData.add(s);
eAdmin.econtext.unloadDirectly(s);
}
}
}
public void remove (String... listName)
{
for (String linkName : listName) {
mDataMap.remove(linkName);
mUnloadedData.remove(linkName);
eAdmin.econtext.unloadDirectly(linkName);
}
}
/**
* Ask for data is contaning in the list
*
* @param data
* the given data
* @return true if list contain data,otherwise false
*/
public boolean contain (String assetName)
{
return mDataMap.containsKey(assetName);
}
public boolean isUnloaded (String assetName)
{
return mUnloadedData.contains(assetName);
}
public boolean isLoaded (String assetName)
{
return eAdmin.econtext.isLoaded(assetName, mDataMap.get(assetName).clazz);
}
Data<?> getContextData (String assetName)
{
return mDataMap.get(assetName);
}
/**
* Get the size of data list
*
* @return data list's size
*/
public int size ()
{
return mDataMap.size;
}
public int unloadedSize ()
{
return mUnloadedData.size();
}
/**
* If this art have 1 asset have not been loaded , it will be false
*
* @return true if all assets was loaded, false otherwise
*/
public boolean isTotallyLoaded ()
{
if (isReferencesMode)
return true;
for (Entry<String, Data> entries : mDataMap.entries()) {
if (!eAdmin.econtext.isLoaded(entries.key, entries.value.clazz))
return false;
}
return true;
}
public boolean isTotallyUnloaded ()
{
for (Entry<String, Data> entries : mDataMap.entries()) {
if (eAdmin.econtext.isLoaded(entries.key, entries.value.clazz))
return false;
}
return true;
}
/**
* You must call this method constantly until all assets done loading
*/
public boolean update ()
{
return eAdmin.econtext.update();
}
/**
* Get the current loading process on this art
*
* @return the progress (0 to 1)
*/
public float getProgress ()
{
return eAdmin.econtext.getProgress();
}
public <T> T get (String name, Class<T> clazz)
{
return eAdmin.econtext.get(name, clazz);
}
public void clear ()
{
eAdmin.econtext.unloadContext(this);
mUnloadedData.clear();
mDataMap.clear();
}
/**
* Strongly release the art (make it disappear:D)
*/
public void dispose ()
{
eAdmin.econtext.removeContext(this);
mDataMap.clear();
mUnloadedData.clear();
}
}