//
// ExportDialog.java
//
/*
OME Metadata Editor application for exploration and editing of OME-XML and
OME-TIFF metadata. Copyright (C) 2006-@year@ Christopher Peterson.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Library 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 Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package loci.ome.editor;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
* A class that makes a dialog that gives a JList allowing
* users to select the notes they want to export to a
* text file.
* Note that much of this code was found in an example in
* the JDK 1.4 API Specs... ListDialog.java .
*
* <dl><dt><b>Source code:</b></dt>
* <dd><a href="http://trac.openmicroscopy.org.uk/ome/browser/bioformats.git/components/legacy/ome-editor/src/loci/ome/editor/ExportDialog.java">Trac</a>,
* <a href="http://git.openmicroscopy.org/?p=bioformats.git;a=blob;f=components/legacy/ome-editor/src/loci/ome/editor/ExportDialog.java;hb=HEAD">Gitweb</a></dd></dl>
*
* @author Christopher Peterson crpeterson2 at wisc.edu
*/
public class ExportDialog extends JDialog implements ActionListener {
// -- Fields --
/** Holds the dialog. */
private static ExportDialog dialog;
/** The list of values returned as selected in the dialog. */
private static Object [] value;
/** The JList found in this dialog. */
private JList list;
// -- Constructor --
/** Set up the GUI, etc. Can't directly instatiate this. */
private ExportDialog(Frame frame, Component locationComp, String labelText,
String title, Object[] data, Object[] initialValue, String longValue)
{
super(frame, title, true);
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(this);
final JButton exportButton = new JButton("Export Selected");
exportButton.setActionCommand("Set");
exportButton.addActionListener(this);
exportButton.setToolTipText("Export the selected note(s).");
final JButton exportAllButton = new JButton("Export All");
exportAllButton.setActionCommand("SetAll");
exportAllButton.addActionListener(this);
exportAllButton.setToolTipText("Export all notes.");
getRootPane().setDefaultButton(exportAllButton);
list = new JList(data) {
//Subclass JList to workaround bug 4832765, which can cause the
//scroll pane to not let the user easily scroll up to the beginning
//of the list. An alternative would be to set the unitIncrement
//of the JScrollBar to a fixed value. You wouldn't get the nice
//aligned scrolling, but it should work.
public int getScrollableUnitIncrement(Rectangle visibleRect,
int orientation,
int direction) {
int row;
if (orientation == SwingConstants.VERTICAL &&
direction < 0 && (row = getFirstVisibleIndex()) != -1)
{
Rectangle r = getCellBounds(row, row);
if ((r.y == visibleRect.y) && (row != 0)) {
Point loc = r.getLocation();
loc.y--;
int prevIndex = locationToIndex(loc);
Rectangle prevR = getCellBounds(prevIndex, prevIndex);
if (prevR == null || prevR.y >= r.y) {
return 0;
}
return prevR.height;
}
}
return super.getScrollableUnitIncrement(
visibleRect, orientation, direction);
}
};
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
if (longValue != null) {
list.setPrototypeCellValue(longValue); //get extra space
}
list.setLayoutOrientation(JList.VERTICAL);
list.setVisibleRowCount(-1);
JScrollPane listScroller = new JScrollPane(list);
listScroller.setPreferredSize(new Dimension(300, 160));
listScroller.setAlignmentX(LEFT_ALIGNMENT);
JPanel listPane = new JPanel();
FormLayout panelLayout = new FormLayout(
"5dlu, pref:grow:right, 5dlu, pref, 5dlu, pref, 5dlu",
"5dlu, pref, 5dlu, pref, 5dlu, pref, 5dlu");
listPane.setLayout(panelLayout);
CellConstraints cc = new CellConstraints();
listPane.setLayout(panelLayout);
JLabel label = new JLabel(labelText);
label.setLabelFor(list);
listPane.add(label, cc.xyw(2,2,5));
listPane.add(listScroller, cc.xyw(2,4,5));
listPane.add(exportButton, cc.xy(2,6));
listPane.add(exportAllButton, cc.xy(4,6));
listPane.add(cancelButton, cc.xy(6,6));
setContentPane(listPane);
//Initialize values.
setValue(initialValue);
pack();
setLocationRelativeTo(locationComp);
}
// -- ExportDialog API methods --
/**
* Set up and show the dialog. The first Component argument
* determines which frame the dialog depends on; it should be
* a component in the dialog's controlling frame. The second
* Component argument should be null if you want the dialog
* to come up with its left corner in the center of the screen;
* otherwise, it should be the component on top of which the
* dialog should appear.
*/
public static Object[] showDialog(Component frameComp,
Component locationComp, String labelText, String title,
Object[] possibleValues, Object[] initialValue, String longValue)
{
Frame frame = JOptionPane.getFrameForComponent(frameComp);
dialog = new ExportDialog(frame, locationComp, labelText, title,
possibleValues, initialValue, longValue);
dialog.setVisible(true);
return value;
}
// -- Helper methods --
/** Set the selected values to a specified array. */
private void setValue(Object [] newValue) {
value = newValue;
if (newValue != null) {
for (int i = 0;i < newValue.length;i++) {
list.setSelectedValue(value[i], false);
}
}
}
// -- ActionListener API methods --
/** Handle clicks on the Export and ExportAll and cancel buttons. */
public void actionPerformed(ActionEvent e) {
if ("Set".equals(e.getActionCommand())) {
ExportDialog.value = list.getSelectedValues();
}
if ("SetAll".equals(e.getActionCommand())) {
list.setSelectionInterval(0, list.getModel().getSize() - 1);
ExportDialog.value = list.getSelectedValues();
}
ExportDialog.dialog.setVisible(false);
}
}