/*
* Copyright 2010, 2011 Institut Pasteur.
*
* This file is part of NHerve Main Toolbox, which is an ICY plugin.
*
* NHerve Main Toolbox 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.
*
* NHerve Main Toolbox 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 NHerve Main Toolbox. If not, see <http://www.gnu.org/licenses/>.
*/
package plugins.nherve.toolbox.plugin;
import icy.gui.frame.IcyFrameEvent;
import icy.gui.frame.IcyFrameListener;
import icy.gui.main.MainEvent;
import icy.gui.main.MainListener;
import icy.gui.util.WindowPositionSaver;
import icy.main.Icy;
import icy.plugin.abstract_.Plugin;
import icy.plugin.interface_.PluginImageAnalysis;
import icy.preferences.PluginsPreferences;
import icy.preferences.XMLPreferences;
import icy.sequence.Sequence;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JPanel;
import org.pushingpixels.substance.api.DecorationAreaType;
import org.pushingpixels.substance.api.SubstanceColorScheme;
import org.pushingpixels.substance.api.SubstanceLookAndFeel;
import org.pushingpixels.substance.api.SubstanceSkin;
import plugins.nherve.toolbox.AbleToLogMessages;
import plugins.nherve.toolbox.Algorithm;
import plugins.nherve.toolbox.genericgrid.WaitingAnimation;
/**
* The Class SingletonPlugin.
*
* @author Nicolas HERVE, 2009 This abstract Plugin is intended to manage data
* attached to sequences. It is supposed to be run as a singleton and is
* aware of sequence focus changes. Therefore, this plugin is able to
* work simultaneously on several sequences.
*/
public abstract class SingletonPlugin extends Plugin implements PluginImageAnalysis, MainListener, IcyFrameListener, AbleToLogMessages {
private final static Map<Class<? extends SingletonPlugin>, SingletonPlugin> singletons = new HashMap<Class<? extends SingletonPlugin>, SingletonPlugin>();
protected static SingletonPlugin getInstance(Class<? extends SingletonPlugin> clazz) {
return singletons.get(clazz);
}
private Sequence currentSequence;
private boolean log;
private JPanel mainPanel;
private MyFrame myFrame;
private boolean runningHeadless;
private boolean uiDisplay;
// private Cursor backupCursor;
public SingletonPlugin() {
super();
setRunningHeadless(false);
}
protected void beforeDisplayInterface(JPanel mainPanel) {
}
/**
* Change sequence.
*/
protected void changeSequence() {
sequenceWillChange();
if (getSequences().size() > 0 || getFocusedSequence() != null) {
setCurrentSequence(getFocusedSequence());
} else {
setCurrentSequence(null);
}
sequenceHasChanged();
}
@Override
public void clearDisplay() {
}
@Override
public void compute() {
if (!singletons.containsKey(getClass())) {
singletons.put(getClass(), this);
startPlugin();
}
}
public void disableWaitingCursor() {
// mainPanel.setCursor(backupCursor);
mainPanel.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
@Override
public void displayMessage(String message) {
if (isUIDisplayEnabled()) {
Algorithm.out(message);
}
}
public void enableWaitingCursor() {
// backupCursor = mainPanel.getCursor();
mainPanel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
public abstract void fillInterface(JPanel mainPanel);
/**
* Gets the current sequence.
*
* @return the current sequence
*/
public Sequence getCurrentSequence() {
return currentSequence;
}
public abstract Dimension getDefaultFrameDimension();
public String getDefaultVersion() {
return "unknown";
}
public MyFrame getFrame() {
return myFrame;
}
public String getFullName() {
return getName() + " " + getVersion();
}
public String getName() {
return getDescriptor().getName();
}
public XMLPreferences getPreferences() {
// TODO patch en attendant version suivante ICY
PluginsPreferences.load();
return PluginsPreferences.root(this);
}
/**
* Gets the sequence by name.
*
* @param name
* the name
* @return the sequence by name
*/
public Sequence getSequenceByName(String name) {
for (Sequence s : getSequences()) {
if (s.getName() == name) {
return s;
}
}
return null;
}
public String getVersion() {
String v = getDescriptor().getVersion().toString();
if (v.length() == 0) {
return getDefaultVersion();
}
return v;
}
/**
* Checks for current sequence.
*
* @return true, if successful
*/
public boolean hasCurrentSequence() {
return currentSequence != null;
}
/*
* (non-Javadoc)
*
* @see
* icy.gui.frame.IcyFrameListener#icyFrameActivated(icy.gui.frame.IcyFrameEvent
* )
*/
@Override
public void icyFrameActivated(IcyFrameEvent e) {
}
/*
* (non-Javadoc)
*
* @see
* icy.gui.frame.IcyFrameListener#icyFrameClosed(icy.gui.frame.IcyFrameEvent
* )
*/
@Override
public void icyFrameClosed(IcyFrameEvent e) {
Icy.getMainInterface().removeListener(this);
stopPlugin();
}
/*
* (non-Javadoc)
*
* @see
* icy.gui.frame.IcyFrameListener#icyFrameClosing(icy.gui.frame.IcyFrameEvent
* )
*/
@Override
public void icyFrameClosing(IcyFrameEvent e) {
}
/*
* (non-Javadoc)
*
* @seeicy.gui.frame.IcyFrameListener#icyFrameDeactivated(icy.gui.frame.
* IcyFrameEvent)
*/
@Override
public void icyFrameDeactivated(IcyFrameEvent e) {
}
/*
* (non-Javadoc)
*
* @seeicy.gui.frame.IcyFrameListener#icyFrameDeiconified(icy.gui.frame.
* IcyFrameEvent)
*/
@Override
public void icyFrameDeiconified(IcyFrameEvent e) {
}
/*
* (non-Javadoc)
*
* @seeicy.gui.frame.IcyFrameListener#icyFrameExternalized(icy.gui.frame.
* IcyFrameEvent)
*/
@Override
public void icyFrameExternalized(IcyFrameEvent e) {
}
/*
* (non-Javadoc)
*
* @see
* icy.gui.frame.IcyFrameListener#icyFrameIconified(icy.gui.frame.IcyFrameEvent
* )
*/
@Override
public void icyFrameIconified(IcyFrameEvent e) {
}
/*
* (non-Javadoc)
*
* @seeicy.gui.frame.IcyFrameListener#icyFrameInternalized(icy.gui.frame.
* IcyFrameEvent)
*/
@Override
public void icyFrameInternalized(IcyFrameEvent e) {
}
/*
* (non-Javadoc)
*
* @see
* icy.gui.frame.IcyFrameListener#icyFrameOpened(icy.gui.frame.IcyFrameEvent
* )
*/
@Override
public void icyFrameOpened(IcyFrameEvent e) {
}
@Override
public boolean isLogEnabled() {
return log;
}
public boolean isRunningHeadless() {
return runningHeadless;
}
@Override
public boolean isUIDisplayEnabled() {
return uiDisplay;
}
/**
* Log.
*/
public void log() {
log("");
}
/* (non-Javadoc)
* @see plugins.nherve.toolbox.AbleToLogMessages#log(java.lang.String)
*/
@Override
public void log(String message) {
if (isLogEnabled()) {
Algorithm.out(message);
}
}
/* (non-Javadoc)
* @see plugins.nherve.toolbox.AbleToLogMessages#logError(java.lang.String)
*/
@Override
public void logError(String message) {
Algorithm.err("ERROR : " + message);
}
@Override
public void logError(Throwable e) {
Algorithm.err("ERROR : " + e.getClass().getName() + " : " + e.getMessage());
}
/* (non-Javadoc)
* @see plugins.nherve.toolbox.AbleToLogMessages#logWarning(java.lang.String)
*/
@Override
public void logWarning(String message) {
Algorithm.err("WARNING : " + message);
}
protected void openHelpWindow(String text, int w, int h) {
new HelpWindow(this, myFrame, text, w, h);
}
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#painterAdded(icy.gui.main.MainEvent)
*/
@Override
public void painterAdded(MainEvent event) {
}
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#painterRemoved(icy.gui.main.MainEvent)
*/
@Override
public void painterRemoved(MainEvent event) {
}
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#pluginClosed(icy.gui.main.MainEvent)
*/
@Override
public void pluginClosed(MainEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#pluginOpened(icy.gui.main.MainEvent)
*/
@Override
public void pluginOpened(MainEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#roiAdded(icy.gui.main.MainEvent)
*/
@Override
public void roiAdded(MainEvent event) {
}
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#roiRemoved(icy.gui.main.MainEvent)
*/
@Override
public void roiRemoved(MainEvent event) {
}
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#sequenceClosed(icy.gui.main.MainEvent)
*/
@Override
public void sequenceClosed(MainEvent event) {
}
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#sequenceFocused(icy.gui.main.MainEvent)
*/
@Override
public void sequenceFocused(MainEvent event) {
changeSequence();
}
/**
* Sequence has changed.
*/
public abstract void sequenceHasChanged();
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#sequenceOpened(icy.gui.main.MainEvent)
*/
@Override
public void sequenceOpened(MainEvent event) {
}
/**
* Sequence will change.
*/
public abstract void sequenceWillChange();
/**
* Sets the current sequence.
*
* @param currentSequence
* the new current sequence
*/
protected void setCurrentSequence(Sequence currentSequence) {
this.currentSequence = currentSequence;
}
@Override
public void setLogEnabled(boolean log) {
this.log = log;
}
public void setRunningHeadless(boolean runningHeadless) {
this.runningHeadless = runningHeadless;
}
public void setTitle(String title) {
myFrame.setTitle(title);
}
@Override
public void setUIDisplayEnabled(boolean uiDisplay) {
this.uiDisplay = uiDisplay;
}
protected void startInterface() {
Dimension dd = getDefaultFrameDimension();
if (dd == null) {
myFrame = MyFrame.create(this, false, true, false, true);
} else {
myFrame = MyFrame.create(this, true, true, true, true);
}
SubstanceSkin skin = SubstanceLookAndFeel.getCurrentSkin();
DecorationAreaType deco = SubstanceLookAndFeel.getDecorationType(getFrame().getInternalFrame());
SubstanceColorScheme cs = skin.getActiveColorScheme(deco);
Color darkColor = cs.getUltraDarkColor();
WaitingAnimation.initAnimationImages(darkColor);
mainPanel= myFrame.getMainPanel();
addIcyFrame(myFrame);
fillInterface(mainPanel);
if (isRunningHeadless()) {
myFrame.externalize();
}
new WindowPositionSaver(myFrame, getPreferences().absolutePath(), new Point(0, 0), dd);
if (isRunningHeadless()) {
myFrame.externalize();
}
myFrame.addFrameListener(this);
myFrame.setVisible(true);
myFrame.pack();
beforeDisplayInterface(mainPanel);
myFrame.requestFocus();
}
/**
* Start plugin.
*/
protected void startPlugin() {
startInterface();
Icy.getMainInterface().addListener(this);
changeSequence();
}
public abstract void stopInterface();
/**
* Stop plugin.
*/
protected void stopPlugin() {
singletons.remove(getClass());
myFrame.removeAll();
myFrame = null;
mainPanel = null;
stopInterface();
}
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#viewerClosed(icy.gui.main.MainEvent)
*/
@Override
public void viewerClosed(MainEvent event) {
}
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#viewerFocused(icy.gui.main.MainEvent)
*/
@Override
public void viewerFocused(MainEvent event) {
}
/*
* (non-Javadoc)
*
* @see icy.gui.main.MainListener#viewerOpened(icy.gui.main.MainEvent)
*/
@Override
public void viewerOpened(MainEvent event) {
}
}