/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2015 University of Dundee. All rights reserved.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.agents.treeviewer.view;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JTabbedPane;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuKeyEvent;
import javax.swing.event.MenuKeyListener;
import javax.swing.event.MenuListener;
import org.apache.commons.collections.CollectionUtils;
import org.jdesktop.swingx.JXTaskPane;
import org.jdesktop.swingx.JXTaskPaneContainer;
import org.openmicroscopy.shoola.agents.dataBrowser.view.DataBrowser;
import org.openmicroscopy.shoola.agents.metadata.view.MetadataViewer;
import org.openmicroscopy.shoola.agents.treeviewer.IconManager;
import org.openmicroscopy.shoola.agents.treeviewer.TreeViewerAgent;
import org.openmicroscopy.shoola.agents.treeviewer.actions.ActivatedUserAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.ActivationAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.AddAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.BrowseContainerAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.BrowserSelectionAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.ClearAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.CreateAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.CreateObjectWithChildren;
import org.openmicroscopy.shoola.agents.treeviewer.actions.CreateTopContainerAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.DisplayModeAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.DownloadAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.ExitApplicationAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.FinderAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.FullScreenViewerAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.GroupSelectionAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.ImportAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.InspectorVisibilityAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.LogOffAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.ManageObjectAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.ManageRndSettingsAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.ManagerAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.MetadataVisibilityAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.MoveToAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.NewObjectAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.PasswordResetAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.PersonalManagementAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.RefreshExperimenterData;
import org.openmicroscopy.shoola.agents.treeviewer.actions.RefreshTreeAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.RemoveExperimenterNode;
import org.openmicroscopy.shoola.agents.treeviewer.actions.RemoveGroupNode;
import org.openmicroscopy.shoola.agents.treeviewer.actions.RollOverAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.RunScriptAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.SaveResultsAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.SearchAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.SendFeedbackAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.SwitchGroup;
import org.openmicroscopy.shoola.agents.treeviewer.actions.SwitchUserAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.TaggingAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.TreeViewerAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.UploadScriptAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.ViewImageAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.ViewInPlugin;
import org.openmicroscopy.shoola.agents.treeviewer.actions.ViewOtherAction;
import org.openmicroscopy.shoola.agents.treeviewer.browser.Browser;
import org.openmicroscopy.shoola.agents.treeviewer.cmd.CopyCmd;
import org.openmicroscopy.shoola.agents.treeviewer.cmd.CutCmd;
import org.openmicroscopy.shoola.agents.treeviewer.cmd.DeleteCmd;
import org.openmicroscopy.shoola.agents.treeviewer.cmd.PasteCmd;
import org.openmicroscopy.shoola.agents.treeviewer.cmd.PasteRndSettingsCmd;
import org.openmicroscopy.shoola.agents.treeviewer.cmd.ViewCmd;
import org.openmicroscopy.shoola.agents.treeviewer.util.AddExistingObjectsDialog;
import org.openmicroscopy.shoola.agents.treeviewer.util.AdminDialog;
import org.openmicroscopy.shoola.agents.treeviewer.util.GenericDialog;
import org.openmicroscopy.shoola.agents.treeviewer.util.OpenWithDialog;
import org.openmicroscopy.shoola.agents.util.DataObjectRegistration;
import org.openmicroscopy.shoola.agents.util.SelectionWizard;
import org.openmicroscopy.shoola.agents.util.ViewerSorter;
import org.openmicroscopy.shoola.agents.util.browser.TreeFileSet;
import org.openmicroscopy.shoola.agents.util.browser.TreeImageDisplay;
import org.openmicroscopy.shoola.agents.util.finder.Finder;
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.model.AdminObject;
import org.openmicroscopy.shoola.env.data.model.ApplicationData;
import org.openmicroscopy.shoola.env.data.model.DownloadActivityParam;
import org.openmicroscopy.shoola.env.data.model.DownloadAndLaunchActivityParam;
import org.openmicroscopy.shoola.env.data.model.FigureActivityParam;
import org.openmicroscopy.shoola.env.data.model.FigureParam;
import org.openmicroscopy.shoola.env.data.model.ScriptActivityParam;
import org.openmicroscopy.shoola.env.data.model.ScriptObject;
import omero.gateway.SecurityContext;
import org.openmicroscopy.shoola.env.ui.UserNotifier;
import org.openmicroscopy.shoola.util.ui.JXTaskPaneContainerSingle;
import org.openmicroscopy.shoola.util.ui.LoadingWindow;
import org.openmicroscopy.shoola.util.ui.MacOSMenuHandler;
import org.openmicroscopy.shoola.util.ui.UIUtilities;
import org.openmicroscopy.shoola.util.ui.filechooser.FileChooser;
import omero.gateway.model.DataObject;
import omero.gateway.model.DatasetData;
import omero.gateway.model.ExperimenterData;
import omero.gateway.model.GroupData;
import omero.gateway.model.ImageData;
import omero.gateway.model.PlateAcquisitionData;
import omero.gateway.model.PlateData;
import omero.gateway.model.TagAnnotationData;
import omero.gateway.model.WellData;
import omero.gateway.model.WellSampleData;
/**
* The {@link TreeViewer}'s controller.
*
* @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 TreeViewerControl
implements ChangeListener, PropertyChangeListener, WindowFocusListener
{
/** Identifies the <code>Browse action</code> in the Edit menu. */
static final Integer BROWSE = Integer.valueOf(1);
/** Identifies the <code>Create object action</code> in the File menu. */
static final Integer CREATE_OBJECT = Integer.valueOf(3);
/** Identifies the <code>Copy object action</code> in the Edit menu. */
static final Integer COPY_OBJECT = Integer.valueOf(4);
/** Identifies the <code>Paste object action</code> in the Edit menu. */
static final Integer PASTE_OBJECT = Integer.valueOf(5);
/** Identifies the <code>Delete object action</code> in the Edit menu. */
static final Integer DELETE_OBJECT = Integer.valueOf(6);
/**
* Identifies the <code>Hierarchy Explorer</code> action in the View menu.
*/
static final Integer HIERARCHY_EXPLORER = Integer.valueOf(7);
/** Identifies the <code>Images Explorer</code> action in the View menu. */
static final Integer IMAGES_EXPLORER = Integer.valueOf(9);
/** Identifies the <code>Find action </code>in the Edit menu. */
static final Integer FIND = Integer.valueOf(10);
/** Identifies the <code>Exit action</code> in the File menu. */
static final Integer EXIT = Integer.valueOf(14);
/** Identifies the <code>Clear action</code> in the Edit menu. */
static final Integer CLEAR = Integer.valueOf(15);
/** Identifies the <code>Add action</code> in the Edit menu. */
static final Integer ADD_OBJECT = Integer.valueOf(16);
/** Identifies the <code>Create project</code> in the File menu. */
static final Integer CREATE_TOP_PROJECT = Integer.valueOf(17);
/**
* Identifies the <code>Refresh tree action</code> in the
* File menu.
*/
static final Integer REFRESH_TREE = Integer.valueOf(18);
/**
* Identifies the <code>Manager</code> in the
* File menu.
*/
static final Integer MANAGER = Integer.valueOf(19);
/**
* Identifies the <code>Cut action</code> in the
* Edit menu.
*/
static final Integer CUT_OBJECT = Integer.valueOf(21);
/**
* Identifies the <code>Activation action</code> in the
* Edit menu.
*/
static final Integer ACTIVATION = Integer.valueOf(22);
/**
* Identifies the <code>Switch user action</code> in the
* File menu.
*/
static final Integer SWITCH_USER = Integer.valueOf(23);
/** Identifies the <code>Roll over action</code>. */
static final Integer ROLL_OVER = Integer.valueOf(26);
/** Identifies the <code>Remove from display action</code>. */
static final Integer REMOVE_FROM_DISPLAY = Integer.valueOf(27);
/** Identifies the <code>Refresh experimenter action</code>. */
static final Integer REFRESH_EXPERIMENTER = Integer.valueOf(29);
/** Identifies the <code>Paste rendering settings action</code>. */
static final Integer PASTE_RND_SETTINGS = Integer.valueOf(31);
/** Identifies the <code>Copy rendering settings action</code>. */
static final Integer COPY_RND_SETTINGS = Integer.valueOf(32);
/** Identifies the <code>Reset rendering settings action</code>. */
static final Integer RESET_RND_SETTINGS = Integer.valueOf(33);
/** Identifies the <code>Search action</code>. */
static final Integer SEARCH = Integer.valueOf(34);
/** Identifies the <code>Tags action</code>. */
static final Integer TAGS_EXPLORER = Integer.valueOf(35);
/** Identifies the <code>Set rendering settings</code>. */
static final Integer SET_RND_SETTINGS = Integer.valueOf(36);
/** Identifies the <code>Create dataset</code> in the File menu. */
static final Integer CREATE_TOP_DATASET = Integer.valueOf(37);
/** Identifies the <code>Create tag</code> in the File menu. */
static final Integer CREATE_TOP_TAG = Integer.valueOf(38);
/** Identifies the <code>Screens Explorer</code> action in the View menu. */
static final Integer SCREENS_EXPLORER = Integer.valueOf(39);
/** Identifies the <code>Create project</code> in the File menu. */
static final Integer CREATE_TOP_SCREEN = Integer.valueOf(40);
/** Identifies the <code>View action</code> in the Edit menu. */
static final Integer VIEW = Integer.valueOf(41);
/** Identifies the <code>Create project</code> in the File menu. */
static final Integer NEW_OBJECT = Integer.valueOf(42);
/** Identifies the <code>Files Explorer</code> action in the View menu. */
static final Integer FILES_EXPLORER = Integer.valueOf(44);
/** Identifies the <code>Create tag set</code> in the File menu. */
static final Integer CREATE_TOP_TAG_SET = Integer.valueOf(45);
/** Identifies the <code>Create tag sets or tags</code> in the menu. */
static final Integer NEW_TAG_OBJECT = Integer.valueOf(46);
/** Identifies the <code>Add or remove tag</code> in the menu. */
static final Integer TAGGING = Integer.valueOf(47);
/** Identifies the <code>Show/hide inspector</code> in the menu. */
static final Integer INSPECTOR = Integer.valueOf(50);
/**
* Identifies the <code>File System Explorer</code> action in the View menu.
*/
static final Integer FILE_SYSTEM_EXPLORER = Integer.valueOf(52);
/** Identifies the <code>Import</code> in the menu. */
static final Integer IMPORT = Integer.valueOf(53);
/** Identifies the <code>Download</code> in the menu. */
static final Integer DOWNLOAD = Integer.valueOf(54);
/** Identifies the <code>Browse w/o thumbnails</code> in the menu. */
static final Integer BROWSE_NO_THUMBNAILS = Integer.valueOf(55);
/** Identifies the <code>View with Other</code> in the menu. */
static final Integer VIEWER_WITH_OTHER = Integer.valueOf(56);
/** Identifies the <code>Personal</code> in the menu. */
static final Integer PERSONAL = Integer.valueOf(57);
/** Identifies the <code>Full Screen</code> in the menu. */
static final Integer FULLSCREEN = Integer.valueOf(58);
/** Identifies the <code>Metadata display</code> in the menu. */
static final Integer METADATA = Integer.valueOf(59);
/** Identifies the <code>Personal</code> in the menu. */
static final Integer UPLOAD_SCRIPT = Integer.valueOf(60);
/** Identifies the <code>Create group</code> in the File menu. */
static final Integer CREATE_TOP_GROUP = Integer.valueOf(61);
/** Identifies the <code>Create experimenter</code> in the File menu. */
static final Integer CREATE_TOP_EXPERIMENTER = Integer.valueOf(62);
/** Identifies the <code>Reset Password</code> action. */
static final Integer RESET_PASSWORD = Integer.valueOf(63);
/** Identifies the <code>Reset the rendering settings action</code>. */
static final Integer SET_OWNER_RND_SETTINGS = Integer.valueOf(64);
/** Identifies the <code>Send comment action</code>. */
static final Integer SEND_COMMENT = Integer.valueOf(65);
/** Identifies the <code>Activated action</code>. */
static final Integer USER_ACTIVATED = Integer.valueOf(66);
/** Identifies the <code>Import</code> action. */
static final Integer IMPORT_NO_SELECTION = Integer.valueOf(67);
/** Identifies the <code>Log off</code> action. */
static final Integer LOG_OFF = Integer.valueOf(68);
/** Identifies the <code>Create dataset</code> in the File menu. */
static final Integer CREATE_DATASET_FROM_SELECTION = Integer.valueOf(69);
/** Identifies the <code>Available scripts/code>. */
static final Integer AVAILABLE_SCRIPTS = Integer.valueOf(70);
/** Identifies the <code>Remove the group/code>. */
static final Integer REMOVE_GROUP = Integer.valueOf(71);
/** Identifies the <code>View In ImageJ</code> in the menu. */
static final Integer VIEW_IN_IJ = Integer.valueOf(72);
/**
* Identifies the <code>Switch group action</code> in the
* File menu.
*/
static final Integer SWITCH_GROUP = Integer.valueOf(73);
/** Identifies the <code>View In KNIME</code> in the menu. */
static final Integer VIEW_IN_KNIME = Integer.valueOf(74);
/** Identifies the <code>Display Experimenter</code> in the menu. */
static final Integer DISPLAY_EXPERIMENTER = Integer.valueOf(75);
/** Identifies the <code>Display Group</code> in the menu. */
static final Integer DISPLAY_GROUP = Integer.valueOf(76);
/** Identifies the <code>Save OMERO</code> in the menu. */
static final Integer SAVE_TO_OMERO = Integer.valueOf(77);
/**
* Reference to the {@link TreeViewer} component, which, in this context,
* is regarded as the Model.
*/
private TreeViewer model;
/** Reference to the View. */
private TreeViewerWin view;
/** Maps actions ids onto actual <code>Action</code> object. */
private Map<Integer, TreeViewerAction> actionsMap;
/** The tab pane listener. */
private ChangeListener tabsListener;
/** The loading window. */
private LoadingWindow loadingWindow;
/** One per group.*/
private List<MoveToAction> moveActions;
/**
* Downloads the possible script.
*
* @param param The parameter holding the script.
*/
private void downloadScript(ScriptActivityParam param)
{
FileChooser chooser = new FileChooser(view, FileChooser.SAVE,
"Download", "Select where to download the file.", null,
true);
IconManager icons = IconManager.getInstance();
chooser.setTitleIcon(icons.getIcon(IconManager.DOWNLOAD_48));
chooser.setSelectedFileFull(param.getScript().getName());
chooser.setApproveButtonText("Download");
final long id = param.getScript().getScriptID();
chooser.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
String name = evt.getPropertyName();
if (FileChooser.APPROVE_SELECTION_PROPERTY.equals(name)) {
File[] files = (File[]) evt.getNewValue();
File folder = files[0];
IconManager icons = IconManager.getInstance();
DownloadActivityParam activity;
activity = new DownloadActivityParam(id,
DownloadActivityParam.ORIGINAL_FILE,
folder, icons.getIcon(IconManager.DOWNLOAD_22));
UserNotifier un =
TreeViewerAgent.getRegistry().getUserNotifier();
SecurityContext ctx = new SecurityContext(
TreeViewerAgent.getUserDetails().getDefaultGroup().getId());
un.notifyActivity(ctx, activity);
}
}
});
chooser.centerDialog();
}
/**
* Handles the selection of a <code>JXTaskPane</code>.
*
* @param pane The selected component.
*/
private void handleTaskPaneSelection(JXTaskPane pane)
{
JXTaskPaneContainerSingle container =
(JXTaskPaneContainerSingle) pane.getParent();
if (pane.isCollapsed() && container.hasTaskPaneExpanded()) return;
int state = model.getState();
if (state == TreeViewer.READY || state == TreeViewer.NEW) {
model.clearFoundResults();
if (!container.hasTaskPaneExpanded())
model.setSelectedBrowser(null, true);
else {
if (pane instanceof TaskPaneBrowser) {
TaskPaneBrowser p = (TaskPaneBrowser) pane;
if (p.getBrowser() != null)
model.setSelectedBrowser(p.getBrowser(), true);
else {
model.setSelectedBrowser(null, true);
model.showSearch();
}
} else {
model.setSelectedBrowser(null, true);
}
}
} else pane.setCollapsed(true);
}
/** Helper method to create all the UI actions. */
private void createActions()
{
actionsMap.put(BROWSE, new BrowseContainerAction(model));
actionsMap.put(BROWSE_NO_THUMBNAILS,
new BrowseContainerAction(model, false));
actionsMap.put(CREATE_OBJECT, new CreateAction(model));
actionsMap.put(COPY_OBJECT, new ManageObjectAction(model,
ManageObjectAction.COPY));
actionsMap.put(DELETE_OBJECT, new ManageObjectAction(model,
ManageObjectAction.REMOVE));
actionsMap.put(PASTE_OBJECT, new ManageObjectAction(model,
ManageObjectAction.PASTE));
actionsMap.put(CUT_OBJECT, new ManageObjectAction(model,
ManageObjectAction.CUT));
actionsMap.put(SCREENS_EXPLORER,
new BrowserSelectionAction(model, Browser.SCREENS_EXPLORER));
actionsMap.put(HIERARCHY_EXPLORER,
new BrowserSelectionAction(model, Browser.PROJECTS_EXPLORER));
actionsMap.put(TAGS_EXPLORER,
new BrowserSelectionAction(model, Browser.TAGS_EXPLORER));
actionsMap.put(IMAGES_EXPLORER,
new BrowserSelectionAction(model, Browser.IMAGES_EXPLORER));
actionsMap.put(FILES_EXPLORER,
new BrowserSelectionAction(model, Browser.FILES_EXPLORER));
actionsMap.put(FILE_SYSTEM_EXPLORER, new BrowserSelectionAction(model,
Browser.FILE_SYSTEM_EXPLORER));
actionsMap.put(FIND, new FinderAction(model));
actionsMap.put(CLEAR, new ClearAction(model));
actionsMap.put(EXIT, new ExitApplicationAction(model));
actionsMap.put(ADD_OBJECT, new AddAction(model));
actionsMap.put(CREATE_TOP_PROJECT,
new CreateTopContainerAction(model,
CreateTopContainerAction.PROJECT));
actionsMap.put(CREATE_TOP_DATASET,
new CreateTopContainerAction(model,
CreateTopContainerAction.DATASET));
actionsMap.put(CREATE_TOP_TAG,
new CreateTopContainerAction(model,
CreateTopContainerAction.TAG));
actionsMap.put(REFRESH_TREE, new RefreshTreeAction(model));
actionsMap.put(MANAGER, new ManagerAction(model));
actionsMap.put(ACTIVATION, new ActivationAction(model));
actionsMap.put(SWITCH_USER, new SwitchUserAction(model));
actionsMap.put(ROLL_OVER, new RollOverAction(model));
actionsMap.put(REMOVE_FROM_DISPLAY, new RemoveExperimenterNode(model));
actionsMap.put(REFRESH_EXPERIMENTER,
new RefreshExperimenterData(model));
actionsMap.put(PASTE_RND_SETTINGS, new ManageRndSettingsAction(model,
ManageRndSettingsAction.PASTE));
actionsMap.put(COPY_RND_SETTINGS, new ManageRndSettingsAction(model,
ManageRndSettingsAction.COPY));
actionsMap.put(RESET_RND_SETTINGS, new ManageRndSettingsAction(model,
ManageRndSettingsAction.RESET));
actionsMap.put(SET_OWNER_RND_SETTINGS,
new ManageRndSettingsAction(model,
ManageRndSettingsAction.SET_OWNER_SETTING));
actionsMap.put(SEARCH, new SearchAction(model));
actionsMap.put(SET_RND_SETTINGS, new ManageRndSettingsAction(model,
ManageRndSettingsAction.SET_MIN_MAX));
actionsMap.put(CREATE_TOP_SCREEN,
new CreateTopContainerAction(model,
CreateTopContainerAction.SCREEN));
actionsMap.put(VIEW, new ViewImageAction(model));
actionsMap.put(NEW_OBJECT, new NewObjectAction(model,
NewObjectAction.NEW_CONTAINERS));
actionsMap.put(CREATE_TOP_TAG_SET,
new CreateTopContainerAction(model,
CreateTopContainerAction.TAG_SET));
actionsMap.put(NEW_TAG_OBJECT, new NewObjectAction(model,
NewObjectAction.NEW_TAGS));
actionsMap.put(TAGGING, new TaggingAction(model));
actionsMap.put(INSPECTOR, new InspectorVisibilityAction(model));
actionsMap.put(IMPORT, new ImportAction(model, false));
actionsMap.put(DOWNLOAD, new DownloadAction(model));
actionsMap.put(VIEWER_WITH_OTHER, new ViewOtherAction(model, null));
actionsMap.put(PERSONAL, new PersonalManagementAction(model));
actionsMap.put(FULLSCREEN, new FullScreenViewerAction(model));
actionsMap.put(METADATA, new MetadataVisibilityAction(model));
actionsMap.put(UPLOAD_SCRIPT, new UploadScriptAction(model));
//actionsMap.put(ADMIN, new AdminAction(model));
actionsMap.put(CREATE_TOP_GROUP,
new CreateTopContainerAction(model,
CreateTopContainerAction.GROUP));
actionsMap.put(CREATE_TOP_EXPERIMENTER,
new CreateTopContainerAction(model,
CreateTopContainerAction.EXPERIMENTER));
actionsMap.put(RESET_PASSWORD, new PasswordResetAction(model));
actionsMap.put(USER_ACTIVATED, new ActivatedUserAction(model));
actionsMap.put(SEND_COMMENT, new SendFeedbackAction(model));
actionsMap.put(IMPORT_NO_SELECTION, new ImportAction(model, true));
actionsMap.put(LOG_OFF, new LogOffAction(model));
actionsMap.put(CREATE_DATASET_FROM_SELECTION,
new CreateObjectWithChildren(model,
CreateObjectWithChildren.DATASET));
actionsMap.put(VIEW_IN_IJ, new ViewInPlugin(model, LookupNames.IMAGE_J));
actionsMap.put(VIEW_IN_KNIME, new ViewInPlugin(model,
LookupNames.KNIME));
actionsMap.put(AVAILABLE_SCRIPTS, new RunScriptAction(model));
actionsMap.put(REMOVE_GROUP, new RemoveGroupNode(model));
actionsMap.put(SWITCH_GROUP, new SwitchGroup(model));
actionsMap.put(DISPLAY_GROUP, new DisplayModeAction(model,
LookupNames.GROUP_DISPLAY));
actionsMap.put(DISPLAY_EXPERIMENTER, new DisplayModeAction(model,
LookupNames.EXPERIMENTER_DISPLAY));
actionsMap.put(SAVE_TO_OMERO, new SaveResultsAction(model,
LookupNames.IMAGE_J));
}
/**
* Creates the windowsMenuItems.
*
* @param menu The menu to handle.
*/
private void createWindowsMenuItems(JMenu menu)
{
Set viewers = TreeViewerFactory.getViewers();
Iterator i = viewers.iterator();
menu.removeAll();
while (i.hasNext())
menu.add(new JMenuItem(
new ActivationAction((TreeViewer) i.next())));
}
/**
* Attaches a window listener to the view to discard the model when
* the user closes the window.
*/
private void attachListeners()
{
if (UIUtilities.isMacOS()) {
try {
MacOSMenuHandler handler = new MacOSMenuHandler(view);
handler.initialize();
view.addPropertyChangeListener(this);
} catch (Throwable e) {}
}
Map browsers = model.getBrowsers();
Iterator i = browsers.values().iterator();
Browser browser;
while (i.hasNext()) {
browser = (Browser) i.next();
browser.addPropertyChangeListener(this);
browser.addChangeListener(this);
}
view.addWindowFocusListener(this);
model.addPropertyChangeListener(this);
view.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
view.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { model.closeWindow(); }
});
//
JMenu menu = TreeViewerFactory.getWindowMenu();
menu.addMenuListener(new MenuListener() {
public void menuSelected(MenuEvent e)
{
Object source = e.getSource();
if (source instanceof JMenu)
createWindowsMenuItems((JMenu) source);
}
/**
* Required by I/F but not actually needed in our case,
* no-operation implementation.
* @see MenuListener#menuCanceled(MenuEvent)
*/
public void menuCanceled(MenuEvent e) {}
/**
* Required by I/F but not actually needed in our case,
* no-operation implementation.
* @see MenuListener#menuDeselected(MenuEvent)
*/
public void menuDeselected(MenuEvent e) {}
});
//Listen to keyboard selection
menu.addMenuKeyListener(new MenuKeyListener() {
public void menuKeyReleased(MenuKeyEvent e)
{
Object source = e.getSource();
if (source instanceof JMenu)
createWindowsMenuItems((JMenu) source);
}
/**
* Required by I/F but not actually needed in our case,
* no-operation implementation.
* @see MenuKeyListener#menuKeyPressed(MenuKeyEvent)
*/
public void menuKeyPressed(MenuKeyEvent e) {}
/**
* Required by I/F but not actually needed in our case,
* no-operation implementation.
* @see MenuKeyListener#menuKeyTyped(MenuKeyEvent)
*/
public void menuKeyTyped(MenuKeyEvent e) {}
});
}
/**
* Creates a new instance.
* The {@link #initialize(TreeViewerWin) initialize} method
* should be called straight
* after to link this Controller to the other MVC components.
*
* @param model Reference to the {@link TreeViewer} component, which, in
* this context, is regarded as the Model.
* Mustn't be <code>null</code>.
*/
TreeViewerControl(TreeViewer model)
{
if (model == null) throw new NullPointerException("No model.");
this.model = model;
actionsMap = new HashMap<Integer, TreeViewerAction>();
}
/**
* Links this Controller to its View.
*
* @param view Reference to the View. Mustn't be <code>null</code>.
*/
void initialize(TreeViewerWin view)
{
if (view == null) throw new NullPointerException("No view.");
this.view = view;
createActions();
model.addChangeListener(this);
attachListeners();
TreeViewerFactory.attachWindowMenuToTaskBar();
loadingWindow = new LoadingWindow(view);
loadingWindow.setAlwaysOnTop(false);
loadingWindow.setStatus("Saving changes");
}
/**
* Returns the type of the selected browser or <code>-1</code> if
* no browser selected.
*
* @return See above.
*/
int getSelectedBrowserType()
{
Browser browser = model.getSelectedBrowser();
if (browser == null) return -1;
return browser.getBrowserType();
}
/**
* Returns the collections of actions identifying the viewers used
* for the type of images.
*
* @return See above.
*/
List<ViewOtherAction> getApplicationActions()
{
List<ViewOtherAction> l = new ArrayList<ViewOtherAction>();
Browser browser = model.getSelectedBrowser();
if (browser == null) return l;
TreeImageDisplay d = browser.getLastSelectedDisplay();
if (d == null) return l;
Object object = d.getUserObject();
if (!(object instanceof DataObject)) return l;
String type = view.getObjectMimeType();
if (type == null) return l;
List<ApplicationData>
applications = TreeViewerFactory.getApplications(type);
if (applications == null) return l;
Iterator<ApplicationData> i = applications.iterator();
ApplicationData data;
while (i.hasNext()) {
data = i.next();
l.add(new ViewOtherAction(model, data));
}
return l;
}
/**
* Returns the actions used to move data between groups.
*
* @return See abo.ve
*/
List<MoveToAction> getMoveAction()
{
//First check that we can move the data.
Browser browser = model.getSelectedBrowser();
List selection = null;
Iterator j;
List<Long> owners = new ArrayList<Long>();
if (browser != null) {
selection = browser.getSelectedDataObjects();
if (selection == null) return null;
int count = 0;
j = selection.iterator();
Object o;
DataObject data;
while (j.hasNext()) {
o = j.next();
if (o instanceof DataObject) {
if (!(o instanceof GroupData ||
o instanceof ExperimenterData ||
o instanceof PlateAcquisitionData ||
o instanceof TagAnnotationData)) {
if (model.canChgrp(o)) {
data = (DataObject) o;
if (!owners.contains(data.getOwner().getId()))
owners.add(data.getOwner().getId());
count++;
}
}
}
}
if (count != selection.size()) return null;
if (owners.size() > 1) return null;
}
long userID = TreeViewerAgent.getUserDetails().getId();
long ownerID = -1;
if (owners.size() > 0) ownerID = owners.get(0);
Collection l = null;
if (ownerID == userID) {
l = TreeViewerAgent.getAvailableUserGroups();
} else {
if (TreeViewerAgent.isAdministrator()) {
//load the group the user is member of
SecurityContext ctx = TreeViewerAgent.getAdminContext();
try {
l = TreeViewerAgent.getRegistry().
getAdminService().loadGroupsForExperimenter(ctx,
ownerID);
} catch (Exception e) {
TreeViewerAgent.getRegistry().getLogger().error(this,
"cannot retrieve user's groups");
}
}
}
if (l == null) return null;
if (moveActions == null)
moveActions = new ArrayList<MoveToAction>(l.size());
moveActions.clear();
List<Long> ids = new ArrayList<Long>();
if (browser != null && selection != null) {
j = selection.iterator();
DataObject data;
while (j.hasNext()) {
data = (DataObject) j.next();
if (!ids.contains(data.getGroupId()))
ids.add(data.getGroupId());
}
}
ViewerSorter sorter = new ViewerSorter();
List values = sorter.sort(l);
if (moveActions == null)
moveActions = new ArrayList<MoveToAction>(l.size());
moveActions.clear();
GroupData group;
Iterator i = values.iterator();
while (i.hasNext()) {
group = (GroupData) i.next();
if (!ids.contains(group.getGroupId()))
moveActions.add(new MoveToAction(model, group));
}
return moveActions;
}
/**
* Returns the {@link ChangeListener} attached to the tab pane,
* or creates one if none initialized.
*
* @return See above.
*/
ChangeListener getTabbedListener()
{
if (tabsListener == null) {
tabsListener = new ChangeListener() {
// This method is called whenever the selected tab changes
public void stateChanged(ChangeEvent ce) {
JTabbedPane pane = (JTabbedPane) ce.getSource();
model.clearFoundResults();
Component c = pane.getSelectedComponent();
if (c == null) {
model.setSelectedBrowser(null, true);
return;
}
Map browsers = model.getBrowsers();
Iterator i = browsers.values().iterator();
boolean selected = false;
Browser browser;
while (i.hasNext()) {
browser = (Browser) i.next();
if (c.equals(browser.getUI())) {
model.setSelectedBrowser(browser, true);
selected = true;
break;
}
}
if (!selected) model.setSelectedBrowser(null, true);
}
};
}
return tabsListener;
}
/**
* Adds listeners to UI components.
*
* @param component The component to attach a listener to.
*/
void attachUIListeners(JComponent component)
{
//Register listener
if (component instanceof JTabbedPane) {
((JTabbedPane) component).addChangeListener(getTabbedListener());
} else if (component instanceof JXTaskPaneContainer) {
component.addPropertyChangeListener(
JXTaskPaneContainerSingle.SELECTED_TASKPANE_PROPERTY, this);
}
}
/**
* Returns the action corresponding to the specified id.
*
* @param id One of the flags defined by this class.
* @return The specified action.
*/
TreeViewerAction getAction(Integer id) { return actionsMap.get(id); }
/**
* Returns the list of group the user is a member of.
*
* @param add Passes <code>true</code> to add the group to the display,
* <code>false</code> to switch.
* @return See above.
*/
List<GroupSelectionAction> getUserGroupAction(boolean add)
{
List<GroupSelectionAction> l = new ArrayList<GroupSelectionAction>();
Collection m = TreeViewerAgent.getAvailableUserGroups();
if (m == null || m.size() == 0) return l;
ViewerSorter sorter = new ViewerSorter();
Iterator i = sorter.sort(m).iterator();
while (i.hasNext()) {
l.add(new GroupSelectionAction(model, (GroupData) i.next(), add));
}
return l;
}
/**
* Handles the selection of the script.
*
* @param script The script to handle.
* @param index Indicates to <code>view, download or run</code> the script.
*/
private void handleScript(ScriptObject script, int index)
{
if (script == null) return;
SecurityContext ctx = new SecurityContext(
TreeViewerAgent.getUserDetails().getDefaultGroup().getId());
UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier();
if (index == ScriptActivityParam.VIEW) {
Environment env = (Environment)
TreeViewerAgent.getRegistry().lookup(LookupNames.ENV);
String path = env.getOmeroFilesHome();
path += File.separator+script.getName();
File f = new File(path);
DownloadAndLaunchActivityParam activity;
activity = new DownloadAndLaunchActivityParam(
script.getScriptID(),
DownloadAndLaunchActivityParam.ORIGINAL_FILE, f, null);
un.notifyActivity(ctx, activity);
} else if (index == ScriptActivityParam.DOWNLOAD) {
downloadScript(new ScriptActivityParam(script,
ScriptActivityParam.DOWNLOAD));
} else {
long groupID = script.getGroupID();
if (groupID < 0) {
GroupData g = model.getSelectedGroup();
if (g == null)
g = TreeViewerAgent.getUserDetails().getDefaultGroup();
groupID = g.getId();
}
ctx = new SecurityContext(groupID);
un.notifyActivity(ctx, new ScriptActivityParam(script,
ScriptActivityParam.RUN));
}
}
/**
* Returns the last node selected.
*
* @return See above.
*/
TreeImageDisplay getLastSelectedDisplay()
{
Browser browser = model.getSelectedBrowser();
if (browser == null) return null;
return browser.getLastSelectedDisplay();
}
/** Activates or not the user. */
void activateUser()
{
TreeImageDisplay node = getLastSelectedDisplay();
if (node != null && node.getUserObject() instanceof ExperimenterData)
model.activateUser((ExperimenterData) node.getUserObject());
}
/** Forwards call to the {@link TreeViewer}. */
void cancel() { model.cancel(); }
/**
* Reloads the available scripts.
*
* @param location The location of the mouse click.
*/
void reloadAvailableScripts(Point location, Component source)
{
model.showMenu(TreeViewer.AVAILABLE_SCRIPTS_MENU, source, location);
}
/**
* Handles the selection of a script.
*
* @param object The object to handle.
*/
void handleScriptSelection(ScriptObject object)
{
if (object == null) return;
if (!object.isParametersLoaded())
model.loadScript(object.getScriptID());
else model.setScript(object);
}
/**
* Brings up the menu on top of the specified component at
* the specified location.
*
* @param menuID The id of the menu.
* @param invoker The component that requested the pop-up menu.
* @param loc The point at which to display the menu, relative to the
* <code>component</code>'s coordinates.
*/
void showMenu(int menuID, Component invoker, Point loc)
{
model.showMenu(menuID, invoker, loc);
}
/**
* Sets the group and the users to add to the display.
*
* @param group The selected group
* @param seletectedUsers The selected users.
* @param removeGroup Flag indicating to remove the group from the display.
*/
void setSelection(GroupData group, List<ExperimenterData> seletectedUsers,
boolean removeGroup)
{
if (removeGroup) {
model.removeGroup(group.getId());
} else {
if (model.getGroups().size() > 1)
model.setUserGroup(Arrays.asList(group));
model.setHierarchyRoot(group.getId(), seletectedUsers);
}
}
/**
* Adds the specified groups to the display. If other groups are already
* added to the display and are not in the list, they will be removed.
*
* @param toAdd The groups to add.
* @param toRemove The groups to remove from the display.
*/
void setSelectedGroups(List<GroupData> toAdd, List<GroupData> toRemove)
{
if (toRemove != null) {
Iterator<GroupData> i = toRemove.iterator();
while (i.hasNext())
model.removeGroup(i.next().getId());
}
model.setUserGroup(toAdd);
}
/**
* Returns <code>true</code> if the selected objects are orphaned images,
* <code>false</code> otherwise.
*
* @return See above.
*/
boolean isOrphanedImagesSelected()
{
Browser b = model.getSelectedBrowser();
if (b == null) return false;
TreeImageDisplay[] nodes = b.getSelectedDisplays();
if (nodes == null || nodes.length == 0) return false;
TreeImageDisplay n, np;
for (int i = 0; i < nodes.length; i++) {
n = nodes[i];
np = n.getParentDisplay();
if (np instanceof TreeFileSet &&
((TreeFileSet) np).getType() == TreeFileSet.ORPHANED_IMAGES)
return true;
}
return false;
}
/**
* Sets the display mode.
*
* @param mode The mode to set.
*/
void setDisplayMode(int mode) { model.setDisplayMode(mode); }
/**
* Reacts to property changed.
* @see PropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent pce)
{
String name = pce.getPropertyName();
if (name == null) return;
if (TreeViewer.CANCEL_LOADING_PROPERTY.equals(name)) {
Browser browser = model.getSelectedBrowser();
if (browser != null) browser.cancel();
} else if (Browser.POPUP_MENU_PROPERTY.equals(name)) {
Integer c = (Integer) pce.getNewValue();
Browser browser = model.getSelectedBrowser();
if (browser != null)
view.showPopup(c.intValue(), browser.getClickComponent(),
browser.getClickPoint());
} else if (Browser.CLOSE_PROPERTY.equals(name)) {
Browser browser = (Browser) pce.getNewValue();
if (browser != null) view.removeBrowser(browser);
} else if (TreeViewer.FINDER_VISIBLE_PROPERTY.equals(name)) {
Boolean b = (Boolean) pce.getNewValue();
if (!b.booleanValue()) {
model.clearFoundResults();
model.onComponentStateChange(true);
}
} else if (TreeViewer.SELECTED_BROWSER_PROPERTY.equals(name)) {
Browser b = model.getSelectedBrowser();
Iterator i = model.getBrowsers().values().iterator();
Browser browser;
while (i.hasNext()) {
browser = (Browser) i.next();
browser.setSelected(browser.equals(b));
}
} else if (Browser.SELECTED_TREE_NODE_DISPLAY_PROPERTY.equals(name)) {
model.onSelectedDisplay();
view.updateMenuItems();
} else if (TreeViewer.HIERARCHY_ROOT_PROPERTY.equals(name)) {
/*
Map browsers = model.getBrowsers();
Iterator i = browsers.values().iterator();
Browser browser;
while (i.hasNext()) {
browser = (Browser) i.next();
//browser.cleanFilteredNodes();
//browser.switchUser();
}
*/
} else if (AddExistingObjectsDialog.EXISTING_ADD_PROPERTY.equals(
name)) {
model.addExistingObjects((Set) pce.getNewValue());
} else if (UserManagerDialog.USER_SWITCH_PROPERTY.equals(name)) {
Map m = (Map) pce.getNewValue();
Iterator i = m.entrySet().iterator();
Long groupID;
List<ExperimenterData> users;
Entry entry;
while (i.hasNext()) {
entry = (Entry) i.next();
groupID = (Long) entry.getKey();
users = (List<ExperimenterData>) entry.getValue();
model.setHierarchyRoot(groupID, users);
}
} else if (UserManagerDialog.NO_USER_SWITCH_PROPERTY.equals(name)) {
UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier();
un.notifyInfo("User Selection", "Please select a user first.");
} else if (EditorDialog.CREATE_PROPERTY.equals(name)) {
DataObject data = (DataObject) pce.getNewValue();
model.createObject(data, true);
} else if (EditorDialog.CREATE_NO_PARENT_PROPERTY.equals(name)) {
DataObject data = (DataObject) pce.getNewValue();
model.createObject(data, false);
} else if (MetadataViewer.ON_DATA_SAVE_PROPERTY.equals(name)) {
Object object = pce.getNewValue();
if (object != null) {
if (object instanceof DataObject)
model.onDataObjectSave((DataObject) object,
TreeViewer.UPDATE_OBJECT);
else
model.onDataObjectSave((List) object,
TreeViewer.UPDATE_OBJECT);
}
} else if (DataBrowser.SELECTED_NODE_DISPLAY_PROPERTY.equals(name)) {
model.setSelectedNode(pce.getNewValue());
} else if (DataBrowser.UNSELECTED_NODE_DISPLAY_PROPERTY.equals(name)) {
model.setUnselectedNode(pce.getNewValue());
} else if (DataBrowser.DATA_OBJECT_CREATED_PROPERTY.equals(name)) {
Map map = (Map) pce.getNewValue();
if (map != null && map.size() == 1) {
DataObject data = null;
Set set = map.entrySet();
Entry entry;
Iterator i = set.iterator();
Object o;
DataObject parent = null;
while (i.hasNext()) {
entry = (Entry) i.next();
data = (DataObject) entry.getKey();
o = entry.getValue();
if (o != null)
parent = (DataObject) o;
break;
}
if (parent == null)
model.onOrphanDataObjectCreated(data);
else model.onDataObjectSave(data, parent,
TreeViewer.CREATE_OBJECT);
}
} else if (DataBrowser.ADDED_TO_DATA_OBJECT_PROPERTY.equals(name)) {
//Browser browser = model.getSelectedBrowser();
//if (browser != null) browser.refreshLoggedExperimenterData();
model.refreshTree();
} else if (DataBrowser.COPY_RND_SETTINGS_PROPERTY.equals(name)) {
Object data = pce.getNewValue();
if (data != null) model.copyRndSettings((ImageData) data);
else model.copyRndSettings(null);
} else if (DataBrowser.PASTE_RND_SETTINGS_PROPERTY.equals(name)) {
Object data = pce.getNewValue();
PasteRndSettingsCmd cmd;
if (data instanceof Collection)
cmd = new PasteRndSettingsCmd(model, PasteRndSettingsCmd.PASTE,
(Collection) data);
else cmd = new PasteRndSettingsCmd(model,
PasteRndSettingsCmd.PASTE);
cmd.execute();
} else if (DataBrowser.RESET_RND_SETTINGS_PROPERTY.equals(name)) {
Object data = pce.getNewValue();
PasteRndSettingsCmd cmd;
if (data instanceof Collection)
cmd = new PasteRndSettingsCmd(model, PasteRndSettingsCmd.RESET,
(Collection) data);
else cmd = new PasteRndSettingsCmd(model,
PasteRndSettingsCmd.RESET);
cmd.execute();
} else if (DataBrowser.SET__ORIGINAL_RND_SETTINGS_PROPERTY.equals(
name)) {
Object data = pce.getNewValue();
PasteRndSettingsCmd cmd;
if (data instanceof Collection)
cmd = new PasteRndSettingsCmd(model,
PasteRndSettingsCmd.SET_MIN_MAX,
(Collection) data);
else cmd = new PasteRndSettingsCmd(model,
PasteRndSettingsCmd.SET_MIN_MAX);
cmd.execute();
} else if (DataBrowser.SET__ORIGINAL_RND_SETTINGS_PROPERTY.equals(
name)) {
Object data = pce.getNewValue();
PasteRndSettingsCmd cmd;
if (data instanceof Collection)
cmd = new PasteRndSettingsCmd(model,
PasteRndSettingsCmd.SET_OWNER,
(Collection) data);
else cmd = new PasteRndSettingsCmd(model,
PasteRndSettingsCmd.SET_OWNER);
cmd.execute();
} else if (DataBrowser.CUT_ITEMS_PROPERTY.equals(name)) {
CutCmd cmd = new CutCmd(model);
cmd.execute();
} else if (DataBrowser.COPY_ITEMS_PROPERTY.equals(name)) {
CopyCmd cmd = new CopyCmd(model);
cmd.execute();
} else if (DataBrowser.PASTE_ITEMS_PROPERTY.equals(name)) {
PasteCmd cmd = new PasteCmd(model);
cmd.execute();
} else if (DataBrowser.REMOVE_ITEMS_PROPERTY.equals(name)) {
DeleteCmd cmd = new DeleteCmd(model.getSelectedBrowser());
cmd.execute();
} else if (DataBrowser.VIEW_IMAGE_NODE_PROPERTY.equals(name)) {
//view.get
Browser browser = model.getSelectedBrowser();
if (browser != null) {
TreeImageDisplay node = browser.getLastSelectedDisplay();
model.browse(node, (DataObject) pce.getNewValue(), false);
}
} else if (DataBrowser.INTERNAL_VIEW_NODE_PROPERTY.equals(name)) {
ViewCmd cmd = new ViewCmd(model, true);
cmd.execute();
} else if (Finder.RESULTS_FOUND_PROPERTY.equals(name)) {
model.setSearchResult(pce.getNewValue());
} else if (GenericDialog.SAVE_GENERIC_PROPERTY.equals(name)) {
Object parent = pce.getNewValue();
if (parent instanceof MetadataViewer) {
MetadataViewer mv = (MetadataViewer) parent;
mv.saveData();
}
} else if (Browser.DATA_REFRESHED_PROPERTY.equals(name)) {
model.onSelectedDisplay();
} else if (MetadataViewer.ADMIN_UPDATED_PROPERTY.equals(name)) {
Object data = pce.getNewValue();
Map browsers = model.getBrowsers();
Set set = browsers.entrySet();
Entry entry;
Iterator i = set.iterator();
Browser browser;
while (i.hasNext()) {
entry = (Entry) i.next();
browser = (Browser) entry.getValue();
browser.refreshAdmin(data);
}
view.createTitle();
} else if (DataBrowser.TAG_WIZARD_PROPERTY.equals(name)) {
model.showTagWizard();
} else if (DataBrowser.FIELD_SELECTED_PROPERTY.equals(name)) {
model.setSelectedField(pce.getNewValue());
} else if (MetadataViewer.RENDER_THUMBNAIL_PROPERTY.equals(name)) {
long imageID = ((Long) pce.getNewValue()).longValue();
List<Long> ids = new ArrayList<Long>(1);
ids.add(imageID);
view.reloadThumbnails(ids);
} else if (MetadataViewer.APPLY_SETTINGS_PROPERTY.equals(name)) {
Object object = pce.getNewValue();
if (object instanceof ImageData) {
ImageData img = (ImageData) object;
model.copyRndSettings((ImageData) object);
List<Long> ids = new ArrayList<Long>(1);
ids.add(img.getId());
view.reloadThumbnails(ids);
//improve code to speed it up
List l = model.getSelectedBrowser().getSelectedDataObjects();
Collection toUpdate;
if (l.size() > 1) toUpdate = l;
else toUpdate = model.getDisplayedImages();
if (toUpdate != null) {
PasteRndSettingsCmd cmd = new PasteRndSettingsCmd(model,
PasteRndSettingsCmd.PASTE, toUpdate);
cmd.execute();
}
} else if (object instanceof Object[]) {
Object[] objects = (Object[]) object;
WellSampleData wsd = (WellSampleData) objects[0];
WellData well = (WellData) objects[1];
ImageData img = wsd.getImage();
model.copyRndSettings(img);
List<Long> ids = new ArrayList<Long>(1);
ids.add(img.getId());
view.reloadThumbnails(ids);
ids = new ArrayList<Long>(1);
ids.add(well.getPlate().getId());
model.pasteRndSettings(ids, PlateData.class);
}
} else if (JXTaskPaneContainerSingle.SELECTED_TASKPANE_PROPERTY.equals(
name)) {
handleTaskPaneSelection((JXTaskPane) pce.getNewValue());
} else if (MetadataViewer.GENERATE_FIGURE_PROPERTY.equals(name)) {
Object object = pce.getNewValue();
if (!(object instanceof FigureParam)) return;
UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier();
IconManager icons = IconManager.getInstance();
Icon icon = icons.getIcon(IconManager.SPLIT_VIEW_FIGURE_22);
FigureActivityParam activity;
List<Long> ids = new ArrayList<Long>();
Iterator i;
DataObject obj;
FigureParam param = (FigureParam) object;
Collection l;
if (param.isSelectedObjects()) {
Browser b = model.getSelectedBrowser();
if (b != null) l = b.getSelectedDataObjects();
else {
l = new ArrayList<DataObject>();
Collection<DataObject> nodes = model.getSelectedObjectsFromBrowser();
if (nodes != null) {
l.addAll(nodes);
}
}
} else {
l = model.getDisplayedImages();
}
if (CollectionUtils.isEmpty(l)) return;
Class klass = null;
Object p = null;
if (param.getIndex() == FigureParam.THUMBNAILS) {
Browser browser = model.getSelectedBrowser();
if (browser != null) {
TreeImageDisplay[] nodes = browser.getSelectedDisplays();
if (nodes != null && nodes.length > 0) {
TreeImageDisplay node = nodes[0];
Object ho = node.getUserObject();
TreeImageDisplay pNode;
if (ho instanceof DatasetData) {
klass = ho.getClass();
p = ho;
} else if (ho instanceof ImageData) {
klass = ho.getClass();
pNode = node.getParentDisplay();
if (pNode != null) {
p = pNode.getUserObject();
if (!(p instanceof DatasetData)) p = null;
}
if (p == null) p = ho;
}
if (p != null) param.setAnchor((DataObject) p);
}
}
}
i = l.iterator();
int n = 0;
List<Long> groupIds = new ArrayList<Long>();
boolean canRun = true;
while (i.hasNext()) {
obj = (DataObject) i.next();
if (groupIds.size() == 0)
groupIds.add(obj.getGroupId());
if (groupIds.contains(obj.getGroupId())) {
ids.add(obj.getId());
if (n == 0) p = obj;
n++;
} else {
canRun = false;
break;
}
}
if (!canRun) {
un.notifyInfo("Script", "You can run the script only\non " +
"objects from the same group");
return;
}
if (ids.size() == 0) return;
// not set
if (param.getIndex() != FigureParam.THUMBNAILS)
param.setAnchor((DataObject) p);
activity = new FigureActivityParam(object, ids, klass,
FigureActivityParam.SPLIT_VIEW_FIGURE);
activity.setIcon(icon);
un.notifyActivity(new SecurityContext(groupIds.get(0)), activity);
} else if (MetadataViewer.HANDLE_SCRIPT_PROPERTY.equals(name)) {
UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier();
ScriptActivityParam p = (ScriptActivityParam) pce.getNewValue();
int index = p.getIndex();
ScriptObject script = p.getScript();
if (index == ScriptActivityParam.VIEW) {
Environment env = (Environment)
TreeViewerAgent.getRegistry().lookup(LookupNames.ENV);
String path = env.getOmeroFilesHome();
path += File.separator+script.getName();
File f = new File(path);
DownloadAndLaunchActivityParam activity = new DownloadAndLaunchActivityParam(
p.getScript().getScriptID(),
DownloadAndLaunchActivityParam.ORIGINAL_FILE, f, null);
un.notifyActivity(model.getSecurityContext(), activity);
} else if (index == ScriptActivityParam.DOWNLOAD) {
downloadScript(p);
}
} else if (OpenWithDialog.OPEN_DOCUMENT_PROPERTY.equals(name)) {
ApplicationData data = (ApplicationData) pce.getNewValue();
//Register
if (data == null) return;
String format = view.getObjectMimeType();
//if (format == null) return;
if (format != null)
TreeViewerFactory.register(data, format);
model.openWith(data);
} else if (DataBrowser.OPEN_EXTERNAL_APPLICATION_PROPERTY.equals(name)) {
model.openWith((ApplicationData) pce.getNewValue());
} else if (AdminDialog.CREATE_ADMIN_PROPERTY.equals(name)) {
AdminObject object = (AdminObject) pce.getNewValue();
model.administrate(object);
} else if (MetadataViewer.REGISTER_PROPERTY.equals(name)) {
model.register((DataObjectRegistration) pce.getNewValue());
} else if (MetadataViewer.RESET_PASSWORD_PROPERTY.equals(name)) {
model.resetPassword((String) pce.getNewValue());
} else if (MetadataViewer.UPLOAD_SCRIPT_PROPERTY.equals(name)) {
TreeViewerAction action = getAction(UPLOAD_SCRIPT);
action.actionPerformed(new ActionEvent(this, 1, ""));
} else if (SelectionWizard.SELECTED_ITEMS_PROPERTY.equals(name)) {
Map m = (Map) pce.getNewValue();
if (m == null || m.size() != 1) return;
Entry entry;
Iterator i = m.entrySet().iterator();
Class klass;
TreeImageDisplay node;
Collection<ExperimenterData> list;
Object uo;
AdminObject object;
while (i.hasNext()) {
entry = (Entry) i.next();
klass = (Class) entry.getKey();
if (ExperimenterData.class.equals(klass)) {
list = (Collection<ExperimenterData>) entry.getValue();
node = model.getSelectedBrowser().getLastSelectedDisplay();
if (node != null) {
uo = node.getUserObject();
if (uo instanceof GroupData) {
object = new AdminObject((GroupData) uo, list);
model.administrate(object);
}
}
}
}
} else if (DataBrowser.SET__OWNER_RND_SETTINGS_PROPERTY.equals(name)) {
Object data = pce.getNewValue();
PasteRndSettingsCmd cmd;
if (data instanceof Collection)
cmd = new PasteRndSettingsCmd(model,
PasteRndSettingsCmd.SET_OWNER, (Collection) data);
else cmd = new PasteRndSettingsCmd(model,
PasteRndSettingsCmd.SET_OWNER);
cmd.execute();
} else if (ScriptingDialog.RUN_SELECTED_SCRIPT_PROPERTY.equals(name)) {
handleScript((ScriptObject) pce.getNewValue(),
ScriptActivityParam.RUN);
} else if (ScriptingDialog.DOWNLOAD_SELECTED_SCRIPT_PROPERTY.equals(
name)) {
Object value = pce.getNewValue();
if (value instanceof ScriptObject)
handleScript((ScriptObject) value,
ScriptActivityParam.DOWNLOAD);
else if (value instanceof String) {
ScriptObject script = view.getScriptFromName((String) value);
if (script != null)
handleScript(script, ScriptActivityParam.DOWNLOAD);
}
} else if (ScriptingDialog.VIEW_SELECTED_SCRIPT_PROPERTY.equals(name)) {
Object value = pce.getNewValue();
if (value instanceof ScriptObject)
handleScript((ScriptObject) value, ScriptActivityParam.VIEW);
else if (value instanceof String) {
ScriptObject script = view.getScriptFromName((String) value);
if (script != null)
handleScript(script, ScriptActivityParam.VIEW);
}
} else if (TreeViewer.SCRIPTS_LOADING_PROPERTY.equals(name)) {
view.setScriptsLoadingStatus(true);
} else if (TreeViewer.SCRIPTS_LOADED_PROPERTY.equals(name)) {
view.setScriptsLoadingStatus(false);
} else if (
DataBrowser.SELECTED_DATA_BROWSER_NODES_DISPLAY_PROPERTY.equals(
name)) {
model.setSelectedNodes(pce.getNewValue());
} else if (TreeViewer.GROUP_CHANGED_PROPERTY.equals(name)) {
view.setPermissions();
} else if (MacOSMenuHandler.QUIT_APPLICATION_PROPERTY.equals(name)) {
Action a = getAction(EXIT);
ActionEvent event =
new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "");
a.actionPerformed(event);
} else if (GroupManagerDialog.GROUP_SWITCH_PROPERTY.equals(name)) {
List<GroupData> groups = (List<GroupData>) pce.getNewValue();
if (groups.size() == 0) {
UserNotifier un =
TreeViewerAgent.getRegistry().getUserNotifier();
un.notifyInfo(GroupManagerDialog.TITLE, "At least one group " +
"must be selected.");
return;
}
model.setUserGroup(groups);
} else if (DataBrowser.ACTIVATE_USER_PROPERTY.equals(name)) {
ExperimenterData exp = (ExperimenterData) pce.getNewValue();
if (exp != null) model.activateUser(exp);
} else if (DataBrowser.RESET_PASSWORD_PROPERTY.equals(name)) {
getAction(RESET_PASSWORD).actionPerformed(
new ActionEvent(pce.getNewValue(), 0, "Reset Password"));
}
}
/**
* Reacts to state changes in the {@link TreeViewer} and in the
* {@link Browser}.
* @see ChangeListener#stateChanged(ChangeEvent)
*/
public void stateChanged(ChangeEvent ce)
{
Browser browser = model.getSelectedBrowser();
if (browser != null) {
switch (browser.getState()) {
case Browser.BROWSING_DATA:
loadingWindow.setStatus(TreeViewer.LOADING_TITLE);
UIUtilities.centerAndShow(loadingWindow);
return;
case Browser.READY:
loadingWindow.setVisible(false);
break;
}
}
switch (model.getState()) {
case TreeViewer.DISCARDED:
view.closeViewer();
break;
case TreeViewer.LOADING_DATA:
view.setStatus(TreeViewer.LOADING_TITLE, false);
view.setStatusIcon(true);
view.onStateChanged(false);
break;
case TreeViewer.SAVE:
view.setStatus(TreeViewer.SAVING_TITLE, false);
view.setStatusIcon(true);
view.onStateChanged(false);
break;
case TreeViewer.READY:
case TreeViewer.LOADING_SELECTION:
loadingWindow.setVisible(false);
view.setStatus(null, true);
view.setStatusIcon(false);
view.onStateChanged(true);
view.requestFocus();
break;
case TreeViewer.SETTINGS_RND:
UIUtilities.centerAndShow(loadingWindow);
}
}
/**
* Refreshes the renderer.
* @see WindowFocusListener#windowGainedFocus(WindowEvent)
*/
public void windowGainedFocus(WindowEvent e)
{
view.refreshRenderer();
}
/**
* Required by the I/F but no-operation implementation in our case.
* @see WindowFocusListener#windowLostFocus(WindowEvent)
*/
public void windowLostFocus(WindowEvent e) {}
}