/* * org.openmicroscopy.shoola.agents.measurement.view.ResultsWizard * *------------------------------------------------------------------------------ * Copyright (C) 2006-2007 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.measurement.view; //Java imports import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; //Third-party libraries //Application-internal dependencies import org.openmicroscopy.shoola.agents.measurement.IconManager; import org.openmicroscopy.shoola.agents.measurement.util.model.AnnotationField; import org.openmicroscopy.shoola.util.ui.TitlePanel; /** * Displays the fields to add to the results 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 * <small> * (<b>Internal version:</b> $Revision: $Date: $) * </small> * @since OME3.0 */ class ResultsWizard extends JDialog implements ActionListener { /** Action command ID to add a field to the result table. */ private static final int ADD = 0; /** Action command ID to remove a field from the result table. */ private static final int REMOVE = 1; /** Action command ID to add all fields to the result table. */ private static final int ADD_ALL = 2; /** Action command ID to remove all fields from the result table. */ private static final int REMOVE_ALL = 3; /** Action command ID to Accept the current field selection. */ private static final int ACCEPT = 4; /** Action command ID to cancel the wizard. */ private static final int CANCEL = 5; /** Action command ID to reset the current field selection. */ private static final int RESET = 6; /** Collection of fields. */ private List<AnnotationField> currentFields; /** Collection of all the possible fields. */ private List<AnnotationField> allFields; /** The original selection of fields, used by the reset button. */ private List<AnnotationField> originalSelection; /** The list box showing the current fields */ private JList currentFieldsListbox; /** The list box showing the remaining fields */ private JList remainingFieldsListbox; /** * The button to move a field from the remaining fields to current fields. */ private JButton addFieldButton; /** * The button to move a field from the current fields to remaining fields. */ private JButton removeFieldButton; /** The button to move all fields to the current fields. */ private JButton addAllFieldsButton; /** The button to move all fields to the remaining fields. */ private JButton removeAllFieldsButton; /** The button to accept current selection. */ private JButton acceptButton; /** The button to accept current selection. */ private JButton resetButton; /** The button to cancel current selection. */ private JButton cancelButton; /** Initializes the components composing the display. */ private void initComponents() { currentFieldsListbox = new JList(); remainingFieldsListbox = new JList(); createButtons(); addActionListeners(); } /** * Resets the current selection to the original selection set when wizard * called. */ private void resetSelection() { currentFields.clear(); for (AnnotationField field : originalSelection) currentFields.add(field); } /** * Creates a copy of the original selection set so it can be reset by user. */ private void createOriginalSelection() { originalSelection = new ArrayList<AnnotationField>(); for (AnnotationField field : currentFields) originalSelection.add(field); } /** Adds action listeners to the buttons. */ private void addActionListeners() { addFieldButton.setActionCommand(""+ADD); addFieldButton.addActionListener(this); addAllFieldsButton.setActionCommand(""+ADD_ALL); addAllFieldsButton.addActionListener(this); removeFieldButton.setActionCommand(""+REMOVE); removeFieldButton.addActionListener(this); removeAllFieldsButton.setActionCommand(""+REMOVE_ALL); removeAllFieldsButton.addActionListener(this); acceptButton.setActionCommand(""+ACCEPT); acceptButton.addActionListener(this); cancelButton.setActionCommand(""+CANCEL); cancelButton.addActionListener(this); resetButton.setActionCommand(""+RESET); resetButton.addActionListener(this); } /** * This method is invoked when the user clicks the addFieldButton. * It adds a field to the list and then sorts the list to maintain order. */ private void addField() { if (remainingFieldsListbox.getSelectedIndex() == -1) return; int [] indexes = remainingFieldsListbox.getSelectedIndices(); DefaultListModel model = (DefaultListModel) remainingFieldsListbox.getModel(); String annotationName; for (int i = 0 ; i < indexes.length ; i++) { annotationName = (String) model.getElementAt(indexes[i]); for (AnnotationField field : allFields) { if (field.getName().equals(annotationName)) { currentFields.add(field); break; } } } sortCurrentFields(); populateCurrentFieldsPanel(); populateRemainingFieldsPanel(); } /** * Sorts the selection list of the user so that the order is preseved between * pairs of attributes (CentreX, and CentreY). */ private void sortCurrentFields() { ArrayList<AnnotationField> sortedList = new ArrayList<AnnotationField>(); for (AnnotationField allFieldsField : allFields) { for (AnnotationField currentFieldsField : currentFields) { if (currentFieldsField.getName().equals( allFieldsField.getName())) sortedList.add(currentFieldsField); } } currentFields.clear(); currentFields.addAll(sortedList); } /** Adds all the fields to the list. */ private void addAllFields() { currentFields.clear(); for (AnnotationField field: allFields) currentFields.add(field); populateCurrentFieldsPanel(); populateRemainingFieldsPanel(); } /** Removes a single field from the list. */ private void removeField() { if (currentFieldsListbox.getSelectedIndex() == -1) return; DefaultListModel model = (DefaultListModel) currentFieldsListbox.getModel(); int [] indexes = currentFieldsListbox.getSelectedIndices(); String annotationName; for (int i = 0 ; i < indexes.length ; i++) { annotationName = (String) model.getElementAt(indexes[i]); for (AnnotationField field : currentFields) { if (field.getName().equals(annotationName)) { currentFields.remove(field); break; } } } sortCurrentFields(); populateCurrentFieldsPanel(); populateRemainingFieldsPanel(); } /** Removes all fields from the list. */ private void removeAllFields() { currentFields.clear(); populateCurrentFieldsPanel(); populateRemainingFieldsPanel(); } /** * The user has clicked the cancel button, resets selection to the original * selection and closes the window. */ private void cancelButtonClicked() { this.resetSelection(); acceptButtonClicked(); } /** The user has accepted the new selection, close window. */ private void acceptButtonClicked() { setVisible(false); this.dispose(); } /** Resets the selection to the original selection. */ private void resetButtonClicked() { this.resetSelection(); populateCurrentFieldsPanel(); populateRemainingFieldsPanel(); } /** Creates all the buttons in the UI. */ private void createButtons() { addFieldButton = new JButton(IconManager.getInstance(). getIcon(IconManager.RIGHT_ARROW_22)); removeFieldButton = new JButton(IconManager.getInstance(). getIcon(IconManager.LEFT_ARROW_22)); addAllFieldsButton = new JButton(IconManager.getInstance(). getIcon(IconManager.DOUBLE_RIGHT_ARROW_22)); removeAllFieldsButton = new JButton(IconManager.getInstance(). getIcon(IconManager.DOUBLE_LEFT_ARROW_22)); acceptButton = new JButton("Accept"); cancelButton = new JButton("Cancel"); resetButton = new JButton("Reset"); getRootPane().setDefaultButton(acceptButton); } /** Builds and lays out the UI. */ private void buildUI() { JPanel container = new JPanel(); container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS)); JPanel leftPanel = createRemainingFieldsPanel(); //UIUtilities.setDefaultSize(leftPanel, new Dimension(200,300)); JPanel buttonPanel = createButtonPanel(); //UIUtilities.setDefaultSize(buttonPanel, new Dimension(60, 300)); JPanel rightPanel = createCurrentFieldsPanel(); //UIUtilities.setDefaultSize(rightPanel, new Dimension(200, 300)); container.add(Box.createHorizontalStrut(10)); container.add(leftPanel); container.add(Box.createHorizontalStrut(20)); container.add(buttonPanel); container.add(Box.createHorizontalStrut(20)); container.add(rightPanel); container.add(Box.createHorizontalStrut(10)); IconManager icons = IconManager.getInstance(); TitlePanel tp = new TitlePanel("Results Wizard", "Select the measurements you wish to record.", icons.getIcon(IconManager.WIZARD_48)); Container c = getContentPane(); c.setLayout(new BorderLayout()); c.add(tp, BorderLayout.NORTH); c.add(container, BorderLayout.CENTER); c.add(createControlPanel(), BorderLayout.SOUTH); } /** * Creates the control panel which has the buttons for the accepting, * cancelling and resetting of selections. * * @return See above. */ private JPanel createControlPanel() { JPanel controlPanel = new JPanel(); controlPanel.setLayout(new FlowLayout()); controlPanel.add(resetButton); controlPanel.add(acceptButton); controlPanel.add(cancelButton); return controlPanel; } /** * Creates the remaining fields panel, which shows the fields which have * not been selected. * * @return See above. */ private JPanel createRemainingFieldsPanel() { JPanel fieldsPanel = new JPanel(); fieldsPanel.setLayout(new BorderLayout()); JScrollPane pane = new JScrollPane(remainingFieldsListbox); fieldsPanel.add(new JLabel("Unused Measurements:"), BorderLayout.NORTH); fieldsPanel.add(pane, BorderLayout.CENTER); populateRemainingFieldsPanel(); return fieldsPanel; } /** * Creates the central button panel hosting the add and remove selection * buttons. * * @return See above. */ private JPanel createButtonPanel() { JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS)); buttonPanel.add(Box.createVerticalStrut(30)); buttonPanel.add(addFieldButton); buttonPanel.add(Box.createVerticalStrut(10)); buttonPanel.add(removeFieldButton); buttonPanel.add(Box.createVerticalStrut(10)); buttonPanel.add(addAllFieldsButton); buttonPanel.add(Box.createVerticalStrut(10)); buttonPanel.add(removeAllFieldsButton); buttonPanel.add(Box.createVerticalStrut(10)); return buttonPanel; } /** * Creates the current fields panel, which shows the fields which have * been selected. * * @return See above. */ private JPanel createCurrentFieldsPanel() { JPanel fieldsPanel = new JPanel(); fieldsPanel.setLayout(new BorderLayout()); JScrollPane pane = new JScrollPane(currentFieldsListbox); fieldsPanel.add(new JLabel("Selected Measurements:"), BorderLayout.NORTH); fieldsPanel.add(pane, BorderLayout.CENTER); populateCurrentFieldsPanel(); return fieldsPanel; } /** Updates the currentFields list box. */ private void populateCurrentFieldsPanel() { DefaultListModel listModel = new DefaultListModel(); for (AnnotationField annotation : currentFields) listModel.addElement(annotation.getName()); currentFieldsListbox.setModel(listModel); } /** Updates the remaining fields list box. */ private void populateRemainingFieldsPanel() { DefaultListModel listModel = new DefaultListModel(); boolean found; for (AnnotationField allFieldAnnotation : allFields) { found = false; for (AnnotationField currentFieldAnnotation : currentFields) if (currentFieldAnnotation.getKey(). equals(allFieldAnnotation.getKey())) found = true; if (!found) listModel.addElement(allFieldAnnotation.getName()); } remainingFieldsListbox.setModel(listModel); } /** * Creates a new instance. * * @param owner The owner of the frame. * @param cFields The initial list of fields. * @param aFields The initial list of fields. */ ResultsWizard(JFrame owner, List<AnnotationField> cFields, List<AnnotationField> aFields) { super(owner, true); currentFields = cFields; allFields = aFields; //setSize(500, 440); createOriginalSelection(); initComponents(); buildUI(); } /** * Reacts to event fired by the various controls. * @see ActionListener#actionPerformed(ActionEvent) */ public void actionPerformed(ActionEvent evt) { int id = -1; try { id = Integer.parseInt(evt.getActionCommand()); switch (id) { case ADD: addField(); break; case ADD_ALL: addAllFields(); break; case REMOVE: removeField(); break; case REMOVE_ALL: removeAllFields(); break; case ACCEPT: acceptButtonClicked(); break; case CANCEL: cancelButtonClicked(); break; case RESET: resetButtonClicked(); break; default: break; } } catch (Exception e) { // TODO: handle exception } } }