package org.geogebra.desktop.gui.dialog.options;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import org.geogebra.common.gui.SetLabels;
import org.geogebra.common.gui.dialog.options.OptionsCAS;
import org.geogebra.common.main.App;
import org.geogebra.common.main.Localization;
import org.geogebra.common.main.settings.CASSettings;
import org.geogebra.desktop.main.AppD;
/**
* Options for the CAS view.
*/
public class OptionsCASD extends OptionsCAS
implements OptionPanelD, ActionListener, SetLabels {
/**
* Application object.
*/
private AppD app;
private CASSettings casSettings;
/** */
private JLabel timeoutLabel;
/** */
private JComboBox cbTimeout;
/** show rational exponents as roots */
private JCheckBox cbShowRoots;
private JCheckBox cbShowNavigation;
private JPanel wrappedPanel;
/**
* Construct CAS option panel.
*
* @param app
*/
public OptionsCASD(AppD app) {
this.wrappedPanel = new JPanel(new BorderLayout());
this.app = app;
casSettings = app.getSettings().getCasSettings();
initGUI();
updateGUI();
setLabels();
}
/**
* Initialize the user interface.
*
* @remark updateGUI() will be called directly after this method
* @remark Do not use translations here, the option dialog will take care of
* calling setLabels()
*/
private void initGUI() {
JPanel timeoutPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(10, 1));
cbTimeout = new JComboBox(OptionsCAS.getTimeoutOptions());
cbTimeout.addActionListener(this);
timeoutLabel = new JLabel();
timeoutLabel.setLabelFor(cbTimeout);
cbShowRoots = new JCheckBox();
cbShowRoots.addActionListener(this);
cbShowRoots.setSelected(casSettings.getShowExpAsRoots());
cbShowNavigation = new JCheckBox();
cbShowNavigation.addActionListener(this);
cbShowNavigation.setSelected(casSettings.getShowExpAsRoots());
timeoutPanel.add(timeoutLabel);
timeoutPanel.add(cbTimeout);
panel.add(timeoutPanel);
panel.add(cbShowRoots);
panel.add(cbShowNavigation);
wrappedPanel.add(panel, BorderLayout.CENTER);
app.setComponentOrientation(panel);
}
/**
* Update the user interface, ie change selected values.
*
* @remark Do not call setLabels() here
*/
@Override
public void updateGUI() {
casSettings = app.getSettings().getCasSettings();
cbTimeout.setSelectedItem(OptionsCAS
.getTimeoutOption(casSettings.getTimeoutMilliseconds() / 1000));
cbShowRoots.setSelected(casSettings.getShowExpAsRoots());
cbShowNavigation.setSelected(app.showConsProtNavigation(App.VIEW_CAS));
}
/**
* React to actions.
*/
@Override
public void actionPerformed(ActionEvent e) {
// change timeout
if (e.getSource() == cbTimeout) {
casSettings.setTimeoutMilliseconds(
((Integer) cbTimeout.getSelectedItem()) * 1000);
}
if (e.getSource() == cbShowNavigation) {
app.toggleShowConstructionProtocolNavigation(App.VIEW_CAS);
}
/** show rational exponents as roots */
if (e.getSource() == cbShowRoots) {
casSettings.setShowExpAsRoots(cbShowRoots.isSelected());
}
}
/**
* Update the language of the user interface.
*/
@Override
public void setLabels() {
Localization loc = app.getLocalization();
timeoutLabel.setText(loc.getPlain("CasTimeout"));
cbShowRoots.setText(loc.getPlain("CASShowRationalExponentsAsRoots"));
cbShowNavigation.setText(loc.getMenu("NavigationBar"));
}
/**
* Apply changes
*/
@Override
public void applyModifications() {
// all controls fire immediately
}
@Override
public JPanel getWrappedPanel() {
return this.wrappedPanel;
}
@Override
public void revalidate() {
getWrappedPanel().revalidate();
}
@Override
public void setBorder(Border border) {
wrappedPanel.setBorder(border);
}
@Override
public void updateFont() {
Font font = app.getPlainFont();
timeoutLabel.setFont(font);
cbShowRoots.setFont(font);
cbTimeout.setFont(font);
cbShowNavigation.setFont(font);
}
@Override
public void setSelected(boolean flag) {
// see OptionsEuclidianD for possible implementation
}
}