/*
* WBI Indicator Explorer
*
* Copyright 2015 Sebastian Nogara <snogaraleal@gmail.com>
*
* This file is part of WBI.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package client.ui.components.utils;
import java.util.HashSet;
import java.util.Set;
import java.util.List;
import java.util.ArrayList;
import com.google.gwt.core.client.Callback;
import com.google.gwt.core.client.ScriptInjector;
import client.ClientConf;
import client.ui.GlobalLoadingIndicator;
/**
* Script utilities.
*/
public class Script {
/**
* Set of paths to loaded script files.
*/
private static Set<String> loadedScripts = new HashSet<String>();
/**
* Load the specified script.
*
* @param script Path to script.
* @param callback {@code Callback} called when ready.
*/
public static void load(
String script, Callback<Void, Exception> callback) {
if (loadedScripts.contains(script)) {
callback.onSuccess(null);
return;
}
ScriptInjector.fromUrl(script)
.setWindow(ScriptInjector.TOP_WINDOW)
.setCallback(callback)
.inject();
loadedScripts.add(script);
}
/**
* Script loader.
*/
public static class Loader {
/**
* Status of a {@link Loader}.
*/
public static enum Status {
NEW,
LOADING,
READY
}
/**
* Path to script.
*/
private String script;
/**
* Required script.
*/
private Loader base;
/**
* Current loader {@link Status}.
*/
private Status status = Status.NEW;
/**
* List of {@code Runnable} to call when ready.
*/
private List<Runnable> callbacks = new ArrayList<Runnable>();
/**
* Initialize {@code Loader}.
*
* @param script Path to script.
* @param base Required script.
*/
public Loader(String script, Loader base) {
this.script = script;
this.base = base;
}
/**
* Initialize {@code Loader}.
*
* @param script Path to script.
*/
public Loader(String script) {
this(script, null);
}
/**
* Load script.
*
* @param callback {@code Runnable} called when ready.
*/
public void load(final Runnable callback) {
switch (status) {
case NEW:
callbacks.add(callback);
break;
case LOADING:
callbacks.add(callback);
return;
case READY:
callback.run();
return;
}
status = Status.LOADING;
GlobalLoadingIndicator.start();
final Callback<Void, Exception> scriptCallback =
new Callback<Void, Exception>() {
@Override
public void onFailure(Exception exception) {
GlobalLoadingIndicator.finish();
}
@Override
public void onSuccess(Void result) {
GlobalLoadingIndicator.finish();
status = Status.READY;
for (Runnable callback : callbacks) {
callback.run();
}
callbacks.clear();
}
};
if (base == null) {
Script.load(script, scriptCallback);
} else {
base.load(new Runnable() {
@Override
public void run() {
Script.load(script, scriptCallback);
}
});
}
}
/**
* Get the current {@link Status} of the loader.
*
* @return Current status.
*/
public Status getStatus() {
return status;
}
}
/**
* Non-conflicting JQuery loader.
*/
public static class JQueryLoader extends Loader {
public static final String SCRIPT =
ClientConf.asset("js/jquery/jquery-2.1.3.min.js");
public JQueryLoader() {
super(SCRIPT);
}
@Override
public void load(final Runnable callback) {
super.load(new Runnable() {
@Override
public void run() {
ScriptInjector.fromString("jQuery.noConflict();")
.setWindow(ScriptInjector.TOP_WINDOW)
.inject();
callback.run();
}
});
}
}
/**
* Global JQuery loader.
*/
public static Loader JQUERY = new JQueryLoader();
}