/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2010 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.treeviewer.util;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import org.openmicroscopy.shoola.agents.treeviewer.IconManager;
import org.openmicroscopy.shoola.agents.treeviewer.TreeViewerAgent;
import org.openmicroscopy.shoola.agents.util.EditorUtil;
import org.openmicroscopy.shoola.agents.util.SelectionWizardUI;
import org.openmicroscopy.shoola.env.data.login.UserCredentials;
import org.openmicroscopy.shoola.env.ui.UserNotifier;
import org.openmicroscopy.shoola.util.ui.UIUtilities;
import omero.gateway.model.DataObject;
import omero.gateway.model.ExperimenterData;
import omero.gateway.model.GroupData;
/**
* Displays the fields necessary to collect details about the user to create.
*
* @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 3.0-Beta4
*/
class ExperimenterPane
extends DataPane
implements PropertyChangeListener
{
/** Bound property indicating to enable of not the save property. */
static final String EXPERIMENTER_ENABLE_SAVE_PROPERTY =
"exprimenterEnableSave";
/** Password field to enter password. */
private JPasswordField passwordField;
/** The items that can be edited. */
private Map<String, JTextField> items;
/** The user's details. */
private Map<String, String> details;
/** Select to indicate that the user is an administrator. */
private JCheckBox adminBox;
/** Select to indicate that the user is active. */
private JCheckBox activeBox;
/** Select to indicate that the user is an owner of the group. */
private JCheckBox ownerBox;
/** The Button to display existing user as possible group owner. */
private JButton groupOwner;
/** The component used to select the groups. */
private SelectionWizardUI selectionComponent;
/** Flag indicating that the password is required. */
private boolean passwordRequired;
/**
* Initializes the components composing this display.
*
* @param available The collection of groups is any available.
* @param selected The collection of selected groups.
*/
private void initComponents(Collection available, Collection selected)
{
passwordField = new JPasswordField();
passwordField.getDocument().addDocumentListener(this);
//details = EditorUtil.convertExperimenter(null);
details = new LinkedHashMap<String, String>();
details.put(EditorUtil.DISPLAY_NAME, "");
details.put(EditorUtil.FIRST_NAME, "");
details.put(EditorUtil.MIDDLE_NAME, "");
details.put(EditorUtil.LAST_NAME, "");
details.put(EditorUtil.EMAIL, "");
details.put(EditorUtil.INSTITUTION, "");
items = new LinkedHashMap<String, JTextField>();
activeBox = new JCheckBox();
activeBox.setSelected(true);
activeBox.setEnabled(!passwordRequired);
adminBox = new JCheckBox();
//adminBox.setVisible(administrator);
ownerBox = new JCheckBox();
ownerBox.setEnabled(passwordRequired);
ownerBox.setSelected(!passwordRequired);
IconManager icons = IconManager.getInstance();
groupOwner = new JButton(icons.getIcon(IconManager.USER_GROUP));
groupOwner.setToolTipText("Select an existing user as owner");
groupOwner.setVisible(passwordRequired);
if (available == null && selected == null) return;
selectionComponent = new SelectionWizardUI(null, available, selected,
GroupData.class, TreeViewerAgent.getUserDetails());
selectionComponent.addPropertyChangeListener(this);
addPropertyChangeListener(this);
}
/**
* Builds the panel hosting the user's details.
*
* @return See above.
*/
private JPanel buildContentPanel()
{
JPanel content = new JPanel();
//content.setBackground(UIUtilities.BACKGROUND_COLOR);
Entry entry;
Iterator i = details.entrySet().iterator();
JComponent label;
JTextField area;
String key, value;
content.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(0, 2, 2, 0);
while (i.hasNext()) {
++c.gridy;
c.gridx = 0;
entry = (Entry) i.next();
key = (String) entry.getKey();
value = (String) entry.getValue();
area = new JTextField(value);
area.setEditable(true);
if (EditorUtil.DISPLAY_NAME.equals(key)) {
label = EditorUtil.getLabel(key, true);
area = nameArea;
} else if (EditorUtil.FIRST_NAME.equals(key) ||
EditorUtil.LAST_NAME.equals(key)) {
label = EditorUtil.getLabel(key, true);
} else label = UIUtilities.setTextFont(key);
items.put(key, area);
c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
c.fill = GridBagConstraints.NONE;
c.weightx = 0.0;
content.add(label, c);
c.gridx++;
content.add(Box.createHorizontalStrut(5), c);
c.gridx++;
c.gridwidth = GridBagConstraints.REMAINDER;
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
content.add(area, c);
}
c.gridx = 0;
c.gridy++;
label = EditorUtil.getLabel("Password", passwordRequired);
c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
c.fill = GridBagConstraints.NONE; //reset to default
c.weightx = 0.0;
content.add(label, c);
c.gridx++;
content.add(Box.createHorizontalStrut(5), c);
c.gridx++;
c.gridwidth = GridBagConstraints.REMAINDER; //end row
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
content.add(passwordField, c);
c.gridx = 0;
c.gridy++;
label = EditorUtil.getLabel(EditorUtil.GROUP_OWNER, false);
c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
c.fill = GridBagConstraints.NONE; //reset to default
c.weightx = 0.0;
content.add(label, c);
c.gridx++;
content.add(Box.createHorizontalStrut(5), c);
c.gridx++;
c.gridwidth = GridBagConstraints.REMAINDER; //end row
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
content.add(ownerBox, c);
if (adminBox.isVisible()) {
c.gridx = 0;
c.gridy++;
label = EditorUtil.getLabel(EditorUtil.ADMINISTRATOR, false);
c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
c.fill = GridBagConstraints.NONE; //reset to default
c.weightx = 0.0;
content.add(label, c);
c.gridx++;
content.add(Box.createHorizontalStrut(5), c);
c.gridx++;
c.gridwidth = GridBagConstraints.REMAINDER; //end row
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
content.add(adminBox, c);
}
c.gridx = 0;
c.gridy++;
content.add(Box.createHorizontalStrut(10), c);
c.gridy++;
label = UIUtilities.setTextFont(EditorUtil.MANDATORY_DESCRIPTION,
Font.ITALIC);
label.setForeground(UIUtilities.REQUIRED_FIELDS_COLOR);
c.weightx = 0.0;
content.add(label, c);
return content;
}
/** Builds and lays out the UI. */
private void buildGUI()
{
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(0, 2, 2, 0);
c.gridx = 0;
c.gridy = 0;
c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
c.weightx = 1.0;
add(buildContentPanel(), c);
if (selectionComponent != null) {
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(UIUtilities.buildComponentPanel(
UIUtilities.setTextFont("Select the group(s) to add the " +
"User to")));
p.add(selectionComponent);
c.gridy++;
add(new JSeparator(), c);
c.gridy++;
add(p, c);
}
}
/**
* Creates a new instance.
*
* @param passwordRequired Pass <code>true</code> to indicate that a
* password is required, <code>false</code>
* otherwise.
* @param groups The available groups.
* @param selected The selected groups.
*/
ExperimenterPane(boolean passwordRequired, Collection<DataObject> available,
Collection<DataObject> selected)
{
this.passwordRequired = true;//passwordRequired;
initComponents(available, selected);
buildGUI();
}
/**
* Returns the experimenter to save.
*
* @return See above.
*/
Map<ExperimenterData, UserCredentials> getObjectToSave()
{
JTextField field = items.get(EditorUtil.DISPLAY_NAME);
String s = field.getText().trim();
ExperimenterData data = new ExperimenterData();
field = items.get(EditorUtil.FIRST_NAME);
String value = field.getText().trim();
if (value.length() == 0) value = "";
data.setFirstName(value);
field = items.get(EditorUtil.LAST_NAME);
value = field.getText().trim();
if (value.length() == 0) value = "";
data.setLastName(value);
field = items.get(EditorUtil.MIDDLE_NAME);
value = field.getText();
if (value == null) value = "";
data.setMiddleName(value.trim());
field = items.get(EditorUtil.EMAIL);
data.setEmail(field.getText().trim());
field = items.get(EditorUtil.INSTITUTION);
data.setInstitution(field.getText().trim());
Map<ExperimenterData, UserCredentials> m =
new HashMap<ExperimenterData, UserCredentials>();
StringBuffer buf = new StringBuffer();
buf.append(passwordField.getPassword());
if (s == null || s.length() == 0) return m;
String pass = buf.toString();
if (passwordRequired) {
if (pass == null || pass.length() == 0) {
UserNotifier un =
TreeViewerAgent.getRegistry().getUserNotifier();
un.notifyInfo("Create Experimenter", "Please Enter a Password");
return m;
}
}
UserCredentials uc = new UserCredentials(s, pass);
uc.setAdministrator(adminBox.isSelected());
uc.setOwner(ownerBox.isSelected());
m.put(data, uc);
return m;
}
/**
* Returns the selected groups.
*
* @return See above.
*/
List<GroupData> getSelectedGroups()
{
List<GroupData> groups = new ArrayList<GroupData>();
if (selectionComponent != null) {
Collection l = selectionComponent.getSelection();
if (l != null) {
Iterator i = l.iterator();
Object o;
while (i.hasNext()) {
o = i.next();
if (o instanceof GroupData)
groups.add((GroupData) o);
}
}
}
return groups;
}
/**
* Returns <code>true</code> if the login name has been populated,
* <code>false</code> otherwise.
*
* @return See above.
*/
boolean hasLoginName()
{
JTextField field = items.get(EditorUtil.DISPLAY_NAME);
String s = field.getText().trim();
return (s.length() != 0);
}
/**
* Returns <code>true</code> if the login name has been populated,
* <code>false</code> otherwise.
*
* @return See above.
*/
boolean hasLoginCredentials()
{
JTextField field = items.get(EditorUtil.DISPLAY_NAME);
String s = field.getText().trim();
int count = 0;
if (s.length() != 0) count++;
field = items.get(EditorUtil.FIRST_NAME);
s = field.getText().trim();
if (s.length() != 0) count++;
field = items.get(EditorUtil.LAST_NAME);
s = field.getText().trim();
if (s.length() != 0) count++;
return count == 3;
}
/**
* Controls if criteria are met to create a new user.
* @see PropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent evt)
{
String name = evt.getPropertyName();
if (AdminDialog.ENABLE_SAVE_PROPERTY.equals(name) ||
SelectionWizardUI.SELECTION_CHANGE.equals(name)) {
int count = 0;
if (hasLoginCredentials()) count++;
StringBuffer buf = new StringBuffer();
buf.append(passwordField.getPassword());
String v = buf.toString();
if (v.trim().length() > 0) count++;
List<GroupData> groups = getSelectedGroups();
if (groups != null && groups.size() > 0)
count++;
firePropertyChange(EXPERIMENTER_ENABLE_SAVE_PROPERTY, null,
count == 3);
}
}
}