/* *------------------------------------------------------------------------------ * 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.util.ui; import java.awt.FlowLayout; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.event.DocumentListener; import org.openmicroscopy.shoola.agents.metadata.IconManager; import org.openmicroscopy.shoola.util.ui.UIUtilities; import omero.gateway.model.DataObject; /** * Component used to enter the identifiers. * * @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 */ class IdentifierParamPane extends JPanel { /** Displays the information.*/ static final String DISPLAY_INFO_PROPERTY = "displayInfo"; /** The text indicating how to enter the values.*/ static final String INFO_TEXT = "Use ',' to separate values."; /** The type of values to return after parsing e.g. number.*/ private Class<?> type; /** The field displayed the identifier.*/ private JTextField field; /** The button displaying how to fill the text field.*/ private JButton infoButton; /** Flag indicating that a value is required. */ private boolean required; /** Initializes the components.*/ private void initializeComponents() { field = new JTextField(ScriptComponent.COLUMNS); IconManager icons = IconManager.getInstance(); infoButton = new JButton(icons.getIcon(IconManager.INFO)); infoButton.setToolTipText(INFO_TEXT); UIUtilities.unifiedButtonLookAndFeel(infoButton); infoButton.addMouseListener(new MouseAdapter() { /** Fires a property indicating to display the information. * @see MouseListener#mousePressed(MouseEvent) */ public void mousePressed(MouseEvent e){ Point p = e.getPoint(); SwingUtilities.convertPointToScreen(p, infoButton); firePropertyChange(DISPLAY_INFO_PROPERTY, null, p); } }); } /** * Builds and lays out the UI. * * @param showInfo Pass <code>true</code> to show the info button. */ private void buildGUI(boolean showInfo) { setLayout(new FlowLayout(FlowLayout.LEFT)); if (showInfo) add(infoButton); add(field); } /** * Creates a new instance with a requested field. * * @param type The type of values to return after parsing e.g. number. */ IdentifierParamPane(Class<?> type) { this(type, true, true); } /** * Creates a new instance with a requested field. * * @param type The type of values to return after parsing e.g. number. * @param showInfo Pass <code>true</code> to show the info button. */ IdentifierParamPane(Class<?> type, boolean showInfo) { this(type, true, showInfo); } /** * Creates a new instance with a requested field. * * @param type The type of values to return after parsing e.g. number. * @param required Pass <code>true</code> to indicate that a value is * required, <code>false</code> otherwise. * @param showInfo Pass <code>true</code> to show the info button. */ IdentifierParamPane(Class<?> type, boolean required, boolean showInfo) { this.type = type; this.required = required; initializeComponents(); buildGUI(showInfo); } /** * Sets the values. * * @param values The values to set. */ void setValues(List<DataObject> values) { if (values == null) { field.setText(""); return; } Iterator<DataObject> i = values.iterator(); StringBuffer buffer = new StringBuffer(); int index = 0; int n = values.size()-1; while (i.hasNext()) { buffer.append(i.next().getId()); if (index < n) buffer.append(", "); index++; } field.setText(buffer.toString()); } /** * Returns the values entered as String. * * @return See above. */ List<String> getValuesAsString() { String text = field.getText(); if (text == null) return null; String[] values = text.split(","); if (values == null || values.length == 0) return null; List<String> l = new ArrayList<String>(); String v; for (int i = 0; i < values.length; i++) { v = values[i]; v = v.trim(); l.add(v); } return l; } /** * Returns the values entered as Long. * * @return See above. */ List<Long> getValuesAsLong() { String text = field.getText(); if (text == null) return null; if (!Long.class.equals(type)) return null; String[] values = text.split(","); if (values == null || values.length == 0) return null; List<Long> l = new ArrayList<Long>(); String v; for (int i = 0; i < values.length; i++) { v = values[i]; v = v.trim(); try { l.add(Long.parseLong(v)); } catch (Exception e) { //ignore } } return l; } /** * Returns the values entered in the text field. * * @return See above */ List<Object> getValues() { String text = field.getText(); if (text == null) return null; String[] values = text.split(","); if (values == null || values.length == 0) return null; List<Object> l = new ArrayList<Object>(); String v; for (int i = 0; i < values.length; i++) { v = values[i]; v = v.trim(); if (Long.class.equals(type)) { try { l.add(Long.parseLong(v)); } catch (Exception e) {} } else { l.add(v); } } return l; } /** * Returns <code>true</code> if the value entered is valid, * <code>false</code> otherwise. * * @return See above. */ List<Object> isReady() { if (!required) return null; return getValues(); } /** * Adds the listener to the text field. * * @param listener The listener to handle. */ void addDocumentListener(DocumentListener listener) { if (listener == null) return; field.getDocument().addDocumentListener(listener); } }