/* *------------------------------------------------------------------------------ * Copyright (C) 2006-2016 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.view; import java.awt.Component; import java.awt.Cursor; import java.awt.Point; import java.awt.Rectangle; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.Icon; import javax.swing.JDialog; import javax.swing.JFrame; import org.apache.commons.collections.CollectionUtils; import omero.model.OriginalFile; import org.openmicroscopy.shoola.agents.dataBrowser.view.DataBrowser; import org.openmicroscopy.shoola.agents.dataBrowser.view.DataBrowserFactory; import org.openmicroscopy.shoola.agents.events.SaveData; import org.openmicroscopy.shoola.agents.events.iviewer.CopyRndSettings; import org.openmicroscopy.shoola.agents.events.iviewer.RndSettingsCopied; import org.openmicroscopy.shoola.agents.events.treeviewer.ActivitiesEvent; import org.openmicroscopy.shoola.agents.events.treeviewer.BrowserSelectionEvent; import org.openmicroscopy.shoola.agents.events.treeviewer.ChangeUserGroupEvent; import org.openmicroscopy.shoola.agents.events.treeviewer.CopyItems; import org.openmicroscopy.shoola.agents.events.treeviewer.DeleteObjectEvent; import org.openmicroscopy.shoola.agents.events.treeviewer.DisplayModeEvent; import org.openmicroscopy.shoola.agents.metadata.MetadataViewerAgent; import org.openmicroscopy.shoola.agents.metadata.rnd.Renderer; import org.openmicroscopy.shoola.agents.metadata.view.MetadataViewer; import org.openmicroscopy.shoola.agents.metadata.view.MetadataViewerFactory; import org.openmicroscopy.shoola.agents.treeviewer.IconManager; import org.openmicroscopy.shoola.agents.treeviewer.ImageChecker.ImageCheckerType; import org.openmicroscopy.shoola.agents.treeviewer.TreeViewerAgent; import org.openmicroscopy.shoola.agents.treeviewer.browser.Browser; import org.openmicroscopy.shoola.agents.treeviewer.browser.BrowserFactory; import org.openmicroscopy.shoola.agents.treeviewer.cmd.ActionCmd; import org.openmicroscopy.shoola.agents.treeviewer.cmd.ExperimenterVisitor; import org.openmicroscopy.shoola.agents.treeviewer.cmd.UpdateVisitor; import org.openmicroscopy.shoola.agents.treeviewer.cmd.ViewCmd; import org.openmicroscopy.shoola.agents.treeviewer.cmd.ViewInPluginCmd; import org.openmicroscopy.shoola.agents.treeviewer.finder.ClearVisitor; import org.openmicroscopy.shoola.agents.treeviewer.finder.Finder; import org.openmicroscopy.shoola.agents.treeviewer.util.AdminDialog; import org.openmicroscopy.shoola.agents.treeviewer.util.ChgrpObject; import org.openmicroscopy.shoola.agents.treeviewer.util.GenericDialog; import org.openmicroscopy.shoola.agents.treeviewer.util.LinkNotificationDialog; import org.openmicroscopy.shoola.agents.treeviewer.util.MIFNotificationDialog; import org.openmicroscopy.shoola.agents.treeviewer.util.MoveGroupSelectionDialog; import org.openmicroscopy.shoola.agents.treeviewer.util.NotDeletedObjectDialog; import org.openmicroscopy.shoola.agents.treeviewer.util.OpenWithDialog; import org.openmicroscopy.shoola.agents.util.DataObjectRegistration; import org.openmicroscopy.shoola.agents.util.EditorUtil; import org.openmicroscopy.shoola.agents.util.SelectionWizard; import org.openmicroscopy.shoola.agents.util.browser.ContainerFinder; import org.openmicroscopy.shoola.agents.util.browser.NodesFinder; import org.openmicroscopy.shoola.agents.util.browser.TreeFileSet; import org.openmicroscopy.shoola.agents.util.browser.TreeImageDisplay; import org.openmicroscopy.shoola.agents.util.browser.TreeImageDisplayVisitor; import org.openmicroscopy.shoola.agents.util.browser.TreeImageSet; import org.openmicroscopy.shoola.agents.util.browser.TreeImageTimeSet; import org.openmicroscopy.shoola.agents.util.browser.TreeViewerTranslator; import org.openmicroscopy.shoola.agents.util.finder.AdvancedFinder; import org.openmicroscopy.shoola.agents.util.ui.EditorDialog; import org.openmicroscopy.shoola.agents.util.ui.GroupManagerDialog; import org.openmicroscopy.shoola.agents.util.ui.ScriptingDialog; import org.openmicroscopy.shoola.agents.util.ui.UserManagerDialog; import org.openmicroscopy.shoola.env.Environment; import org.openmicroscopy.shoola.env.LookupNames; import org.openmicroscopy.shoola.env.data.events.ExitApplication; import org.openmicroscopy.shoola.env.data.login.UserCredentials; import org.openmicroscopy.shoola.env.data.model.AdminObject; import org.openmicroscopy.shoola.env.data.model.ApplicationData; import org.openmicroscopy.shoola.env.data.model.DeletableObject; import org.openmicroscopy.shoola.env.data.model.DeleteActivityParam; import org.openmicroscopy.shoola.env.data.model.DownloadActivityParam; import org.openmicroscopy.shoola.env.data.model.DownloadArchivedActivityParam; import org.openmicroscopy.shoola.env.data.model.ImageCheckerResult; import org.openmicroscopy.shoola.env.data.model.OpenActivityParam; import org.openmicroscopy.shoola.env.data.model.ScriptObject; import org.openmicroscopy.shoola.env.data.model.TimeRefObject; import org.openmicroscopy.shoola.env.data.model.TransferableActivityParam; import org.openmicroscopy.shoola.env.data.model.TransferableObject; import omero.gateway.SecurityContext; import omero.gateway.model.SearchResultCollection; import org.openmicroscopy.shoola.env.event.EventBus; import org.openmicroscopy.shoola.env.rnd.RndProxyDef; import org.openmicroscopy.shoola.env.ui.ActivityComponent; import org.openmicroscopy.shoola.env.ui.UserNotifier; import org.openmicroscopy.shoola.util.PojosUtil; import org.openmicroscopy.shoola.util.ui.MessageBox; import org.openmicroscopy.shoola.util.ui.UIUtilities; import org.openmicroscopy.shoola.util.ui.component.AbstractComponent; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import omero.gateway.model.DataObject; import omero.gateway.model.DatasetData; import omero.gateway.model.ExperimenterData; import omero.gateway.model.FileAnnotationData; import omero.gateway.model.FileData; import omero.gateway.model.GroupData; import omero.gateway.model.ImageData; import omero.gateway.model.PermissionData; import omero.gateway.model.PlateAcquisitionData; import omero.gateway.model.PlateData; import omero.gateway.model.ProjectData; import omero.gateway.model.ScreenData; import omero.gateway.model.TagAnnotationData; import omero.gateway.model.WellData; import omero.gateway.model.WellSampleData; /** * Implements the {@link TreeViewer} interface to provide the functionality * required of the tree viewer component. * This class is the component hub and embeds the component's MVC triad. * It manages the component's state machine and fires state change * notifications as appropriate, but delegates actual functionality to the * MVC sub-components. * * @see org.openmicroscopy.shoola.agents.treeviewer.view.TreeViewerModel * @see org.openmicroscopy.shoola.agents.treeviewer.view.TreeViewerWin * @see org.openmicroscopy.shoola.agents.treeviewer.view.TreeViewerControl * * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @version 2.2 * @since OME2.2 */ class TreeViewerComponent extends AbstractComponent implements TreeViewer { /** Warning message shown when the rendering settings are to be reset */ public static final String RENDERINGSETTINGS_WARNING = "This will change the " + "rendering settings of all images\nin the dataset/plate and cannot be undone.\n" + "Proceed?"; /** The Model sub-component. */ private TreeViewerModel model; /** The Controller sub-component. */ private TreeViewerControl controller; /** The View sub-component. */ private TreeViewerWin view; /** The dialog presenting the list of available users. */ private UserManagerDialog switchUserDialog; /** The dialog displaying the selected script.*/ private ScriptingDialog scriptDialog; /** * Moves the object. * * @param object The object to move. */ private void moveObject(ChgrpObject object) { GroupData group = object.getGroupData(); SecurityContext ctx = new SecurityContext(group.getId()); long userID = object.getUserID(); if (userID >= 0) { ExperimenterData exp = model.getExperimenter(); if (userID == exp.getId()) { Class<?> type = object.getDataType(); if (ImageData.class.equals(type) || DatasetData.class.equals(type)) type = ProjectData.class; else if (ProjectData.class.equals(type)) type = null; else if (PlateData.class.equals(type)) type = ScreenData.class; else if (ScreenData.class.equals(type)) type = null; else if (GroupData.class.equals(type) || ExperimenterData.class.equals(type)) type = null; if (type != null) { MoveGroupSelectionDialog dialog = new MoveGroupSelectionDialog(view, userID, object, true); dialog.addPropertyChangeListener( new PropertyChangeListener() { /** * Transfers the data. */ public void propertyChange(PropertyChangeEvent evt) { String name = evt.getPropertyName(); if (MoveGroupSelectionDialog.TRANSFER_PROPERTY.equals( name)) { ChgrpObject v = (ChgrpObject) evt.getNewValue(); GroupData group = v.getGroupData(); SecurityContext ctx = new SecurityContext( group.getId()); moveData(ctx, v.getTarget(), v.getTransferable()); } } }); model.fireMoveDataLoading(ctx, dialog, type, userID); UIUtilities.centerAndShow(dialog); } } else moveData(ctx, object.getTarget(), object.getTransferable()); } else { moveData(ctx, object.getTarget(), object.getTransferable()); } } /** * Deletes the specified nodes. * * @param nodes The nodes to delete. */ private void delete(List nodes) { if (nodes == null) return; Iterator i = nodes.iterator(); TreeImageDisplay node; Class type = null; Boolean ann = null; Boolean leader = null; String ns = null; GroupData group; long userID = model.getExperimenter().getId(); boolean notOwner = false; while (i.hasNext()) { node = (TreeImageDisplay) i.next(); if (node.isAnnotated() && ann == null) ann = true; Object uo = node.getUserObject(); type = uo.getClass(); if (uo instanceof DataObject) { if( leader == null) { group = model.getGroup(((DataObject) uo).getGroupId()); if (EditorUtil.isUserGroupOwner(group, userID)) { leader = true; } } if(((DataObject)uo).getOwner().getId()!=userID) notOwner = true; } if (uo instanceof TagAnnotationData) ns = ((TagAnnotationData) uo).getNameSpace(); } boolean b = false; if (ann != null) b = ann.booleanValue(); boolean le = false; if (leader != null) le = leader.booleanValue(); DeleteBox dialog = new DeleteBox(view, type, b, nodes.size(), ns, le, notOwner); if (dialog.centerMsgBox() == DeleteBox.YES_OPTION) { boolean content = dialog.deleteContents(); List<Class> types = dialog.getAnnotationTypes(); i = nodes.iterator(); Object obj; List<DeletableObject> l = new ArrayList<DeletableObject>(); DeletableObject d; List<DataObject> objects = new ArrayList<DataObject>(); List<DataObject> values = null; List<Long> ids = new ArrayList<Long>(); Class klass = null; while (i.hasNext()) { node = (TreeImageDisplay) i.next(); obj = node.getUserObject(); if (obj instanceof GroupData || obj instanceof ExperimenterData) { if (values == null) values = new ArrayList<DataObject>(); values.add((DataObject) obj); } else if (obj instanceof DataObject) { d = new DeletableObject((DataObject) obj, content); if (!(obj instanceof TagAnnotationData || obj instanceof FileAnnotationData)) d.setAttachmentTypes(types); checkForImages(node, objects, content); l.add(d); } klass = obj.getClass(); ids.add(((DataObject) obj).getId()); } if (l.size() > 0) { model.setNodesToCopy(null, -1); EventBus bus = TreeViewerAgent.getRegistry().getEventBus(); bus.post(new DeleteObjectEvent(objects)); NodesFinder finder = new NodesFinder(klass, ids); Browser browser = model.getSelectedBrowser(); browser.accept(finder); browser.removeTreeNodes(finder.getNodes()); view.removeAllFromWorkingPane(); DataBrowserFactory.discardAll(); model.getMetadataViewer().setRootObject(null, -1, null); IconManager icons = IconManager.getInstance(); DeleteActivityParam p = new DeleteActivityParam( icons.getIcon(IconManager.APPLY_22), l); p.setFailureIcon(icons.getIcon(IconManager.DELETE_22)); UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyActivity(model.getSecurityContext(), p); } if (values != null) { NodesFinder finder = new NodesFinder(klass, ids); Browser browser = model.getSelectedBrowser(); browser.accept(finder); browser.removeTreeNodes(finder.getNodes()); view.removeAllFromWorkingPane(); DataBrowserFactory.discardAll(); model.getMetadataViewer().setRootObject(null, -1, null); model.fireObjectsDeletion(values); fireStateChange(); } } } /** * Checks for the images if loaded. * * @param object The object to handle. * @param objects The list to add the found image if any. * @param content Pass <code>true</code> if the content has to be deleted. * <code>false</code> otherwise. */ private void checkForImages(TreeImageDisplay object, List<DataObject> objects, boolean content) { List list = object.getChildrenDisplay(); Iterator i, j; TreeImageDisplay child, child2; List children; DataObject ho = (DataObject) object.getUserObject(); if (ho instanceof ImageData) { objects.add(ho); } else if (ho instanceof DatasetData && content) { if (object.isChildrenLoaded()) { objects.add(ho); } } else if (ho instanceof ProjectData && content) { if (object.isChildrenLoaded()) { i = list.iterator(); while (i.hasNext()) { child = (TreeImageDisplay) i.next(); if (child.getUserObject() instanceof DatasetData) { if (child.isChildrenLoaded()) { objects.add((DataObject) child.getUserObject()); } } } } } else if (ho instanceof PlateData) { objects.add(ho); } else if (ho instanceof PlateAcquisitionData) { TreeImageDisplay parent = object.getParentDisplay(); objects.add((DataObject) parent.getUserObject()); } else if (ho instanceof ScreenData && content) { if (object.isChildrenLoaded()) { i = list.iterator(); while (i.hasNext()) { child = (TreeImageDisplay) i.next(); if (child.getUserObject() instanceof PlateData) { if (child.isChildrenLoaded()) { objects.add((DataObject) child.getUserObject()); } } } } } } /** * Returns the name of the group. * * @param groupId The id of the group. * @return See above. */ private String getGroupName(long groupId) { Collection groups = TreeViewerAgent.getAvailableUserGroups(); Iterator j = groups.iterator(); GroupData group; while (j.hasNext()) { group = (GroupData) j.next(); if (group.getId() == groupId) return group.getName(); } return ""; } /** * Removes the nodes from the display. * * @param trans The node to remove. */ private void removeNodes(Map<SecurityContext, List<DataObject>> trans) { EventBus bus = TreeViewerAgent.getRegistry().getEventBus(); List<DataObject> objects = new ArrayList<DataObject>(); Iterator<List<DataObject>> i = trans.values().iterator(); List<DataObject> l; while (i.hasNext()) { l = i.next(); if (l != null) objects.addAll(l); } bus.post(new DeleteObjectEvent(objects)); NodesFinder finder = new NodesFinder(objects); Browser browser = model.getSelectedBrowser(); browser.accept(finder); browser.removeTreeNodes(finder.getNodes()); view.removeAllFromWorkingPane(); DataBrowserFactory.discardAll(); model.getMetadataViewer().setRootObject(null, -1, null); } /** * Moves the objects. * * @param ctx The group to move the data to. * @param target The target object. * @param trans The objects to transfer. */ private void moveData(SecurityContext ctx, DataObject target, Map<SecurityContext, List<DataObject>> trans) { removeNodes(trans); TransferableObject t = new TransferableObject(ctx, target, trans); t.setGroupName(getGroupName(ctx.getGroupID())); IconManager icons = IconManager.getInstance(); TransferableActivityParam param = new TransferableActivityParam( icons.getIcon(IconManager.MOVE_22), t); param.setFailureIcon(icons.getIcon(IconManager.MOVE_FAILED_22)); UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyActivity(model.getSecurityContext(), param); } /** * Notifies the change of group. * * @param oldId The previous group id. */ private void notifyChangeGroup(long oldId) { long id = model.getSelectedGroupId(); ChangeUserGroupEvent evt = new ChangeUserGroupEvent(id, oldId); TreeViewerAgent.getRegistry().getEventBus().post(evt); firePropertyChange(GROUP_CHANGED_PROPERTY, oldId, id); } /** * Returns the group the specified node belongs to. * * @param node The node to handle. * @return See above. */ private GroupData getContext(TreeImageDisplay node) { if (node == null) return null; if (node.getUserObject() instanceof GroupData) { return (GroupData) node.getUserObject(); } TreeImageDisplay parent = node.getParentDisplay(); Object ho; if (parent == null) { ho = node.getUserObject(); if (ho instanceof GroupData) return (GroupData) ho; return null; } ho = parent.getUserObject(); if (ho instanceof GroupData) return (GroupData) ho; return getContext(parent); } /** * Returns the name corresponding the specified object. * * @param object The object to handle. * @return See above. */ private String getObjectType(Object object) { if (object instanceof DatasetData) return "dataset"; else if (object instanceof ProjectData) return "project"; else if (object instanceof GroupData) return "group"; else if (object instanceof ScreenData) return "screen"; else if (object instanceof PlateData) return "plate"; else if (object instanceof ImageData) return "image"; else if (object instanceof TagAnnotationData) { TagAnnotationData tag = (TagAnnotationData) object; if (TagAnnotationData.INSIGHT_TAGSET_NS.equals(tag.getNameSpace())) return "tagSet"; return "tag"; } return "item"; } /** * Downloads the files. * * @param folder The folder to save the file into. * @param override Pass <code>true</code> to keep the name of the * file, <code>false</code> otherwise. * @param fa The file to download. * @param data The application to open the document with or * <code>null</code>. */ private void downloadFile(File folder, boolean override, FileAnnotationData fa, ApplicationData data) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); OriginalFile f = (OriginalFile) fa.getContent(); IconManager icons = IconManager.getInstance(); DownloadActivityParam activity = new DownloadActivityParam(f, folder, icons.getIcon(IconManager.DOWNLOAD_22)); activity.setFileName(fa.getFileName()); un.notifyActivity(model.getSecurityContext(), activity); } /** * Returns the SecurityContext if already added or <code>null</code>. * * @param map The map to check. * @param id The group's identifier. * @return See above. */ private SecurityContext getKey( Map<SecurityContext, List<DataObject>> map, long id) { Iterator<SecurityContext> i = map.keySet().iterator(); SecurityContext ctx; while (i.hasNext()) { ctx = i.next(); if (ctx.getGroupID() == id) return ctx; } return null; } /** * Checks if a browser associated to the passed node has been * discarded. * * @param display The node to handle. */ private DataBrowser handleDiscardedBrowser(TreeImageDisplay display) { if (!DataBrowserFactory.hasBeenDiscarded(display)) return null; DataBrowser db = null; Browser browser = model.getSelectedBrowser(); List list; List<ApplicationData> app = null; if (display.isChildrenLoaded() && display.containsImages()) { List l = display.getChildrenDisplay(); if (l != null) { Set s = new HashSet(); Iterator i = l.iterator(); TreeImageDisplay child; //copy the node. while (i.hasNext()) { child = (TreeImageDisplay) i.next(); s.add(child.getUserObject()); } setLeaves((TreeImageSet) display, s); db = DataBrowserFactory.getDataBrowser(display); list = browser.getSelectedDataObjects(); if (list != null && list.size() == 1) { app = TreeViewerFactory.getApplications( model.getObjectMimeType(list.get(0))); } db.setSelectedNodes(list, app); } } return db; } /** * Displays the data browser corresponding to the passed node. * * @param object The object of reference. * @param display The node to handle. * @param visible Pass <code>true</code> to display the browser, * <code>false</code> otherwise. */ private void showDataBrowser(Object object, TreeImageDisplay display, boolean visible) { DataBrowser db = null; TreeImageDisplay parent = null; Browser browser = model.getSelectedBrowser(); if (display != null) parent = display.getParentDisplay(); List list; List<ApplicationData> app = null; if (display instanceof TreeImageTimeSet || (display instanceof TreeFileSet && ((TreeFileSet) display).getType() == TreeFileSet.ORPHANED_IMAGES)) { db = DataBrowserFactory.getDataBrowser(display); if (db != null) { db.setComponentTitle(""); if (visible) { view.removeAllFromWorkingPane(); view.displayBrowser(db); } } else { db = handleDiscardedBrowser(display); if (visible) { view.removeAllFromWorkingPane(); } } if (db != null) db.setSelectedNodes(null, null); return; } if (object instanceof ImageData) { TreeImageDisplay displayParent = null; if (display != null) { displayParent = display.getParentDisplay(); } if (displayParent instanceof TreeImageTimeSet || (displayParent instanceof TreeFileSet && ((TreeFileSet) displayParent).getType() == TreeFileSet.ORPHANED_IMAGES)) { db = DataBrowserFactory.getDataBrowser(displayParent); if (db != null) { db.setComponentTitle(""); if (visible) { view.removeAllFromWorkingPane(); view.displayBrowser(db); } List<DataObject> nodes = new ArrayList<DataObject>(); //nodes.add((DataObject) object); nodes = browser.getSelectedDataObjects(); db.setSelectedNodes(nodes, TreeViewerFactory.getApplications( model.getObjectMimeType(object))); } else { db = handleDiscardedBrowser(displayParent); } model.setDataViewer(db); return; } if (parent != null) { Object ho = parent.getUserObject(); db = DataBrowserFactory.getDataBrowser(ho); DataBrowser mdb = model.getDataViewer(); if (mdb != db) { DataBrowser gdb = DataBrowserFactory.getDataBrowser( parent.getParentDisplay().getUserObject()); if (gdb != null) db = gdb; } if (db != null) { db.setComponentTitle(""); if (visible) { view.removeAllFromWorkingPane(); view.displayBrowser(db); } list = browser.getSelectedDataObjects(); if (list != null && list.size() == 1) { app = TreeViewerFactory.getApplications( model.getObjectMimeType(list.get(0))); } db.setSelectedNodes(list, app); } else { if (DataBrowserFactory.hasBeenDiscarded(ho)) { //refresh if (parent.isChildrenLoaded()) { List l = parent.getChildrenDisplay(); if (l != null) { Set s = new HashSet(); Iterator i = l.iterator(); if (ho instanceof DatasetData) { TreeImageDisplay child; //copy the node. while (i.hasNext()) { child = (TreeImageDisplay) i.next(); s.add(child.getUserObject()); } setLeaves((TreeImageSet) parent, s); db = DataBrowserFactory.getDataBrowser(ho); list = browser.getSelectedDataObjects(); if (list != null && list.size() == 1) { app = TreeViewerFactory.getApplications( model.getObjectMimeType(list.get(0))); } db.setSelectedNodes(list, app); } else if (ho instanceof GroupData) { TreeImageDisplay child; //copy the node. while (i.hasNext()) { child = (TreeImageDisplay) i.next(); s.add(child.getUserObject()); } setLeaves((TreeImageSet) parent, s); db = DataBrowserFactory.getDataBrowser(ho); list = browser.getSelectedDataObjects(); db.setSelectedNodes(list, app); } else if (ho instanceof TagAnnotationData) { TagAnnotationData tag = (TagAnnotationData) ho; if (tag.getTags() == null) { TreeImageDisplay child; while (i.hasNext()) { child = (TreeImageDisplay) i.next(); s.add(child.getUserObject()); } setLeaves((TreeImageSet) parent, s); db = DataBrowserFactory.getDataBrowser( ho); list = browser.getSelectedDataObjects(); if (list != null && list.size() == 1) { app = TreeViewerFactory.getApplications( model.getObjectMimeType( list.get(0))); } db.setSelectedNodes(list, app); } } } } } else showDataBrowser(object, parent.getParentDisplay(), visible); } } else { view.removeAllFromWorkingPane(); } } else if (object instanceof ExperimenterData && browser.getBrowserType() == Browser.ADMIN_EXPLORER) { Object ho = null; if (display.getParentDisplay() != null) { ho = display.getParentDisplay().getUserObject(); db = DataBrowserFactory.getDataBrowser(ho); } else db = null; if (db != null) { db.setComponentTitle(""); if (visible) { view.removeAllFromWorkingPane(); view.addComponent(db.getUI(model.isFullScreen())); } List<DataObject> nodes = new ArrayList<DataObject>(); nodes.add((DataObject) object); db.setSelectedNodes(nodes, TreeViewerFactory.getApplications( model.getObjectMimeType(object))); } } else { TreeImageDisplay[] displayedNodes = browser.getSelectedDisplays(); if (displayedNodes != null && displayedNodes.length > 1) { if (object instanceof DatasetData || object instanceof PlateAcquisitionData || object instanceof PlateData) { view.removeAllFromWorkingPane(); model.setDataViewer(null); return; } } Object p = object; if (object instanceof PlateData) { PlateData plate = (PlateData) object; Set<PlateAcquisitionData> set = plate.getPlateAcquisitions(); if (set != null && set.size() == 1) { Iterator<PlateAcquisitionData> k = set.iterator(); while (k.hasNext()) { p = k.next(); } } } db = DataBrowserFactory.getDataBrowser(p); if (db != null) { db.setComponentTitle(""); if (visible) { view.removeAllFromWorkingPane(); view.addComponent(db.getUI(model.isFullScreen())); } if (object instanceof DataObject) { List<DataObject> nodes = new ArrayList<DataObject>(); nodes.add((DataObject) object); db.setSelectedNodes(nodes, TreeViewerFactory.getApplications( model.getObjectMimeType(object))); } } else { //depending on object view.removeAllFromWorkingPane(); if (display != null) { if (display.isChildrenLoaded()) { List l = display.getChildrenDisplay(); if (l != null) { Set s = new HashSet(); Iterator i = l.iterator(); if (object instanceof DatasetData) { TreeImageDisplay child; //copy the node. while (i.hasNext()) { child = (TreeImageDisplay) i.next(); s.add(child.getUserObject()); } setLeaves((TreeImageSet) display, s); db = DataBrowserFactory.getDataBrowser( display.getUserObject()); list = browser.getSelectedDataObjects(); if (list != null && list.size() == 1) { app = TreeViewerFactory.getApplications( model.getObjectMimeType(list.get(0))); } db.setSelectedNodes(list, app); } else if (object instanceof GroupData) { if (browser.getBrowserType() == Browser.ADMIN_EXPLORER) { TreeImageDisplay child; //copy the node. while (i.hasNext()) { child = (TreeImageDisplay) i.next(); s.add(child.getUserObject()); } setLeaves((TreeImageSet) display, s); db = DataBrowserFactory.getDataBrowser( display.getUserObject()); list = browser.getSelectedDataObjects(); db.setSelectedNodes(list, app); } } else if (object instanceof TagAnnotationData) { TagAnnotationData tag = (TagAnnotationData) object; if (tag.getTags() == null) { TreeImageDisplay child; while (i.hasNext()) { child = (TreeImageDisplay) i.next(); s.add(child.getUserObject()); } setLeaves((TreeImageSet) display, s); db = DataBrowserFactory.getDataBrowser( display.getUserObject()); list = browser.getSelectedDataObjects(); db.setSelectedNodes(list, null); } } } }// else showDataBrowser(object, parent); }// else view.removeAllFromWorkingPane(); } } model.setDataViewer(db); if (db != null) { Browser b = getSelectedBrowser(); if (b != null) b.addComponent(db.getGridUI()); } } /** * Creates a new instance. * The {@link #initialize() initialize} method should be called straight * after to complete the MVC set up. * * @param model The Model sub-component. */ TreeViewerComponent(TreeViewerModel model) { if (model == null) throw new NullPointerException("No model."); this.model = model; controller = new TreeViewerControl(this); view = new TreeViewerWin(); Finder f = new Finder(this); model.setFinder(f); f.addPropertyChangeListener(controller); } /** * Links up the MVC triad. * * @param bounds The bounds of the component invoking a new * {@link TreeViewer}. */ void initialize(Rectangle bounds) { controller.initialize(view); view.initialize(controller, model, bounds); model.getMetadataViewer().addPropertyChangeListener(controller); } /** * Notifies the model that the user has annotated data. * * @param containers The objects to handle. * @param count A positive value if annotations are added, a negative value * if annotations are removed. */ void onAnnotated(List<DataObject> containers, int count) { Browser browser = model.getSelectedBrowser(); if (containers != null && containers.size() > 0) { NodesFinder finder = new NodesFinder(containers); if (browser != null) browser.accept(finder); Set<TreeImageDisplay> nodes = finder.getNodes(); //mark if (browser != null && nodes != null && nodes.size() > 0) { Iterator<TreeImageDisplay> i = nodes.iterator(); while (i.hasNext()) { i.next().setAnnotationCount(count); } browser.getUI().repaint(); } } } /** * Sets the image to copy the rendering settings from. * * @param image The image to copy the rendering settings from. * @param rndProxyDef Copied 'pending' rendering settings (can be null) */ void setRndSettings(ImageData image, RndProxyDef rndProxyDef) { if (model.getState() == DISCARDED) return; model.setRndSettings(image, rndProxyDef); } /** * Notifies that the rendering settings have been copied. * * @param imageIds The collection of updated images */ void onRndSettingsCopied(Collection<Long> imageIds) { if (model.getState() == DISCARDED) return; MetadataViewer mv = model.getMetadataViewer(); if (mv != null) mv.onRndSettingsCopied(imageIds); } /** Shuts down the component.*/ void shutDown() { view.setVisible(false); view.dispose(); discard(); model.setState(NEW); } /** * Returns the Model sub-component. * * @return See above. */ TreeViewerModel getModel() { return model; } /** * Sets to <code>true</code> if the component is recycled, * to <code>false</code> otherwise. * * @param b The value to set. */ void setRecycled(boolean b) { model.setRecycled(b); } /** * Saves the data before closing. * * @param evt The event to handle. */ void saveOnClose(SaveData evt) { /* Editor editor = model.getEditor(); switch (evt.getType()) { case SaveData.DATA_MANAGER_ANNOTATION: if (editor == null) editor.saveData(); break; case SaveData.DATA_MANAGER_EDIT: if (editor == null) editor.saveData(); break; }; */ } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getState() */ public int getState() { return model.getState(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#activate() */ public void activate() { switch (model.getState()) { case NEW: view.setVisible(true); view.setOnScreen(); view.selectFirstPane(); model.getSelectedBrowser().activate(); model.setState(READY); break; //case DISCARDED: //throw new IllegalStateException( // "This method can't be invoked in the DISCARDED state."); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getBrowsers() */ public Map<Integer, Browser> getBrowsers() { return model.getBrowsers(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#discard() */ public void discard() { Map<Integer, Browser> browsers = getBrowsers(); Iterator<Browser> i = browsers.values().iterator(); while (i.hasNext()) i.next().discard(); model.discard(); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getSelectedBrowser() */ public Browser getSelectedBrowser() { return model.getSelectedBrowser(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getDefaultBrowser() */ public Browser getDefaultBrowser() { Map<Integer, Browser> browsers = model.getBrowsers(); return browsers.get(TreeViewerAgent.getDefaultHierarchy()); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setSelectedBrowser(Browser, boolean) */ public void setSelectedBrowser(Browser browser, boolean activate) { switch (model.getState()) { case DISCARDED: case SAVE: throw new IllegalStateException( "This method cannot be invoked in the DISCARDED or " + "SAVE state."); } if (view.getDisplayMode() == TreeViewer.SEARCH_MODE) { view.showAdvancedFinder(); view.removeAllFromWorkingPane(); } Browser oldBrowser = model.getSelectedBrowser(); if (oldBrowser == null || !oldBrowser.equals(browser)) { if (!activate) { view.selectPane(browser.getBrowserType()); } model.setSelectedBrowser(browser); if (browser != null && activate) { browser.activate(); if (browser.getBrowserType() == Browser.ADMIN_EXPLORER) { ExperimenterData exp = model.getUserDetails(); model.getMetadataViewer().setRootObject(null, exp.getId(), null); } } removeEditor(); model.getMetadataViewer().setSelectionMode(false); firePropertyChange(SELECTED_BROWSER_PROPERTY, oldBrowser, browser); } Browser b = model.getSelectedBrowser(); int t = -1; if (b != null) t = b.getBrowserType(); EventBus bus = TreeViewerAgent.getRegistry().getEventBus(); bus.post(new BrowserSelectionEvent(t)); view.updateMenuItems(); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#displayBrowser(int) */ public void displayBrowser(int browserType) { switch (model.getState()) { case DISCARDED: case SAVE: throw new IllegalStateException( "This method cannot be invoked in the DISCARDED " + "or SAVE state."); } Map<Integer, Browser> browsers = model.getBrowsers(); Browser browser = browsers.get(browserType); if (browser.isDisplayed()) { view.removeBrowser(browser); } else { model.setSelectedBrowser(browser); view.addBrowser(browser); } browser.setDisplayed(!browser.isDisplayed()); removeEditor(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#createDataObject(DataObject, boolean) */ public void createDataObject(DataObject object, boolean withParent) { switch (model.getState()) { case DISCARDED: case SAVE: throw new IllegalStateException( "This method cannot be invoked in the DISCARDED " + "or SAVE state."); } if (object == null) return; JDialog d = null; if ((object instanceof ProjectData) || (object instanceof DatasetData) || (object instanceof ScreenData) || (object instanceof TagAnnotationData)) { d = new EditorDialog(view, object, withParent); } else if ((object instanceof GroupData) || (object instanceof ExperimenterData)) { Object uo = null; Set<DataObject> nodes = null; if (object instanceof ExperimenterData) { Browser browser = getSelectedBrowser(); TreeImageDisplay node = null; if (browser != null) node = browser.getLastSelectedDisplay(); if (node != null) uo = node.getUserObject(); ContainerFinder finder = new ContainerFinder(GroupData.class); getSelectedBrowser().accept(finder, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); nodes = finder.getContainers(); if (nodes.size() == 0) { //Notify user UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("User Creation", "No group available. Please create a group first."); return; } } d = new AdminDialog(view, model.getAdminContext(), object.getClass(), uo, nodes); } if (d != null) { d.addPropertyChangeListener(controller); UIUtilities.centerAndShow(d); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#cancel() */ public void cancel() { if (model.getState() != DISCARDED) { model.cancel(); fireStateChange(); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#removeEditor() */ public void removeEditor() { switch (model.getState()) { case DISCARDED: //case SAVE: throw new IllegalStateException("This method cannot be " + "invoked in the DISCARDED, SAVE state."); } view.removeAllFromWorkingPane(); model.getMetadataViewer().setRootObject(null, -1, null); firePropertyChange(REMOVE_EDITOR_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getUserDetails() */ public ExperimenterData getUserDetails() { return model.getUserDetails(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#showFinder(boolean) */ public void showFinder(boolean b) { switch (model.getState()) { case DISCARDED: throw new IllegalStateException("This method cannot " + "be invoked in the DISCARDED state."); } if (model.getSelectedBrowser() == null) return; Finder finder = model.getFinder(); if (b == finder.isDisplay()) return; Boolean oldValue = finder.isDisplay() ? Boolean.TRUE : Boolean.FALSE, newValue = b ? Boolean.TRUE : Boolean.FALSE; view.showFinder(b); firePropertyChange(FINDER_VISIBLE_PROPERTY, oldValue, newValue); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#closeWindow() */ public void closeWindow() { cancel(); if (TreeViewerFactory.isLastViewer()) { EventBus bus = TreeViewerAgent.getRegistry().getEventBus(); ExitApplication a = new ExitApplication( !TreeViewerAgent.isRunAsPlugin()); GroupData group = model.getSelectedGroup(); if (group != null) a.setSecurityContext(new SecurityContext(group.getId())); bus.post(a); } else discard(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#onSelectedDisplay() */ public void onSelectedDisplay() { switch (model.getState()) { case DISCARDED: //case SAVE: throw new IllegalStateException("This method cannot be " + "invoked in the DISCARDED, SAVE state."); } view.initializeDisplay(); Browser browser = model.getSelectedBrowser(); if (browser == null) return; TreeImageDisplay display = browser.getLastSelectedDisplay(); //Update the group. GroupData group = getContext(display); if (group != null) { long oldId = model.getSelectedGroupId(); model.setSelectedGroupId(group.getId()); notifyChangeGroup(oldId); } model.setDataViewer(null); MetadataViewer metadata = model.getMetadataViewer(); TreeImageDisplay[] selection = browser.getSelectedDisplays(); boolean single = selection.length == 1; //Need to review. that if (display instanceof TreeImageTimeSet) { single = false; TreeImageTimeSet time = (TreeImageTimeSet) display; view.removeAllFromWorkingPane(); if (!time.containsImages()) { metadata.setRootObject(null, -1, null); } showDataBrowser(display.getUserObject(), display, true); return; } if (display != null) { Object object = display.getUserObject(); metadata.setSelectionMode(single); if (single) { ExperimenterData exp = browser.getNodeOwner(display); if (exp == null) exp = model.getUserDetails(); // setRootObject relies on selection mode set above metadata.setRootObject(object, exp.getId(), browser.getSecurityContext(display)); TreeImageDisplay p = display.getParentDisplay(); if (p != null) { TreeImageDisplay pp = p.getParentDisplay(); Object gpp = null; if (pp != null) gpp = pp.getUserObject(); metadata.setParentRootObject(p.getUserObject(), gpp); } } else { List<Object> l = new ArrayList<Object>(selection.length); for (int i = 0; i < selection.length; i++) { l.add(selection[i].getUserObject()); } if (l.size() > 0) { metadata.setRelatedNodes(l); } } if (!model.isFullScreen()) { showDataBrowser(object, display, false); browse(display, null, true); } else showDataBrowser(object, display, true); } else { DataBrowser db = model.getDataViewer(); if (db != null) db.setSelectedNodes(new ArrayList<DataObject>(), null); metadata.setRootObject(null, -1, null); } if (display != null && display.getUserObject() instanceof ExperimenterData && display.isToRefresh()) { refreshTree(); } Browser b = model.getSelectedBrowser(); if (b != null && display != null) { if (model.getDataViewer() != null) b.addComponent(model.getDataViewer().getGridUI()); else b.addComponent(null); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setSelectedNodes(Object) */ public void setSelectedNodes(Object nodes) { if (nodes == null) return; if (!(nodes instanceof List)) return; List l = (List) nodes; int n = l.size(); List selection = (List) l.get(0); Object parent = null; if (n == 2) parent = l.get(1); if (selection == null || selection.size() == 0) return; Object selected = selection.get(0); MetadataViewer mv = model.getMetadataViewer(); if (hasDataToSave()) { mv.saveData(); } boolean sameSelection = false; if (view.getDisplayMode() != SEARCH_MODE) { Browser browser = model.getSelectedBrowser(); List<Object> oldSelection = browser.getSelectedDataObjects(); browser.onSelectedNode(parent, selection, selection.size() > 0); List<Object> newSelection = browser.getSelectedDataObjects(); sameSelection = isSameSelection(oldSelection, newSelection); } int size = selection.size(); if (size == 1 && model.getSelectedBrowser() != null) { Browser browser = model.getSelectedBrowser(); ExperimenterData exp = null; TreeImageDisplay last = null; if (browser != null) last = browser.getLastSelectedDisplay(); if (last != null) exp = browser.getNodeOwner(last); if (exp == null) exp = model.getUserDetails(); mv.setRootObject(selected, exp.getId(), browser.getSecurityContext(last)); mv.setParentRootObject(parent, null); if (model.getDataViewer() != null) model.getDataViewer().setApplications( TreeViewerFactory.getApplications( model.getObjectMimeType(selected))); if (!model.isFullScreen()) { //Browser browser = model.getSelectedBrowser(); browse(browser.getLastSelectedDisplay(), null, false); } //Notifies actions. firePropertyChange(SELECTION_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); return; } List<Object> result = new ArrayList<Object>(); selection.remove(0); result.add(selection); result.add(selected); result.add(parent); setSelectedNode(result, sameSelection); } /** * Sets the selected node and loads the annotations if requested. * * @param object The object to handle. * @param sameSelection Pass <code>true</code> if it is the same selection. * Annotation will not be loaded, <code>false</code> * otherwise. */ private void setSelectedNode(Object object, boolean sameSelection) { if (object == null) return; if (!(object instanceof List)) return; List l = (List) object; int n = l.size(); if (n > 3) return; Object selected = l.get(1); Object parent = null; if (n == 3) parent = l.get(2); if (selected instanceof ImageData) { ImageData img = (ImageData) selected; try { img.getDefaultPixels(); } catch (Exception e) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Image Not Valid", "The selected image is not valid."); return; } } else if (selected instanceof WellSampleData) { WellSampleData ws = (WellSampleData) selected; if (ws.getId() < 0) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Well Not Valid", "The selected well is not valid."); return; } } MetadataViewer mv = model.getMetadataViewer(); if (hasDataToSave()) { mv.saveData(); } List<Object> siblings = (List<Object>) l.get(0); int size = siblings.size(); if (view.getDisplayMode() != SEARCH_MODE) { Browser browser = model.getSelectedBrowser(); browser.onSelectedNode(parent, selected, size > 0); } mv.setSelectionMode(size == 0); Browser browser = model.getSelectedBrowser(); ExperimenterData exp = null; TreeImageDisplay last = null; if (browser != null) last = browser.getLastSelectedDisplay(); if (last != null) exp = browser.getNodeOwner(last); if (exp == null) exp = model.getUserDetails(); Object grandParent = null; if (selected instanceof WellSampleData) { if (parent instanceof WellData) grandParent = ((WellData) parent).getPlate(); } if (!sameSelection) { if (browser == null) { if (selected instanceof DataObject) { SecurityContext ctx = new SecurityContext( ((DataObject) selected).getGroupId()); mv.setRootObject(selected, exp.getId(), ctx); } } else { mv.setRootObject(selected, exp.getId(), browser.getSecurityContext(last)); } mv.setParentRootObject(parent, grandParent); } if (view.getDisplayMode() == SEARCH_MODE) { siblings.add(selected); mv.setRelatedNodes(siblings); } else { TreeImageDisplay[] selection = null; if (browser != null) selection = browser.getSelectedDisplays(); if (selection != null && selection.length > 0) { if (selected instanceof WellSampleData) { siblings.add(selected); if (siblings.size() > 1 && !sameSelection) mv.setRelatedNodes(siblings); } else { siblings = new ArrayList<Object>(selection.length); for (int i = 0; i < selection.length; i++) { siblings.add(selection[i].getUserObject()); } if (siblings.size() > 1 && !sameSelection) mv.setRelatedNodes(siblings); } } else { if (selected instanceof WellSampleData) { siblings.add(selected); if (siblings.size() > 1 && !sameSelection) mv.setRelatedNodes(siblings); } } } if (model.getDataViewer() != null) model.getDataViewer().setApplications( TreeViewerFactory.getApplications( model.getObjectMimeType(selected))); if (!model.isFullScreen()) { browse(browser.getLastSelectedDisplay(), null, false); } //Notifies actions. firePropertyChange(SELECTION_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); } /** * Checks if the specified lists contained the same elements. * Returns <code>true</code> if it is the same selection, * <code>false</code> otherwise. * * @param oldSelection The selection prior to change. * @param newSelection The new selection * @return See above. */ private boolean isSameSelection(List<Object> oldSelection, List<Object> newSelection) { if (oldSelection == null || newSelection == null) return false; int s1 = oldSelection.size(); int s2 = newSelection.size(); if (s1 != s2 || (s1 == 0 && s2 > 0) || (s1 > 0 && s2 == 0)) { return false; } List<Long> ids = new ArrayList<Long>(); Class<?> klass = null; Object object; DataObject data; Iterator<Object> i = oldSelection.iterator(); while (i.hasNext()) { object = i.next(); klass = object.getClass(); if (object instanceof DataObject) { data = (DataObject) object; if (!ids.contains(data.getId())) { ids.add(data.getId()); } } } int count = 0; i = newSelection.iterator(); while (i.hasNext()) { object = i.next(); if (!klass.equals(object.getClass())) { return false; } if (object instanceof DataObject) { data = (DataObject) object; if (ids.contains(data.getId())) { count++; } } } return count == ids.size(); } public void handleSearchSelectionEvent(SearchSelectionEvent evt) { // Force the metadataviewer to be shown and fake a treeviewer object // selection in order to get the metadataviewer show the right stuff // (TODO: That's pretty weird... is there another/better way?) view.forceShowMetaDataView(); List<Object> tmp = new ArrayList<Object>(); tmp.add(evt.getDataObjects()); setSelectedNodes(tmp); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setSelectedNode(Object) */ public void setSelectedNode(Object object) { if (object == null) return; if (!(object instanceof List)) return; List l = (List) object; int n = l.size(); if (n > 3) return; Object selected = l.get(1); Object parent = null; if (n == 3) parent = l.get(2); List<Object> siblings = (List<Object>) l.get(0); boolean sameSelection = true; if (view.getDisplayMode() != SEARCH_MODE) { Browser browser = model.getSelectedBrowser(); List<Object> oldSelection = browser.getSelectedDataObjects(); List<Object> newSelection = new ArrayList<Object>(); newSelection.add(selected); sameSelection = isSameSelection(oldSelection, newSelection); } setSelectedNode(object, sameSelection); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setSelectedField(Object) */ public void setSelectedField(Object object) { if (object == null) return; if (!(object instanceof List)) return; List l = (List) object; int n = l.size(); if (n != 2) return; Object selected = l.get(0); Object parent = l.get(1); if (selected instanceof WellSampleData) { WellSampleData ws = (WellSampleData) selected; if (ws.getId() < 0) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Well Not valid", "The selected well is not valid."); return; } } MetadataViewer mv = model.getMetadataViewer(); if (hasDataToSave()) { mv.saveData(); } Browser browser = model.getSelectedBrowser(); ExperimenterData exp = null; TreeImageDisplay last = browser.getLastSelectedDisplay(); if (last != null) exp = browser.getNodeOwner(last); if (exp == null) exp = model.getUserDetails(); mv.setSelectionMode(true); mv.setRootObject(selected, exp.getId(), browser.getSecurityContext(last)); mv.setParentRootObject(parent, null); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#onDataObjectSave(DataObject, int) */ public void onDataObjectSave(DataObject data, int operation) { onDataObjectSave(data, null, operation); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#onDataObjectSave(DataObject, DataObject, int) */ public void onDataObjectSave(DataObject data, DataObject parent, int operation) { int state = model.getState(); if (operation == REMOVE_OBJECT && state != SAVE) throw new IllegalStateException("This method can only be " + "invoked in the SAVE state"); switch (state) { case DISCARDED: throw new IllegalStateException("This method cannot be " + "invoked in the DISCARDED state"); } if (data == null) throw new IllegalArgumentException("No data object. "); switch (operation) { case CREATE_OBJECT: case UPDATE_OBJECT: case REMOVE_OBJECT: break; default: throw new IllegalArgumentException("Save operation not " + "supported."); } //removeEditor(); //remove the currently selected editor. if (operation == REMOVE_OBJECT) { model.setState(READY); fireStateChange(); } view.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); Browser browser = null; if (operation == CREATE_OBJECT) { if (parent == null) { if ((data instanceof ProjectData) || (data instanceof DatasetData)) browser = model.getBrowser(Browser.PROJECTS_EXPLORER); else if (data instanceof ScreenData) browser = model.getBrowser(Browser.SCREENS_EXPLORER); else if (data instanceof TagAnnotationData) browser = model.getBrowser(Browser.TAGS_EXPLORER); } if (browser != null) { model.setSelectedBrowser(browser); view.addBrowser(browser); removeEditor(); } } browser = model.getSelectedBrowser(); if (browser != null && operation != UPDATE_OBJECT) browser.refreshTree(null, null); if (operation == REMOVE_OBJECT || operation == CREATE_OBJECT) { DataBrowserFactory.discardAll(); view.removeAllFromWorkingPane(); } if (operation == UPDATE_OBJECT && browser != null) { browser.accept(new UpdateVisitor(browser, data)); browser.getUI().repaint(); } setStatus(false, "", true); view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#onOrphanDataObjectCreated(DataObject, int) */ public void onOrphanDataObjectCreated(DataObject data) { view.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); Browser browser = model.getSelectedBrowser(); if (browser != null) browser.onOrphanDataObjectCreated(data); setStatus(false, "", true); view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#onDataObjectSave(List, int) */ public void onDataObjectSave(List data, int operation) { int state = model.getState(); if (operation == REMOVE_OBJECT && state != SAVE) throw new IllegalStateException("This method can only be " + "invoked in the SAVE state"); switch (state) { case DISCARDED: throw new IllegalStateException("This method cannot be " + "invoked in the DISCARDED state"); } if (data == null) throw new IllegalArgumentException("No data object. "); switch (operation) { case CREATE_OBJECT: case UPDATE_OBJECT: case REMOVE_OBJECT: break; default: throw new IllegalArgumentException("Save operation not " + "supported."); } //removeEditor(); //remove the currently selected editor. if (operation == REMOVE_OBJECT) { model.setState(READY); fireStateChange(); } view.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); setStatus(false, "", true); view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#clearFoundResults() */ public void clearFoundResults() { switch (model.getState()) { case DISCARDED: case SAVE: return; } Browser browser = model.getSelectedBrowser(); view.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); if (browser != null) { browser.accept(new ClearVisitor()); browser.setFoundInBrowser(null); } view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#moveToBack() */ public void moveToBack() { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); view.toBack(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#moveToFront() */ public void moveToFront() { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); view.toFront(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setHierarchyRoot(long, List) */ public void setHierarchyRoot(long userGroupID, List<ExperimenterData> experimenters) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); if (experimenters == null) return; Browser browser = model.getBrowser(Browser.PROJECTS_EXPLORER); //Check that the group is displayed. Collection groups = TreeViewerAgent.getAvailableUserGroups(); if (groups == null) return; TreeImageDisplay refNode = null; ExperimenterVisitor visitor; List<TreeImageDisplay> nodes; if (groups.size() > 1) { visitor = new ExperimenterVisitor(browser, userGroupID); browser.accept(visitor); nodes = visitor.getNodes(); if (nodes.size() == 0) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Add User", "The group is not displayed."); return; } refNode = nodes.get(0); } List<Long> ids = new ArrayList<Long>(); Iterator<ExperimenterData> ii = experimenters.iterator(); while (ii.hasNext()) { ids.add(ii.next().getId()); } Map<Integer, Browser> browsers = model.getBrowsers(); //first remove all the users displayed. visitor = new ExperimenterVisitor(browser, -1, -1); if (refNode != null) refNode.accept(visitor); else browser.accept(visitor); nodes = visitor.getNodes(); List<ExperimenterData> users = new ArrayList<ExperimenterData>(); Iterator<TreeImageDisplay> k = nodes.iterator(); TreeImageDisplay n; ExperimenterData exp; while (k.hasNext()) { n = k.next(); if (n.getUserObject() instanceof ExperimenterData) { exp = (ExperimenterData) n.getUserObject(); if (!ids.contains(exp.getId())) { users.add(exp); } } } model.setSelectedGroupId(userGroupID); view.setPermissions(); Entry<Integer, Browser> entry; userGroupID = model.getSelectedGroupId(); //First remove; Iterator<ExperimenterData> j = users.iterator(); Iterator<Entry<Integer, Browser>> i; while (j.hasNext()) { exp = j.next(); i = browsers.entrySet().iterator(); while (i.hasNext()) { entry = i.next(); browser = entry.getValue(); browser.removeExperimenter(exp, userGroupID); } } //Add j = experimenters.iterator(); while (j.hasNext()) { exp = j.next(); i = browsers.entrySet().iterator(); while (i.hasNext()) { entry = i.next(); browser = entry.getValue(); browser.addExperimenter(exp, userGroupID); } } //clean display if if (users.size() > 0) { DataBrowserFactory.discardAll(); view.removeAllFromWorkingPane(); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#canEdit(Object) */ public boolean canEdit(Object ho) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); //Check if current user can write in object long id = model.getUserDetails().getId(); boolean b = false; if (ho instanceof TreeImageTimeSet) { Browser browser = model.getSelectedBrowser(); if (browser == null) return false; ExperimenterData exp = browser.getNodeOwner((TreeImageDisplay) ho); if (exp.getId() == id) b = true; } else b = EditorUtil.isUserOwner(ho, id); if (b) return b; //user is the owner. GroupData group = null; if (ho instanceof DataObject) { DataObject data = (DataObject) ho; return data.canEdit(); } else if (ho instanceof TreeImageTimeSet) { Browser browser = model.getSelectedBrowser(); if (browser == null) return false; group = browser.getNodeGroup((TreeImageDisplay) ho); switch (group.getPermissions().getPermissionsLevel()) { case GroupData.PERMISSIONS_GROUP_READ_WRITE: case GroupData.PERMISSIONS_PUBLIC_READ_WRITE: return true; } return EditorUtil.isUserGroupOwner(group, id); } return false; } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#canLink(Object) */ public boolean canLink(Object ho) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); //Check if current user can write in object boolean b = false; if (ho instanceof TreeImageTimeSet) { Browser browser = model.getSelectedBrowser(); if (browser == null) return false; GroupData g = browser.getNodeGroup( (TreeImageDisplay) ho); return g.canLink(); } else if (ho instanceof DataObject) b = ((DataObject) ho).canLink(); return b; } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#canChgrp(Object) */ public boolean canChgrp(Object ho) { if (TreeViewerAgent.isAdministrator()) return true; long id = model.getUserDetails().getId(); boolean b = false; if (ho instanceof TreeImageTimeSet) { Browser browser = model.getSelectedBrowser(); ExperimenterData exp = browser.getNodeOwner((TreeImageDisplay) ho); if (exp.getId() == id) b = true; } else b = EditorUtil.isUserOwner(ho, id); return b; } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#canDelete(Object) */ public boolean canDelete(Object ho) { long id = model.getUserDetails().getId(); boolean b = false; if (ho instanceof TreeImageTimeSet) { Browser browser = model.getSelectedBrowser(); ExperimenterData exp = browser.getNodeOwner((TreeImageDisplay) ho); if (exp.getId() == id) b = true; } else b = EditorUtil.isUserOwner(ho, id); if (b) return b; //user is the owner. GroupData group = null; if (ho instanceof ExperimenterData || ho instanceof GroupData) { // users and groups should not be deleted at all return false; } else if (ho instanceof DataObject) { DataObject data = (DataObject) ho; return data.canDelete(); } else if (ho instanceof TreeImageTimeSet) { Browser browser = model.getSelectedBrowser(); if (browser == null) return false; group = browser.getNodeGroup((TreeImageDisplay) ho); } else { return false; } //Do not have enough information about the group. if (group.getPermissions() == null) return false; switch (group.getPermissions().getPermissionsLevel()) { case GroupData.PERMISSIONS_GROUP_READ_WRITE: case GroupData.PERMISSIONS_PUBLIC_READ_WRITE: return true; } return EditorUtil.isUserGroupOwner(group, id); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#canAnnotate(Object) */ public boolean canAnnotate(Object ho) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); //Check if current user can write in object long id = model.getUserDetails().getId(); boolean b = false; if (ho instanceof TreeImageTimeSet) { Browser browser = model.getSelectedBrowser(); ExperimenterData exp = browser.getNodeOwner((TreeImageDisplay) ho); if (exp.getId() == id) b = true; } else b = EditorUtil.isUserOwner(ho, id); if (b) return b; //user is the owner. if (ho instanceof DataObject) { DataObject data = (DataObject) ho; return data.canAnnotate(); } else if (ho instanceof TreeImageTimeSet) { Browser browser = model.getSelectedBrowser(); if (browser == null) return false; GroupData group = browser.getNodeGroup((TreeImageDisplay) ho); switch (group.getPermissions().getPermissionsLevel()) { case GroupData.PERMISSIONS_GROUP_READ_WRITE: case GroupData.PERMISSIONS_PUBLIC_READ_WRITE: return true; } return EditorUtil.isUserGroupOwner(group, id); } return false; } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#addExistingObjects(DataObject) */ public void addExistingObjects(DataObject ho) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); if (ho == null) throw new IllegalArgumentException("No object."); view.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); model.fireDataExistingObjectsLoader(ho); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setExistingObjects(List) */ public void setExistingObjects(List objects) { if (model.getState() != LOADING_DATA) throw new IllegalStateException( "This method cannot be invoked in the LOADING_DATA state."); setStatus(false, "", true); view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); model.setState(READY); if (CollectionUtils.isEmpty(objects)) return; Browser b = model.getSelectedBrowser(); List<Object> available = new ArrayList<Object>(); List<Object> immutable = new ArrayList<Object>(); Set selected = null; if (b != null) { TreeImageDisplay[] values = b.getSelectedDisplays(); if (values != null && values.length > 0) { // Only modify the first group from the list of groups Object value = values[0].getUserObject(); if (value instanceof GroupData) { long groupId = ((GroupData) value).getId(); ExperimenterData currentUser = model.getExperimenter(); selected = new HashSet<ExperimenterData>(); long userID = currentUser.getId(); long id; List<Long> ids = new ArrayList<Long>(); for (ExperimenterData experimenter : (List<ExperimenterData>) objects) { id = experimenter.getId(); if (experimenter.isMemberOfGroup(groupId)) { ids.add(id); selected.add(experimenter); //Cannot move guest or root if ((model.isSystemUser(id, GroupData.GUEST) && model.isSystemGroup(groupId, GroupData.GUEST))) { immutable.add(experimenter); } else if (model.isSystemGroup(groupId, GroupData.SYSTEM)) { if (model.isSystemUser(id, GroupData.SYSTEM) || id == userID) { immutable.add(experimenter); } } } if (!ids.contains(experimenter.getId())) { available.add(experimenter); } } } } else { available.addAll(objects); } } fireStateChange(); SelectionWizard d = new SelectionWizard(view, available, selected, objects.get(0).getClass(), TreeViewerAgent.getUserDetails()); d.setImmutableElements(immutable); IconManager icons = IconManager.getInstance(); String title = "User Selection"; String text = "Select the Users who should be in the selected group."; Icon icon = icons.getIcon(IconManager.OWNER_48); d.setTitle(title, text, icon); d.addPropertyChangeListener(controller); UIUtilities.centerAndShow(d); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#addExistingObjects(Set) */ public void addExistingObjects(Set set) { if (model.getState() != LOADING_SELECTION) throw new IllegalStateException( "This method cannot be invoked in the LOADING_DATA state."); view.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); if (set == null || set.size() == 0) model.setState(READY); else { model.fireAddExistingObjects(set); } fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#showMenu(int, Component, Point) */ public void showMenu(int menuID, Component c, Point p) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); switch (menuID) { case MANAGER_MENU: case CREATE_MENU_CONTAINERS: case CREATE_MENU_TAGS: case CREATE_MENU_ADMIN: case PERSONAL_MENU: case CREATE_MENU_SCREENS: case VIEW_MENU: break; case AVAILABLE_SCRIPTS_MENU: if (model.getAvailableScripts() == null) { model.loadScripts(p, c); firePropertyChange(SCRIPTS_LOADING_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); return; } break; default: throw new IllegalArgumentException("Menu not supported."); } view.showMenu(menuID, c, p); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setStatus(boolean, String, boolean) */ public void setStatus(boolean enable, String text, boolean hide) { view.setStatus(text, hide); view.setStatusIcon(enable); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#onComponentStateChange(boolean) */ public void onComponentStateChange(boolean b) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); Browser browser = model.getSelectedBrowser(); if (browser != null) browser.onComponentStateChange(b); view.onStateChanged(b); firePropertyChange(ON_COMPONENT_STATE_CHANGED_PROPERTY, Boolean.valueOf(!b), Boolean.valueOf(b)); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setNodesToCopy(TreeImageDisplay[], int) */ public void setNodesToCopy(TreeImageDisplay[] nodes, int index) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); if (nodes == null || nodes.length == 0) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Copy action", "You first need to select " + "the nodes to copy."); return; } switch (index) { case CUT_AND_PASTE: case COPY_AND_PASTE: break; default: throw new IllegalArgumentException("Index not supported."); } model.setNodesToCopy(nodes, index); EventBus bus = TreeViewerAgent.getRegistry().getEventBus(); bus.post(new CopyItems(model.getDataToCopyType())); if (index == CUT_AND_PASTE) { if (model.cut()) { fireStateChange(); } } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#paste(TreeImageDisplay[]) */ public void paste(TreeImageDisplay[] parents) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); if (parents == null || parents.length == 0) { un.notifyInfo("Paste action", "You first need to select " + "the nodes to copy into."); return; } TreeImageDisplay[] nodes = model.getNodesToCopy(); if (nodes == null || nodes.length == 0) return; //check to transfer data. Map<Long, List<DataObject>> elements = new HashMap<Long, List<DataObject>>(); long gid; List<DataObject> l = new ArrayList<DataObject>(); TreeImageDisplay n; Object os; boolean admin = false; Browser browser = model.getSelectedBrowser(); if (browser != null) { admin = browser.getBrowserType() == Browser.ADMIN_EXPLORER; } for (int j = 0; j < nodes.length; j++) { n = nodes[j]; os = n.getUserObject(); if (os instanceof DataObject) { if (!(os instanceof ExperimenterData || os instanceof GroupData)) { gid = ((DataObject) os).getGroupId(); if (!elements.containsKey(gid)) { elements.put(gid, new ArrayList<DataObject>()); } l = elements.get(gid); l.add((DataObject) os); } else if (os instanceof ExperimenterData) { l.add((DataObject) os); } } } if (admin && l.size() > 0) { boolean b = model.paste(parents); if (!b) { un.notifyInfo("Paste", "The Users to copy cannot be added to the selected Groups."); } else fireStateChange(); return; } if (elements.size() == 0) return; Iterator<Long> i; List<Long> ids = new ArrayList<Long>(); Map<Long, List<DataObject>> parentMap = new HashMap<Long, List<DataObject>>(); List<DataObject> list; if (elements.size() == 1) { //check if cut and paste TreeImageDisplay parent; for (int j = 0; j < parents.length; j++) { n = parents[j]; os = n.getUserObject(); if (os instanceof ExperimenterData) { parent = n.getParentDisplay(); if (parent.getUserObject() instanceof GroupData) { gid = parent.getUserObjectId(); if (!parentMap.containsKey(gid)) { parentMap.put(gid, new ArrayList<DataObject>()); } if (!ids.contains(gid)) ids.add(gid); } } else if (os instanceof DataObject) { gid = ((DataObject) os).getGroupId(); if (!parentMap.containsKey(gid)) { parentMap.put(gid, new ArrayList<DataObject>()); } list = parentMap.get(gid); if (!(os instanceof GroupData)) list.add((DataObject) os); if (!ids.contains(gid)) ids.add(gid); } } if (ids.size() == 1) { //check if it is a Paste in the group i = elements.keySet().iterator(); while (i.hasNext()) { if (i.next().longValue() == ids.get(0).longValue()) { boolean b = model.paste(parents); if (!b) { un.notifyInfo("Paste", "The nodes to copy cannot be added to the " + "selected nodes."); } else fireStateChange(); return; } } } } //Warn the user than the copy/paste not allowed between groups MessageBox box = new MessageBox(view, "Copy data", "Copying between groups is not yet supported.\n" + "To continue and move the data to the new group, click 'Yes'.\n"+ "To leave the data in the current group, click 'No'."); if (box.centerMsgBox() != MessageBox.YES_OPTION) return; //if we are here moving data. i = elements.keySet().iterator(); Map<SecurityContext, List<DataObject>> trans = new HashMap<SecurityContext, List<DataObject>>(); while (i.hasNext()) { gid = i.next(); trans.put(new SecurityContext(gid), elements.get(gid)); } IconManager icons = IconManager.getInstance(); TransferableActivityParam param; Entry<Long, List<DataObject>> entry; Iterator<Entry<Long, List<DataObject>>> k = parentMap.entrySet().iterator(); TransferableObject t; Long id; while (k.hasNext()) { entry = k.next(); id = entry.getKey(); removeNodes(trans); t = new TransferableObject(new SecurityContext(id), (List<DataObject>) entry.getValue(), trans); t.setGroupName(getGroupName(id)); param = new TransferableActivityParam( icons.getIcon(IconManager.MOVE_22), t); param.setFailureIcon(icons.getIcon(IconManager.MOVE_FAILED_22)); un.notifyActivity(model.getSecurityContext(), param); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getUI() */ public JFrame getUI() { return view; } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#hasDataToSave() */ public boolean hasDataToSave() { MetadataViewer metadata = model.getMetadataViewer(); if (metadata == null) return false; return metadata.hasDataToSave(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#showPreSavingDialog() */ public void showPreSavingDialog() { MetadataViewer metadata = model.getMetadataViewer(); if (metadata == null) return; if (!(metadata.hasDataToSave())) return; MessageBox dialog = new MessageBox(view, "Save data", "Do you want to save the modified \n" + "data before selecting a new item?"); if (dialog.centerMsgBox() == MessageBox.YES_OPTION) { model.getMetadataViewer().saveData(); } else { model.getMetadataViewer().clearDataToSave(); //removeEditor(); Browser browser = model.getSelectedBrowser(); if (browser != null) browser.setSelectedNode(); } } public void saveMetadata() { MetadataViewer metadata = model.getMetadataViewer(); if (metadata == null) return; if (!(metadata.hasDataToSave())) return; model.getMetadataViewer().saveData(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#retrieveUserGroups(Point, GroupData) */ public void retrieveUserGroups(Point location, GroupData group) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); JFrame f = (JFrame) TreeViewerAgent.getRegistry().getTaskBar(); IconManager icons = IconManager.getInstance(); Collection groups = TreeViewerAgent.getAvailableUserGroups(); if (group == null) group = model.getSelectedGroup(); int level = group.getPermissions().getPermissionsLevel(); if (level == GroupData.PERMISSIONS_PRIVATE) { boolean owner = false; if (TreeViewerAgent.isAdministrator()) owner = true; else { ExperimenterData currentUser = model.getExperimenter(); Set leaders = group.getLeaders(); Iterator k = leaders.iterator(); ExperimenterData exp; while (k.hasNext()) { exp = (ExperimenterData) k.next(); if (exp.getId() == currentUser.getId()) { owner = true; break; } } } if (!owner) return; } Set experimenters = group.getExperimenters(); if (experimenters == null || experimenters.size() == 0) return; Browser browser = model.getBrowser(Browser.PROJECTS_EXPLORER); TreeImageDisplay refNode = null; List<TreeImageDisplay> nodes; ExperimenterVisitor visitor; if (groups.size() > 1) { visitor = new ExperimenterVisitor(browser, group.getId()); browser.accept(visitor); nodes = visitor.getNodes(); if (nodes.size() != 1) return; refNode = nodes.get(0); } visitor = new ExperimenterVisitor(browser, -1, -1); if (refNode != null) refNode.accept(visitor); else browser.accept(visitor); nodes = visitor.getNodes(); List<ExperimenterData> users = new ArrayList<ExperimenterData>(); Iterator<TreeImageDisplay> j = nodes.iterator(); TreeImageDisplay n; while (j.hasNext()) { n = j.next(); if (n.getUserObject() instanceof ExperimenterData) { users.add((ExperimenterData) n.getUserObject()); } } switchUserDialog = new UserManagerDialog(f, model.getUserDetails(), group, users, icons.getIcon(IconManager.OWNER), icons.getIcon(IconManager.OWNER_48)); switchUserDialog.addPropertyChangeListener(controller); switchUserDialog.setDefaultSize(); UIUtilities.showOnScreen(switchUserDialog, location); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getExperimenterNames() */ public String getExperimenterNames() { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); return model.getExperimenterNames(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getSelectedExperimenter() */ public ExperimenterData getSelectedExperimenter() { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); Browser b = model.getSelectedBrowser(); ExperimenterData exp = model.getExperimenter(); if (b != null) { TreeImageDisplay node = b.getLastSelectedDisplay(); if (node != null) exp = b.getNodeOwner(node); } return exp; } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#isRecycled() */ public boolean isRecycled() { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); return model.isRecycled(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#isRollOver() */ public boolean isRollOver() { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); return model.isRollOver(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setRollOver(boolean) */ public void setRollOver(boolean rollOver) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); model.setRollOver(rollOver); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#removeExperimenterData() */ public void removeExperimenterData() { if (model.getState() == DISCARDED) return; Browser browser = model.getSelectedBrowser(); TreeImageDisplay expNode = browser.getLastSelectedDisplay(); TreeImageDisplay parent = expNode.getParentDisplay(); long groupID = -1; if (parent != null && parent.getUserObject() instanceof GroupData) { GroupData g = (GroupData) parent.getUserObject(); groupID = g.getId(); } Object uo = expNode.getUserObject(); if (uo == null || !(uo instanceof ExperimenterData)) return; ExperimenterData exp = (ExperimenterData) uo; Map<Integer, Browser> browsers = model.getBrowsers(); Iterator<Entry<Integer, Browser>> i = browsers.entrySet().iterator(); Entry<Integer, Browser> entry; while (i.hasNext()) { entry = i.next(); browser = entry.getValue(); browser.removeExperimenter(exp, groupID); } DataBrowserFactory.discardAll(); view.removeAllFromWorkingPane(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#hasRndSettings() */ public boolean hasRndSettings() { if (model.getState() == DISCARDED) throw new IllegalStateException("This method cannot be invoked " + "in the DISCARDED state."); return model.hasRndSettingsToPaste(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#AreSettingsCompatible(long) */ public boolean areSettingsCompatible(long groupID) { if (model.getState() == DISCARDED) throw new IllegalStateException("This method cannot be invoked " + "in the DISCARDED state."); return model.areSettingsCompatible(groupID); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#pasteRndSettings(List, Class) */ public void pasteRndSettings(List<Long> ids, Class klass) { if (!hasRndSettings()) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Paste settings", "No rendering settings to" + "paste. \n Please first copy settings."); return; } if (CollectionUtils.isEmpty(ids)) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Paste settings", "Please select the nodes \n" + "you wish to apply the settings to."); return; } if (PojosUtil.isContainerClass(klass)) { MessageBox box = new MessageBox(getUI(), "Save rendering settings", RENDERINGSETTINGS_WARNING); if (box.centerMsgBox() != MessageBox.YES_OPTION) return; } model.firePasteRenderingSettings(ids, klass); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#pasteRndSettings(TimeRefObject) */ public void pasteRndSettings(TimeRefObject ref) { if (model.getState() == DISCARDED) return; if (!hasRndSettings()) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Paste settings", "No rendering settings to" + "paste. Please first copy settings."); return; } if (ref == null) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Paste settings", "Please select the nodes" + "you wish to apply the settings to."); return; } model.firePasteRenderingSettings(ref); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#rndSettingsPasted(Map) */ public void rndSettingsPasted(Map map) { if (map == null || map.size() != 2) return; Collection failure = (Collection) map.get(Boolean.valueOf(false)); Collection success = (Collection) map.get(Boolean.valueOf(true)); EventBus bus = TreeViewerAgent.getRegistry().getEventBus(); bus.post(new RndSettingsCopied(success, -1)); model.setState(READY); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#resetRndSettings(List, Class) */ public void resetRndSettings(List<Long> ids, Class klass) { if (ids == null || ids.size() == 0) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Reset settings", "Please select at one element."); return; } if (PojosUtil.isContainerClass(klass)) { MessageBox box = new MessageBox(getUI(), "Save rendering settings", RENDERINGSETTINGS_WARNING); if (box.centerMsgBox() != MessageBox.YES_OPTION) return; } model.fireResetRenderingSettings(ids, klass); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#resetRndSettings(TimeRefObject) */ public void resetRndSettings(TimeRefObject ref) { if (ref == null) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Reset settings", "Please select at one element."); return; } model.fireResetRenderingSettings(ref); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#createObject(DataObject, boolean) */ public void createObject(DataObject object, boolean withParent) { if (model.getState() == DISCARDED) return; if (object == null) return; Browser browser = null; if (object instanceof DatasetData || object instanceof ProjectData) browser = model.getBrowser(Browser.PROJECTS_EXPLORER); else if (object instanceof ScreenData) browser = model.getBrowser(Browser.SCREENS_EXPLORER); if (browser != null) browser.expandUser(); model.fireDataObjectCreation(object, withParent); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setLeaves(TreeImageSet, Collection) */ public void setLeaves(TreeImageSet parent, Collection leaves) { if (parent instanceof TreeFileSet && ((TreeFileSet) parent).getType() != TreeFileSet.ORPHANED_IMAGES) { view.removeAllFromWorkingPane(); return; } Browser browser = model.getSelectedBrowser(); Object parentObject = parent.getUserObject(); TreeImageDisplay display = parent.getParentDisplay(); Object grandParentObject = null; if (display != null) grandParentObject = display.getUserObject(); DataBrowser db = null; if (parentObject instanceof TagAnnotationData) { db = DataBrowserFactory.getTagsBrowser( model.getSecurityContext(parent), (TagAnnotationData) parentObject, leaves, false); } else if (parentObject instanceof GroupData) { if (browser != null) { if (browser.getBrowserType() == Browser.ADMIN_EXPLORER) { db = DataBrowserFactory.getGroupsBrowser( model.getSecurityContext(parent), (GroupData) parentObject, leaves); } } } else if (parentObject instanceof FileData) { FileData f = (FileData) parentObject; if (!f.isHidden()) { if (f.isDirectory()) db = DataBrowserFactory.getFSFolderBrowser( model.getSecurityContext(parent), (FileData) parentObject, leaves); } } else { db = DataBrowserFactory.getDataBrowser( model.getSecurityContext(parent), grandParentObject, parentObject, leaves, parent); if (parent instanceof TreeImageTimeSet) { ExperimenterData exp = browser.getNodeOwner(parent); db.setExperimenter(exp); } } if (db != null) { db.addPropertyChangeListener(controller); view.displayBrowser(db); db.setDisplayMode(model.getDisplayMode()); db.activate(); } model.setDataViewer(db); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getDisplayedImages() */ public Collection getDisplayedImages() { DataBrowser db = model.getDataViewer(); if (db == null) return null; return db.getBrowser().getVisibleImages(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#browseHierarchyRoots(Object, Collection) */ public void browseHierarchyRoots(Object parent, Collection roots) { if (roots == null) return; Iterator i = roots.iterator(); //Map<ProjectData, Set<DatasetData>> DataBrowser db = null; if (roots.size() != 1) return; DataObject node; TagAnnotationData tag; ProjectData project; Iterator j; TreeImageDisplay child, value; long id; Set set, dataObjects; DatasetData d; Iterator k; Map<Long, TreeImageDisplay> m = new HashMap<Long, TreeImageDisplay>(); if (parent instanceof TreeImageDisplay) { TreeImageDisplay display = (TreeImageDisplay) parent; List l = display.getChildrenDisplay(); if (l != null) { j = l.iterator(); while (j.hasNext()) { child = (TreeImageDisplay) j.next(); id = child.getUserObjectId(); if (id >= 0) m.put(id, child); } } } DataObject object; Set datasets; Iterator l; while (i.hasNext()) { node = (DataObject) i.next(); if (node instanceof ProjectData) { project = (ProjectData) node; set = project.getDatasets(); j = set.iterator(); while (j.hasNext()) { d = (DatasetData) j.next(); value = m.get(d.getId()); if (value != null) { dataObjects = d.getImages(); if (dataObjects != null && !value.isChildrenLoaded()) { value.removeAllChildrenDisplay(); k = dataObjects.iterator(); while (k.hasNext()) { value.addChildDisplay( TreeViewerTranslator.transformDataObject( (ImageData) k.next())); } } value.setChildrenLoaded(true); } } model.setState(READY); fireStateChange(); db = DataBrowserFactory.getDataBrowser( model.getSecurityContext(), project, set); } else if (node instanceof TagAnnotationData) { tag = (TagAnnotationData) node; set = tag.getDataObjects();//tag.getTags(); j = set.iterator(); while (j.hasNext()) { object = (DataObject) j.next(); value = m.get(object.getId()); if (value != null) { if (object instanceof DatasetData) { dataObjects = ((DatasetData) object).getImages(); if (dataObjects != null) { value.removeAllChildrenDisplay(); k = dataObjects.iterator(); while (k.hasNext()) { value.addChildDisplay( TreeViewerTranslator.transformDataObject( (ImageData) k.next())); } } value.setChildrenLoaded(true); } else if (object instanceof ProjectData) { datasets = ((ProjectData) object).getDatasets(); l = datasets.iterator(); while (l.hasNext()) { d = (DatasetData) j.next(); dataObjects = d.getImages(); if (dataObjects != null) { value.removeAllChildrenDisplay(); k = dataObjects.iterator(); while (k.hasNext()) { value.addChildDisplay( TreeViewerTranslator.transformDataObject( (ImageData) k.next())); } } value.setChildrenLoaded(true); } } } } model.setState(READY); fireStateChange(); db = DataBrowserFactory.getTagsBrowser( model.getSecurityContext(), tag, set, true); } } if (db != null) { db.addPropertyChangeListener(controller); view.removeAllFromWorkingPane(); view.displayBrowser(db); db.setDisplayMode(model.getDisplayMode()); db.activate(); } model.setDataViewer(db); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setUnselectedNode(Object) */ public void setUnselectedNode(Object object) { if (object == null) return; if (!(object instanceof List)) return; //Need to notify the browser without having List l = (List) object; int n = l.size(); if (n > 3 || n <= 1) return; Object multiSelection = l.get(0); Object selected = l.get(1); Object parent = null; if (n == 3) parent = l.get(2); if (selected instanceof ImageData) { ImageData img = (ImageData) selected; try { img.getDefaultPixels(); } catch (Exception e) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Image Not valid", "The selected image is not valid"); return; } } Browser browser = model.getSelectedBrowser(); if (browser == null) return; browser.onDeselectedNode(parent, selected, (Boolean) multiSelection); onSelectedDisplay(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#copyRndSettings(ImageData) */ public void copyRndSettings(ImageData image) { if (image == null) { Browser browser = model.getSelectedBrowser(); if (browser == null) return; TreeImageDisplay node = browser.getLastSelectedDisplay(); if (node == null) return; Object o = node.getUserObject(); if (!(o instanceof ImageData)) return; image = (ImageData) o; } EventBus bus = TreeViewerAgent.getRegistry().getEventBus(); bus.post(new CopyRndSettings(image)); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setMinMax(List, Class) */ public void setMinMax(List<Long> ids, Class klass) { if (ids == null || ids.size() == 0) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Set settings", "Please select at least " + "one element."); return; } model.fireSetMinMax(ids, klass); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setOriginalRndSettings(TimeRefObject) */ public void setOriginalRndSettings(TimeRefObject ref) { if (ref == null) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Set settings", "Please select at least" + " one element."); return; } model.fireSetOwnerRenderingSettings(ref); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setOwnerRndSettings(List, Class) */ public void setOwnerRndSettings(List<Long> ids, Class klass) { if (ids == null || ids.size() == 0) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Set settings", "Please select at least " + "one element."); return; } if (PojosUtil.isContainerClass(klass)) { MessageBox box = new MessageBox(getUI(), "Save rendering settings", RENDERINGSETTINGS_WARNING); if (box.centerMsgBox() != MessageBox.YES_OPTION) return; } model.fireSetOwnerRenderingSettings(ids, klass); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setOwnerRndSettings(TimeRefObject) */ public void setOwnerRndSettings(TimeRefObject ref) { if (ref == null) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Set settings", "Please select at least" + " one element."); return; } model.fireSetOriginalRenderingSettings(ref); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setOriginalRndSettings(TimeRefObject) */ public void showSearch() { int oldMode = view.getDisplayMode(); view.showAdvancedFinder(); DataBrowser db = DataBrowserFactory.getSearchBrowser(); int newMode = view.getDisplayMode(); view.removeAllFromWorkingPane(); switch (newMode) { case EXPLORER_MODE: onSelectedDisplay(); break; case SEARCH_MODE: ExperimenterData exp = model.getUserDetails(); model.getMetadataViewer().setRootObject(null, exp.getId(), null); if (db != null) { view.displayBrowser(db); model.setDataViewer(db); } } firePropertyChange(DISPLAY_MODE_PROPERTY, oldMode, newMode); } /** * Handels a search event, i. e. triggers a search * with the query provided by the SearchEvent */ public void handleSearchEvent(SearchEvent evt) { view.selectSearchPane(); AdvancedFinder finder = model.getAdvancedFinder(); finder.handleSearchEvent(evt); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setSearchResult(Object) */ public void setSearchResult(Object result) { SearchResultCollection results = (SearchResultCollection) result; MetadataViewer metadata = model.getMetadataViewer(); if (metadata != null) { metadata.setRootObject(null, -1, null); } if (results == null ) { view.removeAllFromWorkingPane(); return; } //Need to recycle the search browser. DataBrowser db = DataBrowserFactory.getSearchBrowser(results); if (db != null && view.getDisplayMode() == SEARCH_MODE) { db.setExperimenter(TreeViewerAgent.getUserDetails()); db.addPropertyChangeListener(controller); view.removeAllFromWorkingPane(); view.displayBrowser(db); db.setDisplayMode(model.getDisplayMode()); db.activate(); model.setDataViewer(db); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#addMetadata() */ public void addMetadata() { //Need to make difference between batch and selection. Browser browser = model.getSelectedBrowser(); if (browser == null) return; TreeImageDisplay[] nodes = browser.getSelectedDisplays(); if (nodes == null || nodes.length == 0) return; List<Object> data = new ArrayList<Object>(); Object uo; TreeImageDisplay n; Class type = null; String text = "Add metadata to "; if (nodes.length == 1) { n = nodes[0]; uo = n.getUserObject(); if (uo instanceof TagAnnotationData) { data.add(uo); type = TagAnnotationData.class; text += "images linked to the selected tag."; } else if (uo instanceof DatasetData) { data.add( uo); type = DatasetData.class; text += "images linked to the selected dataset."; } else if (n instanceof TreeImageTimeSet) { TreeImageTimeSet time = (TreeImageTimeSet) n; ExperimenterData exp = model.getUserDetails(); TimeRefObject ref = new TimeRefObject(exp.getId(), TimeRefObject.TIME); ref.setTimeInterval(time.getStartTime(), time.getEndTime()); data.add(ref); type = TimeRefObject.class; text += "images imported during the selected period."; } } else { for (int i = 0; i < nodes.length; i++) { n = nodes[i]; uo = n.getUserObject(); if (uo instanceof ImageData) data.add(uo); } text += "the selected images."; } if (data.size() > 0) { IconManager icons = IconManager.getInstance(); MetadataViewer viewer = MetadataViewerFactory.getViewer(data, type); GenericDialog dialog = new GenericDialog(view, "Add Metadata..."); dialog.initialize("Add Metadata...", text, icons.getIcon(IconManager.ADD_METADATA_48), viewer.getEditorUI()); dialog.setParent(viewer); viewer.setSelectionMode(true); dialog.addPropertyChangeListener(controller); UIUtilities.centerAndShow(dialog); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#refreshTree() */ public void refreshTree() { int state = model.getState(); if (state == DISCARDED) throw new IllegalStateException("This method cannot be invoked " + "in the DISCARDED state"); Browser b = model.getSelectedBrowser(); DataBrowserFactory.discardAll(); view.removeAllFromWorkingPane(); if (b != null) b.refreshTree(null, null); ExperimenterData exp = model.getUserDetails(); model.getMetadataViewer().setRootObject(null, exp.getId(), null); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#browseTimeInterval(TreeImageTimeSet, Set) */ public void browseTimeInterval(TreeImageTimeSet parent, Set leaves) { if (leaves == null) return; if (parent == null) return; Object parentObject = null; ExperimenterData exp = null; Object grandParentObject = null; //Set the userID of the owner of the time interval. parentObject = parent.getUserObject(); TreeImageDisplay display = parent.getParentDisplay(); if (display != null) grandParentObject = display.getUserObject(); Browser browser = model.getSelectedBrowser(); if (browser != null) exp = browser.getNodeOwner(parent); DataBrowser db = DataBrowserFactory.getDataBrowser( model.getSecurityContext(parent), grandParentObject, parentObject, leaves, parent); db.setExperimenter(exp); db.addPropertyChangeListener(controller); view.removeAllFromWorkingPane(); view.displayBrowser(db); db.setDisplayMode(model.getDisplayMode()); db.activate(); model.setDataViewer(db); model.setState(READY); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setPlates(Map, boolean) */ public void setPlates(Map<TreeImageSet, Set> plates, boolean withThumbnails) { if (plates == null || plates.size() == 0) { return; } int n = plates.size(); Iterator i = plates.entrySet().iterator(); Entry entry; Object parentObject; TreeImageSet parent; TreeImageDisplay display; Object gpo = null; DataBrowser db = null; if (n == 1) { Map<Class, Object> m = new HashMap<Class, Object>(); while (i.hasNext()) { entry = (Entry) i.next(); parent = (TreeImageSet) entry.getKey(); parentObject = parent.getUserObject(); display = parent.getParentDisplay(); if (display != null) { gpo = display.getUserObject(); if (gpo != null) m.put(gpo.getClass(), gpo); if (gpo instanceof PlateData) { display = display.getParentDisplay(); if (display != null) { gpo = display.getUserObject(); if (gpo != null) m.put(gpo.getClass(), gpo); } } } db = DataBrowserFactory.getWellsDataBrowser( model.getSecurityContext(parent), m, parentObject, (Set) entry.getValue(), withThumbnails); } } if (db != null) { db.addPropertyChangeListener(controller); view.removeAllFromWorkingPane(); db.setDisplayMode(model.getDisplayMode()); db.activate(); view.displayBrowser(db); model.setDataViewer(db); getSelectedBrowser().addComponent(db.getGridUI()); } model.setState(READY); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#browse(TreeImageDisplay, DataObject, boolean) */ public void browse(TreeImageDisplay node, DataObject data, boolean withThumbnails) { NodesFinder finder; Set<TreeImageDisplay> nodes; Iterator<TreeImageDisplay> i; Browser browser = model.getSelectedBrowser(); if (node == null) { if (browser == null) return; if (data instanceof DatasetData) { finder = new NodesFinder((DataObject) data); browser.accept(finder); nodes = finder.getNodes(); ExperimenterData exp = null; MetadataViewer mv = model.getMetadataViewer(); int size = nodes.size(); if (size == 1) { i = nodes.iterator(); TreeImageDisplay parent; mv.setSelectionMode(size == 1); int mode = model.getDisplayMode(); while (i.hasNext()) { node = i.next(); if (mode == TreeViewer.EXPERIMENTER_DISPLAY) { parent = BrowserFactory.getDataOwner(node); exp = (ExperimenterData) parent.getUserObject(); } else parent = EditorUtil.getDataGroup(node); browser.loadExperimenterData(parent, node); if (exp == null) exp = model.getUserDetails(); node.setExpanded(true); mv.setRootObject(node.getUserObject(), exp.getId(), browser.getSecurityContext(node)); browser.onSelectedNode(null, node, false); break; } } } else if (data instanceof PlateData) { finder = new NodesFinder((DataObject) data); browser.accept(finder); nodes = finder.getNodes(); if (nodes.size() > 0) { //node found. model.browsePlates(nodes, withThumbnails); } } else if (data instanceof ImageData) { finder = new NodesFinder((DataObject) data); browser.accept(finder); nodes = finder.getNodes(); ExperimenterData exp; MetadataViewer mv = model.getMetadataViewer(); int size = nodes.size(); if (size == 1) { i = nodes.iterator(); TreeImageDisplay parent, expNode; mv.setSelectionMode(size == 1); while (i.hasNext()) { node = i.next(); parent = node.getParentDisplay(); expNode = BrowserFactory.getDataOwner(node); exp = expNode == null ? null : (ExperimenterData) expNode.getUserObject(); if (exp == null) exp = model.getUserDetails(); node.setExpanded(true); //mv.setRootObject(node.getUserObject(), exp.getId()); List l = parent.getChildrenDisplay(); Iterator j = l.iterator(); List leaves = new ArrayList(); while (j.hasNext()) { TreeImageDisplay o = (TreeImageDisplay) j.next(); leaves.add(o.getUserObject()); } DataBrowser db = DataBrowserFactory.getDataBrowser( model.getSecurityContext(node), null, parent.getUserObject(), leaves, parent); if (db == null) return; db.addPropertyChangeListener(controller); db.setDisplayMode(model.getDisplayMode()); view.displayBrowser(db); db.activate(); model.setDataViewer(db); browser.setSelectedDisplay(node); } } } return; } if (!node.isExpanded()) node.setExpanded(true); ActionCmd actionCmd = null; Object uo = node.getUserObject(); if (uo instanceof ProjectData) { model.browseProject(node); } else if (uo instanceof DatasetData) { if (browser != null) browser.loadExperimenterData(BrowserFactory.getDataOwner(node), node); } else if (uo instanceof ScreenData) { if (data instanceof PlateData) { //Find node finder = new NodesFinder((DataObject) data); browser.accept(finder); nodes = finder.getNodes(); if (nodes.size() > 0) { //node found. TreeImageDisplay[] values = new TreeImageDisplay[nodes.size()]; i = nodes.iterator(); int index = 0; TreeImageDisplay n; while (i.hasNext()) { n = i.next(); node = n.getParentDisplay(); values[index] = n; index++; } browser.setSelectedDisplays(values, true); model.browsePlates(nodes, withThumbnails); } } else if (data instanceof ScreenData) { //Find node finder = new NodesFinder((DataObject) data); browser.accept(finder); nodes = finder.getNodes(); if (nodes.size() > 0) { //node found. TreeImageDisplay[] values = new TreeImageDisplay[nodes.size()]; i = nodes.iterator(); int index = 0; TreeImageDisplay n; while (i.hasNext()) { n = i.next(); node = n.getParentDisplay(); values[index] = n; index++; } browser.setSelectedDisplays(values, true); } } } else if (uo instanceof TagAnnotationData) { TagAnnotationData tag = (TagAnnotationData) uo; if (!TagAnnotationData.INSIGHT_TAGSET_NS.equals(tag.getNameSpace())) model.browseTag(node); } else if (uo instanceof ImageData) { if (TreeViewerAgent.runAsPlugin() == LookupNames.IMAGE_J || TreeViewerAgent.runAsPlugin() == LookupNames.IMAGE_J_IMPORT) { actionCmd = new ViewInPluginCmd(this, LookupNames.IMAGE_J); } else { actionCmd = new ViewCmd(this, true); } } else if (node instanceof TreeImageTimeSet) { model.browseTimeInterval((TreeImageTimeSet) node); } else if (uo instanceof PlateData) { List<TreeImageDisplay> plates = new ArrayList<TreeImageDisplay>(); List l = node.getChildrenDisplay(); if (l == null || l.size() == 0) { plates.add(node); } if (l.size() == 1) { plates.add((TreeImageDisplay) l.get(0)); } model.browsePlates(plates, withThumbnails); } else if (uo instanceof PlateAcquisitionData) { List<TreeImageDisplay> plates = new ArrayList<TreeImageDisplay>(); plates.add(node); model.browsePlates(plates, withThumbnails); } else if (uo instanceof File) { File f = (File) uo; if (f.isDirectory() && !f.isHidden()) { List l = node.getChildrenDisplay(); if (l != null && l.size() > 0) { Set leaves = new HashSet(); i = l.iterator(); Object object; TreeImageDisplay child; while (i.hasNext()) { child = (TreeImageDisplay) i.next(); object = child.getUserObject(); if (object instanceof ImageData) leaves.add(object); } if (leaves.size() > 0) setLeaves((TreeImageSet) node, leaves); } } } else if (uo instanceof FileData) { FileData fa = (FileData) uo; if (!fa.isHidden()) { if (fa.isDirectory()) { model.getSelectedBrowser().loadExperimenterData( BrowserFactory.getDataOwner(node), node); } else { //Import, register and view. } } } fireStateChange(); if (actionCmd != null) actionCmd.execute(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#deleteObjects(List) */ public void deleteObjects(List nodes) { if (nodes == null) return; Iterator i = nodes.iterator(); Class<?> klass = null; List<Long> ids = new ArrayList<Long>(); TreeImageDisplay node; Object uo; Map<SecurityContext, List<DataObject>> objects = new HashMap<SecurityContext, List<DataObject>>(); SecurityContext ctx; List<DataObject> l; while (i.hasNext()) { node = (TreeImageDisplay) i.next(); uo = node.getUserObject(); ctx = model.getSecurityContext(node); if (uo instanceof ProjectData || uo instanceof DatasetData || uo instanceof ImageData) { l = objects.get(ctx); if (l == null) { l = new ArrayList<DataObject>(); objects.put(ctx, l); } l.add((DataObject) uo); } } if (objects.size() == 0) delete(nodes); else model.fireImageChecking(objects, nodes, ImageCheckerType.DELETE); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getDataToCopy() */ public List<DataObject> getDataToCopy() { if (model.getState() == DISCARDED) return null; return model.getDataToCopy(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#onNodesMoved(DataObject) */ public void onNodesMoved(DataObject target) { if (model.getState() != SAVE) return; model.setState(READY); fireStateChange(); view.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); view.removeAllFromWorkingPane(); DataBrowserFactory.discardAll(); Browser browser = model.getSelectedBrowser(); browser.refreshTree(null, target); model.getMetadataViewer().setRootObject(null, -1, null); setStatus(false, "", true); view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#onNodesDeleted(Collection) */ public void onNodesDeleted(Collection<DataObject> deleted) { if (model.getState() == DISCARDED) return; if (CollectionUtils.isEmpty(deleted)) { onNodesMoved(null); return; } NotDeletedObjectDialog nd = new NotDeletedObjectDialog(view, deleted); if (nd.centerAndShow() == NotDeletedObjectDialog.CLOSE) onNodesMoved(null); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#showTagWizard() */ public void showTagWizard() { if (model.getState() == DISCARDED) return; model.getMetadataViewer().showTagWizard(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setInspectorVisibility() */ public void setInspectorVisibility() { if (model.getState() == DISCARDED) return; view.setInspectorVisibility(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#onActivityProcessed(ActivityComponent, boolean) */ public void onActivityProcessed(ActivityComponent activity, boolean finished) { if (model.getState() == DISCARDED) return; if (finished) { view.onActivityTerminated(activity); } //TODO: IF DELETE ACTIVITY NEED TO CLEAN THE BROWSER. firePropertyChange(IMPORTED_PROPERTY, Boolean.valueOf(!finished), Boolean.valueOf(finished)); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#download(File, boolean) */ public void download(File folder, boolean override) { if (model.getState() == DISCARDED) return; Browser browser = model.getSelectedBrowser(); if (browser == null) return; List l = browser.getSelectedDataObjects(); if (l == null) return; Iterator i = l.iterator(); Object object; List<ImageData> archived = new ArrayList<ImageData>(); List<Long> filesetIds = new ArrayList<Long>(); ImageData image; long id; while (i.hasNext()) { object = i.next(); if (object instanceof ImageData) { image = (ImageData) object; if (image.isArchived()) { id = image.getFilesetId(); if (id < 0) archived.add(image); else if (!filesetIds.contains(id)) { archived.add(image); filesetIds.add(id); } } } else if (object instanceof FileAnnotationData) { downloadFile(folder, override, (FileAnnotationData) object, null); } } if (archived.size() > 0) { UserNotifier un = MetadataViewerAgent.getRegistry() .getUserNotifier(); IconManager icons = IconManager.getInstance(); Icon icon = icons.getIcon(IconManager.DOWNLOAD_22); SecurityContext ctx = getSecurityContext(); DownloadArchivedActivityParam p = new DownloadArchivedActivityParam( folder, archived, icon); p.setOverride(override); p.setZip(false); p.setKeepOriginalPaths(true); un.notifyActivity(ctx, p); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setDownloadedFiles(File, ApplicationData, Collection) */ public void setDownloadedFiles(File folder, ApplicationData data, Collection files) { if (files == null || files.size() == 0) return; UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); IconManager icons = IconManager.getInstance(); Iterator i = files.iterator(); OriginalFile file; DownloadActivityParam activity; while (i.hasNext()) { file = (OriginalFile) i.next(); activity = new DownloadActivityParam(file, folder, icons.getIcon(IconManager.DOWNLOAD_22)); un.notifyActivity(model.getSecurityContext(), activity); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#openWith(ApplicationData) */ public void openWith(ApplicationData data) { Browser browser = model.getSelectedBrowser(); if (browser == null) return; if (data != null) { Environment env = (Environment) TreeViewerAgent.getRegistry().lookup(LookupNames.ENV); String dir = env.getTmpDir(); List l = browser.getSelectedDataObjects(); if (l == null) return; Iterator i = l.iterator(); Object object; OpenActivityParam activity; UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); SecurityContext ctx = model.getSecurityContext(); while (i.hasNext()) { object = i.next(); if (object instanceof ImageData || object instanceof FileAnnotationData) { activity = new OpenActivityParam(data, (DataObject) object, dir); un.notifyActivity(ctx, activity); } } return; } TreeImageDisplay d = browser.getLastSelectedDisplay(); if (d == null) return; Object uo = d.getUserObject(); String name = null; if (uo instanceof ImageData) { ImageData img = (ImageData) uo; name = EditorUtil.getObjectName(img.getName()); } else if (uo instanceof FileAnnotationData) { FileAnnotationData fa = (FileAnnotationData) uo; name = EditorUtil.getObjectName(fa.getFileName()); } if (name == null) return; OpenWithDialog dialog = new OpenWithDialog(view, ApplicationData.getDefaultLocation(), name); dialog.addPropertyChangeListener(controller); UIUtilities.centerAndShow(dialog); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setUserGroup(List) */ public void setUserGroup(List<GroupData> groups) { if (model.getState() != READY) return; if (groups == null || groups.size() == 0) return; ExperimenterData exp = TreeViewerAgent.getUserDetails(); //if (group.getId() == model.getSelectedGroupId()) return; //Scan browser and check if group is there. Browser browser = model.getBrowser(Browser.PROJECTS_EXPLORER); if (browser == null) return; //First check if groups already displayed ExperimenterVisitor v = new ExperimenterVisitor(browser, -1); browser.accept(v, ExperimenterVisitor.TREEIMAGE_SET_ONLY); List<TreeImageDisplay> nodes = v.getNodes(); Iterator<TreeImageDisplay> i = nodes.iterator(); //ids of the groups to add Iterator<GroupData> k = groups.iterator(); Object o; GroupData group; //Displayed. List<Long> already = new ArrayList<Long>(); while (i.hasNext()) { o = i.next().getUserObject(); if (o instanceof GroupData) { group = (GroupData) o; already.add(group.getId()); } } Map<Integer, Browser> browsers = model.getBrowsers(); Iterator<Browser> j = browsers.values().iterator(); //First remove the one that no longer in the list. boolean displayed = false; boolean set; while (j.hasNext()) { browser = j.next(); //now add. k = groups.iterator(); set = false; while (k.hasNext()) { group = k.next(); if (!already.contains(group.getId())) { browser.setUserGroup(group); model.setSelectedGroupId(group.getId()); notifyChangeGroup(group.getId()); set = true; } } if (!set) { group = groups.get(0); model.setSelectedGroupId(group.getId()); notifyChangeGroup(group.getId()); } view.setPermissions(); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setFullScreen() */ public void setFullScreen() { /* if (model.getState() == DISCARDED) return; boolean value = model.isFullScreen(); model.setFullScreen(!value); if (value) view.displayBrowser(model.getDataViewer()); */ } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setMetadataVisibility() */ public void setMetadataVisibility() { if (model.getState() == DISCARDED) return; view.setMetadataVisibility(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#isLeaderOfGroup(GroupData) */ public boolean isLeaderOfGroup(GroupData group) { if (model.getState() == DISCARDED || group == null) return false; Set groups = TreeViewerAgent.getGroupsLeaderOf(); if (groups.size() == 0) return false; Iterator i = groups.iterator(); GroupData g; while (i.hasNext()) { g = (GroupData) i.next(); if (g.getId() == group.getId()) return true; } return false; } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#administrate(AdminObject) */ public void administrate(AdminObject object) { if (model.getState() == DISCARDED) return; if (object == null) throw new IllegalArgumentException("Object not valid."); model.fireAdmin(object); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#register(DataObjectRegistration) */ public void register(DataObjectRegistration file) { if (model.getState() == DISCARDED) return; if (file == null) throw new IllegalArgumentException("No file to register."); Browser browser = model.getSelectedBrowser(); if (browser == null || browser.getBrowserType() != Browser.FILE_SYSTEM_EXPLORER) return; if (browser.register(file.getData())) { /* model.getMetadataViewer().saveData(file.getToAdd(), file.getToRemove(), file.getToDelete(), file.getMetadata(), file.getData(), true); */ } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getGroupPermissions(GroupData) */ public int getGroupPermissions(GroupData group) { if (group == null) return GroupData.PERMISSIONS_PRIVATE; PermissionData data = group.getPermissions(); if (data.isGroupRead()) { if (data.isGroupWrite()) return GroupData.PERMISSIONS_GROUP_READ_WRITE; if (data.isGroupAnnotate()) { return GroupData.PERMISSIONS_GROUP_READ_LINK; } return GroupData.PERMISSIONS_GROUP_READ; } if (data.isWorldRead()) { if (data.isWorldWrite()) return GroupData.PERMISSIONS_PUBLIC_READ_WRITE; return GroupData.PERMISSIONS_PUBLIC_READ; } return GroupData.PERMISSIONS_PRIVATE; } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#resetPassword(String) */ public void resetPassword(String password) { if (password == null) throw new IllegalArgumentException("No password specified."); Browser browser = model.getSelectedBrowser(); if (browser == null) return; List l = browser.getSelectedDataObjects(); if (l == null) return; Map<ExperimenterData, UserCredentials> map = new HashMap<ExperimenterData, UserCredentials>(); Iterator i = l.iterator(); Object o; ExperimenterData exp; UserCredentials uc; while (i.hasNext()) { o = i.next(); if (o instanceof ExperimenterData) { exp = (ExperimenterData) o; uc = new UserCredentials(exp.getUserName(), password); map.put(exp, uc); } } if (map.size() == 0) return; AdminObject admin = new AdminObject(null, map, AdminObject.RESET_PASSWORD); model.fireAdmin(admin); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#resetPassword(String) */ public void onGroupSwitched(boolean success) { model.setRndSettings(null, null); model.setNodesToCopy(null, -1); //remove thumbnails browser view.removeAllFromWorkingPane(); model.setDataViewer(null); //reset metadata MetadataViewer mv = view.resetMetadataViewer(); //reset search clearFoundResults(); } /** * Invokes when reconnected to the server. */ void onReconnected() { model.setRndSettings(null, null); model.setNodesToCopy(null, -1); //remove thumbnails browser view.removeAllFromWorkingPane(); model.setDataViewer(null); model.setAvailableScripts(null); model.clearImportResult(); view.onImport(); view.clearMenus(); //reset metadata MetadataViewer mv = view.resetMetadataViewer(); //reset search clearFoundResults(); model.getAdvancedFinder().reset( TreeViewerAgent.getAvailableUserGroups()); ExperimenterData exp = model.getUserDetails(); model.setSelectedGroupId(exp.getDefaultGroup().getId()); view.createTitle(); view.setPermissions(); Browser b = view.resetLayout(); if (b != null) { Browser old = model.getSelectedBrowser(); model.setSelectedBrowser(b); model.getMetadataViewer().setSelectionMode(false); firePropertyChange(SELECTED_BROWSER_PROPERTY, old, b); int t = b.getBrowserType(); EventBus bus = TreeViewerAgent.getRegistry().getEventBus(); bus.post(new BrowserSelectionEvent(t)); view.updateMenuItems(); } Map<Integer, Browser> browsers = model.getBrowsers(); Entry entry; Browser browser; Iterator i = browsers.entrySet().iterator(); while (i.hasNext()) { entry = (Entry) i.next(); browser = (Browser) entry.getValue(); browser.reActivate(); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#findDataObject(Class, int, boolean) */ public void findDataObject(Class type, long id, boolean selectTab) { Browser browser = null; if (selectTab) { if (ProjectData.class.equals(type) || DatasetData.class.equals(type)) { view.selectPane(Browser.PROJECTS_EXPLORER); browser = model.getBrowser(Browser.PROJECTS_EXPLORER); model.setSelectedBrowser(browser); } else if (ScreenData.class.equals(type) || PlateData.class.equals(type)) { view.selectPane(Browser.SCREENS_EXPLORER); browser = model.getBrowser(Browser.SCREENS_EXPLORER); model.setSelectedBrowser(browser); } } if (browser != null) { NodesFinder finder = new NodesFinder(type, id); browser.accept(finder); Set<TreeImageDisplay> nodes = finder.getNodes(); if (nodes.size() == 0) { //not found so, reloads the data. if (ProjectData.class.equals(type) || DatasetData.class.equals(type) || ScreenData.class.equals(type)) { DataBrowserFactory.discardAll(); view.removeAllFromWorkingPane(); browser.refreshBrowser(type, id); ExperimenterData exp = model.getUserDetails(); model.getMetadataViewer().setRootObject(null, exp.getId(), null); } } else { /* Iterator<TreeImageDisplay> i = nodes.iterator(); TreeImageDisplay node; if (DatasetData.class.equals(type)) { while (i.hasNext()) { node = i.next(); if (node.isChildrenLoaded()) browser.setSelectedDisplay(node); else browser.refreshBrowser(type, id); } } else { while (i.hasNext()) { browser.setSelectedDisplay(i.next()); } } */ Iterator<TreeImageDisplay> i = nodes.iterator(); TreeImageDisplay node; while (i.hasNext()) { node = i.next(); browser.setSelectedDisplay(node); browser.onSelectedNode(null, node, false); browseContainer(node, null); break; } } } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#isImporting() */ public boolean isImporting() { if (model.getState() == DISCARDED) return false; return model.isImporting(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#indicateToRefresh(List, boolean) */ public void indicateToRefresh(List<DataObject> containers, boolean refreshTree) { TreeImageDisplay node; Browser browser = null; Set<Long> groupIds = new HashSet<Long>(); if (containers != null && containers.size() > 0) { NodesFinder finder = new NodesFinder(containers); DataObject ho = containers.get(0); if (ho instanceof DatasetData || ho instanceof ProjectData) { browser = model.getBrowser(Browser.PROJECTS_EXPLORER); browser.accept(finder); } else if (ho instanceof ScreenData) { browser = model.getBrowser(Browser.SCREENS_EXPLORER); browser.accept(finder); } Set<TreeImageDisplay> nodes = finder.getNodes(); //mark if (browser != null && nodes != null && nodes.size() > 0) { Iterator<TreeImageDisplay> i = nodes.iterator(); TreeImageDisplay parent; Object object; while (i.hasNext()) { node = i.next(); node.setToRefresh(true); object = node.getUserObject(); if (object instanceof DataObject) { groupIds.add(((DataObject) object).getGroupId()); } parent = node.getParentDisplay(); if (parent != null && !parent.isExpanded()) browser.expand(parent); } ExperimenterData exp = TreeViewerAgent.getUserDetails(); ExperimenterVisitor v = new ExperimenterVisitor(browser, exp.getId(), groupIds); browser.accept(v, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); List<TreeImageDisplay> l = v.getNodes(); if (l != null) { Iterator<TreeImageDisplay> j = l.iterator(); while (j.hasNext()) { node = j.next(); node.setExpanded(true); node.setToRefresh(refreshTree); } } browser.getUI().repaint(); } } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setImporting(boolean, List, boolean, Object) */ public void setImporting(boolean importing, List<DataObject> containers, boolean refreshTree, Object importResult) { if (model.getState() == DISCARDED) return; model.setImporting(importing, importResult); view.onImport(); if (!importing) indicateToRefresh(containers, refreshTree); firePropertyChange(IMPORT_PROPERTY, importing, !importing); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#browseContainer(Object, Object) */ public void browseContainer(Object data, Object refNode) { if (model.getState() == DISCARDED) return; if (data == null) return; Browser browser = null; NodesFinder finder; Set<TreeImageDisplay> nodes; Iterator<TreeImageDisplay> i; TreeImageDisplay n; moveToFront(); if (data instanceof TreeImageDisplay) { TreeImageDisplay node = (TreeImageDisplay) data; Object ho = node.getUserObject(); if (ho instanceof DatasetData || ho instanceof ProjectData) { browser = model.getBrowser(Browser.PROJECTS_EXPLORER); if (browser != null) { setSelectedBrowser(browser, false); finder = new NodesFinder((DataObject) ho); browser.accept(finder); nodes = finder.getNodes(); if (nodes.size() > 0) { //not found. i = nodes.iterator(); while (i.hasNext()) { n = i.next(); if (n == node) { browse(node, null, true); node.setToRefresh(false); } } } } } else if (ho instanceof ScreenData) { browser = model.getBrowser(Browser.SCREENS_EXPLORER); DataBrowserFactory.discardAll(); setSelectedBrowser(browser, false); browser.refreshTree(refNode, (DataObject) ho); } } else if (data instanceof DataObject) { //should be for new node if (data instanceof DatasetData || data instanceof ProjectData || data instanceof ImageData) { browser = model.getBrowser(Browser.PROJECTS_EXPLORER); } else if (data instanceof PlateData || data instanceof ScreenData) { browser = model.getBrowser(Browser.SCREENS_EXPLORER); } else if (data instanceof FileAnnotationData) { model.loadParentOf((FileAnnotationData) data); return; } if (browser != null) { DataBrowserFactory.discardAll(); if (data instanceof ImageData) view.removeAllFromWorkingPane(); setSelectedBrowser(browser, false); browser.refreshTree(refNode, (DataObject) data); } } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#activateUser(ExperimenterData) */ public void activateUser(ExperimenterData exp) { if (exp == null) throw new IllegalArgumentException("No password specified."); Browser browser = model.getSelectedBrowser(); if (browser == null) return; List l = browser.getSelectedDataObjects(); if (l == null) return; Map<ExperimenterData, UserCredentials> map = new HashMap<ExperimenterData, UserCredentials>(); UserCredentials uc = new UserCredentials(exp.getUserName(), ""); uc.setActive(!exp.isActive()); map.put(exp, uc); if (map.size() == 0) return; AdminObject admin = new AdminObject(null, map, AdminObject.ACTIVATE_USER); model.fireAdmin(admin); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#createDataObjectWithChildren(DataObject) */ public void createDataObjectWithChildren(DataObject data) { if (data == null) return; Browser browser = model.getSelectedBrowser(); if (browser == null) return; TreeImageDisplay[] selection = browser.getSelectedDisplays(); if (selection.length == 0) return; if (data instanceof DatasetData) { Set images = new HashSet(); Object ho; for (int i = 0; i < selection.length; i++) { ho = selection[i].getUserObject(); if (ho instanceof ImageData && canLink(ho)) images.add(ho); } if (images.size() == 0) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Dataset Creation", "No images to add to the dataset."); } model.fireDataSaving(data, images); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setAvailableScripts(List, Point) */ public void setAvailableScripts(List scripts, Point location) { if (model.getState() == DISCARDED) return; model.setAvailableScripts(scripts); firePropertyChange(SCRIPTS_LOADED_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); if (location != null) view.showMenu(AVAILABLE_SCRIPTS_MENU, null, location); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#loadScript(long) */ public void loadScript(long scriptID) { if (scriptID < 0) return; model.loadScript(scriptID); firePropertyChange(SCRIPTS_LOADING_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setScript(ScriptObject) */ public void setScript(ScriptObject script) { firePropertyChange(SCRIPTS_LOADED_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); if (script == null) return; model.setScript(script); Browser browser = model.getSelectedBrowser(); List<DataObject> objects; if (browser == null) objects = new ArrayList<DataObject>(); else objects = browser.getSelectedDataObjects(); if (CollectionUtils.isEmpty(objects)) { DataBrowser db = model.getDataViewer(); objects = new ArrayList<DataObject>(); if (db != null && db.getBrowser() != null) { objects.addAll(db.getBrowser().getSelectedDataObjects()); } } // if it is a script which operates on FileAnnotations, pass on the selected // FileAnnotations in the MetadataViewer as additional reference objects ListMultimap<String, DataObject> addObjects = null; Pattern p = Pattern.compile("file.?annotation.*", Pattern.CASE_INSENSITIVE); for (String paramName : script.getInputs().keySet()) { Matcher m = p.matcher(paramName); if (m.matches()) { addObjects = ArrayListMultimap.create(); if (model.getMetadataViewer() != null) { addObjects.putAll(paramName, model.getMetadataViewer() .getEditor().getSelectedFileAnnotations()); } } } //setStatus(false); //Check if the objects are in the same group. Iterator<DataObject> i = objects.iterator(); List<Long> ids = new ArrayList<Long>(); DataObject object; long id = -1; while (i.hasNext()) { object = i.next(); if (!(object instanceof ExperimenterData || object instanceof GroupData)) { id = object.getGroupId(); if (!ids.contains(id) && id != -1) ids.add(id); } } if (ids.size() > 1) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Run Script", ScriptingDialog.WARNING); return; } if (scriptDialog == null) { scriptDialog = new ScriptingDialog(view, model.getScript(script.getScriptID()), objects, addObjects, TreeViewerAgent.isBinaryAvailable()); scriptDialog.addPropertyChangeListener(controller); UIUtilities.centerAndShow(scriptDialog); } else { scriptDialog.reset(model.getScript(script.getScriptID()), objects, addObjects); if (!scriptDialog.isVisible()) UIUtilities.centerAndShow(scriptDialog); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#transfer(TreeImageDisplay, List, int) */ public void transfer(TreeImageDisplay target, List<TreeImageDisplay> nodes, int transferAction) { if (target == null || CollectionUtils.isEmpty(nodes)) return; Browser browser = model.getSelectedBrowser(); if (browser == null) return; Object ot = target.getUserObject(); Object os; if (nodes.size() == 1) { //check if src = destination TreeImageDisplay src = nodes.get(0); if (src == target) { browser.rejectTransfer(); return; } } UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); if (browser.getBrowserType() == Browser.ADMIN_EXPLORER) { if (!(ot instanceof GroupData) || !TreeViewerAgent.isAdministrator()) { un.notifyInfo("DnD", "Only administrator can perform" + "such action."); browser.rejectTransfer(); return; } //Check the source Iterator<TreeImageDisplay> i = nodes.iterator(); TreeImageDisplay n; ExperimenterData exp; long id = model.getUserDetails().getId(); TreeImageDisplay p; GroupData g; String message = null; while (i.hasNext()) { n = i.next(); if (n.getUserObject() instanceof ExperimenterData) { exp = (ExperimenterData) n.getUserObject(); p = n.getParentDisplay(); if (p != null && p.getUserObject() instanceof GroupData) { g = (GroupData) p.getUserObject(); if (model.isSystemGroup(g.getId(), GroupData.SYSTEM)) { if (exp.getId() == id) { message = "An administrator cannot remove " + "himself/herself from "+g.getName()+ " Group."; break; } else if (model.isSystemUser(exp.getId(), GroupData.SYSTEM)) { message = "An administrator cannot remove " + exp.getUserName()+" from "+g.getName() +" Group."; break; } } else if (model.isSystemGroup(g.getId(), GroupData.GUEST) && model.isSystemUser(exp.getId(), GroupData.GUEST)) { message = "An administrator cannot remove " + exp.getUserName()+" from "+g.getName()+ " Group."; break; } } } } if (message != null) { un.notifyInfo("DnD", message); browser.rejectTransfer(); return; } } if (!canLink(ot) && !(ot instanceof ExperimenterData || ot instanceof GroupData)) { un.notifyInfo("DnD", "You must be the owner of the container."); browser.rejectTransfer(); return; } TreeImageDisplay p = target.getParentDisplay(); List<TreeImageDisplay> list = new ArrayList<TreeImageDisplay>(); Iterator<TreeImageDisplay> i = nodes.iterator(); TreeImageDisplay n; int count = 0; String child; String parent; os = null; int childCount = 0; long userID = TreeViewerAgent.getUserDetails().getId(); boolean administrator = TreeViewerAgent.isAdministrator(); ExperimenterData exp; long gId; List<Long> groupIds = new ArrayList<Long>(); DataObject data; while (i.hasNext()) { n = i.next(); os = n.getUserObject(); if (target.contains(n)) { childCount++; } else { if (EditorUtil.isTransferable(ot, os, userID)) { count++; if (ot instanceof GroupData) { if (os instanceof ExperimenterData && administrator) { list.add(n); } else { if (canEdit(os)) { data = (DataObject) os; if (!groupIds.contains(data.getGroupId())) groupIds.add(data.getGroupId()); list.add(n); } } } else { if (ot instanceof ExperimenterData) { exp = (ExperimenterData) ot; if (exp.getId() == userID) { target = null; list.add(n); data = (DataObject) os; if (!groupIds.contains(data.getGroupId())) groupIds.add(data.getGroupId()); } } else { if (canEdit(os)) { list.add(n); data = (DataObject) os; if (!groupIds.contains(data.getGroupId())) groupIds.add(data.getGroupId()); } } } } } } if (childCount == nodes.size()) { browser.rejectTransfer(); return; } if (list.size() == 0) { String s = ""; if (nodes.size() > 1) s = "s"; un.notifyInfo("DnD", "The "+getObjectType(os)+s+" cannot be moved to the " + "selected "+getObjectType(ot)+"."); browser.rejectTransfer(); return; } DataObject otData = (DataObject) ot; GroupData group = null; if (ot instanceof ExperimenterData) { Object po = p.getUserObject(); if (po instanceof GroupData) group = (GroupData) po; } else if (ot instanceof GroupData) { group = (GroupData)ot; } else { for (Object gd : TreeViewerAgent.getAvailableUserGroups()) { if (((GroupData) gd).getId() == otData.getGroupId()) { group = (GroupData) gd; break; } } } //to review if (browser.getBrowserType() == Browser.ADMIN_EXPLORER) model.transfer(target, list); else if (groupIds.size() == 1 && groupIds.get(0) == group.getId()) model.transfer(target, list); else { if (group == null) return; MessageBox box = new MessageBox(view, "Change group", "Are you " + "sure you want to move the selected items to another group?"); if (box.centerMsgBox() != MessageBox.YES_OPTION) return; otData = null; if (target != null && !(ot instanceof GroupData)) { otData = (DataObject) ot; } Map<Long, List<DataObject>> elements = new HashMap<Long, List<DataObject>>(); i = list.iterator(); long gid; List<DataObject> l; while (i.hasNext()) { n = i.next(); os = n.getUserObject(); if (os instanceof DataObject && !(os instanceof ExperimenterData || os instanceof GroupData)) { gid = ((DataObject) os).getGroupId(); if (!elements.containsKey(gid)) { elements.put(gid, new ArrayList<DataObject>()); } l = elements.get(gid); l.add((DataObject) os); } } if (elements.size() == 0) return; Iterator<Long> j = elements.keySet().iterator(); Map<SecurityContext, List<DataObject>> trans = new HashMap<SecurityContext, List<DataObject>>(); while (j.hasNext()) { gid = j.next(); trans.put(new SecurityContext(gid), elements.get(gid)); } if (target == null) otData = null; ChgrpObject object = new ChgrpObject(group, otData, trans); model.fireImageChecking(trans, object, ImageCheckerType.CHGRP); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getSelectedGroup() */ public GroupData getSelectedGroup() { if (model.getState() == DISCARDED) return null; return model.getSelectedGroup(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#hasSingleGroupDisplayed() */ public GroupData getSingleGroupDisplayed() { if (model.getState() == DISCARDED) return null; Collection<GroupData> groups = model.getAvailableGroups(); if (groups != null && groups.size() == 1) return null; Browser browser = model.getSelectedBrowser(); if (browser == null) return null; TreeImageDisplay node = null; ExperimenterVisitor v = new ExperimenterVisitor(browser, -1); browser.accept(v, ExperimenterVisitor.TREEIMAGE_SET_ONLY); List<TreeImageDisplay> nodes = v.getNodes(); if (nodes.size() == 1) return (GroupData) nodes.get(0).getUserObject(); return null; } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#removeGroup(long) */ public void removeGroup(long groupId) { if (model.getState() == DISCARDED) return; Browser browser = model.getSelectedBrowser(); if (browser == null) return; TreeImageDisplay node = null; ExperimenterVisitor v = new ExperimenterVisitor(browser, -1); browser.accept(v, ExperimenterVisitor.TREEIMAGE_SET_ONLY); //do not remove the last group. List<TreeImageDisplay> groups = v.getNodes(); //Find the node Iterator<TreeImageDisplay> j = groups.iterator(); TreeImageDisplay n; while (j.hasNext()) { n = j.next(); if (n.getUserObjectId() == groupId) { node = n; break; } } if (node == null) return; TreeViewerAgent.getRegistry().getEventBus().post( new ActivitiesEvent(model.getSecurityContext(node))); GroupData group = (GroupData) node.getUserObject(); Map<Integer, Browser> browsers = model.getBrowsers(); Iterator i = browsers.entrySet().iterator(); Entry entry; while (i.hasNext()) { entry = (Entry) i.next(); browser = (Browser) entry.getValue(); browser.removeGroup(group); } j = groups.iterator(); GroupData g; long gid; while (j.hasNext()) { g = (GroupData) j.next().getUserObject(); if (g.getId() != group.getId()) { gid = model.getSelectedGroupId(); model.setSelectedGroupId(g.getId()); notifyChangeGroup(gid); break; } } DataBrowserFactory.discardAll(); view.removeAllFromWorkingPane(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#moveTo(GroupData, List) */ public void moveTo(GroupData group, List<DataObject> nodes) { if (group == null) throw new IllegalArgumentException("No group to move data to."); if (nodes == null || nodes.size() == 0) return; Map<SecurityContext, List<DataObject>> map = new HashMap<SecurityContext, List<DataObject>>(); Iterator<DataObject> i = nodes.iterator(); Class b = null; DataObject data; SecurityContext ctx; long gid; List<DataObject> l; long refgid = group.getId(); List<Long> userIDs = new ArrayList<Long>(); while (i.hasNext()) { data = i.next(); if (canChgrp(data)) { if (data instanceof ProjectData || data instanceof ScreenData) b = data.getClass(); gid = data.getGroupId(); if (!userIDs.contains(data.getOwner().getId())) userIDs.add(data.getOwner().getId()); if (gid != refgid) { ctx = getKey(map, gid); if (ctx == null) { l = new ArrayList<DataObject>(); ctx = new SecurityContext(gid); map.put(ctx, l); } l = map.get(ctx); l.add(data); } } } if (userIDs.size() != 1) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Move Data ", "You can only move the data of one " + "member at a time."); return; } if (map.size() == 0) { UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyInfo("Move Data ", "No data to move to "+group.getName()); return; } long userID = -1; if (b == null) userID = userIDs.get(0); ChgrpObject object = new ChgrpObject(group, null, map); object.setUserID(userID); model.fireImageChecking(map, object, ImageCheckerType.CHGRP); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#displayUserGroups(Point) */ public void displayUserGroups(Point location) { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); JFrame f = (JFrame) TreeViewerAgent.getRegistry().getTaskBar(); IconManager icons = IconManager.getInstance(); Collection groups = TreeViewerAgent.getAvailableUserGroups(); if (groups.size() <= 1) return; Browser browser = model.getBrowser(Browser.PROJECTS_EXPLORER); ExperimenterVisitor visitor = new ExperimenterVisitor(browser, -1); browser.accept(visitor); List<TreeImageDisplay> nodes = visitor.getNodes(); List<GroupData> selected = new ArrayList<GroupData>(); Iterator<TreeImageDisplay> j = nodes.iterator(); TreeImageDisplay n; while (j.hasNext()) { n = j.next(); if (n.getUserObject() instanceof GroupData) { selected.add((GroupData) n.getUserObject()); } } GroupManagerDialog dialog = new GroupManagerDialog(f, groups, selected, icons.getIcon(IconManager.OWNER_GROUP_48)); dialog.addPropertyChangeListener(controller); dialog.setDefaultSize(); UIUtilities.showOnScreen(dialog, location); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getSecurityContext() */ public SecurityContext getSecurityContext() { return model.getSecurityContext(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getGroups() */ public Collection getGroups() { return model.getGroups(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getDisplayMode() */ public int getDisplayMode() { return model.getDisplayMode(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#setDisplayMode(int) */ public void setDisplayMode(int index) { if (model.getState() != READY || model.getDisplayMode() == index) return; //First check if groups already displayed model.setRndSettings(null, null); model.setNodesToCopy(null, -1); //remove thumbnails browser view.removeAllFromWorkingPane(); model.setDataViewer(null); //reset search clearFoundResults(); model.setDisplayMode(index); Map<Integer, Browser> browsers = model.getBrowsers(); Entry entry; Browser browser; Iterator i = browsers.entrySet().iterator(); while (i.hasNext()) { entry = (Entry) i.next(); browser = (Browser) entry.getValue(); browser.changeDisplayMode(); } TreeViewerAgent.getRegistry().getEventBus().post( new DisplayModeEvent(model.getDisplayMode())); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#handleSplitImage(Map, Object, int) */ public void handleSplitImage(ImageCheckerResult result, final Object action, ImageCheckerType index) { if (!CollectionUtils.isEmpty(result.getMifResults())) { //Indicate what do depending on the index. MIFNotificationDialog dialog = new MIFNotificationDialog(view, result.getMifResults(), action, index, TreeViewerAgent.getAvailableUserGroups()); dialog.addPropertyChangeListener(new PropertyChangeListener() { /** * Moves the data. */ public void propertyChange(PropertyChangeEvent evt) { String name = evt.getPropertyName(); if (MIFNotificationDialog.MOVE_ALL_PROPERTY.equals(name)) { moveObject((ChgrpObject) evt.getNewValue()); } } }); UIUtilities.centerAndShow(dialog); return; } // show a warning if the images to be deleted are linked to multiple datasets: if (ImageCheckerType.DELETE.equals(index) && !result.getMultiLinkedImages().isEmpty()) { LinkNotificationDialog dialog = new LinkNotificationDialog(view, result); dialog.addPropertyChangeListener(new PropertyChangeListener() { /** * Removes the data */ public void propertyChange(PropertyChangeEvent evt) { String name = evt.getPropertyName(); if (LinkNotificationDialog.DELETE_PROPERTY.equals(name)) { delete((List) action); } } }); UIUtilities.centerAndShow(dialog); return; } if (ImageCheckerType.DELETE.equals(index)) { delete((List) action); } else if (ImageCheckerType.CHGRP.equals(index)) { moveObject((ChgrpObject) action); } } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#isSystemUser(long) */ public boolean isSystemUser(long userID) { return model.isSystemUser(userID); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#isSystemUser(long, String) */ public boolean isSystemUser(long userID, String key) { return model.isSystemUser(userID, key); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#isSystemGroup(long, String) */ public boolean isSystemGroup(long groupID, String key) { return model.isSystemGroup(groupID, key); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#getSelectedObjectsFromBrowser() */ public Collection<DataObject> getSelectedObjectsFromBrowser() { DataBrowser db = model.getDataViewer(); if (db != null && db.getBrowser() != null) { return db.getBrowser().getSelectedDataObjects(); } return null; } /** * Implemented as specified by the {@link TreeViewer} interface. * @see TreeViewer#resetRndSettings(long, RndProxyDef) */ public void resetRndSettings(long imageID, RndProxyDef settings) { MetadataViewer viewer = model.getMetadataViewer(); if (viewer == null) return; Object ho = viewer.getRefObject(); ImageData img = null; if (ho instanceof ImageData) { img = (ImageData) ho; } else if (ho instanceof WellSampleData) { img = ((WellSampleData) ho).getImage(); } if (img == null || img.getId() != imageID) return; Renderer rnd = viewer.getRenderer(); if (rnd != null) { rnd.resetSettings(settings, true); } } public RndProxyDef getSelectedViewedBy() { MetadataViewer viewer = model.getMetadataViewer(); if (viewer == null) return null; Object ho = viewer.getRefObject(); ImageData img = null; if (ho instanceof ImageData) { img = (ImageData) ho; } else if (ho instanceof WellSampleData) { img = ((WellSampleData) ho).getImage(); } if (img == null) return null; Renderer rnd = viewer.getRenderer(); if (rnd == null) return null; return rnd.getSelectedDef(); } }