/*
* 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.dialog.ActionDialog;
import icy.gui.frame.progress.ProgressFrame;
import icy.gui.util.ComponentUtil;
import icy.sequence.AbstractSequenceModel;
import icy.sequence.DimensionId;
import icy.sequence.Sequence;
import icy.system.thread.ThreadUtil;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
/**
* @author Stephane
*/
public class SequenceDimensionAdjustFrame extends ActionDialog
{
/**
*
*/
private static final long serialVersionUID = -383226926743211242L;
private class SequenceDimensionAdjustFrameModel extends AbstractSequenceModel
{
public SequenceDimensionAdjustFrameModel()
{
super();
}
@Override
public int getSizeX()
{
if (sequence != null)
return sequence.getSizeX();
return 0;
}
@Override
public int getSizeY()
{
if (sequence != null)
return sequence.getSizeY();
return 0;
}
@Override
public int getSizeZ()
{
if (sequence != null)
return sequence.getSizeZ();
return 0;
}
@Override
public int getSizeT()
{
if (sequence != null)
return sequence.getSizeT();
return 0;
}
@Override
public int getSizeC()
{
if (sequence != null)
return sequence.getSizeC();
return 0;
}
@Override
public BufferedImage getImage(int t, int z)
{
if (sequence != null)
return sequence.getImage(t, z);
return null;
}
@Override
public BufferedImage getImage(int t, int z, int c)
{
if (sequence != null)
return sequence.getImage(t, z, c);
return null;
}
}
final Sequence sequence;
final SequenceDimensionAdjustPanel rangePanel;
final DimensionId dim;
public SequenceDimensionAdjustFrame(Sequence sequence, DimensionId dim)
{
super("Adjust " + dim.toString() + " dimension");
this.sequence = sequence;
this.dim = dim;
rangePanel = new SequenceDimensionAdjustPanel(dim);
rangePanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 0, 4));
mainPanel.add(rangePanel, BorderLayout.CENTER);
validate();
rangePanel.setModel(new SequenceDimensionAdjustFrameModel());
setOkAction(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
ThreadUtil.bgRun(new Runnable()
{
@Override
public void run()
{
final DimensionId dim = SequenceDimensionAdjustFrame.this.dim;
final ProgressFrame pf;
if (dim == DimensionId.Z)
pf = new ProgressFrame("Removing slices...");
else
pf = new ProgressFrame("Removing frames...");
final Sequence seq = SequenceDimensionAdjustFrame.this.sequence;
final Sequence tmp = new Sequence();
int sizeT = seq.getSizeT();
int sizeZ = seq.getSizeZ();
tmp.beginUpdate();
seq.beginUpdate();
try
{
int i = 0;
// create a temporary sequence containing resulting images
for (int t = 0; t < sizeT; t++)
{
if (dim == DimensionId.Z)
i = 0;
for (int z = 0; z < sizeZ; z++)
{
if (dim == DimensionId.Z)
{
if (rangePanel.isIndexSelected(z))
tmp.setImage(t, i++, seq.getImage(t, z));
}
else
{
if (rangePanel.isIndexSelected(t))
tmp.setImage(i, z, seq.getImage(t, z));
}
}
if ((dim == DimensionId.T) && (rangePanel.isIndexSelected(t)))
i++;
}
sizeT = tmp.getSizeT();
sizeZ = tmp.getSizeZ();
// then copy back tmp images in seq
seq.removeAllImages();
for (int t = 0; t < sizeT; t++)
for (int z = 0; z < sizeZ; z++)
seq.setImage(t, z, tmp.getImage(t, z));
}
finally
{
seq.endUpdate();
tmp.endUpdate();
pf.close();
}
}
});
}
});
setSize(320, 360);
ComponentUtil.center(this);
setVisible(true);
}
/**
* @wbp.parser.constructor
*/
SequenceDimensionAdjustFrame()
{
this(new Sequence(), DimensionId.Z);
}
}