package org.geogebra.web.web.export;
import java.util.HashMap;
import org.geogebra.common.euclidian.EuclidianView;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.main.Localization;
import org.geogebra.common.util.debug.Log;
import org.geogebra.web.html5.main.AppW;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
/**
* Scale panel for print dialog
*
*/
public class PrintScalePanelW extends FlowPanel {
private TextBox tfScale1, tfScale2, tfScaleFixed;
private EuclidianView ev;
// private NumberFormat nf;
private ListBox exportMode;
private FlowPanel cmModePanel, fixedSizeModePanel;
// private boolean noAction = false;
/** for each field remember if update handller is running */
HashMap<TextBox, Boolean> handlers = new HashMap<TextBox, Boolean>();
/**
* Scale modes TODO move to common?
*
*/
public enum PrintScaleModes {
/** scale using cm */
SIZEINCM,
/** fixed size in px */
FIXED_SIZE
}
private PrintScaleModes mode = PrintScaleModes.SIZEINCM;
private String jcbItemFixedSize;
/**
* @param app
* application
* @param eview
* euclidian view
*/
PrintScalePanelW(AppW app, EuclidianView eview) {
ev = eview;
Localization loc = app.getLocalization();
// nf = NumberFormat.getInstance(Locale.ENGLISH);
// nf.setMaximumFractionDigits(maxFracDigits);
// nf.setGroupingUsed(false);
this.addStyleName("printScalePanel");
Runnable updateCm = new Runnable() {
@Override
public void run() {
fireTextFieldUpdate();
}
};
Runnable updateFixedSize = new Runnable() {
@Override
public void run() {
fireFixedSizeTextFieldUpdate();
}
};
tfScale1 = getNumberField(updateCm);
tfScale2 = getNumberField(updateCm);
tfScaleFixed = getNumberField(updateFixedSize);
String jcbItemScaleInCentimeter = loc.getPlain("ScaleInCentimeter")
+ ":";
jcbItemFixedSize = loc.getPlain("FixedSize") + ":";
exportMode = new ListBox();
exportMode.addItem(jcbItemScaleInCentimeter);
exportMode.addItem(jcbItemFixedSize);
add(exportMode);
exportMode.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
switchMode();
}
});
fixedSizeModePanel = new FlowPanel();
Label aPixelsOnScreen = new Label(" "
+ loc.getPlain("APixelsOnScreen", "100") + " = ");
aPixelsOnScreen.addStyleName("aPixelsOnScreen");
fixedSizeModePanel.add(aPixelsOnScreen);
fixedSizeModePanel.add(tfScaleFixed);
fixedSizeModePanel.add(new Label(" cm"));
cmModePanel = new FlowPanel();
cmModePanel.add(tfScale1);
cmModePanel.add(new Label(" " + loc.getPlain("units") + " = "));
cmModePanel.add(tfScale2);
cmModePanel.add(new Label(" cm"));
add(cmModePanel);
updateScaleTextFields();
}
/**
* Switch between fixed size and cm scale
*/
void switchMode() {
Log.debug("switchMode: " + exportMode.getSelectedValue());
if (exportMode.getSelectedValue().toString().equals(jcbItemFixedSize)) {
mode = PrintScaleModes.FIXED_SIZE;
} else {
mode = PrintScaleModes.SIZEINCM;
}
switch (mode) {
case SIZEINCM:
remove(fixedSizeModePanel);
add(cmModePanel);
updateScaleTextFields();
break;
case FIXED_SIZE:
remove(cmModePanel);
add(fixedSizeModePanel);
updateFixedSizeTextFields();
break;
}
}
private void updateFixedSizeTextFields() {
double relScale = Kernel
.checkInteger(100 * ev.getPrintingScale() / ev.getXscale());
// setTextNoListener(tfScaleFixed, nf.format(relScale));
setTextNoListener(tfScaleFixed, relScale + "");
}
private void updateScaleTextFields() {
double scale = ev.getPrintingScale();
if (scale <= 1) {
setTextNoListener(tfScale2, "1");
// setTextNoListener(tfScale1, nf.format(1 / scale));
setTextNoListener(tfScale1, Kernel.checkInteger(1 / scale) + "");
} else {
// setTextNoListener(tfScale2, nf.format(scale));
setTextNoListener(tfScale2, Kernel.checkInteger(scale) + "");
setTextNoListener(tfScale1, "1");
}
}
private static void setTextNoListener(TextBox field, String s) {
// handlers.put(field, true);
field.setText(s);
}
/**
* Fixed scale changed
*/
void fireFixedSizeTextFieldUpdate() {
// boolean viewChanged = false;
try {
double userScale = Double.parseDouble(tfScaleFixed.getText());
if (!(Double.isInfinite(userScale) || Double.isNaN(userScale))) {
double scale = userScale * ev.getXscale() / 100;
ev.setPrintingScale(scale);
// viewChanged = true;
}
} catch (Exception e) {
e.printStackTrace();
}
updateFixedSizeTextFields();
// if (viewChanged) {
// notifyListeners();
// }
}
/**
* x-scale or y-scale changed
*/
void fireTextFieldUpdate() {
// boolean viewChanged = false;
try {
double numerator = Double.parseDouble(tfScale2.getText());
double denominator = Double.parseDouble(tfScale1.getText());
double scale = numerator / denominator;
if (!(Double.isInfinite(scale) || Double.isNaN(scale))) {
Log.debug("printing scale set: " + scale);
ev.setPrintingScale(scale);
// viewChanged = true;
}
} catch (Exception e) {
// invalid numbers, continue editing
}
updateScaleTextFields();
// if (viewChanged) {
// notifyListeners();
// }
}
private TextBox getNumberField(final Runnable run) {
final TextBox ret = new TextBox();
// ret.setColumns(maxFracDigits);
// ret.setHorizontalAlignment(SwingConstants.RIGHT);
ret.addDomHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
if (handlers.get(ret)) {
handlers.put(ret, false);
return;
}
run.run();
}
}, ChangeEvent.getType());
handlers.put(ret, false);
return ret;
}
}