/*
* 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 java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.EventListener;
import java.util.List;
import javax.swing.event.EventListenerList;
import org.pushingpixels.flamingo.api.common.AbstractCommandButton;
import org.pushingpixels.flamingo.api.common.CommandToggleButtonGroup;
import org.pushingpixels.flamingo.api.common.JCommandButton;
import org.pushingpixels.flamingo.api.common.JCommandButton.CommandButtonKind;
import org.pushingpixels.flamingo.api.common.JCommandToggleButton;
import org.pushingpixels.flamingo.api.common.popup.JCommandPopupMenu;
import org.pushingpixels.flamingo.api.common.popup.JPopupPanel;
import org.pushingpixels.flamingo.api.common.popup.PopupPanelCallback;
import org.pushingpixels.flamingo.api.ribbon.JRibbonBand;
import org.pushingpixels.flamingo.api.ribbon.RibbonElementPriority;
import org.pushingpixels.flamingo.api.ribbon.RibbonTask;
import org.pushingpixels.flamingo.api.ribbon.resize.CoreRibbonResizeSequencingPolicies;
import icy.action.FileActions;
import icy.action.RoiActions;
import icy.gui.component.button.IcyCommandButton;
import icy.gui.component.button.IcyCommandMenuButton;
import icy.gui.component.button.IcyCommandToggleButton;
import icy.gui.inspector.RoisPanel;
import icy.gui.plugin.PluginCommandButton;
import icy.gui.util.RibbonUtil;
import icy.main.Icy;
import icy.plugin.PluginDescriptor;
import icy.plugin.PluginLoader;
import icy.plugin.PluginLoader.PluginLoaderEvent;
import icy.plugin.PluginLoader.PluginLoaderListener;
import icy.resource.ResourceUtil;
import icy.resource.icon.IcyIcon;
import icy.roi.ROI;
import icy.roi.ROI2D;
import icy.roi.ROI3D;
import icy.sequence.Sequence;
import icy.system.thread.ThreadUtil;
import icy.util.StringUtil;
import plugins.kernel.roi.roi2d.ROI2DArea;
import plugins.kernel.roi.roi2d.ROI2DShape;
import plugins.kernel.roi.roi2d.plugin.ROI2DAreaPlugin;
import plugins.kernel.roi.roi2d.plugin.ROI2DEllipsePlugin;
import plugins.kernel.roi.roi2d.plugin.ROI2DLinePlugin;
import plugins.kernel.roi.roi2d.plugin.ROI2DPointPlugin;
import plugins.kernel.roi.roi2d.plugin.ROI2DPolyLinePlugin;
import plugins.kernel.roi.roi2d.plugin.ROI2DPolygonPlugin;
import plugins.kernel.roi.roi2d.plugin.ROI2DRectanglePlugin;
import plugins.kernel.roi.roi3d.ROI3DArea;
import plugins.kernel.roi.roi3d.plugin.ROI3DLinePlugin;
import plugins.kernel.roi.roi3d.plugin.ROI3DPointPlugin;
import plugins.kernel.roi.roi3d.plugin.ROI3DPolyLinePlugin;
import plugins.kernel.roi.roi4d.ROI4DArea;
import plugins.kernel.roi.roi5d.ROI5DArea;
import plugins.kernel.roi.tool.plugin.ROILineCutterPlugin;
/**
* ROI dedicated task
*
* @author Stephane
*/
public class ToolRibbonTask extends RibbonTask implements PluginLoaderListener
{
public static final String NAME = "File & ROI tools";
/**
* @deprecated Use {@link #setSelected(String)} with <code>null</code> parameter instead.
*/
@Deprecated
public static final String SELECT = "Selection";
/**
* @deprecated Use {@link #setSelected(String)} with <code>null</code> parameter instead.
*/
@Deprecated
public static final String MOVE = "Move";
/**
* @deprecated Use {@link ToolRibbonTask#isROITool()} instead.
*/
@Deprecated
public static boolean isROITool(String command)
{
// assume it's a ROI command when it's not null
return (command != null);
}
/**
* Listener class
*/
public interface ToolRibbonTaskListener extends EventListener
{
public void toolChanged(String command);
}
public static class FileRibbonBand extends JRibbonBand
{
/**
*
*/
private static final long serialVersionUID = -2677243480668715388L;
public static final String BAND_NAME = "Image file";
final IcyCommandButton openButton;
final IcyCommandButton openRegionButton;
final IcyCommandButton saveButton;
public FileRibbonBand()
{
super(BAND_NAME, new IcyIcon(ResourceUtil.ICON_DOC));
openButton = new IcyCommandButton(FileActions.openSequenceAction);
openRegionButton = new IcyCommandButton(FileActions.openSequenceRegionAction);
// openAreaButton = new IcyCommandButton("Open region", new IcyIcon(ResourceUtil.ICON_CROP));
// openAreaButton.setCommandButtonKind(CommandButtonKind.POPUP_ONLY);
// openAreaButton.setPopupRichTooltip(new RichTooltip("Open selected region",
// "Open the selected ROI region from the original image at a specific resolution level"));
// openAreaButton.setPopupCallback(new PopupPanelCallback()
// {
// @Override
// public JPopupPanel getPopupPanel(JCommandButton commandButton)
// {
// final JCommandPopupMenu result = new JCommandPopupMenu();
//
// for (int r = 0; r < 5; r++)
// result.addMenuButton(new IcyCommandMenuButton(new OpenSequenceRegionAction(r)));
//
// return result;
// }
// });
saveButton = new IcyCommandButton(FileActions.saveAsSequenceAction);
addCommandButton(openButton, RibbonElementPriority.MEDIUM);
addCommandButton(openRegionButton, RibbonElementPriority.MEDIUM);
addCommandButton(saveButton, RibbonElementPriority.MEDIUM);
RibbonUtil.setRestrictiveResizePolicies(this);
updateButtonsState();
}
void updateButtonsState()
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
openRegionButton.setEnabled(
(sequence != null) && (!StringUtil.isEmpty(sequence.getFilename())) && sequence.hasSelectedROI());
saveButton.setEnabled(Icy.getMainInterface().getActiveSequence() != null);
}
}
static class ROI2DBand extends JRibbonBand
{
public static final String BAND_NAME = "2D ROI";
final List<IcyCommandToggleButton> pluginButtons;
public ROI2DBand()
{
super(BAND_NAME, new IcyIcon(ResourceUtil.ICON_ROI_POLYGON));
startGroup();
pluginButtons = new ArrayList<IcyCommandToggleButton>();
// refresh buttons (don't set button group and listener at this point)
setHidden(setROIFromPlugins(pluginButtons, this, getROIPlugins(), null, null));
updateButtonsState();
RibbonUtil.setRestrictiveResizePolicies(this);
setToolTipText("2D Region Of Interest");
}
public static List<PluginDescriptor> getROIPlugins()
{
final List<PluginDescriptor> result = new ArrayList<PluginDescriptor>();
// 2D ROI
result.add(PluginLoader.getPlugin(ROI2DAreaPlugin.class.getName()));
result.add(PluginLoader.getPlugin(ROI2DRectanglePlugin.class.getName()));
result.add(PluginLoader.getPlugin(ROI2DEllipsePlugin.class.getName()));
result.add(PluginLoader.getPlugin(ROI2DPolygonPlugin.class.getName()));
result.add(PluginLoader.getPlugin(ROI2DPointPlugin.class.getName()));
result.add(PluginLoader.getPlugin(ROI2DLinePlugin.class.getName()));
result.add(PluginLoader.getPlugin(ROI2DPolyLinePlugin.class.getName()));
return result;
}
void updateButtonsState()
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
for (IcyCommandToggleButton button : pluginButtons)
button.setEnabled(sequence != null);
}
}
static class ROI3DBand extends JRibbonBand
{
public static final String BAND_NAME = "3D ROI";
final List<IcyCommandToggleButton> pluginButtons;
public ROI3DBand()
{
super(BAND_NAME, new IcyIcon(ResourceUtil.ICON_CUBE_3D));
startGroup();
pluginButtons = new ArrayList<IcyCommandToggleButton>();
// refresh buttons (don't set button group and listener at this point)
setHidden(setROIFromPlugins(pluginButtons, this, getROIPlugins(), null, null));
updateButtonsState();
RibbonUtil.setRestrictiveResizePolicies(this);
setToolTipText("3D Region Of Interest");
}
public static List<PluginDescriptor> getROIPlugins()
{
final List<PluginDescriptor> result = new ArrayList<PluginDescriptor>();
// 3D ROI
result.add(PluginLoader.getPlugin(ROI3DPointPlugin.class.getName()));
result.add(PluginLoader.getPlugin(ROI3DLinePlugin.class.getName()));
result.add(PluginLoader.getPlugin(ROI3DPolyLinePlugin.class.getName()));
return result;
}
void updateButtonsState()
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
for (IcyCommandToggleButton button : pluginButtons)
button.setEnabled(sequence != null);
}
}
static class ROIExtBand extends JRibbonBand
{
public static final String BAND_NAME = "External ROI";
final List<IcyCommandToggleButton> pluginButtons;
public ROIExtBand()
{
super(BAND_NAME, new IcyIcon(ResourceUtil.ICON_ROI));
startGroup();
pluginButtons = new ArrayList<IcyCommandToggleButton>();
// refresh buttons (don't set button group and listener at this point)
setHidden(setROIFromPlugins(pluginButtons, this, getROIPlugins(), null, null));
updateButtonsState();
RibbonUtil.setRestrictiveResizePolicies(this);
setToolTipText("External Region Of Interest");
}
public static List<PluginDescriptor> getROIPlugins()
{
final List<PluginDescriptor> result = new ArrayList<PluginDescriptor>();
// remove default 2D & 3D ROI to only keep external ROI
result.removeAll(ROI2DBand.getROIPlugins());
result.removeAll(ROI3DBand.getROIPlugins());
// explicitly remove the ROI cutter from the list
result.remove(PluginLoader.getPlugin(ROILineCutterPlugin.class.getName()));
return result;
}
void updateButtonsState()
{
final Sequence sequence = Icy.getMainInterface().getActiveSequence();
for (IcyCommandToggleButton button : pluginButtons)
button.setEnabled(sequence != null);
}
}
static class ROIConversionBand extends JRibbonBand
{
public static final String BAND_NAME = "Conversion";
final IcyCommandButton convertToStackButton;
final IcyCommandButton convertToMaskButton;
final IcyCommandButton convertToShapeButton;
public ROIConversionBand()
{
super(BAND_NAME, new IcyIcon(ResourceUtil.ICON_LAYER_V2));
// conversion
convertToStackButton = new IcyCommandButton(RoiActions.convertToStackAction);
convertToMaskButton = new IcyCommandButton(RoiActions.convertToMaskAction);
convertToShapeButton = new IcyCommandButton(RoiActions.convertToShapeAction);
addCommandButton(convertToStackButton, RibbonElementPriority.MEDIUM);
addCommandButton(convertToMaskButton, RibbonElementPriority.MEDIUM);
addCommandButton(convertToShapeButton, RibbonElementPriority.MEDIUM);
setToolTipText("Conversion tools for ROI");
RibbonUtil.setRestrictiveResizePolicies(this);
}
public void updateButtonsState()
{
boolean convertStackEnable = false;
boolean convertMaskEnable = false;
boolean convertShapeEnable = false;
final Sequence seq = Icy.getMainInterface().getActiveSequence();
if (seq != null)
{
final List<ROI> selectedRois = seq.getSelectedROIs();
for (ROI roi : selectedRois)
{
if (roi instanceof ROI2D)
{
convertStackEnable = true;
if (!(roi instanceof ROI2DShape))
convertShapeEnable = true;
}
if (!((roi instanceof ROI2DArea) || (roi instanceof ROI3DArea) || (roi instanceof ROI4DArea)
|| (roi instanceof ROI5DArea)))
convertMaskEnable = true;
if (roi instanceof ROI3D)
{
if (roi instanceof ROI3DArea)
convertShapeEnable = true;
}
}
}
convertToStackButton.setEnabled(convertStackEnable);
convertToMaskButton.setEnabled(convertMaskEnable);
convertToShapeButton.setEnabled(convertShapeEnable);
}
}
static class ROIBooleanOpBand extends JRibbonBand
{
public static final String BAND_NAME = "Boolean Op";
final IcyCommandButton booleanUnionButton;
final IcyCommandButton booleanIntersectionButton;
final IcyCommandButton booleanOthersButton;
final IcyCommandMenuButton booleanInversionButton;
final IcyCommandMenuButton booleanExclusiveUnionButton;
final IcyCommandMenuButton booleanSubtractionButton;
public ROIBooleanOpBand()
{
super(BAND_NAME, new IcyIcon(ResourceUtil.ICON_ROI_OR));
booleanUnionButton = new IcyCommandButton(RoiActions.boolOrAction);
booleanIntersectionButton = new IcyCommandButton(RoiActions.boolAndAction);
booleanInversionButton = new IcyCommandMenuButton(RoiActions.boolNotAction);
booleanExclusiveUnionButton = new IcyCommandMenuButton(RoiActions.boolXorAction);
booleanSubtractionButton = new IcyCommandMenuButton(RoiActions.boolSubtractAction);
booleanOthersButton = new IcyCommandButton("Other operation");
booleanOthersButton.setCommandButtonKind(CommandButtonKind.POPUP_ONLY);
booleanOthersButton.setPopupCallback(new PopupPanelCallback()
{
@Override
public JPopupPanel getPopupPanel(JCommandButton arg0)
{
final JCommandPopupMenu result = new JCommandPopupMenu();
result.addMenuButton(booleanInversionButton);
result.addMenuButton(booleanExclusiveUnionButton);
result.addMenuButton(booleanSubtractionButton);
return result;
}
});
booleanOthersButton.setEnabled(false);
addCommandButton(booleanUnionButton, RibbonElementPriority.MEDIUM);
addCommandButton(booleanIntersectionButton, RibbonElementPriority.MEDIUM);
addCommandButton(booleanOthersButton, RibbonElementPriority.MEDIUM);
setToolTipText("Boolean operation for ROI");
RibbonUtil.setRestrictiveResizePolicies(this);
}
public void updateButtonsState()
{
boolean singleOp = false;
boolean boolOp = false;
final Sequence seq = Icy.getMainInterface().getActiveSequence();
if (seq != null)
{
final List<ROI> selectedRois = seq.getSelectedROIs();
singleOp = !selectedRois.isEmpty();
boolOp = selectedRois.size() > 1;
}
booleanUnionButton.setEnabled(boolOp);
booleanIntersectionButton.setEnabled(boolOp);
booleanInversionButton.setEnabled(singleOp);
booleanExclusiveUnionButton.setEnabled(boolOp);
booleanSubtractionButton.setEnabled(boolOp);
booleanOthersButton.setEnabled(singleOp || boolOp);
}
}
static class ROISeparationBand extends JRibbonBand
{
public static final String BAND_NAME = "Separation";
final IcyCommandButton separateObjectsButton;
final IcyCommandToggleButton cutButton;
final IcyCommandButton splitButton;
public ROISeparationBand()
{
super(BAND_NAME, new IcyIcon(ResourceUtil.ICON_ROI_COMP));
// conversion
separateObjectsButton = new IcyCommandButton(RoiActions.separateObjectsAction);
cutButton = PluginCommandButton
.createToggleButton(PluginLoader.getPlugin(ROILineCutterPlugin.class.getName()), false, true);
splitButton = new IcyCommandButton(RoiActions.autoSplitAction);
addCommandButton(separateObjectsButton, RibbonElementPriority.MEDIUM);
addCommandButton(cutButton, RibbonElementPriority.MEDIUM);
// addCommandButton(splitButton, RibbonElementPriority.MEDIUM);
cutButton.setEnabled(false);
setToolTipText("Separation tools for ROI");
RibbonUtil.setRestrictiveResizePolicies(this);
}
public void updateButtonsState()
{
boolean separateObjEnable = false;
boolean cutEnable = false;
boolean splitEnable = false;
final Sequence seq = Icy.getMainInterface().getActiveSequence();
if (seq != null)
{
final List<ROI> selectedRois = seq.getSelectedROIs();
cutEnable = seq.hasROI();
separateObjEnable = !selectedRois.isEmpty();
splitEnable = !selectedRois.isEmpty();
}
separateObjectsButton.setEnabled(separateObjEnable);
cutButton.setEnabled(cutEnable);
splitButton.setEnabled(splitEnable);
}
}
// static class ROIMorphoBand extends JRibbonBand
// {
// public static final String BAND_NAME = "Morphology";
//
// final IcyCommandButton erodeButton;
// final IcyCommandButton dilateButton;
// final IcyCommandButton fillHoledilateButton;
// final IcyCommandButton otherButton;
//
// public ROIMorphoBand()
// {
// super(BAND_NAME, new IcyIcon(ResourceUtil.ICON_LAYER_V2));
//
// booleanUnionButton = new IcyCommandButton(RoiActions.boolOrAction);
// booleanIntersectionButton = new IcyCommandButton(RoiActions.boolAndAction);
// booleanInversionButton = new IcyCommandMenuButton(RoiActions.boolNotAction);
// booleanExclusiveUnionButton = new IcyCommandMenuButton(RoiActions.boolXorAction);
// booleanSubtractionButton = new IcyCommandMenuButton(RoiActions.boolSubtractAction);
//
// booleanOthersButton = new IcyCommandButton("Other operation");
// booleanOthersButton.setCommandButtonKind(CommandButtonKind.POPUP_ONLY);
// booleanOthersButton.setPopupCallback(new PopupPanelCallback()
// {
// @Override
// public JPopupPanel getPopupPanel(JCommandButton arg0)
// {
// final JCommandPopupMenu result = new JCommandPopupMenu();
//
// result.addMenuButton(booleanInversionButton);
// result.addMenuButton(booleanExclusiveUnionButton);
// result.addMenuButton(booleanSubtractionButton);
//
// return result;
// }
// });
// booleanOthersButton.setEnabled(false);
//
// addCommandButton(booleanUnionButton, RibbonElementPriority.MEDIUM);
// addCommandButton(booleanIntersectionButton, RibbonElementPriority.MEDIUM);
// addCommandButton(booleanOthersButton, RibbonElementPriority.MEDIUM);
//
// setToolTipText("Morphological operator for ROI");
// RibbonUtil.setRestrictiveResizePolicies(this);
// }
//
// public void updateButtonsState()
// {
// boolean separateObjEnable = false;
// boolean cutEnable = false;
// boolean splitEnable = false;
// final Sequence seq = Icy.getMainInterface().getActiveSequence();
//
// if (seq != null)
// {
// final List<ROI> selectedRois = seq.getSelectedROIs();
//
// cutEnable = seq.hasROI();
// separateObjEnable = !selectedRois.isEmpty();
// splitEnable = !selectedRois.isEmpty();
// }
//
// separateObjectsButton.setEnabled(separateObjEnable);
// cutButton.setEnabled(cutEnable);
// splitButton.setEnabled(splitEnable);
// }
// }
static class ROIIOBand extends JRibbonBand
{
public static final String BAND_NAME = "ROI file";
final IcyCommandButton loadFromXMLButton;
final IcyCommandButton saveToXMLButton;
final IcyCommandButton exportToXLSButton;
public ROIIOBand()
{
super(BAND_NAME, new IcyIcon(ResourceUtil.ICON_OPEN));
// conversion
loadFromXMLButton = new IcyCommandButton(RoiActions.loadAction);
saveToXMLButton = new IcyCommandButton(RoiActions.saveAction);
exportToXLSButton = new IcyCommandButton(RoiActions.xlsExportAction);
addCommandButton(loadFromXMLButton, RibbonElementPriority.MEDIUM);
addCommandButton(saveToXMLButton, RibbonElementPriority.MEDIUM);
addCommandButton(exportToXLSButton, RibbonElementPriority.MEDIUM);
setToolTipText("File operations for ROI");
RibbonUtil.setRestrictiveResizePolicies(this);
}
public void updateButtonsState()
{
final Sequence seq = Icy.getMainInterface().getActiveSequence();
final RoisPanel roisPanel = Icy.getMainInterface().getRoisPanel();
loadFromXMLButton.setEnabled(seq != null);
saveToXMLButton.setEnabled((seq != null) && seq.hasSelectedROI());
exportToXLSButton.setEnabled((roisPanel != null) && (roisPanel.getVisibleRois().size() > 0));
}
}
final FileRibbonBand fileBand;
final ROI2DBand roi2dBand;
final ROI3DBand roi3dBand;
final ROIExtBand roiExtBand;
final ROIConversionBand roiConversionBand;
final ROISeparationBand roiSeparationBand;
final ROIBooleanOpBand roiBooleanOpBand;
final ROIIOBand roiIOBand;
final CommandToggleButtonGroup buttonGroup;
final ActionListener buttonActionListener;
/**
* List of listeners
*/
private final EventListenerList listeners;
private Runnable buttonUpdater;
public ToolRibbonTask()
{
super(NAME, new FileRibbonBand(), new ROI2DBand(), new ROI3DBand(), new ROIExtBand(), new ROIConversionBand(),
new ROISeparationBand(), new ROIBooleanOpBand(), new ROIIOBand());
// super(NAME,, new ROIRibbonBand());
setResizeSequencingPolicy(new CoreRibbonResizeSequencingPolicies.CollapseFromLast(this));
// get band
fileBand = (FileRibbonBand) RibbonUtil.getBand(this, FileRibbonBand.BAND_NAME);
roi2dBand = (ROI2DBand) RibbonUtil.getBand(this, ROI2DBand.BAND_NAME);
roi3dBand = (ROI3DBand) RibbonUtil.getBand(this, ROI3DBand.BAND_NAME);
roiExtBand = (ROIExtBand) RibbonUtil.getBand(this, ROIExtBand.BAND_NAME);
roiConversionBand = (ROIConversionBand) RibbonUtil.getBand(this, ROIConversionBand.BAND_NAME);
roiSeparationBand = (ROISeparationBand) RibbonUtil.getBand(this, ROISeparationBand.BAND_NAME);
roiBooleanOpBand = (ROIBooleanOpBand) RibbonUtil.getBand(this, ROIBooleanOpBand.BAND_NAME);
roiIOBand = (ROIIOBand) RibbonUtil.getBand(this, ROIIOBand.BAND_NAME);
// create button state updater
buttonUpdater = new Runnable()
{
@Override
public void run()
{
// sleep a bit
ThreadUtil.sleep(1);
ThreadUtil.invokeNow(new Runnable()
{
@Override
public void run()
{
fileBand.updateButtonsState();
roi2dBand.updateButtonsState();
roi3dBand.updateButtonsState();
roiExtBand.updateButtonsState();
roiConversionBand.updateButtonsState();
roiSeparationBand.updateButtonsState();
roiBooleanOpBand.updateButtonsState();
roiIOBand.updateButtonsState();
}
});
}
};
listeners = new EventListenerList();
buttonActionListener = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
setSelectedButton((IcyCommandToggleButton) e.getSource(), true);
}
};
// create button group
buttonGroup = new CommandToggleButtonGroup();
buttonGroup.setAllowsClearingSelection(true);
// add action listener here
for (AbstractCommandButton button : RibbonUtil.getButtons(roi2dBand))
button.addActionListener(buttonActionListener);
for (AbstractCommandButton button : RibbonUtil.getButtons(roi3dBand))
button.addActionListener(buttonActionListener);
for (AbstractCommandButton button : RibbonUtil.getButtons(roiExtBand))
button.addActionListener(buttonActionListener);
// cut button act as a selector
roiSeparationBand.cutButton.addActionListener(buttonActionListener);
for (AbstractCommandButton button : RibbonUtil.getButtons(roi2dBand))
buttonGroup.add((IcyCommandToggleButton) button);
for (AbstractCommandButton button : RibbonUtil.getButtons(roi3dBand))
buttonGroup.add((IcyCommandToggleButton) button);
for (AbstractCommandButton button : RibbonUtil.getButtons(roiExtBand))
buttonGroup.add((IcyCommandToggleButton) button);
// cut button which act as a selector
buttonGroup.add(roiSeparationBand.cutButton);
PluginLoader.addListener(this);
}
protected void refreshROIButtons()
{
// refresh 2D ROI buttons
roi2dBand.setHidden(setROIFromPlugins(roi2dBand.pluginButtons, roi2dBand, ROI2DBand.getROIPlugins(),
buttonGroup, buttonActionListener));
// refresh 3D ROI buttons
roi3dBand.setHidden(setROIFromPlugins(roi3dBand.pluginButtons, roi3dBand, ROI3DBand.getROIPlugins(),
buttonGroup, buttonActionListener));
// refresh external ROI buttons
roiExtBand.setHidden(setROIFromPlugins(roiExtBand.pluginButtons, roiExtBand, ROIExtBand.getROIPlugins(),
buttonGroup, buttonActionListener));
roi2dBand.updateButtonsState();
roi3dBand.updateButtonsState();
roiExtBand.updateButtonsState();
}
protected static boolean setROIFromPlugins(List<IcyCommandToggleButton> pluginButtons, JRibbonBand band,
List<PluginDescriptor> roiPlugins, CommandToggleButtonGroup buttonGroup, ActionListener al)
{
// remove previous plugin buttons
for (IcyCommandToggleButton button : pluginButtons)
{
if (al != null)
button.removeActionListener(al);
band.removeCommandButton(button);
if (buttonGroup != null)
buttonGroup.remove(button);
}
pluginButtons.clear();
for (PluginDescriptor plugin : roiPlugins)
{
final IcyCommandToggleButton button = PluginCommandButton.createToggleButton(plugin, false,
plugin.isKernelPlugin());
if (plugin.getClassName().equals(ROI2DAreaPlugin.class.getName()))
band.addCommandButton(button, RibbonElementPriority.TOP);
else
band.addCommandButton(button, RibbonElementPriority.MEDIUM);
if (al != null)
button.addActionListener(al);
if (buttonGroup != null)
buttonGroup.add(button);
pluginButtons.add(button);
}
return pluginButtons.isEmpty();
}
protected IcyCommandToggleButton getButtonFromName(String name)
{
if (StringUtil.isEmpty(name))
return null;
for (AbstractCommandButton button : RibbonUtil.getButtons(roi2dBand))
if (name.equals(button.getName()))
return (IcyCommandToggleButton) button;
for (AbstractCommandButton button : RibbonUtil.getButtons(roi3dBand))
if (name.equals(button.getName()))
return (IcyCommandToggleButton) button;
return null;
}
/**
* Returns true if current selected tool is ROI type tool.
*/
public boolean isROITool()
{
// currently we only have ROI tool
// so as soon selected is not null it is ROI tool
return getSelected() != null;
}
/**
* Returns the current selected button (can be <code>null</code>).
*/
protected JCommandToggleButton getSelectedButton()
{
return buttonGroup.getSelected();
}
/**
* Sets the current selected button (can be <code>null</code>).
*/
protected void setSelectedButton(JCommandToggleButton button, boolean force)
{
if (force || (getSelectedButton() != button))
{
// select the button
if (button != null)
buttonGroup.setSelected(button, true);
else
buttonGroup.clearSelection();
// notify tool change
toolChanged(getSelected());
}
}
/**
* Returns the current selected tool.<br>
* It can be null if no tool is currently selected.
*/
public String getSelected()
{
final JCommandToggleButton button = getSelectedButton();
if (button != null)
return button.getName();
return null;
}
/**
* Sets the current selected tool.<br>
* If <i>toolName</i> is a invalid tool name or <code>null</code> then no tool is selected.
*/
public void setSelected(String value)
{
setSelectedButton(getButtonFromName(value), false);
}
public void toolChanged(String toolName)
{
fireChangedEvent(toolName);
}
/**
* Add a listener
*
* @param listener
*/
public void addListener(ToolRibbonTaskListener listener)
{
listeners.add(ToolRibbonTaskListener.class, listener);
}
/**
* Remove a listener
*
* @param listener
*/
public void removeListener(ToolRibbonTaskListener listener)
{
listeners.remove(ToolRibbonTaskListener.class, listener);
}
/**
* @param toolName
*/
void fireChangedEvent(String toolName)
{
for (ToolRibbonTaskListener listener : listeners.getListeners(ToolRibbonTaskListener.class))
listener.toolChanged(toolName);
}
/**
* call this method on sequence activation change
*/
public void onSequenceActivationChange()
{
ThreadUtil.runSingle(buttonUpdater);
}
/**
* call this method on sequence ROI change
*/
public void onSequenceChange()
{
ThreadUtil.runSingle(buttonUpdater);
}
@Override
public void pluginLoaderChanged(PluginLoaderEvent e)
{
ThreadUtil.invokeLater(new Runnable()
{
@Override
public void run()
{
refreshROIButtons();
}
});
}
}