/*
* 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 java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import icy.file.Saver;
import icy.gui.dialog.ImageSaverDialog;
import icy.gui.dialog.LoaderDialog;
import icy.gui.dialog.MessageDialog;
import icy.gui.dialog.SaverDialog;
import icy.gui.menu.ApplicationMenu;
import icy.gui.viewer.Viewer;
import icy.image.IcyBufferedImage;
import icy.main.Icy;
import icy.preferences.GeneralPreferences;
import icy.resource.ResourceUtil;
import icy.resource.icon.IcyIcon;
import icy.roi.ROI;
import icy.sequence.Sequence;
import icy.sequence.SequenceUtil;
import icy.system.SystemUtil;
import icy.system.thread.ThreadUtil;
import icy.type.DataType;
import icy.util.ClassUtil;
import icy.util.StringUtil;
/**
* File actions (open / save / close...)
*
* @author Stephane
*/
public class FileActions
{
// public static class OpenSequenceRegionAction extends IcyAbstractAction
// {
// final int resolution;
//
// public OpenSequenceRegionAction(int resolution)
// {
// super("Open at resolution 1/" + ((int) Math.pow(2, resolution)), null,
// "Open image region at resolution 1/" + ((int) Math.pow(2, resolution)),
// "Open the selected region from the original image at resolution 1/"
// + ((int) Math.pow(2, resolution)),
// true, null);
//
// this.resolution = resolution;
// }
//
// @Override
// public boolean doAction(ActionEvent e)
// {
// final Sequence sequence = Icy.getMainInterface().getActiveSequence();
//
// if (sequence != null)
// {
// final String path = sequence.getFilename();
//
// if (!StringUtil.isEmpty(path))
// {
// List<ROI> rois = sequence.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 open.",
// MessageDialog.INFORMATION_MESSAGE);
// return false;
// }
// else if (size > 1)
// {
// rois = sequence.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);
// final Rectangle bounds = SequenceUtil
// .getOriginRectangle(roi.getBounds5D().toRectangle2D().getBounds(), sequence);
//
// if (!bounds.isEmpty())
// {
// final Sequence regionSequence = Loader.loadSequence(null, path, sequence.getSerieIndex(),
// resolution, bounds, -1, -1, -1, -1, -1, false, true);
//
// if (regionSequence != null)
// {
// Icy.getMainInterface().addSequence(regionSequence);
// return true;
// }
// }
// }
// }
//
// return false;
// }
//
// @Override
// public boolean isEnabled()
// {
// final Sequence seq = Icy.getMainInterface().getActiveSequence();
//
// return super.isEnabled() && (seq != null) && (!StringUtil.isEmpty(seq.getFilename()) &&
// seq.hasROI());
// }
// }
public static IcyAbstractAction clearRecentFilesAction = new IcyAbstractAction("Clear recent files",
new IcyIcon(ResourceUtil.ICON_DOC_COPY), "Clear recent files", "Clear the list of last opened files")
{
/**
*
*/
private static final long serialVersionUID = 4762494034660452392L;
@Override
public boolean doAction(ActionEvent e)
{
final ApplicationMenu appMenu = Icy.getMainInterface().getApplicationMenu();
if (appMenu != null)
{
appMenu.getRecentFileList().clear();
return true;
}
return false;
}
};
public static IcyAbstractAction newSequenceAction = new IcyAbstractAction("Create",
new IcyIcon(ResourceUtil.ICON_DOC_NEW), "Create an empty sequence")
{
/**
*
*/
private static final long serialVersionUID = -4799299843248624925L;
@Override
public boolean doAction(ActionEvent e)
{
Icy.getMainInterface().addSequence(
new Sequence("Single channel sequence", new IcyBufferedImage(512, 512, 1, DataType.UBYTE)));
return true;
}
};
public static IcyAbstractAction newGraySequenceAction = new IcyAbstractAction("Create gray sequence",
new IcyIcon(ResourceUtil.ICON_DOC_NEW), "Create a new gray sequence",
"Create a new single channel (gray level) sequence.")
{
/**
*
*/
private static final long serialVersionUID = 797949281499261778L;
@Override
public boolean doAction(ActionEvent e)
{
ThreadUtil.bgRun(new Runnable()
{
@Override
public void run()
{
Icy.getMainInterface().addSequence(
new Sequence("Single channel sequence", new IcyBufferedImage(512, 512, 1, DataType.UBYTE)));
}
});
return true;
}
};
public static IcyAbstractAction newRGBSequenceAction = new IcyAbstractAction("Create RGB sequence",
new IcyIcon(ResourceUtil.ICON_DOC_NEW), "Create a new RGB color sequence",
"Create a 3 channels sequence (red, green, blue).")
{
/**
*
*/
private static final long serialVersionUID = 5755927058175369657L;
@Override
public boolean doAction(ActionEvent e)
{
ThreadUtil.bgRun(new Runnable()
{
@Override
public void run()
{
Icy.getMainInterface().addSequence(
new Sequence("RGB sequence", new IcyBufferedImage(512, 512, 3, DataType.UBYTE)));
}
});
return true;
}
};
public static IcyAbstractAction newARGBSequenceAction = new IcyAbstractAction("Create RGBA sequence",
new IcyIcon(ResourceUtil.ICON_DOC_NEW), "Create a new RGBA color sequence",
"Create a 4 channels sequence (red, green, blue, alpha).")
{
/**
*
*/
private static final long serialVersionUID = -142873334899977341L;
@Override
public boolean doAction(ActionEvent e)
{
ThreadUtil.bgRun(new Runnable()
{
@Override
public void run()
{
final IcyBufferedImage image = new IcyBufferedImage(512, 512, 4, DataType.UBYTE);
Arrays.fill(image.getDataXYAsByte(3), (byte) -1);
Icy.getMainInterface().addSequence(new Sequence("RGBA sequence", image));
}
});
return true;
}
};
public static IcyAbstractAction openSequenceAction = new IcyAbstractAction("Open...",
new IcyIcon(ResourceUtil.ICON_OPEN), "Open a file",
"Display a file selection dialog and choose the file to open", KeyEvent.VK_O, SystemUtil.getMenuCtrlMask())
{
/**
*
*/
private static final long serialVersionUID = 7399973037052771669L;
@Override
public boolean doAction(ActionEvent e)
{
new LoaderDialog();
return true;
}
};
public static IcyAbstractAction openSequenceRegionAction = new IcyAbstractAction("Open region...",
new IcyIcon(ResourceUtil.ICON_CROP), "Open selected region",
"Open the selected ROI region from the original image")
{
/**
*
*/
private static final long serialVersionUID = -2771137583765180575L;
@Override
public boolean doAction(ActionEvent e)
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
if (sequence != null)
{
List<ROI> rois = sequence.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 open.",
MessageDialog.INFORMATION_MESSAGE);
return false;
}
else if (size > 1)
{
rois = sequence.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);
Rectangle bounds = SequenceUtil.getOriginRectangle(roi.getBounds5D().toRectangle2D().getBounds(),
sequence);
String path = sequence.getFilename();
if (!bounds.isEmpty())
new LoaderDialog(path, bounds, true);
else
new LoaderDialog(path, null, true);
}
return false;
}
@Override
public boolean isEnabled()
{
final Sequence seq = Icy.getMainInterface().getActiveSequence();
return super.isEnabled() && (seq != null) && (!StringUtil.isEmpty(seq.getFilename()) && seq.hasROI());
}
};
public static IcyAbstractAction saveSequenceAction = new IcyAbstractAction("Save",
new IcyIcon(ResourceUtil.ICON_SAVE), "Save active sequence",
"Save the active sequence with its default filename")
{
/**
*
*/
private static final long serialVersionUID = -8450533919443304021L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
final Sequence seq = viewer.getSequence();
if (seq != null)
{
final String filename = seq.getOutputFilename(true);
if (StringUtil.isEmpty(filename))
new SaverDialog(seq, true);
else
{
// background process
ThreadUtil.bgRun(new Runnable()
{
@Override
public void run()
{
final File file = new File(filename);
Saver.save(seq, file, !file.exists() || file.isDirectory(), true);
}
});
}
return true;
}
return false;
}
};
public static IcyAbstractAction saveDefaultSequenceAction = new IcyAbstractAction("Save...",
new IcyIcon(ResourceUtil.ICON_SAVE), "Save active sequence",
"Save the active sequence under selected file name", KeyEvent.VK_S, SystemUtil.getMenuCtrlMask())
{
/**
*
*/
private static final long serialVersionUID = 3556923605878121275L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer != null)
{
final Sequence seq = viewer.getSequence();
if (seq != null)
{
new ImageSaverDialog(seq, viewer.getPositionZ(), viewer.getPositionT());
return true;
}
}
return false;
}
};
public static IcyAbstractAction saveAsSequenceAction = new IcyAbstractAction("Save as...",
new IcyIcon(ResourceUtil.ICON_SAVE), "Save active sequence",
"Save the active sequence under selected file name", KeyEvent.VK_S, SystemUtil.getMenuCtrlMask())
{
/**
*
*/
private static final long serialVersionUID = 3556923605878121275L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer != null)
{
final Sequence seq = viewer.getSequence();
if (seq != null)
{
new SaverDialog(seq);
return true;
}
}
return false;
}
};
public static IcyAbstractAction saveMetaDataAction = new IcyAbstractAction("Save metadata",
new IcyIcon(ResourceUtil.ICON_SAVE), "Save active sequence metadata",
"Save the metadata of the active sequence now", true, "Saving metadata...")
{
/**
*
*/
private static final long serialVersionUID = 3556923605878121275L;
@Override
public boolean doAction(ActionEvent e)
{
// Sequence persistence enabled --> save XML metadata
if (GeneralPreferences.getSequencePersistence())
{
final Sequence seq = Icy.getMainInterface().getActiveSequence();
if (seq != null)
return seq.saveXMLData();
}
return false;
}
};
public static IcyAbstractAction closeSequenceAction = new IcyAbstractAction("Close",
new IcyIcon(ResourceUtil.ICON_CLOSE), "Close active sequence", "Close the current active sequence")
{
/**
*
*/
private static final long serialVersionUID = 9023064791162525318L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer != null)
{
viewer.close();
return true;
}
return false;
}
};
public static IcyAbstractAction closeCurrentSequenceAction = new IcyAbstractAction("Close sequence",
new IcyIcon(ResourceUtil.ICON_CLOSE), "Close active sequence", "Close the current active sequence")
{
/**
*
*/
private static final long serialVersionUID = -1127914432836889905L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer viewer = Icy.getMainInterface().getActiveViewer();
if (viewer != null)
{
viewer.close();
return true;
}
return false;
}
};
public static IcyAbstractAction closeOthersSequencesAction = new IcyAbstractAction("Close others",
new IcyIcon(ResourceUtil.ICON_CLOSE), "Close others sequences",
"Close all opened sequences except the active one.")
{
/**
*
*/
private static final long serialVersionUID = -8595244752658024122L;
@Override
public boolean doAction(ActionEvent e)
{
final Viewer focusedViewer = Icy.getMainInterface().getActiveViewer();
for (Viewer viewer : Icy.getMainInterface().getViewers())
if (viewer != focusedViewer)
viewer.close();
return true;
}
};
public static IcyAbstractAction closeAllSequencesAction = new IcyAbstractAction("Close all",
new IcyIcon(ResourceUtil.ICON_CLOSE), "Close all sequences", "Close all opened sequences.")
{
/**
*
*/
private static final long serialVersionUID = -1343557201445697749L;
@Override
public boolean doAction(ActionEvent e)
{
Icy.getMainInterface().closeAllViewers();
return true;
}
};
/**
* Return all actions of this class
*/
public static List<IcyAbstractAction> getAllActions()
{
final List<IcyAbstractAction> result = new ArrayList<IcyAbstractAction>();
for (Field field : FileActions.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;
}
}