/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2015 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.metadata.editor;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.openmicroscopy.shoola.agents.metadata.MetadataViewerAgent;
import org.openmicroscopy.shoola.agents.util.EditorUtil;
import org.openmicroscopy.shoola.agents.util.ui.PermissionsPane;
import org.openmicroscopy.shoola.env.data.model.AdminObject;
import org.openmicroscopy.shoola.env.ui.UserNotifier;
import org.openmicroscopy.shoola.util.ui.UIUtilities;
import omero.gateway.model.AnnotationData;
import omero.gateway.model.ExperimenterData;
import omero.gateway.model.GroupData;
/**
* Displays information about the currently selected group.
*
* @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 GroupProfile
extends AnnotationUI
implements DocumentListener, PropertyChangeListener
{
/** The name of the <code>Group</code>. */
private JTextField namePane;
/** The description of the <code>Group</code>. */
private JTextField descriptionPane;
/** Component displaying the permissions status. */
private PermissionsPane permissionsPane;
/** The original permissions level. */
private int level;
/** Flag indicating if the name can be edited or not.*/
private boolean canEdit;
/** The group object displayed.*/
private GroupData ref;
/** Save changes.*/
private JButton saveButton;
/** Reference to the view.*/
private EditorUI view;
/** Initializes the components composing this display. */
private void initComponents()
{
ref = (GroupData) model.getRefObject();
namePane = new JTextField();
descriptionPane = new JTextField();
final boolean mayChangePermissions = model.isAdministrator() || model.isGroupLeader(ref);
//permission level
permissionsPane = new PermissionsPane(ref.getPermissions(),
UIUtilities.BACKGROUND_COLOR, model.isAdministrator());
level = permissionsPane.getPermissions();
permissionsPane.allowDowngrade(!mayChangePermissions);
permissionsPane.setBorder(
BorderFactory.createTitledBorder("Permissions"));
//permissionsPane.displayWarningText();
permissionsPane.addPropertyChangeListener(this);
namePane.setText(ref.getName());
descriptionPane.setText(ref.getDescription());
canEdit = mayChangePermissions && !model.isSystemGroup(ref.getId());
namePane.setEditable(canEdit);
namePane.setEnabled(canEdit);
descriptionPane.setEditable(canEdit);
permissionsPane.setEnabled(canEdit);
if (canEdit) {
namePane.getDocument().addDocumentListener(this);
descriptionPane.getDocument().addDocumentListener(this);
}
saveButton = new JButton("Save");
saveButton.setEnabled(false);
saveButton.setBackground(UIUtilities.BACKGROUND_COLOR);
saveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
view.saveData(true);
}
});
}
/**
* Builds the panel hosting the user's details.
*
* @return See above.
*/
private JPanel buildContentPanel()
{
JPanel content = new JPanel();
content.setBackground(UIUtilities.BACKGROUND_COLOR);
JComponent label;
content.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(0, 2, 2, 0);
c.gridy = 0;
c.gridx = 0;
label = EditorUtil.getLabel("Name", true);
label.setBackground(UIUtilities.BACKGROUND_COLOR);
label.setBackground(UIUtilities.BACKGROUND_COLOR);
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(namePane, c);
c.gridx = 0;
c.gridy++;
label = UIUtilities.setTextFont("Description");
label.setBackground(UIUtilities.BACKGROUND_COLOR);
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(descriptionPane, c);
c.gridx = 0;
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 component displaying the owners of the group.
*
* @return See above.
*/
private JPanel buildOwnersPane()
{
JPanel p = new JPanel();
p.setBackground(UIUtilities.BACKGROUND_COLOR);
if (model.getRefObject() instanceof GroupData) {
GroupData group = (GroupData) model.getRefObject();
Set<ExperimenterData> leaders = group.getLeaders();
if (leaders == null || leaders.size() == 0) return p;
Iterator<ExperimenterData> i = leaders.iterator();
ExperimenterData exp;
while (i.hasNext()) {
exp = (ExperimenterData) i.next();
p.add(new JLabel(EditorUtil.formatExperimenter(exp)));
}
}
else {
return p;
}
JPanel content = UIUtilities.buildComponentPanel(p);
content.setBackground(UIUtilities.BACKGROUND_COLOR);
content.setBorder(BorderFactory.createTitledBorder("Owners"));
content.add(p);
return content;
}
/**
* Creates a new instance.
*
* @param model Reference to the model. Mustn't be <code>null</code>.
* @param view Reference to the control. Mustn't be <code>null</code>.
*/
GroupProfile(EditorModel model, EditorUI view)
{
super(model);
if (view == null)
throw new IllegalArgumentException("No view");
this.view = view;
setBackground(UIUtilities.BACKGROUND_COLOR);
}
/**
* Returns the object to update.
*
* @return See above.
*/
AdminObject getAdminObject()
{
if (!canEdit) return null;
GroupData data = (GroupData) model.getRefObject();
String v = namePane.getText();
v = v.trim();
if (!data.getName().equals(v)) {
if (model.doesGroupExist(data, v)) {
UserNotifier un =
MetadataViewerAgent.getRegistry().getUserNotifier();
un.notifyInfo("Update Group", "A group with the " +
"same name already exists.");
return null;
}
data.setName(v);
}
saveButton.setEnabled(false);
//check description
v = descriptionPane.getText();
v = v.trim();
String description = data.getDescription();
if (description == null) description = "";
if (!description.equals(v)) data.setDescription(v);
AdminObject o = new AdminObject(data, null, AdminObject.UPDATE_GROUP);
if (level != permissionsPane.getPermissions())
o.setPermissions(permissionsPane.getPermissions());
return o;
}
/**
* Overridden to lay out the UI.
* @see AnnotationUI#buildUI()
*/
protected void buildUI()
{
removeAll();
initComponents();
JPanel p = new JPanel();
p.setBackground(UIUtilities.BACKGROUND_COLOR);
p.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.NORTHWEST;
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;
p.add(buildContentPanel(), c);
c.gridy++;
p.add(permissionsPane, c);
c.gridy++;
p.add(buildOwnersPane(), c);
c.gridy++;
JPanel buttonPanel = UIUtilities.buildComponentPanel(saveButton);
buttonPanel.setBackground(UIUtilities.BACKGROUND_COLOR);
p.add(buttonPanel, c);
setLayout(new BorderLayout(0, 0));
add(p, BorderLayout.NORTH);
}
/**
* Removes all components.
* @see AnnotationUI#clearData(Object)
*/
protected void clearData(Object oldObject)
{
if (namePane != null) namePane.setText("");
if (descriptionPane != null) descriptionPane.setText("");
revalidate();
repaint();
}
/**
* Removes all components.
* @see AnnotationUI#clearDisplay()
*/
protected void clearDisplay() {}
/**
* No-operation implementation in our case.
* @see AnnotationUI#getAnnotationToRemove()
*/
protected List<Object> getAnnotationToRemove()
{
return new ArrayList<Object>();
}
/**
* No-operation implementation in our case.
* @see AnnotationUI#getAnnotationToSave()
*/
protected List<AnnotationData> getAnnotationToSave()
{
return new ArrayList<AnnotationData>();
}
/**
* Returns the title associated to this component.
* @see AnnotationUI#getComponentTitle()
*/
protected String getComponentTitle() { return "Group"; }
/**
* Returns <code>true</code> if user's info has been modified,
* <code>false</code> otherwise.
* @see AnnotationUI#hasDataToSave()
*/
protected boolean hasDataToSave()
{
if (saveButton != null) saveButton.setEnabled(false);
if (namePane == null) return false;
String v = namePane.getText();
v = v.trim();
if (v.length() == 0) {
saveButton.setEnabled(false);
return false;
}
if (!ref.getName().equals(v)) {
if (saveButton != null) saveButton.setEnabled(true);
return true;
}
//check description
v = descriptionPane.getText();
v = v.trim();
String description = ref.getDescription();
if (description == null) description = "";
if (!description.equals(v)) {
if (saveButton != null) saveButton.setEnabled(true);
return true;
}
boolean b = level != permissionsPane.getPermissions();
if (saveButton != null) saveButton.setEnabled(b);
return b;
}
/**
* Sets the title of the component.
* @see AnnotationUI#setComponentTitle()
*/
protected void setComponentTitle() {}
/**
* Fires property indicating that some text has been entered.
* @see DocumentListener#insertUpdate(DocumentEvent)
*/
public void insertUpdate(DocumentEvent e)
{
firePropertyChange(EditorControl.SAVE_PROPERTY,
Boolean.valueOf(false), Boolean.valueOf(true));
}
/**
* Fires property indicating that some text has been entered.
* @see DocumentListener#removeUpdate(DocumentEvent)
*/
public void removeUpdate(DocumentEvent e)
{
firePropertyChange(EditorControl.SAVE_PROPERTY,
Boolean.valueOf(false), Boolean.valueOf(true));
}
/**
* Listens to property fired by the {@link #permissionsPane}.
* @see PropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent evt)
{
String name = evt.getPropertyName();
if (PermissionsPane.PERMISSIONS_CHANGE_PROPERTY.equals(name))
firePropertyChange(EditorControl.SAVE_PROPERTY,
Boolean.valueOf(false), Boolean.valueOf(true));
}
/**
* Required by the {@link DocumentListener} I/F but no-op implementation
* in our case.
* @see DocumentListener#changedUpdate(DocumentEvent)
*/
public void changedUpdate(DocumentEvent e) {}
}