/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
*/
package org.opends.guitools.controlpanel.ui.components;
import static org.opends.messages.AdminToolMessages.*;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.opends.guitools.controlpanel.datamodel.SortableListModel;
import org.opends.guitools.controlpanel.util.Utilities;
/**
* This component displays two list (available list and selected list) with
* some buttons to move the components of one list to the other.
*
* @param <T> the type of the objects in the list.
*/
public class AddRemovePanel<T> extends JPanel
{
private static final long serialVersionUID = 461800576153651284L;
private SortableListModel<T> availableListModel;
private SortableListModel<T> selectedListModel;
private JLabel selectedLabel;
private JLabel availableLabel;
private JButton add;
private JButton remove;
private JButton addAll;
private JButton removeAll;
private JScrollPane availableScroll;
private JScrollPane selectedScroll;
private JList availableList;
private JList selectedList;
private Class<T> theClass;
/**
* Mask used as display option. If the provided display options contain
* this mask, the panel will display the remove all button.
*/
public static final int DISPLAY_REMOVE_ALL = 0x001;
/**
* Mask used as display option. If the provided display options contain
* this mask, the panel will display the add all button.
*/
public static final int DISPLAY_ADD_ALL = 0x010;
/**
* Constructor of the default add remove panel (including 'Add All' and
* 'Remove All' buttons).
* The class is required to avoid warnings in compilation.
* @param theClass the class of the objects in the panel.
*/
public AddRemovePanel(Class<T> theClass)
{
this(DISPLAY_REMOVE_ALL | DISPLAY_ADD_ALL, theClass);
}
/**
* Constructor of the add remove panel allowing the user to provide some
* display options.
* The class is required to avoid warnings in compilation.
* @param displayOptions the display options.
* @param theClass the class of the objects in the panel.
*/
public AddRemovePanel(int displayOptions, Class<T> theClass)
{
super(new GridBagLayout());
setOpaque(false);
this.theClass = theClass;
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
availableLabel = Utilities.createDefaultLabel(
INFO_CTRL_PANEL_AVAILABLE_LABEL.get());
add(availableLabel, gbc);
gbc.gridx = 2;
selectedLabel = Utilities.createDefaultLabel(
INFO_CTRL_PANEL_SELECTED_LABEL.get());
add(selectedLabel, gbc);
gbc.gridy ++;
ListDataListener listDataListener = new ListDataListener()
{
/**
* {@inheritDoc}
*/
public void intervalRemoved(ListDataEvent ev)
{
updateButtonEnabling();
}
/**
* {@inheritDoc}
*/
public void intervalAdded(ListDataEvent ev)
{
updateButtonEnabling();
}
/**
* {@inheritDoc}
*/
public void contentsChanged(ListDataEvent ev)
{
updateButtonEnabling();
}
};
MouseAdapter doubleClickListener = new MouseAdapter()
{
/**
* {@inheritDoc}
*/
public void mouseClicked(MouseEvent e) {
if (isEnabled() && (e.getClickCount() == 2))
{
if (e.getSource() == availableList)
{
if (availableList.getSelectedValue() != null)
{
addClicked();
}
}
else if (e.getSource() == selectedList)
{
if (selectedList.getSelectedValue() != null)
{
removeClicked();
}
}
}
}
};
availableListModel = new SortableListModel<T>();
availableListModel.addListDataListener(listDataListener);
availableList = new JList();
availableList.setModel(availableListModel);
availableList.setVisibleRowCount(15);
availableList.addMouseListener(doubleClickListener);
selectedListModel = new SortableListModel<T>();
selectedListModel.addListDataListener(listDataListener);
selectedList = new JList();
selectedList.setModel(selectedListModel);
selectedList.setVisibleRowCount(15);
selectedList.addMouseListener(doubleClickListener);
gbc.weighty = 1.0;
gbc.weightx = 1.0;
gbc.gridheight = 3;
if ((displayOptions & DISPLAY_ADD_ALL) != 0)
{
gbc.gridheight ++;
}
if ((displayOptions & DISPLAY_REMOVE_ALL) != 0)
{
gbc.gridheight ++;
}
int listGridHeight = gbc.gridheight;
int listGridY = gbc.gridy;
gbc.gridx = 0;
gbc.insets.top = 5;
availableScroll = Utilities.createScrollPane(availableList);
gbc.fill = GridBagConstraints.BOTH;
add(availableScroll, gbc);
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.fill = GridBagConstraints.HORIZONTAL;
add = Utilities.createButton(INFO_CTRL_PANEL_ADDREMOVE_ADD_BUTTON.get());
add.setOpaque(false);
add.addActionListener(new ActionListener()
{
/**
* {@inheritDoc}
*/
public void actionPerformed(ActionEvent ev)
{
addClicked();
}
});
gbc.insets = new Insets(5, 5, 0, 5);
add(add, gbc);
if ((displayOptions & DISPLAY_ADD_ALL) != 0)
{
addAll = Utilities.createButton(
INFO_CTRL_PANEL_ADDREMOVE_ADD_ALL_BUTTON.get());
addAll.setOpaque(false);
addAll.addActionListener(new ActionListener()
{
/**
* {@inheritDoc}
*/
public void actionPerformed(ActionEvent ev)
{
selectedListModel.addAll(availableListModel.getData());
availableListModel.clear();
selectedListModel.fireContentsChanged(selectedListModel, 0,
selectedListModel.getSize());
availableListModel.fireContentsChanged(availableListModel, 0,
availableListModel.getSize());
}
});
gbc.gridy ++;
add(addAll, gbc);
}
remove = Utilities.createButton(
INFO_CTRL_PANEL_ADDREMOVE_REMOVE_BUTTON.get());
remove.setOpaque(false);
remove.addActionListener(new ActionListener()
{
/**
* {@inheritDoc}
*/
public void actionPerformed(ActionEvent ev)
{
removeClicked();
}
});
gbc.gridy ++;
gbc.insets.top = 10;
add(remove, gbc);
if ((displayOptions & DISPLAY_REMOVE_ALL) != 0)
{
removeAll = Utilities.createButton(
INFO_CTRL_PANEL_ADDREMOVE_REMOVE_ALL_BUTTON.get());
removeAll.setOpaque(false);
removeAll.addActionListener(new ActionListener()
{
/**
* {@inheritDoc}
*/
public void actionPerformed(ActionEvent ev)
{
availableListModel.addAll(selectedListModel.getData());
selectedListModel.clear();
selectedListModel.fireContentsChanged(selectedListModel, 0,
selectedListModel.getSize());
availableListModel.fireContentsChanged(availableListModel, 0,
availableListModel.getSize());
}
});
gbc.gridy ++;
gbc.insets.top = 5;
add(removeAll, gbc);
}
gbc.weighty = 1.0;
gbc.insets = new Insets(0, 0, 0, 0);
gbc.gridy ++;
gbc.fill = GridBagConstraints.VERTICAL;
add(Box.createVerticalGlue(), gbc);
gbc.weightx = 1.0;
gbc.insets = new Insets(5, 0, 0, 0);
gbc.gridheight = listGridHeight;
gbc.gridy = listGridY;
gbc.gridx = 2;
gbc.fill = GridBagConstraints.BOTH;
selectedScroll = Utilities.createScrollPane(selectedList);
add(selectedScroll, gbc);
selectedList.getSelectionModel().setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
ListSelectionListener listener = new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent ev)
{
updateButtonEnabling();
}
};
selectedList.getSelectionModel().addListSelectionListener(listener);
availableList.getSelectionModel().setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
availableList.getSelectionModel().addListSelectionListener(listener);
add.setEnabled(false);
remove.setEnabled(false);
// Set preferred size for the scroll panes.
Component comp =
availableList.getCellRenderer().getListCellRendererComponent(
availableList,
"The cell that we want to display", 0, true, true);
Dimension d = new Dimension(comp.getPreferredSize().width,
availableScroll.getPreferredSize().height);
availableScroll.setPreferredSize(d);
selectedScroll.setPreferredSize(d);
}
/**
* Enables the state of the components in the panel.
* @param enable whether to enable the components in the panel or not.
*/
public void setEnabled(boolean enable)
{
super.setEnabled(enable);
selectedLabel.setEnabled(enable);
availableLabel.setEnabled(enable);
availableList.setEnabled(enable);
selectedList.setEnabled(enable);
availableScroll.setEnabled(enable);
selectedScroll.setEnabled(enable);
updateButtonEnabling();
}
/**
* Returns the available label contained in the panel.
* @return the available label contained in the panel.
*/
public JLabel getAvailableLabel()
{
return availableLabel;
}
/**
* Returns the list of elements in the available list.
* @return the list of elements in the available list.
*/
public SortableListModel<T> getAvailableListModel()
{
return availableListModel;
}
/**
* Returns the selected label contained in the panel.
* @return the selected label contained in the panel.
*/
public JLabel getSelectedLabel()
{
return selectedLabel;
}
/**
* Returns the list of elements in the selected list.
* @return the list of elements in the selected list.
*/
public SortableListModel<T> getSelectedListModel()
{
return selectedListModel;
}
private void updateButtonEnabling()
{
int index = availableList.getSelectedIndex();
add.setEnabled((index != -1) &&
(index <availableListModel.getSize()) && isEnabled());
index = selectedList.getSelectedIndex();
remove.setEnabled((index != -1) &&
(index <selectedListModel.getSize()) && isEnabled());
if (addAll != null)
{
addAll.setEnabled((availableListModel.getSize() > 0) && isEnabled());
}
if (removeAll != null)
{
removeAll.setEnabled((selectedListModel.getSize() > 0) && isEnabled());
}
}
/**
* Returns the available list.
* @return the available list.
*/
public JList getAvailableList()
{
return availableList;
}
/**
* Returns the selected list.
* @return the selected list.
*/
public JList getSelectedList()
{
return selectedList;
}
private void addClicked()
{
@SuppressWarnings("deprecation")
Object[] selectedObjects = availableList.getSelectedValues();
for (int i=0; i<selectedObjects.length; i++)
{
T value = AddRemovePanel.this.theClass.cast(selectedObjects[i]);
selectedListModel.add(value);
availableListModel.remove(value);
}
selectedListModel.fireContentsChanged(selectedListModel, 0,
selectedListModel.getSize());
availableListModel.fireContentsChanged(availableListModel, 0,
availableListModel.getSize());
}
private void removeClicked()
{
@SuppressWarnings("deprecation")
Object[] selectedObjects = selectedList.getSelectedValues();
for (int i=0; i<selectedObjects.length; i++)
{
T value = AddRemovePanel.this.theClass.cast(selectedObjects[i]);
availableListModel.add(value);
selectedListModel.remove(value);
}
selectedListModel.fireContentsChanged(selectedListModel, 0,
selectedListModel.getSize());
availableListModel.fireContentsChanged(availableListModel, 0,
availableListModel.getSize());
}
}