/*
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2012 Maxence Bernard
*
* muCommander 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 version 3 of the License, or
* (at your option) any later version.
*
* muCommander 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 Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.mucommander.ui.dialog.startup;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import com.mucommander.conf.MuConfigurations;
import com.mucommander.conf.MuPreference;
import com.mucommander.text.Translator;
import com.mucommander.ui.dialog.FocusDialog;
import com.mucommander.ui.layout.YBoxPanel;
import com.mucommander.ui.theme.Theme;
import com.mucommander.ui.theme.ThemeManager;
/**
* Dialog box allowing users to select misc. setup options for muCommander.
* @author Nicolas Rinaudo
*/
public class InitialSetupDialog extends FocusDialog implements ActionListener {
// - Instance fields -----------------------------------------------------------------
// -----------------------------------------------------------------------------------
/** All available look and feels. */
private UIManager.LookAndFeelInfo lfInfo[];
/** Used to select a startup theme. */
private JComboBox themeComboBox;
/** Used to select a look and feel. */
private JComboBox lfComboBox;
/** Used to validate the user's choice. */
private JButton okButton;
// - Initialisation ------------------------------------------------------------------
// -----------------------------------------------------------------------------------
/**
* Creates the dialog's theme panel.
* @return the dialog's theme panel.
*/
private JPanel createThemePanel() {
JPanel themePanel; // Theme panel.
JPanel tempPanel; // Temporary panel used to hold the dialog's description.
Iterator<Theme> themes; // All available themes.
Theme theme; // Currently analyzed theme.
int index; // Index of the currently analyzed theme.
int selectedIndex; // Index of the current theme in the combo box.
// Initialises the theme panel.
themePanel = new YBoxPanel();
themePanel.setAlignmentX(LEFT_ALIGNMENT);
themePanel.setBorder(BorderFactory.createTitledBorder(Translator.get("prefs_dialog.themes")));
// Adds the panel description.
tempPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
tempPanel.add(new JLabel(Translator.get("setup.theme") + ':'));
themePanel.add(tempPanel);
// Adds the theme combo box.
themeComboBox = new JComboBox();
themes = ThemeManager.availableThemes();
index = 0;
selectedIndex = 0;
// Adds all themes to the combo box.
while(themes.hasNext()) {
themeComboBox.addItem(theme = themes.next());
if(ThemeManager.isCurrentTheme(theme))
selectedIndex = index;
index++;
}
// Selects the current theme.
themeComboBox.setSelectedIndex(selectedIndex);
themeComboBox.addActionListener(this);
themePanel.add(themeComboBox);
return themePanel;
}
/**
* Creates the dialog's look and feel panel.
* @return the dialog's look and feel panel.
*/
private JPanel createLookAndFeelPanel() {
JPanel lfPanel; // Look and feel panel.
JPanel tempPanel; // Temporary panel used to hold the dialog's description.
int selectedIndex; // Index of the current look and feel in the list.
String currentLf; // Name of the current look&feel.
String buffer; // Buffer for look&feel names.
// Initialises the theme panel.
lfPanel = new YBoxPanel();
lfPanel.setAlignmentX(LEFT_ALIGNMENT);
lfPanel.setBorder(BorderFactory.createTitledBorder(Translator.get("prefs_dialog.look_and_feel")));
// Adds the panel description.
tempPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
tempPanel.add(new JLabel(Translator.get("setup.look_and_feel") + ':'));
lfPanel.add(tempPanel);
// Initialises the l&f combo box.
lfComboBox = new JComboBox();
lfInfo = UIManager.getInstalledLookAndFeels();
currentLf = UIManager.getLookAndFeel().getName();
selectedIndex = -1;
// Goes through all available look&feels and selects the current one.
for(int i = 0; i < lfInfo.length; i++) {
buffer = lfInfo[i].getName();
// Tries to select current L&F
if(currentLf.equals(buffer))
selectedIndex = i;
// Under Mac OS X, Mac L&F is either reported as 'MacOS' or 'MacOS Adaptative'
// so we need this test
else if(selectedIndex == -1 && (currentLf.startsWith(buffer) || buffer.startsWith(currentLf)))
selectedIndex = i;
lfComboBox.addItem(buffer);
}
// If no match, selects first one
if(selectedIndex == -1)
selectedIndex = 0;
lfComboBox.setSelectedIndex(selectedIndex);
lfComboBox.addActionListener(this);
lfPanel.add(lfComboBox);
return lfPanel;
}
/**
* Creates the dialog's main panel.
* @return the dialog's main panel.
*/
private JPanel createMainPanel() {
YBoxPanel mainPanel;
JPanel okPanel;
mainPanel = new YBoxPanel();
mainPanel.add(new JLabel(Translator.get("setup.intro")));
mainPanel.addSpace(10);
mainPanel.add(createThemePanel());
mainPanel.addSpace(10);
mainPanel.add(createLookAndFeelPanel());
mainPanel.addSpace(10);
okPanel = new JPanel();
okPanel.setLayout(new FlowLayout(FlowLayout.TRAILING));
okPanel.add(okButton = new JButton(Translator.get("ok")));
okButton.addActionListener(this);
mainPanel.add(okPanel);
return mainPanel;
}
/**
* Creates a new InitialSetupDialog.
* @param owner dialog's owner.
*/
public InitialSetupDialog(Frame owner) {
super(owner, Translator.get("setup.title"), owner);
getContentPane().add(createMainPanel(), BorderLayout.CENTER);
setResizable(false);
setInitialFocusComponent(themeComboBox);
setKeyboardDisposalEnabled(false);
getRootPane().setDefaultButton(okButton);
}
// - ActionListener code -------------------------------------------------------------
// -----------------------------------------------------------------------------------
public void actionPerformed(ActionEvent e) {
if(e.getSource() == themeComboBox)
ThemeManager.setCurrentTheme((Theme)themeComboBox.getSelectedItem());
else if(e.getSource() == lfComboBox)
MuConfigurations.getPreferences().setVariable(MuPreference.LOOK_AND_FEEL, lfInfo[lfComboBox.getSelectedIndex()].getClassName());
else if(e.getSource() == okButton) {
ThemeManager.setCurrentTheme((Theme)themeComboBox.getSelectedItem());
MuConfigurations.getPreferences().setVariable(MuPreference.LOOK_AND_FEEL, lfInfo[lfComboBox.getSelectedIndex()].getClassName());
dispose();
}
}
}