/* *------------------------------------------------------------------------------ * Copyright (C) 2006-2014 University of Dundee & Open Microscopy Environment. * 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.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.openmicroscopy.shoola.util.ui.SelectableMenu; import omero.gateway.model.ExperimenterData; import omero.gateway.model.GroupData; /** * Hosts the group and its associated menu. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @since 4.4 */ public class GroupItem extends SelectableMenu implements PropertyChangeListener { /** Bound property indicating that the users have been selected.*/ public static final String USER_SELECTION_PROPERTY; /** Text indicating to select all the groups.*/ public static final String ALL_GROUPS; /** Bound property indicating to select all the groups.*/ public static final String ALL_GROUPS_SELECTION_PROPERTY; /** Bound property indicating to select all the groups.*/ public static final String ALL_GROUPS_DESELECTION_PROPERTY; /** Bound property indicating to select all the users.*/ public static final String ALL_USERS_SELECTION_PROPERTY; static { USER_SELECTION_PROPERTY = "userSelection"; ALL_GROUPS = "All Groups"; ALL_GROUPS_SELECTION_PROPERTY = "allGroupsSelection"; ALL_GROUPS_DESELECTION_PROPERTY = "allGroupsDeselection"; ALL_USERS_SELECTION_PROPERTY = "allUsersSelection"; } /** The group hosted by this component.*/ private GroupData group; /** The List of components hosting the user.*/ private List<DataMenuItem> usersItem; /** The identifier of the user currently logged in.*/ private long userID; /** * Creates a new instance. * * @param group The group hosted by this component. * @param selected Pass <code>true</code> if the group is selected, * <code>false</code>. * @param selectable Pass <code>true</code> to allow user selection, * <code>false</code> otherwise. */ public GroupItem(GroupData group, boolean selected, boolean selectable) { super(selected, group.getName(), selectable); this.group = group; addPropertyChangeListener(this); } /** * Creates a new instance. * * @param group The group hosted by this component. * @param selected Pass <code>true</code> if the group is selected, * <code>false</code>. */ public GroupItem(GroupData group, boolean selected) { super(selected, group.getName(), true); this.group = group; addPropertyChangeListener(this); } /** * Creates a new default instance. * * @param selected Pass <code>true</code> if the item is selected, * <code>false</code>. */ public GroupItem(boolean selected) { super(selected, ALL_GROUPS, true); addPropertyChangeListener(this); } /** * Sets the list of components hosting the users. * * @param usersItem The value to set. */ public void setUsersItem(List<DataMenuItem> usersItem) { this.usersItem = usersItem; } /** * Sets the identifier of the user currently logged in. * * @param userID The value to set. */ public void setUserID(long userID) { this.userID = userID; } /** * Returns the group. * * @return See above. */ public GroupData getGroup() { return group; } /** * Returns the selected users. * * @return See above. */ public List<ExperimenterData> getSeletectedUsers() { List<ExperimenterData> users = new ArrayList<ExperimenterData>(); Iterator<DataMenuItem> i = usersItem.iterator(); DataMenuItem item; Object ho; while (i.hasNext()) { item = i.next(); ho = item.getDataObject(); if (item.isChecked() && ho instanceof ExperimenterData) users.add((ExperimenterData) ho); } return users; } /** * Sets the enabled flag of the items hosting the users. * * @param enabled Pass <code>true</code> to enable (user display), * <code>false</code> otherwise (group display). */ public void setDisplay(boolean enabled) { Iterator<DataMenuItem> i = usersItem.iterator(); DataMenuItem item; ExperimenterData exp; Object ho; while (i.hasNext()) { item = i.next(); item.setEnabled(enabled); if (!enabled) { item.setChecked(true); } else { ho = item.getDataObject(); if (ho instanceof ExperimenterData) { exp = (ExperimenterData) ho; item.setChecked(exp.getId() == userID); } else item.setChecked(false); } } } /** * Selects the user currently logged in if no user already selected. * * @param all Pass <code>true</code> to select all the users or * <code>false</code> to select the user currently logged in * if no user already selected. * @param select Pass <code>true</code> to select the users, * <code>false</code> to de-select. */ public void selectUsers(boolean all, boolean select) { DataMenuItem data; Object ho; if (all) { Iterator<DataMenuItem> i = usersItem.iterator(); while (i.hasNext()) { data = i.next(); ho = data.getDataObject(); if (ho instanceof ExperimenterData && data.isEnabled()) { data.setChecked(select); long id = ((ExperimenterData) ho).getId(); //always keep the user currently logged in even if //select is false if (id == userID) { data.setChecked(true); } } else if (ho instanceof String) { data.removePropertyChangeListener(this); data.setChecked(select); data.addPropertyChangeListener(this); } } } else { List<ExperimenterData> l = getSeletectedUsers(); if (CollectionUtils.isEmpty(l)) { //select the user currently logged in Iterator<DataMenuItem> i = usersItem.iterator(); while (i.hasNext()) { data = i.next(); ho = data.getDataObject(); if (ho instanceof ExperimenterData && data.isEnabled()) { long id = ((ExperimenterData) ho).getId(); if (id == userID) { data.setChecked(true); break; } } } } } } /** Handles the selection of menu items. * @see PropertyChangeListener#propertyChange(PropertyChangeEvent) */ public void propertyChange(PropertyChangeEvent evt) { String name = evt.getPropertyName(); if (DataMenuItem.ITEM_SELECTED_PROPERTY.equals(name)) { DataMenuItem item = (DataMenuItem) evt.getNewValue(); Object ho = item.getDataObject(); ExperimenterData exp; Iterator<DataMenuItem> i; List<ExperimenterData> l; if (ho instanceof String) { if (DataMenuItem.ALL_USERS_TEXT.equals(item.getRefString())) { selectUsers(true, item.isChecked()); i = usersItem.iterator(); boolean b = item.isChecked(); while (i.hasNext()) { item = i.next(); ho = item.getDataObject(); if (ho instanceof ExperimenterData && item.isEnabled()) { exp = (ExperimenterData) ho; if (b) item.setChecked(b); else { if (exp.getId() != userID) item.setChecked(b); } } } } } else { l = getSeletectedUsers(); //check that if we keep the "show All users" selected boolean all = l.size() == usersItem.size()-1; i = usersItem.iterator(); while (i.hasNext()) { item = i.next(); ho = item.getDataObject(); if (ho instanceof String) { if (DataMenuItem.ALL_USERS_TEXT.equals( item.getRefString())) { item.removePropertyChangeListener(this); item.setChecked(all); item.addPropertyChangeListener(this); } } } } l = getSeletectedUsers(); if (getGroup() != null) { if (isSelectable()) setMenuSelected(CollectionUtils.isNotEmpty(l), false); firePropertyChange(USER_SELECTION_PROPERTY, null, this); } else { //no longer select the group. boolean selected = item.isChecked(); if (!selected && isMenuSelected()) { setMenuSelected(false, false); } else if (selected && !isMenuSelected()) { setMenuSelected(true, false); } firePropertyChange(ALL_USERS_SELECTION_PROPERTY, null, selected); } } else if (SelectableMenu.GROUP_SELECTION_PROPERTY.equals(name)) { GroupItem item = (GroupItem) evt.getNewValue(); if (item != this) return; //Check if all groups need to be selected. GroupData group = item.getGroup(); if (group == null && GroupItem.ALL_GROUPS.equals(item.getText())) { if (item.isMenuSelected()) firePropertyChange(ALL_GROUPS_SELECTION_PROPERTY, null, this); else firePropertyChange(ALL_GROUPS_DESELECTION_PROPERTY, null, this); return; } if (!item.isMenuSelected()) { firePropertyChange(USER_SELECTION_PROPERTY, null, this); } else { selectUsers(false, true); firePropertyChange(USER_SELECTION_PROPERTY, null, this); } } } }