///*
//GeoGebra - Dynamic Mathematics for Everyone
//http://www.geogebra.org
//
//This file is part of GeoGebra.
//
//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.
//
// */
package org.geogebra.web.web.gui.dialog;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.geogebra.common.euclidian.EuclidianConstants;
import org.geogebra.common.gui.dialog.ToolManagerDialogModel;
import org.geogebra.common.gui.dialog.ToolManagerDialogModel.ToolManagerDialogListener;
import org.geogebra.common.javax.swing.GOptionPane;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.Macro;
import org.geogebra.common.main.Feature;
import org.geogebra.common.move.ggtapi.models.Material.MaterialType;
import org.geogebra.common.util.AsyncOperation;
import org.geogebra.common.util.debug.Log;
import org.geogebra.web.html5.gui.util.LayoutUtilW;
import org.geogebra.web.html5.gui.util.ListBoxApi;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.html5.main.LocalizationW;
import org.geogebra.web.web.gui.GuiManagerW;
import org.geogebra.web.web.gui.ToolNameIconPanelW;
import org.geogebra.web.web.gui.ToolNameIconPanelW.MacroChangeListener;
import org.geogebra.web.web.gui.util.PopupBlockAvoider;
import org.geogebra.web.web.gui.util.SaveDialogW;
import org.geogebra.web.web.main.GeoGebraTubeExportW;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
public class ToolManagerDialogW extends DialogBoxW implements
ClickHandler,
ToolManagerDialogListener, MacroChangeListener {
private static class MacroListBox extends ListBox {
List<Macro> macros;
public MacroListBox() {
macros = new ArrayList<Macro>();
}
private static String getMacroText(Macro macro) {
return macro.getToolName() + ": " + macro.getNeededTypesString();
}
public List<Macro> getMacros() {
return macros;
}
public Macro getMacro(int index) {
return macros.get(index);
}
public Macro getSelectedMacro() {
int idx = getSelectedIndex();
if (idx == -1) {
return null;
}
return getMacro(idx);
}
public void setSelectedMacro(Macro macro) {
int idx = getSelectedIndex();
if (idx == -1) {
return;
}
macros.set(idx, macro);
setItemText(idx, getMacroText(macro));
}
public void addMacro(Macro macro) {
macros.add(macro);
addItem(getMacroText(macro));
}
public void insertMacro(Macro macro, int index) {
macros.add(index, macro);
insertItem(getMacroText(macro), index);
}
@Override
public void removeItem(int index) {
macros.remove(index);
super.removeItem(index);
}
public List<Macro> getSelectedMacros() {
List<Macro> sel = null;
for (int i = 0; i < getItemCount(); i++) {
if (isItemSelected(i)) {
if (sel == null) {
sel = new ArrayList<Macro>();
}
sel.add(getMacro(i));
}
}
return sel;
}
public boolean isEmpty() {
return macros.isEmpty();
}
}
AppW app;
final LocalizationW loc;
private ToolManagerDialogModel model;
private Button btUp;
private Button btDown;
MacroListBox toolList;
private Button btDelete;
private Button btOpen;
private Button btSave;
private Button btClose;
private ToolNameIconPanelW macroPanel;
private Button btShare;
public ToolManagerDialogW(AppW app) {
super(app.getPanel());
if (app.has(Feature.DIALOGS_OVERLAP_KEYBOARD)) {
setOverlapFeature(true);
}
setModal(true);
model = new ToolManagerDialogModel(app, this);
this.app = app;
this.loc = (LocalizationW) app.getLocalization();
initGUI();
center();
}
@Override
public void setVisible(boolean flag) {
if (flag) {
app.setMoveMode();
} else {
// recreate tool bar of application window
// updateToolBar();
}
super.setVisible(flag);
}
/**
* Updates the order of macros.
*/
private void updateToolBar() {
model.addMacros(toolList.getMacros().toArray());
app.updateToolBar();
}
private void deleteTools() {
// final List<String> sel = ListBoxApi.getSelection(toolList);
List<Integer> selIndexesTemp = ListBoxApi.getSelectionIndexes(toolList);
if (selIndexesTemp.isEmpty()) {
return;
}
// List<Macro> macros = toolList.getSelectedMacros();
StringBuilder macroNamesNoDel = new StringBuilder();
StringBuilder macroNamesDel = new StringBuilder();
for (int j = 0; j < selIndexesTemp.size(); j++) {
int i = selIndexesTemp.get(j);
if (toolList.getMacro(i).isUsed()) {
macroNamesNoDel.append("\n"
+ toolList.getMacro(i).getToolOrCommandName() + ": "
+ toolList.getMacro(i).getNeededTypesString());
toolList.setItemSelected(j, false);
} else {
macroNamesDel.append("\n"
+ toolList.getMacro(i).getToolOrCommandName() + ": "
+ toolList.getMacro(i).getNeededTypesString());
}
}
final List<Integer> selIndexes = ListBoxApi
.getSelectionIndexes(toolList);
String question = "";
String message = "";
if (macroNamesDel.length() == 0) {
app.showError(app.getLocalization().getError("Tool.DeleteUsed")
+ " " + macroNamesNoDel);
} else {
question = loc.getMenu("Question");
message = loc.getMenu("Tool.DeleteQuestion") + macroNamesDel;
if (macroNamesNoDel.length() != 0) {
message += "\n" + loc.getError("Tool.DeleteUsed")
+ macroNamesNoDel;
}
String[] options = { loc.getMenu("DeleteTool"),
loc.getMenu("DontDeleteTool") };
app.getGuiManager()
.getOptionPane()
.showOptionDialog(app, message, question,
0,
GOptionPane.QUESTION_MESSAGE,
null, options, new AsyncOperation<String[]>() {
@Override
public void callback(String[] dialogResult) {
if ("0".equals(dialogResult[0])) {
List<Macro> macros = toolList
.getSelectedMacros();
// need this because of removing
Collections.reverse(selIndexes);
for (Integer idx : selIndexes) {
toolList.removeItem(idx);
}
if (!toolList.isEmpty()) {
toolList.setSelectedIndex(0);
} else {
macroPanel.setMacro(null);
}
updateMacroPanel();
if (model.deleteTools(macros.toArray())) {
applyChanges();
updateToolBar();
}
}
}
});
}
}
private FlowPanel createListUpDownRemovePanel() {
btUp = new Button("\u25b2");
btUp.setTitle(loc.getMenu("Up"));
btUp.addClickHandler(this);
btUp.getElement().getStyle().setMargin(3, Style.Unit.PX);
btDown = new Button("\u25bc");
btDown.setTitle(loc.getMenu("Down"));
btDown.addClickHandler(this);
btDown.getElement().getStyle().setMargin(3, Style.Unit.PX);
FlowPanel panel = new FlowPanel();
panel.add(btUp);
panel.add(btDown);
return panel;
}
private void initGUI() {
addStyleName("GeoGebraPopup");
getCaption().setText(loc.getMenu("Tool.Manage"));
FlowPanel panel = new FlowPanel();
FlowPanel toolListPanel = new FlowPanel();
Label lblTitle = new Label(loc.getMenu("Tools"));
lblTitle.setStyleName("panelTitle");
panel.add(lblTitle);
panel.add(toolListPanel);
setWidget(panel);
toolList = new MacroListBox();
toolList.setMultipleSelect(true);
toolList.setVisibleItemCount(6);
FlowPanel centerPanel = LayoutUtilW.panelRow(toolList, createListUpDownRemovePanel());
centerPanel.setStyleName("manageToolsList");
toolListPanel.add(centerPanel);
FlowPanel toolButtonPanel = new FlowPanel();
toolListPanel.add(toolButtonPanel);
btDelete = new Button();
toolButtonPanel.add(btDelete);
btDelete.setText(loc.getMenu("Delete"));
if (app.has(Feature.TOOL_EDITOR)) {
btOpen = new Button();
toolButtonPanel.add(btOpen);
btOpen.setText(loc.getMenu("Open"));
btOpen.addClickHandler(this);
}
btSave = new Button();
toolButtonPanel.add(btSave);
btSave.setText(loc.getMenu("SaveAs") + " ...");
btShare = new Button();
toolButtonPanel.add(btShare);
btShare.setText(loc.getMenu("Share") + " ...");
// name & icon
macroPanel = new ToolNameIconPanelW(app);
macroPanel.setTitle(loc.getMenu("NameIcon"));
macroPanel.setMacroChangeListener(this);
panel.add(macroPanel);
FlowPanel closePanel = new FlowPanel();
btClose = new Button(loc.getMenu("Close"));
closePanel.add(btClose);
panel.add(closePanel);
btShare.addClickHandler(this);
btSave.addClickHandler(this);
btDelete.addClickHandler(this);
btClose.addClickHandler(this);
insertTools();
toolList.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
updateMacroPanel();
}
});
}
private void updateMacroPanel() {
macroPanel.setMacro(toolList.getSelectedMacro());
}
private void openTools() {
Log.debug("before" + app.hashCode());
app.setWaitCursor();
// for (Macro macro : toolList.getSelectedMacros()) {
app.storeMacro(toolList.getSelectedMacro(), false);
((AppW) app).getFileManager().open(Window.Location.getHref(), "", "");
app.setDefaultCursor();
hide();
}
private void insertTools() {
toolList.clear();
Kernel kernel = app.getKernel();
int size = kernel.getMacroNumber();
for (int i = 0; i < size; i++) {
Macro macro = kernel.getMacro(i);
toolList.addMacro(macro);
}
toolList.setSelectedIndex(0);
updateMacroPanel();
}
/**
* Saves all selected tools in a new file.
*/
private void saveTools() {
applyChanges();
SaveDialogW dlg = ((DialogManagerW) app.getDialogManager())
.getSaveDialog();
dlg.setSaveType(MaterialType.ggt);
dlg.show();
}
@Override
public void removeMacroFromToolbar(int i) {
app.getGuiManager().removeFromToolbarDefinition(i);
}
@Override
public void refreshCustomToolsInToolBar() {
app.getGuiManager().refreshCustomToolsInToolBar();
app.getGuiManager().updateToolbar();
}
@Override
public void uploadWorksheet(ArrayList<Macro> macros) {
GeoGebraTubeExportW exporter = new GeoGebraTubeExportW(app);
exporter.uploadWorksheet(macros, new PopupBlockAvoider());
}
@Override
public void onClick(ClickEvent event) {
Object src = event.getSource();
if (src == btClose) {
applyChanges();
hide();
}
int idx = toolList.getSelectedIndex();
if (idx == -1) {
return;
}
List<Integer> sel = ListBoxApi.getSelectionIndexes(toolList);
int selSize = sel.size();
if (src == btUp) {
Log.debug("Up");
if (idx > 0) {
toolList.insertMacro(toolList.getMacro(idx - 1), idx + selSize);
toolList.removeItem(idx - 1);
}
} else if (src == btDown) {
Log.debug("Dowm");
if (idx + selSize < toolList.getItemCount()) {
toolList.insertMacro(toolList.getMacro(idx + selSize), idx);
toolList.removeItem(idx + selSize + 1);
}
} else if (src == btDelete) {
deleteTools();
} else if (src == btOpen) {
openTools();
} else if (src == btSave) {
saveTools();
} else if (src == btShare) {
model.uploadToGeoGebraTube(toolList.getSelectedMacros().toArray());
}
}
private void applyChanges() {
if (toolList.isEmpty()) {
return;
}
model.addMacros(toolList.getMacros().toArray());
app.updateCommandDictionary();
refreshCustomToolsInToolBar();
}
@Override
public void onMacroChange(Macro macro) {
Macro m = toolList.getSelectedMacro();
m.setCommandName(macro.getCommandName());
m.setToolName(macro.getToolName());
m.setToolHelp(macro.getToolHelp());
m.setIconFileName(macro.getIconFileName());
m.setShowInToolBar(macro.isShowInToolBar());
toolList.setSelectedMacro(m);
}
@Override
public void onShowToolChange(Macro macro) {
onMacroChange(macro);
boolean active = macro.isShowInToolBar();
Macro m = toolList.getSelectedMacro();
if (active) {
app.getGuiManager().refreshCustomToolsInToolBar();
} else {
int macroID = m.getKernel().getMacroID(m)
+ EuclidianConstants.MACRO_MODE_ID_OFFSET;
app.getGuiManager().removeFromToolbarDefinition(macroID);
}
GuiManagerW gm = ((GuiManagerW) app.getGuiManager());
gm.setGeneralToolBarDefinition(gm.getCustomToolbarDefinition());
updateToolBar();
}
}