/*
*------------------------------------------------------------------------------
* 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.BorderLayout;
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.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import org.apache.commons.collections.CollectionUtils;
import org.jdesktop.swingx.JXTaskPane;
import org.openmicroscopy.shoola.agents.metadata.util.AnalysisResultsItem;
import org.openmicroscopy.shoola.agents.metadata.util.DataToSave;
import org.openmicroscopy.shoola.agents.metadata.view.MetadataViewer;
import org.openmicroscopy.shoola.agents.util.ui.PermissionMenu;
import org.openmicroscopy.shoola.env.data.model.AdminObject;
import org.openmicroscopy.shoola.env.data.model.DiskQuota;
import org.openmicroscopy.shoola.env.data.model.ScriptObject;
import org.openmicroscopy.shoola.util.ui.MessageBox;
import org.openmicroscopy.shoola.util.ui.UIUtilities;
import omero.gateway.model.AnnotationData;
import omero.gateway.model.BooleanAnnotationData;
import omero.gateway.model.DataObject;
import omero.gateway.model.DoubleAnnotationData;
import omero.gateway.model.ExperimenterData;
import omero.gateway.model.FileAnnotationData;
import omero.gateway.model.FilesetData;
import omero.gateway.model.GroupData;
import omero.gateway.model.ImageData;
import omero.gateway.model.LongAnnotationData;
import omero.gateway.model.TagAnnotationData;
import omero.gateway.model.TermAnnotationData;
import omero.gateway.model.TextualAnnotationData;
import omero.gateway.model.WellSampleData;
import omero.gateway.model.XMLAnnotationData;
/**
* Component hosting the various {@link AnnotationUI} entities.
*
* @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 EditorUI
extends JPanel
{
/** Identifies the collection of data to add. */
static final int TO_ADD = 0;
/** Identifies the collection of data to remove. */
static final int TO_REMOVE = 1;
/** Identifies the collection of data to delete. */
static final int TO_DELETE = 2;
/** Identifies the general component of the tab pane. */
static final int GENERAL_INDEX = 0;
/** Identifies the acquisition component of the tab pane. */
static final int ACQUISITION_INDEX = 1;
/** Identifies the rendering component of the tab pane. */
static final int RND_INDEX = 2;
/** The name of the tab pane. */
private static final String RENDERER_NAME = "Preview";
/** The description of the tab pane. */
private static final String RENDERER_DESCRIPTION =
"Preview the image";
/** The name of the tab pane. */
private static final String RENDERER_NAME_SPECIFIC = "Settings";
/** The description of the tab pane. */
private static final String RENDERER_DESCRIPTION_SPECIFIC =
"Adjust the rendering settings";
/** Reference to the controller. */
private EditorControl controller;
/** Reference to the Model. */
private EditorModel model;
/** The UI component displaying the general metadata. */
private GeneralPaneUI generalPane;
/** The UI component displaying the acquisition metadata. */
private AcquisitionDataUI acquisitionPane;
/** The UI component displaying the user's information. */
private UserUI userUI;
/** The UI component displaying the group's information. */
private GroupProfile groupUI;
/** The tool bar with various controls. */
private ToolBar toolBar;
/** The tab pane hosting the metadata. */
private JTabbedPane tabPane;
/** The tab pane hosting the user's information. */
private JComponent userTabbedPane;
/** The tab pane hosting the group's information. */
private JComponent groupTabbedPane;
/** The component currently displayed.. */
private JComponent component;
/** The default component. */
private JPanel defaultPane;
/** The dummy panel displayed instead of the rendering component. */
private JPanel dummyPanel;
/** The menu showing the option to remove tags.*/
private PermissionMenu tagMenu;
/** The menu showing the option to remove attachments.*/
private PermissionMenu docMenu;
/** The menu showing the option to remove the other annotation.*/
private PermissionMenu otherAnnotationMenu;
/**
* Adds the renderer to the tab pane.
*
* @param init Pass <code>true</code> if it is invoked at initialization
* time, <code>false</code> otherwise.
*/
private void populateTabbedPane(boolean init)
{
addTab("General", generalPane, "General Information.");
addTab("Acquisition", acquisitionPane, "Acquisition Metadata.");
if (init) {
if (model.getRndIndex() == MetadataViewer.RND_SPECIFIC) {
addTab(RENDERER_NAME_SPECIFIC, dummyPanel,
RENDERER_DESCRIPTION_SPECIFIC);
} else {
addTab(RENDERER_NAME, dummyPanel,
RENDERER_DESCRIPTION);
}
}
}
/**
* Adds a component to the tabPane wrapped inside a JScrollPane
* @param title The title of the tab
* @param comp The component
* @param desc The description of (i. e. tooltip for) the tap
*/
private void addTab(String title, Component comp, String desc) {
JScrollPane sp = new JScrollPane(comp);
sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
tabPane.addTab(title, null, sp, desc);
}
/** Initializes the UI components. */
private void initComponents()
{
dummyPanel = new JPanel();
groupUI = new GroupProfile(model, this);
groupUI.addPropertyChangeListener(controller);
userUI = new UserUI(model, controller, this);
toolBar = new ToolBar(model, controller);
generalPane = new GeneralPaneUI(this, model, controller, toolBar);
acquisitionPane = new AcquisitionDataUI(this, model, controller);
tabPane = new JTabbedPane();
tabPane.addChangeListener(controller);
tabPane.setBackground(UIUtilities.BACKGROUND_COLOR);
populateTabbedPane(true);
tabPane.setEnabledAt(ACQUISITION_INDEX, false);
defaultPane = new JPanel();
defaultPane.setBackground(UIUtilities.BACKGROUND_COLOR);
component = defaultPane;
userTabbedPane = new JScrollPane(userUI);
groupTabbedPane = new JScrollPane(groupUI);
}
/** Builds and lays out the components. */
private void buildGUI()
{
setLayout(new BorderLayout(0, 0));
setBackground(UIUtilities.BACKGROUND_COLOR);
//add(toolBar, BorderLayout.NORTH);
add(component, BorderLayout.CENTER);
}
/** Creates a new instance. */
EditorUI() {}
/**
* Links this View to its Controller and its Model.
*
* @param model Reference to the Model.
* Mustn't be <code>null</code>.
* @param controller Reference to the Controller.
* Mustn't be <code>null</code>.
*/
void initialize(EditorModel model, EditorControl controller)
{
if (controller == null)
throw new IllegalArgumentException("Controller cannot be null");
if (model == null)
throw new IllegalArgumentException("Model cannot be null");
this.controller = controller;
this.model = model;
initComponents();
buildGUI();
}
/** Lays out the UI when data are loaded. */
void layoutUI()
{
Object uo = model.getRefObject();
remove(component);
if (uo instanceof ExperimenterData) {
toolBar.buildUI();
userUI.buildUI();
userUI.repaint();
component = userTabbedPane;
} else if (uo instanceof GroupData) {
toolBar.buildUI();
groupUI.buildUI();
groupUI.repaint();
component = groupTabbedPane;
} else if (!(uo instanceof DataObject)) {
toolBar.buildUI();
component = defaultPane;
} else {
toolBar.buildUI();
generalPane.layoutUI();
acquisitionPane.layoutCompanionFiles();
component = tabPane;
if (model.isMultiSelection()) {
tabPane.setSelectedIndex(GENERAL_INDEX);
tabPane.setEnabledAt(ACQUISITION_INDEX, false);
tabPane.setEnabledAt(RND_INDEX, false);
}
}
add(component, BorderLayout.CENTER);
validate();
repaint();
}
/** Updates display when the parent of the root node is set. */
void setParentRootObject()
{
generalPane.setParentRootObject();
userUI.setParentRootObject();
}
/** Resets the selected tab when an image or well sample is selected.*/
void handleImageSelection()
{
ImageData img = model.getImage();
if (img == null) return;
boolean multi = model.isMultiSelection();
boolean preview = model.isPreviewAvailable();
tabPane.setEnabledAt(RND_INDEX, preview && !multi);
tabPane.setEnabledAt(ACQUISITION_INDEX, !multi && img.getId() > 0);
if (!preview) {
tabPane.setToolTipTextAt(RND_INDEX,
"Only available for non big images.");
}
if (getSelectedTab() == RND_INDEX) {
tabPane.setComponentAt(RND_INDEX, dummyPanel);
if (!preview &&
model.getRndIndex() !=
MetadataViewer.RND_SPECIFIC)
tabPane.setSelectedIndex(GENERAL_INDEX);
}
}
/**
* Updates display when the new root node is set.
*
* @param oldObject The previously selected object.
*/
void setRootObject(Object oldObject)
{
Object uo = model.getRefObject();
tabPane.setComponentAt(RND_INDEX, dummyPanel);
toolBar.buildUI();
tabPane.setToolTipTextAt(RND_INDEX, RENDERER_DESCRIPTION);
if (!(uo instanceof DataObject)) {
toolBar.setStatus(false);
toolBar.buildUI();
remove(component);
component = defaultPane;
add(component, BorderLayout.CENTER);
revalidate();
repaint();
} else if (uo instanceof ExperimenterData) {
userUI.clearData(oldObject);
toolBar.setStatus(false);
layoutUI();
} else if (uo instanceof GroupData) {
groupUI.clearData(oldObject);
toolBar.setStatus(false);
layoutUI();
} else {
boolean load = false;
if (model.isMultiSelection()) {
tabPane.setSelectedIndex(GENERAL_INDEX);
tabPane.setEnabledAt(ACQUISITION_INDEX, false);
tabPane.setEnabledAt(RND_INDEX, false);
} else {
if (uo instanceof ImageData || uo instanceof WellSampleData) {
handleImageSelection();
} else {
tabPane.setSelectedIndex(GENERAL_INDEX);
tabPane.setEnabledAt(ACQUISITION_INDEX, false);
tabPane.setEnabledAt(RND_INDEX, false);
}
load = true;
}
generalPane.setRootObject(oldObject);
acquisitionPane.setRootObject(load);
}
}
/**
* Save data.
*
* @param asynch Pass <code>true</code> to save data asynchronously,
* <code>false</code> otherwise.
*/
void saveData(boolean async)
{
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
if (model.getRefObject() instanceof ExperimenterData) {
Object exp = userUI.getExperimenterToSave();
model.fireAdminSaving(exp, async);
return;
} else if (model.getRefObject() instanceof GroupData) {
AdminObject o = groupUI.getAdminObject();
if (o == null) {
setCursor(Cursor.getDefaultCursor());
return;
}
model.fireAdminSaving(o, async);
return;
}
DataToSave object = generalPane.prepareDataToSave();
List<Object> metadata = null;
Object refObject = model.getRefObject();
if (refObject instanceof ImageData)
metadata = acquisitionPane.prepareDataToSave();
model.fireAnnotationSaving(object, metadata, async);
}
/** Shows the image's info. */
void showChannelData()
{
generalPane.setChannelData();
acquisitionPane.setChannelData();
}
/**
* Returns <code>true</code> if data to save, <code>false</code>
* otherwise.
*
* @return See above.
*/
boolean hasDataToSave()
{
Object ref = model.getRefObject();
if (!(ref instanceof DataObject)) return false;
if (ref instanceof ExperimenterData)
return userUI.hasDataToSave();
else if (ref instanceof GroupData)
return groupUI.hasDataToSave();
boolean b = generalPane.hasDataToSave();
if (b) return b;
//Check metadata.
return acquisitionPane.hasDataToSave();
}
/** Clears data to save. */
void clearData()
{
userUI.clearData(null);
groupUI.clearData(null);
generalPane.clearData(null);
tabPane.setComponentAt(RND_INDEX, dummyPanel);
tabPane.repaint();
setCursor(Cursor.getDefaultCursor());
}
/** Clears the password fields. */
void passwordChanged() { userUI.passwordChanged(); }
/**
* Sets the disk space information.
*
* @param quota The value to set.
*/
void setDiskSpace(DiskQuota quota) { userUI.setDiskSpace(quota); }
/**
* Handles the expansion or collapsing of the passed component.
*
* @param source The component to handle.
*/
void handleTaskPaneCollapsed(JXTaskPane source)
{
generalPane.handleTaskPaneCollapsed(source);
}
/**
* Shows or hides the component indicating the progress.
*
* @param busy Pass <code>true</code> to show, <code>false</code> to hide.
*/
void setStatus(boolean busy) { toolBar.setStatus(busy); }
/**
* Returns the collection of existing tags.
*
* @return See above.
*/
Collection getExistingTags() { return model.getExistingTags(); }
/**
* Attaches the specified files.
*
* @param files The files to attach.
* @return See above
*/
void attachFiles(File[] files)
{
if (files == null || files.length == 0) return;
generalPane.attachFiles(files);
saveData(true);
}
/**
* Removes the object.
*
* @param data The data to remove.
*/
void removeObject(DataObject data)
{
if (data == null) return;
if (data instanceof TagAnnotationData ||
data instanceof TextualAnnotationData ||
data instanceof TermAnnotationData ||
data instanceof XMLAnnotationData ||
data instanceof DoubleAnnotationData ||
data instanceof LongAnnotationData ||
data instanceof BooleanAnnotationData) {
generalPane.removeAnnotation((AnnotationData)data);
if (data.getId() >= 0)
saveData(true);
}
}
/**
* Removes the links, tags attachments.
*
* @param level One of the constants defined by this class.
*/
private void removeLinks(int level, Collection l)
{
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Iterator<AnnotationData> i = l.iterator();
AnnotationData o;
List<Object> toRemove = new ArrayList<Object>();
List<Object> links;
while (i.hasNext()) {
o = i.next();
links = model.getLinks(level, o);
if (links != null)
{
toRemove.addAll(links);
}
}
DataToSave object = new DataToSave(new ArrayList<AnnotationData>(),
toRemove);
model.fireAnnotationSaving(object, null, true);
}
/**
* Removes the tags.
*
* @param src The mouse clicked location.
* @param location The location of the mouse pressed.
*/
void removeTags(JComponent src, Point location)
{
if (!generalPane.hasTagsToUnlink()) return;
if (model.isGroupLeader() || model.isAdministrator()) {
if (tagMenu == null) {
tagMenu = new PermissionMenu(PermissionMenu.REMOVE, "Tags");
tagMenu.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
String n = evt.getPropertyName();
if (PermissionMenu.SELECTED_LEVEL_PROPERTY.equals(n)) {
removeLinks((Integer) evt.getNewValue(),
model.getAllTags());
}
}
});
}
tagMenu.show(src, location.x, location.y);
return;
}
SwingUtilities.convertPointToScreen(location, src);
MessageBox box = new MessageBox(model.getRefFrame(),
"Remove All Your Tags",
"Are you sure you want to remove all your Tags?");
Dimension d = box.getPreferredSize();
Point p = new Point(location.x-d.width/2, location.y);
if (box.showMsgBox(p) == MessageBox.YES_OPTION) {
List<TagAnnotationData> list = generalPane.removeTags();
if (list.size() > 0) saveData(true);
}
}
/**
* Removes the other annotations.
*
* @param src The mouse clicked location.
* @param location The location of the mouse pressed.
*/
void removeOtherAnnotations(JComponent src, Point location)
{
if (!generalPane.hasOtherAnnotationsToUnlink()) return;
if (model.isGroupLeader() || model.isAdministrator()) {
if (otherAnnotationMenu == null) {
otherAnnotationMenu = new PermissionMenu(PermissionMenu.REMOVE,
"Other annotations");
otherAnnotationMenu.addPropertyChangeListener(
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
String n = evt.getPropertyName();
if (PermissionMenu.SELECTED_LEVEL_PROPERTY.equals(n)) {
removeLinks((Integer) evt.getNewValue(),
model.getAllOtherAnnotations());
}
}
});
}
otherAnnotationMenu.show(src, location.x, location.y);
return;
}
SwingUtilities.convertPointToScreen(location, src);
MessageBox box = new MessageBox(model.getRefFrame(),
"Remove All Your Other Annotations",
"Are you sure you want to remove all your other annotations?");
Dimension d = box.getPreferredSize();
Point p = new Point(location.x-d.width/2, location.y);
if (box.showMsgBox(p) == MessageBox.YES_OPTION) {
List<AnnotationData> list = generalPane.removeOtherAnnotations();
if (list.size() > 0) saveData(true);
}
}
/**
* Handles the selection of objects via the selection wizard.
*
* @param type The type of objects to handle.
* @param objects The objects to handle.
*/
void handleObjectsSelection(Class<?> type, Collection objects)
{
if (objects == null) return;
List<Object> selection = new ArrayList<Object>();
if (CollectionUtils.isNotEmpty(objects)) {
selection.addAll(objects);
}
AnnotationData data;
if (TagAnnotationData.class.equals(type)) {
Collection<TagAnnotationData> l = model.getCommonTags();
if (CollectionUtils.isNotEmpty(l)) {
Iterator<TagAnnotationData> k = l.iterator();
while (k.hasNext()) {
data = k.next();
if (!model.isAnnotationUsedByUser(data)) {
selection.add(data);
}
}
}
} else if (FileAnnotationData.class.equals(type)) {
Collection<FileAnnotationData> l = model.getCommonAttachments();
if (CollectionUtils.isNotEmpty(l)) {
Iterator<FileAnnotationData> k = l.iterator();
while (k.hasNext()) {
data = k.next();
if (!model.isAnnotationUsedByUser(data)) {
selection.add(data);
}
}
}
}
generalPane.handleObjectsSelection(type, selection);
saveData(true);
}
/**
* Removes the attached file.
*
* @param file The file to remove.
*/
void unlinkAttachedFile(Object file)
{
if (file == null) return;
generalPane.removeAttachedFile(file);
if (file instanceof FileAnnotationData) {
FileAnnotationData fa = (FileAnnotationData) file;
if (fa.getId() >= 0) saveData(true);
}
}
/**
* Returns the collection of attachments.
*
* @param src The source of the mouse pressed.
* @param location The location of the mouse pressed.
*/
void removeAttachedFiles(Component src, Point location)
{
if (!generalPane.hasAttachmentsToUnlink()) return;
if (model.isAdministrator() || model.isGroupLeader()) {
if (docMenu == null) {
docMenu = new PermissionMenu(PermissionMenu.REMOVE,
"Attachments");
docMenu.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
String n = evt.getPropertyName();
if (PermissionMenu.SELECTED_LEVEL_PROPERTY.equals(n)) {
List<FileAnnotationData> toRemove = model.getFileAnnotatationsByLevel((Integer) evt.getNewValue());
model.fireFileAnnotationRemoveCheck(toRemove);
}
}
});
}
docMenu.show(src, location.x, location.y);
return;
}
SwingUtilities.convertPointToScreen(location, src);
MessageBox box = new MessageBox(model.getRefFrame(),
"Remove All Attachments",
"Are you sure you want to remove all Attachments?");
Dimension d = box.getPreferredSize();
Point p = new Point(location.x-d.width/2, location.y);
if (box.showMsgBox(p) == MessageBox.YES_OPTION) {
List<FileAnnotationData> list = generalPane.removeAttachedFiles();
if (list.size() > 0)
model.fireFileAnnotationRemoveCheck(list);
}
}
/**
* Adds the annotation to the collection of objects to be deleted.
*
* @param annotation The value to add.
*/
void deleteAnnotation(AnnotationData annotation)
{
model.deleteAnnotation(annotation);
}
/**
* Starts an asynchronous call to delete the annotations.
*
* @param annotations The annotations to delete.
*/
void fireAnnotationsDeletion(List<FileAnnotationData> annotations)
{
if (annotations == null || annotations.size() == 0) return;
List<AnnotationData> l = new ArrayList<AnnotationData>();
l.addAll(annotations);
model.fireAnnotationsDeletion(l);
}
/** Sets the image acquisition metadata. */
void setImageAcquisitionData()
{
acquisitionPane.setImageAcquisitionData();
}
/**
* Sets the acquisition data for the passed channel.
*
* @param index The index of the channel.
*/
void setChannelAcquisitionData(int index)
{
acquisitionPane.setChannelAcquisitionData(index);
}
/**
* Sets the plane info for the specified channel.
*
* @param index The index of the channel.
*/
void setPlaneInfo(int index)
{
acquisitionPane.setPlaneInfo(index);
}
/**
* Returns <code>true</code> if the display is for a single
* object, <code>false</code> otherwise.
*
* @return See above.
*/
boolean isSingleMode() { return model.isSingleMode(); }
/**
* Brings up the dialog to create a movie.
*
* @param scaleBar The value of the scale bar.
* If not greater than <code>0</code>, the value is not
* taken into account.
* @param overlayColor The color of the scale bar and text.
*/
void makeMovie(int scaleBar, Color overlayColor)
{
model.makeMovie(scaleBar, overlayColor);
}
/** Sets the renderer. */
void setRenderer()
{
tabPane.removeAll();
populateTabbedPane(false);
if (model.getRndIndex() == MetadataViewer.RND_SPECIFIC) {
addTab(RENDERER_NAME_SPECIFIC,
model.getRenderer().getUI(),
RENDERER_DESCRIPTION_SPECIFIC);
} else {
addTab(RENDERER_NAME,
model.getRenderer().getUI(),
RENDERER_DESCRIPTION);
}
setSelectedTab(RND_INDEX);
model.getRenderer().renderPreview();
}
/**
* Returns the rendering constants.
*
* @return See above.
*/
int getRndIndex() { return model.getRndIndex(); }
/**
* Sets the selected tab.
*
* @param index The index of the tab to select.
*/
void setSelectedTab(int index)
{
tabPane.removeChangeListener(controller);
switch (index) {
case GENERAL_INDEX:
case ACQUISITION_INDEX:
case RND_INDEX:
tabPane.setSelectedIndex(index);
}
tabPane.addChangeListener(controller);
}
/**
* Analyzes the data.
*
* @param index The index identifying the analysis to perform.
*/
void analyse(int index) { model.analyse(index); }
/** Sets the instrument and its components. */
void setInstrumentData() { acquisitionPane.setInstrumentData(); }
/**
* Returns the index of the selected tab.
*
* @return See above.
*/
int getSelectedTab() { return tabPane.getSelectedIndex(); }
/**
* Indicates that the color of the passed channel has changed.
*
* @param index The index of the channel.
*/
void onChannelColorChanged(int index)
{
acquisitionPane.onChannelColorChanged(index);
}
/**
* Returns the name of the object if any.
*
* @return See above.
*/
String getRefObjectName() { return model.getRefObjectName(); }
/**
* Returns the object of reference.
*
* @return See above.
*/
Object getRefObject() { return model.getRefObject(); }
/** Cleans up the view or adds the components
*
* @param cleanup Pass <code>true</code> to clean up, <code>false</code>
* to add the component.
*/
void onSettingsApplied(boolean cleanup)
{
if (cleanup) tabPane.setComponentAt(RND_INDEX, dummyPanel);
else tabPane.setComponentAt(RND_INDEX,
model.getRenderer().getUI());
}
/**
* Brings up the activity options.
*
* @param source The source of the mouse pressed.
* @param location The location of the mouse pressed.
* @param index Identifies the menu to pop up.
*/
void activityOptions(Component source, Point p, int index)
{
toolBar.launchOptions(source, p, index);
}
/**
* Creates a figure.
*
* @param value The value containing the parameters for the figure.
*/
void createFigure(Object value) { model.createFigure(value); }
/**
* Runs the passed script.
*
* @param script The script to handle.
* @param index Indicated to run, download or view.
*/
void manageScript(ScriptObject script, int index)
{
model.manageScript(script, index);
}
/**
* Discards the renderer.
*
* @param ref The object of reference.
*/
void discardRenderer(Object ref)
{
if (ref != model.getRefObject()) return;
model.discardRenderer();
clearData();
}
/** Refreshes the acquisition metadata. */
void refreshAcquisition()
{
}
/** Displays the scripts. */
void setScripts() { toolBar.setScripts(); }
/**
* Sets the photo of the user.
*
* @param photo The photo to set.
*/
void setUserPhoto(BufferedImage photo)
{
if (userUI != null) userUI.setUserPhoto(photo);
}
/** Notifies the parent to upload the script. */
void uploadScript()
{
model.uploadScript();
}
/** Reloads the scripts. */
void reloadScript()
{
model.setScripts(null);
model.loadScripts();
toolBar.setStatus(true);
}
/**
* Returns <code>true</code> if it is an image with a lot of channels.
* <code>false</code> otherwise.
*
* @return See above.
*/
boolean isNumerousChannel() { return model.isNumerousChannel(); }
void cancelAnalysisResultsLoading(AnalysisResultsItem item)
{
}
/**
* Returns <code>true</code> if the tab is enabled, <code>false</code>
* otherwise. if it is not enabled, reset to the default tab, this should
* use to reset to the <code>General</code> tab.
*
* @param index The index of the tab.
* @return See above.
*/
boolean checkIfTabEnabled(int index)
{
if (index == -1) return false;
if (tabPane.isEnabledAt(index)) return true;
tabPane.setSelectedIndex(GENERAL_INDEX);
return false;
}
/** Updates the UI when the related nodes have been set.*/
void onRelatedNodesSet()
{
generalPane.onRelatedNodesSet();
}
/** Invokes when the size is loaded.*/
void onSizeLoaded()
{
toolBar.onSizeLoaded();
}
/** Displays the file set.
*
* @param trigger The action which triggered the loading,
* see {@link EditorControl#FILE_PATH_TOOLBAR}
* */
void displayFileset() {
toolBar.displayFileset();
}
/**
* Shows the location dialog
*/
void displayLocation() {
toolBar.displayLocation();
}
/**
* Returns the file set.
*
* @return See above.
*/
Set<FilesetData> getFileset() { return model.getFileset(); }
/**
* Returns the image or <code>null</code> if the primary select
* node is an image or a well.
*
* @return See above.
*/
ImageData getImage() { return model.getImage(); }
/**
* Returns the selected objects.
*
* @return See above.
*/
List<DataObject> getSelectedObjects() { return model.getSelectedObjects(); }
/**
* Returns the companion file generated while importing the file
* and containing the metadata found in the file, or <code>null</code>
* if no file was generated.
*
* @return See above
*/
FileAnnotationData getOriginalMetadata()
{
return model.getOriginalMetadata();
}
/**
* Sets the LDAP details.
*
* @param userID The user's id.
*/
void setLDAPDetails(String result) {
userUI.setLDAPDetails(result);
}
/**
* Returns the selected FileAnnotations or an empty Collection
* if there are no FileAnnotations
*
* @return See above
*/
public Collection<FileAnnotationData> getSelectedFileAnnotations() {
return generalPane.getSelectedFileAnnotations();
}
/**
* Reload the ROI count
*/
public void reloadROICount() {
if(model.getRefObject() instanceof ImageData) {
generalPane.getPropertiesUI().loadROICount((ImageData) model.getRefObject());
}
}
}