/**
* $RCSfile: ,v $
* $Revision: $
* $Date: $
*
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.sparkimpl.preference;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Iterator;
import javax.swing.DefaultListModel;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.jivesoftware.resource.Res;
import org.jivesoftware.spark.component.TitlePanel;
import org.jivesoftware.spark.component.renderer.JLabelIconRenderer;
import org.jivesoftware.spark.preference.Preference;
import org.jivesoftware.sparkimpl.settings.local.SettingsManager;
public class PreferencesPanel extends JPanel implements ListSelectionListener {
private static final long serialVersionUID = 1520420979038154046L;
private final JLabel titleLabel = new JLabel();
/**
* flowpanel is the right panel, where the plugin specific UI is displayed
*/
private final JPanel flowPanel = new JPanel(new BorderLayout());
/**
* scrollPane is the left panel displaying the preference icons
*/
private JScrollPane scrollPane;
private DefaultListModel listModel = new DefaultListModel();
private JList list = new JList(listModel);
private Preference currentPreference;
/**
* <h1>Constructor - PreferencesPanel</h1>
* This is an option to select the transmitted preference by code
* If the given preference is null or not contained in the preference-list,
* the first index of the list will be selected.
*
* @param preferences the preference list
* @param displayPref the preference you want to select
*/
public PreferencesPanel (Iterator<Preference> preferences, Preference displayPref){
this(preferences);
if ( displayPref != null || listModel.getSize() == 1){
// iterate through all preference-ui items
for (int i = 0; i < listModel.size(); i++){
PreferenceUI p = (PreferenceUI)listModel.get( i );
// check if the namespace is the namespace we search for
if (p.getPreference().getNamespace() == displayPref.getNamespace()){
// if we've got our target, we can select this item and stop the search
list.setSelectedIndex( i );
break;
}
}
// if we got a valid target, we trigger the selection changed method
if (list.getSelectedIndex() > -1) selectionChanged();
}
}
public PreferencesPanel(Iterator<Preference> preferences) {
this.setLayout(new GridBagLayout());
titleLabel.setText(Res.getString("title.preferences"));
titleLabel.setFont(new Font("Dialog", Font.BOLD, 15));
scrollPane = new JScrollPane(list);
scrollPane.setPreferredSize(new Dimension(125, 0));
scrollPane.setMinimumSize(new Dimension(125,100));
list.setFixedCellHeight(50);
add(scrollPane, new GridBagConstraints(0, 0, 1, 1, 0.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(5, 5, 5, 5), 50, 0));
add(flowPanel, new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
list.setCellRenderer(new JLabelIconRenderer());
list.addListSelectionListener(this);
// Populate with current preferences
while (preferences.hasNext()) {
Preference preference = preferences.next();
listModel.addElement(new PreferenceUI(preference));
}
list.setSelectedIndex(0);
}
private synchronized void selectionChanged(){
PreferenceUI o = (PreferenceUI)list.getSelectedValue();
Preference pref = o.getPreference();
pref.load();
JComponent comp = pref.getGUI();
flowPanel.removeAll();
// Create the title panel for this dialog
TitlePanel titlePanel = new TitlePanel(pref.getTitle(),
pref.getTooltip(),
pref.getIcon(),
false);
flowPanel.add(comp, BorderLayout.CENTER);
flowPanel.add(titlePanel, BorderLayout.NORTH);
flowPanel.invalidate();
flowPanel.validate();
flowPanel.repaint();
currentPreference = pref;
}
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
if (currentPreference != null) {
if (currentPreference.isDataValid()) {
currentPreference.commit();
}
else {
JOptionPane.showMessageDialog(this, currentPreference.getErrorMessage(),
Res.getString("title.error"), JOptionPane.ERROR_MESSAGE);
list.removeListSelectionListener(this);
list.setSelectedIndex(e.getLastIndex());
list.addListSelectionListener(this);
}
}
selectionChanged();
}
}
public boolean closing() {
if (currentPreference != null) {
if (currentPreference.isDataValid()) {
currentPreference.commit();
SettingsManager.fireListeners();
return true;
}
else {
JOptionPane.showMessageDialog(this, currentPreference.getErrorMessage(),
Res.getString("title.error"), JOptionPane.ERROR_MESSAGE);
return false;
}
}
return true;
}
}