package org.geogebra.web.web.gui.dialog.options;
import java.util.ArrayList;
import org.geogebra.common.awt.GFont;
import org.geogebra.common.gui.dialog.options.model.TextOptionsModel;
import org.geogebra.common.gui.dialog.options.model.TextOptionsModel.ITextOptionsListener;
import org.geogebra.common.gui.inputfield.DynamicTextElement;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.main.GeoElementSelectionListener;
import org.geogebra.common.main.Localization;
import org.geogebra.common.main.OptionType;
import org.geogebra.common.util.AsyncOperation;
import org.geogebra.common.util.lang.Unicode;
import org.geogebra.web.html5.gui.inputfield.GeoTextEditor;
import org.geogebra.web.html5.gui.inputfield.ITextEditPanel;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.web.gui.dialog.TextEditAdvancedPanel;
import org.geogebra.web.web.gui.dialog.TextPreviewPanelW;
import org.geogebra.web.web.gui.properties.OptionPanel;
import org.geogebra.web.web.gui.properties.PropertiesViewW;
import org.geogebra.web.web.gui.util.MyToggleButtonW;
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.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;
import com.google.gwt.user.client.ui.ToggleButton;
class TextOptionsPanelW extends OptionPanel implements ITextOptionsListener,
ITextEditPanel, GeoElementSelectionListener {
/**
*
*/
TextOptionsModel model;
private Label decimalLabel;
ListBox lbFont;
ListBox lbSize;
ListBox lbDecimalPlaces;
MyToggleButtonW btnBold;
MyToggleButtonW btnItalic;
private ToggleButton btnLatex;
private FlowPanel secondLine;
private FlowPanel editorPanel;
private FlowPanel btnPanel;
private Button btnOk;
private Button btnCancel;
private boolean secondLineVisible = false;
GeoTextEditor editor;
private TextEditAdvancedPanel advancedPanel;
private TextPreviewPanelW previewer;
private Localization loc;
private AppW app;
private boolean mayDetectLaTeX = true;
public TextOptionsPanelW(TextOptionsModel model, AppW app) {
createGUI(model, app);
}
public void createGUI(TextOptionsModel model0, final AppW app) {
loc = app.getLocalization();
this.app = app;
model = model0;
model.setListener(this);
setModel(model);
editor = null;
editor = new GeoTextEditor(app, this);
editor.setStyleName("objectPropertiesTextEditor");
lbFont = new ListBox();
for (String item : model.getFonts()) {
lbFont.addItem(item);
}
lbFont.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
model.setEditGeoText(editor.getText());
model.applyFont(lbFont.getSelectedIndex() == 1);
}
});
lbSize = new ListBox();
for (String item : model.getFonts()) {
lbSize.addItem(item);
}
lbSize.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
model.setEditGeoText(editor.getText());
boolean isCustom = (lbSize.getSelectedIndex() == 7);
if (isCustom) {
String currentSize = Math
.round(model.getTextPropertiesAt(0)
.getFontSizeMultiplier() * 100)
+ "%";
app.getGuiManager()
.getOptionPane()
.showInputDialog(
app,
app
.getLocalization().getPlain("EnterPercentage"),
currentSize, null,
new AsyncOperation<String[]>() {
@Override
public void callback(
String[] dialogResult) {
model.applyFontSizeFromString(dialogResult[1]);
}
});
} else {
model.applyFontSizeFromIndex(lbSize.getSelectedIndex());
}
updatePreview();
}
});
// font size
// TODO require font phrases F.S.
// toggle buttons for bold and italic
btnBold = new MyToggleButtonW(loc.getMenu("Bold.Short"));
btnBold.addStyleName("btnBold");
btnItalic = new MyToggleButtonW(loc.getMenu("Italic.Short"));
btnItalic.addStyleName("btnItalic");
btnBold.setToolTipText(loc.getPlainTooltip("stylebar.Bold"));
btnItalic.setToolTipText(loc.getPlainTooltip("stylebar.Italic"));
btnLatex = new MyToggleButtonW("LaTeX");
// hack
// btnLatex.getElement().getStyle().setWidth(100, Unit.PX);
ClickHandler styleClick = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
model.setEditGeoText(editor.getText());
model.applyFontStyle(btnBold.getValue(), btnItalic.getValue());
updatePreview();
}
};
btnBold.addClickHandler(styleClick);
btnItalic.addClickHandler(styleClick);
btnLatex.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
model.setLaTeX(isLatex(), true);
// manual override -> ignore autodetect
mayDetectLaTeX = isLatex();
updatePreview();
}
});
btnLatex.addStyleName("btnLatex");
// decimal places
lbDecimalPlaces = new ListBox();
for (String item : loc.getRoundingMenu()) {
lbDecimalPlaces.addItem(item);
}
lbDecimalPlaces.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
model.setEditGeoText(editor.getText());
model.applyDecimalPlaces(lbDecimalPlaces.getSelectedIndex());
updatePreview();
}
});
// font, size
FlowPanel mainPanel = new FlowPanel();
mainPanel.setStyleName("textPropertiesTab");
FlowPanel firstLine = new FlowPanel();
firstLine.setStyleName("textOptionsToolBar");
firstLine.add(lbFont);
firstLine.add(lbSize);
firstLine.add(btnBold);
firstLine.add(btnItalic);
firstLine.add(btnLatex);
// bold, italic
secondLine = new FlowPanel();
secondLine.setStyleName("optionsPanel");
decimalLabel = new Label();
secondLine.add(decimalLabel);
secondLine.add(lbDecimalPlaces);
mainPanel.add(firstLine);
mainPanel.add(secondLine);
secondLineVisible = true;
editorPanel = new FlowPanel();
editorPanel.setStyleName("optionsInput");
editorPanel.add(editor);
advancedPanel = new TextEditAdvancedPanel(app, this);
editorPanel.add(advancedPanel);
mainPanel.add(editorPanel);
previewer = advancedPanel.getPreviewer();
btnPanel = new FlowPanel();
btnPanel.setStyleName("optionsPanel");
btnOk = new Button();
btnPanel.add(btnOk);
btnOk.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
model.applyEditedGeo(editor.getDynamicTextList(), isLatex(),
isSerif(), app.getDefaultErrorHandler());
((PropertiesViewW) app.getGuiManager().getPropertiesView())
.getOptionPanel(OptionType.OBJECTS, 1);
}
});
btnCancel = new Button();
btnPanel.add(btnCancel);
btnCancel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
model.cancelEditGeo();
}
});
mainPanel.add(btnPanel);
setWidget(mainPanel);
}
protected boolean isSerif() {
return lbFont.getSelectedIndex() == 1;
}
/**
* The editor must be recreated each time the options panel is re-attached
* to the DOM
*/
@Override
public void reinitEditor() {
int index = editorPanel.getWidgetIndex(editor);
editorPanel.remove(editor);
editor = new GeoTextEditor(this.app, this);
editor.setStyleName("objectPropertiesTextEditor");
editorPanel.insert(editor, index);
}
@Override
public OptionPanel updatePanel(Object[] geos) {
getModel().setGeos(geos);
if (!getModel().checkGeos()) {
model.cancelEditGeo();
return null;
}
if (geos.length > 0 && geos[0] instanceof GeoText) {
btnLatex.setValue(((GeoText) geos[0]).isLaTeX());
}
getModel().updateProperties();
setLabels();
advancedPanel.updateGeoList();
if (getModel().hasPreview()) {
updatePreview();
editor.updateFonts();
}
return this;
}
@Override
public void setLabels() {
String[] fontSizes = loc.getFontSizeStrings();
int selectedIndex = lbSize.getSelectedIndex();
lbSize.clear();
for (int i = 0; i < fontSizes.length; ++i) {
lbSize.addItem(fontSizes[i]);
}
lbSize.addItem(loc.getMenu("Custom") + Unicode.ellipsis);
lbSize.setSelectedIndex(selectedIndex);
decimalLabel.setText(loc.getMenu("Rounding") + ":");
btnBold.setText(loc.getMenu("Bold.Short"));
btnItalic.setText(loc.getMenu("Italic.Short"));
btnLatex.setText(loc.getPlain("LaTeXFormula"));
btnBold.setToolTipText(loc.getPlainTooltip("stylebar.Bold"));
btnItalic.setToolTipText(loc.getPlainTooltip("stylebar.Italic"));
if (advancedPanel != null) {
advancedPanel.setLabels();
}
btnOk.setText(loc.getMenu("OK"));
btnCancel.setText(loc.getMenu("Cancel"));
}
@Override
public void setWidgetsVisible(boolean showFontDetails, boolean isButton) {
// hide most options for Textfields
lbFont.setVisible(showFontDetails);
btnBold.setVisible(showFontDetails);
btnItalic.setVisible(showFontDetails);
secondLine.setVisible(showFontDetails);
secondLineVisible = showFontDetails;
if (isButton) {
secondLine.setVisible(!showFontDetails);
secondLineVisible = !showFontDetails;
}
}
@Override
public void setFontSizeVisibleOnly() {
lbSize.setVisible(true);
lbFont.setVisible(false);
btnBold.setVisible(false);
btnItalic.setVisible(false);
secondLine.setVisible(false);
}
@Override
public void selectSize(int index) {
lbSize.setSelectedIndex(index);
}
@Override
public void selectFont(int index) {
lbFont.setSelectedIndex(index);
}
@Override
public void selectDecimalPlaces(int index) {
lbDecimalPlaces.setSelectedIndex(index);
}
@Override
public void setSecondLineVisible(boolean noDecimals) {
if (noDecimals) {
if (secondLineVisible) {
secondLineVisible = false;
}
} else {
if (!secondLineVisible) {
secondLineVisible = true;
}
secondLine.setVisible(secondLineVisible);
}
editorPanel.setVisible(model.isTextEditable());
lbFont.setVisible(model.isTextEditable());
btnLatex.setVisible(model.isTextEditable());
btnPanel.setVisible(model.isTextEditable());
}
@Override
public void updatePreview() {
updatePreviewPanel();
}
boolean isLatex() {
return btnLatex.getValue();
}
@Override
public void selectFontStyle(int style) {
btnBold.setValue(style == GFont.BOLD
|| style == (GFont.BOLD + GFont.ITALIC));
btnItalic.setValue(style == GFont.ITALIC
|| style == (GFont.BOLD + GFont.ITALIC));
}
@Override
public void updatePreviewPanel() {
if (previewer == null) {
return;
}
previewer.updateFonts();
boolean wasLaTeX = isLatex();
boolean isLaTeX = previewer
.updatePreviewText(model.getEditGeo(), model.getGeoGebraString(
editor.getDynamicTextList(), isLatex()), isLatex(),
mayDetectLaTeX);
if (!wasLaTeX && isLaTeX) {
btnLatex.setValue(true);
if (model.getEditGeo() != null) {
model.getEditGeo().setLaTeX(true, false);
}
}
}
@Override
public void setEditorText(ArrayList<DynamicTextElement> list) {
editor.setText(list);
}
@Override
public void setEditorText(String text) {
editor.setText(text);
}
@Override
public void insertGeoElement(GeoElement geo) {
editor.insertGeoElement(geo);
}
@Override
public void insertTextString(String text, boolean isLatex) {
editor.insertTextString(text, isLatex);
}
@Override
public GeoText getEditGeo() {
return model.getEditGeo();
}
@Override
public void geoElementSelected(GeoElement geo, boolean addToSelection) {
model.cancelEditGeo();
}
@Override
public void ensureLaTeX() {
btnLatex.setValue(true);
model.getEditGeo().setLaTeX(true, false);
updatePreviewPanel();
}
}