/* * org.openmicroscopy.shoola.env.ui.CheckoutBox * *------------------------------------------------------------------------------ * Copyright (C) 2006-2010 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.env.ui; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.jdesktop.swingx.JXTaskPane; import org.openmicroscopy.shoola.env.Agent; import org.openmicroscopy.shoola.env.data.util.AgentSaveInfo; import org.openmicroscopy.shoola.util.ui.MessageBox; import org.openmicroscopy.shoola.util.ui.UIUtilities; /** * Displays the instances of <code>Agent</code> that can be saved before * switching group or closing the application. * * @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 3.0-Beta4 */ public class CheckoutBox extends MessageBox { /** The elements to save. */ private Map<Agent, AgentSaveInfo> map; /** Component to save all instances. */ private JCheckBox saveAll; /** The components to handle. */ private Map<Agent, List<CheckOutItem>> components; /** Sets the <code>enabled</code> flag of the <code>CheckOutItem</code>. */ private void handleSelection() { if (components == null) return; Entry entry; Iterator<Entry<Agent, List<CheckOutItem>>> i = components.entrySet().iterator(); List<CheckOutItem> l; Iterator<CheckOutItem> j; CheckOutItem item; boolean selected = saveAll.isSelected(); while (i.hasNext()) { entry = (Entry) i.next(); l = (List<CheckOutItem>) entry.getValue(); if (l != null) { j = l.iterator(); while (j.hasNext()) { j.next().setEnabled(selected); } } } } /** Initializes the display. */ private void initComponents() { saveAll = new JCheckBox("Save Changes"); if (map != null && map.size() > 0) saveAll.setSelected(true); saveAll.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent evt) { handleSelection(); } }); } /** * Builds and lays out the component displaying instances of a given agent * to save. * * @param agent The agent the instances are related to. * @param info Hosts information about an instance of an agent to save. * @return See above. */ private JComponent buildAgentEntry(Agent agent, AgentSaveInfo info) { List<CheckOutItem> items = new ArrayList<CheckOutItem>(); List<Object> instances = info.getInstances(); Iterator<Object> i = instances.iterator(); CheckOutItem box; JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); while (i.hasNext()) { box = new CheckOutItem(info.getName(), i.next()); items.add(box); p.add(box); } components.put(agent, items); return UIUtilities.buildComponentPanel(p); } /** Builds and lays out the UI. */ private void buildGUI() { if (map == null || map.size() == 0) return; components = new HashMap<Agent, List<CheckOutItem>>(); Entry entry; Iterator i = map.entrySet().iterator(); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(UIUtilities.buildComponentPanel(saveAll)); JPanel content = new JPanel(); content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); JXTaskPane pane = UIUtilities.createTaskPane("List of Changes", null); pane.setCollapsed(false); while (i.hasNext()) { entry = (Entry) i.next(); content.add(buildAgentEntry((Agent) entry.getKey(), (AgentSaveInfo) entry.getValue())); } pane.add(content); p.add(pane); addBodyComponent(p); } /** * Creates a new instance. * * @param owner The parent window. * @param title The title to display on the title bar. * @param message The notification message. * @param map Contains the instances to save. */ public CheckoutBox(JFrame owner, String title, String message, Icon icon, Map<Agent, AgentSaveInfo> map) { super(owner, title, message, icon); this.map = map; initComponents(); buildGUI(); } /** * Creates a new instance. * * @param owner The parent window. * @param title The title to display on the title bar. * @param message The notification message. * @param map Contains the instances to save. */ public CheckoutBox(JFrame owner, String title, String message, Map<Agent, AgentSaveInfo> map) { this(owner, title, message, null, map); } /** * Returns the instances of <code>Agent</code> to save. * * @return See above. */ Map<Agent, AgentSaveInfo> getInstancesToSave() { if (!saveAll.isSelected()) return null; Map<Agent, AgentSaveInfo> toSave = new HashMap<Agent, AgentSaveInfo>(); Entry entry; Iterator i = components.entrySet().iterator(); Iterator j; CheckOutItem item; List list; String name; List<Object> instances; while (i.hasNext()) { entry = (Entry) i.next(); list = (List) entry.getValue(); j = list.iterator(); instances = new ArrayList<Object>(); name = ""; while (j.hasNext()) { item = (CheckOutItem) j.next(); if (item.isSelected()) { name = item.getRefName(); instances.add(item.getInstance()); } } if (instances.size() > 0) toSave.put((Agent) entry.getKey(), new AgentSaveInfo(name, instances)); } return toSave; } /** * Inner class used to handle the instances to save. */ class CheckOutItem extends JCheckBox { /** The instance to handle. */ private Object instance; /** The name of reference. */ private String refName; /** * Creates a new instance. * * @param refName The name of reference. * @param instance The instance to handle. */ CheckOutItem(String refName, Object instance) { this.refName = refName; this.instance = instance; setText(instance.toString()); setSelected(true); } /** * Returns the instance * * @return See above. */ Object getInstance() { return instance; } /** * Returns the name of reference. * * @return See above. */ String getRefName() { return refName; } } }