package org.geogebra.desktop.gui.dialog.options; import java.awt.BorderLayout; 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 javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JToggleButton; import javax.swing.SwingConstants; import javax.swing.border.Border; import org.geogebra.common.gui.SetLabels; import org.geogebra.common.gui.dialog.options.OptionsLayout; import org.geogebra.common.main.App.InputPosition; import org.geogebra.common.main.Localization; import org.geogebra.common.main.settings.Settings; import org.geogebra.desktop.gui.util.FullWidthLayout; import org.geogebra.desktop.gui.util.LayoutUtil; import org.geogebra.desktop.gui.util.LayoutUtil.TitlePanel; import org.geogebra.desktop.main.AppD; import org.geogebra.desktop.util.GuiResourcesD; /** * Layout options for the options dialog. */ public class OptionsLayoutD extends OptionsLayout implements OptionPanelD, ActionListener, FocusListener, SetLabels { private AppD app; private Settings settings; /** */ private JPanel sideBarPanel, inputBarPanel, toolbarPanel, perspectivesPanel; /** */ private JCheckBox ckShowInputHelp, ckShowTitleBar, ckAllowStyleBar, ckShowInputBar, ckShowToolbar, ckShowToolHelp, ckShowMenuBar, ckShowSideBar; private JToggleButton rbToolbarNorth, rbToolbarSouth, rbToolbarEast, rbToolbarWest, rbSidebarWest, rbSidebarEast; private JRadioButton rbPespectiveSidebar, rbButtonSidebar; private JToggleButton rbInputBarSouth, rbInputBarNorth; private JLabel lblInputBarPosition; /** */ private ButtonGroup inputbarPosGroup, toolBarPosGroup; private TitlePanel menuBarPanel; private JPanel wrappedPanel; /** * Construct layout option panel. * * @param app */ public OptionsLayoutD(AppD app) { this.wrappedPanel = new JPanel(new BorderLayout()); this.app = app; this.settings = app.getSettings(); initGUI(); updateGUI(); setLabels(); } public void reinit() { wrappedPanel.removeAll(); 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() { initInputbarPanel(); initPerspectivesPanel(); initToolBarPanel(); initMenuBarPanel(); initSideBarPanel(); JPanel panel = new JPanel(); panel.setLayout(new FullWidthLayout()); panel.add(inputBarPanel); panel.add(toolbarPanel); panel.add(perspectivesPanel); // panel.add(menuBarPanel); panel.add(sideBarPanel); panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); JScrollPane scrollPane = new JScrollPane(panel); scrollPane.getVerticalScrollBar().setUnitIncrement(4); // scrollPane.setBorder(BorderFactory.createEmptyBorder()); wrappedPanel.add(scrollPane, BorderLayout.CENTER); } /** * Initialize the perspectives (view) panel. */ private void initPerspectivesPanel() { perspectivesPanel = new JPanel(); perspectivesPanel .setLayout(new BoxLayout(perspectivesPanel, BoxLayout.Y_AXIS)); ckShowTitleBar = new JCheckBox(); ckShowTitleBar.addActionListener(this); perspectivesPanel.add(LayoutUtil.flowPanel(ckShowTitleBar)); ckAllowStyleBar = new JCheckBox(); ckAllowStyleBar.addActionListener(this); perspectivesPanel.add(LayoutUtil.flowPanel(ckAllowStyleBar)); } /** * Initialize the input bar panel. */ private void initInputbarPanel() { inputBarPanel = new JPanel(); inputBarPanel.setLayout(new BoxLayout(inputBarPanel, BoxLayout.Y_AXIS)); ckShowInputBar = new JCheckBox(); ckShowInputBar.addActionListener(this); int tab = 20; inputbarPosGroup = new ButtonGroup(); rbInputBarNorth = new JToggleButton( app.getScaledIcon(GuiResourcesD.LAYOUT_NORTH)); rbInputBarNorth.addActionListener(this); inputbarPosGroup.add(rbInputBarNorth); rbInputBarSouth = new JToggleButton( app.getScaledIcon(GuiResourcesD.LAYOUT_SOUTH)); rbInputBarSouth.addActionListener(this); inputbarPosGroup.add(rbInputBarSouth); lblInputBarPosition = new JLabel(); inputBarPanel.add(LayoutUtil.flowPanel(ckShowInputBar, Box.createHorizontalStrut(5), rbInputBarNorth, rbInputBarSouth)); ckShowInputHelp = new JCheckBox(); ckShowInputHelp.addActionListener(this); inputBarPanel.add(LayoutUtil.flowPanel(tab, ckShowInputHelp)); } /** * Initialize the sidebar panel. */ private void initSideBarPanel() { sideBarPanel = new JPanel(); sideBarPanel.setLayout(new BoxLayout(sideBarPanel, BoxLayout.Y_AXIS)); ckShowSideBar = new JCheckBox(); ckShowSideBar.addActionListener(this); ButtonGroup grp = new ButtonGroup(); rbSidebarWest = new JToggleButton( app.getScaledIcon(GuiResourcesD.LAYOUT_WEST)); rbSidebarWest.addActionListener(this); grp.add(rbSidebarWest); rbSidebarEast = new JToggleButton( app.getScaledIcon(GuiResourcesD.LAYOUT_EAST)); rbSidebarEast.setSelected(true); rbSidebarEast.addActionListener(this); grp.add(rbSidebarEast); ButtonGroup grp2 = new ButtonGroup(); rbPespectiveSidebar = new JRadioButton(); rbPespectiveSidebar.addActionListener(this); rbPespectiveSidebar.setSelected(true); grp2.add(rbPespectiveSidebar); rbButtonSidebar = new JRadioButton(); rbButtonSidebar.addActionListener(this); grp2.add(rbButtonSidebar); sideBarPanel.add(LayoutUtil.flowPanel(ckShowSideBar, Box.createHorizontalStrut(5), rbSidebarWest, rbSidebarEast)); // Don't show perspective/viewButton option (saved for 5.0 development) // sideBarPanel.add(OptionsUtil.flowPanel(tab, rbPespectiveSidebar, // rbButtonSidebar)); } /** * Initialize the menu bar panel. */ private void initMenuBarPanel() { menuBarPanel = new LayoutUtil.TitlePanel(); ckShowMenuBar = new JCheckBox(); ckShowMenuBar.addActionListener(this); menuBarPanel.add(LayoutUtil.flowPanel(ckShowMenuBar)); } /** * Initialize the tool bar panel. */ private void initToolBarPanel() { toolbarPanel = new JPanel(); toolbarPanel.setLayout(new BoxLayout(toolbarPanel, BoxLayout.Y_AXIS)); ckShowToolbar = new JCheckBox(); ckShowToolbar.addActionListener(this); ckShowToolHelp = new JCheckBox(); ckShowToolHelp.addActionListener(this); // TODO need to create a method to set a flag for this in the gui // manager ckShowToolHelp.setSelected(true); int tab = 20; toolBarPosGroup = new ButtonGroup(); rbToolbarNorth = new JToggleButton( app.getScaledIcon(GuiResourcesD.LAYOUT_NORTH)); rbToolbarNorth.addActionListener(this); toolBarPosGroup.add(rbToolbarNorth); rbToolbarSouth = new JToggleButton( app.getScaledIcon(GuiResourcesD.LAYOUT_SOUTH)); rbToolbarSouth.addActionListener(this); toolBarPosGroup.add(rbToolbarSouth); rbToolbarEast = new JToggleButton( app.getScaledIcon(GuiResourcesD.LAYOUT_EAST)); rbToolbarEast.addActionListener(this); toolBarPosGroup.add(rbToolbarEast); rbToolbarWest = new JToggleButton( app.getScaledIcon(GuiResourcesD.LAYOUT_WEST)); rbToolbarWest.addActionListener(this); toolBarPosGroup.add(rbToolbarWest); lblInputBarPosition = new JLabel(); toolbarPanel.add(LayoutUtil.flowPanel(ckShowToolbar, Box.createHorizontalStrut(5), rbToolbarNorth, Box.createHorizontalStrut(5), rbToolbarSouth, Box.createHorizontalStrut(5), rbToolbarWest, Box.createHorizontalStrut(5), rbToolbarEast)); toolbarPanel.add(LayoutUtil.flowPanel(tab, ckShowToolHelp)); } /** * Update the user interface, ie change selected values. * * @remark Do not call setLabels() here */ @Override public void updateGUI() { ckShowInputBar.setSelected(app.showAlgebraInput()); ckShowInputHelp.setSelected(app.showInputHelpToggle()); rbToolbarNorth .setSelected(app.getToolbarPosition() == SwingConstants.NORTH); rbToolbarSouth .setSelected(app.getToolbarPosition() == SwingConstants.SOUTH); rbToolbarWest .setSelected(app.getToolbarPosition() == SwingConstants.WEST); rbToolbarEast .setSelected(app.getToolbarPosition() == SwingConstants.EAST); boolean inputOnTop = app.getInputPosition() == InputPosition.top; rbInputBarNorth.setSelected(inputOnTop); rbInputBarSouth.setSelected(!inputOnTop); ckShowToolbar.setSelected(app.showToolBar()); ckShowToolHelp.setSelected(app.showToolBarHelp()); rbToolbarNorth.setEnabled(ckShowToolbar.isSelected()); rbToolbarSouth.setEnabled(ckShowToolbar.isSelected()); rbToolbarEast.setEnabled(ckShowToolbar.isSelected()); rbToolbarWest.setEnabled(ckShowToolbar.isSelected()); rbInputBarNorth.setEnabled(ckShowInputBar.isSelected()); rbInputBarSouth.setEnabled(ckShowInputBar.isSelected()); // ckIgnoreDocumentLayout.setSelected(settings.getLayout() // .isIgnoringDocumentLayout()); ckShowTitleBar.setSelected(settings.getLayout().showTitleBar()); ckAllowStyleBar.setSelected(settings.getLayout().isAllowingStyleBar()); ckShowMenuBar.setSelected(app.showMenuBar()); ckShowSideBar.removeActionListener(this); ckShowSideBar.setSelected(app.isShowDockBar()); ckShowSideBar.addActionListener(this); rbSidebarEast.removeActionListener(this); rbSidebarWest.removeActionListener(this); rbButtonSidebar.removeActionListener(this); rbPespectiveSidebar.removeActionListener(this); rbSidebarEast.setSelected(app.getDockBar().isEastOrientation()); rbButtonSidebar.setSelected(app.getDockBar().isShowButtonBar()); rbSidebarEast.addActionListener(this); rbSidebarWest.addActionListener(this); rbButtonSidebar.addActionListener(this); rbPespectiveSidebar.addActionListener(this); revalidate(); } /** * Values changed. */ @Override public void actionPerformed(ActionEvent e) { Object source = e.getSource(); // dock panel (perspective) settings if (source == ckShowTitleBar) { settings.getLayout().setShowTitleBar(ckShowTitleBar.isSelected()); // } else if (source == ckIgnoreDocumentLayout) { // settings.getLayout().setIgnoreDocumentLayout( // ckIgnoreDocumentLayout.isSelected()); } else if (source == ckAllowStyleBar) { settings.getLayout().setAllowStyleBar(ckAllowStyleBar.isSelected()); // tool bar settings } else if (source == ckShowToolbar || source == ckShowToolHelp) { app.setShowToolBar(ckShowToolbar.isSelected(), ckShowToolHelp.isSelected()); app.updateApplicationLayout(); app.updateToolBarLayout(); app.getGuiManager().updateToolbar(); } else if (source == rbToolbarNorth) { app.setToolbarPosition(SwingConstants.NORTH, true); } else if (source == rbToolbarSouth) { app.setToolbarPosition(SwingConstants.SOUTH, true); } else if (source == rbToolbarEast) { app.setToolbarPosition(SwingConstants.EAST, true); } else if (source == rbToolbarWest) { app.setToolbarPosition(SwingConstants.WEST, true); } // input bar settings else if (source == rbInputBarNorth) { app.setInputPosition(InputPosition.top, true); } else if (source == rbInputBarSouth) { app.setInputPosition(InputPosition.bottom, true); } else if (source == ckShowInputBar) { app.setShowAlgebraInput(ckShowInputBar.isSelected(), true); } else if (source == ckShowInputHelp) { app.setShowInputHelpToggle(ckShowInputHelp.isSelected()); } // menubar settings else if (source == ckShowMenuBar) { app.setShowMenuBar(ckShowMenuBar.isSelected()); app.getGuiManager().updateMenuBarLayout(); } // sidebar settings else if (source == ckShowSideBar) { app.setShowDockBar(ckShowSideBar.isSelected()); } else if (source == rbButtonSidebar || source == rbPespectiveSidebar) { app.getDockBar().setShowButtonBar(rbButtonSidebar.isSelected()); } else if (source == rbSidebarEast || source == rbSidebarWest) { app.setDockBarEast(rbSidebarEast.isSelected()); app.setShowDockBar(ckShowSideBar.isSelected()); } wrappedPanel.requestFocus(); updateGUI(); } /** * Not implemented. */ @Override public void focusGained(FocusEvent e) { // nothing to do } /** * Apply textfield changes. */ @Override public void focusLost(FocusEvent e) { // nothing to do } /** * Update the language of the user interface. */ @Override public void setLabels() { Localization loc = app.getLocalization(); // input bar panel inputBarPanel .setBorder(LayoutUtil.titleBorder(loc.getMenu("InputField"))); ckShowInputBar.setText(loc.getMenu("Show")); ckShowInputHelp.setText(loc.getMenu("CmdList")); lblInputBarPosition.setText(loc.getMenu("Position")); // tool bar panel toolbarPanel.setBorder(LayoutUtil.titleBorder(loc.getMenu("Toolbar"))); ckShowToolbar.setText(loc.getMenu("Show")); ckShowToolHelp.setText(loc.getMenu("ShowToolBarHelp")); // perspectives panel perspectivesPanel .setBorder(LayoutUtil.titleBorder(loc.getMenu("View"))); // ckIgnoreDocumentLayout.setText(loc.getMenu("IgnoreDocumentLayout")); ckShowTitleBar.setText(loc.getMenu("ShowTitleBar")); ckAllowStyleBar.setText(loc.getMenu("AllowStyleBar")); // menu bar panel menuBarPanel.setTitle(loc.getMenu("Miscellaneous")); ckShowMenuBar.setText(loc.getMenu("ShowMenuBar")); // side bar panel sideBarPanel.setBorder(LayoutUtil.titleBorder(loc.getMenu("Sidebar"))); ckShowSideBar.setText(loc.getMenu("ShowSidebar")); rbPespectiveSidebar.setText(loc.getMenu("PerspectivePanel")); rbButtonSidebar.setText(loc.getMenu("ViewPanel")); } @Override public JPanel getWrappedPanel() { return this.wrappedPanel; } @Override public void revalidate() { getWrappedPanel().revalidate(); } @Override public void setBorder(Border border) { this.wrappedPanel.setBorder(border); } @Override public void applyModifications() { // override this method to make the properties view apply modifications // when panel changes } @Override public void updateFont() { Font font = app.getPlainFont(); // input bar panel inputBarPanel.setFont(font); ckShowInputBar.setFont(font); ckShowInputHelp.setFont(font); lblInputBarPosition.setFont(font); // tool bar panel toolbarPanel.setFont(font); ckShowToolbar.setFont(font); ckShowToolHelp.setFont(font); // perspectives panel perspectivesPanel.setFont(font); ckShowTitleBar.setFont(font); ckAllowStyleBar.setFont(font); // menu bar panel menuBarPanel.setFont(font); ckShowMenuBar.setFont(font); // sidebar panel sideBarPanel.setFont(font); ckShowSideBar.setFont(font); reinit(); } @Override public void setSelected(boolean flag) { // see OptionsEuclidianD for possible implementation } }