/* GNU GENERAL LICENSE Copyright (C) 2006 The Lobo Project. Copyright (C) 2014 - 2017 Lobo Evolution 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; either verion 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General License for more details. You should have received a copy of the GNU General Public along with this program. If not, see <http://www.gnu.org/licenses/>. Contact info: lobochief@users.sourceforge.net; ivan.difrancesco@yahoo.it */ package org.lobobrowser.primary.gui.prefs; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Frame; import java.awt.HeadlessException; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.border.EmptyBorder; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import org.lobobrowser.primary.gui.AbstractSettingsUI; import org.lobobrowser.primary.info.SettingsInfo; /** * The Class PreferencesDialog. */ public class PreferencesDialog extends JDialog { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; /** The preferences panel. */ private final PreferencesPanel preferencesPanel; /** The preferences tree. */ private final PreferencesTree preferencesTree; /** * Instantiates a new preferences dialog. * * @param parent * the parent * @throws HeadlessException * the headless exception */ public PreferencesDialog(Frame parent) throws HeadlessException { super(parent); this.preferencesPanel = new PreferencesPanel(); this.preferencesTree = new PreferencesTree(); Container contentPane = this.getContentPane(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS)); contentPane.add(this.createLeftPane()); contentPane.add(this.createRightPane(this.preferencesPanel)); this.preferencesTree.initSelection(); } /** * Creates the left pane. * * @return the component */ private Component createLeftPane() { PreferencesTree prefsTree = this.preferencesTree; prefsTree.addTreeSelectionListener(new LocalTreeSelectionListener()); JScrollPane scrollPane = new JScrollPane(prefsTree); Dimension size = new Dimension(150, 200); scrollPane.setPreferredSize(size); scrollPane.setMinimumSize(size); scrollPane.setMaximumSize(new Dimension(150, Short.MAX_VALUE)); return scrollPane; } /** * Creates the right pane. * * @param prefsPanel * the prefs panel * @return the component */ private Component createRightPane(Container prefsPanel) { JPanel rightPanel = new JPanel(); rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS)); rightPanel.add(prefsPanel); rightPanel.add(this.createButtonsPanel()); return rightPanel; } /** * Creates the buttons panel. * * @return the component */ private Component createButtonsPanel() { JPanel buttonsPanel = new JPanel(); buttonsPanel.setBorder(new EmptyBorder(4, 4, 4, 4)); buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.X_AXIS)); buttonsPanel.add(Box.createHorizontalGlue()); JButton okButton = new JButton(); okButton.setAction(new OkCancelAction()); okButton.setText("OK"); JButton cancelButton = new JButton(); cancelButton.setAction(new OkCancelAction()); cancelButton.setText("Cancel"); JButton applyButton = new JButton(); applyButton.setAction(new ApplyAction()); applyButton.setText("Apply"); JButton defaultsButton = new JButton(); defaultsButton.setAction(new DefaultsAction()); defaultsButton.setText("Restore Defaults"); buttonsPanel.add(okButton); buttonsPanel.add(cancelButton); buttonsPanel.add(applyButton); buttonsPanel.add(defaultsButton); return buttonsPanel; } /** * Update preferences panel. * * @param settingsInfo * the settings info */ private void updatePreferencesPanel(SettingsInfo settingsInfo) { if (settingsInfo != null) { AbstractSettingsUI newUI = settingsInfo.createSettingsUI(); preferencesPanel.setSettingsUI(newUI); } else { preferencesPanel.setSettingsUI(null); } } /** * The Class OkAction. */ private class OkCancelAction extends AbstractAction { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event. * ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { PreferencesDialog.this.dispose(); } } /** * The Class ApplyAction. */ private class ApplyAction extends AbstractAction { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event. * ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { preferencesPanel.save(); } } /** * The Class DefaultsAction. */ private class DefaultsAction extends AbstractAction { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event. * ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { if (JOptionPane.showConfirmDialog(PreferencesDialog.this, "Are you sure you want to restore defaults?", "Confirm", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { preferencesPanel.restoreDefaults(); } } } /** * The listener interface for receiving localTreeSelection events. The class * that is interested in processing a localTreeSelection event implements * this interface, and the object created with that class is registered with * a component using the component's * <code>addLocalTreeSelectionListener</code> method. When the * localTreeSelection event occurs, that object's appropriate method is * invoked. * * @see LocalTreeSelectionEvent */ private class LocalTreeSelectionListener implements TreeSelectionListener { /* * (non-Javadoc) * * @see * javax.swing.event.TreeSelectionListener#valueChanged(javax.swing. * event. TreeSelectionEvent) */ @Override public void valueChanged(TreeSelectionEvent e) { TreePath path = e.getPath(); DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); SettingsInfo si = node == null ? null : (SettingsInfo) node.getUserObject(); updatePreferencesPanel(si); } } }