package org.geogebra.web.web.gui;
import org.geogebra.common.kernel.Macro;
import org.geogebra.common.main.App;
import org.geogebra.common.main.Localization;
import org.geogebra.common.util.MD5EncrypterGWTImpl;
import org.geogebra.common.util.Util;
import org.geogebra.web.html5.gui.textbox.GTextBox;
import org.geogebra.web.html5.gui.util.NoDragImage;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.web.gui.app.GGWToolBar;
import org.geogebra.web.web.gui.dialog.image.UploadImageDialog;
import org.geogebra.web.web.gui.images.ImgResourceHelper;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
/**
* Panel of Tool Creation Dialog. Contains tool name, command name, help and
* icon for the tool. It also allows user to add/remove the tool from toolbar.
*/
public class ToolNameIconPanelW extends VerticalPanel implements BlurHandler,
KeyUpHandler {
public interface MacroChangeListener {
void onMacroChange(Macro macro);
void onShowToolChange(Macro macro);
}
/** With of tool icon in pixels **/
public static final int ICON_WIDTH = 32;
/** Height of tool icon in pixels **/
public static final int ICON_HEIGHT = 32;
private TextBox tfCmdName;
private TextBox tfToolHelp;
private TextBox tfToolName;
private CheckBox showTool;
private VerticalPanel mainWidget;
private Image icon;
private String iconFileName;
private AppW app;
private Macro macro;
private MacroChangeListener listener;
/**
*
* @param app
* application
*/
public ToolNameIconPanelW(final App app) {
super();
this.app = (AppW) app;
listener = null;
macro = null;
mainWidget = new VerticalPanel();
Localization loc = app.getLocalization();
Label labelCmdName = new Label(loc.getMenu("CommandName"));
int n = app.getKernel().getMacroNumber() + 1;
Label labelToolName = new Label(loc.getMenu("ToolName"));
tfToolName = new GTextBox();
tfToolName.setText(loc.getMenu("Tool") + n);
FlowPanel pToolName = new FlowPanel();
pToolName.add(labelToolName);
pToolName.add(tfToolName);
tfCmdName = new GTextBox();
tfCmdName.setText(tfToolName.getText());
FlowPanel pCmdName = new FlowPanel();
pCmdName.add(labelCmdName);
pCmdName.add(tfCmdName);
Label labelToolHelp = new Label(loc.getMenu("ToolHelp"));
tfToolHelp = new GTextBox();
FlowPanel pToolHelp = new FlowPanel();
pToolHelp.add(labelToolHelp);
pToolHelp.add(tfToolHelp);
tfCmdName.addBlurHandler(this);
tfCmdName.addKeyUpHandler(this);
tfToolName.addBlurHandler(this);
tfToolName.addKeyUpHandler(this);
tfToolHelp.addBlurHandler(this);
tfToolHelp.addKeyUpHandler(this);
mainWidget.add(pToolName);
mainWidget.add(pCmdName);
mainWidget.add(pToolHelp);
VerticalPanel iconPanel = new VerticalPanel();
icon = new NoDragImage(
ImgResourceHelper.safeURI(
GGWToolBar
.getMyIconResourceBundle().mode_tool_32()), 32);
Button labelIcon = new Button(loc.getMenu("Icon") + " ...");
labelIcon.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
(new UploadImageDialog((AppW) app, ICON_WIDTH, ICON_HEIGHT) {
@Override
public void onClick(ClickEvent ev) {
Object source = ev.getSource();
if (source == insertBtn) {
setIconFile(uploadImagePanel.getFileName(),
uploadImagePanel.getImageDataURL());
hide();
} else if (source == cancelBtn) {
hide();
}
}
}).center();
}
});
iconPanel.add(icon);
iconPanel.add(labelIcon);
showTool = new CheckBox(loc.getMenu("ShowInToolBar"));
showTool.setValue(true);
showTool.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> event) {
showToolChanged();
}
});
HorizontalPanel iconSelectShowPanel = new HorizontalPanel();
iconSelectShowPanel.add(iconPanel);
iconSelectShowPanel.add(showTool);
mainWidget.add(iconSelectShowPanel);
add(mainWidget);
}
/**
* Sets icon filename and updates thumbnail.
*
* @param fileName
* Path to new icon file.
* @param imgDataURL the data URL of the image
*/
public void setIconFile(String fileName, String imgDataURL) {
String data;
data = ImageResizer.resizeImage(imgDataURL, ICON_WIDTH, ICON_HEIGHT);
MD5EncrypterGWTImpl md5e = new MD5EncrypterGWTImpl();
String zip_directory = md5e.encrypt(data);
String fn = fileName;
int index = fileName.lastIndexOf('/');
if (index != -1) {
fn = fn.substring(index + 1, fn.length()); // filename
// without
}
fn = Util.processFilename(fn);
// filename will be of form
// "a04c62e6a065b47476607ac815d022cc\liar.gif"Mobi
iconFileName = zip_directory + '/' + fn;
app.getImageManager().addExternalImage(iconFileName, data);
icon.setUrl(app.getImageManager().getExternalImageSrc(iconFileName));
updateMacro();
macroChanged();
}
/**
* Sets icon filename and updates thumbnail.
*
* @param fileName
* Path to new icon file.
*/
public void setIconFileName(String fileName) {
if (fileName == null) {
return;
}
String imageURL = app.getImageManager().getExternalImageSrc(fileName);
if (imageURL != null) {
String dImageURL = ImageResizer.resizeImage(imageURL, ICON_WIDTH,
ICON_HEIGHT);
if (!imageURL.equals(dImageURL)) {
app.addExternalImage(fileName, dImageURL);
}
iconFileName = fileName;
icon.setUrl(app.getImageManager().getExternalImageSrc(iconFileName));
} else {
icon.setUrl(ImgResourceHelper.safeURI(
GGWToolBar.getMyIconResourceBundle()
.mode_tool_32()));
iconFileName = null;
}
updateMacro();
macroChanged();
}
/**
* Uses the textfields in this dialog to set the currently shown macro.
*
* @see #init()
*
*/
private void updateMacro() {
if (macro == null) {
return;
}
//
macro.setToolName(getToolName());
macro.setToolHelp(getToolHelp());
macro.setShowInToolBar(getShowTool());
macro.setIconFileName(getIconFileName());
// be careful when changing the command name of a macro
// as this is the internally used name
String cmdName = getCommandName();
if (!macro.getCommandName().equals(cmdName)) {
// try to change
boolean cmdNameChanged = app.getKernel().setMacroCommandName(macro,
cmdName);
if (!cmdNameChanged) {
// name used by macro: undo textfield change
tfCmdName.setText(macro.getCommandName());
}
}
// TODO
// if (managerDialog != null)
// managerDialog.repaint();
}
public String getCommandName() {
return tfCmdName.getText();
}
public String getToolName() {
return tfToolName.getText();
}
public String getToolHelp() {
return tfToolHelp.getText();
}
public boolean getShowTool() {
return showTool.getValue();
}
public String getIconFileName() {
return iconFileName;
}
public void setMacro(Macro m) {
this.macro = m;
tfCmdName.setText(m == null ? "" : m.getCommandName());
tfToolName.setText(m == null ? "" : m.getToolName());
tfToolHelp.setText(m == null ? "" : m.getToolHelp());
showTool.setValue(m != null && m.isShowInToolBar());
setIconFileName(m == null ? null : m.getIconFileName());
}
public Macro getMacro() {
Macro m = new Macro(app.getKernel(), tfCmdName.getText());
m.setToolName(getToolName());
m.setToolHelp(getToolHelp());
m.setShowInToolBar(getShowTool());
m.setIconFileName(getIconFileName());
return m;
}
public void setMacroChangeListener(MacroChangeListener listener) {
this.listener = listener;
}
@Override
public void onBlur(BlurEvent event) {
updateCmdName(event.getSource());
}
@Override
public void onKeyUp(KeyUpEvent event) {
updateCmdName(event.getSource());
showToolChanged();
}
private void updateCmdName(Object source) {
String cmdName = source == tfToolName ? tfToolName.getText()
: tfCmdName.getText();
// remove spaces
cmdName = cmdName.replaceAll(" ", "");
try {
String parsed = app.getKernel().getAlgebraProcessor()
.parseLabel(cmdName);
if (!parsed.equals(tfCmdName.getText())) {
tfCmdName.setText(parsed);
}
} catch (Error err) {
tfCmdName.setText(defaultToolName());
} catch (Exception ex) {
tfCmdName.setText(defaultToolName());
}
updateMacro();
}
private String defaultToolName() {
int n = app.getKernel().getMacroNumber() + 1;
return app.getLocalization().getMenu("Tool") + n;
}
private void macroChanged() {
Macro m = getMacro();
if (listener != null) {
listener.onMacroChange(m);
}
}
void showToolChanged() {
Macro m = getMacro();
m.setShowInToolBar(showTool.getValue());
if (listener != null) {
listener.onShowToolChange(m);
}
}
}