/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2014 University of Dundee. All rights reserved.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.agents.metadata.view;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import org.openmicroscopy.shoola.agents.events.iviewer.RndSettingsChanged;
import org.openmicroscopy.shoola.agents.metadata.IconManager;
import org.openmicroscopy.shoola.agents.metadata.MetadataViewerAgent;
import org.openmicroscopy.shoola.agents.metadata.rnd.Renderer;
import org.openmicroscopy.shoola.agents.util.ViewedByItem;
import org.openmicroscopy.shoola.env.rnd.RndProxyDef;
import org.openmicroscopy.shoola.env.ui.TopWindow;
import org.openmicroscopy.shoola.util.ui.TitlePanel;
import omero.gateway.model.DatasetData;
import omero.gateway.model.ExperimenterData;
import omero.gateway.model.ImageData;
import omero.gateway.model.ProjectData;
/**
* The View.
*
* @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 MetadataViewerUI
extends TopWindow
implements PropertyChangeListener
{
/** The text corresponding to the creation of a <code>Project</code>. */
private static final String PROJECT_MSG = "Project";
/** The text corresponding to the creation of a <code>Dataset</code>. */
private static final String DATASET_MSG = "Dataset";
/** The text corresponding to the creation of a <code>Image</code>. */
private static final String IMAGE_MSG = "Image";
/** The title of the dialog. */
private static final String TITLE = "Add metadata";
/** The description of the dialog. */
private static final String DESCRIPTION = "Add comments, tags, etc., " +
"to the selected items.";
/** Reference to the Control. */
@SuppressWarnings("unused")
private MetadataViewerControl controller;
/** Reference to the Model. */
private MetadataViewerModel model;
/** The component hosting the UI components. */
private JPanel uiDelegate;
/** The header of the component. */
private TitlePanel titlePanel;
/** The current ViewedByItems */
private List<ViewedByItem> viewedByItems = new ArrayList<ViewedByItem>();
/**
* Returns the message corresponding to the <code>DataObject</code>.
*
* @return See above
*/
private String getMessage()
{
Class nodeType = model.getRefObject().getClass();
if (nodeType.equals(ProjectData.class)) return PROJECT_MSG;
else if (nodeType.equals(DatasetData.class)) return DATASET_MSG;
else if (nodeType.equals(ImageData.class)) return IMAGE_MSG;
return "";
}
/** Builds and lays out the GUI. */
private void buildGUI()
{
IconManager icons = IconManager.getInstance();
titlePanel = new TitlePanel(TITLE, DESCRIPTION,
icons.getIcon(IconManager.METADATA_48));
Container c = getContentPane();
c.setLayout(new BorderLayout(0, 0));
//c.add(model.getEditor().getUI());
JSplitPane pane = new JSplitPane();
pane.setResizeWeight(1.0);
pane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
pane.setOneTouchExpandable(true);
pane.setContinuousLayout(true);
pane.setLeftComponent(model.getEditor().getUI());
//pane.setRightComponent(model.getBrowser().getUI());
uiDelegate = new JPanel();
uiDelegate.setLayout(new BorderLayout(0, 0));
uiDelegate.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
//uiDelegate.add(titlePanel, BorderLayout.NORTH);
uiDelegate.add(model.getEditor().getUI(), BorderLayout.CENTER);
c.add(titlePanel, BorderLayout.NORTH);
c.add(uiDelegate, BorderLayout.CENTER);
}
/**
* Creates a new instance.
* The
* {@link #initialize(MetadataViewerControl, MetadataViewerModel) initialize}
* method should be called straight after to link this View
* to the Controller.
*
* @param title The window title.
*/
MetadataViewerUI()
{
super("");
}
/**
* Links this View to its Controller and Model.
*
* @param controller Reference to the Control.
* Mustn't be <code>null</code>.
* @param model Reference to the Model.
* Mustn't be <code>null</code>.
*/
void initialize(MetadataViewerControl controller, MetadataViewerModel model)
{
if (controller == null) throw new NullPointerException("No control.");
if (model == null) throw new NullPointerException("No model.");
this.controller = controller;
this.model = model;
buildGUI();
setName("metadata viewer window");
}
/** Updates display when the new root node is set. */
void setRootObject()
{
String message = getMessage();
titlePanel.setTitle(message);
titlePanel.setSubtitle("Edit the "+ message.toLowerCase()+": "+
model.getRefObjectName());
uiDelegate.revalidate();
uiDelegate.repaint();
viewedByItems.clear();
}
/**
* Returns the UI.
*
* @return See above.
*/
JComponent getUI() { return uiDelegate; }
/**
* Indicates that the color of the passed channel has changed.
*
* @param index The index of the channel.
*/
void onChannelColorChanged(int index)
{
model.getEditor().onChannelColorChanged(index);
}
/**
* Creates the ViewedByItems
*/
void createViewedByItems() {
viewedByItems.clear();
Map m = model.getViewedBy();
Iterator i = m.entrySet().iterator();
ViewedByItem item;
ExperimenterData exp;
Entry e;
long id = model.getSelectedViewedByDef();
RndProxyDef def;
while (i.hasNext()) {
e = (Entry) i.next();
exp = (ExperimenterData) e.getKey();
ImageData img = model.getImage();
if (img != null) {
def = (RndProxyDef) e.getValue();
boolean isOwnerSetting = img.getOwner().getId() == exp.getId();
item = new ViewedByItem(exp, def, isOwnerSetting);
if (def.getData().getId().getValue() == id) {
item.setSelected(true);
}
item.addPropertyChangeListener(ViewedByItem.VIEWED_BY_PROPERTY,
this);
viewedByItems.add(item);
}
}
Renderer rnd = model.getEditor().getRenderer();
if (rnd != null) {
rnd.loadRndSettings(true, null);
}
}
/**
* Sets the thumbnails.
*
* @param thumbnails The value to set.
*/
void setThumbnails(Map<Long, BufferedImage> thumbnails) {
if (viewedByItems.isEmpty())
return;
for (ViewedByItem item : viewedByItems) {
BufferedImage img = thumbnails.get(item.getExperimenterID());
if (img != null) {
item.setImage(img);
}
}
Renderer renderer = model.getEditor().getRenderer();
if (renderer != null) // the renderer might not have been set yet
model.getEditor().getRenderer().loadRndSettings(false, viewedByItems);
}
/**
* Sets the rendering settings.
* @see PropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent evt)
{
if (ViewedByItem.VIEWED_BY_PROPERTY.equals(
evt.getPropertyName())) {
model.applyRenderingSettings(
(RndProxyDef) evt.getNewValue());
//post an event
RndSettingsChanged e = new RndSettingsChanged(
model.getImage().getId());
MetadataViewerAgent.getRegistry().getEventBus().post(e);
}
}
/**
* Overridden so the pack method is not invoked and the component is
* not displayed on screen.
*/
public void setOnScreen() {}
}