package org.geogebra.web.web.main; import org.geogebra.common.main.App; import org.geogebra.common.main.MaterialsManager; import org.geogebra.common.move.ggtapi.models.Material; import org.geogebra.common.move.ggtapi.models.Material.MaterialType; import org.geogebra.common.move.ggtapi.models.Material.Provider; import org.geogebra.common.move.ggtapi.models.MaterialFilter; import org.geogebra.common.util.debug.Log; import org.geogebra.web.html5.euclidian.EuclidianViewWInterface; import org.geogebra.web.html5.gui.tooltip.ToolTipManagerW; import org.geogebra.web.html5.main.AppW; import org.geogebra.web.web.gui.browser.BrowseGUI; import org.geogebra.web.web.gui.browser.SignInButton; import org.geogebra.web.web.gui.dialog.DialogManagerW; import org.geogebra.web.web.util.SaveCallback; import com.google.gwt.user.client.Window; /** * Manager for local file saving * */ public abstract class FileManager extends MaterialsManager { /** application */ protected AppW app; private Provider provider = Provider.TUBE; /** * @param app * application */ public FileManager(final AppW app) { this.app = app; } @Override public abstract void delete(final Material mat, boolean permanent, Runnable onSuccess); /** * * @param base64 * only a hint, we can send null and it will be resolved * @param modified * modification timestamp * @param cb * callback */ public abstract void saveFile(String base64, long modified, final SaveCallback cb); /** * @param materialFilter * filter */ protected abstract void getFiles(MaterialFilter materialFilter); /** * Overwritten for phone * * @param material * {@link Material} */ public void removeFile(final Material material) { app.getGuiManager().getBrowseView().removeMaterial(material); } /** * Overwritten for phone * * @param material * {@link Material} */ public void addMaterial(final Material material) { app.getGuiManager().getBrowseView().addMaterial(material); } /** * @param base64 * material base64 * @param modified * timestamp * @return material */ public Material createMaterial(final String base64, long modified) { final Material mat = new Material(0, MaterialType.ggb); // TODO check if we need to set timestamp / modified mat.setModified(modified); if (app.getTubeId() != 0) { mat.setId(app.getTubeId()); Log.debug("create material" + app.getSyncStamp()); mat.setSyncStamp(app.getSyncStamp()); } mat.setBase64(base64); mat.setTitle(app.getKernel().getConstruction().getTitle()); mat.setDescription(app.getKernel().getConstruction() .getWorksheetText(0)); mat.setThumbnailBase64(((EuclidianViewWInterface) app .getActiveEuclidianView()) .getCanvasBase64WithTypeString()); if (app.getLoginOperation() != null) { mat.setAuthorId(app.getLoginOperation().getModel().getUserId()); mat.setAuthor(app.getLoginOperation().getUserName()); } if (app.getActiveMaterial() != null) { mat.setSharingKey(app.getActiveMaterial().getSharingKey()); mat.setVisibility(app.getActiveMaterial().getVisibility()); mat.setURL(app.getActiveMaterial().getURL()); } return mat; } /** * @param query * String */ @Override public void search(final String query) { getFiles(MaterialFilter.getSearchFilter(query)); } /** * adds the files from the current user to the {@link BrowseGUI} */ @Override public void getUsersMaterials() { getFiles(MaterialFilter.getUniversalFilter()); // getFiles(MaterialFilter.getAuthorFilter(app.getLoginOperation().getUserName())); } @Override protected final void showTooltip(Material mat) { ToolTipManagerW.sharedInstance().showBottomMessage(app.getLocalization() .getPlain("SeveralVersionsOfA", mat.getTitle()), true, app); } /** * Refresh material in browse view * * @param newMat * uploaded material */ @Override protected void refreshMaterial(Material newMat) { app.getGuiManager().getBrowseView().refreshMaterial(newMat, false); } @Override public boolean shouldKeep(int id) { return true; } @Override public void setFileProvider(Provider provider) { this.provider = provider; } @Override public Provider getFileProvider() { return this.provider; } @Override public void openMaterial(final Material material) { try { final String base64 = material.getBase64(); if (base64 == null) { return; } app.getGgbApi().setBase64(base64); } catch (final Throwable t) { app.showError(app.getLocalization().getError("LoadFileFailed")); t.printStackTrace(); } } /** * only for FileManagerT and FileManagerW * * @return {@link AppW} */ @Override public AppW getApp() { return this.app; } @Override public final boolean save(App app1) { AppW appw = (AppW) app1; if (this.provider == Provider.LOCAL) { ((DialogManagerW) appw.getDialogManager()).showSaveDialog(); } // not logged in and can't log in else if (!appw.getLoginOperation().isLoggedIn() && (!appw.getNetworkOperation().isOnline() || !appw .getLoginOperation().mayLogIn())) { saveLoggedOut(appw); // not logged in and possible to log in } else if (!appw.getLoginOperation().isLoggedIn()) { appw.getGuiManager().listenToLogin(); ((SignInButton) appw.getLAF().getSignInButton(appw)).login(); // logged in } else { ((DialogManagerW) appw.getDialogManager()).showSaveDialog(); } return true; } @Override public native void nativeShare(String base64, String title)/*-{ if ($wnd.android) { $wnd.android.share(base64, title, 'ggb'); } }-*/; public void open(String url, String name, String features){ Window.open(url, name, features); } public void open(String url){ openNative(url); } native private static void openNative(String url)/*-{ $wnd.open(url); }-*/; }