/*
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.desktop.gui.dialog;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.geogebra.common.gui.dialog.options.model.ScriptInputModel;
import org.geogebra.common.gui.dialog.options.model.ScriptInputModel.IScriptInputListener;
import org.geogebra.common.gui.view.algebra.DialogType;
import org.geogebra.common.kernel.geos.GeoButton;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.plugin.ScriptType;
import org.geogebra.common.util.AsyncOperation;
import org.geogebra.common.util.debug.Log;
import org.geogebra.desktop.gui.editor.GeoGebraEditorPane;
import org.geogebra.desktop.main.AppD;
/**
* Input dialog for GeoText objects with additional option to set a
* "LaTeX formula" flag
*
* @author hohenwarter
*/
public class ScriptInputDialog extends InputDialogD
implements IScriptInputListener, DocumentListener {
private ScriptInputModel model;
private JComboBox languageSelector;
/**
* Input Dialog for a GeoButton object
*
* @param app
* @param title
* @param button
* @param cols
* @param rows
* @param updateScript
* @param forceJavaScript
*/
public ScriptInputDialog(AppD app, String title, GeoButton button, int cols,
int rows, boolean updateScript, boolean forceJavaScript) {
super(app.getFrame(), false, app.getLocalization());
this.app = app;
model = new ScriptInputModel(app, this, updateScript);
createGUI(title, "", false, cols, rows, true, false, false, false,
DialogType.GeoGebraEditor);
// init dialog using text
JPanel centerPanel = new JPanel(new BorderLayout());
languageSelector = new JComboBox();
for (ScriptType type : ScriptType.values()) {
languageSelector.addItem(loc.getPlain(type.getName()));
}
languageSelector.addActionListener(this);
model.setGeo(button);
if (forceJavaScript) {
languageSelector.setSelectedIndex(1);
languageSelector.setEnabled(false);
model.setScriptType(ScriptType.JAVASCRIPT);
}
btPanel.add(languageSelector, 0);
centerPanel.add(inputPanel, BorderLayout.CENTER);
wrappedDialog.getContentPane().add(centerPanel, BorderLayout.CENTER);
centerOnScreen();
inputPanel.getTextComponent().getDocument().addDocumentListener(this);
}
/**
* 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 JPanel getInputPanel(int row, int column, boolean showLineNumbers) {
Dimension dim = ((GeoGebraEditorPane) inputPanel.getTextComponent())
.getPreferredSizeFromRowColumn(row, column);
inputPanel.setPreferredSize(dim);
inputPanel.setShowLineNumbering(showLineNumbers);
// add a small margin
inputPanel.getTextComponent()
.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
return inputPanel;
}
public JPanel getInputPanel() {
return inputPanel;
}
public JButton getApplyButton() {
return btApply;
}
private void processInput(AsyncOperation<Boolean> callback) {
inputText = inputPanel.getText();
model.processInput(inputText, callback);
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
try {
if (source == btOK || source == inputPanel.getTextComponent()) {
processInput(new AsyncOperation<Boolean>() {
@Override
public void callback(Boolean finished) {
if (wrappedDialog.isShowing()) {
// text dialog window is used and open
setVisible(!finished);
} else {
// text input field embedded in properties window
model.setGeo(model.getGeo());
}
}
});
} else if (source == btCancel) {
if (wrappedDialog.isShowing()) {
setVisible(false);
} else {
model.setGeo(model.getGeo());
}
} else if (source == languageSelector) {
// setJSMode(languageSelector.getSelectedIndex()==1);
model.setScriptType(ScriptType.values()[languageSelector
.getSelectedIndex()]);
}
} catch (Exception ex) {
// do nothing on uninitializedValue
ex.printStackTrace();
}
}
// private void setJSMode(boolean flag){
// javaScript = flag;
// ((GeoGebraEditorPane) inputPanel.getTextComponent()).setEditorKit(flag ?
// "javascript":"geogebra");
// }
/**
* Inserts geo into text and creates the string for a dynamic text, e.g.
* "Length of a = " + a + "cm"
*
* @param geo
*/
@Override
public void insertGeoElement(GeoElement geo) {
Log.debug("TODO: unimplemented");
}
/**
* apply edit modifications
*/
public void applyModifications() {
if (model.isEditOccurred()) {
model.setEditOccurred(false);
processInput(new AsyncOperation<Boolean>() {
@Override
public void callback(Boolean obj) {
// TODO Auto-generated method stub
}
});
}
}
@Override
public void changedUpdate(DocumentEvent e) {
// nothing to do
}
@Override
public void insertUpdate(DocumentEvent e) {
model.handleDocumentEvent();
}
@Override
public void removeUpdate(DocumentEvent e) {
model.handleDocumentEvent();
}
@Override
public void updateFonts() {
super.updateFonts();
Font font = app.getPlainFont();
languageSelector.setFont(font);
}
@Override
public void setInputText(String text) {
inputPanel.getTextComponent().setText(text);
}
@Override
public String getInputText() {
return inputPanel.getTextComponent().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();
}
@Override
public Object updatePanel(Object[] geos2) {
return this;
}
}