/*
* 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.menu;
import icy.action.GeneralActions;
import icy.gui.component.button.IcyCommandButton;
import icy.gui.component.button.IcyCommandToggleButton;
import icy.gui.main.MainFrame;
import icy.gui.util.LookAndFeelUtil;
import icy.gui.util.RibbonUtil;
import icy.image.ImageUtil;
import icy.imagej.ImageJWrapper;
import icy.imagej.ImageJWrapper.ImageJActiveImageListener;
import icy.main.Icy;
import icy.resource.ResourceUtil;
import icy.resource.icon.BasicResizableIcon;
import icy.resource.icon.IcyIcon;
import icy.system.SystemUtil;
import ij.Executer;
import ij.ImageJ;
import ij.WindowManager;
import ij.gui.ImageWindow;
import java.awt.Image;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.pushingpixels.flamingo.api.common.CommandToggleButtonGroup;
import org.pushingpixels.flamingo.api.common.RichTooltip;
import org.pushingpixels.flamingo.api.ribbon.JRibbonBand;
import org.pushingpixels.flamingo.api.ribbon.JRibbonComponent;
import org.pushingpixels.flamingo.api.ribbon.RibbonElementPriority;
import org.pushingpixels.flamingo.api.ribbon.RibbonTask;
/**
* @author Stephane
*/
public class ImageJTask extends RibbonTask implements PropertyChangeListener
{
static final Image detachForIJ = ResourceUtil.getImage("help/ij_detached.jpg");
private static class ImageJRibbonBand extends JRibbonBand
{
/**
*
*/
private static final long serialVersionUID = 4431425194428863269L;
public static final String NAME = "ImageJ";
// ImageJ instance
final ImageJWrapper imageJ;
// internal
final JRibbonComponent imageJComp;
public ImageJRibbonBand()
{
super(NAME, new BasicResizableIcon(ImageUtil.load(ImageJ.class.getResource("/microscope.gif"))));
// initialize some static ImageJ stuff
// home directory
SystemUtil.setProperty("plugins.dir", "ij");
// background color
ImageJ.backgroundColor = LookAndFeelUtil.getBackground(this);
// create ImageJ wrapper
imageJ = new ImageJWrapper();
imageJComp = new JRibbonComponent(imageJ.getSwingPanel());
// add ImageJ GUI wrapper to ribbon
addRibbonComponent(imageJComp, 3);
RibbonUtil.setRestrictiveResizePolicies(this);
}
}
private static class ImageJToolRibbonBand extends JRibbonBand
{
/**
*
*/
private static final long serialVersionUID = -6873081018953405306L;
public static final String NAME = "Tools";
/**
* internals
*/
final IcyCommandButton button;
final IcyCommandToggleButton detachedBtn;
final CommandToggleButtonGroup detachedGrp;
public ImageJToolRibbonBand()
{
super(NAME, new IcyIcon("brackets"));
// convert operation
button = new IcyCommandButton(GeneralActions.toIJAction);
addCommandButton(button, RibbonElementPriority.TOP);
// detach windows button
detachedBtn = new IcyCommandToggleButton(GeneralActions.detachedModeAction);
final RichTooltip richToolTip = new RichTooltip("Detached windows",
"Icy need to be set in detached mode to use ImageJ efficiently and enable image conversion.");
richToolTip.setMainImage(detachForIJ);
richToolTip
.addDescriptionSection("This button has the same effect as the detached mode button in the top toolbar.");
detachedBtn.setActionRichTooltip(richToolTip);
detachedGrp = new CommandToggleButtonGroup();
detachedGrp.add(detachedBtn);
addCommandButton(detachedBtn, RibbonElementPriority.TOP);
RibbonUtil.setPermissiveResizePolicies(this);
}
public void setActionToIJ()
{
button.setAction(GeneralActions.toIJAction);
updateButtonsState();
}
public void setActionToIcy()
{
button.setAction(GeneralActions.toIcyAction);
updateButtonsState();
}
public void updateButtonsState()
{
final boolean isDetached = Icy.getMainInterface().isDetachedMode();
detachedGrp.setSelected(detachedBtn, isDetached);
if (button.getAction() == GeneralActions.toIcyAction)
button.setEnabled(isDetached && (WindowManager.getCurrentImage() != null));
else
button.setEnabled(isDetached && (Icy.getMainInterface().getActiveSequence() != null));
}
}
public static final String NAME = "ImageJ";
protected final ImageJToolRibbonBand ijToolBand;
public ImageJTask()
{
super(NAME, new ImageJRibbonBand(), new ImageJToolRibbonBand());
ijToolBand = (ImageJToolRibbonBand) getBand(1);
getImageJ().addActiveImageListener(new ImageJActiveImageListener()
{
@Override
public void imageActived(ImageWindow iw)
{
if (iw != null)
ijToolBand.setActionToIcy();
else if (Icy.getMainInterface().getActiveSequence() != null)
ijToolBand.setActionToIJ();
else
ijToolBand.updateButtonsState();
}
});
}
/**
* Initialization stuff which cannot be done at construction time
*/
public void init()
{
// refresh band state
propertyChange(null);
final MainFrame mainFrame = Icy.getMainInterface().getMainFrame();
// we listen detach mode change
if (mainFrame != null)
mainFrame.addPropertyChangeListener(MainFrame.PROPERTY_DETACHEDMODE, this);
}
/**
* @return the imageJ
*/
public ImageJWrapper getImageJ()
{
return ((ImageJRibbonBand) getBand(0)).imageJ;
}
/**
* Quit imageJ
*/
public void quitImageJ()
{
new Executer("Quit", null);
}
public void onSequenceActivationChange()
{
if (Icy.getMainInterface().getActiveSequence() != null)
ijToolBand.setActionToIJ();
else if (WindowManager.getCurrentImage() != null)
ijToolBand.setActionToIcy();
else
ijToolBand.updateButtonsState();
}
/**
* Handle {@link MainFrame#PROPERTY_DETACHEDMODE} property change here.
*/
@Override
public void propertyChange(PropertyChangeEvent evt)
{
ijToolBand.updateButtonsState();
}
}