/*
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 org.geogebra.common.gui.dialog.options.model.ScriptInputModel;
import org.geogebra.common.gui.dialog.options.model.ScriptInputModel.IScriptInputListener;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.plugin.ScriptType;
import org.geogebra.common.util.AsyncOperation;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.web.gui.util.ScriptArea;
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.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.ListBox;
/**
* Input dialog for GeoText objects with additional option to set a
* "LaTeX formula" flag
*
* @author hohenwarter
*/
public class ScriptInputPanelW extends FlowPanel implements
IScriptInputListener /*,DocumentListener*/ {
private ScriptInputModel model;
private ListBox languageSelector;
private FlowPanel inputPanel;
private ScriptArea textArea;
private FlowPanel btPanel;
/**
* Input Dialog for a GeoButton object
*
* @param app
* application
* @param geo
* element
* @param cols
* number of columns
* @param rows
* number of rows
* @param updateScript
* whether this is for update script
* @param forceJavaScript
* whether to only allow JS
*
*/
public ScriptInputPanelW(AppW app, GeoElement geo, boolean updateScript,
boolean forceJavaScript) {
model = new ScriptInputModel(app, this, updateScript);
inputPanel = new FlowPanel();
textArea = new ScriptArea();
textArea.addKeyUpHandler(new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
applyScript();
}
});
inputPanel.add(textArea);
// init dialog using text
btPanel = new FlowPanel();
btPanel.setStyleName("optionsPanel");
languageSelector = new ListBox();
for (ScriptType type : ScriptType.values()) {
languageSelector
.addItem(app.getLocalization().getMenu(type.getName()));
}
model.setGeo(geo);
if (forceJavaScript) {
languageSelector.setSelectedIndex(1);
languageSelector.setEnabled(false);
model.setScriptType(ScriptType.JAVASCRIPT);
}
btPanel.add(languageSelector);
textArea.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
applyScript();
}});
languageSelector.addChangeHandler(new ChangeHandler(){
@Override
public void onChange(ChangeEvent event) {
model.setScriptType(ScriptType.values()[languageSelector
.getSelectedIndex()]);
}});
add(inputPanel);
add(btPanel);
}
/**
* Returns the inputPanel and sets its preferred size from the given row and
* column value. Includes option to hide/show line numbering.
*
* @param row
* @param column
* @param showLineNumbers
* @return
*/
public FlowPanel getInputPanel(int row, int column, boolean showLineNumbers) {
//
// GDimensionW dim = inputPanel.getTextAreaComponent().getPreferredSizeFromRowColumn(row, column);
// inputPanel.setPreferredSize(dim);
// inputPanel.setShowLineNumbering(showLineNumbers);
return inputPanel;
}
public FlowPanel getInputPanel() {
return inputPanel;
}
private void processInput() {
String inputText = textArea.getText();
model.processInput(inputText, new AsyncOperation<Boolean>() {
@Override
public void callback(Boolean obj) {
// TODO Auto-generated method stub
}
});
}
void applyScript() {
processInput();
model.setGeo(model.getGeo());
}
// private void setJSMode(boolean flag){
// javaScript = flag;
// ((GeoGebraEditorPane) inputPanel.getTextComponent()).setEditorKit(flag ?
// "javascript":"geogebra");
// }
/**
* apply edit modifications
*/
public void applyModifications() {
if (model.isEditOccurred()) {
model.setEditOccurred(false);
processInput();
}
}
// public void changedUpdate(DocumentEvent e) {
// // nothing to do
//
// }
//
// public void insertUpdate(DocumentEvent e) {
// model.handleDocumentEvent();
//
// }
//
// public void removeUpdate(DocumentEvent e) {
// model.handleDocumentEvent();
//
// }
public void updateFonts() {
// Font font = app.getPlainFont();
// languageSelector.setFont(font);
}
@Override
public void setInputText(String text) {
textArea.setText(text);
}
@Override
public String getInputText() {
return textArea.getText();
}
@Override
public void setLanguageIndex(int index, String name) {
// GeoGebraEditorPane editor = (GeoGebraEditorPane) inputPanel
// .getTextComponent();
// editor.getDocument().removeDocumentListener(this);
languageSelector.setSelectedIndex(index);
// editor.setEditorKit(name);
// editor.getDocument().addDocumentListener(this);
}
public void setGeo(GeoElement button) {
model.setGeo(button);
}
public void setGlobal() {
model.setGlobal();
}
public FlowPanel getButtonPanel() {
return btPanel;
}
@Override
public Object updatePanel(Object[] geos2) {
return this;
}
}