/* *------------------------------------------------------------------------------ * Copyright (C) 2006-2007 University of Dundee. All rights reserved. * * * This program 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 2 of the License, or * (at your option) any later version. * This program 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, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.agents.util.ui; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.WindowConstants; import javax.swing.table.DefaultTableModel; import info.clearthought.layout.TableLayout; import org.openmicroscopy.shoola.agents.util.ViewerSorter; import org.openmicroscopy.shoola.util.ui.TitlePanel; import org.openmicroscopy.shoola.util.ui.UIUtilities; import omero.gateway.model.ExperimenterData; import omero.gateway.model.GroupData; /** * Modal dialog presenting the existing user groups and * and the experimenters in each group. The user can then select and * view other people data. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author Donald MacDonald      * <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a> * @version 3.0 * @since OME3.0 */ public class UserManagerDialog extends JDialog implements ActionListener { /** Bounds property indicating that a new user has been selected. */ public static final String USER_SWITCH_PROPERTY = "userSwitch"; /** Bounds property indicating that no user selected. */ public static final String NO_USER_SWITCH_PROPERTY = "noUserSwitch"; /** The default size of the window. */ static final Dimension DEFAULT_SIZE = new Dimension(400, 400); /** The window's title. */ private static final String TITLE = "Users Selection"; /** The window's description. */ private static final String TEXT = "Select the users."; /** The description of the {@link #cancel} button. */ private static final String CANCEL_DESCRIPTION = "Close the window."; /** The description of the {@link #apply} button. */ private static final String APPLY_DESCRIPTION = "Select the " + "users."; /** Action command ID indicating to close the window. */ private static final int CANCEL = 0; /** Action command ID indicating to apply the selection. */ private static final int APPLY = 1; /** * The size of the invisible components used to separate buttons * horizontally. */ static final Dimension H_SPACER_SIZE = new Dimension(5, 10); /** Button to close without applying the selection. */ private JButton cancel; /** Button to apply the selection. */ private JButton apply; /** The component hosting the users for a given group. */ private JTable members; /** The component hosting the users for a given group. */ private JTable owners; /** The current user. */ private ExperimenterData loggedUser; /** Helper class uses to sort elements. */ private ViewerSorter sorter; /** The group currently selected.*/ private GroupData group; /** The collection of selected users.*/ private List<ExperimenterData> selectedUsers; /** Closes and disposes. */ private void cancel() { setVisible(false); dispose(); } /** Switches the user. */ private void apply() { Map<Long, List<ExperimenterData>> r = new HashMap<Long, List<ExperimenterData>>(); //Check the selected users Boolean b; List<ExperimenterData> users = new ArrayList<ExperimenterData>(); for (int i = 0; i < owners.getRowCount(); i++) { b = (Boolean) owners.getValueAt(i, 1); if (b.booleanValue()) { users.add((ExperimenterData) owners.getValueAt(i, 0)); } } for (int i = 0; i < members.getRowCount(); i++) { b = (Boolean) members.getValueAt(i, 1); if (b.booleanValue()) { users.add((ExperimenterData) members.getValueAt(i, 0)); } } r.put(group.getId(), users); firePropertyChange(USER_SWITCH_PROPERTY, null, r); cancel(); } /** Sets the properties of the window. */ private void setProperties() { setModal(true); setTitle(TITLE); } /** * Returns <code>true</code> if the experimenter is already displayed. * <code>false</code> otherwise. * * @param experimenter The experimenter to handle. * @return See above. */ private boolean isAlreadyDisplayed(ExperimenterData experimenter) { Iterator<ExperimenterData> i = selectedUsers.iterator(); ExperimenterData exp; long id = experimenter.getId(); while (i.hasNext()) { exp = i.next(); if (exp.getId() == id) return true; } return false; } /** * Fills the users' list with the specified objects. * * @param group The group to handle. */ private void fillList(GroupData group) { if (group == null) return; DefaultTableModel model = (DefaultTableModel) owners.getModel(); int index = 0; List l = sorter.sort(group.getLeaders()); Iterator i = l.iterator(); ExperimenterData exp; List<Long> ids = new ArrayList<Long>(); while (i.hasNext()) { exp = (ExperimenterData) i.next(); if (exp.getId() != loggedUser.getId()) { model.insertRow(index, new Object[]{exp, new Boolean(isAlreadyDisplayed(exp))}); ids.add(exp.getId()); index++; } } if (group.getLeaders().size() == group.getExperimenters().size()) return; //model.add(index, "Members"); model = (DefaultTableModel) members.getModel(); l = sorter.sort(group.getExperimenters()); i = l.iterator(); index = 0; while (i.hasNext()) { exp = (ExperimenterData) i.next(); if (exp.getId() != loggedUser.getId() && !ids.contains(exp.getId())) { model.insertRow(index, new Object[]{exp, new Boolean(isAlreadyDisplayed(exp))}); index++; } } } /** Adds listeners. */ private void attachListeners() { setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { /** * Cancels while closing the window. * @see WindowAdapter#windowClosing(WindowEvent) */ public void windowClosing(WindowEvent e) { cancel(); } }); /* users.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { Object value = users.getSelectedValue(); apply.setEnabled(value instanceof ExperimenterData); } }); */ cancel.setActionCommand(""+CANCEL); cancel.addActionListener(this); apply.setActionCommand(""+APPLY); apply.addActionListener(this); } /** * Initializes the UI components. * * @param selectedGroup The group to display * @param userIcon The icon used to represent an user. */ private void initComponents(Icon userIcon) { sorter = new ViewerSorter(); cancel = new JButton("Cancel"); cancel.setToolTipText( UIUtilities.formatToolTipText(CANCEL_DESCRIPTION)); apply = new JButton("Apply"); //apply.setEnabled(false); apply.setToolTipText( UIUtilities.formatToolTipText(APPLY_DESCRIPTION)); getRootPane().setDefaultButton(apply); members = new SelectionTable(userIcon); owners = new SelectionTable(userIcon); fillList(group); attachListeners(); } /** * Builds the main component of this dialog. * * @param group The selected group if any. * @return See above. */ private JPanel buildContent(GroupData group) { double[][] tl = {{TableLayout.PREFERRED, TableLayout.FILL}, //columns {TableLayout.PREFERRED, 5, TableLayout.FILL}}; //rows JPanel content = new JPanel(); content.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10)); content.setLayout(new TableLayout(tl)); if (group != null) { content.add(UIUtilities.setTextFont( "Select from: "+group.getName()), "0, 0, 1, 0"); } //content.add(UIUtilities.setTextFont("Experimenters "), // "0, 2, LEFT, TOP"); int rows = owners.getRowCount(); JPanel p = new JPanel(); p.setBackground(UIUtilities.BACKGROUND); double[][] size = {{TableLayout.PREFERRED, TableLayout.FILL}, //columns {TableLayout.PREFERRED, TableLayout.PREFERRED, 5, TableLayout.PREFERRED, TableLayout.PREFERRED}}; p.setLayout(new TableLayout(size)); if (rows > 0) { p.add(UIUtilities.setTextFont("Group's owners"), "0, 0"); p.add(owners, "0, 1, 1, 1"); } rows = members.getRowCount(); if (rows > 0) { p.add(UIUtilities.setTextFont("Members"), "0, 3"); p.add(members, "0, 4, 1, 4"); } content.add(new JScrollPane(p), "0, 2, 1, 2"); return content; } /** * Builds the tool bar hosting the {@link #cancel} and {@link #apply} * buttons. * * @return See above; */ private JPanel buildToolBar() { JPanel bar = new JPanel(); bar.setBorder(null); //bar.add(mySelf); //bar.add(Box.createRigidArea(H_SPACER_SIZE)); bar.add(apply); bar.add(Box.createRigidArea(H_SPACER_SIZE)); bar.add(cancel); JPanel p = UIUtilities.buildComponentPanelRight(bar); return p; } /** * Builds and lays out the UI. * * @param group The selected group. * @param icon The icon displayed in the title panel. */ private void buildGUI(GroupData group, Icon icon) { TitlePanel titlePanel = new TitlePanel(TITLE, TEXT, icon); Container c = getContentPane(); c.setLayout(new BorderLayout(0, 0)); c.add(titlePanel, BorderLayout.NORTH); c.add(buildContent(group), BorderLayout.CENTER); c.add(buildToolBar(), BorderLayout.SOUTH); } /** * Creates a new instance. * * @param parent The parent of this dialog. * @param loggedUser The user currently logged in. * @param selected The selected group. * @param selectedUsers The collection of users already displayed. * @param userIcon The icon representing an user. * @param icon The icon displayed in the title panel. */ public UserManagerDialog(JFrame parent, ExperimenterData loggedUser, GroupData selected, List<ExperimenterData> selectedUsers, Icon userIcon, Icon icon) { super(parent); setProperties(); this.loggedUser = loggedUser; group = selected; if (selectedUsers == null) selectedUsers = new ArrayList<ExperimenterData>(); this.selectedUsers = selectedUsers; initComponents(userIcon); buildGUI(selected, icon); } /** * Returns the users already selected. * * @return See above. */ List<ExperimenterData> getSelectedUsers() { return selectedUsers; } /** Sets the default size of window. */ public void setDefaultSize() { setSize(DEFAULT_SIZE); } /** * Performs the actions. * @see ActionListener#actionPerformed(ActionEvent) */ public void actionPerformed(ActionEvent e) { int id = Integer.parseInt(e.getActionCommand()); switch (id) { case CANCEL: cancel(); break; case APPLY: apply(); } } }