package org.geogebra.desktop.gui.view.probcalculator;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JToolBar;
import javax.swing.MenuElement;
import javax.swing.SwingConstants;
import org.geogebra.common.gui.menubar.OptionsMenu;
import org.geogebra.common.gui.view.data.PlotSettings;
import org.geogebra.common.gui.view.probcalculator.ProbabilityCalculatorStyleBar;
import org.geogebra.common.gui.view.probcalculator.ProbabilityCalculatorView;
import org.geogebra.common.main.App;
import org.geogebra.desktop.gui.util.MyToggleButtonD;
import org.geogebra.desktop.main.AppD;
import org.geogebra.desktop.main.LocalizationD;
import org.geogebra.desktop.util.GuiResourcesD;
/**
* StyleBar for the ProbabilityCalculator view
*
* @author G. Sturr
*
*/
public class ProbabilityCalculatorStyleBarD extends ProbabilityCalculatorStyleBar
implements ActionListener {
/** icon height in pixels */
private int iconHeight = 18;
/** rounding button */
JButton btnRounding;
/** rounding popup menu */
JPopupMenu roundingPopup;
JToolBar wrappedToolbar;
private MyToggleButtonD btnCumulative, btnLineGraph, btnGrid, btnStepGraph,
btnBarGraph, btnExport, btnNormalOverlay;
private final LocalizationD loc;
/**
* @param app
* application
* @param probCalc
* probability calculator
*/
public ProbabilityCalculatorStyleBarD(AppD app,
ProbabilityCalculatorViewD probCalc) {
super(app, probCalc);
this.wrappedToolbar = new JToolBar();
this.loc = app.getLocalization();
wrappedToolbar.setFloatable(false);
createGUI();
updateLayout();
updateGUI();
setLabels();
}
public void updateIcons() {
if (btnCumulative == null) {
return;
}
iconHeight = ((AppD) getApp()).getScaledIconSize();
btnCumulative.setIcon(((AppD) getApp())
.getScaledIcon(GuiResourcesD.CUMULATIVE_DISTRIBUTION));
btnLineGraph
.setIcon(((AppD) getApp()).getScaledIcon(GuiResourcesD.LINE_GRAPH));
btnStepGraph
.setIcon(((AppD) getApp()).getScaledIcon(GuiResourcesD.STEP_GRAPH));
btnBarGraph
.setIcon(((AppD) getApp()).getScaledIcon(GuiResourcesD.BAR_GRAPH));
btnGrid.setIcon(((AppD) getApp()).getScaledIcon(GuiResourcesD.GRID));
btnExport.setIcon(((AppD) getApp()).getScaledIcon(GuiResourcesD.EXPORT16));
btnNormalOverlay.setIcon(
((AppD) getApp()).getScaledIcon(GuiResourcesD.NORMAL_OVERLAY));
}
private void createGUI() {
iconHeight = ((AppD) getApp()).getScaledIconSize();
wrappedToolbar.removeAll();
buildOptionsButton();
btnCumulative = new MyToggleButtonD(((AppD) getApp()).getScaledIcon(
GuiResourcesD.CUMULATIVE_DISTRIBUTION), iconHeight);
btnCumulative.setSelected(getProbCalc().isCumulative());
btnCumulative.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
((ProbabilityCalculatorViewD) getProbCalc())
.setCumulative(!getProbCalc().isCumulative());
}
});
btnLineGraph = new MyToggleButtonD(
((AppD) getApp()).getScaledIcon(GuiResourcesD.LINE_GRAPH),
iconHeight);
btnLineGraph.addActionListener(this);
btnStepGraph = new MyToggleButtonD(
((AppD) getApp()).getScaledIcon(GuiResourcesD.STEP_GRAPH),
iconHeight);
btnStepGraph.addActionListener(this);
btnBarGraph = new MyToggleButtonD(
((AppD) getApp()).getScaledIcon(GuiResourcesD.BAR_GRAPH),
iconHeight);
btnBarGraph.addActionListener(this);
ButtonGroup gp = new ButtonGroup();
gp.add(btnBarGraph);
gp.add(btnLineGraph);
gp.add(btnStepGraph);
btnGrid = new MyToggleButtonD(
((AppD) getApp()).getScaledIcon(GuiResourcesD.GRID), iconHeight);
btnGrid.setSelected(getProbCalc().getPlotSettings().showGrid);
btnGrid.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
PlotSettings ps = getProbCalc().getPlotSettings();
ps.showGrid = !ps.showGrid;
getProbCalc().setPlotSettings(ps);
getProbCalc().updatePlotSettings();
}
});
// create export button
btnExport = new MyToggleButtonD(
((AppD) getApp()).getScaledIcon(GuiResourcesD.EXPORT16), iconHeight);
btnExport.setFocusable(false);
btnExport.addActionListener(this);
// create normal overlay button
btnNormalOverlay = new MyToggleButtonD(
((AppD) getApp()).getScaledIcon(GuiResourcesD.NORMAL_OVERLAY),
iconHeight);
btnNormalOverlay.setFocusable(false);
btnNormalOverlay.addActionListener(this);
}
/**
* Updates the button layout to fit the selected ProbabilityCalculator tab
*/
public void updateLayout() {
wrappedToolbar.removeAll();
if (((ProbabilityCalculatorViewD) getProbCalc()).isDistributionTabOpen()) {
// add(btnRounding);
// addSeparator();
// add(btnCumulative);
// addSeparator();
wrappedToolbar.add(btnLineGraph);
wrappedToolbar.add(btnStepGraph);
wrappedToolbar.add(btnBarGraph);
wrappedToolbar.addSeparator();
wrappedToolbar.add(btnNormalOverlay);
wrappedToolbar.addSeparator();
wrappedToolbar.add(btnExport);
// add(btnGrid); (grid doesn't work well with discrete graphs and
// point
// capturing)
} else {
// keep bar height uniform
wrappedToolbar.add(Box.createVerticalStrut(20));
}
wrappedToolbar.revalidate();
wrappedToolbar.repaint();
}
/**
* Updates the GUI
*/
public void updateGUI() {
iconHeight = ((AppD) getApp()).getScaledIconSize();
btnLineGraph.setVisible(((ProbabilityCalculatorViewD) getProbCalc())
.getProbManager().isDiscrete(getProbCalc().getSelectedDist()));
btnStepGraph.setVisible(((ProbabilityCalculatorViewD) getProbCalc())
.getProbManager().isDiscrete(getProbCalc().getSelectedDist()));
btnBarGraph.setVisible(((ProbabilityCalculatorViewD) getProbCalc())
.getProbManager().isDiscrete(getProbCalc().getSelectedDist()));
btnLineGraph.removeActionListener(this);
btnStepGraph.removeActionListener(this);
btnBarGraph.removeActionListener(this);
btnNormalOverlay.removeActionListener(this);
btnLineGraph.setSelected(getProbCalc()
.getGraphType() == ProbabilityCalculatorView.GRAPH_LINE);
btnStepGraph.setSelected(getProbCalc()
.getGraphType() == ProbabilityCalculatorView.GRAPH_STEP);
btnBarGraph.setSelected(getProbCalc()
.getGraphType() == ProbabilityCalculatorView.GRAPH_BAR);
btnNormalOverlay.setSelected(getProbCalc().isShowNormalOverlay());
btnNormalOverlay.setVisible(getProbCalc().isOverlayDefined());
btnLineGraph.addActionListener(this);
btnStepGraph.addActionListener(this);
btnBarGraph.addActionListener(this);
btnNormalOverlay.addActionListener(this);
}
/**
* Updates localized labels
*/
public void setLabels() {
btnRounding.setText(loc.getMenu("Rounding"));
btnExport.setToolTipText(loc.getMenu("Export"));
btnLineGraph.setToolTipText(loc.getMenu("LineGraph"));
btnStepGraph.setToolTipText(loc.getMenu("StepGraph"));
btnBarGraph.setToolTipText(loc.getMenu("BarChart"));
btnNormalOverlay.setToolTipText(loc.getMenu("OverlayNormalCurve"));
// btnCumulative.setToolTipText(loc.getMenu("Cumulative"));
}
/**
* Builds popup button with options menu items
*/
private void buildOptionsButton() {
btnRounding = new JButton(
((AppD) getApp()).getScaledIcon(GuiResourcesD.TRIANGLE_DOWN));
btnRounding.setHorizontalTextPosition(SwingConstants.LEFT);
btnRounding.setHorizontalAlignment(SwingConstants.LEFT);
roundingPopup = createRoundingPopup();
btnRounding.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// popup appears below the button
roundingPopup.show(wrappedToolbar.getParent(),
btnRounding.getLocation().x,
btnRounding.getLocation().y + btnRounding.getHeight());
}
});
updateMenuDecimalPlaces(roundingPopup);
((AppD) getApp()).setComponentOrientation(roundingPopup);
}
/**
* Update the menu with the current number format.
*/
private void updateMenuDecimalPlaces(JPopupMenu menu) {
int printFigures = getProbCalc().getPrintFigures();
int printDecimals = getProbCalc().getPrintDecimals();
if (menu == null) {
return;
}
int pos = -1;
if (printFigures >= 0) {
if (printFigures > 0
&& printFigures < OptionsMenu.figuresLookupLength()) {
pos = OptionsMenu.figuresLookup(printFigures);
}
} else {
if (printDecimals > 0
&& printDecimals < OptionsMenu.decimalsLookupLength()) {
pos = OptionsMenu.decimalsLookup(printDecimals);
}
}
try {
MenuElement[] m = menu.getSubElements();
((JRadioButtonMenuItem) m[pos]).setSelected(true);
} catch (Exception e) {
e.printStackTrace();
}
}
private JPopupMenu createRoundingPopup() {
JPopupMenu menu = new JPopupMenu();
String[] strDecimalSpaces = getApp().getLocalization().getRoundingMenu();
addRadioButtonMenuItems(menu, this, strDecimalSpaces,
App.getStrDecimalSpacesAC(), 0);
return menu;
}
/**
* Create a set of radio buttons automatically.
*
* @param menu
* @param al
* @param items
* @param actionCommands
* @param selectedPos
*/
private void addRadioButtonMenuItems(JPopupMenu menu, ActionListener al,
String[] items, String[] actionCommands, int selectedPos) {
JRadioButtonMenuItem mi;
ButtonGroup bg = new ButtonGroup();
// String label;
for (int i = 0; i < items.length; i++) {
if ("---".equals(items[i])) {
menu.addSeparator();
} else {
String text = loc.getMenu(items[i]);
mi = new JRadioButtonMenuItem(text);
mi.setFont(((AppD) getApp()).getFontCanDisplayAwt(text));
if (i == selectedPos) {
mi.setSelected(true);
}
mi.setActionCommand(actionCommands[i]);
mi.addActionListener(al);
bg.add(mi);
menu.add(mi);
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
// decimal places
if (cmd.endsWith("decimals")) {
try {
String decStr = cmd.substring(0, 2).trim();
int decimals = Integer.parseInt(decStr);
// Application.debug("decimals " + decimals);
((ProbabilityCalculatorViewD) getProbCalc())
.updatePrintFormat(decimals, -1);
} catch (Exception ex) {
getApp().showError(e.toString());
}
}
// significant figures
else if (cmd.endsWith("figures")) {
try {
String decStr = cmd.substring(0, 2).trim();
int figures = Integer.parseInt(decStr);
// Application.debug("figures " + figures);
((ProbabilityCalculatorViewD) getProbCalc()).updatePrintFormat(-1,
figures);
} catch (Exception ex) {
getApp().showError(e.toString());
}
}
else if (e.getSource() == btnLineGraph) {
if (btnLineGraph.isSelected()) {
getProbCalc()
.setGraphType(ProbabilityCalculatorView.GRAPH_LINE);
}
}
else if (e.getSource() == btnBarGraph) {
if (btnBarGraph.isSelected()) {
getProbCalc().setGraphType(ProbabilityCalculatorView.GRAPH_BAR);
}
}
else if (e.getSource() == btnStepGraph) {
if (btnStepGraph.isSelected()) {
getProbCalc()
.setGraphType(ProbabilityCalculatorView.GRAPH_STEP);
}
}
else if (e.getSource() == btnNormalOverlay) {
getProbCalc().setShowNormalOverlay(btnNormalOverlay.isSelected());
getProbCalc().updateAll();
}
else if (e.getSource() == btnExport) {
JPopupMenu menu = ((ProbabilityCalculatorViewD) getProbCalc())
.getPlotPanel().getContextMenu();
menu.show(btnExport,
-menu.getPreferredSize().width + btnExport.getWidth(),
btnExport.getHeight());
}
}
/**
* @return the wrapped toolbar
*/
public JToolBar getWrappedToolbar() {
return wrappedToolbar;
}
}