/* * 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.clipboard.Clipboard; import icy.clipboard.TransferableImage; import icy.gui.dialog.ConfirmDialog; import icy.gui.frame.AboutFrame; import icy.gui.main.MainFrame; import icy.gui.menu.search.SearchBar; import icy.gui.viewer.Viewer; import icy.image.ImageUtil; import icy.imagej.ImageJUtil; import icy.main.Icy; import icy.network.NetworkUtil; import icy.plugin.PluginUpdater; import icy.preferences.GeneralPreferences; import icy.resource.ResourceUtil; import icy.resource.icon.IcyIcon; import icy.sequence.Sequence; import icy.system.IcyExceptionHandler; import icy.system.SystemUtil; import icy.system.audit.Audit; import icy.system.thread.ThreadUtil; import icy.update.IcyUpdater; import icy.util.ClassUtil; import ij.ImagePlus; import ij.WindowManager; import java.awt.Image; import java.awt.datatransfer.DataFlavor; 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; import org.pushingpixels.flamingo.api.common.RichTooltip; /** * General actions. * * @author Stephane */ public class GeneralActions { public static IcyAbstractAction searchAction = new IcyAbstractAction("Search", new IcyIcon(ResourceUtil.ICON_SEARCH), "Application search tool", KeyEvent.VK_F, SystemUtil.getMenuCtrlMask()) { /** * */ private static final long serialVersionUID = -7457421618693984393L; @Override public boolean doAction(ActionEvent e) { final MainFrame mf = Icy.getMainInterface().getMainFrame(); if (mf != null) { final SearchBar sb = mf.getSearchBar(); if (sb != null) { sb.setFocus(); return true; } } return false; } }; public static IcyAbstractAction exitApplicationAction = new IcyAbstractAction("Exit", new IcyIcon( ResourceUtil.ICON_ON_OFF)) { /** * */ private static final long serialVersionUID = -3238298900158332179L; @Override public boolean doAction(ActionEvent e) { Icy.exit(false); return true; } }; public static IcyAbstractAction detachedModeAction = new IcyAbstractAction("Detached Mode", new IcyIcon( ResourceUtil.ICON_DETACHED_WINDOW), "Detached mode ON/OFF", "Switch application to detached / attached mode") { /** * */ private static final long serialVersionUID = 6632773548066123185L; @Override public boolean doAction(ActionEvent e) { final boolean value = !Icy.getMainInterface().isDetachedMode(); // set detached mode Icy.getMainInterface().setDetachedMode(value); // and save state GeneralPreferences.setMultiWindowMode(value); return true; } }; public static IcyAbstractAction copyImageAction = new IcyAbstractAction("Copy image", new IcyIcon( ResourceUtil.ICON_PICTURE_COPY), "Copy image to clipboard", "Copy the active image to the system clipboard.", KeyEvent.VK_C, SystemUtil.getMenuCtrlMask(), true, "Copying image to the clipboard...") { /** * */ private static final long serialVersionUID = 8181120519734955113L; @Override public boolean doAction(ActionEvent e) { final Viewer viewer = Icy.getMainInterface().getActiveViewer(); if (viewer != null) { final Sequence seq = viewer.getSequence(); if (seq != null) { try { final BufferedImage img = viewer.getRenderedImage(viewer.getPositionT(), viewer.getPositionZ(), viewer.getPositionC(), false); // put image in system clipboard Clipboard.putSystem(new TransferableImage(img), null); // clear content of Icy clipboard Clipboard.clear(); return true; } catch (Throwable e1) { System.err.println("Can't copy image to clipboard:"); IcyExceptionHandler.showErrorMessage(e1, false); } } } return false; } @Override public boolean isEnabled() { return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null); } }; public static IcyAbstractAction pasteImageAction = new IcyAbstractAction("Paste image", new IcyIcon( ResourceUtil.ICON_PICTURE_PASTE), "Paste image from clipboard", "Paste image from the system clipboard in a new sequence.", KeyEvent.VK_V, SystemUtil.getMenuCtrlMask(), true, "Creating new sequence from clipboard image...") { /** * */ private static final long serialVersionUID = 8181120519734955113L; @Override public boolean doAction(ActionEvent e) { if (Clipboard.hasTypeSystem(DataFlavor.imageFlavor)) { try { final Image img = (Image) Clipboard.getSystem(DataFlavor.imageFlavor); Icy.getMainInterface().addSequence(new Sequence("Clipboard image", ImageUtil.toBufferedImage(img))); return true; } catch (Throwable e1) { System.err.println("Can't paste image from clipboard:"); IcyExceptionHandler.showErrorMessage(e1, false); } } return false; } @Override public boolean isEnabled() { return super.isEnabled() && Clipboard.hasTypeSystem(DataFlavor.imageFlavor); } }; public static IcyAbstractAction toIJAction = new IcyAbstractAction("Convert to IJ", new IcyIcon( ResourceUtil.ICON_TOIJ), "Convert to ImageJ", "Convert the selected Icy sequence to ImageJ image.", true, "Converting to ImageJ image...") { /** * */ private static final long serialVersionUID = -5506310360653637920L; @Override public boolean doAction(ActionEvent e) { final Sequence seq = Icy.getMainInterface().getActiveSequence(); if (seq != null) { final ImagePlus ip = ImageJUtil.convertToImageJImage(seq, true, progressFrame); ThreadUtil.invokeLater(new Runnable() { @Override public void run() { // show the image ip.show(); } }); return true; } return false; } @Override public RichTooltip getRichToolTip() { final RichTooltip result = super.getRichToolTip(); result.addFooterSection("Icy needs to be in detached mode to enabled this feature."); return result; }; @Override public boolean isEnabled() { return super.isEnabled() && (Icy.getMainInterface().getActiveSequence() != null); } }; public static IcyAbstractAction toIcyAction = new IcyAbstractAction("Convert to Icy", new IcyIcon( ResourceUtil.ICON_TOICY), "Convert to Icy", "Convert the selected ImageJ image to Icy sequence.", true, "Converting to Icy image...") { /** * */ private static final long serialVersionUID = 5713619465058087088L; @Override public boolean doAction(ActionEvent e) { final ImagePlus ip = WindowManager.getCurrentImage(); if (ip != null) { final Sequence seq = ImageJUtil.convertToIcySequence(ip, progressFrame); ThreadUtil.invokeLater(new Runnable() { @Override public void run() { // show the sequence new Viewer(seq); } }); return true; } return false; } @Override public RichTooltip getRichToolTip() { final RichTooltip result = super.getRichToolTip(); result.addFooterSection("Icy needs to be in detached mode to enabled this feature."); return result; }; @Override public boolean isEnabled() { return super.isEnabled() && (WindowManager.getCurrentImage() != null); } }; public static IcyAbstractAction onlineHelpAction = new IcyAbstractAction("Online help (F1)", new IcyIcon( ResourceUtil.ICON_HELP), "Open a browser and display support forum", KeyEvent.VK_F1) { /** * */ private static final long serialVersionUID = -8702011381533907199L; @Override public boolean doAction(ActionEvent e) { // open browser on help page NetworkUtil.openBrowser(NetworkUtil.WEBSITE_URL + "support"); return true; } }; public static IcyAbstractAction websiteAction = new IcyAbstractAction("Website", new IcyIcon( ResourceUtil.ICON_BROWSER)) { /** * */ private static final long serialVersionUID = 4447276299627488427L; @Override public boolean doAction(ActionEvent e) { // open browser on help page NetworkUtil.openBrowser(NetworkUtil.WEBSITE_URL); return true; } }; public static IcyAbstractAction linkAction = new IcyAbstractAction("Link", new IcyIcon(ResourceUtil.ICON_LINK), "Link / unlink online user account", "Link / unlink with online user account.\nGive access to extra features as plugin rating") { /** * */ private static final long serialVersionUID = 3449298011169150396L; @Override public boolean doAction(ActionEvent e) { if (Audit.isUserLinked()) { // ask for confirmation if (!Icy.getMainInterface().isHeadLess() && !ConfirmDialog.confirm("Do you want to unlink user account ?")) return false; // unlink user Audit.unlinkUser(); } else { // update link first Audit.updateUserLink(); // still not linked --> link user if (!Audit.isUserLinked()) Audit.linkUser(); } // refresh user infos final MainFrame frame = Icy.getMainInterface().getMainFrame(); if (frame != null) frame.refreshUserInfos(); return true; } }; public static IcyAbstractAction checkUpdateAction = new IcyAbstractAction("Check for update", new IcyIcon( ResourceUtil.ICON_DOWNLOAD), "Check for updates", "Search updates for application and plugins in all referenced repositories.") { /** * */ private static final long serialVersionUID = 5070966391369409880L; @Override public boolean doAction(ActionEvent e) { // check core update if (!IcyUpdater.isCheckingForUpdate()) IcyUpdater.checkUpdate(false); // check plugin update if (!PluginUpdater.isCheckingForUpdate()) PluginUpdater.checkUpdate(false); return true; } @Override public boolean isEnabled() { return super.isEnabled() && !(IcyUpdater.isCheckingForUpdate() || PluginUpdater.isCheckingForUpdate()); } }; public static IcyAbstractAction aboutAction = new IcyAbstractAction("About", new IcyIcon(ResourceUtil.ICON_INFO), "About Icy", "Information about ICY's authors, license and copyrights.") { /** * */ private static final long serialVersionUID = 2564352020620899851L; @Override public boolean doAction(ActionEvent e) { new AboutFrame(0); return true; } }; public static IcyAbstractAction changeLogAction = new IcyAbstractAction("ChangeLog", new IcyIcon("notepad_2.png"), "ChangeLog", "See the changelog informations.") { /** * */ private static final long serialVersionUID = 2564352020620899851L; @Override public boolean doAction(ActionEvent e) { new AboutFrame(1); return true; } }; /** * Return all actions of this class */ public static List<IcyAbstractAction> getAllActions() { final List<IcyAbstractAction> result = new ArrayList<IcyAbstractAction>(); for (Field field : GeneralActions.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; } }