/*
* org.openmicroscopy.shoola.agents.fsimporter.view.ImporterFactory
*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2014 University of Dundee. All rights reserved.
*
*
* This program 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 2 of the License, or
* (at your option) any later version.
* This program 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 this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.agents.fsimporter.view;
import javax.swing.JMenu;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openmicroscopy.shoola.agents.fsimporter.ImporterAgent;
import org.openmicroscopy.shoola.env.data.events.RemoveGroupEvent;
import omero.gateway.SecurityContext;
import org.openmicroscopy.shoola.env.ui.TaskBar;
/**
* Factory to create {@link Importer} component.
* This class keeps track of the {@link Importer} instance that has been
* created and is not yet in the {@link Importer#DISCARDED} state.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @author Donald MacDonald
* <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a>
* @version 3.0
* @since 3.0-Beta4
*/
public class ImporterFactory
implements ChangeListener
{
/** The name associated to the component. */
private static final String NAME = "Importer";
/** The name of the windows menu. */
private static final String MENU_NAME = "Importer";
/** The sole instance. */
private static final ImporterFactory singleton = new ImporterFactory();
/**
* Returns <code>true</code> if the importer already exists,
* <code>false</code> otherwise.
*
* @return See above.
*/
public static boolean doesImporterExist()
{
return singleton.importer != null;
}
/**
* Returns a {@link Importer}.
*
* @param groupId The identifier of the current group.
* @param master Pass <code>true</code> if the importer is used a
* stand-alone application, <code>false</code> otherwise.
* @param displayMode Group/Experimenter view.
* @return See above.
*/
public static Importer getImporter(long groupId, boolean master, int
displayMode)
{
ImporterModel model = new ImporterModel(groupId, master, displayMode);
return singleton.getImporter(model);
}
/**
* Returns a {@link Importer}.
*
* @param groupId The identifier of the current group.
* @param displayMode Group/Experimenter view.
* @return See above.
*/
public static Importer getImporter(long groupId, int displayMode)
{
return getImporter(groupId, false, displayMode);
}
/**
* Notifies the model that the user's group has successfully be modified
* if the passed value is <code>true</code>, unsuccessfully
* if <code>false</code>.
*
* @param success Pass <code>true</code> if successful, <code>false</code>
* otherwise.
*/
public static void onGroupSwitched(boolean success)
{
if (!success) return;
if (singleton.importer != null &&
((ImporterComponent) singleton.importer).isMaster()) {
((ImporterComponent) singleton.importer).onGroupSwitched(success);
return;
}
singleton.clear();
}
/** Close all the instances.*/
public static void terminate()
{
if (singleton.importer != null) {
((ImporterComponent) singleton.importer).shutDown();
}
}
/** Invokes when a new user has reconnected.*/
public static void onReconnected()
{
if (singleton.importer != null) {
singleton.importer.discard();
singleton.windowMenu.removeAll();
singleton.isAttached = false;
TaskBar tb = ImporterAgent.getRegistry().getTaskBar();
tb.removeFromMenu(TaskBar.WINDOW_MENU, singleton.windowMenu);
singleton.importer = null;
}
}
/**
* Sets the display mode.
*
* @param displayMode The value to set.
*/
public static void setDiplayMode(int displayMode)
{
if (singleton.importer == null) return;
((ImporterComponent) singleton.importer).setDisplayMode(displayMode);
}
/**
* Checks if there are on-going imports into the specified group
* before closing it.
*
* @param ctx The context to handle.
*/
public static void hasOnGoingImport(SecurityContext ctx)
{
if (singleton.importer == null || ctx == null) return;
//no import so we can close the group
if (!((ImporterComponent) singleton.importer).hasOnGoingImport(ctx)) {
ImporterAgent.getRegistry().getEventBus().post(
new RemoveGroupEvent(ctx));
}
}
/**
* Returns the <code>window</code> menu.
*
* @return See above.
*/
static JMenu getWindowMenu() { return singleton.windowMenu; }
/**
* Returns <code>true</code> is the {@link #windowMenu} is attached
* to the <code>TaskBar</code>, <code>false</code> otherwise.
*
* @return See above.
*/
static boolean isWindowMenuAttachedToTaskBar()
{
return singleton.isAttached;
}
/** Attaches the {@link #windowMenu} to the <code>TaskBar</code>. */
static void attachWindowMenuToTaskBar()
{
if (isWindowMenuAttachedToTaskBar()) return;
TaskBar tb = ImporterAgent.getRegistry().getTaskBar();
tb.addToMenu(TaskBar.WINDOW_MENU, singleton.windowMenu);
singleton.isAttached = true;
}
/** The tracked component. */
private Importer importer;
/**
* Indicates if the {@link #windowMenu} is attached to the
* <code>TaskBar</code>.
*/
private boolean isAttached;
/** The windows menu. */
private JMenu windowMenu;
/** Creates a new instance. */
private ImporterFactory()
{
isAttached = false;
windowMenu = new JMenu(MENU_NAME);
}
/**
* Creates or recycles a importer component for the specified
* <code>model</code>.
*
* @param model The Model.
* @return A {@link Importer}.
*/
private Importer getImporter(ImporterModel model)
{
if (importer != null) {
((ImporterComponent) importer).resetGroup(model.getGroupId());
return importer;
}
ImporterComponent comp = new ImporterComponent(model);
model.initialize(comp);
comp.initialize();
importer = comp;
return importer;
}
/** Clears the tracked component. */
private void clear()
{
if (importer == null) return;
importer.removeChangeListener(this);
importer.discard();
importer = null;
handleViewerDiscarded();
}
/**
* Checks the list of opened viewers before removing the entry from the
* menu.
*/
private void handleViewerDiscarded()
{
if (!singleton.isAttached) return;
if (singleton.importer != null) return;
TaskBar tb = ImporterAgent.getRegistry().getTaskBar();
tb.removeFromMenu(TaskBar.WINDOW_MENU, singleton.windowMenu);
singleton.isAttached = false;
}
/**
* Sets the {@link #importer} to <code>null</code> when it is
* {@link Importer#DISCARDED discarded}.
* @see ChangeListener#stateChanged(ChangeEvent)
*/
public void stateChanged(ChangeEvent ce)
{
ImporterComponent comp = (ImporterComponent) ce.getSource();
if (comp.getState() == Importer.DISCARDED) {
importer = null;
handleViewerDiscarded();
}
}
}