/* * Copyright 2010-2015 Institut Pasteur. * * This file is part of Icy. * * Icy 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 3 of the License, or * (at your option) any later version. * * Icy 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 Icy. If not, see <http://www.gnu.org/licenses/>. */ package icy.gui.sequence.tools; import icy.gui.component.sequence.SequencePreviewPanel; import icy.image.IcyBufferedImage; import icy.sequence.AbstractSequenceModel; import icy.sequence.Sequence; import icy.sequence.SequenceUtil; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import javax.swing.ButtonGroup; import javax.swing.DefaultBoundedRangeModel; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JSlider; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.SwingConstants; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * @author Stephane */ public class SequenceDimensionConvertPanel extends JPanel { private class SequenceDimensionConvertPanelModel extends AbstractSequenceModel { public SequenceDimensionConvertPanelModel() { super(); } @Override public BufferedImage getImage(int t, int z) { return SequenceUtil.AdjustZTHelper .getImage(sequence, t, z, getNewSizeZ(), getNewSizeT(), isOrderReversed()); } @Override public int getSizeX() { return sequence.getSizeX(); } @Override public int getSizeY() { return sequence.getSizeY(); } @Override public int getSizeZ() { return getNewSizeZ(); } @Override public int getSizeT() { return getNewSizeT(); } @Override public int getSizeC() { return sequence.getSizeC(); } @Override public BufferedImage getImage(int t, int z, int c) { return ((IcyBufferedImage) getImage(t, z)).getImage(c); } } /** * */ private static final long serialVersionUID = -6906749224563258829L; // GUI private JRadioButton ztRadioButton; private JRadioButton tzRadioButton; JSlider sizeZSlider; JSlider sizeTSlider; JSpinner sizeZSpinner; JSpinner sizeTSpinner; SequencePreviewPanel previewPane; private ButtonGroup dimensionGroup; // internals final Sequence sequence; boolean changingZ; boolean changingT; public SequenceDimensionConvertPanel(Sequence sequence) { super(); this.sequence = sequence; changingZ = false; changingT = false; initialize(); dimensionGroup = new ButtonGroup(); dimensionGroup.add(tzRadioButton); dimensionGroup.add(ztRadioButton); dimensionGroup.setSelected(ztRadioButton.getModel(), true); final int sizeZ = sequence.getSizeZ(); final int sizeT = sequence.getSizeT(); final int sizeZT = sizeZ * sizeT; sizeZSlider.setModel(new DefaultBoundedRangeModel(sizeZ, 0, 1, sizeZT)); sizeZSpinner.setModel(new SpinnerNumberModel(sizeZ, 1, sizeZT, 1)); sizeTSlider.setModel(new DefaultBoundedRangeModel(sizeT, 0, 1, sizeZT)); sizeTSpinner.setModel(new SpinnerNumberModel(sizeT, 1, sizeZT, 1)); tzRadioButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { previewPane.imageChanged(); } }); ztRadioButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { previewPane.imageChanged(); } }); sizeZSlider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { if (changingT) return; final int newSize = sizeZSlider.getValue(); sizeZSpinner.setValue(Integer.valueOf(newSize)); sizeZChanged(); } }); sizeZSpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { if (changingT) return; final int newSize = ((Integer) sizeZSpinner.getValue()).intValue(); sizeZSlider.setValue(newSize); sizeZChanged(); } }); sizeTSlider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { if (changingZ) return; final int newSize = sizeTSlider.getValue(); sizeTSpinner.setValue(Integer.valueOf(newSize)); sizeTChanged(); } }); sizeTSpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { if (changingZ) return; final int newSize = ((Integer) sizeTSpinner.getValue()).intValue(); sizeTSlider.setValue(newSize); sizeTChanged(); } }); previewPane.setModel(new SequenceDimensionConvertPanelModel()); } private void initialize() { GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[] {20, 0, 20, 0, 0, 0, 80, 20, 0}; gridBagLayout.rowHeights = new int[] {0, 0, 0, 0, 0}; gridBagLayout.columnWeights = new double[] {1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; gridBagLayout.rowWeights = new double[] {0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; setLayout(gridBagLayout); final JLabel lblNewLabel = new JLabel("Dimension order"); lblNewLabel.setHorizontalAlignment(SwingConstants.TRAILING); GridBagConstraints gbc_lblNewLabel = new GridBagConstraints(); gbc_lblNewLabel.fill = GridBagConstraints.BOTH; gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5); gbc_lblNewLabel.gridx = 1; gbc_lblNewLabel.gridy = 0; add(lblNewLabel, gbc_lblNewLabel); ztRadioButton = new JRadioButton("Z - T"); GridBagConstraints gbc_ztRadioButton = new GridBagConstraints(); gbc_ztRadioButton.fill = GridBagConstraints.BOTH; gbc_ztRadioButton.insets = new Insets(0, 0, 5, 5); gbc_ztRadioButton.gridx = 3; gbc_ztRadioButton.gridy = 0; add(ztRadioButton, gbc_ztRadioButton); tzRadioButton = new JRadioButton("T - Z"); GridBagConstraints gbc_tzRadioButton = new GridBagConstraints(); gbc_tzRadioButton.gridwidth = 2; gbc_tzRadioButton.fill = GridBagConstraints.BOTH; gbc_tzRadioButton.insets = new Insets(0, 0, 5, 5); gbc_tzRadioButton.gridx = 4; gbc_tzRadioButton.gridy = 0; add(tzRadioButton, gbc_tzRadioButton); final JLabel lblNewLabel_1 = new JLabel("Size Z"); lblNewLabel_1.setHorizontalAlignment(SwingConstants.TRAILING); lblNewLabel_1.setToolTipText("Size of Z dimension"); GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints(); gbc_lblNewLabel_1.fill = GridBagConstraints.BOTH; gbc_lblNewLabel_1.insets = new Insets(0, 0, 5, 5); gbc_lblNewLabel_1.gridx = 1; gbc_lblNewLabel_1.gridy = 1; add(lblNewLabel_1, gbc_lblNewLabel_1); sizeZSpinner = new JSpinner(); sizeZSpinner.setToolTipText("Size of Z dimension"); GridBagConstraints gbc_zSpinner = new GridBagConstraints(); gbc_zSpinner.gridwidth = 2; gbc_zSpinner.fill = GridBagConstraints.BOTH; gbc_zSpinner.insets = new Insets(0, 0, 5, 5); gbc_zSpinner.gridx = 3; gbc_zSpinner.gridy = 1; add(sizeZSpinner, gbc_zSpinner); sizeZSlider = new JSlider(); GridBagConstraints gbc_zSlider = new GridBagConstraints(); gbc_zSlider.gridwidth = 2; gbc_zSlider.fill = GridBagConstraints.BOTH; gbc_zSlider.insets = new Insets(0, 0, 5, 5); gbc_zSlider.gridx = 5; gbc_zSlider.gridy = 1; add(sizeZSlider, gbc_zSlider); final JLabel lblNewLabel_2 = new JLabel("Size T"); lblNewLabel_2.setHorizontalAlignment(SwingConstants.TRAILING); lblNewLabel_2.setToolTipText("Size of T dimension"); GridBagConstraints gbc_lblNewLabel_2 = new GridBagConstraints(); gbc_lblNewLabel_2.fill = GridBagConstraints.BOTH; gbc_lblNewLabel_2.insets = new Insets(0, 0, 5, 5); gbc_lblNewLabel_2.gridx = 1; gbc_lblNewLabel_2.gridy = 2; add(lblNewLabel_2, gbc_lblNewLabel_2); sizeTSpinner = new JSpinner(); sizeTSpinner.setToolTipText("Size of T dimension"); GridBagConstraints gbc_tSpinner = new GridBagConstraints(); gbc_tSpinner.gridwidth = 2; gbc_tSpinner.fill = GridBagConstraints.BOTH; gbc_tSpinner.insets = new Insets(0, 0, 5, 5); gbc_tSpinner.gridx = 3; gbc_tSpinner.gridy = 2; add(sizeTSpinner, gbc_tSpinner); sizeTSlider = new JSlider(); GridBagConstraints gbc_tSlider = new GridBagConstraints(); gbc_tSlider.gridwidth = 2; gbc_tSlider.insets = new Insets(0, 0, 5, 5); gbc_tSlider.fill = GridBagConstraints.BOTH; gbc_tSlider.gridx = 5; gbc_tSlider.gridy = 2; add(sizeTSlider, gbc_tSlider); previewPane = new SequencePreviewPanel(true); previewPane.setBorder(new TitledBorder(null, "Preview", TitledBorder.LEADING, TitledBorder.TOP, null, null)); GridBagConstraints gbc_previewPane = new GridBagConstraints(); gbc_previewPane.gridwidth = 8; gbc_previewPane.insets = new Insets(0, 0, 0, 5); gbc_previewPane.fill = GridBagConstraints.BOTH; gbc_previewPane.gridx = 0; gbc_previewPane.gridy = 3; add(previewPane, gbc_previewPane); } void sizeZChanged() { final int sizeZT = sequence.getSizeZ() * sequence.getSizeT(); final int newSizeZ = getNewSizeZ(); int newSizeT = sizeZT / newSizeZ; if ((sizeZT % newSizeZ) != 0) newSizeT++; changingZ = true; try { sizeTSpinner.setValue(Integer.valueOf(newSizeT)); sizeTSlider.setValue(newSizeT); previewPane.dimensionChanged(); } finally { changingZ = false; } } void sizeTChanged() { final int sizeZT = sequence.getSizeZ() * sequence.getSizeT(); final int newSizeT = getNewSizeT(); int newSizeZ = sizeZT / newSizeT; if ((sizeZT % newSizeT) != 0) newSizeZ++; changingT = true; try { sizeZSpinner.setValue(Integer.valueOf(newSizeZ)); sizeZSlider.setValue(newSizeZ); previewPane.dimensionChanged(); } finally { changingT = false; } } public Sequence getSequence() { return sequence; } public boolean isOrderReversed() { return dimensionGroup.getSelection() == tzRadioButton.getModel(); } public int getNewSizeZ() { return ((Integer) sizeZSpinner.getValue()).intValue(); } public int getNewSizeT() { return ((Integer) sizeTSpinner.getValue()).intValue(); } }