/* *------------------------------------------------------------------------------ * 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.browser; import java.awt.Component; import java.awt.Cursor; import java.awt.Point; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JTree; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.openmicroscopy.shoola.agents.events.treeviewer.ExperimenterLoadedDataEvent; import org.openmicroscopy.shoola.agents.treeviewer.IconManager; import org.openmicroscopy.shoola.agents.treeviewer.RefreshExperimenterDef; import org.openmicroscopy.shoola.agents.treeviewer.TreeViewerAgent; import org.openmicroscopy.shoola.agents.treeviewer.cmd.EditVisitor; import org.openmicroscopy.shoola.agents.treeviewer.cmd.ExperimenterVisitor; import org.openmicroscopy.shoola.agents.treeviewer.cmd.ParentVisitor; import org.openmicroscopy.shoola.agents.treeviewer.cmd.RefreshVisitor; import org.openmicroscopy.shoola.agents.treeviewer.cmd.UpdateVisitor; import org.openmicroscopy.shoola.agents.treeviewer.view.TreeViewer; import org.openmicroscopy.shoola.agents.util.EditorUtil; import org.openmicroscopy.shoola.agents.util.browser.ContainerFinder; import org.openmicroscopy.shoola.agents.util.browser.NodeSelectionVisitor; import org.openmicroscopy.shoola.agents.util.browser.NodesFinder; import org.openmicroscopy.shoola.agents.util.browser.PartialNameVisitor; import org.openmicroscopy.shoola.agents.util.browser.SimilarNodesVisitor; 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.dnd.DnDTree; import org.openmicroscopy.shoola.env.data.FSAccessException; import org.openmicroscopy.shoola.env.data.FSFileSystemView; import omero.gateway.SecurityContext; import org.openmicroscopy.shoola.env.event.EventBus; import omero.log.LogMessage; import org.openmicroscopy.shoola.util.ui.component.AbstractComponent; import com.google.common.collect.Sets; import omero.gateway.model.DataObject; import omero.gateway.model.DatasetData; import omero.gateway.model.ExperimenterData; import omero.gateway.model.FileData; import omero.gateway.model.GroupData; import omero.gateway.model.ImageData; 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; /** * Implements the {@link Browser} 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. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @version 2.2 * <small> * (<b>Internal version:</b> $Revision$ $Date$) * </small> * @since OME2.2 */ class BrowserComponent extends AbstractComponent implements Browser { /** The Model sub-component. */ private BrowserModel model; /** The View sub-component. */ private BrowserUI view; /** The Controller sub-component. */ private BrowserControl controller; /** The node to select after saving data. */ private TreeImageDisplay toSelectAfterSave; /** * Reloads the data for the specified experimenters. * * @param ids The id of the experimenters. */ private void refreshExperimenterData(List<Long> ids) { RefreshExperimenterDef def; RefreshVisitor v = new RefreshVisitor(this); TreeImageDisplay root = view.getTreeRoot(); //root.setToRefresh(false); int n = root.getChildCount(); Map<SecurityContext, RefreshExperimenterDef> m = new HashMap<SecurityContext, RefreshExperimenterDef>(n); Collection foundNodes; Map topNodes; int type = model.getBrowserType(); Iterator j; TreeImageSet expNode, groupNode; List children; long gid; SecurityContext ctx; if (model.isSingleGroup()) { gid = model.getUserDetails().getDefaultGroup().getId(); for (int i = 0; i < n; i++) { expNode = (TreeImageSet) root.getChildAt(i); //if (expNode.isExpanded() && expNode.isChildrenLoaded()) { if (ids.contains(expNode.getUserObjectId())) { expNode.accept(v, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); foundNodes = v.getFoundNodes(); topNodes = v.getExpandedTopNodes(); //reset the flag if (type == Browser.IMAGES_EXPLORER) countExperimenterImages(expNode); def = new RefreshExperimenterDef(expNode, v.getFoundNodes(), v.getExpandedTopNodes()); ctx = new SecurityContext(gid); if (model.getDisplayMode() == TreeViewer.EXPERIMENTER_DISPLAY) ctx.setExperimenter( (ExperimenterData) expNode.getUserObject()); m.put(ctx, def); } } } else { for (int i = 0; i < n; i++) { groupNode = (TreeImageSet) root.getChildAt(i); if (groupNode.isExpanded()) { gid = groupNode.getUserObjectId(); children = groupNode.getChildrenDisplay(); j = children.iterator(); while (j.hasNext()) { expNode = (TreeImageSet) j.next(); if (ids.contains(expNode.getUserObjectId())) { expNode.accept(v, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); foundNodes = v.getFoundNodes(); topNodes = v.getExpandedTopNodes(); //reset the flag if (type == Browser.IMAGES_EXPLORER) countExperimenterImages(expNode); def = new RefreshExperimenterDef(expNode, v.getFoundNodes(), v.getExpandedTopNodes()); ctx = new SecurityContext(gid); ctx.setExperimenter( (ExperimenterData) expNode.getUserObject()); m.put(ctx, def); } } } } } if(!MapUtils.isEmpty(m)) { model.loadRefreshExperimenterData(m, null, -1, null, null); fireStateChange(); } } /** * Helper method to remove the collection of the specified nodes. * * @param nodes The collection of node to remove. */ private void removeNodes(List nodes) { TreeImageDisplay parentDisplay; if (getLastSelectedDisplay() == null) parentDisplay = view.getTreeRoot(); else { parentDisplay = getLastSelectedDisplay().getParentDisplay(); } if (parentDisplay == null) parentDisplay = view.getTreeRoot(); setSelectedDisplay(parentDisplay); view.removeNodes(nodes, parentDisplay); } /** * Helper method to create the specified nodes. * * @param nodes The list of nodes to add the specified * <code>display</code> node to. * @param display The node to add to. * @param parentDisplay The parent of the node. */ private void createNodes(List nodes, TreeImageDisplay display, TreeImageDisplay parentDisplay) { setSelectedDisplay(display); Object ho = display.getUserObject(); if ((ho instanceof ProjectData) || (ho instanceof ScreenData)) display.setChildrenLoaded(Boolean.valueOf(true)); else if (ho instanceof TagAnnotationData) { TagAnnotationData tag = (TagAnnotationData) ho; if (TagAnnotationData.INSIGHT_TAGSET_NS.equals(tag.getNameSpace())) display.setChildrenLoaded(Boolean.valueOf(true)); else display.setChildrenLoaded(Boolean.valueOf(false)); } else { display.setChildrenLoaded(Boolean.valueOf(false)); } view.createNodes(nodes, display, parentDisplay); //Object o = display.getUserObject(); countItems(null, display); } /** * Handles the node selection when the user clicks on find next or find * previous. * * @param node The newly selected node. */ private void handleNodeDisplay(TreeImageDisplay node) { view.selectFoundNode(node); } /** * Controls if the passed node has to be saved before selecting a new node. * * @param node The node to check. * @return <code>true</code> if we need to save data, <code>false</code> * otherwise. */ private boolean hasDataToSave(TreeImageDisplay node) { if (model.getParentModel().hasDataToSave()) { model.getParentModel().saveMetadata(); return false; } return false; } /** Counts the tags used but not owned by the user. */ private void countExperimenterDataInFolders() { ContainerFinder finder = new ContainerFinder(ExperimenterData.class); accept(finder, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); Set<TreeImageSet> nodes = finder.getContainerNodes(); Iterator<TreeImageSet> i = nodes.iterator(); TreeImageSet node; while (i.hasNext()) { node = i.next(); if (node.getUserObject() instanceof ExperimenterData && node.isExpanded()) countExperimenterImages(node); } } /** * Retrieves the nodes to count the value for. * * @param rootType The type of node to track. * @param node The node to visit. */ private void countItems(List<Class> rootType, TreeImageDisplay node) { if (rootType == null) { int type = model.getBrowserType(); if (type == PROJECTS_EXPLORER) { rootType = new ArrayList<Class>(); rootType.add(DatasetData.class); } else if (type == TAGS_EXPLORER) { rootType = new ArrayList<Class>(); rootType.add(TagAnnotationData.class); } else if (type == ADMIN_EXPLORER) { rootType = new ArrayList<Class>(); rootType.add(GroupData.class); } } if (rootType == null) { countExperimenterDataInFolders(); return; } ContainerFinder finder = new ContainerFinder(rootType); Set<DataObject> items; Set<TreeImageSet> nodes; if (node != null) { node.accept(finder, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); items = finder.getContainers(); nodes = finder.getContainerNodes(); if (items.size() == 0 && nodes.size() == 0) return; model.fireContainerCountLoading(items, nodes, node); } else { // TreeImageDisplay root = view.getTreeRoot(); List l = root.getChildrenDisplay(); Iterator i = l.iterator(); while (i.hasNext()) { countItems(rootType, (TreeImageDisplay) i.next()); } } } /** * Counts the nodes linked to the specified annotation. * * @param node The node of reference. */ private void countItemsInAnnotation(TreeImageSet node) { if (node == null) return; Object ho = node.getUserObject(); List<Class> types = new ArrayList<Class>(); if (ho instanceof TagAnnotationData) { types.add(DatasetData.class); } if (types.size() == 0) return; ContainerFinder finder = new ContainerFinder(types); node.accept(finder, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); Set<DataObject> items = finder.getContainers(); Set<TreeImageSet> nodes = finder.getContainerNodes(); if (items.size() == 0 && nodes.size() == 0) return; model.fireContainerCountLoading(items, nodes, node); } /** * Sets the selected node. * * @param display The selected value. * @param single Pass <code>true</code> if the method is invoked for * single selection, <code>false</code> for multi-selection. */ private void setSelectedDisplay(TreeImageDisplay display, boolean single) { switch (model.getState()) { //case LOADING_DATA: //case LOADING_LEAVES: case DISCARDED: throw new IllegalStateException( "This method cannot be invoked in the "+ "DISCARDED state."); } hasDataToSave(display); TreeImageDisplay oldDisplay = model.getLastSelectedDisplay(); TreeImageDisplay exp = null; Object ho = null; if (display != null) { ho = display.getUserObject(); if (ho instanceof ExperimenterData) { if (getBrowserType() != ADMIN_EXPLORER) { exp = display; display = null; } } } if (exp != null) model.setSelectedDisplay(exp, single); else model.setSelectedDisplay(display, single); if (oldDisplay != null && oldDisplay.equals(display)) { ho = oldDisplay.getUserObject(); if (ho instanceof PlateData || ho instanceof PlateAcquisitionData) firePropertyChange(SELECTED_TREE_NODE_DISPLAY_PROPERTY, null, display); } else { firePropertyChange(SELECTED_TREE_NODE_DISPLAY_PROPERTY, oldDisplay, display); } } /** * 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. */ BrowserComponent(BrowserModel model) { if (model == null) throw new NullPointerException("No model."); this.model = model; controller = new BrowserControl(this); view = new BrowserUI(); } /** * Links up the MVC triad. * * @param exp The logged in experimenter. */ void initialize(ExperimenterData exp) { model.initialize(this); controller.initialize(view); view.initialize(controller, model, exp); } /** * Returns the Model sub-component. * * @return See above. */ BrowserModel getModel() { return model; } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getState() */ public int getState() { return model.getState(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#activate() */ public void activate() { int state = model.getState(); switch (state) { case NEW: if (model.getBrowserType() == ADMIN_EXPLORER) { model.fireExperimenterDataLoading(null); return; } TreeImageDisplay node; switch (model.getDisplayMode()) { case TreeViewer.GROUP_DISPLAY: node = getDefaultGroupNode(); if (node != null) { view.expandNode(node, true); } break; case TreeViewer.EXPERIMENTER_DISPLAY: default: node = getLoggedExperimenterNode(); if (node != null) { if (!model.isSingleGroup()) { TreeImageDisplay p = node.getParentDisplay(); if (p != null) p.setExpanded(true); } view.expandNode(node, true); } } break; case READY: refreshBrowser(); //do we want to automatically refresh? break; case DISCARDED: throw new IllegalStateException( "This method can't be invoked in the DISCARDED state."); default: break; } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#discard() */ public void discard() { if (model.getState() != DISCARDED) { model.discard(); fireStateChange(); } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getUI() */ public JComponent getUI() { if (model.getState() == DISCARDED) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED state."); return view; } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getBrowserType() */ public int getBrowserType() { return model.getBrowserType(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#cancel() */ public void cancel() { int state = model.getState(); if ((state == LOADING_DATA) || (state == LOADING_LEAVES)) { model.cancel(); view.cancel(model.getLastSelectedDisplay()); fireStateChange(); } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#loadFilteredImagesForHierarchy() */ public void loadFilteredImagesForHierarchy() { int state = model.getState(); if ((state == DISCARDED) || (state == LOADING_LEAVES)) throw new IllegalStateException( "This method cannot be invoked in the DISCARDED or" + "LOADING_LEAVES state."); //Check the filterType and editorType. if (model.getBrowserType() != Browser.IMAGES_EXPLORER) throw new IllegalArgumentException("Method should only be invoked" + " by the Images Explorer."); //if (model.getFilterType() == NO_IMAGES_FILTER) view.loadAction(view.getTreeRoot()); //model.fireFilterDataLoading(); model.getParentModel().setStatus(true, TreeViewer.LOADING_TITLE, false); fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setLeaves(Set, TreeImageSet, TreeImageSet) */ public void setLeaves(Collection leaves, TreeImageSet parent, TreeImageSet expNode) { if (model.getState() != LOADING_LEAVES) return; if (leaves == null || leaves.isEmpty()) { view.setLeavesViews(Collections.EMPTY_SET, parent); model.setState(READY); fireStateChange(); return; } Object ho = expNode.getUserObject(); if (!(ho instanceof ExperimenterData || ho instanceof GroupData)) throw new IllegalArgumentException("Node not valid"); if (model.getBrowserType() == FILE_SYSTEM_EXPLORER) { model.getParentModel().setLeaves(parent, leaves); model.setState(READY); fireStateChange(); return; } Set visLeaves = TreeViewerTranslator.transformHierarchy(leaves); view.setLeavesViews(visLeaves, parent); model.setState(READY); if (parent != null && parent.getUserObject() instanceof TagAnnotationData) //countItems(TagAnnotationData.class); countItemsInAnnotation(parent); if (model.getBrowserType() == TAGS_EXPLORER && parent instanceof TreeFileSet) { List<Class> types = new ArrayList<Class>(); types.add(TagAnnotationData.class); countItems(types, expNode); } Object p = null; if (parent != null && parent.getUserObject() instanceof PlateData) { p = parent.getUserObject(); } if (!(p instanceof PlateData)) model.getParentModel().setLeaves(parent, leaves); model.getParentModel().setStatus(false, "", true); fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setSelectedDisplay(TreeImageDisplay) */ public void setSelectedDisplay(TreeImageDisplay display) { setSelectedDisplay(display, true); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#showPopupMenu(int) */ public void showPopupMenu(int index) { switch (model.getState()) { case LOADING_DATA: case LOADING_LEAVES: case DISCARDED: return; /* throw new IllegalStateException( "This method cannot be invoked in the LOADING_DATA, "+ " LOADING_LEAVES or DISCARDED state."); */ } switch (index) { case TreeViewer.FULL_POP_UP_MENU: case TreeViewer.PARTIAL_POP_UP_MENU: case TreeViewer.ADMIN_MENU: case TreeViewer.CREATE_MENU_ADMIN: break; default: throw new IllegalArgumentException("Menu not supported:" + " "+index); } firePropertyChange(POPUP_MENU_PROPERTY, Integer.valueOf(-1), Integer.valueOf(index)); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getClickPoint() */ public Point getClickPoint() { return model.getClickPoint(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getLastSelectedDisplay() */ public TreeImageDisplay getLastSelectedDisplay() { return model.getLastSelectedDisplay(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#close() */ public void close() { switch (model.getState()) { case LOADING_DATA: case LOADING_LEAVES: case DISCARDED: throw new IllegalStateException( "This method can only be invoked in the LOADING_DATA, "+ " LOADING_LEAVES or DISCARDED state."); } firePropertyChange(CLOSE_PROPERTY, null, this); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#collapse(TreeImageDisplay) */ public void collapse(TreeImageDisplay node) { if (node == null) return; view.collapsePath(node); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#expand(TreeImageDisplay) */ public void expand(TreeImageDisplay node) { if (node == null) return; view.expandNode(node); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#accept(TreeImageDisplayVisitor) */ public void accept(TreeImageDisplayVisitor visitor) { accept(visitor, TreeImageDisplayVisitor.ALL_NODES); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#accept(TreeImageDisplayVisitor, int) */ public void accept(TreeImageDisplayVisitor visitor, int algoType) { view.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); view.getTreeRoot().accept(visitor, algoType); view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); if (visitor instanceof UpdateVisitor) { UpdateVisitor us = (UpdateVisitor) visitor; Collection<TreeImageDisplay> updated = us.getUpdated(); if (CollectionUtils.isEmpty(updated)) return; Iterator<TreeImageDisplay> i = updated.iterator(); TreeImageDisplay n; TreeModel tm = view.getTreeDisplay().getModel(); while (i.hasNext()) { n = i.next(); tm.valueForPathChanged(new TreePath(n.getPath()), n.getUserObject()); } } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getTitle() */ public String getTitle() { return view.getBrowserTitle(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getIcon() */ public Icon getIcon() { IconManager im = IconManager.getInstance(); switch (model.getBrowserType()) { case PROJECTS_EXPLORER: return im.getIcon(IconManager.PROJECT);//HIERARCHY_EXPLORER); case TAGS_EXPLORER: return im.getIcon(IconManager.TAG);//TAGS_EXPLORER); case IMAGES_EXPLORER: return im.getIcon(IconManager.DATE);//IMAGES_EXPLORER); case SCREENS_EXPLORER: return im.getIcon(IconManager.SCREEN);//SCREENS_EXPLORER); case FILES_EXPLORER: return im.getIcon(IconManager.FILES_EXPLORER); case FILE_SYSTEM_EXPLORER: return im.getIcon(IconManager.FILE_SYSTEM_EXPLORER); case ADMIN_EXPLORER: return im.getIcon(IconManager.ADMIN); } return null; } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#sortTreeNodes(int) */ public void sortTreeNodes(int sortType) { switch (model.getState()) { //case COUNTING_ITEMS: case LOADING_DATA: case LOADING_LEAVES: case DISCARDED: throw new IllegalStateException( "This method cannot be invoked in the LOADING_DATA, "+ " LOADING_LEAVES or DISCARDED state."); } switch (sortType) { case SORT_NODES_BY_DATE: case SORT_NODES_BY_NAME: break; default: throw new IllegalArgumentException("SortType not supported."); } view.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); view.sortNodes(sortType); view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setContainerCountValue(int, long, Set) */ public void setContainerCountValue(long containerID, long value, Set<TreeImageSet> nodes) { int state = model.getState(); if (state == DISCARDED) return; boolean b = model.setContainerCountValue(view.getTreeDisplay(), containerID, value, nodes); if (b) { view.getTreeDisplay().repaint(); } model.getParentModel().setStatus(false, "", true); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setFoundInBrowser(Set) */ public void setFoundInBrowser(Set nodes) { if (nodes == null || nodes.size() == 0) { model.setFoundNodes(null); // reset default value. model.setFoundNodeIndex(-1); // reset default value. view.getTreeDisplay().repaint(); return; } List<Object> list = new ArrayList<Object>(nodes.size()); Iterator i = nodes.iterator(); final JTree tree = view.getTreeDisplay(); while (i.hasNext()) list.add(i.next()); Comparator c = new Comparator() { public int compare(Object o1, Object o2) { TreeImageDisplay node1 = (TreeImageDisplay) o1; TreeImageDisplay node2 = (TreeImageDisplay) o2; int i1 = tree.getRowForPath(new TreePath(node1.getPath())); int i2 = tree.getRowForPath(new TreePath(node2.getPath())); return (i1-i2); } }; Collections.sort(list, c); model.setFoundNodes(list); model.setFoundNodeIndex(0); handleNodeDisplay((TreeImageDisplay) list.get(0)); tree.repaint(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#findNext() */ public void findNext() { List l = model.getFoundNodes(); if (l == null || l.size() == 0) return; int index = model.getFoundNodeIndex(); int n = l.size()-1; if (index < n) index++; //not last element else if (index == n) index = 0; model.setFoundNodeIndex(index); handleNodeDisplay((TreeImageDisplay) l.get(index)); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#findPrevious() */ public void findPrevious() { List l = model.getFoundNodes(); if (l == null || l.size() == 0) return; int index = model.getFoundNodeIndex(); if (index > 0) index--; //not last element else if (index == 0) index = l.size()-1; model.setFoundNodeIndex(index); handleNodeDisplay((TreeImageDisplay) l.get(index)); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setSelected(boolean) */ public void setSelected(boolean b) { switch (model.getState()) { //case LOADING_DATA: //case LOADING_LEAVES: //case COUNTING_ITEMS: // return; case DISCARDED: throw new IllegalStateException( "This method can only be invoked in the " + "NEW or READY state."); } boolean old = model.isSelected(); if (old == b) return; model.setSelected(b); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#refreshEdition(DataObject, int) */ public void refreshEdition(DataObject object, DataObject parent, int op) { switch (model.getState()) { case NEW: case READY: break; default: throw new IllegalStateException("This method can only " + "be invoked in the NEW or READY state."); } Object o = object; List nodes = null; TreeImageDisplay parentDisplay = null; TreeImageDisplay loggedUser = getLoggedExperimenterNode(); if (op == TreeViewer.CREATE_OBJECT) { TreeImageDisplay node = getLastSelectedDisplay(); if ((object instanceof ProjectData) || (object instanceof ScreenData) || ((object instanceof DatasetData) && parent == null) || ((object instanceof TagAnnotationData) && parent == null)) { nodes = new ArrayList(1); nodes.add(loggedUser); parentDisplay = loggedUser; //nodes.add(view.getTreeRoot()); //parentDisplay = view.getTreeRoot(); } else if (parent != null) o = node.getUserObject(); } if (nodes == null && parent == null) { EditVisitor visitor = new EditVisitor(this, o, null); //accept(visitor, TreeImageDisplayVisitor.ALL_NODES); loggedUser.accept(visitor, TreeImageDisplayVisitor.ALL_NODES); nodes = visitor.getFoundNodes(); } if (parent != null) { EditVisitor visitor = new EditVisitor(this, null, parent); loggedUser.accept(visitor, TreeImageDisplayVisitor.ALL_NODES); nodes = visitor.getParentNodes(); } if (op == TreeViewer.UPDATE_OBJECT) view.updateNodes(nodes, object); else if (op == TreeViewer.REMOVE_OBJECT) removeNodes(nodes); else if (op == TreeViewer.CREATE_OBJECT) { //Get the user node. if (parentDisplay == null) parentDisplay = getLastSelectedDisplay(); TreeImageDisplay newNode = TreeViewerTranslator.transformDataObject(object); createNodes(nodes, newNode, parentDisplay); } setSelectedNode(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#onOrphanDataObjectCreated(DataObject) */ public void onOrphanDataObjectCreated(DataObject data) { int type = model.getBrowserType(); if (data instanceof DatasetData) { if (type != PROJECTS_EXPLORER) return; } else if (data instanceof TagAnnotationData) { if (type != TAGS_EXPLORER) return; } TreeImageDisplay loggedUser = getLoggedExperimenterNode(); List<TreeImageDisplay> nodes = new ArrayList<TreeImageDisplay>(1); nodes.add(loggedUser); //long model.get createNodes(nodes, TreeViewerTranslator.transformDataObject(data), loggedUser); setSelectedNode(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getSelectedDisplays() */ public TreeImageDisplay[] getSelectedDisplays() { return model.getSelectedDisplays(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getSelectedDataObjects() */ public List getSelectedDataObjects() { TreeImageDisplay[] nodes = getSelectedDisplays(); if (nodes == null || nodes.length == 0) return null; List<DataObject> objects = new ArrayList<DataObject>(); Object uo; for (int i = 0; i < nodes.length; i++) { uo = nodes[i].getUserObject(); if (uo instanceof DataObject) { objects.add((DataObject) uo); } } return objects; } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setSelectedDisplays(TreeImageDisplay[], boolean) */ public void setSelectedDisplays(TreeImageDisplay[] nodes, boolean expandParent) { if (nodes.length == 0) return; TreeImageDisplay[] oldNodes = model.getSelectedDisplays(); boolean b = true; if (oldNodes != null && oldNodes.length > 1) b = false; if (nodes.length == 1 && b) { setSelectedDisplay(nodes[0], true); if (expandParent) { TreeImageDisplay parent = nodes[0].getParentDisplay(); if (parent.getUserObject() instanceof ExperimenterData) parent = nodes[0]; view.expandNode(parent); view.setFoundNode(nodes); } return; } boolean flush = false; if (oldNodes.length >= nodes.length) flush = true; int n = nodes.length; TreeImageDisplay parent = null; for (int i = 0; i < n; i++) { if (nodes[i] != null) { parent = nodes[i].getParentDisplay(); if (parent != null && parent.getUserObject() instanceof ExperimenterData) parent = nodes[i]; if (i == 0) model.setSelectedDisplay(nodes[i], flush); else model.setSelectedDisplay(nodes[i], false); } } if (parent != null && expandParent) { view.setFoundNode(nodes); view.expandNode(parent); } firePropertyChange(SELECTED_TREE_NODE_DISPLAY_PROPERTY, null, nodes[n-1]); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#onComponentStateChange(boolean) */ public void onComponentStateChange(boolean b) { view.onComponentStateChange(b); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#isDisplayed() */ public boolean isDisplayed() { return model.isDisplayed(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setDisplayed(boolean) */ public void setDisplayed(boolean displayed) { if (model.getState() == DISCARDED) throw new IllegalStateException("This method cannot be invoked "+ "in the DISCARDED state."); model.setDisplayed(displayed); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setRefreshedHierarchy(Map, Map) */ public void setRefreshedHierarchy(Map nodes, Map expandedTopNodes) { if (model.getState() != LOADING_DATA) throw new IllegalStateException("This method cannot be invoked "+ "in the LOADING_DATA state."); //long userID = model.getUserID(); //long groupID = model.getUserGroupID(); //view.setViews(TreeViewerTranslator.refreshHierarchy(nodes, // expandedTopNodes, userID, groupID)); countItems(null, null); model.getParentModel().setStatus(false, "", true); PartialNameVisitor v = new PartialNameVisitor(view.isPartialName()); accept(v, TreeImageDisplayVisitor.TREEIMAGE_NODE_ONLY); fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#displaysImagesName() */ public void displaysImagesName() { if (model.getState() == DISCARDED) throw new IllegalStateException("This method cannot be invoked "+ "in the DISCARDED state."); PartialNameVisitor v = new PartialNameVisitor(view.isPartialName()); accept(v); view.repaint(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#loadExperimenterData(TreeImageDisplay, TreeImageDisplay) */ public void loadExperimenterData(TreeImageDisplay exp, TreeImageDisplay n) { if (exp == null) return; Object uo = exp.getUserObject(); if (!(uo instanceof ExperimenterData || uo instanceof GroupData)) throw new IllegalArgumentException("Node not valid."); switch (model.getState()) { case DISCARDED: case LOADING_LEAVES: return; } if (n == null) model.fireExperimenterDataLoading((TreeImageSet) exp); else { n.setToRefresh(false); if (model.getBrowserType() == FILE_SYSTEM_EXPLORER) { uo = n.getUserObject(); TreeImageDisplay expNode = BrowserFactory.getDataOwner(n); if (expNode == null) return; Object ho = expNode.getUserObject(); if (!(ho instanceof ExperimenterData)) return; if (uo instanceof FileData) { FileData dir = (FileData) uo; if (dir.isHidden()) return; if (dir.isDirectory()) { //Check if data loaded List<DataObject> list = new ArrayList<DataObject>(); if (n.isChildrenLoaded()) { List children = n.getChildrenDisplay(); Iterator k = children.iterator(); TreeImageDisplay d; Object o; while (k.hasNext()) { d = (TreeImageDisplay) k.next(); o = d.getUserObject(); if (o instanceof DataObject) { list.add((DataObject) o); } } } else { long expID = ((ExperimenterData) ho).getId(); DataObject[] files = model.getFilesData(expID, dir); if (files != null) { for (int i = 0; i < files.length; i++) list.add(files[i]); } } if (list.size() > 0) { model.setState(LOADING_LEAVES); setLeaves(list, (TreeImageSet) n, (TreeImageSet) exp); } } return; } } else model.fireLeavesLoading(exp, n); } model.getParentModel().setStatus(true, TreeViewer.LOADING_TITLE, false); fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setExperimenterData(TreeImageDisplay, Collection) */ public void setExperimenterData(TreeImageDisplay expNode, Collection nodes) { int state = model.getState(); if (state != LOADING_DATA) return; if (nodes == null) throw new NullPointerException("No nodes."); if (expNode == null) throw new IllegalArgumentException("Node not valid."); Object uo = expNode.getUserObject(); if (!(uo instanceof ExperimenterData || uo instanceof GroupData)) throw new IllegalArgumentException("Node not valid."); Set convertedNodes = TreeViewerTranslator.transformHierarchy(nodes); view.setExperimenterData(convertedNodes, expNode); model.setState(READY); countItems(null, expNode); countExperimenterDataInFolders(); model.getParentModel().setStatus(false, "", true); //Visit the tree and switch(model.getBrowserType()) { case Browser.PROJECTS_EXPLORER: case Browser.SCREENS_EXPLORER: //TODO: review that code to indicate the context. ParentVisitor visitor = new ParentVisitor(); accept(visitor, ParentVisitor.TREEIMAGE_SET_ONLY); EventBus bus = TreeViewerAgent.getRegistry().getEventBus(); bus.post(new ExperimenterLoadedDataEvent(visitor.getData())); } fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#addExperimenter(ExperimenterData, long) */ public void addExperimenter(ExperimenterData experimenter, long groupID) { if (experimenter == null) throw new IllegalArgumentException("Experimenter cannot be null."); if (model.getBrowserType() == ADMIN_EXPLORER) return; TreeImageDisplay node = model.getLastSelectedDisplay(); boolean reload = false; if (model.isSingleGroup()) { node = view.getTreeRoot(); reload = node.getChildCount() == 0; } else { //Find the group ExperimenterVisitor v = new ExperimenterVisitor(this, groupID); accept(v, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); List<TreeImageDisplay> list = v.getNodes(); if (list.size() == 0) return; node = list.get(0); } //Make sure the user is not already display List<TreeImageDisplay> nodes = new ArrayList<TreeImageDisplay>(1); nodes.add(new TreeImageSet(experimenter)); SimilarNodesVisitor visitor = new SimilarNodesVisitor(nodes); node.accept(visitor, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); if (visitor.getFoundNodes().size() > 0) return; setSelectedDisplay(null); view.addExperimenter(experimenter, node); if (reload) view.reloadNode(node); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#removeExperimenter(ExperimenterData, GroupData) */ public void removeExperimenter(ExperimenterData exp, long groupID) { if (exp == null) throw new IllegalArgumentException("Experimenter cannot be null."); TreeImageDisplay node = null; if (groupID >= 0) { ExperimenterVisitor v = new ExperimenterVisitor(this, groupID); accept(v); List<TreeImageDisplay> nodes = v.getNodes(); if (nodes.size() == 1) node = nodes.get(0); } view.removeExperimenter(exp, node); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#refreshExperimenterData() */ public void refreshExperimenterData() { switch (model.getState()) { case LOADING_DATA: case LOADING_LEAVES: model.cancel(); break; case DISCARDED: //ignore return; } TreeImageDisplay display; RefreshVisitor v = new RefreshVisitor(this); if (model.getBrowserType() == ADMIN_EXPLORER) { display = view.getTreeRoot(); //review for admin. display.accept(v, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); RefreshExperimenterDef def = new RefreshExperimenterDef( (TreeImageSet) display, v.getFoundNodes(), v.getExpandedTopNodes()); Map<SecurityContext, RefreshExperimenterDef> m = new HashMap<SecurityContext, RefreshExperimenterDef>(1); SecurityContext ctx = TreeViewerAgent.getAdminContext(); if (ctx == null) ctx = model.getSecurityContext(null); m.put(ctx, def); model.loadRefreshExperimenterData(m, null, -1, null, null); fireStateChange(); } else { display = model.getLastSelectedDisplay(); if (display == null) return; Object ho = display.getUserObject(); if (!(ho instanceof ExperimenterData)) return; refreshExperimenterData(Arrays.asList(display.getUserObjectId())); } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getLoggedExperimenterNode() */ public TreeImageDisplay getLoggedExperimenterNode() { SecurityContext ctx = model.getSecurityContext(null); long id = ctx.getGroupID(); if (model.isSingleGroup()) id = -1; ExperimenterVisitor visitor = new ExperimenterVisitor(this, model.getUserID(), id); accept(visitor, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); List<TreeImageDisplay> nodes = visitor.getNodes(); if (nodes.size() != 1) return null; return nodes.get(0); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#refreshLoggedExperimenterData() */ public void refreshLoggedExperimenterData() { switch (model.getState()) { case LOADING_DATA: case LOADING_LEAVES: model.cancel(); break; case DISCARDED: //ignore return; } TreeImageDisplay node = getLoggedExperimenterNode(); if (node == null) return; Object ho = node.getUserObject(); if (!(ho instanceof ExperimenterData)) return; refreshExperimenterData(Arrays.asList(node.getUserObjectId())); fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#refreshTree(Object, DataObject) */ public void refreshTree(Object refNode, DataObject toBrowse) { switch (model.getState()) { case LOADING_DATA: case LOADING_LEAVES: model.cancel(); break; case DISCARDED: //ignore return; } if (model.getBrowserType() == FILE_SYSTEM_EXPLORER) { //view.loadFileSystem(true); return; } if (model.getBrowserType() == ADMIN_EXPLORER) { refreshExperimenterData(); return; } addComponent(null); TreeImageDisplay root = view.getTreeRoot(); //root.setToRefresh(false); RefreshExperimenterDef def; RefreshVisitor v; int n = root.getChildCount(); Map<SecurityContext, RefreshExperimenterDef> m = new HashMap<SecurityContext, RefreshExperimenterDef>(n); int type = model.getBrowserType(); Iterator j; TreeImageSet expNode, groupNode; List children; long gid; SecurityContext ctx; switch (model.getDisplayMode()) { case TreeViewer.EXPERIMENTER_DISPLAY: if (model.isSingleGroup()) { gid = model.getUserDetails().getDefaultGroup().getId(); for (int i = 0; i < n; i++) { expNode = (TreeImageSet) root.getChildAt(i); if (expNode.isExpanded() && expNode.isChildrenLoaded()) { v = new RefreshVisitor(this); expNode.accept(v); //reset the flag if (type == Browser.IMAGES_EXPLORER) countExperimenterImages(expNode); def = new RefreshExperimenterDef(expNode, v.getFoundNodes(), v.getExpandedTopNodes()); ctx = new SecurityContext(gid); if (model.getDisplayMode() == TreeViewer.EXPERIMENTER_DISPLAY) ctx.setExperimenter( (ExperimenterData) expNode.getUserObject()); m.put(ctx, def); } else { expNode.setChildrenLoaded(Boolean.FALSE); } } } else { for (int i = 0; i < n; i++) { groupNode = (TreeImageSet) root.getChildAt(i); if (groupNode.isExpanded()) { v = new RefreshVisitor(this); gid = groupNode.getUserObjectId(); children = groupNode.getChildrenDisplay(); j = children.iterator(); while (j.hasNext()) { expNode = (TreeImageSet) j.next(); if (expNode.isChildrenLoaded() && expNode.isExpanded()) { v = new RefreshVisitor(this); expNode.accept(v); //reset the flag if (type == Browser.IMAGES_EXPLORER) countExperimenterImages(expNode); def = new RefreshExperimenterDef(expNode, v.getFoundNodes(), v.getExpandedTopNodes()); ctx = new SecurityContext(gid); ctx.setExperimenter( (ExperimenterData) expNode.getUserObject()); m.put(ctx, def); } else { expNode.setChildrenLoaded(Boolean.FALSE); } } } } } break; case TreeViewer.GROUP_DISPLAY: for (int i = 0; i < n; i++) { groupNode = (TreeImageSet) root.getChildAt(i); if (groupNode.isExpanded() && groupNode.isChildrenLoaded()) { v = new RefreshVisitor(this); groupNode.accept(v); gid = groupNode.getUserObjectId(); //reset the flag if (type == Browser.IMAGES_EXPLORER) countExperimenterImages(groupNode); def = new RefreshExperimenterDef(groupNode, v.getFoundNodes(), v.getExpandedTopNodes()); m.put(new SecurityContext(gid), def); } else { groupNode.setChildrenLoaded(Boolean.FALSE); } } } if (m.size() == 0) { //for new data the first time. TreeImageDisplay node = null; switch (model.getDisplayMode()) { case TreeViewer.GROUP_DISPLAY: node = getDefaultGroupNode(); case TreeViewer.EXPERIMENTER_DISPLAY: default: node = getLoggedExperimenterNode(); } if (node != null) loadExperimenterData(node, null); return; } model.loadRefreshExperimenterData(m, null, -1, refNode, toBrowse); fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setRefreshExperimenterData(Map, Class, long) */ public void setRefreshExperimenterData( Map<SecurityContext, RefreshExperimenterDef> nodes, Class type, long id) { //TODO: Should reselect the node previously selected. if (nodes == null || nodes.size() == 0) { model.setSelectedDisplay(null, true); model.setState(READY); countItems(null, null); if (model.getBrowserType() == TAGS_EXPLORER) countExperimenterDataInFolders(); model.getParentModel().setStatus(false, "", true); return; } Iterator<Entry<SecurityContext, RefreshExperimenterDef>> i = nodes.entrySet().iterator(); RefreshExperimenterDef node; TreeImageSet expNode; Set convertedNodes; Entry<SecurityContext, RefreshExperimenterDef> entry; int browserType = model.getBrowserType(); Map<Integer, Set> results; while (i.hasNext()) { entry = i.next(); //userId = (Long) node = (RefreshExperimenterDef) entry.getValue(); expNode = node.getExperimenterNode(); if (browserType == IMAGES_EXPLORER || browserType == FILES_EXPLORER) { results = TreeViewerTranslator.refreshFolderHierarchy( (Map) node.getResults()); view.refreshFolder(expNode, results); } else { convertedNodes = TreeViewerTranslator.refreshHierarchy( (Map) node.getResults(), node.getExpandedTopNodes()); view.setExperimenterData(convertedNodes, expNode); } } //expand the nodes. i = nodes.entrySet().iterator(); Map m; Iterator j; Entry e; NodesFinder finder; if (type == null) { List l; Iterator<TreeImageDisplay> k; Set<TreeImageDisplay> found; while (i.hasNext()) { entry = i.next(); node = (RefreshExperimenterDef) entry.getValue(); expNode = node.getExperimenterNode(); if (expNode.isExpanded()) { m = node.getExpandedTopNodes(); List expandedNodes = node.getExpandedNodes(); boolean b = expandedNodes.size() == 0; if (model.getBrowserType() == TAGS_EXPLORER) b = expandedNodes.size() > 0; if (m != null && m.size() > 0 && b) { j = m.entrySet().iterator(); while (j.hasNext()) { e = (Entry) j.next(); finder = new NodesFinder((Class) e.getKey(), (List) e.getValue()); accept(finder); found = finder.getNodes(); if (found.size() > 0) { k = found.iterator(); TreeImageDisplay n, c; while (k.hasNext()) { n = k.next(); if (n.isExpanded()) view.expandNode(n); if (n.getUserObject() instanceof ProjectData) { List ll = n.getChildrenDisplay(); if (!CollectionUtils.isEmpty(ll)) { Iterator w = ll.iterator(); while (w.hasNext()) { c = (TreeImageDisplay) w.next(); if (c.isExpanded()) view.expandNode(c); } } } } } } } } } } model.setSelectedDisplay(null, true); model.setState(READY); switch (model.getBrowserType()) { case TAGS_EXPLORER: List<Class> types = new ArrayList<Class>(); types.add(TagAnnotationData.class); types.add(DatasetData.class); countItems(types, null); countExperimenterDataInFolders(); break; case ADMIN_EXPLORER: countItems(null, null); break; default: TreeImageDisplay root = view.getTreeRoot(); TreeImageSet groupNode; for (int k = 0; k < root.getChildCount(); k++) { groupNode = (TreeImageSet) root.getChildAt(k); if (groupNode.isExpanded()) { countItems(null, groupNode); } } } model.getParentModel().setStatus(false, "", true); PartialNameVisitor v = new PartialNameVisitor(view.isPartialName()); accept(v, TreeImageDisplayVisitor.TREEIMAGE_NODE_ONLY); if (ProjectData.class.equals(type) || DatasetData.class.equals(type) || ScreenData.class.equals(type)) { finder = new NodesFinder(type, id); accept(finder); Set<TreeImageDisplay> found = finder.getNodes(); if (found.size() > 0) { Iterator<TreeImageDisplay> n = found.iterator(); TreeImageDisplay display; if (DatasetData.class.equals(type)) { while (n.hasNext()) { display = n.next(); setSelectedDisplay(display); view.expandNode(display, true); } } else { while (n.hasNext()) { setSelectedDisplay(n.next()); } } } } switch(model.getBrowserType()) { case Browser.PROJECTS_EXPLORER: case Browser.SCREENS_EXPLORER: ParentVisitor visitor = new ParentVisitor(); accept(visitor, ParentVisitor.TREEIMAGE_SET_ONLY); EventBus bus = TreeViewerAgent.getRegistry().getEventBus(); bus.post(new ExperimenterLoadedDataEvent(visitor.getData())); } fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#countExperimenterImages(TreeImageDisplay) */ public void countExperimenterImages(TreeImageDisplay expNode) { if (expNode == null) throw new IllegalArgumentException("Node not valid."); Object ho = expNode.getUserObject(); if (!(ho instanceof ExperimenterData || ho instanceof GroupData)) throw new IllegalArgumentException("Node not valid."); switch (model.getState()) { case DISCARDED: case LOADING_LEAVES: throw new IllegalStateException( "This method cannot be invoked in the DISCARDED or" + "LOADING_LEAVES state."); } int browserType = model.getBrowserType(); if (!(browserType == IMAGES_EXPLORER || browserType == FILES_EXPLORER || browserType == TAGS_EXPLORER)) return; model.fireCountExperimenterImages((TreeImageSet) expNode); model.getParentModel().setStatus(true, TreeViewer.LOADING_TITLE, false); fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setExperimenterCount(TreeImageSet, int, int) */ public void setExperimenterCount(TreeImageSet expNode, int index, Object v) { if (expNode == null) throw new IllegalArgumentException("Node not valid."); Object ho = expNode.getUserObject(); if (!(ho instanceof ExperimenterData || ho instanceof GroupData)) throw new IllegalArgumentException("Node not valid."); int browserType = model.getBrowserType(); if (!(browserType == IMAGES_EXPLORER || browserType == FILES_EXPLORER || browserType == TAGS_EXPLORER)) return; boolean b = model.setExperimenterCount(expNode, index); if (index != -1 && v != null) { view.setCountValues(expNode, index, v); } if (b) view.getTreeDisplay().repaint(); model.getParentModel().setStatus(false, "", true); fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getNodeOwner(TreeImageDisplay) */ public ExperimenterData getNodeOwner(TreeImageDisplay node) { if (node == null) throw new IllegalArgumentException("No node specified."); TreeImageDisplay n = BrowserFactory.getDataOwner(node); if (n == null) return model.getUserDetails(); return (ExperimenterData) n.getUserObject(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getNodeGroup(TreeImageDisplay) */ public GroupData getNodeGroup(TreeImageDisplay node) { if (node == null) throw new IllegalArgumentException("No node specified."); TreeImageDisplay n = EditorUtil.getDataGroup(node); if (n == null) return model.getUserDetails().getDefaultGroup(); return (GroupData) n.getUserObject(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getSecurityContext(TreeImageDisplay) */ public SecurityContext getSecurityContext(TreeImageDisplay node) { return model.getSecurityContext(node); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getClickComponent() */ public JComponent getClickComponent() { if (model.getState() == DISCARDED) throw new IllegalStateException("This method cannot be invoked " + "in the DISCARDED state."); return view.getTreeDisplay(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setSelected(boolean) */ public void setSelectedNode() { if (toSelectAfterSave == null) return; setSelectedDisplay(toSelectAfterSave); toSelectAfterSave = null; } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#refreshAdmin(Object) */ public void refreshAdmin(Object data) { if (model.getState() == DISCARDED) return; if (model.getBrowserType() == ADMIN_EXPLORER && model.isSelected()) { //visit the browser TreeImageDisplay node = model.getLastSelectedDisplay(); refreshBrowser(); setSelectedDisplay(node, true); return; } if (data instanceof ExperimenterData || data instanceof GroupData) { ExperimenterVisitor v; GroupData g = null; if (data instanceof ExperimenterData) { ExperimenterData exp = (ExperimenterData) data; v = new ExperimenterVisitor(this, exp.getId(), -1); } else { g = (GroupData) data; v = new ExperimenterVisitor(this, g.getId()); } accept(v, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); List<TreeImageDisplay> l = v.getNodes(); Iterator<TreeImageDisplay> i = l.iterator(); TreeImageDisplay n; if (data instanceof ExperimenterData) { while (i.hasNext()) { n = i.next(); n.setUserObject(model.getUserDetails()); view.reloadNode(n); } } else { while (i.hasNext()) { n = i.next(); n.setUserObject(g); view.reloadNode(n); l = n.getChildrenDisplay(); i = l.iterator(); while (i.hasNext()) { n = i.next(); if (n.isExpanded()) view.expandNode(n); } } } } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#browse(TreeImageDisplay, DataObject, boolean) */ public void browse(TreeImageDisplay node, DataObject data, boolean withThumbnails) { //if (node == null) return; model.getParentModel().browse(node, data, withThumbnails); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#onSelectedNode(Object, Object, Boolean) */ public void onSelectedNode(Object parent, Object selected, Boolean multiSelection) { TreeImageDisplay foundNode; if (selected instanceof DataObject) { NodeSelectionVisitor visitor = new NodeSelectionVisitor(parent, (DataObject) selected); accept(visitor); foundNode = visitor.getSelectedNode(); if (foundNode != null) { if (multiSelection) model.addFoundNode(foundNode); else model.setSelectedDisplay(foundNode, true); view.setFoundNode(model.getSelectedDisplays()); } else view.setFoundNode(null); } else if (selected instanceof TreeImageDisplay) { foundNode = (TreeImageDisplay) selected; if (multiSelection) model.addFoundNode(foundNode); else model.setSelectedDisplay(foundNode, true); view.setFoundNode(model.getSelectedDisplays()); } else if (selected instanceof List) { NodeSelectionVisitor visitor = new NodeSelectionVisitor(parent, (List<DataObject>) selected); accept(visitor); List<TreeImageDisplay> nodes = visitor.getSelectedNodes(); if (nodes.size() == 0) { view.setFoundNode(null); } else if (nodes.size() == 1) { model.setSelectedDisplay(nodes.get(0), true); view.setFoundNode(model.getSelectedDisplays()); } else { model.setSelectedDisplay(null, true); Iterator<TreeImageDisplay> i = nodes.iterator(); while (i.hasNext()) model.addFoundNode(i.next()); view.setFoundNode(model.getSelectedDisplays()); } } else if (selected instanceof String) { // this is the case if the 'orphaned images' folder // is selected model.setSelectedDisplay(null, true); view.setFoundNode(null); } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#onDeselectedNode(Object, Object, Boolean) */ public void onDeselectedNode(Object parent, Object selected, Boolean multiSelection) { if (selected instanceof DataObject) { NodeSelectionVisitor visitor = new NodeSelectionVisitor(parent, (DataObject) selected); accept(visitor); TreeImageDisplay foundNode = visitor.getSelectedNode(); if (foundNode != null) { model.removeDisplay(foundNode); view.setFoundNode(model.getSelectedDisplays()); } else view.setFoundNode(null); } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setTimeIntervalImages(Set, TreeImageTimeSet) */ public void setTimeIntervalImages(Set set, TreeImageTimeSet node) { model.getParentModel().browseTimeInterval(node, set); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#onImportFinished(List) */ public void onImportFinished(List<TreeImageDisplay> nodes) { if (model.getState() == DISCARDED) return; if (nodes == null) return; //reload the node. Iterator<TreeImageDisplay> i; TreeImageDisplay n; Object ho; switch (model.getBrowserType()) { case PROJECTS_EXPLORER: SimilarNodesVisitor v = new SimilarNodesVisitor(nodes); accept(v, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); nodes = v.getFoundNodes(); i = nodes.iterator(); while (i.hasNext()) { n = i.next(); ho = n.getUserObject(); if (ho instanceof DatasetData) { view.reloadContainer(n); } } break; } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setImportedFile(ImageData) */ public void setImportedFile(ImageData image) { if (model.getState() == DISCARDED) return; if (image == null) return; model.addImportedImage(image); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#isFileImported(String) */ public boolean isFileImported(String path) { if (model.getState() == DISCARDED) return false; return model.isFileImported(path); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#deleteObjects(List) */ public void deleteObjects(List nodes) { model.getParentModel().deleteObjects(nodes); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#showMenu(int, Component, Point) */ public void showMenu(int index, Component invoker, Point loc) { model.getParentModel().showMenu(index, invoker, loc); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#refreshBrowser() */ public void refreshBrowser() { model.getParentModel().refreshTree(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#removeTreeNodes(Collection) */ public void removeTreeNodes(Collection<TreeImageDisplay> nodes) { if (nodes == null) return; Iterator<TreeImageDisplay> i = nodes.iterator(); TreeImageDisplay node; TreeImageDisplay parent; while (i.hasNext()) { node = i.next(); parent = node.getParentDisplay(); if (parent != null) { parent.removeChildDisplay(node); node.removeFromParent(); view.reloadNode(parent); } } /* ensure that the selected displays do not include any removed nodes */ final Set<TreeImageDisplay> oldSelected = Sets.newHashSet(getSelectedDisplays()); final Set<TreeImageDisplay> newSelected = Sets.newHashSet(oldSelected); newSelected.removeAll(nodes); if (!newSelected.equals(oldSelected)) { setSelectedDisplay(null); setSelectedDisplays(newSelected.toArray(new TreeImageDisplay[newSelected.size()]), false); } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#reActivate() */ public void reActivate() { model.setSelectedDisplay(null, true); view.reActivate(); if (model.isSelected() && model.getBrowserType() == Browser.ADMIN_EXPLORER) { model.setState(NEW); activate(); } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setRepositories(TreeImageDisplay, FSFileSystemView) */ public void setRepositories(TreeImageDisplay expNode, FSFileSystemView systemView) { int state = model.getState(); if (state != LOADING_DATA) throw new IllegalStateException( "This method can only be invoked in the LOADING_DATA "+ "state."); if (model.getBrowserType() != FILE_SYSTEM_EXPLORER) return; if (systemView == null) throw new NullPointerException("No File System."); if (expNode == null) throw new IllegalArgumentException("Experimenter node not valid."); Object uo = expNode.getUserObject(); if (!(uo instanceof ExperimenterData)) throw new IllegalArgumentException("Experimenter node not valid."); model.setRepositories(systemView); view.loadFileSystem(expNode); countItems(null, expNode); model.getParentModel().setStatus(false, "", true); fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setGroups(Set, List) */ public void setGroups(Collection groups, List expanded) { int state = model.getState(); if (state != LOADING_DATA) return; /* throw new IllegalStateException( "This method can only be invoked in the LOADING_DATA "+ "state."); */ if (model.getBrowserType() != ADMIN_EXPLORER) return; Set nodes = TreeViewerTranslator.transformGroups(groups); view.setGroups(nodes, expanded); model.setState(READY); countItems(null, null); model.getParentModel().setStatus(false, "", true); fireStateChange(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#register(DataObject) */ public boolean register(DataObject file) { if (file == null) throw new IllegalArgumentException("No file to register."); if (model.getBrowserType() != FILE_SYSTEM_EXPLORER) return false; if (!(file instanceof FileData || file instanceof ImageData)) return false; if (file.getId() > 0) return false; try { TreeImageDisplay d = model.getLastSelectedDisplay(); TreeImageDisplay exp = BrowserFactory.getDataOwner(d); if (exp == null) return false; Object ho = exp.getUserObject(); if (!(ho instanceof ExperimenterData)) return false; long id = ((ExperimenterData) ho).getId(); if (file instanceof ImageData) { ImageData img = (ImageData) file; if (img.getIndex() >= 0) { TreeImageDisplay pd = d.getParentDisplay(); if (pd == null) return false; file = (DataObject) pd.getUserObject(); } } DataObject o = model.getRepositories(id).register(file); if (o == null) return false; } catch (FSAccessException e) { LogMessage msg = new LogMessage(); msg.print("Cannot register the object."); msg.print(e); TreeViewerAgent.getRegistry().getLogger().error(this, msg); return false; } view.repaint(); return true; } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setExperimenters(TreeImageSet, Collection) */ public void setExperimenters(TreeImageSet node, List result) { if (result.size() != 1) return; Object ho = result.get(0); node.setUserObject(ho); GroupData g = (GroupData) ho; Set nodes = TreeViewerTranslator.transformExperimenters( g.getExperimenters()); view.setLeavesViews(nodes, node); model.setState(READY); model.getParentModel().setLeaves(node, g.getExperimenters()); model.getParentModel().setStatus(false, "", true); fireStateChange(); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see Browser#canEdit(Object) */ public boolean canEdit(Object ho) { return model.getParentModel().canEdit(ho); } /** * Implemented as specified by the {@link TreeViewer} interface. * @see Browser#canAnnotate(Object) */ public boolean canAnnotate(Object ho) { return model.getParentModel().canAnnotate(ho); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#expandUser() */ public void expandUser() { if (model.getState() == DISCARDED) return; SecurityContext ctx = model.getSecurityContext( model.getLastSelectedDisplay()); long id = model.getUserID(); ExperimenterVisitor v = new ExperimenterVisitor(this, id, ctx.getGroupID()); accept(v, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); List<TreeImageDisplay> values = v.getNodes(); if (values.size() != 1) return; TreeImageDisplay n = values.get(0); if (!n.isExpanded()) view.expandNode(n); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#expandUser() */ public void resetPassword(String value) { if (model.getState() == DISCARDED) return; model.getParentModel().resetPassword(value); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#refreshBrowser(Class, long) */ public void refreshBrowser(Class type, long id) { if (ProjectData.class.equals(type) || DatasetData.class.equals(type) || ScreenData.class.equals(type)) { ExperimenterVisitor visitor = new ExperimenterVisitor(this, -1, -1); accept(visitor, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); List<TreeImageDisplay> nodes = visitor.getNodes(); if (nodes.size() == 0) return; Iterator<TreeImageDisplay> i = nodes.iterator(); List<Long> ids = new ArrayList<Long>(nodes.size()); while (i.hasNext()) { ids.add(i.next().getUserObjectId()); } refreshExperimenterData(ids); } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#addComponent(JComponent) */ public void addComponent(JComponent component) { if (getBrowserType() != SCREENS_EXPLORER) return; view.addComponent(component); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#loadDirectory(TreeImageDisplay) */ public void loadDirectory(TreeImageDisplay display) { if (display == null) return; Object ho = display.getUserObject(); if (!(ho instanceof FileData)) return; FileData f = (FileData) ho; if (f.isDirectory()) { if (!display.isChildrenLoaded()) view.loadFile(display); //model.getParentModel().browse(display, true); } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getNodesForUser(long, TreeImageDisplay) */ public List<TreeImageDisplay> getNodesForUser(long userID, TreeImageDisplay node) { if (model.getState() == DISCARDED) return null; if (userID < 0) return null; SecurityContext context = model.getSecurityContext(node); ExperimenterVisitor v = new ExperimenterVisitor(this, userID, context.getGroupID()); accept(v, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); List<TreeImageDisplay> nodes = v.getNodes(); if (nodes .size() != 1) return new ArrayList<TreeImageDisplay>(); TreeImageDisplay n = nodes.get(0); return n.getChildrenDisplay(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#rejectTransfer() */ public void rejectTransfer() { JTree tree = view.getTreeDisplay(); if (tree instanceof DnDTree) { ((DnDTree) tree).reset(); } } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setUserGroup(GroupData) */ public void setUserGroup(GroupData group) { if (group == null) throw new IllegalArgumentException("Group cannot be null."); view.setUserGroup(Arrays.asList(group)); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#removeGroup(GroupData) */ public void removeGroup(GroupData group) { if (group == null) return; view.removeGroup(group); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#canLink(Object) */ public boolean canLink(Object ho) { return model.getParentModel().canLink(ho); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getDataToCopy() */ public List<DataObject> getDataToCopy() { return model.getParentModel().getDataToCopy(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#paste(TreeImageDisplay[]) */ public void paste(TreeImageDisplay[] parents) { model.getParentModel().paste(parents); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#setNodesToCopy(TreeImageDisplay[], int) */ public void setNodesToCopy(TreeImageDisplay[] nodes, int index) { model.getParentModel().setNodesToCopy(nodes, index); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getLoggedExperimenterNode() */ public TreeImageDisplay getDefaultGroupNode() { SecurityContext ctx = model.getSecurityContext(null); long id = ctx.getGroupID(); ExperimenterVisitor visitor = new ExperimenterVisitor(this, id); accept(visitor, TreeImageDisplayVisitor.TREEIMAGE_SET_ONLY); List<TreeImageDisplay> nodes = visitor.getNodes(); if (nodes.size() != 1) return null; return nodes.get(0); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#getDisplayMode() */ public int getDisplayMode() { return model.getDisplayMode(); } /** * Implemented as specified by the {@link Browser} interface. * @see Browser#changeDisplayMode() */ public void changeDisplayMode() { if (model.getBrowserType() == Browser.ADMIN_EXPLORER) return; model.setSelectedDisplay(null, true); //view.changeDisplayMode(); ExperimenterVisitor v = new ExperimenterVisitor(this, -1); accept(v, ExperimenterVisitor.TREEIMAGE_SET_ONLY); List<TreeImageDisplay> nodes = v.getNodes(); //Check the group already display //Was in group mode view.clear(); List<GroupData> groups = new ArrayList<GroupData>(nodes.size()); Iterator<TreeImageDisplay> i = nodes.iterator(); while (i.hasNext()) { groups.add((GroupData) i.next().getUserObject()); } if (model.isSingleGroup()) view.reActivate(); else view.setUserGroup(groups); } }