package org.geogebra.web.web.gui.dialog;
import java.util.ArrayList;
import org.geogebra.common.awt.GColor;
import org.geogebra.common.awt.GPoint;
import org.geogebra.common.euclidian.EuclidianConstants;
import org.geogebra.common.euclidian.EuclidianController;
import org.geogebra.common.euclidian.EuclidianView;
import org.geogebra.common.gui.InputHandler;
import org.geogebra.common.gui.dialog.InputDialog;
import org.geogebra.common.gui.dialog.TextInputDialog;
import org.geogebra.common.gui.dialog.handler.ColorChangeHandler;
import org.geogebra.common.gui.dialog.handler.NumberChangeSignInputHandler;
import org.geogebra.common.gui.dialog.handler.NumberInputHandler;
import org.geogebra.common.gui.dialog.handler.RenameInputHandler;
import org.geogebra.common.gui.view.properties.PropertiesView;
import org.geogebra.common.javax.swing.GOptionPane;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.geos.GeoBoolean;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoFunction;
import org.geogebra.common.kernel.geos.GeoNumberValue;
import org.geogebra.common.kernel.geos.GeoNumeric;
import org.geogebra.common.kernel.geos.GeoPoint;
import org.geogebra.common.kernel.geos.GeoPolygon;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.kernel.kernelND.GeoPointND;
import org.geogebra.common.kernel.kernelND.GeoSegmentND;
import org.geogebra.common.main.App;
import org.geogebra.common.main.DialogManager;
import org.geogebra.common.main.OptionType;
import org.geogebra.common.move.events.BaseEvent;
import org.geogebra.common.move.ggtapi.models.Material.MaterialType;
import org.geogebra.common.move.views.EventRenderable;
import org.geogebra.common.util.AsyncOperation;
import org.geogebra.common.util.debug.Log;
import org.geogebra.web.html5.css.GuiResourcesSimple;
import org.geogebra.web.html5.gui.GDialogBox;
import org.geogebra.web.html5.gui.LoadingApplication;
import org.geogebra.web.html5.gui.tooltip.ToolTipManagerW;
import org.geogebra.web.html5.gui.tooltip.ToolTipManagerW.ToolTipLinkType;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.web.export.AnimationExportDialogW;
import org.geogebra.web.web.gui.GuiManagerW;
import org.geogebra.web.web.gui.dialog.image.UploadImageDialog;
import org.geogebra.web.web.gui.util.SaveDialogW;
import org.geogebra.web.web.gui.view.data.DataAnalysisViewW;
import org.geogebra.web.web.gui.view.functioninspector.FunctionInspectorW;
import org.geogebra.web.web.main.AppWFull;
import org.geogebra.web.web.main.GDevice;
import org.geogebra.web.web.move.googledrive.events.GoogleLoginEvent;
import org.geogebra.web.web.move.googledrive.operations.GoogleDriveOperationW;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.PopupPanel;
public class DialogManagerW extends DialogManager implements EventRenderable, LoadingApplication {
private FunctionInspectorW functionInspector;
protected SaveDialogW saveDialog = null;
protected UploadImageDialog imageDialog;
private RecoverAutoSavedDialog autoSavedDialog;
public DialogManagerW(AppW app) {
super(app);
if (app.getGoogleDriveOperation() != null) {
((GoogleDriveOperationW) app.getGoogleDriveOperation()).getView()
.add(this);
}
}
@Override
public boolean showFunctionInspector(GeoFunction geoFunction) {
Log.debug("Show Function Inspector");
boolean success = true;
try {
if (functionInspector == null) {
functionInspector = new FunctionInspectorW(((AppW) app),
geoFunction);
} else {
functionInspector.insertGeoElement(geoFunction);
}
// show the view
((GuiManagerW)app.getGuiManager()).setShowView(true, App.VIEW_FUNCTION_INSPECTOR);
functionInspector.setInspectorVisible(true);
} catch (Exception e) {
success = false;
e.printStackTrace();
}
return success;
}
@Override
public void showPropertiesDialog(ArrayList<GeoElement> geos) {
showPropertiesDialog(OptionType.OBJECTS, geos);
}
@Override
public void showBooleanCheckboxCreationDialog(GPoint loc, GeoBoolean bool) {
CheckboxCreationDialogW dlg = new CheckboxCreationDialogW((AppW)app, loc, bool);
dlg.show();
}
@Override
public void showNumberInputDialog(String title, String message,
String initText, AsyncOperation<GeoNumberValue> callback) {
// avoid labeling of num
final Construction cons = app.getKernel().getConstruction();
boolean oldVal = cons.isSuppressLabelsActive();
cons.setSuppressLabelCreation(true);
NumberInputHandler handler = new NumberInputHandler(app.getKernel()
.getAlgebraProcessor(),callback, app, oldVal);
InputDialogW id = new InputDialogW(((AppW) app), message, title,
initText, false, handler, true, false) {
@Override
protected void cancel() {
cons.setSuppressLabelCreation(false);
super.cancel();
}
};
id.setVisible(true);
}
/**
* shows the {@link RecoverAutoSavedDialog}
* @param app2 {@link AppWapplication}
*/
public void showRecoverAutoSavedDialog(AppWFull app2, String json) {
if (this.autoSavedDialog == null) {
this.autoSavedDialog = new RecoverAutoSavedDialog(app2);
}
this.autoSavedDialog.setJSON(json);
this.autoSavedDialog.show();
}
@Override
public void showNumberInputDialogRegularPolygon(String title, EuclidianController ec,
GeoPointND geoPoint1, GeoPointND geoPoint2) {
NumberInputHandler handler = new NumberInputHandler(app.getKernel()
.getAlgebraProcessor());
InputDialogW id = new InputDialogRegularPolygonW(((AppW) app), ec, title,
handler, geoPoint1, geoPoint2);
id.setVisible(true);
}
@Override
public void showNumberInputDialogCirclePointRadius(String title,
GeoPointND geoPoint1, EuclidianView view) {
NumberInputHandler handler = new NumberInputHandler(app.getKernel()
.getAlgebraProcessor());
InputDialogW id = new InputDialogCirclePointRadiusW(((AppW) app), title,
handler, (GeoPoint) geoPoint1, app.getKernel());
id.setVisible(true);
}
@Override
public void showAngleInputDialog(String title, String message,
String initText, AsyncOperation<GeoNumberValue> callback) {
// avoid labeling of num
Construction cons = app.getKernel().getConstruction();
boolean oldVal = cons.isSuppressLabelsActive();
cons.setSuppressLabelCreation(true);
NumberInputHandler handler = new NumberInputHandler(app.getKernel()
.getAlgebraProcessor(),callback, app, oldVal);
AngleInputDialogW id = new AngleInputDialogW(((AppW) app), message, title,
initText, false, handler, true);
id.setVisible(true);
}
@Override
public boolean showButtonCreationDialog(int x, int y, boolean textfield) {
ButtonDialogW dialog = new ButtonDialogW(((AppW) app), x, y, textfield);
dialog.setVisible(true);
return true;
}
@Override
protected String prompt(String message, String def) {
return Window.prompt(message, def);
}
@Override
protected boolean confirm(String string) {
return Window.confirm(string);
}
@Override
public void closeAll() {
// TODO Auto-generated method stub
}
@Override
public void showRenameDialog(GeoElement geo, boolean storeUndo, String initText,
boolean selectInitText) {
if (!app.isRightClickEnabled()) {
return;
}
geo.setLabelVisible(true);
geo.updateRepaint();
if (app.getGuiManager() != null) {
app.getGuiManager().clearInputbar();
}
InputHandler handler = new RenameInputHandler(app, geo, storeUndo);
InputDialogW id = new InputDialogW((AppW) app, app.getLocalization().getPlain("NewNameForA", geo.getNameDescription()),
loc.getMenu("Rename"), initText, false, handler, false,
selectInitText);
id.setVisible(true);
}
/**
* @param loc {@link GeoPoint}
*/
public void showImageInputDialog(GeoPoint loc, GDevice device) {
if (this.imageDialog == null) {
this.imageDialog = device.getImageInputDialog((AppW) app);
}
imageDialog.setLocation(loc);
imageDialog.center();
imageDialog.show();
}
@Override
public void showNumberInputDialog(String title, String message,
String initText, boolean changingSign, String checkBoxText,
AsyncOperation<GeoNumberValue> callback) {
boolean oldVal = app.getKernel().getConstruction()
.isSuppressLabelsActive();
// avoid labeling of num
NumberChangeSignInputHandler handler = new NumberChangeSignInputHandler(
app.getKernel().getAlgebraProcessor(),
callback, app, oldVal);
NumberChangeSignInputDialogW id = new NumberChangeSignInputDialogW(
((AppW) app), message, title, initText, handler, changingSign,
checkBoxText);
id.setVisible(true);
}
/**
* Creates a new slider at given location (screen coords).
*
* @return whether a new slider (number) was create or not
*/
@Override
public boolean showSliderCreationDialog(int x, int y) {
app.setWaitCursor();
SliderDialogW dialog = new SliderDialogW(((AppW) app), x, y);
dialog.center();
app.setDefaultCursor();
return true;
}
@Override
public void showNumberInputDialogRotate(String title, GeoPolygon[] polys,
GeoPointND[] points, GeoElement[] selGeos,
EuclidianController ec) {
NumberInputHandler handler = new NumberInputHandler(app.getKernel()
.getAlgebraProcessor());
InputDialogRotateW id = new InputDialogRotatePointW(((AppW) app), title, handler, polys,
points, selGeos, ec);
id.setVisible(true);
}
@Override
public void showNumberInputDialogAngleFixed(String title,
GeoSegmentND[] segments, GeoPointND[] points, GeoElement[] selGeos, EuclidianController ec) {
NumberInputHandler handler = new NumberInputHandler(app.getKernel()
.getAlgebraProcessor());
InputDialogAngleFixedW id = new InputDialogAngleFixedW(((AppW) app), title, handler,
segments, points, app.getKernel(), ec);
id.setVisible(true);
}
@Override
public void showNumberInputDialogDilate(String title, GeoPolygon[] polys,
GeoPointND[] points, GeoElement[] selGeos, EuclidianController ec) {
NumberInputHandler handler = new NumberInputHandler(app.getKernel()
.getAlgebraProcessor());
InputDialogW id = new InputDialogDilateW(((AppW) app), title, handler,
points, selGeos, app.getKernel(), ec);
id.setVisible(true);
}
@Override
public void showNumberInputDialogSegmentFixed(String title,
GeoPointND geoPoint1) {
NumberInputHandler handler = new NumberInputHandler(app.getKernel()
.getAlgebraProcessor());
InputDialogW id = new InputDialogSegmentFixedW(((AppW) app), title,
handler, geoPoint1, app.getKernel());
id.setVisible(true);
}
/**
*
* @return {@link SaveDialogW}
*/
public SaveDialogW getSaveDialog() {
if (saveDialog == null) {
saveDialog = new SaveDialogW((AppW) app);
}
// set default saveType
saveDialog.setSaveType(MaterialType.ggb);
return saveDialog;
}
/**
* shows the {@link SaveDialogW} centered on the screen
*/
public void showSaveDialog() {
getSaveDialog().center();
}
@Override
public void showPropertiesDialog(OptionType type, ArrayList<GeoElement> geos) {
if (!((AppW) app).letShowPropertiesDialog() || app.getGuiManager() == null) {
return;
}
// get PropertiesView
PropertiesView pv = ((GuiManagerW) app.getGuiManager())
.getPropertiesView(type);
int subType = -1;
// select geos
if (geos != null) {
if (app.getSelectionManager().getSelectedGeos().size() == 0) {
app.getSelectionManager().addSelectedGeos(geos, true);
}
if (geos.size() == 1 && geos.get(0).isEuclidianVisible()
&& geos.get(0) instanceof GeoNumeric) {
// AbstractApplication.debug("TODO : propPanel.showSliderTab()");
subType = 2;
}
}
// set properties option type
if (type != null) {
Log.debug("Viewing optionsPanel subtype " + subType);
pv.setOptionPanel(type, subType);
}
// show the view
((GuiManagerW)app.getGuiManager()).setShowView(true, App.VIEW_PROPERTIES);
}
@Override
public void openToolHelp() {
int mode = app.getMode();
ToolTipManagerW.sharedInstance().showBottomInfoToolTip(
app.getToolTooltipHTML(mode),
((AppW) app).getGuiManager().getTooltipURL(mode),
ToolTipLinkType.Help, (AppW) app,
((AppW) app).getAppletFrame().isKeyboardShowing());
}
@Override
public void showDataSourceDialog(int mode, boolean doAutoLoadSelectedGeos) {
if (mode == EuclidianConstants.MODE_SPREADSHEET_ONEVARSTATS
|| mode == EuclidianConstants.MODE_SPREADSHEET_TWOVARSTATS
|| mode == EuclidianConstants.MODE_SPREADSHEET_MULTIVARSTATS) {
Log.debug("[DAMODE] about to show mode " + mode);
DataAnalysisViewW da = (DataAnalysisViewW)app.getGuiManager().getDataAnalysisView();
da.changeMode(mode);
app.getGuiManager().setShowView(true, App.VIEW_DATA_ANALYSIS);
}
}
/**
* Shows alert dialog.
* @param text Alert message
*/
public void showAlertDialog(String text) {
((AppW) app)
.getGuiManager()
.getOptionPane()
.showConfirmDialog(app, text, "",
GOptionPane.OK_OPTION, GOptionPane.INFORMATION_MESSAGE, null);
}
@Override
public void renderEvent(BaseEvent event) {
if (event instanceof GoogleLoginEvent) {
if (!((GoogleLoginEvent) event).isSuccessFull()) {
Log.debug("Login to Google failed");
}
}
}
private PopupPanel loadingAnimation = null;
private ColorChooserDialog dialog = null;
/**
* Shows a loading animation
*/
@Override
public void showLoadingAnimation() {
if (loadingAnimation == null) {
loadingAnimation = createLoadingAnimation();
}
loadingAnimation.center();
loadingAnimation.show();
}
private static PopupPanel createLoadingAnimation() {
PopupPanel anim = new PopupPanel();
anim.addStyleName("loadinganimation");
anim.add(
new Image(GuiResourcesSimple.INSTANCE.getGeoGebraWebSpinner()));
return anim;
}
/**
* Hides a loading animation
*/
@Override
public void hideLoadingAnimation() {
if (loadingAnimation != null) {
loadingAnimation.hide();
}
}
/**
* Update labels in the GUI.
*/
public void setLabels() {
//if (functionInspector != null)
// functionInspector.setLabels();
if (textInputDialog != null) {
((TextInputDialogW) textInputDialog).setLabels();
}
if (saveDialog != null) {
saveDialog.setLabels();
}
if (imageDialog != null) {
imageDialog.setLabels();
}
if (this.autoSavedDialog != null) {
this.autoSavedDialog.setLabels();
}
//if (fileChooser != null)
// updateJavaUILanguage();
//if (dataSourceDialog != null)
// dataSourceDialog.setLabels();
}
/**
* Creates a new {@link ColorChooserDialog}.
*
* @param {@link GColor originalColor}.
* @param {@link ColorChangeHandler handler}
*/
public void showColorChooserDialog(GColor originalColor,
ColorChangeHandler handler) {
if (dialog == null) {
dialog = new ColorChooserDialog((AppW) app, originalColor, handler);
} else {
dialog.setOriginalColor(originalColor);
dialog.setHandler(handler);
}
dialog.center();
}
/**
* @return {@link FunktionInspectorW}
*/
public FunctionInspectorW getFunctionInspector() {
return functionInspector;
}
@Override
public TextInputDialog createTextDialog(GeoText text, GeoPointND startPoint, boolean rw) {
return new TextInputDialogW(app, loc.getMenu("Text"), text,
startPoint, rw, 30,
6, app.getMode() == EuclidianConstants.MODE_TEXT);
}
@Override
public InputDialog newInputDialog(App app1, String message, String title,
String initString, InputHandler handler, GeoElement geo) {
return new InputDialogW((AppW) app1, message, title, initString,
handler, geo);
}
public void showAnimGifExportDialog() {
GDialogBox dialog = new AnimationExportDialogW((AppW) app);
dialog.center();
dialog.show();
}
}