/* * 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 com.jgoodies.forms.builder.PanelBuilder; import com.jgoodies.forms.factories.ButtonBarFactory; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import de.dal33t.powerfolder.Constants; import de.dal33t.powerfolder.Controller; import de.dal33t.powerfolder.ui.PFUIComponent; import de.dal33t.powerfolder.ui.event.SelectionChangeEvent; import de.dal33t.powerfolder.ui.event.SelectionModel; import de.dal33t.powerfolder.ui.util.UIUtil; import de.dal33t.powerfolder.plugin.Plugin; import de.dal33t.powerfolder.plugin.PluginEvent; import de.dal33t.powerfolder.plugin.PluginManager; import de.dal33t.powerfolder.plugin.PluginManagerListener; import de.dal33t.powerfolder.ui.action.SelectionBaseAction; import de.dal33t.powerfolder.util.Translation; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.List; public class PluginSettingsTab extends PFUIComponent implements PreferenceTab { private static final int PLUGIN_NAME_COL = 0; private static final int PLUGIN_DESCR_COL = 1; private static final int PLUGIN_CLASS_COL = 2; private static final int PLUGIN_STATUS_COL = 3; private PreferencesDialog preferencesDialog; private JPanel panel; private JTable pluginJTable; private JScrollPane pluginPane; private JButton settingsButton; private JButton enableButton; private SelectionModel selectionModel; public PluginSettingsTab(Controller controller, PreferencesDialog preferencesDialog) { super(controller); this.preferencesDialog = preferencesDialog; selectionModel = new SelectionModel(); initComponents(); } public boolean needsRestart() { return false; } public void save() { } public boolean validate() { return true; } public String getTabName() { return Translation.getTranslation("preferences.plugin.title"); } public void undoChanges() { } /** * Creates the JPanel for plugin settings * * @return the created panel */ public JPanel getUIPanel() { if (panel == null) { FormLayout layout = new FormLayout("3dlu, pref:grow, 3dlu", "3dlu, fill:pref:grow, 3dlu, pref, 3dlu"); PanelBuilder builder = new PanelBuilder(layout); CellConstraints cc = new CellConstraints(); builder.add(pluginPane, cc.xy(2, 2)); builder.add(getButtonBar(), cc.xy(2, 4)); panel = builder.getPanel(); } return panel; } private void initComponents() { pluginJTable = new JTable(new PluginTableModel()); pluginJTable .setDefaultRenderer(Plugin.class, new PluginTableRenderer()); pluginPane = new JScrollPane(pluginJTable); UIUtil.whiteStripTable(pluginJTable); UIUtil.removeBorder(pluginPane); UIUtil.setZeroHeight(pluginPane); pluginJTable.getSelectionModel().setSelectionMode( ListSelectionModel.SINGLE_SELECTION); pluginJTable.getSelectionModel().addListSelectionListener( new PluginTableListSelectionListener()); settingsButton = new JButton(new SettingsAction(getController(), selectionModel)); enableButton = new JButton(new EnableAction(getController(), selectionModel)); pluginJTable.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { Plugin plugin = (Plugin) selectionModel.getSelection(); if (plugin == null) { return; } if (getController().getPluginManager().isEnabled(plugin)) { if (plugin.hasOptionsDialog()) { plugin.showOptionsDialog(preferencesDialog); } } else { // Enable getController().getPluginManager().setEnabled(plugin, true); if (plugin.hasOptionsDialog()) { plugin.showOptionsDialog(preferencesDialog); } } } } }); getController().getPluginManager().addPluginManagerListener( new MyPluginManagerListener()); } private Component getButtonBar() { // Disabled Enabled/Disable button return ButtonBarFactory.buildCenteredBar(enableButton, settingsButton); // return ButtonBarFactory.buildCenteredBar(settingsButton); } private class PluginTableModel extends AbstractTableModel { @Override public Class<?> getColumnClass(int columnIndex) { return Plugin.class; } @Override public String getColumnName(int column) { switch (column) { case PLUGIN_NAME_COL : return Translation .getTranslation("preferences.plugin.name"); case PLUGIN_DESCR_COL : return Translation .getTranslation("preferences.plugin.description"); case PLUGIN_CLASS_COL : return Translation .getTranslation("preferences.plugin.class_name"); case PLUGIN_STATUS_COL : return Translation .getTranslation("preferences.plugin.status"); default : return null; } } public int getColumnCount() { return 2; } public int getRowCount() { PluginManager pluginManager = getController().getPluginManager(); return pluginManager.countPlugins(); } public Object getValueAt(int rowIndex, int columnIndex) { PluginManager pluginManager = getController().getPluginManager(); List<Plugin> plugins = pluginManager.getPlugins(); return plugins.get(rowIndex); } } private class PluginTableRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { PluginManager pluginManager = getController().getPluginManager(); List<Plugin> plugins = pluginManager.getPlugins(); Plugin plugin = plugins.get(row); boolean enabled = getController().getPluginManager().isEnabled( plugin); if (enabled) { setForeground(Color.BLACK); } else { setForeground(Color.LIGHT_GRAY); } int columnInModel = UIUtil.toModel(table, column); String newValue; switch (columnInModel) { case PLUGIN_NAME_COL : newValue = plugin.getName(); setToolTipText(plugin.getName()); setHorizontalAlignment(SwingConstants.LEFT); break; case PLUGIN_DESCR_COL : newValue = plugin.getDescription(); setToolTipText(plugin.getDescription()); setHorizontalAlignment(SwingConstants.LEFT); break; case PLUGIN_CLASS_COL : newValue = plugin.getClass().getName(); setToolTipText(plugin.getClass().getName()); setHorizontalAlignment(SwingConstants.LEFT); break; case PLUGIN_STATUS_COL : if (enabled) { newValue = Translation .getTranslation("preferences.plugin.status_enabled"); } else { newValue = Translation .getTranslation("preferences.plugin.status_disabled"); } setToolTipText(newValue); setHorizontalAlignment(SwingConstants.RIGHT); break; default : return null; } return super.getTableCellRendererComponent(table, newValue, isSelected, hasFocus, row, column); } } private class EnableAction extends SelectionBaseAction { public EnableAction(Controller controller, SelectionModel selectionModel) { super("preferences.plugin.enable", controller, selectionModel); setEnabled(false); } public void selectionChanged(SelectionChangeEvent event) { updateButton((Plugin) event.getSelection()); } public void actionPerformed(ActionEvent e) { Plugin plugin = (Plugin) getSelectionModel().getSelection(); boolean newStatus = !getController().getPluginManager().isEnabled( plugin); getController().getPluginManager().setEnabled(plugin, newStatus); // #1853: No need to show it. Disabled because of system service // plugin. // if (newStatus && plugin.hasOptionsDialog()) { // plugin // .showOptionsDialog(PluginSettingsTab.this.preferencesDialog); // } } private void updateButton(Plugin plugin) { // HACK(tm) do not be able to disable the ProLoader! if (plugin == null || plugin.getClass().getName().equals( Constants.PRO_LOADER_PLUGIN_CLASS) || plugin.getClass().getName().equals( Constants.ENCRYPTION_PLUGIN_CLASS)) { setEnabled(false); } else { setEnabled(true); if (getController().getPluginManager().isEnabled(plugin)) { putValue(NAME, Translation .getTranslation("preferences.plugin.disable.name")); putValue(SHORT_DESCRIPTION, Translation .getTranslation("preferences.plugin.disable.description")); putValue(ACCELERATOR_KEY, Translation .getTranslation("preferences.plugin.disable.key")); } else { putValue(NAME, Translation .getTranslation("preferences.plugin.enable.name")); putValue(SHORT_DESCRIPTION, Translation .getTranslation("preferences.plugin.enable.description")); putValue(ACCELERATOR_KEY, Translation .getTranslation("preferences.plugin.enable.key")); } } } } private class SettingsAction extends SelectionBaseAction { public SettingsAction(Controller controller, SelectionModel selectionModel) { super("preferences.plugin.settings", controller, selectionModel); setEnabled(false); } public void selectionChanged(SelectionChangeEvent event) { Plugin plugin = (Plugin) event.getSelection(); if (plugin != null) { setEnabled(getController().getPluginManager().isEnabled(plugin) && plugin.hasOptionsDialog()); } } public void actionPerformed(ActionEvent e) { Plugin plugin = (Plugin) selectionModel.getSelection(); if (plugin != null && plugin.hasOptionsDialog()) { plugin.showOptionsDialog(preferencesDialog); } } } /** * updates the SelectionModel if some selection has changed in the plugin * table */ private class PluginTableListSelectionListener implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { int[] selectedRows = pluginJTable.getSelectedRows(); if (selectedRows.length != 0 && !e.getValueIsAdjusting()) { Object[] selectedObjects = new Object[selectedRows.length]; for (int i = 0; i < selectedRows.length; i++) { selectedObjects[i] = pluginJTable.getModel().getValueAt( selectedRows[i], 0); } selectionModel.setSelections(selectedObjects); } else { selectionModel.setSelection(null); } } } private class MyPluginManagerListener implements PluginManagerListener { public void pluginStatusChanged(PluginEvent pluginEvent) { ((PluginTableModel) pluginJTable.getModel()).fireTableRowsUpdated( -1, -1); settingsButton.setEnabled(false); enableButton.setEnabled(false); } public boolean fireInEventDispatchThread() { return true; } } }