/* *------------------------------------------------------------------------------ * Copyright (C) 2006 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.cmd; import java.sql.Timestamp; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.openmicroscopy.shoola.agents.treeviewer.browser.Browser; import org.openmicroscopy.shoola.agents.util.browser.TreeImageDisplay; import org.openmicroscopy.shoola.agents.util.browser.TreeImageDisplayVisitor; import org.openmicroscopy.shoola.util.ui.UIUtilities; import omero.gateway.model.ImageData; /** * Command to sort items in tree. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @version 2.2 * @since OME2.2 */ public class SortCmd implements ActionCmd { /** Reference to the model. */ private Browser model; /** The sorting type. One of the constants defined by this class. */ private int sortType; /** The list of sorted nodes. */ private List sortedNodes; /** The node whose children needed to be ordered. */ private TreeImageDisplay node; /** * Checks if the specified type is one of the constants defined by this * class. * * @param type The type to control. */ private void checkSortType(int type) { switch (type) { case Browser.SORT_NODES_BY_DATE: case Browser.SORT_NODES_BY_NAME: return; default: throw new IllegalArgumentException("Sort type not supported"); } } /** * Sorts the specified collection in the specified order. * * @param nodes The collection to sort. * @param ascending The order. * @return The sorted collection. */ private List sort(List nodes, final boolean ascending) { Comparator c; switch (sortType) { case Browser.SORT_NODES_BY_DATE: c = new Comparator() { public int compare(Object o1, Object o2) { ImageData i1 = (ImageData) (((TreeImageDisplay) o1).getUserObject()); ImageData i2 = (ImageData) (((TreeImageDisplay) o2).getUserObject()); Timestamp t1, t2; try { t1 = i1.getInserted(); } catch (Exception e) { t1 = null; } try { t2 = i2.getInserted(); } catch (Exception e) { t2 = null; } if (t1 == null) t1 = UIUtilities.getDefaultTimestamp(); if (t2 == null) t2 = UIUtilities.getDefaultTimestamp(); int r = t1.compareTo(t2); int v = 0; if (r < 0) v = -1; else if (r > 0) v = 1; if (ascending) return v; return -v; } }; break; case Browser.SORT_NODES_BY_NAME: default: c = new Comparator() { public int compare(Object o1, Object o2) { String s1 = o1.toString().toLowerCase(); String s2 = o2.toString().toLowerCase(); int result = s1.compareTo(s2); int v = 0; if (result < 0) v = -1; else if (result > 0) v = 1; if (ascending) return v; return -v; } }; } Collections.sort(nodes, c); return nodes; } /** * Creates a new instance. * * @param model Reference to the model. Mustn't be <code>null</code>. * @param sortType One of the constants defined by this class. * @param node The node to sort. If <code>null</code>, * we visit the tree. */ public SortCmd(Browser model, int sortType, TreeImageDisplay node) { if (model == null) throw new IllegalArgumentException("No model."); this.model = model; checkSortType(sortType); this.sortType = sortType; this.node = node; } /** * Returns the list of sorted nodes or <code>null</code> if the command * has been executed yet. * * @return See above. */ public List getSortedNodes() { return sortedNodes; } /** Implemented as specified by {@link ActionCmd}. */ public void execute() { SortVisitor visitor = new SortVisitor(model); if (node == null) model.accept(visitor, TreeImageDisplayVisitor.TREEIMAGE_NODE_ONLY); else node.accept(visitor, TreeImageDisplayVisitor.TREEIMAGE_NODE_ONLY); sortedNodes = sort(visitor.getNodes(), true); } }