/* *------------------------------------------------------------------------------ * 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.editor; import java.awt.Cursor; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; 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 java.util.Set; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JFrame; import org.apache.commons.collections.CollectionUtils; import org.openmicroscopy.shoola.agents.metadata.FileAnnotationCheckResult; 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.rnd.Renderer; import org.openmicroscopy.shoola.agents.metadata.util.AnalysisResultsItem; import org.openmicroscopy.shoola.agents.metadata.util.FigureDialog; import org.openmicroscopy.shoola.agents.metadata.util.FileAttachmentWarningDialog; import org.openmicroscopy.shoola.agents.metadata.view.MetadataViewer; import org.openmicroscopy.shoola.agents.util.SelectionWizard; import org.openmicroscopy.shoola.agents.util.ui.ScriptingDialog; import org.openmicroscopy.shoola.env.config.Registry; import org.openmicroscopy.shoola.env.data.model.AnnotationLinkData; import org.openmicroscopy.shoola.env.data.model.DiskQuota; import org.openmicroscopy.shoola.env.data.model.ExportActivityParam; import org.openmicroscopy.shoola.env.data.model.ScriptObject; import omero.gateway.SecurityContext; import omero.gateway.model.ROIResult; import org.openmicroscopy.shoola.env.data.util.StructuredDataResults; import org.openmicroscopy.shoola.env.data.util.Target; import org.openmicroscopy.shoola.env.rnd.RenderingControl; import org.openmicroscopy.shoola.env.ui.UserNotifier; import org.openmicroscopy.shoola.util.CommonsLangUtils; import org.openmicroscopy.shoola.util.ui.UIUtilities; import org.openmicroscopy.shoola.util.ui.component.AbstractComponent; import omero.gateway.model.AnnotationData; import omero.gateway.model.ChannelAcquisitionData; import omero.gateway.model.ChannelData; import omero.gateway.model.DataObject; import omero.gateway.model.ExperimenterData; import omero.gateway.model.FileAnnotationData; import omero.gateway.model.FilesetData; import omero.gateway.model.ImageAcquisitionData; import omero.gateway.model.ImageData; import omero.gateway.model.InstrumentData; import omero.gateway.model.PixelsData; import omero.gateway.model.PlateData; import omero.gateway.model.TagAnnotationData; import omero.gateway.model.WellSampleData; /** * Implements the {@link Editor} 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 Tunneled MacDonald      * <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a> * @version 3.0 * @since OME3.0 */ class EditorComponent extends AbstractComponent implements Editor { /** The Model sub-component. */ private EditorModel model; /** The Control sub-component. */ private EditorControl controller; /** The View sub-component. */ private EditorUI view; /** The dialog used to display script.*/ private ScriptingDialog dialog; /** * Returns the collection of annotation that cannot be removed * by the user currently logged. * * @param type The type of annotations to handle. * @param common The collection of common annotations. The list will * @return See above. */ private Collection<DataObject> getImmutableAnnotation(Class type, Collection<DataObject> common) { List<DataObject> list = new ArrayList<DataObject>(); Map<DataObject, StructuredDataResults> data = model.getAllStructuredData(); if (data == null || data.size() == 0) return list; Entry<DataObject, StructuredDataResults> e; Iterator<Entry<DataObject, StructuredDataResults>> i = data.entrySet().iterator(); StructuredDataResults result; Collection<AnnotationLinkData> links; Iterator<AnnotationLinkData> j; AnnotationLinkData link; AnnotationData child; if (model.isMultiSelection()) { List<Long> selected = new ArrayList<Long>(); List<Long> ids = new ArrayList<Long>(common.size()); Iterator<DataObject> k = common.iterator(); while (k.hasNext()) { ids.add(k.next().getId()); } while (i.hasNext()) { e = i.next(); result = e.getValue(); links = result.getAnnotationLinks(); if (links != null) { j = links.iterator(); while (j.hasNext()) { link = j.next(); child = (AnnotationData) link.getChild(); //Exclude some file is tag if (child.getClass().equals(type) && !model.isNameSpaceExcluded(child.getNameSpace())) { if (!ids.contains(link.getChild().getId())) { if (!selected.contains(link.getChild().getId())) list.add(link.getChild()); } } } } } } else { while (i.hasNext()) { e = i.next(); result = e.getValue(); links = result.getAnnotationLinks(); if (links != null) { j = links.iterator(); while (j.hasNext()) { link = j.next(); child = (AnnotationData) link.getChild(); if (!model.isNameSpaceExcluded(child.getNameSpace()) && !link.canDelete() && link.getChild().equals(type)) list.add(link.getChild()); } } } } return list; } /** * Shows the selection wizard. * * @param type The type of objects to handle. * @param available The available objects. * @param selected The selected objects. * @param addCreation Pass <code>true</code> to add a component * allowing creation of object of the passed type, * <code>false</code> otherwise. */ private void showSelectionWizard(Class type, Collection available, Collection selected, boolean addCreation) { IconManager icons = IconManager.getInstance(); Registry reg = MetadataViewerAgent.getRegistry(); String title = ""; String text = ""; Icon icon = null; if (TagAnnotationData.class.equals(type)) { title = "Tags Selection"; text = "Select from available tags"; icon = icons.getIcon(IconManager.TAGS_48); } else if (FileAnnotationData.class.equals(type)) { title = "Attachments Selection"; text = "Select from available attachments"; icon = icons.getIcon(IconManager.ATTACHMENT_48); } SelectionWizard wizard = new SelectionWizard( reg.getTaskBar().getFrame(), available, selected, type, addCreation, model.getCurrentUser()); wizard.setImmutableElements(getImmutableAnnotation(type, selected)); if (model.isMultiSelection()) wizard.setAcceptButtonText("Save"); wizard.setTitle(title, text, icon); wizard.addPropertyChangeListener(controller); UIUtilities.centerAndShow(wizard); } /** * 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>. */ EditorComponent(EditorModel model) { if (model == null) throw new NullPointerException("No model."); this.model = model; view = new EditorUI(); controller = new EditorControl(); } /** Links up the MVC triad. */ void initialize() { controller.initialize(this, view); view.initialize(model, controller); model.getObservable().addPropertyChangeListener(controller); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#getUI() */ public JComponent getUI() { return view; } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setStructuredDataResults() */ public void setStructuredDataResults() { view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); view.layoutUI(); view.setStatus(false); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setRootObject(Object) */ public void setRootObject(Object refObject) { if (refObject == null) throw new IllegalArgumentException("Root object not valid."); Object oldObject = model.getRefObject(); model.setRootObject(refObject); view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); view.setRootObject(oldObject); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setParentRootObject(Object, Object) */ public void setParentRootObject(Object parentRefObject, Object grandParent) { model.setParentRootObject(parentRefObject, grandParent); view.setParentRootObject(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setExistingTags(Collection) */ public void setExistingTags(Collection tags) { model.setExistingTags(tags); List<TagAnnotationData> selected = new ArrayList<TagAnnotationData>(); List<Long> ids = new ArrayList<Long>(); TagAnnotationData tag; Collection<TagAnnotationData> setTags = model.getCommonTags(); if (setTags != null) { Iterator<TagAnnotationData> k = setTags.iterator(); while (k.hasNext()) { tag = k.next(); if (model.isAnnotationUsedByUser(tag)) { ids.add(tag.getId()); selected.add(tag); } } } List<TagAnnotationData> available = new ArrayList<TagAnnotationData>(); if (CollectionUtils.isNotEmpty(tags)) { Iterator i = tags.iterator(); TagAnnotationData data; Set<TagAnnotationData> l; Iterator<TagAnnotationData> j; while (i.hasNext()) { data = (TagAnnotationData) i.next(); if (!ids.contains(data.getId())) { available.add(data); } } } if (controller.getFigureDialog() != null) { List<TagAnnotationData> all = new ArrayList<TagAnnotationData>(); all.addAll(available); if (CollectionUtils.isNotEmpty(setTags)) { all.addAll(setTags); } controller.getFigureDialog().setTags(all); return; } showSelectionWizard(TagAnnotationData.class, available, selected, true); setStatus(false); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setChannelsData(Map, boolean) */ public void setChannelsData(Map channels, boolean updateView) { model.setChannelData(channels); if (updateView) view.showChannelData(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#hasDataToSave() */ public boolean hasDataToSave() { return view.hasDataToSave(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setDiskSpace(DiskQuota) */ public void setDiskSpace(DiskQuota quota) { if (quota == null) return; view.setDiskSpace(quota); view.layoutUI(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#passwordChanged(boolean) */ public void passwordChanged(boolean changed) { UserNotifier un = MetadataViewerAgent.getRegistry().getUserNotifier(); if (changed) { un.notifyInfo("Password change", "The password has been " + "successfully modified."); } else { un.notifyInfo("Password change", "The password could not be " + "modified. Please try again."); } view.passwordChanged(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#loadChannelData() */ public void loadChannelData() { if (model.isNumerousChannel()) return; if (model.getRndIndex() == MetadataViewer.RND_GENERAL) { if (model.getChannelData() == null) model.loadChannelData(); } else view.showChannelData(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#getChannelData() */ public Map getChannelData() { return model.getChannelData(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setExistingAttachments(Collection) */ public void setExistingAttachments(Collection attachments) { if (attachments == null) return; model.setExistingAttachments(attachments); Collection setAttachments = model.getCommonAttachments(); List selected = new ArrayList(); List<Long> ids = new ArrayList<Long>(); if (setAttachments != null) { Iterator<FileAnnotationData> k = setAttachments.iterator(); FileAnnotationData file; while (k.hasNext()) { file = k.next(); if (model.isAnnotationUsedByUser(file)) { selected.add(file); ids.add(file.getId()); } } } List available = new ArrayList(); if (attachments != null) { Iterator i = attachments.iterator(); FileAnnotationData data; while (i.hasNext()) { data = (FileAnnotationData) i.next(); if (!ids.contains(data.getId())) available.add(data); } } showSelectionWizard(FileAnnotationData.class, available, selected, true); setStatus(false); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setSelectionMode(boolean) */ public void setSelectionMode(boolean single) { if (!single) view.layoutUI(); view.repaint(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#loadParents() */ public void loadParents() { model.loadParents(); } /** * Implemented as specified by the {@link Browser} interface. * @see Editor#setStatus(boolean) */ public void setStatus(boolean busy) { view.setStatus(busy); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setStatus(boolean) */ public void loadExistingTags() { model.loadExistingTags(); setStatus(true); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setImageAcquisitionData(ImageAcquisitionData) */ public void setImageAcquisitionData(ImageAcquisitionData map) { if (map == null) return; model.setImageAcquisitionData(map); view.setImageAcquisitionData(); view.setStatus(false); } public void removeFileAnnotations(List<FileAnnotationData> annotations) { model.fireFileAnnotationRemoveCheck(annotations); } public void handleFileAnnotationRemoveCheck(final FileAnnotationCheckResult result) { if (!result.getDeleteCandidates().isEmpty()) { JFrame f = MetadataViewerAgent.getRegistry().getTaskBar() .getFrame(); FileAttachmentWarningDialog dlg = new FileAttachmentWarningDialog(f, result); dlg.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent arg0) { if (arg0.getPropertyName().equals(FileAttachmentWarningDialog.DELETE_PROPERTY)) { for (FileAnnotationData fd : result.getDeleteCandidates()) { view.deleteAnnotation(fd); } for (FileAnnotationData fd : result.getAllAnnotations()) { view.unlinkAttachedFile(fd); } } } }); UIUtilities.centerAndShow(dlg); } else { for (FileAnnotationData fd : result.getAllAnnotations()) { view.unlinkAttachedFile(fd); } } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#loadImageAcquisitionData() */ public void loadImageAcquisitionData() { Object refObject = model.getRefObject(); if ((refObject instanceof ImageData) || (refObject instanceof WellSampleData)) { Object data = model.getImageAcquisitionData(); if (data != null) return; model.fireImagAcquisitionDataLoading(); view.setStatus(true); } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#loadChannelAcquisitionData(ChannelData) */ public void loadChannelAcquisitionData(ChannelData channel) { Object refObject = model.getRefObject(); if ((refObject instanceof ImageData) || (refObject instanceof WellSampleData)) { if (channel == null) return; Object data = model.getChannelAcquisitionData(channel.getIndex()); if (data != null) return; model.fireChannelAcquisitionDataLoading(channel); view.setStatus(true); } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#loadInstrumentData() */ public void loadInstrumentData() { Object refObject = model.getRefObject(); if (refObject instanceof WellSampleData) { WellSampleData wsd = (WellSampleData) refObject; refObject = wsd.getImage(); } if (refObject instanceof ImageData) { ImageData img = (ImageData) refObject; long id = img.getInstrumentId(); if (id > 0) { model.fireInstrumentDataLoading(id); view.setStatus(true); } } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setChannelEnumerations(Map) */ public void setChannelEnumerations(Map map) { model.setChannelEnumerations(map); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setImageEnumerations(Map) */ public void setImageEnumerations(Map map) { model.setImageEnumerations(map); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setChannelAcquisitionData(int, ChannelAcquisitionData) */ public void setChannelAcquisitionData(int index, ChannelAcquisitionData data) { model.setChannelAcquisitionData(index, data); view.setChannelAcquisitionData(index); view.setStatus(false); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#loadExistingAttachments() */ public void loadExistingAttachments() { model.loadExistingAttachments(); setStatus(true); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#download(File, boolean) */ public void download(File file, boolean override) { if (file == null) return; model.download(file, override); } /** * Implemented as specified by the {@link Editor} interface. * * @see Editor#downloadOriginal(String, boolean) */ public void downloadOriginal(String path, boolean override) { if (CommonsLangUtils.isEmpty(path)) return; model.downloadOriginal(path, override); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setPlaneInfo(Collection, long, int) */ public void setPlaneInfo(Collection result, long pixelsID, int channel) { Object ref = model.getRefObject(); if (ref instanceof WellSampleData) { WellSampleData ws = (WellSampleData) ref; ref = ws.getImage(); } if (!(ref instanceof ImageData)) return; ImageData img = (ImageData) ref; if (pixelsID != img.getDefaultPixels().getId()) return; FigureDialog d = controller.getFigureDialog(); if (channel >= 0) { model.setPlaneInfo(channel, result); view.setStatus(false); } if (d != null) { d.setPlaneInfo(model.getChannelPlaneInfo( EditorModel.DEFAULT_CHANNEL)); } else { view.setPlaneInfo(channel); } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setRenderingControl(RenderingControl) */ public void setRenderingControl(RenderingControl rndControl) { boolean loaded = model.isRendererLoaded(); setStatus(false); if (rndControl == null) { //exception setSelectedTab(GENERAL_TAB); return; } //is the rendering control for the correct pixels set FigureDialog d = controller.getFigureDialog(); PixelsData data = model.getPixels(); if (data == null) { setSelectedTab(GENERAL_TAB); return; } if (data.getId() != rndControl.getPixelsID()) { setSelectedTab(GENERAL_TAB); return; } model.setRenderingControl(rndControl); if (loaded) view.onSettingsApplied(false); if (d == null) view.setRenderer(); if (model.getRndIndex() == MetadataViewer.RND_SPECIFIC) loadChannelData(); model.getRenderer().addPropertyChangeListener(controller); model.onRndLoaded(false); if (d != null) { d.setRenderer(model.getRenderer()); if (d.getDialogType() == FigureDialog.ROI_MOVIE) model.firePlaneInfoLoading(EditorModel.DEFAULT_CHANNEL, 0); } model.getRenderer().refresh(); // load other users' rendering settings model.getRenderer().retrieveRelatedSettings(); model.getRenderer().updatePasteAction(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#loadRenderingControl(int) */ public void loadRenderingControl(int index) { if (model.getRenderer() == null && index == RenderingControlLoader.RELOAD) return; ImageData image = model.getImage(); if (image == null || image.getId() < 0) return; PixelsData pixels = image.getDefaultPixels(); if (pixels == null) return; int value; switch (index) { case RenderingControlLoader.LOAD: case RenderingControlLoader.RELOAD: value = index; break; default: value = index; } setStatus(model.fireRenderingControlLoading(pixels.getId(), value)); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#loadRenderingControl() */ public void loadRenderingControl() { ImageData image = model.getImage(); if (image == null || image.getId() < 0) return; PixelsData pixels = image.getDefaultPixels(); model.loadRenderingControl(pixels.getId()); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setLoadedFile(FileAnnotationData, File, Object) */ public void setLoadedFile(FileAnnotationData data, File file, Object uiView) { if (uiView instanceof DocComponent) { if (file == null) return; DocComponent doc = (DocComponent) uiView; if (doc.getData() == data) { doc.setThumbnail(file.getAbsolutePath()); file.delete(); } } else if (uiView instanceof OriginalMetadataComponent) { ((OriginalMetadataComponent) uiView).setOriginalFile(file); } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#getRenderer() */ public Renderer getRenderer() { return model.getRenderer(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setInstrumentData(InstrumentData) */ public void setInstrumentData(InstrumentData data) { if (data == null) return; model.setInstrumentData(data); view.setInstrumentData(); view.setStatus(false); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#refresh() */ public void refresh() { /* switch (view.getSelectedTab()) { case EditorUI.GENERAL_INDEX: model.refresh(); break; case EditorUI.RND_INDEX: Renderer rnd = getRenderer(); if (rnd != null) rnd.refresh(); break; case EditorUI.ACQUISITION_INDEX: view.refreshAcquisition(); }; */ model.refresh(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#exportImageAsOMETIFF(File, Target) */ public void exportImageAsOMETIFF(File folder, Target target) { Object refObject = model.getRefObject(); ImageData image = null; if (refObject instanceof ImageData) image = (ImageData) refObject; else if (refObject instanceof WellSampleData) { image = ((WellSampleData) refObject).getImage(); } if (image == null) return; if (folder == null) folder = UIUtilities.getDefaultFolder(); ExportActivityParam param = new ExportActivityParam(folder, image, ExportActivityParam.EXPORT_AS_OME_TIFF, target); IconManager icons = IconManager.getInstance(); param.setIcon(icons.getIcon(IconManager.EXPORT_22)); UserNotifier un = MetadataViewerAgent.getRegistry().getUserNotifier(); un.notifyActivity(model.getSecurityContext(), param); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#onChannelColorChanged(int) */ public void onChannelColorChanged(int index) { view.onChannelColorChanged(index); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#onChannelColorChanged(int) */ public void setSelectedTab(int index) { switch (index) { case RENDERER_TAB: case ACQUISITION_TAB: case GENERAL_TAB: view.setSelectedTab(index); break; default: return; } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#createFigure() */ public void createFigure(int index) { if (controller.getFigureDialog() == null) { String name = model.getRefObjectName(); UserNotifier un = MetadataViewerAgent.getRegistry().getUserNotifier(); FigureDialog dialog; PixelsData pixels = model.getPixels(); boolean b = view.isNumerousChannel(); switch (index) { case FigureDialog.SPLIT: if (pixels == null) { un.notifyInfo("Split View Figure", "Image not valid. Cannot create figure."); return; } if (b) { un.notifyInfo("Split View Figure", "The selected type of figure " + "is not available for the image."); return; } dialog = controller.createFigureDialog(name, pixels, FigureDialog.SPLIT); if (!model.isRendererLoaded()) { loadRenderingControl(RenderingControlLoader.LOAD); } else { dialog.setRenderer(model.getRenderer()); } dialog.centerDialog(); break; case FigureDialog.SPLIT_ROI: if (b) { un.notifyInfo("ROI Split Figure", "The selected type of figure " + "is not available for the image."); return; } model.fireROILoading(FigureDialog.SPLIT_ROI); break; case FigureDialog.THUMBNAILS: Object ref = model.getRefObject(); if (ref instanceof WellSampleData || ref instanceof PlateData) { un.notifyInfo("Thumbnails Figure", "Script not" + " available for Wells or Plate"); return; } Collection tags = model.isMultiSelection() ? model.getAllTags() : model.getTags(); dialog = controller.createFigureDialog(name, pixels, FigureDialog.THUMBNAILS); dialog.setParentRef(model.getParentRootObject()); if (tags != null) dialog.setTags(tags); else model.loadExistingTags(); dialog.centerDialog(); break; case FigureDialog.MOVIE: if (pixels == null) { un.notifyInfo("Movie Figure", "Image not valid. Cannot create figure."); return; } Collection planes = model.getChannelPlaneInfo( EditorModel.DEFAULT_CHANNEL); dialog = controller.createFigureDialog(name, pixels, FigureDialog.MOVIE); if (planes != null) dialog.setPlaneInfo(planes); else model.firePlaneInfoLoading(EditorModel.DEFAULT_CHANNEL, 0); dialog.centerDialog(); break; case FigureDialog.ROI_MOVIE: model.fireROILoading(FigureDialog.ROI_MOVIE); break; } } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setROI(Collection, long, int) */ public void setROI(Collection rois, long imageID, int index) { if (index != FigureDialog.SPLIT_ROI && index != FigureDialog.ROI_MOVIE) return; ImageData img = model.getImage(); if (img == null || img.getId() != imageID) return; UserNotifier un = MetadataViewerAgent.getRegistry().getUserNotifier(); if (rois == null || rois.size() == 0) { un.notifyInfo("ROI Split Figure", "The primary select does not have Region of Interests."); return; } Iterator r = rois.iterator(); ROIResult result; int count = 0; try { Collection list; while (r.hasNext()) { result = (ROIResult) r.next(); list = result.getROIs(); if (list.size() > 0) count++; } } catch (Exception e) {} if (count == 0) { un.notifyInfo("ROI Split Figure", "The primary select does not have Region of Interests."); return; } if (controller.getFigureDialog() == null) { PixelsData pixels = model.getPixels(); if (pixels == null) { un.notifyInfo("ROI Split Figure", "Image not valid. Cannot create figure."); return; } String name = model.getRefObjectName(); FigureDialog dialog = controller.createFigureDialog(name, pixels, index); if (dialog == null) return; dialog.setROIs(rois); if (!model.isRendererLoaded()) { loadRenderingControl(RenderingControlLoader.LOAD); } else { dialog.setRenderer(model.getRenderer()); if (index == FigureDialog.ROI_MOVIE) model.firePlaneInfoLoading(EditorModel.DEFAULT_CHANNEL, 0); } dialog.centerDialog(); } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setScripts(List) */ public void setScripts(List scripts) { model.setScripts(scripts); view.setScripts(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#getUserID() */ public long getUserID() { return model.getUserID(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#loadScript(long) */ public void loadScript(long scriptID) { if (scriptID < 0) return; model.loadScript(scriptID); setStatus(true); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setScript(ScriptObject) */ public void setScript(ScriptObject script) { if (script == null) throw new IllegalArgumentException("No script."); model.setScript(script); setStatus(false); JFrame f = MetadataViewerAgent.getRegistry().getTaskBar().getFrame(); if (dialog == null) { dialog = new ScriptingDialog(f, model.getScript(script.getScriptID()), model.getSelectedObjects(), MetadataViewerAgent.isBinaryAvailable()); dialog.addPropertyChangeListener(controller); UIUtilities.centerAndShow(dialog); } else { dialog.reset(model.getScript(script.getScriptID()), model.getSelectedObjects()); if (!dialog.isVisible()) UIUtilities.centerAndShow(dialog); } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setUserPhoto(BufferedImage, long) */ public void setUserPhoto(BufferedImage photo, long experimenterID) { if (photo == null) return; Object o = model.getRefObject(); if (o instanceof ExperimenterData) { ExperimenterData exp = (ExperimenterData) o; if (exp.getId() == experimenterID) { model.setUserPhoto(photo, experimenterID); view.setUserPhoto(photo); } } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#canLink() */ public boolean canLink() { return model.canLink(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#canEdit() */ public boolean canEdit() { return model.canEdit(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#canAnnotate() */ public boolean canAnnotate() { return model.canAnnotate(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#displayAnalysisResults(AnalysisResultsItem) */ public void displayAnalysisResults(AnalysisResultsItem analysis) { if (analysis == null) return; List<FileAnnotationData> list = analysis.getAttachments(); if (list == null || list.size() == 0) return; Map<FileAnnotationData, File> results = analysis.getResults(); if (results != null) { analysisResultsLoaded(analysis); } else { model.loadAnalysisResults(analysis); analysis.notifyLoading(true); } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#analysisResultsLoaded(AnalysisResultsItem) */ public void analysisResultsLoaded(AnalysisResultsItem analysis) { if (analysis == null) return; analysis.notifyLoading(false); model.removeAnalysisResultsLoading(analysis); //now display results. } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#saveAs(File, int) */ public void saveAs(File folder, int format, String fileName) { if (folder == null) folder = UIUtilities.getDefaultFolder(); model.saveAs(folder, format, fileName); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#onGroupSwitched(boolean) */ public void onGroupSwitched(boolean success) { if (!success) return; if (dialog != null) { dialog.setVisible(false); dialog.dispose(); dialog = null; } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#getSecurityContext() */ public SecurityContext getSecurityContext() { return model.getSecurityContext(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setLargeImage(Boolean) */ public void setLargeImage(Boolean value) { ImageData img = model.getImage(); if (img == null) return; model.setLargeImage(value); view.onSizeLoaded(); view.handleImageSelection(); loadRnd(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#onUpdatedChannels(List) */ public void onUpdatedChannels(List<ChannelData> channels) { model.updateChannels(channels); view.showChannelData(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setFileset(Set) */ public void setFileset(Set<FilesetData> set) { model.setFileset(set); view.displayFileset(); } /** * Implemented as specified by the {@link Editor} interface. * * @see Editor#loadFileset(int) */ public void loadFileset() { model.fireFilesetLoading(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#loadRnd() */ public void loadRnd() { if (model.getRndIndex() == MetadataViewer.RND_SPECIFIC) { if (!model.isRendererLoaded()) { loadRenderingControl(RenderingControlLoader.LOAD); } } else { if (view.getSelectedTab() == EditorUI.RND_INDEX) loadRenderingControl(RenderingControlLoader.LOAD); } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#setLDAPDetails(long, String) */ public void setLDAPDetails(long userID, String result) { Object o = model.getRefObject(); if (o instanceof ExperimenterData) { ExperimenterData exp = (ExperimenterData) o; if (exp.getId() == userID) { view.setLDAPDetails(result); } } } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#getScriptFromName(String) */ public ScriptObject getScriptFromName(String name) { return model.getScriptFromName(name); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#getSelectedFileAnnotations() */ public Collection<FileAnnotationData> getSelectedFileAnnotations() { return view.getSelectedFileAnnotations(); } /** * Implemented as specified by the {@link Editor} interface. * @see Editor#reloadROICount() */ @Override public void reloadROICount() { view.reloadROICount(); } }