/* * 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.sequence.DimensionId; import icy.sequence.Sequence; import icy.sequence.SequenceModel; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; 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 SequenceDimensionExtendPanel extends JPanel { static class SequenceChannelEntry { final Sequence sequence; final int c; /** * @param sequence * @param c */ public SequenceChannelEntry(Sequence sequence, int c) { super(); this.sequence = sequence; this.c = c; } public SequenceChannelEntry(Sequence sequence) { this(sequence, -1); } @Override public String toString() { if (c == -1) return sequence.toString(); return sequence.toString() + " [channel " + c + "]"; } } /** * */ private static final long serialVersionUID = -5908902915282090447L; protected SequencePreviewPanel sequencePreview; private JLabel lblInsertPosition; JSpinner insertPositionSpinner; private JLabel lblNewZSize; private JSpinner newSizeSpinner; private JLabel lblImages; JSpinner duplicateSpinner; JCheckBox duplicateCheckBox; // internals protected final DimensionId dim; /** * Create the panel. */ public SequenceDimensionExtendPanel(DimensionId dim) { super(); if ((dim != DimensionId.Z) && (dim != DimensionId.T)) throw new IllegalArgumentException("Only Z or T dimension allowed"); this.dim = dim; initialize(); newSizeSpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { previewDimensionChanged(); fireChangedEvent(); } }); final ChangeListener changeListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { previewImageChanged(); fireChangedEvent(); } }; insertPositionSpinner.addChangeListener(changeListener); duplicateSpinner.addChangeListener(changeListener); duplicateCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { duplicateSpinner.setEnabled(duplicateCheckBox.isSelected()); previewImageChanged(); fireChangedEvent(); } }); refreshButtonsState(); } private void initialize() { GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[] {20, 0, 20, 0, 0, 0, 0}; gridBagLayout.rowHeights = new int[] {0, 0, 0, 174, 0}; gridBagLayout.columnWeights = new double[] {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); lblNewZSize = new JLabel("New size"); lblNewZSize.setToolTipText("New dimension size"); lblNewZSize.setHorizontalAlignment(SwingConstants.TRAILING); GridBagConstraints gbc_lblNewZSize = new GridBagConstraints(); gbc_lblNewZSize.fill = GridBagConstraints.BOTH; gbc_lblNewZSize.insets = new Insets(0, 0, 5, 5); gbc_lblNewZSize.gridx = 1; gbc_lblNewZSize.gridy = 0; add(lblNewZSize, gbc_lblNewZSize); newSizeSpinner = new JSpinner(); newSizeSpinner.setToolTipText("Enter new size"); newSizeSpinner.setModel(new SpinnerNumberModel(0, 0, 99999, 1)); GridBagConstraints gbc_newSizeSpinner = new GridBagConstraints(); gbc_newSizeSpinner.fill = GridBagConstraints.BOTH; gbc_newSizeSpinner.insets = new Insets(0, 0, 5, 5); gbc_newSizeSpinner.gridx = 3; gbc_newSizeSpinner.gridy = 0; add(newSizeSpinner, gbc_newSizeSpinner); lblInsertPosition = new JLabel("Insert position"); lblInsertPosition.setToolTipText("Index where to add the new image(s)"); lblInsertPosition.setHorizontalAlignment(SwingConstants.TRAILING); GridBagConstraints gbc_lblInsertPosition = new GridBagConstraints(); gbc_lblInsertPosition.fill = GridBagConstraints.BOTH; gbc_lblInsertPosition.insets = new Insets(0, 0, 5, 5); gbc_lblInsertPosition.gridx = 1; gbc_lblInsertPosition.gridy = 1; add(lblInsertPosition, gbc_lblInsertPosition); insertPositionSpinner = new JSpinner(); insertPositionSpinner.setToolTipText("Index where to add the new image(s)"); insertPositionSpinner.setModel(new SpinnerNumberModel(0, 0, 99999, 1)); GridBagConstraints gbc_insertPositionSpinner = new GridBagConstraints(); gbc_insertPositionSpinner.fill = GridBagConstraints.BOTH; gbc_insertPositionSpinner.insets = new Insets(0, 0, 5, 5); gbc_insertPositionSpinner.gridx = 3; gbc_insertPositionSpinner.gridy = 1; add(insertPositionSpinner, gbc_insertPositionSpinner); duplicateCheckBox = new JCheckBox("Duplicate last"); duplicateCheckBox.setToolTipText("Duplicate last images in new images"); GridBagConstraints gbc_duplicateCheckBox = new GridBagConstraints(); gbc_duplicateCheckBox.fill = GridBagConstraints.BOTH; gbc_duplicateCheckBox.insets = new Insets(0, 0, 5, 5); gbc_duplicateCheckBox.gridx = 1; gbc_duplicateCheckBox.gridy = 2; add(duplicateCheckBox, gbc_duplicateCheckBox); duplicateSpinner = new JSpinner(); duplicateSpinner.setToolTipText("Number of last images to duplicate"); duplicateSpinner.setEnabled(false); duplicateSpinner.setModel(new SpinnerNumberModel(1, 1, 99999, 1)); GridBagConstraints gbc_duplicateSpinner = new GridBagConstraints(); gbc_duplicateSpinner.fill = GridBagConstraints.BOTH; gbc_duplicateSpinner.insets = new Insets(0, 0, 5, 5); gbc_duplicateSpinner.gridx = 3; gbc_duplicateSpinner.gridy = 2; add(duplicateSpinner, gbc_duplicateSpinner); lblImages = new JLabel("image(s)"); GridBagConstraints gbc_lblImages = new GridBagConstraints(); gbc_lblImages.gridwidth = 2; gbc_lblImages.fill = GridBagConstraints.BOTH; gbc_lblImages.insets = new Insets(0, 0, 5, 0); gbc_lblImages.gridx = 4; gbc_lblImages.gridy = 2; add(lblImages, gbc_lblImages); sequencePreview = new SequencePreviewPanel(); sequencePreview .setBorder(new TitledBorder(null, "Preview", TitledBorder.LEADING, TitledBorder.TOP, null, null)); GridBagConstraints gbc_sequencePreview = new GridBagConstraints(); gbc_sequencePreview.gridwidth = 6; gbc_sequencePreview.fill = GridBagConstraints.BOTH; gbc_sequencePreview.gridx = 0; gbc_sequencePreview.gridy = 3; add(sequencePreview, gbc_sequencePreview); } public DimensionId getDimensionId() { return dim; } void refreshButtonsState() { } /** * @return the image provider */ public SequenceModel getModel() { return sequencePreview.getModel(); } public void setModel(SequenceModel model) { sequencePreview.setModel(model); } public void previewDimensionChanged() { sequencePreview.dimensionChanged(); } public void previewImageChanged() { sequencePreview.imageChanged(); } public int getNewSize() { return ((Integer) newSizeSpinner.getValue()).intValue(); } public int getInsertPosition() { return ((Integer) insertPositionSpinner.getValue()).intValue(); } public int getDuplicateNumber() { if (!duplicateCheckBox.isSelected()) return 0; return ((Integer) duplicateSpinner.getValue()).intValue(); } public void setNewSize(int size) { newSizeSpinner.setModel(new SpinnerNumberModel(size, size, 99999, 1)); insertPositionSpinner.setModel(new SpinnerNumberModel(size, 0, size, 1)); } public void setInsertPosition(int position) { insertPositionSpinner.setValue(Integer.valueOf(position)); } public void setMaxDuplicate(int max) { duplicateSpinner.setModel(new SpinnerNumberModel(1, 1, Math.max(max, 1), 1)); } protected void fireChangedEvent() { final ChangeEvent event = new ChangeEvent(SequenceDimensionExtendPanel.this); for (ChangeListener listener : getListeners(ChangeListener.class)) listener.stateChanged(event); } public void addChangeListener(ChangeListener listener) { listenerList.add(ChangeListener.class, listener); } public void removeChangeListener(ChangeListener listener) { listenerList.remove(ChangeListener.class, listener); } }