/* * Copyright 2004 - 2008 Christian Sprajc. All rights reserved. * * This file is part of PowerFolder. * * PowerFolder 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. * * PowerFolder 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 PowerFolder. If not, see <http://www.gnu.org/licenses/>. * * $Id$ */ package de.dal33t.powerfolder.ui.preferences; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.util.Locale; import javax.swing.*; import com.jgoodies.binding.value.ValueHolder; import com.jgoodies.binding.value.ValueModel; import com.jgoodies.forms.builder.PanelBuilder; import com.jgoodies.forms.factories.Borders; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import de.dal33t.powerfolder.ConfigurationEntry; import de.dal33t.powerfolder.Controller; import de.dal33t.powerfolder.ui.PFUIComponent; import de.dal33t.powerfolder.ui.panel.ArchiveModeSelectorPanel; import de.dal33t.powerfolder.PreferencesEntry; import de.dal33t.powerfolder.ui.action.BaseAction; import de.dal33t.powerfolder.ui.util.update.ManuallyInvokedUpdateHandler; import de.dal33t.powerfolder.ui.widget.ActionLabel; import de.dal33t.powerfolder.util.StringUtils; import de.dal33t.powerfolder.util.Translation; import de.dal33t.powerfolder.util.Util; import de.dal33t.powerfolder.util.os.OSUtil; import de.dal33t.powerfolder.util.os.Win32.WinUtils; import de.dal33t.powerfolder.util.os.mac.MacUtils; import de.dal33t.powerfolder.util.update.Updater; public class GeneralSettingsTab extends PFUIComponent implements PreferenceTab { private JPanel panel; private JTextField nickField; private JCheckBox startWithWindowsBox; private ActionLabel startWithMacOSLabel; private JCheckBox updateCheck; private boolean originalQuitOnX; private JComboBox xBehaviorChooser; private ArchiveModeSelectorPanel archiveModeSelectorPanel; private ValueModel versionModel; private JComboBox archiveCleanupCombo; private Action cleanupAction; private JComboBox languageChooser; private boolean needsRestart; public GeneralSettingsTab(Controller controller) { super(controller); initComponents(); } public String getTabName() { return Translation.getTranslation("preferences.general.title"); } public boolean needsRestart() { return needsRestart; } public boolean validate() { return true; } // Exposing ************************************************************* /** * Initializes all needed ui components */ private void initComponents() { languageChooser = createLanguageChooser(); nickField = new JTextField(getController().getMySelf().getNick()); updateCheck = new JCheckBox(Translation.getTranslation("preferences.general.check_for_program_updates")); updateCheck.setSelected(PreferencesEntry.CHECK_UPDATE.getValueBoolean(getController())); xBehaviorChooser = createXBehaviorChooser(); // Windows only... if (OSUtil.isWindowsSystem()) { if (WinUtils.getInstance() != null && !OSUtil.isWebStart()) { startWithWindowsBox = new JCheckBox( Translation .getTranslation("preferences.general.start_with_windows")); startWithWindowsBox.setSelected(WinUtils.getInstance() .isPFStartup(getController())); } } if (MacUtils.isSupported()) { startWithMacOSLabel = new ActionLabel(getController(), new BaseAction("action_preferences.dialog.start_with_macosx", getController()) { public void actionPerformed(ActionEvent e) { try { MacUtils.getInstance().setPFStartup(true, getController()); } catch (IOException ex) { logWarning("Unable to setup auto start on logon. " + ex); } } }); } versionModel = new ValueHolder(); archiveModeSelectorPanel = new ArchiveModeSelectorPanel( getController(), versionModel); archiveModeSelectorPanel.setArchiveMode( ConfigurationEntry.DEFAULT_ARCHIVE_VERSIONS.getValueInt(getController())); archiveCleanupCombo = new JComboBox(); archiveCleanupCombo.addItem(Translation .getTranslation("preferences.general.archive_cleanup_day")); // 1 archiveCleanupCombo.addItem(Translation .getTranslation("preferences.general.archive_cleanup_week")); // 7 archiveCleanupCombo.addItem(Translation .getTranslation("preferences.general.archive_cleanup_month")); // 31 archiveCleanupCombo.addItem(Translation .getTranslation("preferences.general.archive_cleanup_year")); // 365 archiveCleanupCombo.addItem(Translation .getTranslation("preferences.general.archive_cleanup_never")); // 2147483647 int cleanup = ConfigurationEntry.DEFAULT_ARCHIVE_CLEANUP_DAYS .getValueInt(getController()); switch (cleanup) { case 1 : archiveCleanupCombo.setSelectedIndex(0); break; case 7 : archiveCleanupCombo.setSelectedIndex(1); break; case 31 : default : archiveCleanupCombo.setSelectedIndex(2); break; case 365 : archiveCleanupCombo.setSelectedIndex(3); break; case Integer.MAX_VALUE : archiveCleanupCombo.setSelectedIndex(4); break; case 0 : archiveCleanupCombo.setSelectedIndex(4); break; } cleanupAction = new MyCleanupAction(getController()); } /** * Builds general ui panel */ public JPanel getUIPanel() { if (panel == null) { FormLayout layout = new FormLayout( "right:pref, 3dlu, 140dlu, pref:grow", "pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref"); PanelBuilder builder = new PanelBuilder(layout); builder.setBorder(Borders .createEmptyBorder("3dlu, 3dlu, 3dlu, 3dlu")); CellConstraints cc = new CellConstraints(); int row = 1; builder.add( new JLabel(Translation .getTranslation("preferences.general.nickname")), cc.xy(1, row)); builder.add(nickField, cc.xy(3, row)); row += 2; builder.add(new JLabel(Translation.getTranslation("preferences.general.language")), cc.xy(1, row)); builder.add(languageChooser, cc.xy(3, row)); row += 2; builder.add(createUpdateCheckPanel(), cc.xyw(3, row, 2)); // Add info for non-windows systems if (OSUtil.isWindowsSystem()) { // Windows System if (startWithWindowsBox != null) { builder.appendRow("3dlu"); builder.appendRow("pref"); row += 2; builder.add(startWithWindowsBox, cc.xyw(3, row, 2)); } } else { builder.appendRow("3dlu"); builder.appendRow("pref"); row += 2; if (startWithMacOSLabel != null) { builder.appendRow("3dlu"); builder.appendRow("pref"); row += 2; builder.add(startWithMacOSLabel.getUIComponent(), cc.xyw(3, row, 2)); } } row += 2; builder.add(new JLabel(Translation.getTranslation("preferences.general.exit_behavior")), cc.xy(1, row)); builder.add(xBehaviorChooser, cc.xy(3, row)); row += 2; builder.add(new JLabel(Translation.getTranslation( "preferences.general.default_archive_mode_text")), cc.xy(1, row)); builder.add( threePanel( archiveModeSelectorPanel.getUIComponent(), archiveCleanupCombo, new JButton(cleanupAction)), cc.xyw(3, row, 2)); panel = builder.getPanel(); } return panel; } private JPanel createUpdateCheckPanel() { FormLayout layout = new FormLayout("pref, 3dlu, pref", "pref"); PanelBuilder builder = new PanelBuilder(layout); CellConstraints cc = new CellConstraints(); builder.add(updateCheck, cc.xy(1, 1)); builder.add(createCheckForUpdatesButton(), cc.xy(3, 1)); return builder.getPanel(); } /** * Creates an internationalized check for updates button. This button will * invoke the manual update checker. */ private JButton createCheckForUpdatesButton() { JButton checkForUpdatesButton = new JButton(Translation.getTranslation("preferences.general.check_for_updates_text")); checkForUpdatesButton.setToolTipText(Translation.getTranslation("preferences.general.check_for_updates_tips")); checkForUpdatesButton.setMnemonic( Translation.getTranslation("preferences.general.check_for_updates_key").trim().charAt(0)); checkForUpdatesButton.addActionListener(new UpdateAction()); checkForUpdatesButton.setBackground(Color.WHITE); return checkForUpdatesButton; } private JComboBox createLanguageChooser() { // Create combobox JComboBox chooser = new JComboBox(); for (Locale locale1 : Translation.getSupportedLocales()) { chooser.addItem(locale1); } // Add renderer chooser.setRenderer(new DefaultListCellRenderer() { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof Locale) { Locale locale = (Locale) value; setText(locale.getDisplayName(locale)); } else { setText("- unknown -"); } return this; } }); // Initialize chooser with the active locale. chooser.setSelectedItem(Translation.getActiveLocale()); return chooser; } private static Component threePanel(Component component1, Component component2, Component component3) { FormLayout layout = new FormLayout("pref, 3dlu, pref, 3dlu, pref", "pref"); PanelBuilder builder = new PanelBuilder(layout); CellConstraints cc = new CellConstraints(); builder.add(component1, cc.xy(1, 1)); builder.add(component2, cc.xy(3, 1)); builder.add(component3, cc.xy(5, 1)); return builder.getPanel(); } public void undoChanges() { } public void save() { // Nickname if (!StringUtils.isBlank(nickField.getText())) { getController().changeNick(nickField.getText(), false); } // Set locale if (languageChooser.getSelectedItem() instanceof Locale) { Locale locale = (Locale) languageChooser.getSelectedItem(); // Check if we need to restart needsRestart |= !Util.equals(locale, Translation.getActiveLocale()); // Save settings Translation.saveLocalSetting(locale); } else { // Remove setting Translation.saveLocalSetting(null); } PreferencesEntry.CHECK_UPDATE.setValue(getController(), updateCheck.isSelected()); PreferencesEntry.QUIT_ON_X.setValue(getController(), xBehaviorChooser.getSelectedIndex() == 0); // Quit on exit. if (xBehaviorChooser.getSelectedIndex() == 0 ^ originalQuitOnX) { // Need to restart to redraw minimize button. needsRestart = true; } int index = archiveCleanupCombo.getSelectedIndex(); switch (index) { case 0 : // 1 day ConfigurationEntry.DEFAULT_ARCHIVE_CLEANUP_DAYS.setValue( getController(), 1); break; case 1 : // 1 week ConfigurationEntry.DEFAULT_ARCHIVE_CLEANUP_DAYS.setValue( getController(), 7); break; case 2 : // 1 month default : ConfigurationEntry.DEFAULT_ARCHIVE_CLEANUP_DAYS.setValue( getController(), 31); break; case 3 : // 1 year ConfigurationEntry.DEFAULT_ARCHIVE_CLEANUP_DAYS.setValue( getController(), 365); break; case 4 : // never ConfigurationEntry.DEFAULT_ARCHIVE_CLEANUP_DAYS.setValue( getController(), 0); break; } try { ConfigurationEntry.DEFAULT_ARCHIVE_VERSIONS.setValue( getController(), versionModel.getValue().toString()); } catch (Exception e) { logWarning("Unable to store archive settings: " + e); } if (WinUtils.isSupported()) { boolean changed = WinUtils.getInstance().isPFStartup( getController()) != startWithWindowsBox.isSelected(); if (changed) { try { if (WinUtils.getInstance() != null) { WinUtils.getInstance().setPFStartup( startWithWindowsBox.isSelected(), getController()); } } catch (IOException e) { logWarning("Unable to setup autostart: " + e); } } } } // //////////////// // Inner classes // // //////////////// private static class MyCleanupAction extends BaseAction { private MyCleanupAction(Controller controller) { super("action_cleanup_archive", controller); } public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { getController().getFolderRepository() .cleanupOldArchiveFiles(); } }); } } private class UpdateAction implements ActionListener { public void actionPerformed(ActionEvent e) { if (getController().getUpdateSettings() != null) { ManuallyInvokedUpdateHandler handler = new ManuallyInvokedUpdateHandler( getController()); Updater updater = new Updater(getController(), getController() .getUpdateSettings(), handler); updater.start(); } PreferencesEntry.CHECK_UPDATE.setValue(getController(), true); } } /** * Creates a X behavior chooser. * Option 0 is Exit program * Option 1 is Minimize to system tray */ private JComboBox createXBehaviorChooser() { DefaultComboBoxModel model = new DefaultComboBoxModel(); model.addElement(Translation.getTranslation( "preferences.general.exit_behavior_exit")); if (OSUtil.isSystraySupported()) { model.addElement(Translation.getTranslation( "preferences.general.exit_behavior_minimize")); } JComboBox combo = new JComboBox(model); combo.setEnabled(OSUtil.isSystraySupported()); if (OSUtil.isSystraySupported() && !PreferencesEntry.QUIT_ON_X.getValueBoolean( getController())) { combo.setSelectedIndex(1); // Minimize option. } originalQuitOnX = combo.getSelectedIndex() == 0; return combo; } }