/*
* 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.action;
import icy.gui.dialog.IdConfirmDialog;
import icy.gui.dialog.MessageDialog;
import icy.gui.main.MainFrame;
import icy.gui.sequence.tools.SequenceCanvasResizeFrame;
import icy.gui.sequence.tools.SequenceDimensionAdjustFrame;
import icy.gui.sequence.tools.SequenceDimensionConvertFrame;
import icy.gui.sequence.tools.SequenceDimensionExtendFrame;
import icy.gui.sequence.tools.SequenceDimensionMergeFrame;
import icy.gui.sequence.tools.SequenceResizeFrame;
import icy.gui.viewer.Viewer;
import icy.main.Icy;
import icy.resource.ResourceUtil;
import icy.resource.icon.IcyIcon;
import icy.roi.ROI;
import icy.sequence.DimensionId;
import icy.sequence.Sequence;
import icy.sequence.SequenceDataIterator;
import icy.sequence.SequenceUtil;
import icy.system.SystemUtil;
import icy.system.thread.ThreadUtil;
import icy.type.DataIteratorUtil;
import icy.type.DataType;
import icy.undo.IcyUndoManager;
import icy.util.ClassUtil;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Actions for "Sequence Operation" tab.
*
* @author Stephane
*/
public class SequenceOperationActions
{
static class SequenceConvertAction extends IcyAbstractAction
{
/**
*
*/
private static final long serialVersionUID = 614601313456867774L;
final DataType dataType;
final boolean scaled;
public SequenceConvertAction(DataType dataType, boolean scaled)
{
super(dataType.toString(true), new IcyIcon(ResourceUtil.ICON_BAND_RIGHT), "Convert to "
+ dataType.toString(true), "Convert sequence data type to " + dataType.toString(true), true,
"Converting sequence to " + dataType.toString(false) + " ...");
this.dataType = dataType;
this.scaled = scaled;
}
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer != null)
{
final Sequence sequence = viewer.getSequence();
if (sequence != null)
{
final Sequence out = SequenceUtil.convertToType(Icy.getMainInterface().getActiveSequence(),
dataType, scaled);
ThreadUtil.invokeLater(new Runnable()
{
@Override
public void run()
{
// get output viewer
final Viewer vout = new Viewer(out);
// restore colormap from input viewer
vout.getLut().setColorMaps(viewer.getLut(), false);
}
});
return true;
}
}
return false;
}
@Override
public boolean isEnabled()
{
return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null);
}
}
static class SequenceColorAction extends IcyAbstractAction
{
/**
*
*/
private static final long serialVersionUID = 3775617713982984867L;
private static final Image images[] = {null, ResourceUtil.ICON_RGB_COLOR, ResourceUtil.ICON_ARGB_COLOR, null,
null, null, null, null, null, null, ResourceUtil.ICON_GRAY_COLOR, null, null, null, null, null};
private static final String names[] = {null, "RGB image", "ARGB image", null, null, null, null, null, null,
null, "Gray image", null, null, null, null, null};
private static final String titles[] = {null, "Build RGB image", "Build ARGB image", null, null, null, null,
null, null, null, "Build gray image", null, null, null, null, null};
private static final String tooltips[] = {
null,
"Create a RGB color rendered version of the current sequence.\nResulting sequence is 3 channels with unsigned byte (8 bits) data type.",
"Create an ARGB color (support transparency) rendered version of the current sequence.\nResulting sequence is 4 channels with unsigned byte (8 bits) data type.",
null,
null,
null,
null,
null,
null,
null,
"Create a gray rendered version of the current sequence.\nResulting sequence is single channel with unsigned byte (8 bits) data type.",
null, null, null, null, null};
private static final String processMessages[] = {null, "Converting to RGB image...",
"Converting to ARGB image...", null, null, null, null, null, null, null, "Converting to gray image...",
null, null, null, null, null};
final int imageType;
public SequenceColorAction(int imageType)
{
super(names[imageType], new IcyIcon(images[imageType], false), titles[imageType], tooltips[imageType],
true, processMessages[imageType]);
this.imageType = imageType;
}
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer != null)
{
final Sequence sequence = viewer.getSequence();
if (sequence != null)
{
// convert the sequence
final Sequence out = SequenceUtil.convertColor(sequence, imageType, viewer.getLut());
Icy.getMainInterface().addSequence(out);
return true;
}
}
return false;
}
@Override
public boolean isEnabled()
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
return super.isEnabled() && (sequence != null) && !sequence.isEmpty();
}
}
public static class ExtractChannelAction extends IcyAbstractAction
{
private static final long serialVersionUID = -8722922231336771871L;
final int channel;
public ExtractChannelAction(int channel)
{
super((channel == -1) ? "all channels" : "channel " + channel, new IcyIcon(
ResourceUtil.ICON_INDENT_DECREASE), (channel == -1) ? "Extract all channels" : "Extract channel "
+ channel, (channel == -1) ? "Separate all channels of active sequence"
: "Create a new single channel sequence from channel " + channel + " of active sequence", true,
(channel == -1) ? "Extracting channel(s)..." : "Extracting channel " + channel + "...");
this.channel = channel;
}
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
if (channel == -1)
{
for (int c = 0; c < sequence.getSizeC(); c++)
Icy.getMainInterface().addSequence(SequenceUtil.extractChannel(sequence, c));
}
else
Icy.getMainInterface().addSequence(SequenceUtil.extractChannel(sequence, channel));
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
final Sequence seq = Icy.getMainInterface().getActiveSequence();
return super.isEnabled() && (seq != null) && (channel < seq.getSizeC());
}
}
public static class RemoveChannelAction extends IcyAbstractAction
{
private static final long serialVersionUID = 66288944320765300L;
final int channel;
public RemoveChannelAction(int channel)
{
super("channel " + channel, new IcyIcon(ResourceUtil.ICON_INDENT_REMOVE), "Remove channel " + channel,
"Remove channel " + channel + " from active sequence", true, "Removing channel " + channel + "...");
this.channel = channel;
}
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
// create undo point
final boolean canUndo = sequence.createUndoPoint("Channel " + channel + "removed");
// cannot backup
if (!canUndo)
{
// ask confirmation to continue
if (!IdConfirmDialog.confirm("Not enough memory to undo the operation, do you want to continue ?",
"ChannelRemoveNoUndoConfirm"))
return false;
}
SequenceUtil.removeChannel(sequence, channel);
// no undo, clear undo manager after modification
if (!canUndo)
sequence.clearUndoManager();
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
final Sequence seq = Icy.getMainInterface().getActiveSequence();
return super.isEnabled() && (seq != null) && (channel < seq.getSizeC());
}
}
public static class MergeDimensionAction extends IcyAbstractAction
{
private static final long serialVersionUID = -3859065456632266213L;
private static final String titles[] = {null, null, null, "Merge channels", "Merge Z slices", "Merge T frames"};
private static final String tooltips[] = {null, null, null,
"Merge channels from severals input sequences to build a new sequence.",
"Merge Z slices from severals input sequences to build a new sequence.",
"Merge T frames from severals input sequences to build a new sequence."};
final DimensionId dim;
public MergeDimensionAction(DimensionId dim)
{
super("Merge...", new IcyIcon(ResourceUtil.ICON_INDENT_INCREASE), titles[dim.ordinal()], tooltips[dim
.ordinal()]);
this.dim = dim;
}
@Override
public boolean doAction(ActionEvent e)
{
new SequenceDimensionMergeFrame(dim);
return true;
}
}
public static IcyAbstractAction cloneSequenceAction = new IcyAbstractAction("Duplicate", new IcyIcon(
ResourceUtil.ICON_COPY), "Duplicate sequence", "Create a fresh copy of the sequence", true,
"Duplicating sequence...")
{
/**
*
*/
private static final long serialVersionUID = 6907103082567189377L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer == null)
return false;
final Sequence seq = viewer.getSequence();
if (seq == null)
return false;
ThreadUtil.bgRun(new Runnable()
{
@Override
public void run()
{
// create output sequence
final Sequence out = SequenceUtil.getCopy(seq);
ThreadUtil.invokeLater(new Runnable()
{
@Override
public void run()
{
// get output viewer
final Viewer vout = new Viewer(out);
// copy colormap from input viewer
vout.getLut().copyFrom(viewer.getLut());
}
});
}
});
return true;
}
@Override
public boolean isEnabled()
{
return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null);
}
};
public static IcyAbstractAction convertUByteScaledSequenceAction = new SequenceConvertAction(DataType.UBYTE, true);
public static IcyAbstractAction convertUByteSequenceAction = new SequenceConvertAction(DataType.UBYTE, false);
public static IcyAbstractAction convertByteScaledSequenceAction = new SequenceConvertAction(DataType.BYTE, true);
public static IcyAbstractAction convertByteSequenceAction = new SequenceConvertAction(DataType.BYTE, false);
public static IcyAbstractAction convertUShortScaledSequenceAction = new SequenceConvertAction(DataType.USHORT, true);
public static IcyAbstractAction convertUShortSequenceAction = new SequenceConvertAction(DataType.USHORT, false);
public static IcyAbstractAction convertShortScaledSequenceAction = new SequenceConvertAction(DataType.SHORT, true);
public static IcyAbstractAction convertShortSequenceAction = new SequenceConvertAction(DataType.SHORT, false);
public static IcyAbstractAction convertUIntScaledSequenceAction = new SequenceConvertAction(DataType.UINT, true);
public static IcyAbstractAction convertUIntSequenceAction = new SequenceConvertAction(DataType.UINT, false);
public static IcyAbstractAction convertIntScaledSequenceAction = new SequenceConvertAction(DataType.INT, true);
public static IcyAbstractAction convertIntSequenceAction = new SequenceConvertAction(DataType.INT, false);
public static IcyAbstractAction convertFloatScaledSequenceAction = new SequenceConvertAction(DataType.FLOAT, true);
public static IcyAbstractAction convertFloatSequenceAction = new SequenceConvertAction(DataType.FLOAT, false);
public static IcyAbstractAction convertDoubleScaledSequenceAction = new SequenceConvertAction(DataType.DOUBLE, true);
public static IcyAbstractAction convertDoubleSequenceAction = new SequenceConvertAction(DataType.DOUBLE, false);
// color operations
public static IcyAbstractAction argbSequenceAction = new SequenceColorAction(BufferedImage.TYPE_INT_ARGB);
public static IcyAbstractAction rgbSequenceAction = new SequenceColorAction(BufferedImage.TYPE_INT_RGB);
public static IcyAbstractAction graySequenceAction = new SequenceColorAction(BufferedImage.TYPE_BYTE_GRAY);
// XY plan operations
public static IcyAbstractAction cropSequenceAction = new IcyAbstractAction("Fast crop", new IcyIcon(
ResourceUtil.ICON_CUT), "Fast crop image", "Crop an image from a ROI")
{
private static final long serialVersionUID = 2928113834852115366L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer == null)
return false;
final Sequence seq = viewer.getSequence();
if (seq == null)
return false;
List<ROI> rois = seq.getROIs();
int size = rois.size();
if (size == 0)
{
MessageDialog.showDialog(
"There is no ROI in the current sequence.\nYou need a ROI to define the region to crop.",
MessageDialog.INFORMATION_MESSAGE);
return false;
}
else if (size > 1)
{
rois = seq.getSelectedROIs();
size = rois.size();
if (size == 0)
{
MessageDialog.showDialog("You need to select a ROI to do this operation.",
MessageDialog.INFORMATION_MESSAGE);
return false;
}
else if (size > 1)
{
MessageDialog.showDialog("You must have only one selected ROI to do this operation.",
MessageDialog.INFORMATION_MESSAGE);
return false;
}
}
final ROI roi = rois.get(0);
ThreadUtil.bgRun(new Runnable()
{
@Override
public void run()
{
// create output sequence
final Sequence out = SequenceUtil.getSubSequence(seq, roi);
ThreadUtil.invokeLater(new Runnable()
{
@Override
public void run()
{
// get output viewer
final Viewer vout = new Viewer(out);
// copy colormap from input viewer
vout.getLut().copyFrom(viewer.getLut());
}
});
}
});
return true;
}
@Override
public boolean isEnabled()
{
return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null);
}
};
public static IcyAbstractAction canvasResizeAction = new IcyAbstractAction("Canvas size...", new IcyIcon(
ResourceUtil.ICON_CROP), "Canvas resize", "Resize the canvas without changing image size.")
{
private static final long serialVersionUID = 9156831541828750627L;
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
new SequenceCanvasResizeFrame(sequence);
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null);
}
};
public static IcyAbstractAction imageResizeAction = new IcyAbstractAction("Image size...", new IcyIcon(
ResourceUtil.ICON_FIT_CANVAS), "Image resize", "Resize the image.")
{
private static final long serialVersionUID = -4731940627380446776L;
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
new SequenceResizeFrame(sequence);
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null);
}
};
// channel operations
public static IcyAbstractAction extractAllChannelAction = new ExtractChannelAction(-1);
public static IcyAbstractAction extractChannelActions[] = {new ExtractChannelAction(0),
new ExtractChannelAction(1), new ExtractChannelAction(2), new ExtractChannelAction(3),
new ExtractChannelAction(4), new ExtractChannelAction(5)};
public static IcyAbstractAction removeChannelActions[] = {new RemoveChannelAction(0), new RemoveChannelAction(1),
new RemoveChannelAction(2), new RemoveChannelAction(3), new RemoveChannelAction(4),
new RemoveChannelAction(5)};
public static IcyAbstractAction mergeChannelsAction = new MergeDimensionAction(DimensionId.C);
// Z operations
public static IcyAbstractAction reverseSlicesAction = new IcyAbstractAction("Reverse order", new IcyIcon(
ResourceUtil.ICON_LAYER_REVERSE_V), "Reverse Z slices", "Reverse Z slices order", false,
"Reversing slices...")
{
private static final long serialVersionUID = -4731940627380446776L;
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
SequenceUtil.reverseZ(sequence);
return true;
}
return false;
}
};
public static IcyAbstractAction extractSliceAction = new IcyAbstractAction("Extract slice", new IcyIcon(
ResourceUtil.ICON_LAYER_EXTRACT_V), "Extract current Z slice",
"Create a new sequence by extracting current Z slice of active sequence.", false, "Extracting slice...")
{
/**
*
*/
private static final long serialVersionUID = -3731161374656240419L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer != null)
{
final Sequence sequence = viewer.getSequence();
if (sequence != null)
{
final int z = viewer.getPositionZ();
if (z != -1)
{
final Sequence out = SequenceUtil.extractSlice(sequence, z);
ThreadUtil.invokeLater(new Runnable()
{
@Override
public void run()
{
// get output viewer
final Viewer vout = new Viewer(out);
// copy colormap from input viewer
vout.getLut().copyFrom(viewer.getLut());
}
});
return true;
}
}
}
return false;
}
@Override
public boolean isEnabled()
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
final int z = (viewer == null) ? -1 : viewer.getPositionZ();
return super.isEnabled() && (z != -1);
}
};
public static IcyAbstractAction removeSliceAction = new IcyAbstractAction("Remove slice", new IcyIcon(
ResourceUtil.ICON_LAYER_REMOVE_V), "Remove current Z slice",
"Remove the current Z slice of active sequence.", false, "Removing slice...")
{
/**
*
*/
private static final long serialVersionUID = -6588564641490390145L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
final int z = (viewer == null) ? -1 : viewer.getPositionZ();
if (z != -1)
{
SequenceUtil.removeZAndShift(viewer.getSequence(), z);
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
final int z = (viewer == null) ? -1 : viewer.getPositionZ();
return super.isEnabled() && (z != -1);
}
};
public static IcyAbstractAction addSlicesAction = new IcyAbstractAction("Add...", new IcyIcon(
ResourceUtil.ICON_LAYER_ADD_V), "Add slice(s)",
"Extends Z dimension by adding empty or duplicating slices.")
{
/**
*
*/
private static final long serialVersionUID = -1967473595758834348L;
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
new SequenceDimensionExtendFrame(Icy.getMainInterface().getActiveSequence(), DimensionId.Z);
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
return super.isEnabled() && (sequence != null) && !sequence.isEmpty();
}
};
public static IcyAbstractAction mergeSlicesAction = new MergeDimensionAction(DimensionId.Z);
public static IcyAbstractAction removeSlicesAction = new IcyAbstractAction("Remove...", new IcyIcon(
ResourceUtil.ICON_LAYER_REMOVE_ADV_V), "Advanced slice remove", "Advanced Z slice remove operation.")
{
/**
*
*/
private static final long serialVersionUID = -1899409406755437158L;
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
new SequenceDimensionAdjustFrame(sequence, DimensionId.Z);
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null);
}
};
// T operations
public static IcyAbstractAction reverseFramesAction = new IcyAbstractAction("Reverse order", new IcyIcon(
ResourceUtil.ICON_LAYER_REVERSE_H), "Reverse T frames", "Reverse T frames order", false,
"Reversing frames...")
{
/**
*
*/
private static final long serialVersionUID = 2403122454093281595L;
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
SequenceUtil.reverseT(sequence);
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null);
}
};
public static IcyAbstractAction extractFrameAction = new IcyAbstractAction("Extract frame", new IcyIcon(
ResourceUtil.ICON_LAYER_EXTRACT_H), "Extract current T frame",
"Create a new sequence by extracting current T frame of active sequence.", false, "Extracting frame...")
{
/**
*
*/
private static final long serialVersionUID = -5809053788547447661L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer != null)
{
final Sequence sequence = viewer.getSequence();
if (sequence != null)
{
final int t = viewer.getPositionT();
if (t != -1)
{
final Sequence out = SequenceUtil.extractFrame(sequence, t);
ThreadUtil.invokeLater(new Runnable()
{
@Override
public void run()
{
// get output viewer
final Viewer vout = new Viewer(out);
// copy colormap from input viewer
vout.getLut().copyFrom(viewer.getLut());
}
});
return true;
}
}
}
return false;
}
@Override
public boolean isEnabled()
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
final int t = (viewer == null) ? -1 : viewer.getPositionT();
return super.isEnabled() && (t != -1);
}
};
public static IcyAbstractAction removeFrameAction = new IcyAbstractAction("Remove frame", new IcyIcon(
ResourceUtil.ICON_LAYER_REMOVE_H), "Remove current T frame",
"Remove the current T frame of active sequence.", false, "Removing frame...")
{
/**
*
*/
private static final long serialVersionUID = -6113522706924858672L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
final int t = (viewer == null) ? -1 : viewer.getPositionT();
if (t != -1)
{
SequenceUtil.removeTAndShift(viewer.getSequence(), t);
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
final int t = (viewer == null) ? -1 : viewer.getPositionT();
return super.isEnabled() && (t != -1);
}
};
public static IcyAbstractAction addFramesAction = new IcyAbstractAction("Add...", new IcyIcon(
ResourceUtil.ICON_LAYER_ADD_H), "Add frame(s)",
"Extends T dimension by adding empty or duplicating frames.")
{
/**
*
*/
private static final long serialVersionUID = -6106326145960291510L;
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
new SequenceDimensionExtendFrame(Icy.getMainInterface().getActiveSequence(), DimensionId.T);
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
return super.isEnabled() && (sequence != null) && !sequence.isEmpty();
}
};
public static IcyAbstractAction mergeFramesAction = new MergeDimensionAction(DimensionId.T);
public static IcyAbstractAction removeFramesAction = new IcyAbstractAction("Remove...", new IcyIcon(
ResourceUtil.ICON_LAYER_REMOVE_ADV_H), "Advanced frame remove", "Advanced T frame remove operation.")
{
/**
*
*/
private static final long serialVersionUID = -7963804798009814712L;
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
new SequenceDimensionAdjustFrame(sequence, DimensionId.T);
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null);
}
};
// ZT conversion
public static IcyAbstractAction convertToSlicesAction = new IcyAbstractAction("Convert to stack", new IcyIcon(
ResourceUtil.ICON_LAYER_V1), "Convert to stack", "Set all images in Z dimension.", true,
"Converting to stack...")
{
/**
*
*/
private static final long serialVersionUID = 5987495169612852524L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer != null)
{
final Sequence sequence = viewer.getSequence();
final int t = viewer.getPositionT();
if (sequence != null)
{
SequenceUtil.convertToStack(sequence);
viewer.setPositionZ(t);
return true;
}
}
return false;
}
@Override
public boolean isEnabled()
{
return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null);
}
};
public static IcyAbstractAction convertToFramesAction = new IcyAbstractAction("Convert to time", new IcyIcon(
ResourceUtil.ICON_LAYER_H1), "Convert to time sequence", "Set all images in T dimension.", true,
"Converting to time...")
{
/**
*
*/
private static final long serialVersionUID = -6555855298812635009L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer != null)
{
final Sequence sequence = viewer.getSequence();
final int z = viewer.getPositionZ();
if (sequence != null)
{
SequenceUtil.convertToTime(sequence);
viewer.setPositionT(z);
return true;
}
}
return false;
}
@Override
public boolean isEnabled()
{
return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null);
}
};
public static IcyAbstractAction advancedZTConvertAction = new IcyAbstractAction("Advanced...", new IcyIcon(
ResourceUtil.ICON_COG), "Advanced dimension conversion", "Advanced dimension conversion operation.")
{
/**
*
*/
private static final long serialVersionUID = 110261266295404071L;
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
new SequenceDimensionConvertFrame(sequence);
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
return super.isEnabled() && (sequence != null) && !sequence.isEmpty();
}
};
public static IcyAbstractAction fillSequenceAction = new IcyAbstractAction("Fill", new IcyIcon(
ResourceUtil.ICON_BRUSH), "Fill ROI content", "Fill content of the selected ROI with specified value",
true, "Fill ROI content")
{
/**
*
*/
private static final long serialVersionUID = 110261266295404071L;
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
final MainFrame mainFrame = Icy.getMainInterface().getMainFrame();
if (mainFrame != null)
{
final double value = mainFrame.getMainRibbon().getSequenceOperationTask().getFillValue();
for (ROI roi : sequence.getSelectedROIs())
DataIteratorUtil.set(new SequenceDataIterator(sequence, roi, true), value);
sequence.dataChanged();
return true;
}
}
return false;
}
@Override
public boolean isEnabled()
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
return super.isEnabled() && (sequence != null) && !sequence.isEmpty();
}
};
public static IcyAbstractAction getConvertSequenceAction(DataType dataType, boolean scaled)
{
switch (dataType)
{
case UBYTE:
if (scaled)
return convertUByteScaledSequenceAction;
return convertUByteSequenceAction;
case BYTE:
if (scaled)
return convertByteScaledSequenceAction;
return convertByteSequenceAction;
case USHORT:
if (scaled)
return convertUShortScaledSequenceAction;
return convertUShortSequenceAction;
case SHORT:
if (scaled)
return convertShortScaledSequenceAction;
return convertShortSequenceAction;
case UINT:
if (scaled)
return convertUIntScaledSequenceAction;
return convertUIntSequenceAction;
case INT:
if (scaled)
return convertIntScaledSequenceAction;
return convertIntSequenceAction;
case FLOAT:
if (scaled)
return convertFloatScaledSequenceAction;
return convertFloatSequenceAction;
case DOUBLE:
if (scaled)
return convertDoubleScaledSequenceAction;
return convertDoubleSequenceAction;
default:
// not supported
return null;
}
}
public static IcyAbstractAction undoAction = new IcyAbstractAction("Undo", new IcyIcon(ResourceUtil.ICON_UNDO),
"Undo last operation (Ctrl+Z)", KeyEvent.VK_Z, SystemUtil.getMenuCtrlMask())
{
/**
*
*/
private static final long serialVersionUID = 5773755313377178022L;
@Override
public boolean doAction(ActionEvent e)
{
return Icy.getMainInterface().undo();
}
@Override
public boolean isEnabled()
{
final IcyUndoManager undoManager = Icy.getMainInterface().getUndoManager();
if (super.isEnabled() && (undoManager != null))
return undoManager.canUndo();
return false;
}
};
public static IcyAbstractAction redoAction = new IcyAbstractAction("Redo", new IcyIcon(ResourceUtil.ICON_REDO),
"Redo last operation (Ctrl+Y)", KeyEvent.VK_Y, SystemUtil.getMenuCtrlMask())
{
/**
*
*/
private static final long serialVersionUID = 1288382252962040008L;
@Override
public boolean doAction(ActionEvent e)
{
return Icy.getMainInterface().redo();
}
@Override
public boolean isEnabled()
{
final IcyUndoManager undoManager = Icy.getMainInterface().getUndoManager();
if (super.isEnabled() && (undoManager != null))
return undoManager.canRedo();
return false;
}
};
public static IcyAbstractAction undoClearAction = new IcyAbstractAction("Clear history", new IcyIcon(
ResourceUtil.ICON_TRASH), "Clear all history (will release some memory")
{
/**
*
*/
private static final long serialVersionUID = 1251314072585735122L;
@Override
public boolean doAction(ActionEvent e)
{
final IcyUndoManager undoManager = Icy.getMainInterface().getUndoManager();
if (undoManager != null)
{
undoManager.discardAllEdits();
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
final IcyUndoManager undoManager = Icy.getMainInterface().getUndoManager();
if (super.isEnabled() && (undoManager != null))
return undoManager.canUndo() || undoManager.canRedo();
return false;
}
};
public static IcyAbstractAction undoClearAllButLastAction = new IcyAbstractAction("Clear all but last",
new IcyIcon(ResourceUtil.ICON_CLEAR_BEFORE),
"Clear all history but the last operation (can release some memory)")
{
/**
*
*/
private static final long serialVersionUID = 5773755313377178022L;
@Override
public boolean doAction(ActionEvent e)
{
final IcyUndoManager undoManager = Icy.getMainInterface().getUndoManager();
if (undoManager != null)
{
undoManager.discardOldEdits(1);
undoManager.discardFutureEdits();
return true;
}
return false;
}
@Override
public boolean isEnabled()
{
final IcyUndoManager undoManager = Icy.getMainInterface().getUndoManager();
if (super.isEnabled() && (undoManager != null))
return undoManager.canUndo();
return false;
}
};
/**
* Return all actions of this class
*/
public static List<IcyAbstractAction> getAllActions()
{
final List<IcyAbstractAction> result = new ArrayList<IcyAbstractAction>();
for (Field field : SequenceOperationActions.class.getFields())
{
final Class<?> type = field.getType();
try
{
if (ClassUtil.isSubClass(type, IcyAbstractAction[].class))
result.addAll(Arrays.asList(((IcyAbstractAction[]) field.get(null))));
else if (ClassUtil.isSubClass(type, IcyAbstractAction.class))
result.add((IcyAbstractAction) field.get(null));
}
catch (Exception e)
{
// ignore
}
}
return result;
}
}