
ncsa.hdf.view.DataOptionDialog Maven / Gradle / Ivy
The newest version!
/*****************************************************************************
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of the HDF Java Products distribution. *
* The full copyright notice, including terms governing use, modification, *
* and redistribution, is contained in the files COPYING and Copyright.html. *
* COPYING can be found at the root of the source code distribution tree. *
* Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. *
* If you do not have access to either file, you may request a copy from *
* [email protected]. *
****************************************************************************/
package ncsa.hdf.view;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.BitSet;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import ncsa.hdf.object.CompoundDS;
import ncsa.hdf.object.Dataset;
import ncsa.hdf.object.Datatype;
import ncsa.hdf.object.FileFormat;
import ncsa.hdf.object.ScalarDS;
/**
* DataOptionDialog is an dialog window used to select display options. Display
* options include selection of subset, display type (image, text, or
* spreadsheet).
*
* @author Peter X. Cao
* @version 2.4 9/6/2007
*/
public class DataOptionDialog extends JDialog implements ActionListener, ItemListener
{
/**
*
*/
private static final long serialVersionUID = -1078411885690696784L;
/**
* The main HDFView.
*/
private final ViewManager viewer;
/** the selected dataset/image */
private Dataset dataset;
/** the rank of the dataset/image */
private int rank;
/** the starting point of selected subset */
private long start[];
/** the sizes of all dimensions */
private long dims[];
/** the selected sizes of all dimensions */
private long selected[];
/** the stride */
private long stride[];
/** the indices of the selected dimensions. */
private int selectedIndex[];
private int currentIndex[];
private JRadioButton spreadsheetButton, imageButton, base1Button, base0Button;
private JRadioButton[] bitmaskButtons;
private JCheckBox applyBitmaskButton, extractBitButton;
private JCheckBox charCheckbox;
private BitSet bitmask;
private JButton bitmaskHelp;
private JComboBox choiceTextView, choiceTableView, choiceImageView,
choicePalette, choices[];
private JComboBox transposeChoice;
private boolean isSelectionCancelled;
private boolean isTrueColorImage;
private boolean isText;
private boolean isH5;
private JLabel maxLabels[], selLabel;
private JTextField startFields[], endFields[], strideFields[];
private JList fieldList;
private final Toolkit toolkit;
private final PreviewNavigator navigator;
private int numberOfPalettes;
/**
* JComboBox.setSelectedItem() or setSelectedIndex() always fires action
* event. If you call setSelectedItem() or setSelectedIndex() at
* itemStateChanged() or actionPerformed(), the setSelectedItem() or
* setSelectedIndex() will make loop calls of itemStateChanged() or
* actionPerformed(). This is not what we want. We want the
* setSelectedItem() or setSelectedIndex() behavior like java.awt.Choice.
* This flag is used to serve this purpose.
*/
private boolean performJComboBoxEvent = false;
/**
* Constructs a DataOptionDialog with the given HDFView.
*/
public DataOptionDialog(ViewManager theview, Dataset theDataset) {
super((JFrame) theview, true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
viewer = theview;
dataset = theDataset;
isSelectionCancelled = true;
isTrueColorImage = false;
isText = false;
bitmask = null;
numberOfPalettes = 1;
toolkit = Toolkit.getDefaultToolkit();
if (dataset == null) {
dispose();
}
else {
setTitle("Dataset Selection - " + dataset.getPath()
+ dataset.getName());
}
isH5 = dataset.getFileFormat().isThisType(
FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5));
rank = dataset.getRank();
if (rank <= 0) {
dataset.init();
}
if (isH5 && (dataset instanceof ScalarDS)) {
byte[] palRefs = ((ScalarDS) dataset).getPaletteRefs();
if ((palRefs != null) && (palRefs.length > 8)) {
numberOfPalettes = palRefs.length / 8;
}
}
rank = dataset.getRank();
dims = dataset.getDims();
selected = dataset.getSelectedDims();
start = dataset.getStartDims();
selectedIndex = dataset.getSelectedIndex();
stride = dataset.getStride();
fieldList = null;
int h = 1, w = 1;
h = (int) dims[selectedIndex[0]];
if (rank > 1) {
w = (int) dims[selectedIndex[1]];
}
transposeChoice = new JComboBox();
transposeChoice.addItem("Reshape");
transposeChoice.addItem("Transpose");
selLabel = new JLabel("", SwingConstants.CENTER);
navigator = new PreviewNavigator(w, h);
currentIndex = new int[Math.min(3, rank)];
choicePalette = new JComboBox();
choiceTextView = new JComboBox((Vector>) HDFView.getListOfTextView());
choiceImageView = new JComboBox((Vector>) HDFView.getListOfImageView());
choiceTableView = new JComboBox((Vector>) HDFView.getListOfTableView());
choicePalette.addItem("Select palette");
if(dataset instanceof ScalarDS ){
String paletteName = ((ScalarDS) dataset).getPaletteName(0);
if(paletteName==null){
paletteName = "Default";
}
choicePalette.addItem(paletteName);
for (int i = 2; i <= numberOfPalettes; i++) {
paletteName = ((ScalarDS) dataset).getPaletteName(i-1);
choicePalette.addItem(paletteName);
}
}
choicePalette.addItem("Gray");
choicePalette.addItem("ReverseGray");
choicePalette.addItem("GrayWave");
choicePalette.addItem("Rainbow");
choicePalette.addItem("Nature");
choicePalette.addItem("Wave");
spreadsheetButton = new JRadioButton("Spreadsheet ", true);
spreadsheetButton.setMnemonic(KeyEvent.VK_S);
imageButton = new JRadioButton("Image ");
imageButton.setMnemonic(KeyEvent.VK_I);
charCheckbox = new JCheckBox("Show As Char", false);
charCheckbox.setMnemonic(KeyEvent.VK_C);
charCheckbox.setEnabled(false);
charCheckbox.addItemListener(this);
extractBitButton = new JCheckBox("Show Value of Selected Bits", false);
extractBitButton.setMnemonic(KeyEvent.VK_V);
extractBitButton.setEnabled(false);
extractBitButton.addItemListener(this);
applyBitmaskButton = new JCheckBox("Apply Bitmask", false);
applyBitmaskButton.setMnemonic(KeyEvent.VK_A);
applyBitmaskButton.setEnabled(false);
applyBitmaskButton.addItemListener(this);
bitmaskHelp = new JButton(ViewProperties.getHelpIcon());
bitmaskHelp.setToolTipText("Help on how to set bitmask");
bitmaskHelp.setMargin(new Insets(0, 0, 0, 0));
bitmaskHelp.addActionListener(this);
bitmaskHelp.setActionCommand("Help on how to set bitmask");
// layout the components
JPanel contentPane = (JPanel) getContentPane();
contentPane.setLayout(new BorderLayout(5, 5));
contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
int w1 = 700 + (ViewProperties.getFontSize() - 12) * 15;
int h1 = 350 + (ViewProperties.getFontSize() - 12) * 10;
contentPane.setPreferredSize(new Dimension(w1, h1));
JPanel centerP = new JPanel();
centerP.setLayout(new BorderLayout());
centerP.setBorder(new TitledBorder("Dimension and Subset Selection"));
JPanel navigatorP = new JPanel();
navigatorP.setLayout(new BorderLayout());
navigatorP.add(navigator, BorderLayout.CENTER);
navigatorP.add(selLabel, BorderLayout.SOUTH);
navigatorP.setBorder(new EtchedBorder(EtchedBorder.LOWERED));
performJComboBoxEvent = true;
if (dataset instanceof CompoundDS) {
// setup GUI components for the field selection
CompoundDS d = (CompoundDS) dataset;
String[] names = d.getMemberNames();
fieldList = new JList(names);
fieldList.addSelectionInterval(0, names.length - 1);
JPanel fieldP = new JPanel();
fieldP.setLayout(new BorderLayout());
w1 = 150 + (ViewProperties.getFontSize() - 12) * 10;
h1 = 250 + (ViewProperties.getFontSize() - 12) * 15;
fieldP.setPreferredSize(new Dimension(w1, h1));
JScrollPane scrollP = new JScrollPane(fieldList);
fieldP.add(scrollP);
fieldP.setBorder(new TitledBorder("Select Members"));
contentPane.add(fieldP, BorderLayout.WEST);
JPanel tviewP = new JPanel();
tviewP.setLayout(new BorderLayout());
tviewP.add(new JLabel(" TableView: "), BorderLayout.WEST);
tviewP.add(choiceTableView, BorderLayout.CENTER);
tviewP.setBorder(new LineBorder(Color.LIGHT_GRAY));
centerP.add(tviewP, BorderLayout.SOUTH);
}
else if (dataset instanceof ScalarDS) {
ScalarDS sd = (ScalarDS) dataset;
isText = sd.isText();
if (isText) {
w1 = 700 + (ViewProperties.getFontSize() - 12) * 15;
h1 = 280 + (ViewProperties.getFontSize() - 12) * 10;
contentPane.setPreferredSize(new Dimension(w1, h1));
// add textview selection
JPanel txtviewP = new JPanel();
txtviewP.setLayout(new BorderLayout());
txtviewP.add(new JLabel(" TextView: "),
BorderLayout.WEST);
txtviewP.add(choiceTextView, BorderLayout.CENTER);
txtviewP.setBorder(new LineBorder(Color.LIGHT_GRAY));
centerP.add(txtviewP, BorderLayout.SOUTH);
}
else {
w1 = 680 + (ViewProperties.getFontSize() - 12) * 15;
h1 = 400 + (ViewProperties.getFontSize() - 12) * 10;
contentPane.setPreferredSize(new Dimension(w1, h1));
if (rank > 1) {
centerP.add(navigatorP, BorderLayout.WEST);
}
// setup GUI components for the display options: table or image
imageButton.addItemListener(this);
spreadsheetButton.addItemListener(this);
ButtonGroup rgroup = new ButtonGroup();
rgroup.add(spreadsheetButton);
rgroup.add(imageButton);
JPanel viewP = new JPanel();
viewP.setLayout(new GridLayout(2, 1, 5, 5));
viewP.setBorder(new TitledBorder("Display As"));
JPanel sheetP = new JPanel();
sheetP.setLayout(new GridLayout(1, 2, 25, 5));
sheetP.add(spreadsheetButton);
int tclass = sd.getDatatype().getDatatypeClass();
if (tclass == Datatype.CLASS_CHAR
|| (tclass == Datatype.CLASS_INTEGER && sd
.getDatatype().getDatatypeSize() == 1)) {
sheetP.add(charCheckbox);
}
// add tableview selection
JPanel tviewP = new JPanel();
tviewP.setLayout(new BorderLayout());
tviewP.add(new JLabel("TableView: "), BorderLayout.WEST);
tviewP.add(choiceTableView, BorderLayout.CENTER);
JPanel leftP = new JPanel();
leftP.setBorder(BorderFactory
.createLineBorder(Color.LIGHT_GRAY));
leftP.setLayout(new GridLayout(2, 1, 5, 5));
leftP.add(sheetP);
leftP.add(tviewP);
viewP.add(leftP);
JPanel imageP = new JPanel();
imageP.setLayout(new BorderLayout(5, 5));
imageP.add(imageButton, BorderLayout.WEST);
imageP.add(choicePalette, BorderLayout.CENTER);
// add imageview selection
JPanel iviewP = new JPanel();
iviewP.setLayout(new BorderLayout());
iviewP.add(new JLabel("ImageView: "), BorderLayout.WEST);
iviewP.add(choiceImageView, BorderLayout.CENTER);
JPanel rightP = new JPanel();
rightP.setBorder(BorderFactory
.createLineBorder(Color.LIGHT_GRAY));
rightP.setLayout(new GridLayout(2, 1, 5, 5));
rightP.add(imageP);
rightP.add(iviewP);
viewP.add(rightP);
JPanel northP = new JPanel();
northP.setLayout(new GridLayout(1, 2, 5, 5));
northP.add(viewP);
viewP = new JPanel();
viewP.setLayout(new BorderLayout());
northP.add(viewP);
JPanel baseIndexP = new JPanel();
viewP.add(baseIndexP, BorderLayout.NORTH);
baseIndexP.setBorder(new TitledBorder("Index Base"));
baseIndexP.setLayout(new GridLayout(1, 2, 5, 5));
base0Button = new JRadioButton("0-based ");
base1Button = new JRadioButton("1-based ");
ButtonGroup bgrp = new ButtonGroup();
bgrp.add(base0Button);
bgrp.add(base1Button);
if (ViewProperties.isIndexBase1())
base1Button.setSelected(true);
else
base0Button.setSelected(true);
baseIndexP.add(base0Button);
baseIndexP.add(base1Button);
if (tclass == Datatype.CLASS_CHAR
|| (tclass == Datatype.CLASS_INTEGER && sd
.getDatatype().getDatatypeSize() <= 2)) {
bitmaskButtons = new JRadioButton[8 * sd.getDatatype()
.getDatatypeSize()];
for (int i = 0; i < bitmaskButtons.length; i++) {
bitmaskButtons[i] = new JRadioButton(String.valueOf(i));
bitmaskButtons[i].setEnabled(false);
bitmaskButtons[i].addItemListener(this);
}
JPanel sheetP2 = new JPanel();
viewP.add(sheetP2, BorderLayout.CENTER);
sheetP2.setBorder(new TitledBorder("Bitmask"));
JPanel tmpP = new JPanel();
if(bitmaskButtons.length <=8){
tmpP.setLayout(new GridLayout(1, bitmaskButtons.length));
for (int i = bitmaskButtons.length; i>0; i--)
tmpP.add(bitmaskButtons[i-1]);
}
else{
tmpP.setLayout(new GridLayout(2, bitmaskButtons.length/2));
for (int i = bitmaskButtons.length; i>bitmaskButtons.length/2; i--)
tmpP.add(bitmaskButtons[i-1]);
for (int i = bitmaskButtons.length/2; i>0; i--)
tmpP.add(bitmaskButtons[i-1]);
}
sheetP2.setLayout(new BorderLayout(10, 10));
sheetP2.add(tmpP, BorderLayout.CENTER);
sheetP2.add(new JLabel(), BorderLayout.NORTH);
JPanel tmpP2 = new JPanel();
tmpP2.setLayout(new GridLayout(2,1));
tmpP2.add(extractBitButton);
tmpP2.add(applyBitmaskButton);
tmpP = new JPanel();
tmpP.setLayout(new BorderLayout());
tmpP.add(tmpP2, BorderLayout.WEST);
tmpP2 = new JPanel();
tmpP2.add(bitmaskHelp);
tmpP.add(tmpP2, BorderLayout.EAST);
sheetP2.add(tmpP, BorderLayout.NORTH);
}
contentPane.add(northP, BorderLayout.NORTH);
}
}
// setup GUI for dimension and subset selection
JPanel selectionP = new JPanel();
selectionP.setLayout(new GridLayout(5, 6, 10, 3));
selectionP.setBorder(new EtchedBorder(EtchedBorder.LOWERED));
centerP.add(selectionP, BorderLayout.CENTER);
contentPane.add(centerP, BorderLayout.CENTER);
selectionP.add(new JLabel(" "));
if (rank > 1)
selectionP.add(transposeChoice);
else
selectionP.add(new JLabel(" "));
JLabel label = new JLabel("Start:");
selectionP.add(label);
label = new JLabel("End: ");
selectionP.add(label);
label = new JLabel("Stride:");
selectionP.add(label);
label = new JLabel("Max Size");
selectionP.add(label);
choices = new JComboBox[3];
maxLabels = new JLabel[3];
startFields = new JTextField[3];
endFields = new JTextField[3];
strideFields = new JTextField[3];
JLabel dimLabels[] = { new JLabel("Height", SwingConstants.RIGHT),
new JLabel("Width", SwingConstants.RIGHT),
new JLabel("Depth", SwingConstants.RIGHT), };
String[] dimNames = dataset.getDimNames();
for (int i = 0; i < 3; i++) {
choices[i] = new JComboBox();
choices[i].addItemListener(this);
for (int j = 0; j < rank; j++) {
if (dimNames == null) {
choices[i].addItem("dim " + j);
}
else {
choices[i].addItem(dimNames[j]);
}
}
maxLabels[i] = new JLabel("1");
startFields[i] = new JTextField("0");
endFields[i] = new JTextField("0");
strideFields[i] = new JTextField("1");
selectionP.add(dimLabels[i]);
selectionP.add(choices[i]);
selectionP.add(startFields[i]);
selectionP.add(endFields[i]);
selectionP.add(strideFields[i]);
selectionP.add(maxLabels[i]);
// disable the selection components
// init() will set them appropriate
choices[i].setEnabled(false);
startFields[i].setEnabled(false);
endFields[i].setEnabled(false);
strideFields[i].setEnabled(false);
maxLabels[i].setEnabled(false);
}
// add button dimension selection when dimension size >= 4
JButton button = new JButton("dims...");
selectionP.add(new JLabel("", SwingConstants.RIGHT));
selectionP.add(button);
button.setActionCommand("Select more dimensions");
button.addActionListener(this);
button.setEnabled((rank > 3));
selectionP.add(new JLabel(" "));
selectionP.add(new JLabel(" "));
button = new JButton("Reset");
button.setActionCommand("Reset data range");
button.addActionListener(this);
selectionP.add(button);
selectionP.add(new JLabel(" "));
// add OK and CANCEL buttons
JPanel confirmP = new JPanel();
contentPane.add(confirmP, BorderLayout.SOUTH);
button = new JButton(" Ok ");
button.setMnemonic(KeyEvent.VK_O);
button.setActionCommand("Ok");
button.addActionListener(this);
confirmP.add(button);
button = new JButton("Cancel");
button.setMnemonic(KeyEvent.VK_C);
button.setActionCommand("Cancel");
button.addActionListener(this);
confirmP.add(button);
init();
// locate the H5Property dialog
Point l = getParent().getLocation();
l.x += 250;
l.y += 80;
setLocation(l);
pack();
}
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("Ok")) {
// set palette for image view
if ((dataset instanceof ScalarDS) && imageButton.isSelected()) {
setPalette();
}
isSelectionCancelled = !setSelection();
if (isSelectionCancelled) {
return;
}
if (dataset instanceof ScalarDS) {
((ScalarDS) dataset).setIsImageDisplay(imageButton.isSelected());
}
dispose();
}
else if (cmd.equals("Cancel")) {
dispose();
}
else if (cmd.equals("Reset data range")) {
int n = startFields.length;
for (int i = 0; i < n; i++) {
startFields[i].setText("0");
strideFields[i].setText("1");
long l = Long.valueOf(maxLabels[i].getText()) - 1;
endFields[i].setText(String.valueOf(l));
}
}
else if (cmd.equals("Select more dimensions")) {
if (rank < 4) {
return;
}
int idx = 0;
Vector
© 2015 - 2025 Weber Informatics LLC | Privacy Policy