/*
*------------------------------------------------------------------------------
* 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.dataBrowser.view;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import javax.swing.Icon;
import javax.swing.JComponent;
import org.apache.commons.collections.CollectionUtils;
import org.openmicroscopy.shoola.agents.dataBrowser.DataBrowserAgent;
import org.openmicroscopy.shoola.agents.dataBrowser.IconManager;
import org.openmicroscopy.shoola.agents.dataBrowser.ThumbnailProvider;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.Browser;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.CellDisplay;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.ImageDisplay;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.ImageDisplayVisitor;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.ImageFinder;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.ImageNode;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.Thumbnail;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.WellImageSet;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.WellSampleNode;
import org.openmicroscopy.shoola.agents.dataBrowser.visitor.FlushVisitor;
import org.openmicroscopy.shoola.agents.dataBrowser.visitor.NodesFinder;
import org.openmicroscopy.shoola.agents.dataBrowser.visitor.RegexFinder;
import org.openmicroscopy.shoola.agents.dataBrowser.visitor.ResetNodesVisitor;
import org.openmicroscopy.shoola.agents.events.hiviewer.LaunchViewer;
import org.openmicroscopy.shoola.agents.events.iviewer.ViewImageObject;
import org.openmicroscopy.shoola.agents.util.EditorUtil;
import org.openmicroscopy.shoola.agents.util.SelectionWizard;
import org.openmicroscopy.shoola.env.LookupNames;
import org.openmicroscopy.shoola.env.data.events.ViewInPluginEvent;
import org.openmicroscopy.shoola.env.data.model.ApplicationData;
import org.openmicroscopy.shoola.env.data.model.ThumbnailData;
import org.openmicroscopy.shoola.env.data.util.FilterContext;
import omero.gateway.SecurityContext;
import omero.gateway.model.TableResult;
import org.openmicroscopy.shoola.env.data.util.StructuredDataResults;
import org.openmicroscopy.shoola.env.event.EventBus;
import omero.log.LogMessage;
import omero.log.Logger;
import org.openmicroscopy.shoola.env.ui.UserNotifier;
import org.openmicroscopy.shoola.util.file.ExcelWriter;
import org.openmicroscopy.shoola.util.ui.RegExFactory;
import org.openmicroscopy.shoola.util.ui.UIUtilities;
import org.openmicroscopy.shoola.util.ui.component.AbstractComponent;
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.TagAnnotationData;
import omero.gateway.model.TextualAnnotationData;
import omero.gateway.model.WellSampleData;
/**
* Implements the {@link DataBrowser} 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 DataBrowserComponent
extends AbstractComponent
implements DataBrowser
{
/** The maximum number of entries before switching to the table view. */
private static final String MAX_ENTRIES = "/views/MAX_ENTRIES";
/* The filtering message to display in modal dialogs. */
private static final String FILTERING_MSG = "Currently filtering data. Please wait.";
/** The Model sub-component. */
private DataBrowserModel model;
/** The Controller sub-component. */
private DataBrowserControl controller;
/** The View sub-component. */
private DataBrowserUI view;
/** Displays the existing datasets. */
private void showExistingDatasets()
{
Collection datasets = model.getExistingDatasets();
if (datasets == null || datasets.size() == 0) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Existing datasets", "No Datasets already created.");
return;
}
IconManager icons = IconManager.getInstance();
String title = "Datasets Selection";
String text = "Select the Datasets to add the images to";
Icon icon = icons.getIcon(IconManager.DATASET_48);
SelectionWizard wizard = new SelectionWizard(
DataBrowserAgent.getRegistry().getTaskBar().getFrame(),
datasets, DatasetData.class, DataBrowserAgent.getUserDetails());
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.
*/
DataBrowserComponent(DataBrowserModel model)
{
if (model == null) throw new NullPointerException("No model.");
this.model = model;
}
/** Links the components. */
void initialize()
{
controller = new DataBrowserControl();
view = new DataBrowserUI();
controller.initialize(this, view);
view.initialize(model, controller);
}
/**
* Notifies the model that the user has annotated data.
*
* @param containers The objects to handle.
* @param count A positive value if annotations are added, a negative value
* if annotations are removed.
*/
void onAnnotated(List<DataObject> containers, int count)
{
if (containers == null || containers.size() == 0) return;
NodesFinder visitor = new NodesFinder(containers);
model.getBrowser().accept(visitor);
List<ImageDisplay> nodes = visitor.getFoundNodes();
if (nodes == null || nodes.size() == 0) return;
Iterator<ImageDisplay> i = nodes.iterator();
while (i.hasNext()) {
i.next().setAnnotationCount(count);
}
}
/**
* Fires a property indicating that some rendering settings can be copied.
*/
void notifyRndSettingsToCopy()
{
if (model.getState() == DISCARDED) return;
firePropertyChange(RND_SETTINGS_TO_COPY_PROPERTY, Boolean.FALSE,
Boolean.TRUE);
}
/**
* Fires a property indicating that some data can be copied.
*/
void notifyDataToCopy()
{
if (model.getState() == DISCARDED) return;
firePropertyChange(ITEMS_TO_COPY_PROPERTY, Boolean.FALSE,
Boolean.TRUE);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#activate()
*/
public void activate()
{
//Determine the view depending on the number of image.
Integer max = (Integer) DataBrowserAgent.getRegistry().lookup(
MAX_ENTRIES);
if (model.getType() == DataBrowserModel.SEARCH) {
view.setSelectedView(SEARCH);
model.loadData(false, null);
}
else if (model.getNumberOfImages() <= max.intValue() ||
model.getType() == DataBrowserModel.WELLS) {
model.loadData(false, null);
if (model.getType() == DataBrowserModel.WELLS) {
model.fireTabularDataLoading(null);
}
view.setSelectedView(DataBrowserUI.THUMB_VIEW);
} else {
view.setSelectedView(DataBrowserUI.COLUMNS_VIEW);
}
Browser browser = model.getBrowser();
if (browser != null) {
ResetNodesVisitor visitor = new ResetNodesVisitor(null, false);
browser.accept(visitor, ImageDisplayVisitor.IMAGE_SET_ONLY);
browser.addPropertyChangeListener(controller);
}
fireStateChange();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#discard()
*/
public void discard()
{
Browser browser = model.getBrowser();
if (browser != null) {
browser.accept(new FlushVisitor(),
ImageDisplayVisitor.IMAGE_NODE_ONLY);
}
model.discard();
fireStateChange();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#getHierarchyType()
*/
public int getHierarchyType() { return 0; }
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#getState()
*/
public int getState() { return model.getState(); }
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setStatus(String, int)
*/
public void setStatus(String description, int perc)
{
int state = model.getState();
view.setStatus(description, state != LOADING, perc);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setThumbnail(Object, BufferedImage, boolean, int)
*/
public void setThumbnail(Object ref, BufferedImage thumb, boolean valid,
int maxEntries)
{
int previousState = model.getState();
int perc = model.setThumbnail(ref, thumb, valid, maxEntries);
view.setStatus((perc == 100) ? "Done" : "", perc == 100, perc);
if (previousState != model.getState()) fireStateChange();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setSelectedDisplays(List)
*/
public void setSelectedDisplays(List<ImageDisplay> nodes)
{
if (CollectionUtils.isEmpty(nodes)) {
if (model instanceof WellsModel) {
((WellsModel) model).setSelectedWells(null);
view.onSelectedWell();
}
return;
}
if (nodes.size() == 1) {
setSelectedDisplay(nodes.get(0));
return;
}
final List<ImageNode> visibleNodes =
model.getBrowser().getVisibleImageNodes();
final List<Long> visibleObjectIds =
new ArrayList<Long>(visibleNodes.size());
for (final ImageNode visibleNode : visibleNodes) {
final Object hierarchyObject = visibleNode.getHierarchyObject();
if (hierarchyObject instanceof ImageData)
visibleObjectIds.add(((ImageData) hierarchyObject).getId());
}
List<Object> others = new ArrayList<Object>();
List<Object> objects = new ArrayList<Object>();
objects.add(others);
for (final ImageDisplay node : nodes) {
final Object hierarchyObject = node.getHierarchyObject();
if (!(hierarchyObject instanceof ImageData) ||
visibleObjectIds.contains(
((ImageData) hierarchyObject).getId()))
others.add(hierarchyObject);
}
ImageDisplay node = nodes.get(0);
Object object = node.getHierarchyObject();
if (object instanceof DataObject) {
Object parent = null;
if (object instanceof WellSampleData) {
WellSampleNode wsn = (WellSampleNode) node;
parent = wsn.getParentObject();
List<WellImageSet> wells = new ArrayList<WellImageSet>();
wells.add(wsn.getParentWell());
Iterator<ImageDisplay> i = nodes.iterator();
ImageDisplay n;
while (i.hasNext()) {
n = i.next();
if (n instanceof WellSampleNode) {
wsn = (WellSampleNode) n;
wells.add(wsn.getParentWell());
}
}
((WellsModel) model).setSelectedWells(wells);
view.onSelectedWell();
} else {
ImageDisplay p = node.getParentDisplay();
if (p != null) {
parent = p.getHierarchyObject();
if (!(parent instanceof DataObject))
parent = model.getParent();
}
}
if (parent != null)
objects.add(parent);
}
firePropertyChange(SELECTED_DATA_BROWSER_NODES_DISPLAY_PROPERTY, null,
objects);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setSelectedDisplay(ImageDisplay)
*/
public void setSelectedDisplay(ImageDisplay node)
{
if (node == null) {
if (model instanceof WellsModel) {
((WellsModel) model).setSelectedWells(null);
view.onSelectedWell();
}
return;
}
model.getBrowser().scrollToNode(node);
Object object = node.getHierarchyObject();
List<Object> objects = new ArrayList<Object>();
List<Object> others = new ArrayList<Object>();
Collection<ImageDisplay>
selected = model.getBrowser().getSelectedDisplays();
Iterator<ImageDisplay> i = selected.iterator();
ImageDisplay n;
while (i.hasNext()) {
n = i.next();
if (n != node) others.add(n.getHierarchyObject());
}
objects.add(others);
//Root node
if (node.equals(model.getBrowser().getUI())) {
objects.add(model.parent);
} else objects.add(object);
if (object instanceof DataObject) {
Object parent = null;
if (object instanceof WellSampleData) {
WellSampleNode wsn = (WellSampleNode) node;
parent = wsn.getParentObject();
if (others.size() > 0) parent = null;
List<WellImageSet> wells = new ArrayList<WellImageSet>();
boolean in = false;
WellImageSet well;
i = selected.iterator();
while (i.hasNext()) {
n = i.next();
if (n instanceof WellSampleNode) {
wsn = (WellSampleNode) n;
well = wsn.getParentWell();
if (well.equals(wsn.getParentWell())) in = true;
wells.add(well);
}
}
if (!in) wells.add(wsn.getParentWell());
((WellsModel) model).setSelectedWells(wells);
view.onSelectedWell();
} else {
ImageDisplay p = node.getParentDisplay();
if (p != null) {
parent = p.getHierarchyObject();
if (!(parent instanceof DataObject))
parent = model.getParent();
}
}
if (parent != null)
objects.add(parent);
}
firePropertyChange(SELECTED_NODE_DISPLAY_PROPERTY, null, objects);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setApplications(List)
*/
public void setApplications(List<ApplicationData> applications)
{
model.setApplicationData(applications);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setSelectedNodes(List, List)
*/
public void setSelectedNodes(List<DataObject> objects,
List<ApplicationData> applications)
{
ImageTableView tbView = model.getTableView();
if (tbView != null) tbView.setSelectedNodes(objects);
model.getBrowser().setSelectedNodes(objects);
model.setApplicationData(applications);
firePropertyChange(SELECTION_UPDATED_PROPERTY,
Boolean.valueOf(false), Boolean.valueOf(true));
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#markUnmodifiedNodes(Class, List)
*/
public void markUnmodifiedNodes(Class type, Collection<Long> ids)
{
ImageTableView tbView = model.getTableView();
if (tbView != null && ids != null)
tbView.markUnmodifiedNodes(type, ids);
model.getBrowser().markUnmodifiedNodes(type, ids);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#getUI(boolean)
*/
public JComponent getUI(boolean full)
{
//view.buildGUI(full);
return view;
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#filterByRate(int)
*/
public void filterByRate(int rate)
{
if (model.getState() == FILTERING) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Filtering", FILTERING_MSG);
return;
}
Browser browser = model.getBrowser();
ImageFinder finder = new ImageFinder();
browser.accept(finder, ImageDisplayVisitor.IMAGE_NODE_ONLY);
Set nodes = finder.getImages();
if (nodes != null && nodes.size() > 0) {
model.fireFilteringByRate(rate, nodes);
fireStateChange();
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#showAll()
*/
public void showAll()
{
model.cancelFiltering();
model.getBrowser().showAll();
//model.layoutBrowser();
view.layoutUI();
view.setNumberOfImages(model.getNumberOfImages());
fireStateChange();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#filterByComments(List)
*/
public void filterByComments(List<String> comments)
{
if (model.getState() == FILTERING) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Filtering", FILTERING_MSG);
return;
}
Browser browser = model.getBrowser();
Set<DataObject> nodes = browser.getOriginal();
if (nodes != null && nodes.size() > 0) {
model.fireFilteringByComments(comments, nodes);
fireStateChange();
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#filterByFullText(List)
*/
public void filterByFullText(List<String> terms)
{
if (terms == null || terms.size() == 0) {
//showAll();
return;
}
Browser browser = model.getBrowser();
Pattern pattern;
try {
pattern = RegExFactory.createPattern(
RegExFactory.formatSearchTextAsString(terms));
} catch (PatternSyntaxException pse) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Find", "Some characters are not recognised.");
return;
}
//view.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
RegexFinder finder = new RegexFinder(pattern);
browser.accept(finder);
List<ImageDisplay> nodes = finder.getFoundNodes();
browser.setFilterNodes(nodes);
view.layoutUI();
view.setNumberOfImages(nodes.size());
//view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
view.setFilterStatus(false);
fireStateChange();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#filterByTags(List)
*/
public void filterByTags(List<String> tags)
{
if (model.getState() == FILTERING) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Filtering", FILTERING_MSG);
return;
}
Browser browser = model.getBrowser();
Set<DataObject> nodes = browser.getOriginal();
if (nodes != null && nodes.size() > 0) {
model.fireFilteringByTags(tags, nodes);
fireStateChange();
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setFilteredNodes(List, List)
*/
public void setFilteredNodes(List<DataObject> objects, List<String> names)
{
if (objects == null) return;
Browser browser = model.getBrowser();
List<ImageDisplay> nodes;
if (objects.size() > 0) {
NodesFinder finder = new NodesFinder(objects);
browser.accept(finder);
nodes = finder.getFoundNodes();
} else {
nodes = new ArrayList<ImageDisplay>();
}
if (names != null && names.size() > 0) {
Pattern pattern;
try {
pattern = RegExFactory.createPattern(
RegExFactory.formatSearchTextAsString(names));
} catch (PatternSyntaxException pse) {
UserNotifier un =
DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Find", "Some characters are not recognised.");
return;
}
RegexFinder finder = new RegexFinder(pattern);
finder.analyse(nodes);
nodes = finder.getFoundNodes();
}
browser.setFilterNodes(nodes);
view.layoutUI();
view.setNumberOfImages(nodes.size());
model.setState(READY);
//view.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
view.setFilterStatus(false);
fireStateChange();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#filterByContext(FilterContext)
*/
public void filterByContext(FilterContext context)
{
if (context == null) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Filtering", "No filtering context.");
return;
}
if (model.getState() == FILTERING) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Filtering", FILTERING_MSG);
return;
}
if (context.isNameOnly()) {
view.filterByContext(context);
filterByFullText(context.getNames());
} else if (context.isTagsOnly()) {
view.filterByContext(context);
filterByTags(context.getAnnotation(TagAnnotationData.class));
} else {
Browser browser = model.getBrowser();
Set<DataObject> nodes = browser.getOriginal();
if (nodes != null && nodes.size() > 0) {
view.filterByContext(context);
model.fireFilteringByContext(context, nodes);
fireStateChange();
}
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#loadExistingTags()
*/
public void loadExistingTags()
{
//Do not cache the tags
//if (model.getExistingTags() == null)
model.fireTagsLoading();
//else view.setFilterStatus(false);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setExistingTags(Collection)
*/
public void setExistingTags(Collection tags)
{
model.setTags(tags);
view.setTags(model.getExistingTags());
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setSlideViewImage(long, BufferedImage)
*/
public void setSlideViewImage(long imageID, BufferedImage thumb)
{
boolean done = model.setSlideViewImage(imageID, thumb);
if (done) view.setSlideViewStatus(true, -1);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setSlideViewStatus(String, int)
*/
public void setSlideViewStatus(String description, int perc)
{
int state = model.getState();
if (state == LOADING_SLIDE_VIEW)
view.setSlideViewStatus(false, perc);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#createDataObject(DataObject)
*/
public void createDataObject(DataObject data)
{
if (data == null) return;
//TODO: check state.
if (!(data instanceof DatasetData)) return;
Browser browser = model.getBrowser();
Collection images;
Collection set = browser.getSelectedDisplays();
if (set != null && set.size() > 0) {
images = new HashSet();
Iterator i = set.iterator();
ImageDisplay display;
Object ho;
while (i.hasNext()) {
display = (ImageDisplay) i.next();
ho = display.getHierarchyObject();
if (ho instanceof ImageData) {
images.add(ho);
}
}
} else {
images = browser.getVisibleImages();
}
if (images == null || images.size() == 0) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Dataset Creation", "No images selected");
return;
}
//Check if we can use the image
if (model.getParent() == null && model.getExperimenter() != null) {
Iterator i = images.iterator();
ImageData img;
Collection list = new HashSet();
while (i.hasNext()) {
img = (ImageData) i.next();
if (canLink(img)) list.add(img);
}
if (list.size() == 0) {
UserNotifier un =
DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Dataset Creation", "The images " +
"cannot be added to the dataset. \n ");
return;
}
images = list;
}
model.fireDataSaving(data, images);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setDataObjectCreated(DataObject, DataObject)
*/
public void setDataObjectCreated(DataObject object, DataObject parent)
{
Map<Object, Object> m = new HashMap<Object, Object>(1);
m.put(object, parent);
firePropertyChange(DATA_OBJECT_CREATED_PROPERTY, null, m);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setTableNodesSelected(List)
*/
public void setTableNodesSelected(List<ImageDisplay> nodes)
{
model.getBrowser().setNodesSelection(nodes);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setUnselectedDisplay(ImageDisplay)
*/
public void setUnselectedDisplay(ImageDisplay node)
{
if (node == null) return;
Object object = node.getHierarchyObject();
if (object instanceof WellSampleData) {
setSelectedDisplays(
(List<ImageDisplay>) model.getBrowser().getSelectedDisplays());
return;
}
List<Object> objects = new ArrayList<Object>();
objects.add(model.getBrowser().isMultiSelection());
objects.add(object);
if (object instanceof DataObject) {
ImageDisplay p = node.getParentDisplay();
Object parent = p.getHierarchyObject();
if (!(parent instanceof DataObject))
parent = model.getParent();
if (parent != null) objects.add(parent);
}
firePropertyChange(UNSELECTED_NODE_DISPLAY_PROPERTY, null, objects);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#getBrowser()
*/
public Browser getBrowser()
{
if (model.getState() == DISCARDED)
throw new IllegalArgumentException("This method cannot be " +
"invoked in the DISCARDED state.");
return model.getBrowser();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#pasteRndSettings()
*/
public void pasteRndSettings()
{
if (model.getState() == DISCARDED)
throw new IllegalArgumentException("This method cannot be " +
"invoked in the DISCARDED state.");
if (model.getType() == DataBrowserModel.SEARCH) {
firePropertyChange(PASTE_RND_SETTINGS_PROPERTY, null,
getBrowser().getSelectedDataObjects());
} else {
ImageDisplay d = getBrowser().getLastSelectedDisplay();
if (d instanceof WellSampleNode)
firePropertyChange(PASTE_RND_SETTINGS_PROPERTY, null,
getBrowser().getSelectedDataObjects());
else
firePropertyChange(PASTE_RND_SETTINGS_PROPERTY,
Boolean.FALSE, Boolean.TRUE);
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#resetRndSettings()
*/
public void resetRndSettings()
{
if (model.getState() == DISCARDED)
throw new IllegalArgumentException("This method cannot be " +
"invoked in the DISCARDED state.");
if (model.getType() == DataBrowserModel.SEARCH) {
firePropertyChange(RESET_RND_SETTINGS_PROPERTY, null,
getBrowser().getSelectedDataObjects());
} else {
ImageDisplay d = getBrowser().getLastSelectedDisplay();
if (d instanceof WellSampleNode)
firePropertyChange(RESET_RND_SETTINGS_PROPERTY, null,
getBrowser().getSelectedDataObjects());
else
firePropertyChange(RESET_RND_SETTINGS_PROPERTY,
Boolean.FALSE, Boolean.TRUE);
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#copyRndSettings()
*/
public void copyRndSettings()
{
if (model.getState() == DISCARDED)
throw new IllegalArgumentException("This method cannot be " +
"invoked in the DISCARDED state.");
if (model.getType() == DataBrowserModel.SEARCH) {
ImageDisplay display = getBrowser().getLastSelectedDisplay();
Object o = display.getHierarchyObject();
if (o instanceof WellSampleData) {
WellSampleData wsd = (WellSampleData) o;
o = wsd.getImage();
}
if (!(o instanceof ImageData)) return;
ImageData img = (ImageData) o;
firePropertyChange(COPY_RND_SETTINGS_PROPERTY, null, img);
} else {
ImageDisplay d = getBrowser().getLastSelectedDisplay();
if (d instanceof WellSampleNode) {
WellSampleData wsd = (WellSampleData) d.getHierarchyObject();
firePropertyChange(COPY_RND_SETTINGS_PROPERTY, null,
wsd.getImage());
} else
firePropertyChange(COPY_RND_SETTINGS_PROPERTY, Boolean.FALSE,
null);
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#copy()
*/
public void copy()
{
if (model.getState() == DISCARDED)
throw new IllegalArgumentException("This method cannot be " +
"invoked in the DISCARDED state.");
firePropertyChange(COPY_ITEMS_PROPERTY, Boolean.FALSE, Boolean.TRUE);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#cut()
*/
public void cut()
{
if (model.getState() == DISCARDED)
throw new IllegalArgumentException("This method cannot be " +
"invoked in the DISCARDED state.");
firePropertyChange(CUT_ITEMS_PROPERTY, Boolean.FALSE, Boolean.TRUE);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#paste()
*/
public void paste()
{
if (model.getState() == DISCARDED)
throw new IllegalArgumentException("This method cannot be " +
"invoked in the DISCARDED state.");
firePropertyChange(PASTE_ITEMS_PROPERTY, Boolean.FALSE, Boolean.TRUE);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#remove()
*/
public void remove()
{
if (model.getState() == DISCARDED)
throw new IllegalArgumentException("This method cannot be " +
"invoked in the DISCARDED state.");
firePropertyChange(REMOVE_ITEMS_PROPERTY, Boolean.FALSE, Boolean.TRUE);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#isWritable(Object)
*/
public boolean isWritable(Object ho)
{
if (model.getState() == DISCARDED)
throw new IllegalStateException(
"This method cannot be invoked in the DISCARDED state.");
//Check if current user can write in object
ExperimenterData exp = DataBrowserAgent.getUserDetails();
long id = exp.getId();
boolean b = EditorUtil.isUserOwner(ho, id);
if (b) return b; //user it the owner.
switch (exp.getPermissions().getPermissionsLevel()) {
case GroupData.PERMISSIONS_GROUP_READ_LINK:
case GroupData.PERMISSIONS_PUBLIC_READ_WRITE:
return true;
}
return false;
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#canDelete(Object)
*/
public boolean canDelete(Object ho)
{
if (model.getState() == DISCARDED)
throw new IllegalStateException(
"This method cannot be invoked in the DISCARDED state.");
long id = DataBrowserAgent.getUserDetails().getId();
if (EditorUtil.isUserOwner(ho, id)) return true; //user it the owner.
if (!(ho instanceof DataObject)) return false;
DataObject data = (DataObject) ho;
return data.canDelete();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#canEdit(Object)
*/
public boolean canEdit(Object ho)
{
if (model.getState() == DISCARDED)
throw new IllegalStateException(
"This method cannot be invoked in the DISCARDED state.");
//Check if current user can write in object
long id = DataBrowserAgent.getUserDetails().getId();
if (EditorUtil.isUserOwner(ho, id)) return true; //user it the owner.
if (!(ho instanceof DataObject)) return false;
DataObject data = (DataObject) ho;
return data.canEdit();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#canChgrp(Object)
*/
public boolean canChgrp(Object ho)
{
if (model.getState() == DISCARDED)
throw new IllegalStateException(
"This method cannot be invoked in the DISCARDED state.");
//Check if current user can write in object
if (DataBrowserAgent.isAdministrator()) return true;
long id = DataBrowserAgent.getUserDetails().getId();
return EditorUtil.isUserOwner(ho, id);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#canLink(Object)
*/
public boolean canLink(Object ho)
{
if (model.getState() == DISCARDED)
throw new IllegalStateException(
"This method cannot be invoked in the DISCARDED state.");
//Check if current user can write in object
long id = DataBrowserAgent.getUserDetails().getId();
return (EditorUtil.isUserOwner(ho, id)); //user it the owner.
/*
if (!(ho instanceof DataObject)) return false;
DataObject data = (DataObject) ho;
return data.canLink();
*/
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#canAnnotate(Object)
*/
public boolean canAnnotate(Object ho)
{
if (model.getState() == DISCARDED)
throw new IllegalStateException(
"This method cannot be invoked in the DISCARDED state.");
return model.canAnnotate(ho);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#reloadThumbnails(Collection)
*/
public void reloadThumbnails(Collection ids)
{
switch (model.getState()) {
case DISCARDED:
throw new IllegalStateException("This method cannot be" +
"invoked in the DISCARDED state.");
case NEW:
return;
}
model.loadData(true, ids);
fireStateChange();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setOriginalSettings()
*/
public void setOriginalSettings()
{
if (model.getState() == DISCARDED)
throw new IllegalArgumentException("This method cannot be " +
"invoked in the DISCARDED state.");
if (model.getType() == DataBrowserModel.SEARCH) {
firePropertyChange(SET__ORIGINAL_RND_SETTINGS_PROPERTY, null,
getBrowser().getSelectedDataObjects());
} else {
ImageDisplay d = getBrowser().getLastSelectedDisplay();
if (d instanceof WellSampleNode)
firePropertyChange(SET__ORIGINAL_RND_SETTINGS_PROPERTY, null,
getBrowser().getSelectedDataObjects());
else
firePropertyChange(SET__ORIGINAL_RND_SETTINGS_PROPERTY,
Boolean.valueOf(false), Boolean.valueOf(true));
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setOwnerSettings()
*/
public void setOwnerSettings()
{
if (model.getState() == DISCARDED)
throw new IllegalArgumentException("This method cannot be " +
"invoked in the DISCARDED state.");
/*
if (model.getType() == DataBrowserModel.SEARCH) {
firePropertyChange(SET__OWNER_RND_SETTINGS_PROPERTY, null,
getBrowser().getSelectedDataObjects());
} else {
ImageDisplay d = getBrowser().getLastSelectedDisplay();
if (d instanceof WellSampleNode)
firePropertyChange(SET__OWNER_RND_SETTINGS_PROPERTY, null,
getBrowser().getSelectedDataObjects());
else
firePropertyChange(SET__OWNER_RND_SETTINGS_PROPERTY,
Boolean.valueOf(false), Boolean.valueOf(true));
}
*/
ImageDisplay d = getBrowser().getLastSelectedDisplay();
if (d instanceof WellSampleNode)
firePropertyChange(SET__OWNER_RND_SETTINGS_PROPERTY, null,
getBrowser().getSelectedDataObjects());
else
firePropertyChange(SET__OWNER_RND_SETTINGS_PROPERTY,
Boolean.valueOf(false), Boolean.valueOf(true));
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#filterByTagged(boolean)
*/
public void filterByTagged(boolean tagged)
{
if (model.getState() == FILTERING) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Filtering", FILTERING_MSG);
return;
}
Browser browser = model.getBrowser();
Set<DataObject> nodes = browser.getOriginal();
if (nodes != null && nodes.size() > 0) {
model.fireFilteringByAnnotated(TagAnnotationData.class, tagged,
nodes);
fireStateChange();
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#filterByCommented(boolean)
*/
public void filterByCommented(boolean commented)
{
if (model.getState() == FILTERING) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Filtering", FILTERING_MSG);
return;
}
Browser browser = model.getBrowser();
Set<DataObject> nodes = browser.getOriginal();
if (nodes != null && nodes.size() > 0) {
model.fireFilteringByAnnotated(TextualAnnotationData.class,
commented, nodes);
fireStateChange();
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#filterByROIs(boolean)
*/
public void filterByROIs(boolean hasROIs)
{
if (model.getState() == FILTERING) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Filtering", FILTERING_MSG);
return;
}
Browser browser = model.getBrowser();
Set<DataObject> nodes = browser.getOriginal();
if (!CollectionUtils.isEmpty(nodes)) {
FilterContext context = new FilterContext();
if(hasROIs) {
context.setRois(FilterContext.GREATER_EQUAL, 1);
}
else {
context.setRois(FilterContext.EQUAL, 0);
}
model.fireFilteringByContext(context, nodes);
fireStateChange();
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setComponentTitle(String)
*/
public void setComponentTitle(String title)
{
Browser browser = model.getBrowser();
if (browser != null) browser.setComponentTitle(title);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#viewField(int)
*/
public void viewField(int selectedIndex)
{
if (!(model instanceof WellsModel)) return;
//quietly save the field back to the server.
((WellsModel) model).viewField(selectedIndex);
view.viewField();
view.repaint();
model.loadData(false, null);
fireStateChange();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setSelectedCell(CellDisplay)
*/
public void setSelectedCell(CellDisplay cell)
{
if (cell == null) return;
if (!(model instanceof WellsModel)) return;
//quietly save the description of the well and the color.
((WellsModel) model).setSelectedCell(cell);
view.repaint();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#saveThumbnails(File)
*/
public void saveThumbnails(File file)
{
if (!isImagesModel() || file == null) return;
Browser browser = model.getBrowser();
List<ImageNode> l = browser.getVisibleImageNodes();
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
if (l == null || l.size() == 0) {
un.notifyInfo("Save Thumbnails", "No images to save");
return;
}
List<ImageNode> nodes = model.sortCollection(l);
Iterator<ImageNode> i = nodes.iterator();
ImageNode node;
try {
ExcelWriter writer = new ExcelWriter(file.getAbsolutePath());
writer.openFile();
writer.createSheet("Thumbnails");
// ready to build report
BufferedImage thumbnail;
int n = browser.getSelectedLayout().getImagesPerRow();
int row = 0;
int col = 0;
int w = ThumbnailProvider.THUMB_MAX_WIDTH;
int h = ThumbnailProvider.THUMB_MAX_HEIGHT;
int count = 0;
String imageName;
while (i.hasNext()) {
node = i.next();
imageName = node.toString();
thumbnail = node.getThumbnail().getFullScaleThumb();
writer.addImageToWorkbook(imageName, thumbnail);
writer.writeImage(row, col, w, h, imageName);
writer.writeElement(row+6, col, imageName);
if (count < n) {
col = col+4;
} else {
col = 0;
count = -1;
row = row+7;
}
count++;
}
writer.createSheet("Legend");
i = nodes.iterator();
row = 0;
col = 0;
writer.setCellStyle(row, col, row, col+1, ExcelWriter.BOLD_DEFAULT);
writer.writeElement(row, col, "id");
writer.writeElement(row, col+1, "name");
row++;
while (i.hasNext()) {
node = i.next();
imageName = node.toString();
writer.writeElement(row, col, (
(DataObject) node.getHierarchyObject()).getId());
writer.writeElement(row, col+1, imageName);
row++;
}
writer.close();
} catch (Exception e) {
Logger logger = DataBrowserAgent.getRegistry().getLogger();
LogMessage msg = new LogMessage();
msg.print("Error while saving.");
msg.print(e);
logger.error(this, msg);
un.notifyInfo("Save Thumbnails",
"An error occurs while saving the file.");
return;
}
un.notifyInfo("Save Thumbnails",
"The thumbnails have been save to:\n"+file.getAbsolutePath());
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#isImagesModel()
*/
public boolean isImagesModel()
{
if (model.getState() == DISCARDED) return false;
return model.isImagesModel();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setReportData(Collection, List, String)
*/
public void setReportData(Map<ImageNode, StructuredDataResults> data,
List<Class> types, String name)
{
if (data == null || data.size() == 0) return;
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
//tags for now
List sorted = model.sortCollection(data.keySet());
Iterator<ImageNode> i = sorted.iterator();
ImageNode node;
Map<Long, List> tagImageMap = new HashMap<Long, List>();
Map<Long, TagAnnotationData>
tagMap = new HashMap<Long, TagAnnotationData>();
StructuredDataResults r;
Collection l;
Iterator k;
TagAnnotationData tag;
long id;
List nodes;
Map<Object, Integer> rowImage = new HashMap<Object, Integer>();
try {
ExcelWriter writer = new ExcelWriter(name);
writer.openFile();
writer.createSheet("Tags");
//write tags
String imageName;
int col = 0;
int row = 0;
writer.setCellStyle(row, col, row, col+1, ExcelWriter.BOLD_DEFAULT);
writer.writeElement(row, col, "id");
writer.writeElement(row, col+1, "name");
row++;
while (i.hasNext()) {
node = i.next();
imageName = node.toString();
rowImage.put(node.getHierarchyObject(), row);
writer.writeElement(row, col, (
(DataObject) node.getHierarchyObject()).getId());
writer.writeElement(row, col+1, imageName);
row++;
r = data.get(node);
l = r.getTags();
if (l != null) {
k = l.iterator();
while (k.hasNext()) {
tag = (TagAnnotationData) k.next();
id = tag.getId();
nodes = tagImageMap.get(id);
if (!tagMap.containsKey(id))
tagMap.put(id, tag);
if (nodes == null) {
nodes = new ArrayList();
tagImageMap.put(id, nodes);
}
nodes.add(node.getHierarchyObject());
}
}
}
col = 2;
row = 0;
List sortedTags = model.sortCollection(tagMap.keySet());
k = sortedTags.iterator();
Object object;
int value;
int numberOfImages = data.size();
int count;
while (k.hasNext()) {
row = 0;
count = 0;
id = (Long) k.next();
tag = tagMap.get(id);
writer.setCellStyle(row, col, ExcelWriter.BOLD_DEFAULT);
writer.writeElement(row, col, tag.getTagValue());
nodes = tagImageMap.get(id);
i = data.keySet().iterator();
while (i.hasNext()) {
count++;
node = i.next();
object = node.getHierarchyObject();
row = rowImage.get(object);
value = 0;
if (nodes.contains(object)) value = 1;
writer.setCellStyle(row, col, ExcelWriter.INTEGER);
writer.writeElement(row, col, value);
}
writer.setCellStyle(count+1, col,
ExcelWriter.CELLBORDER_TOPLINE);
writer.setCellStyle(row, col, ExcelWriter.INTEGER);
writer.writeElement(count+1, col, nodes.size());
writer.setCellStyle(count+2, col,
ExcelWriter.TWODECIMALPOINTS);
double v = (double) nodes.size()/numberOfImages;
writer.writeElement(count+2, col,
UIUtilities.formatToDecimal(v*100)+"%");
col++;
}
writer.sizeAllColumnsToFit();
//second sheet
writer.createSheet("Thumbnails");
i = sorted.iterator();
//ready to build report
BufferedImage thumbnail;
int n = model.getBrowser().getSelectedLayout().getImagesPerRow();
row = 0;
col = 0;
int w = ThumbnailProvider.THUMB_MAX_WIDTH/2;
int h = ThumbnailProvider.THUMB_MAX_HEIGHT/2;
count = 0;
while (i.hasNext()) {
node = i.next();
id = ((DataObject) node.getHierarchyObject()).getId();
imageName = node.toString();
thumbnail = node.getThumbnail().getFullScaleThumb();
writer.addImageToWorkbook(imageName, thumbnail);
writer.writeImage(row, col, w, h, imageName);
writer.writeElement(row+3, col, id);
if (count < n) {
col++;
} else {
col = 0;
row = row+4;
}
count++;
}
writer.close();
un.notifyInfo("Report",
"The report has been successfully created.");
} catch (Exception e) {
Logger logger = DataBrowserAgent.getRegistry().getLogger();
LogMessage msg = new LogMessage();
msg.print("Error while writing report.");
msg.print(e);
logger.error(this, msg);
un.notifyInfo("Report",
"An error occurs while creating the report.");
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#createReport(String)
*/
public void createReport(String name)
{
Browser browser = model.getBrowser();
List<ImageNode> nodes = browser.getVisibleImageNodes();
if (nodes == null || nodes.size() == 0) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Create Report", "No images displayed");
return;
}
List<Class> types = new ArrayList<Class>();
model.fireReportLoading(nodes, types, name);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#hasRndSettings()
*/
public boolean hasRndSettings()
{
return DataBrowserFactory.hasRndSettingsToCopy();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#areSettingsCompatible(long)
*/
public boolean areSettingsCompatible(long groupID)
{
return DataBrowserFactory.areSettingsCompatible(groupID);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#hasDataToCopy()
*/
public Class hasDataToCopy()
{
return DataBrowserFactory.hasDataToCopy();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#showTagWizard()
*/
public void showTagWizard()
{
firePropertyChange(TAG_WIZARD_PROPERTY, Boolean.FALSE, Boolean.TRUE);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#loadExistingDatasets()
*/
public void loadExistingDatasets()
{
if (model.getExistingDatasets() == null) {
model.fireExisitingDatasetsLoading();
} else showExistingDatasets();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setExistingDatasets(Collection)
*/
public void setExistingDatasets(Collection result)
{
model.setExistingDatasets(result);
showExistingDatasets();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#addToDatasets(Collection)
*/
public void addToDatasets(Collection selected)
{
if (selected == null || selected.size() == 0) return;
Browser browser = model.getBrowser();
Collection images;
Collection set = browser.getSelectedDisplays();
if (set != null && set.size() > 0) {
images = new HashSet();
Iterator i = set.iterator();
ImageDisplay display;
Object ho;
while (i.hasNext()) {
display = (ImageDisplay) i.next();
ho = display.getHierarchyObject();
if (ho instanceof ImageData) {
images.add(ho);
}
}
} else {
images = browser.getVisibleImages();
}
if (images == null || images.size() == 0) {
UserNotifier un = DataBrowserAgent.getRegistry().getUserNotifier();
un.notifyInfo("Dataset Creation", "No images selected");
return;
}
model.fireDataSaving(selected, images);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#refresh()
*/
public void refresh()
{
firePropertyChange(ADDED_TO_DATA_OBJECT_PROPERTY,
Boolean.valueOf(false), Boolean.valueOf(true));
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#displayFieldsView()
*/
public void displayFieldsView()
{
if (!(model instanceof WellsModel)) return;
int index = view.getSelectedView();
if (index == DataBrowserUI.FIELDS_VIEW) {
view.setSelectedView(DataBrowserUI.THUMB_VIEW);
view.setFieldsStatus(false);
model.cancelFieldsLoading();
} else if (index == DataBrowserUI.THUMB_VIEW) {
view.setSelectedView(DataBrowserUI.FIELDS_VIEW);
WellsModel wm = (WellsModel) model;
WellImageSet node = wm.getSelectedWell();
if (node != null)
viewFieldsFor(node.getRow(), node.getColumn(), false);
}
fireStateChange();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#viewFieldsFor(int, int, boolean)
*/
public void viewFieldsFor(int row, int column, boolean multiSelection)
{
if (!(model instanceof WellsModel)) return;
//depends on the view.
WellsModel wm = (WellsModel) model;
if (wm.getSelectedWell() == null)
return;
int index = view.getSelectedView();
if (index == DataBrowserUI.FIELDS_VIEW) {
if (!model.loadFields(row, column)) {
view.displayFields(wm.getSelectedWell().getWellSamples());
} else {
view.setFieldsStatus(true);
fireStateChange();
}
} else if (index == DataBrowserUI.THUMB_VIEW) {
WellImageSet well = wm.getWell(row, column);
if (well != null && well.isSampleValid()) {
model.getBrowser().setSelectedDisplay(
well.getSelectedWellSample(), multiSelection, false);
setSelectedDisplay(well.getSelectedWellSample());
}
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setThumbnailsFieldsFor(List, int, int)
*/
public void setThumbnailsFieldsFor(List list, int row, int column)
{
if (!(model instanceof WellsModel)) return;
WellsModel wm = (WellsModel) model;
if (!wm.isSameWell(row, column)) return;
WellImageSet well = wm.getSelectedWell();
if (well == null)
return;
List<WellSampleNode> nodes = well.getWellSamples();
Iterator<WellSampleNode> j = nodes.iterator();
WellSampleNode n;
Map<Long, WellSampleNode> map = new HashMap<Long, WellSampleNode>();
WellSampleData data;
while (j.hasNext()) {
n = j.next();
data = (WellSampleData) n.getHierarchyObject();
if (data.getId() > 0) {
map.put(data.getImage().getId(), n);
}
}
//Check the data.
Iterator i = list.iterator();
ThumbnailData td;
Thumbnail thumb;
while (i.hasNext()) {
td = (ThumbnailData) i.next();
n = map.get(td.getImageID());
if (n != null) {
thumb = n.getThumbnail();
thumb.setFullScaleThumb(td.getThumbnail());
thumb.setValid(true);
}
}
view.displayFields(nodes);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#openWith(ApplicationData)
*/
public void openWith(ApplicationData data)
{
firePropertyChange(OPEN_EXTERNAL_APPLICATION_PROPERTY, new Object(),
data);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setExperimenter(ExperimenterData)
*/
public void setExperimenter(ExperimenterData exp)
{
model.setExperimenter(exp);
view.onExperimenterSet();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#getGridUI()
*/
public PlateGridUI getGridUI() { return view.getGridUI(); }
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#getParentOfNodes()
*/
public Object getParentOfNodes() { return model.getParent(); }
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setTabularData(List)
*/
public void setTabularData(List<TableResult> data)
{
if (data == null || data.size() == 0) return;
model.setTabularData(data);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#layoutDisplay()
*/
public void layoutDisplay()
{
if (model instanceof WellsModel) return;
model.layoutBrowser(model.getLayoutIndex());
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#viewDisplay(ImageDisplay, boolean)
*/
public void viewDisplay(ImageDisplay node, boolean internal)
{
if (!(node instanceof ImageNode)) return;
EventBus bus = DataBrowserAgent.getRegistry().getEventBus();
DataObject data = null;
Object uo = node.getHierarchyObject();
Object go;
ViewImageObject object;
if (uo instanceof ImageData) {
if (model instanceof SearchModel || model instanceof AdvancedResultSearchModel) {
ImageData img = (ImageData) uo;
SecurityContext ctx = new SecurityContext(img.getGroupId());
object = new ViewImageObject(img);
go = view.getParentOfNodes();
if (go instanceof DataObject)
data = (DataObject) go;
object.setContext(data, null);
if (DataBrowserAgent.runAsPlugin() == LookupNames.IMAGE_J) {
ViewInPluginEvent evt = new ViewInPluginEvent(ctx,
img, LookupNames.IMAGE_J);
bus.post(evt);
} else {
bus.post(new LaunchViewer(ctx, object));
}
} else {
if (internal)
firePropertyChange(INTERNAL_VIEW_NODE_PROPERTY, null, uo);
else firePropertyChange(VIEW_IMAGE_NODE_PROPERTY, null, uo);
}
} else if (uo instanceof WellSampleData) {
WellSampleData wellSample = (WellSampleData) uo;
object = new ViewImageObject(wellSample);
WellSampleNode wsn = (WellSampleNode) node;
Object parent = wsn.getParentObject();
if (parent instanceof DataObject) {
go = view.getGrandParentOfNodes();
if (go instanceof DataObject)
data = (DataObject) go;
object.setContext((DataObject) parent, data);
}
if (DataBrowserAgent.runAsPlugin() == LookupNames.IMAGE_J) {
ViewInPluginEvent evt = new ViewInPluginEvent(
model.getSecurityContext(),
wellSample.getImage(), LookupNames.IMAGE_J);
bus.post(evt);
} else {
bus.post(new LaunchViewer(model.getSecurityContext(), object));
}
}
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#getSecurityContext()
*/
public SecurityContext getSecurityContext()
{
return model.getSecurityContext();
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#getDisplayMode()
*/
public int getDisplayMode() { return model.getDisplayMode(); }
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#setDisplayMode(int)
*/
public void setDisplayMode(int displayMode)
{
model.setDisplayMode(displayMode);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#getType()
*/
public int getType() { return model.getType(); }
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#getType()
*/
public void activateUser(ExperimenterData exp)
{
firePropertyChange(ACTIVATE_USER_PROPERTY, null, exp);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#isSystemUser(long)
*/
public boolean isSystemUser(long userID)
{
return model.isSystemUser(userID);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#isSystemUser(long, String)
*/
public boolean isSystemUser(long userID, String key)
{
return model.isSystemUser(userID, key);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#isSystemGroup(long, String)
*/
public boolean isSystemGroup(long groupID, String key)
{
return model.isSystemGroup(groupID, key);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#resetPassword()
*/
public void resetPassword()
{
firePropertyChange(RESET_PASSWORD_PROPERTY, Boolean.FALSE,
Boolean.TRUE);
}
/**
* Implemented as specified by the {@link DataBrowser} interface.
* @see DataBrowser#getCurrentUser()
*/
public ExperimenterData getCurrentUser()
{
return model.getCurrentUser();
}
/**
* Overridden to return the name of the instance to save.
* @see #toString()
*/
public String toString() { return ""+model.getType(); }
}