package org.geogebra.desktop.gui.dialog.options; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import org.geogebra.common.euclidian.EuclidianView; import org.geogebra.common.gui.SetLabels; import org.geogebra.common.gui.dialog.options.model.AxisModel; import org.geogebra.common.gui.dialog.options.model.AxisModel.IAxisModelListener; import org.geogebra.desktop.gui.NumberComboBox; import org.geogebra.desktop.gui.inputfield.MyTextFieldD; import org.geogebra.desktop.gui.util.FullWidthLayout; import org.geogebra.desktop.gui.util.LayoutUtil; import org.geogebra.desktop.main.AppD; import org.geogebra.desktop.main.LocalizationD; public class AxisPanel extends JPanel implements ActionListener, ItemListener, FocusListener, SetLabels, IAxisModelListener { private static final long serialVersionUID = 1L; private AxisModel model; protected JCheckBox cbShowAxis, cbAxisNumber, cbManualTicks, cbPositiveAxis, cbDrawAtBorder, cbAllowSelection; protected NumberComboBox ncbTickDist; protected JComboBox cbTickStyle, cbAxisLabel, cbUnitLabel; protected JTextField tfCross; private JLabel crossAt; private JLabel axisTicks; private JLabel axisLabel; private JLabel axisUnitLabel; private JLabel stickToEdge; private AppD app; protected EuclidianView view; private LocalizationD loc; /****************************************************** * @param app * @param view * @param axis */ public AxisPanel(AppD app, EuclidianView view, int axis) { this.app = app; this.loc = app.getLocalization(); this.view = view; model = new AxisModel(app, view, axis, this); setLayout(new FullWidthLayout()); String strAxisEn = model.getAxisName(); this.setBorder(LayoutUtil.titleBorder(loc.getMenu(strAxisEn))); // show axis cbShowAxis = new JCheckBox(loc.getMenu("Show" + strAxisEn)); cbShowAxis.addActionListener(this); JPanel showAxisPanel = LayoutUtil.flowPanel(cbShowAxis); // show numbers cbAxisNumber = new JCheckBox(loc.getMenu("ShowAxisNumbers")); cbAxisNumber.addActionListener(this); JPanel numberPanel = LayoutUtil.flowPanel(cbAxisNumber); // show positive axis only cbPositiveAxis = new JCheckBox(loc.getMenu("PositiveDirectionOnly")); cbPositiveAxis.addActionListener(this); JPanel showPosPanel = LayoutUtil.flowPanel(cbPositiveAxis); // allow selection cbAllowSelection = new JCheckBox(loc.getMenu("SelectionAllowed")); cbAllowSelection.addActionListener(this); JPanel allowSelectionPanel = LayoutUtil.flowPanel(cbAllowSelection); // ticks axisTicks = new JLabel(loc.getMenu("AxisTicks") + ":"); cbTickStyle = new JComboBox(); model.fillTicksCombo(); cbTickStyle.addActionListener(this); cbTickStyle.setEditable(false); JPanel showTicksPanel = LayoutUtil.flowPanel(axisTicks, cbTickStyle); // distance cbManualTicks = new JCheckBox(loc.getMenu("TickDistance") + ":"); cbManualTicks.addActionListener(this); ncbTickDist = new NumberComboBox(app); ncbTickDist.addItemListener(this); JPanel distancePanel = LayoutUtil.flowPanel(cbManualTicks, ncbTickDist); // axis and unit label cbAxisLabel = new JComboBox(); model.fillAxisCombo(); cbAxisLabel.addActionListener(this); cbAxisLabel.setEditable(true); axisLabel = new JLabel(loc.getMenu("AxisLabel") + ":"); axisUnitLabel = new JLabel(loc.getMenu("AxisUnitLabel") + ":"); cbUnitLabel = new JComboBox(); cbUnitLabel.setEditable(true); model.fillUnitLabel(); cbUnitLabel.addActionListener(this); JPanel labelPanel = LayoutUtil.flowPanel(axisLabel, cbAxisLabel, axisUnitLabel, cbUnitLabel); // cross at and stick to edge tfCross = new MyTextFieldD(app, 6); tfCross.addActionListener(this); crossAt = new JLabel(loc.getMenu("CrossAt") + ":"); cbDrawAtBorder = new JCheckBox(); cbDrawAtBorder.addActionListener(this); stickToEdge = new JLabel(loc.getMenu("StickToEdge")); stickToEdge = new JLabel(loc.getMenu("StickToEdge")); JPanel crossPanel = LayoutUtil.flowPanel(crossAt, tfCross, cbDrawAtBorder, stickToEdge); // add all panels add(showAxisPanel); add(numberPanel); add(showPosPanel); add(distancePanel); add(showTicksPanel); add(labelPanel); addCrossPanel(crossPanel); add(allowSelectionPanel); updatePanel(); } public void updateView(EuclidianView view) { this.view = view; model.setView(view); } protected void addCrossPanel(JPanel crossPanel) { add(crossPanel); } @Override public void actionPerformed(ActionEvent e) { doActionPerformed(e.getSource()); } private void doActionPerformed(Object source) { if (source == cbShowAxis) { model.showAxis(cbShowAxis.isSelected()); } else if (source == cbAxisNumber) { model.showAxisNumbers(cbAxisNumber.isSelected()); } else if (source == cbManualTicks) { model.applyTickDistance(cbManualTicks.isSelected()); } else if (source == cbUnitLabel) { Object ob = cbUnitLabel.getSelectedItem(); String text = (ob == null) ? null : ob.toString().trim(); model.applyUnitLabel(text); } else if (source == cbAxisLabel) { Object ob = cbAxisLabel.getSelectedItem(); String text = (ob == null) ? null : ob.toString().trim(); model.applyAxisLabel(text); } else if (source == cbTickStyle) { int type = cbTickStyle.getSelectedIndex(); model.applyTickStyle(type); } else if (source == tfCross) { model.applyCrossing(tfCross.getText()); } else if (source == cbPositiveAxis) { model.applyPositiveAxis(cbPositiveAxis.isSelected()); } else if (source == cbDrawAtBorder) { model.applyDrawAtBorder(cbDrawAtBorder.isSelected()); } else if (source == cbAllowSelection) { model.applyAllowSelection(cbAllowSelection.isSelected()); } updatePanel(); } @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() != ItemEvent.SELECTED) { return; } Object source = e.getSource(); if (source == ncbTickDist) { model.applyTickDistance(ncbTickDist.getValue()); } view.updateBackground(); updatePanel(); } public void updatePanel() { int axis = model.getAxis(); cbAxisNumber.removeActionListener(this); cbAxisNumber.setSelected(view.getShowAxesNumbers()[axis]); cbAxisNumber.addActionListener(this); cbManualTicks.removeActionListener(this); ncbTickDist.removeItemListener(this); cbManualTicks .setSelected(!view.isAutomaticAxesNumberingDistance()[axis]); ncbTickDist.setSelectedItem(model.getAxisDistance()); ncbTickDist.setEnabled(cbManualTicks.isSelected()); cbManualTicks.addActionListener(this); ncbTickDist.addItemListener(this); cbAxisLabel.removeActionListener(this); cbAxisLabel.setSelectedItem(view.getAxesLabels(true)[axis]); cbAxisLabel.addActionListener(this); cbUnitLabel.removeActionListener(this); cbUnitLabel.setSelectedItem(view.getAxesUnitLabels()[axis]); cbUnitLabel.addActionListener(this); /* * cbShowAxis.removeActionListener(this); * cbShowAxis.setSelected(view.getShowXaxis()); * cbShowAxis.addActionListener(this); */ cbTickStyle.removeActionListener(this); int type = view.getAxesTickStyles()[axis]; cbTickStyle.setSelectedIndex(type); cbTickStyle.addActionListener(this); cbShowAxis.removeActionListener(this); // cbShowAxis.setSelected(axis == 0 ? view.getShowXaxis() : // view.getShowYaxis()); cbShowAxis.setSelected(view.getShowAxis(axis)); cbShowAxis.addActionListener(this); tfCross.removeActionListener(this); if (view.getDrawBorderAxes()[axis]) { tfCross.setText(""); } else { tfCross.setText("" + view.getAxesCross()[axis]); } tfCross.setEnabled(!view.getDrawBorderAxes()[axis]); tfCross.addActionListener(this); tfCross.addFocusListener(this); cbPositiveAxis.removeActionListener(this); cbPositiveAxis.setSelected(view.getPositiveAxes()[axis]); cbPositiveAxis.addActionListener(this); cbDrawAtBorder.removeActionListener(this); cbDrawAtBorder.setSelected(view.getDrawBorderAxes()[axis]); cbDrawAtBorder.addActionListener(this); cbAllowSelection.removeActionListener(this); cbAllowSelection.setSelected(getModel().isSelectionAllowed()); cbAllowSelection.addActionListener(this); } @Override public void focusGained(FocusEvent e) { // do nothing } @Override public void focusLost(FocusEvent e) { // (needed for textfields) doActionPerformed(e.getSource()); } @Override public void setLabels() { String strAxisEn = model.getAxisName(); this.setBorder(LayoutUtil.titleBorder(loc.getMenu(strAxisEn))); this.setBorder(LayoutUtil.titleBorder(null)); cbShowAxis.setText(loc.getMenu("Show" + strAxisEn)); cbAxisNumber.setText(loc.getMenu("ShowAxisNumbers")); cbManualTicks.setText(loc.getMenu("TickDistance") + ":"); axisTicks.setText(loc.getMenu("AxisTicks") + ":"); cbPositiveAxis.setText(loc.getMenu("PositiveDirectionOnly")); axisLabel.setText(loc.getMenu("AxisLabel") + ":"); axisUnitLabel.setText(loc.getMenu("AxisUnitLabel") + ":"); crossAt.setText(loc.getMenu("CrossAt") + ":"); stickToEdge.setText(loc.getMenu("StickToEdge")); cbAllowSelection.setText(loc.getMenu("SelectionAllowed")); } protected double parseDouble(String text) { if (text == null || "".equals(text)) { return Double.NaN; } return app.getKernel().getAlgebraProcessor().evaluateToDouble(text); } protected String getString() { return model.getAxisName(); } public void updateFont() { Font font = app.getPlainFont(); setFont(font); cbShowAxis.setFont(font); cbAxisNumber.setFont(font); cbManualTicks.setFont(font); axisTicks.setFont(font); cbPositiveAxis.setFont(font); axisLabel.setFont(font); axisUnitLabel.setFont(font); crossAt.setFont(font); stickToEdge.setFont(font); ncbTickDist.setFont(font); cbTickStyle.setFont(font); cbAxisLabel.setFont(font); cbUnitLabel.setFont(font); tfCross.setFont(font); } @Override public void addTickItem(String item) { cbTickStyle.addItem(item); } @Override public void addAxisLabelItem(String item) { cbAxisLabel.addItem(item); } @Override public void addUnitLabelItem(String item) { cbUnitLabel.addItem(item); } @Override public void setCrossText(String text) { tfCross.setText(text); } public AxisModel getModel() { return model; } }