/* * org.openmicroscopy.shoola.agents.metadata.util.UploadPictureDialog * *------------------------------------------------------------------------------ * Copyright (C) 2006-2013 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.util; //Java imports import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRootPane; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; //Third-party libraries //Application-internal dependencies import org.openmicroscopy.shoola.agents.metadata.IconManager; import org.openmicroscopy.shoola.agents.metadata.MetadataViewerAgent; import org.openmicroscopy.shoola.env.ui.UserNotifier; import org.openmicroscopy.shoola.util.filter.file.CustomizedFileFilter; import org.openmicroscopy.shoola.util.filter.file.GIFFilter; import org.openmicroscopy.shoola.util.filter.file.JPEGFilter; import org.openmicroscopy.shoola.util.filter.file.PNGFilter; import org.openmicroscopy.shoola.util.ui.TitlePanel; import org.openmicroscopy.shoola.util.ui.UIUtilities; import org.openmicroscopy.shoola.util.ui.filechooser.GenericFileChooser; /** * Dialog to select the picture to upload. * * @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 UploadPictureDialog extends JDialog implements ActionListener, DocumentListener { /** Bound property indicating to upload the photo. */ public static final String UPLOAD_PHOTO_PROPERTY = "uploadPhoto"; /** * The size of the invisible components used to separate buttons * horizontally. */ private static final Dimension H_SPACER_SIZE = new Dimension(3, 10); /** The maximum size of the image. */ private static final int MAX_SIZE_BYTES = 204800; /** The maximum size of the image. */ private static final String MAX_SIZE_STRING = UIUtilities.formatFileSize(MAX_SIZE_BYTES); /** The title of the dialog. */ private static final String TITLE = "Upload Photo"; /** The text of the dialog. */ private static final String TEXT = "Select the photo (JPEG, GIF or PNG) " + "to upload. Maximum size " + MAX_SIZE_STRING + "."; /** Action ID indicating to upload the script to the server. */ private static final int SAVE = 0; /** Action ID indicating to close and disposes of the dialog. */ private static final int CANCEL = 1; /** Collection of supported filters. */ private static final List<CustomizedFileFilter> FILTERS; static { FILTERS = new ArrayList<CustomizedFileFilter>(); FILTERS.add(new GIFFilter()); FILTERS.add(new JPEGFilter()); FILTERS.add(new PNGFilter()); } /** Chooser used to select the file. */ private GenericFileChooser chooser; /** * Replaces the <code>ApproveButton</code> provided by the * {@link JFileChooser} class. */ private JButton saveButton; /** * Replaces the <code>CancelButton</code> provided by the * {@link JFileChooser} class. */ private JButton cancelButton; /** The text area where to enter the name of the file to save. */ private JTextField scriptArea; /** Sets the properties of the dialog. */ private void setProperties() { setTitle(TITLE); setModal(true); } /** Initializes the components. */ private void initComponents() { chooser = new GenericFileChooser(); chooser.setAcceptAllFileFilterUsed(false); chooser.setDialogType(JFileChooser.SAVE_DIALOG); Iterator<CustomizedFileFilter> i = FILTERS.iterator(); while (i.hasNext()) { chooser.addChoosableFileFilter(i.next()); } chooser.setControlButtonsAreShown(false); saveButton = new JButton("Upload"); saveButton.setToolTipText( UIUtilities.formatToolTipText("Upload the selected photo " + "to the server.")); saveButton.addActionListener(this); saveButton.setActionCommand(""+SAVE); cancelButton = new JButton("Cancel"); cancelButton.setToolTipText( UIUtilities.formatToolTipText("Closes the dialog.")); cancelButton.addActionListener(this); cancelButton.setActionCommand(""+CANCEL); scriptArea = (JTextField) UIUtilities.findComponent(chooser, JTextField.class); if (scriptArea != null) { scriptArea.getDocument().addDocumentListener(this); saveButton.setEnabled(false); } JLabel label = (JLabel) UIUtilities.findComponent(chooser, JLabel.class); if (label != null) label.setText("Photo to Upload:"); } /** Closes and disposes. */ private void close() { setVisible(false); dispose(); } /** * Sets the <code>enabled</code> flag of not the <code>Save</code> option * depending on the length of the text entered in the {@link #scriptArea}. */ private void handleTextUpdate() { if (scriptArea == null) return; //should happen String text = scriptArea.getText(); boolean b = false; if (text != null && text.trim().length() > 0) { b = true; Iterator<CustomizedFileFilter> i = FILTERS.iterator(); boolean supported = false; CustomizedFileFilter filter; while (i.hasNext()) { filter = i.next(); if (filter.accept(text)) { supported = true; break; } } if (!supported) { saveButton.setEnabled(false); return; } } saveButton.setEnabled(b); } /** Uploads the photo. */ private void upload() { UserNotifier un = MetadataViewerAgent.getRegistry().getUserNotifier(); File f; if (scriptArea != null) f = new File(chooser.getCurrentDirectory().toString(), scriptArea.getText()); else f = chooser.getSelectedFile(); if (f == null) { un.notifyInfo(TITLE, "Please select a photo."); return; } Iterator<CustomizedFileFilter> i = FILTERS.iterator(); boolean supported = false; CustomizedFileFilter filter; String format = ""; while (i.hasNext()) { filter = i.next(); if (filter.accept(f)) { format = filter.getMIMEType(); supported = true; break; } } if (!supported) { un.notifyInfo(TITLE, "Only JPEG, GIF or PNG files " + "can be uploaded."); return; } if (f.length() > MAX_SIZE_BYTES) { un.notifyInfo(TITLE, "The file is too big, maximum size " + MAX_SIZE_STRING); return; } List<Object> l = new ArrayList<Object>(); l.add(f); l.add(format); firePropertyChange(UPLOAD_PHOTO_PROPERTY, null, l); setVisible(false); dispose(); } /** * Builds the tool bar. * * @return See above */ private JPanel buildToolbar() { JPanel bar = new JPanel(); bar.setBorder(null); bar.add(cancelButton); bar.add(Box.createRigidArea(H_SPACER_SIZE)); bar.add(saveButton); JPanel p = UIUtilities.buildComponentPanelRight(bar); p.setOpaque(true); return p; } /** * Builds and lays out the controls. * * @return See above. */ private JPanel buildControls() { JPanel p = new JPanel(); p.setLayout(new BorderLayout(0, 0)); p.add(chooser, BorderLayout.CENTER); p.add(buildToolbar(), BorderLayout.SOUTH); return p; } /** Builds and lays out the UI. */ private void buildGUI() { IconManager icons = IconManager.getInstance(); TitlePanel tp = new TitlePanel(TITLE, TEXT, icons.getIcon(IconManager.USER_PHOTO_48)); Container c = getContentPane(); c.setLayout(new BorderLayout(0, 0)); c.add(tp, BorderLayout.NORTH); c.add(buildControls(), BorderLayout.CENTER); if (JDialog.isDefaultLookAndFeelDecorated()) { boolean supportsWindowDecorations = UIManager.getLookAndFeel().getSupportsWindowDecorations(); if (supportsWindowDecorations) getRootPane().setWindowDecorationStyle( JRootPane.FILE_CHOOSER_DIALOG); } } /** * Creates a new instance. * * @param owner The owner of the dialog. */ public UploadPictureDialog(JFrame owner) { super(owner); setProperties(); initComponents(); buildGUI(); } /** * Uploads the script or closes the dialog. * @see ActionListener#actionPerformed(ActionEvent) */ public void actionPerformed(ActionEvent e) { int index = Integer.parseInt(e.getActionCommand()); switch (index) { case CANCEL: close(); break; case SAVE: upload(); } } /** * Enables or not the <code>Save</code> option depending on the text * entered in the {@link #scriptArea}. * @see DocumentListener#insertUpdate(DocumentEvent) */ public void insertUpdate(DocumentEvent e) { handleTextUpdate(); } /** * Enables or not the <code>Save</code> option depending on the text * entered in the {@link #scriptArea}. * @see DocumentListener#removeUpdate(DocumentEvent) */ public void removeUpdate(DocumentEvent e) { handleTextUpdate(); } /** * Required by the {@link DocumentListener} I/F but no-operation * implementation in our case. * @see DocumentListener#changedUpdate(DocumentEvent) */ public void changedUpdate(DocumentEvent e) {} }