/* *------------------------------------------------------------------------------ * 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.metadata.view; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Point; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JFrame; import org.apache.commons.collections.CollectionUtils; import org.openmicroscopy.shoola.agents.events.iviewer.RndSettingsSaved; import org.openmicroscopy.shoola.agents.metadata.IconManager; import org.openmicroscopy.shoola.agents.metadata.MetadataViewerAgent; import org.openmicroscopy.shoola.agents.metadata.RenderingControlLoader; import org.openmicroscopy.shoola.agents.metadata.browser.Browser; import org.openmicroscopy.shoola.agents.metadata.browser.TreeBrowserDisplay; import org.openmicroscopy.shoola.agents.metadata.browser.TreeBrowserSet; import org.openmicroscopy.shoola.agents.metadata.editor.Editor; import org.openmicroscopy.shoola.agents.metadata.rnd.Renderer; import org.openmicroscopy.shoola.agents.metadata.util.ChannelSelectionDialog; import org.openmicroscopy.shoola.agents.metadata.util.DataToSave; import org.openmicroscopy.shoola.agents.treeviewer.TreeViewerAgent; import org.openmicroscopy.shoola.agents.util.EditorUtil; import org.openmicroscopy.shoola.agents.util.DataObjectRegistration; import org.openmicroscopy.shoola.agents.util.ui.MovieExportDialog; import org.openmicroscopy.shoola.agents.util.ui.ScriptingDialog; import org.openmicroscopy.shoola.env.config.Registry; import org.openmicroscopy.shoola.env.data.model.AdminObject; import org.openmicroscopy.shoola.env.data.model.AnalysisParam; import org.openmicroscopy.shoola.env.data.model.DeletableObject; import org.openmicroscopy.shoola.env.data.model.DeleteActivityParam; import org.openmicroscopy.shoola.env.data.model.MovieActivityParam; import org.openmicroscopy.shoola.env.data.model.MovieExportParam; 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.data.util.StructuredDataResults; import org.openmicroscopy.shoola.env.event.EventBus; import omero.log.LogMessage; import org.openmicroscopy.shoola.env.rnd.RndProxyDef; import org.openmicroscopy.shoola.env.ui.UserNotifier; import org.openmicroscopy.shoola.util.ui.UIUtilities; import org.openmicroscopy.shoola.util.ui.component.AbstractComponent; import omero.gateway.model.AnnotationData; import omero.gateway.model.ChannelData; 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.MapAnnotationData; import omero.gateway.model.PixelsData; import omero.gateway.model.PlateAcquisitionData; import omero.gateway.model.PlateData; import omero.gateway.model.ProjectData; import omero.gateway.model.ScreenData; import omero.gateway.model.TagAnnotationData; import omero.gateway.model.WellData; import omero.gateway.model.WellSampleData; /** * Implements the {@link MetadataViewer} interface to provide the functionality * required of the hierarchy 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> * @author Donald MacDonald      * <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a> * @version 3.0 * @since OME3.0 */ class MetadataViewerComponent extends AbstractComponent implements MetadataViewer { /** The Model sub-component. */ private MetadataViewerModel model; /** The Control sub-component. */ private MetadataViewerControl controller; /** The View sub-component. */ private MetadataViewerUI view; /** * Creates the movie. * * @param parameters The parameters used to create the movie. */ private void createMovie(MovieExportParam parameters) { if (parameters == null) return; Object refObject = model.getRefObject(); ImageData img = null; if (refObject instanceof ImageData) img = (ImageData) refObject; else if (refObject instanceof WellSampleData) { img = ((WellSampleData) refObject).getImage(); } if (img == null) return; UserNotifier un = MetadataViewerAgent.getRegistry().getUserNotifier(); MovieActivityParam activity = new MovieActivityParam(parameters, img); IconManager icons = IconManager.getInstance(); activity.setIcon(icons.getIcon(IconManager.MOVIE_22)); un.notifyActivity(model.getSecurityContext(), activity); } /** * Deletes the annotations. * * @param toDelete The annotations to delete. */ private void deleteAnnotations(List<AnnotationData> toDelete) { if (toDelete == null || toDelete.size() == 0) return; // don't popup the activity dialog when a MapAnnotation is deleted boolean silent = containsMapAnnotationsOnly(toDelete); //Should only be annotation so content is false; List<DeletableObject> l = new ArrayList<DeletableObject>(); Iterator<AnnotationData> j = toDelete.iterator(); while (j.hasNext()) l.add(new DeletableObject(j.next())); IconManager icons = IconManager.getInstance(); DeleteActivityParam p = new DeleteActivityParam( icons.getIcon(IconManager.APPLY_22), l); p.setFailureIcon(icons.getIcon(IconManager.DELETE_22)); p.setUIRegister(!silent); UserNotifier un = TreeViewerAgent.getRegistry().getUserNotifier(); un.notifyActivity(model.getSecurityContext(), p); } /** * Checks if a list contains only MapAnnotations * * @param list * The list to check * @return <code>true</code> if there are only MapAnnotations in the list; * <code>false</code> otherwise or if list is <code>null</code> */ private boolean containsMapAnnotationsOnly(List<AnnotationData> list) { if (list == null) return false; boolean mapAnnosOnly = true; for (AnnotationData d : list) { if (!(d instanceof MapAnnotationData)) { mapAnnosOnly = false; break; } } return mapAnnosOnly; } /** * 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. Mustn't be <code>null</code>. */ MetadataViewerComponent(MetadataViewerModel model) { if (model == null) throw new NullPointerException("No model."); this.model = model; controller = new MetadataViewerControl(); view = new MetadataViewerUI(); } /** Links up the MVC triad. */ void initialize() { controller.initialize(this, view); view.initialize(controller, model); if (!(model.getRefObject() instanceof String)) setSelectionMode(true); } /** Saves before close. */ void saveBeforeClose() { firePropertyChange(SAVE_DATA_PROPERTY, Boolean.valueOf(true), Boolean.valueOf(false)); } /** * Sets the display mode. * * @param displayMode The value to set. */ void setDisplayMode(int displayMode) { } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#activate(Map) */ public void activate(Map channelData) { switch (model.getState()) { case NEW: model.getEditor().setChannelsData(channelData, false); setRootObject(model.getRefObject(), model.getUserID(), model.getSecurityContext()); break; case DISCARDED: throw new IllegalStateException( "This method can't be invoked in the DISCARDED state."); } } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#applyRenderingSettings(RndProxyDef) */ public void applyRenderingSettings(RndProxyDef rndDef) { model.applyRenderingSettings(rndDef); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#discard() */ public void discard() { model.discard(); fireStateChange(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getState() */ public int getState() { return model.getState(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#cancel(int) */ public void cancel(int loaderID) { if (model.getState() == DISCARDED) return; model.cancel(loaderID); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#setMetadata(Map<DataObject, StructuredDataResults>) */ public void setMetadata(Map<DataObject, StructuredDataResults> results, int loaderID) { if (results == null || results.size() == 0) return; //Need to check the size of the results map. Browser browser = model.getBrowser(); DataObject node; StructuredDataResults data; Entry<DataObject, StructuredDataResults> e; Iterator<Entry<DataObject, StructuredDataResults>> i = results.entrySet().iterator(); if (results.size() == 1) { //handle the single selection while (i.hasNext()) { e = i.next(); node = e.getKey(); if (!model.isSameObject(node)) { model.setStructuredDataResults(null, loaderID); fireStateChange(); return; } data = e.getValue(); Object object = data.getRelatedObject(); if (object == model.getParentRefObject() || (object instanceof PlateData && node instanceof WellSampleData)) { model.setParentDataResults(data, node, loaderID); model.fireStructuredDataLoading(node); } else { model.setStructuredDataResults(results, loaderID); browser.setParents(null, data.getParents()); model.getEditor().setStructuredDataResults(); } fireStateChange(); } } else { if (model.isSameSelection(results.keySet())) { model.setStructuredDataResults(results, loaderID); model.getEditor().setStructuredDataResults(); } } } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getSelectionUI() */ public JComponent getSelectionUI() { if (model.getState() == DISCARDED) throw new IllegalStateException("This method cannot be invoked " + "in the DISCARDED state."); return model.getBrowser().getUI(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getEditorUI() */ public JComponent getEditorUI() { if (model.getState() == DISCARDED) throw new IllegalStateException("This method cannot be invoked " + "in the DISCARDED state."); return model.getEditor().getUI(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getEditor() */ public Editor getEditor() { if (model.getState() == DISCARDED) throw new IllegalStateException("This method cannot be invoked " + "in the DISCARDED state."); return model.getEditor(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#isRendererLoaded() */ public boolean isRendererLoaded() { return model.getEditor().getRenderer() != null; } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getUI() */ public JComponent getUI() { if (model.getState() == DISCARDED) throw new IllegalStateException("This method cannot be invoked " + "in the DISCARDED state."); return view.getUI(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getParentUI() */ public JFrame getParentUI() { if (model.getState() == DISCARDED) throw new IllegalStateException("This method cannot be invoked " + "in the DISCARDED state."); return view; } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#setRootObject(Object, long, ctx) */ public void setRootObject(Object root, long userID, SecurityContext ctx) { if (root instanceof WellSampleData) { WellSampleData ws = (WellSampleData) root; if (ws.getId() < 0) root = null; } if (root == null) { root = ""; userID = -1; } //Previewed the image. boolean same = model.isSameObject(root); model.setRootObject(root, ctx); if (model.isSingleMode()) { model.fireStructuredDataLoading(root); fireStateChange(); } view.setRootObject(); //reset the parent. model.setUserID(userID); //check if save object before setting to null. if (!same) setParentRootObject(null, null); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#refresh() */ public void refresh() { if (model.isSingleMode()) { model.fireStructuredDataLoading(model.getRefObject()); } else { model.setRelatedNodes(model.getRelatedNodes()); } fireStateChange(); view.setRootObject(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#setParentRootObject(Object, Object) */ public void setParentRootObject(Object parent, Object grandParent) { model.setParentRootObject(parent, grandParent); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#loadContainers(TreeBrowserDisplay) */ public void loadContainers(TreeBrowserDisplay node) { if (node == null) throw new IllegalArgumentException("No node specified."); model.fireParentLoading((TreeBrowserSet) node); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#setContainers(TreeBrowserDisplay, Object) */ public void setContainers(TreeBrowserDisplay node, Object result) { Browser browser = model.getBrowser(); if (node == null) { StructuredDataResults data = model.getStructuredData(); if (data != null) { data.setParents((Collection) result); browser.setParents(null, (Collection) result); } } else browser.setParents((TreeBrowserSet) node, (Collection) result); model.getEditor().setStatus(false); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getRelatedNodes() */ public List getRelatedNodes() { return model.getRelatedNodes(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#saveData(DataObject, List, List, DataObject, boolean) */ public void saveData(DataToSave object, List<AnnotationData> toDelete, List<Object> metadata, DataObject data, boolean asynch) { if (data == null) return; List<AnnotationData> toAdd = null; List<Object> toRemove = null; if (object != null) { toAdd = object.getToAdd(); toRemove = object.getToRemove(); } Object refObject = model.getRefObject(); List<DataObject> toSave = new ArrayList<DataObject>(); if (refObject instanceof FileData) { FileData fa = (FileData) data; if (fa.getId() > 0) { toSave.add(data); model.fireSaving(object, metadata, toSave, asynch); fireStateChange(); deleteAnnotations(toDelete); } else { DataObjectRegistration r = new DataObjectRegistration(toAdd, toRemove, toDelete, metadata, data); firePropertyChange(REGISTER_PROPERTY, null, r); } return; } Collection<DataObject> nodes = model.getRelatedNodes(); Iterator<DataObject> n; if (!model.isSingleMode()) { if (nodes != null) { n = nodes.iterator(); DataObject o; while (n.hasNext()) { o = (DataObject) n.next(); if (o instanceof WellSampleData) { WellSampleData wsd = (WellSampleData) o; if (wsd.getImage() != null) { toSave.add(wsd.getImage()); } } else toSave.add(o); } } } else toSave.add(data); boolean b = true; if (refObject instanceof ProjectData || refObject instanceof ScreenData || refObject instanceof PlateData || refObject instanceof DatasetData || refObject instanceof WellSampleData || refObject instanceof PlateAcquisitionData || refObject instanceof WellData) { model.fireSaving(object, metadata, toSave, asynch); } else if (refObject instanceof ImageData) { ImageData img = (ImageData) refObject; if (img.getId() < 0) { DataObjectRegistration r = new DataObjectRegistration(toAdd, toRemove, toDelete, metadata, data); firePropertyChange(REGISTER_PROPERTY, null, r); return; } else { model.fireSaving(object, metadata, toSave, asynch); } } else if (refObject instanceof TagAnnotationData) { //Only update properties. if (CollectionUtils.isEmpty(toAdd) && CollectionUtils.isEmpty(toRemove)) { model.fireSaving(object, metadata, toSave, asynch); b = false; } } if (toDelete != null && toDelete.size() > 0) deleteAnnotations(toDelete); if (b) fireStateChange(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#hasDataToSave() */ public boolean hasDataToSave() { Editor editor = model.getEditor(); if (editor == null) return false; return editor.hasDataToSave(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#saveData() */ public void saveData() { firePropertyChange(SAVE_DATA_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#clearDataToSave() */ public void clearDataToSave() { firePropertyChange(CLEAR_SAVE_DATA_PROPERTY, Boolean.FALSE, Boolean.TRUE); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#onDataSave(List) */ public void onDataSave(List<DataObject> data) { if (data == null) return; if (model.getState() == DISCARDED) return; DataObject dataObject = null; if (data.size() == 1) dataObject = data.get(0); if (dataObject != null && model.isSameObject(dataObject)) { setRootObject(model.getRefObject(), model.getUserID(), model.getSecurityContext()); model.setState(READY); firePropertyChange(ON_DATA_SAVE_PROPERTY, null, dataObject); } else { if (model.isSameSelection(data)) model.setRelatedNodes(data); else model.setState(READY); firePropertyChange(ON_DATA_SAVE_PROPERTY, null, data); } view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); fireStateChange(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#setSelectionMode(boolean) */ public void setSelectionMode(boolean single) { model.setSelectionMode(single); model.getEditor().setSelectionMode(single); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#isSingleMode() */ public boolean isSingleMode() { return model.isSingleMode(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#setRelatedNodes(List) */ public void setRelatedNodes(List nodes) { if (CollectionUtils.isEmpty(nodes)) return; List<Long> ids = new ArrayList<Long>(); Iterator i = nodes.iterator(); List<DataObject> results = new ArrayList<DataObject>(); DataObject data; while (i.hasNext()) { Object object = i.next(); if (object instanceof DataObject) { data = (DataObject) object; if (!ids.contains(data.getId())) { results.add(data); ids.add(data.getId()); } } } model.setRelatedNodes(results); firePropertyChange(RELATED_NODES_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#onAdminUpdated(Object) */ public void onAdminUpdated(Object data) { Object o = data; if (data instanceof Map) { Map l = (Map) data; if (l.size() > 0) { UserNotifier un = MetadataViewerAgent.getRegistry().getUserNotifier(); StringBuffer buf = new StringBuffer(); buf.append("Unable to update the following experimenters:\n"); Entry entry; Iterator i = l.entrySet().iterator(); Object node; ExperimenterData exp; Exception ex; while (i.hasNext()) { entry = (Entry) i.next(); node = entry.getKey(); if (node instanceof ExperimenterData) { exp = (ExperimenterData) node; ex = (Exception) entry.getValue(); buf.append(exp.getFirstName()+" "+exp.getLastName()); buf.append("\n->"+ex.getMessage()); buf.append("\n"); } } un.notifyInfo("Update experimenters", buf.toString()); } firePropertyChange(CLEAR_SAVE_DATA_PROPERTY, null, data); setRootObject(null, -1, null); } else setRootObject(o, model.getUserID(), model.getAdminContext()); firePropertyChange(ADMIN_UPDATED_PROPERTY, null, data); /* if (data instanceof ExperimenterData || data instanceof GroupData) { firePropertyChange(ADMIN_UPDATED_PROPERTY, null, data); setRootObject(data, model.getUserID()); } */ } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#loadParents() */ public void loadParents() { StructuredDataResults data = model.getStructuredData(); if (data == null) return; if (data.getParents() != null) return; Object ho = data.getRelatedObject(); if (ho != null && ho instanceof DataObject) { model.loadParents(ho.getClass(), ((DataObject) ho).getId()); setStatus(true); firePropertyChange(LOADING_PARENTS_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); } } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getStructuredData() */ public StructuredDataResults getStructuredData() { //TODO: Check state return model.getStructuredData(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getParentStructuredData() */ public StructuredDataResults getParentStructuredData() { //TODO: Check state return model.getParentStructuredData(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#setStatus(boolean) */ public void setStatus(boolean busy) { model.getEditor().setStatus(busy); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#showTagWizard() */ public void showTagWizard() { if (model.getState() == DISCARDED) return; model.getEditor().loadExistingTags(); //model.getMetadataViewer().showTagWizard(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getObjectPath() */ public String getObjectPath() { return model.getRefObjectPath(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#makeMovie(int, Color) */ public void makeMovie(int scaleBar, Color overlayColor) { Object refObject = model.getRefObject(); if (refObject instanceof WellSampleData) { WellSampleData wsd = (WellSampleData) refObject; refObject = wsd.getImage(); } if (!(refObject instanceof ImageData)) return; PixelsData data = null; ImageData img = (ImageData) refObject; try { data = ((ImageData) refObject).getDefaultPixels(); } catch (Exception e) {} if (data == null) return; int maxT = data.getSizeT(); int maxZ = data.getSizeZ(); int defaultZ = maxZ; int defaultT = maxT; Object value = data.getSizeC(); if (model.getEditor().getChannelData() != null) value = model.getEditor().getChannelData(); String name = EditorUtil.getPartialName(img.getName()); JFrame f = MetadataViewerAgent.getRegistry().getTaskBar().getFrame(); MovieExportDialog dialog = new MovieExportDialog(f, name, maxT, maxZ, defaultZ, defaultT, value); dialog.setBinaryAvailable(MetadataViewerAgent.isBinaryAvailable()); dialog.setScaleBarDefault(scaleBar, overlayColor); dialog.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { String name = evt.getPropertyName(); Object src = evt.getSource(); if (MovieExportDialog.CREATE_MOVIE_PROPERTY.equals(name)) { if (src instanceof MovieExportDialog) { MovieExportDialog d = (MovieExportDialog) src; createMovie(d.getParameters()); } } else if ( ScriptingDialog.VIEW_SELECTED_SCRIPT_PROPERTY.equals(name)) { if (src instanceof MovieExportDialog) { String script = (String) evt.getNewValue(); ScriptObject object = model.getEditor().getScriptFromName(script); if (object == null) return; manageScript(object, MetadataViewer.VIEW); } } } }); dialog.centerDialog(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getRndIndex() */ public int getRndIndex() { if (model.getState() == MetadataViewer.DISCARDED) return -1; return model.getIndex(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#renderPlane() */ public void renderPlane() { Object obj = model.getRefObject(); if (obj instanceof WellSampleData) { WellSampleData wsd = (WellSampleData) obj; obj = wsd.getImage(); } if (!(obj instanceof ImageData)) return; long imageID = ((ImageData) obj).getId(); switch (getRndIndex()) { case RND_GENERAL: model.getEditor().getRenderer().renderPreview(); break; case RND_SPECIFIC: firePropertyChange(RENDER_PLANE_PROPERTY, -1, imageID); break; } } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#applyToAll() */ public void applyToAll() { Object obj = model.getRefObject(); if (obj instanceof ImageData) { firePropertyChange(APPLY_SETTINGS_PROPERTY, null, obj); } else if (obj instanceof WellSampleData) { Object[] objects = new Object[2]; objects[0] = obj; objects[1] = model.getParentRefObject(); firePropertyChange(APPLY_SETTINGS_PROPERTY, null, objects); } } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#onSettingsApplied() */ public void onSettingsApplied() { firePropertyChange(SETTINGS_APPLIED_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#onRndLoaded(boolean) */ public void onRndLoaded(boolean reload) { Renderer rnd = getRenderer(); if (rnd != null) { rnd.addPropertyChangeListener(controller); } firePropertyChange(RND_LOADED_PROPERTY, Boolean.valueOf(!reload), Boolean.valueOf(reload)); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getRenderer() */ public Renderer getRenderer() { if (model.getEditor() == null) return null; return model.getEditor().getRenderer(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#onChannelSelected(int) */ public void onChannelSelected(int index) { if (getRndIndex() != RND_SPECIFIC) return; firePropertyChange(SELECTED_CHANNEL_PROPERTY, -1, index); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getIdealRendererSize() */ public Dimension getIdealRendererSize() { Renderer rnd = getRenderer(); if (rnd == null) return new Dimension(0, 0); return rnd.getUI().getPreferredSize(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#analyse(int) */ public void analyse(int index) { if (index != AnalysisParam.FRAP) return; Object refObject = model.getRefObject(); if (!(refObject instanceof ImageData)) return; List<ChannelData> channels = new ArrayList<ChannelData>(); Map m = model.getEditor().getChannelData(); if (m != null && m.size() == 1) { controller.analyseFRAP(0); return; } if (m != null) { Iterator j = m.keySet().iterator(); while (j.hasNext()) { channels.add((ChannelData) j.next()); } } IconManager icons = IconManager.getInstance(); Icon icon = icons.getIcon(IconManager.ANALYSE_48); switch (index) { case AnalysisParam.FRAP: icon = icons.getIcon(IconManager.ANALYSE_FRAP_48); break; } JFrame f = MetadataViewerAgent.getRegistry().getTaskBar().getFrame(); ChannelSelectionDialog d = new ChannelSelectionDialog(f, icon, channels, index); d.addPropertyChangeListener(controller); UIUtilities.centerAndShow(d); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#onRndSettingsCopied(Collection) */ public void onRndSettingsCopied(Collection<Long> imageIds) { if (CollectionUtils.isEmpty(imageIds)) return; Renderer rnd = getRenderer(); if (rnd == null) return; Object ob = model.getRefObject(); ImageData img = null; if (ob instanceof WellSampleData) { WellSampleData wsd = (WellSampleData) ob; img = wsd.getImage(); } else if (ob instanceof ImageData) img = (ImageData) ob; if (img == null) return; if (!imageIds.contains(img.getId())) return; rnd.refresh(); rnd.renderPreview(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#isNumerousChannel() */ public boolean isNumerousChannel() { return model.isNumerousChannel(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#setSelectedTab(int) */ public void setSelectedTab(int index) { model.getEditor().setSelectedTab(index); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#activityOptions(Component, Point, int) */ public void activityOptions(Component source, Point location, int index) { List<Object> l = new ArrayList<Object>(); l.add(source); l.add(location); l.add(index); firePropertyChange(ACTIVITY_OPTIONS_PROPERTY, null, l); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#createFigure(Object) */ public void createFigure(Object value) { if (value == null) return; if (value instanceof FigureParam) firePropertyChange(GENERATE_FIGURE_PROPERTY, null, value); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#manageScript(ScriptObject, int) */ public void manageScript(ScriptObject value, int index) { if (value == null) return; ScriptActivityParam p = null; switch (index) { case RUN: p = new ScriptActivityParam(value, ScriptActivityParam.RUN); break; case DOWNLOAD: p = new ScriptActivityParam(value, ScriptActivityParam.DOWNLOAD); break; case VIEW: p = new ScriptActivityParam(value, ScriptActivityParam.VIEW); break; } if (p != null) firePropertyChange(HANDLE_SCRIPT_PROPERTY, null, p); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#reloadRenderingControl(Boolean) */ public void reloadRenderingControl(boolean value) { if (value) model.getEditor().loadRenderingControl( RenderingControlLoader.RELOAD); else { firePropertyChange(CLOSE_RENDERER_PROPERTY, null, model.getRefObject()); } } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#resetRenderingControl() */ public void resetRenderingControl() { model.getEditor().loadRenderingControl( RenderingControlLoader.RESET); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#reloadRenderingControl() */ public void reloadRenderingControl() { model.getEditor().loadRenderingControl(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#onChannelColorChanged(int) */ public void onChannelColorChanged(int index) { view.onChannelColorChanged(index); firePropertyChange(CHANNEL_COLOR_CHANGED_PROPERTY, -1, index); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getRefObject() */ public Object getRefObject() { return model.getRefObject(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#updateAdminObject(Object, boolean) */ public void updateAdminObject(Object data, boolean async) { if (data instanceof ExperimenterData) model.fireExperimenterSaving((ExperimenterData) data, async); else if (data instanceof AdminObject) model.fireAdminSaving((AdminObject) data, async); else if (data instanceof GroupData) model.fireChangeGroup((GroupData) data); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getUserID() */ public long getUserID() { return model.getUserID(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#resetPassword(String) */ public void resetPassword(String newPass) { firePropertyChange(RESET_PASSWORD_PROPERTY, null, newPass); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#loadViewedBy() */ public void loadViewedBy() { ImageData ref = model.getImage(); if (ref != null) { model.fireViewedByLoading(); } } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#setViewedBy(Map) */ public void setViewedBy(Map result) { model.setViewedBy(result); view.createViewedByItems(); model.fireThumbnailsLoading(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#setThumbnails(Map, long) */ public void setThumbnails(Map<Long, BufferedImage> thumbnails, long imageID) { Object ref = model.getRefObject(); ImageData image = null; if (ref instanceof ImageData) image = (ImageData) ref; else if (ref instanceof WellSampleData) image = ((WellSampleData) ref).getImage(); if (image == null) return; if (image.getId() == imageID) { view.setThumbnails(thumbnails); } } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#uploadScript() */ public void uploadScript() { firePropertyChange(UPLOAD_SCRIPT_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); } /** Saves the settings. */ public void saveSettings() { //Previewed the image. Renderer rnd = model.getEditor().getRenderer(); if (rnd != null) { model.fireThumbnailsLoading(); } if (rnd != null && getRndIndex() == RND_GENERAL) { //save settings long imageID = -1; long pixelsID = -1; Object obj = model.getRefObject(); if (obj instanceof WellSampleData) { WellSampleData wsd = (WellSampleData) obj; obj = wsd.getImage(); } if (obj instanceof ImageData) { ImageData data = (ImageData) obj; imageID = data.getId(); pixelsID = data.getDefaultPixels().getId(); } //check if I can save first if (model.canAnnotate()) { Registry reg = MetadataViewerAgent.getRegistry(); RndProxyDef def = null; try { def = rnd.saveCurrentSettings(); } catch (Exception e) { try { reg.getImageService().resetRenderingService( model.getSecurityContext(), pixelsID); def = rnd.saveCurrentSettings(); } catch (Exception ex) { String s = "Data Retrieval Failure: "; LogMessage msg = new LogMessage(); msg.print(s); msg.print(e); reg.getLogger().error(this, msg); } } EventBus bus = MetadataViewerAgent.getRegistry().getEventBus(); bus.post(new RndSettingsSaved(pixelsID, def)); } if (imageID >= 0 && model.canAnnotate()) { firePropertyChange(RENDER_THUMBNAIL_PROPERTY, -1, imageID); // reload the viewedby thumbnails after new rendering settings were applied model.fireViewedByLoading(); } } } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#onGroupSwitched(boolean) */ public void onGroupSwitched(boolean success) { if (!success) return; ExperimenterData exp = MetadataViewerAgent.getUserDetails(); setRootObject(null, exp.getId(), model.getSecurityContext()); setParentRootObject(null, null); model.getEditor().onGroupSwitched(success); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#onGroupSwitched(boolean) */ public SecurityContext getSecurityContext() { return model.getSecurityContext(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#isSameObject(Object) */ public boolean isSameObject(Object object) { return model.isSameObject(object); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getAllStructuredData() */ public Map<DataObject, StructuredDataResults> getAllStructuredData() { return model.getAllStructuredData(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getStructuredData() */ public StructuredDataResults getStructuredData(Object refObject) { return model.getStructuredData(refObject); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#onUpdatedChannels(List) */ public void onUpdatedChannels(List<ChannelData> channels) { Renderer rnd = getRenderer(); if (rnd != null) rnd.onUpdatedChannels(channels); model.getEditor().onUpdatedChannels(channels); } /** * Implemented as specified by the {@link Editor} interface. * @see MetadataViewer#getCurrentUser() */ public ExperimenterData getCurrentUser() { return model.getCurrentUser(); } /** * Overridden to return the name of the instance to save. * @see #toString() */ public String toString() { return model.getInstanceToSave(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#hasRndSettingsCopied() */ public boolean hasRndSettingsCopied() { return model.hasRndSettingsCopied(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#applyCopiedRndSettings() */ public void applyCopiedRndSettings() { if(getRenderer()==null) return; model.fireLoadRndSettings(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#getAlternativeRenderingSettings() */ public RndProxyDef getAlternativeRenderingSettings() { return model.getAlternativeRenderingSettings(); } /** * Implemented as specified by the {@link MetadataViewer} interface. * @see MetadataViewer#reloadROICount() */ @Override public void reloadROICount() { model.getEditor().reloadROICount(); } }