package org.geogebra.web.html5.util;
import org.geogebra.common.gui.toolbar.ToolBar;
import org.geogebra.common.gui.view.algebra.AlgebraView.SortMode;
import org.geogebra.common.io.layout.Perspective;
import org.geogebra.common.io.layout.PerspectiveDecoder;
import org.geogebra.common.util.debug.GeoGebraProfiler;
import org.geogebra.common.util.debug.Log;
import org.geogebra.web.html5.Browser;
import org.geogebra.web.html5.awt.GDimensionW;
import org.geogebra.web.html5.gui.tooltip.ToolTipManagerW;
import org.geogebra.web.html5.main.AppW;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.storage.client.Storage;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.Location;
/**
* File loader for Web
*/
public class LoadFilePresenter {
// NB this needs to be adjusted in app-release if we change it here
private static final int MIN_SIZE_FOR_PICKER = 650;
private ViewW mview;
/**
* @return Article element wrapper
*/
public ViewW getView() {
return mview;
}
/**
* @param view
* article element wrapper
*/
public void setView(ViewW view) {
this.mview = view;
}
/**
* Run applet for current view
*/
public void onPageLoad() {
ViewW view = getView();
String base64String;
String filename;
view.adjustScale();
final AppW app = view.getApplication();
boolean fileOpened = true;
boolean specialPerspective = false;
app.setAllowSymbolTables(view.getDataParamAllowSymbolTable());
app.setErrorDialogsActive(view.getDataParamErrorDialogsActive());
if (isReloadDataInStorage()) {
// do nothing here - everything done in isReloadDataInStorage()
// function
} else if (!"".equals((filename = view.getDataParamJSON()))) {
processJSON(filename);
} else if (!"".equals((base64String = view.getDataParamBase64String()))) {
process(base64String);
} else if (!"".equals((filename = view.getDataParamFileName()))) {
fetch(filename);
} else if (!"".equals((filename = view.getDataParamTubeID()))) {
app.openMaterial(view.getDataParamTubeID(), new Runnable() {
@Override
public void run() {
openEmptyApp(app);
ToolTipManagerW.sharedInstance().showBottomMessage(
app.getLocalization().getError("LoadFileFailed"),
false, app);
}
});
} else {
fileOpened = false;
specialPerspective = openEmptyApp(app);
}
// app.setChooserPopupsEnabled(enableChooserPopups);
// app.setErrorDialogsActive(errorDialogsActive);
// if (customToolBar != null && customToolBar.length() > 0 &&
// showToolBar)
// app.getGuiManager().setToolBarDefinition(customToolBar);
// app.setMaxIconSize(maxIconSize);
boolean fullApp = !app.isApplet();
boolean showToolBar = view.getDataParamShowToolBar(fullApp);
boolean showMenuBar = view.getDataParamShowMenuBar(fullApp);
boolean showAlgebraInput = view.getDataParamShowAlgebraInput(fullApp);
app.setShowMenuBar(showMenuBar);
app.setShowAlgebraInput(showAlgebraInput, false);
app.setShowToolBar(showToolBar, view.getDataParamShowToolBarHelp());
app.getKernel().setShowAnimationButton(
view.getDataParamShowAnimationButton());
app.setCapturingThreshold(view.getDataParamCapturingThreshold());
boolean undoActive = (showToolBar || showMenuBar
|| view.getDataParamApp() || app.getScriptManager()
.getStoreUndoListeners().size() > 0)
&& view.getDataParamEnableUndoRedo();
app.setUndoActive(undoActive);
String language = view.getDataParamLanguage();
if (language == null || "".equals(language)) {
language = app.getLanguageFromCookie();
}
if (language != null) {
String country = view.getDataParamCountry();
if (country == null || "".equals(country)) {
app.setLanguage(language);
} else {
app.setLanguage(language, country);
}
}
app.setUseBrowserForJavaScript(view.getDataParamUseBrowserForJS());
app.setLabelDragsEnabled(view.getDataParamEnableLabelDrags());
app.setUndoRedoEnabled(view.getDataParamEnableUndoRedo());
app.setRightClickEnabled(view.getDataParamEnableRightClick());
app.setShiftDragZoomEnabled(view.getDataParamShiftDragZoomEnabled()
|| view.getDataParamApp());
app.setShowResetIcon(view.getDataParamShowResetIcon());
app.setAllowStyleBar(view.getDataParamAllowStyleBar());
if (!specialPerspective) {
app.updateToolBar();
}
if (!fileOpened) {
GeoGebraProfiler.getInstance().profileEnd();
app.getScriptManager().ggbOnInit();
}
}
/**
* Open app without file / base64
*
* @param app
* application
* @return whether special perspective (search / customize) was used
*/
boolean openEmptyApp(final AppW app) {
// we dont have content, it is an app
Log.debug("no base64content, possibly App loaded?");
// code moved here from AppWapplication.afterCoreObjectsInited - start
String perspective = mview.getDataParamPerspective();
if (perspective.length() == 0) {
perspective = Location.getParameter("GeoGebraPerspective");
}
if (perspective == null) {
perspective = "";
}
if (app.getGuiManager() != null) {
if (perspective.startsWith("search:")) {
app.setCloseBrowserCallback(new Runnable() {
@Override
public void run() {
finishEmptyLoading(app, null);
}
});
app.openSearch(perspective.substring("search:".length()));
return true;
} else if (perspective.startsWith("customize:")) {
app.setCloseBrowserCallback(new Runnable() {
@Override
public void run() {
finishEmptyLoading(app, null);
}
});
app.showCustomizeToolbarGUI();
return true;
} else {
Perspective pd = PerspectiveDecoder.decode(perspective,
app.getKernel().getParser(),
ToolBar.getAllToolsNoMacros(true, app.isExam(), app));
if ("1".equals(perspective)) {
int width = app.getArticleElement().getDataParamWidth();
if (app.getArticleElement().getDataParamFitToScreen()) {
width = Window.getClientWidth();
}
if (width > 0) {
double ratio = PerspectiveDecoder.landscapeRatio(width);
pd.getSplitPaneData()[0].setDivider(ratio);
}
}
finishEmptyLoading(app, pd);
return false;
}
}
finishEmptyLoading(app, null);
return false;
}
/**
* FInish loading when no base64 / filename enetered
*
* @param app
* application
* @param p
* perspective
*/
void finishEmptyLoading(AppW app, Perspective p) {
app.setPreferredSize(
new GDimensionW((int) app.getWidth(), (int) app.getHeight()));
app.loadPreferences(p);
// default layout doesn't have a Graphics View 2
app.getEuclidianViewpanel().deferredOnResize();
app.appSplashCanNowHide();
// TODO this should probably go to default XML
app.getSettings().getAlgebra().setTreeMode(SortMode.ORDER);
app.updateToolBar();
app.focusLost(null, null);
app.setUndoActive(true);
if (p != null) {
if (!app.getArticleElement().getDataParamShowAppsPicker()) {
app.showStartTooltip(p.getDefaultID());
}
app.setActivePerspective(p.getDefaultID() - 1);
}
// no Feature.ADJUST_VIEWS: returns false.
app.adjustViews(false);
boolean smallScreen = Window.getClientWidth() < MIN_SIZE_FOR_PICKER
|| Window.getClientHeight() < MIN_SIZE_FOR_PICKER;
if (app.getArticleElement().getDataParamShowAppsPicker()
&& app.getExam() == null && !smallScreen
&& !app.isWhiteboardActive()) {
app.showPerspectivesPopup();
}
app.updateRounding();
}
private boolean isReloadDataInStorage() {
if (!Browser.supportsSessionStorage()) {
return false;
}
Storage stockStore = Storage.getLocalStorageIfSupported();
if (stockStore == null) {
return false;
}
String base64String = stockStore.getItem("reloadBase64String");
if ((base64String == null) || (base64String.length() == 0)) {
return false;
}
process(base64String);
stockStore.removeItem("reloadBase64String");
return true;
}
/**
* @param dataParamBase64String
* a base64 string
*/
public void process(String dataParamBase64String) {
getView().processBase64String(dataParamBase64String);
}
/**
* @param json
* JSON encoded ZIP file (zip.js)
*/
public void processJSON(final String json) {
Scheduler.ScheduledCommand deferredOnRes = new Scheduler.ScheduledCommand() {
@Override
public void execute() {
getView().processJSON(json);
}
};
Scheduler.get().scheduleDeferred(deferredOnRes);
}
private void fetch(String fileName) {
getView().processFileName(fileName);
}
}