/*
* 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.preferences;
import icy.gui.dialog.ConfirmDialog;
import icy.plugin.PluginDescriptor;
import icy.plugin.PluginInstaller;
import icy.plugin.PluginInstaller.PluginInstallerListener;
import icy.plugin.PluginLoader;
import icy.plugin.PluginRepositoryLoader;
import icy.plugin.PluginRepositoryLoader.PluginRepositoryLoaderListener;
import icy.preferences.RepositoryPreferences.RepositoryInfo;
import icy.system.thread.ThreadUtil;
import java.util.ArrayList;
import java.util.List;
/**
* @author Stephane
*/
public class PluginOnlinePreferencePanel extends PluginListPreferencePanel implements PluginRepositoryLoaderListener,
PluginInstallerListener
{
private enum PluginOnlineState
{
NULL, INSTALLING, REMOVING, HAS_INSTALL, INSTALLED, INSTALLED_FAULTY, OLDER, NEWER
}
/**
*
*/
private static final long serialVersionUID = 7737976340704271890L;
public static final String NODE_NAME = "Online Plugin";
PluginOnlinePreferencePanel(PreferenceFrame parent)
{
super(parent, NODE_NAME, PluginPreferencePanel.NODE_NAME);
PluginRepositoryLoader.addListener(this);
PluginInstaller.addListener(this);
// remove last column not used here
table.removeColumn(table.getColumn(columnIds[4]));
repositoryPanel.setVisible(true);
action1Button.setText("Delete");
action1Button.setVisible(true);
action2Button.setText("Install");
action2Button.setVisible(true);
updateButtonsState();
updateRepositories();
}
@Override
protected void closed()
{
super.closed();
PluginRepositoryLoader.removeListener(this);
PluginInstaller.removeListener(this);
}
private PluginOnlineState getPluginOnlineState(PluginDescriptor plugin)
{
if (plugin == null)
return PluginOnlineState.NULL;
if ((PluginInstaller.isInstallingPlugin(plugin)))
return PluginOnlineState.INSTALLING;
if ((PluginInstaller.isDesinstallingPlugin(plugin)))
return PluginOnlineState.REMOVING;
// has a local version ?
if (plugin.isInstalled())
{
// get local version
final PluginDescriptor localPlugin = PluginLoader.getPlugin(plugin.getClassName());
if (localPlugin != null)
{
if (plugin.equals(localPlugin))
return PluginOnlineState.INSTALLED;
if (plugin.isOlder(localPlugin))
return PluginOnlineState.OLDER;
if (plugin.isNewer(localPlugin))
return PluginOnlineState.NEWER;
}
// local version not loaded --> faulty
return PluginOnlineState.INSTALLED_FAULTY;
}
return PluginOnlineState.HAS_INSTALL;
}
@Override
protected void doAction1()
{
final List<PluginDescriptor> selectedPlugins = getSelectedPlugins();
final List<PluginDescriptor> toRemove = new ArrayList<PluginDescriptor>();
for (PluginDescriptor plugin : selectedPlugins)
{
final PluginOnlineState state = getPluginOnlineState(plugin);
// remove plugin
if ((state == PluginOnlineState.INSTALLED) || (state == PluginOnlineState.INSTALLED_FAULTY))
toRemove.add(plugin);
}
// nothing to remove
if (toRemove.isEmpty())
return;
// get dependants plugins
final List<PluginDescriptor> dependants = PluginInstaller.getLocalDependenciesFrom(toRemove);
// delete the one we plan to remove
dependants.removeAll(toRemove);
String message = "<html>";
if (!dependants.isEmpty())
{
message = message + "The following plugin(s) won't work anymore :<br>";
for (PluginDescriptor depPlug : dependants)
message = message + depPlug.getName() + " " + depPlug.getVersion() + "<br>";
message = message + "<br>";
}
message = message + "Are you sure you want to remove selected plugin(s) ?</html>";
if (ConfirmDialog.confirm(message))
{
// remove plugins
for (PluginDescriptor plugin : toRemove)
PluginInstaller.desinstall(plugin, false, true);
}
// refresh state
refreshTableData();
}
@Override
protected void doAction2()
{
final List<PluginDescriptor> selectedPlugins = getSelectedPlugins();
for (PluginDescriptor plugin : selectedPlugins)
{
final PluginOnlineState state = getPluginOnlineState(plugin);
if ((state == PluginOnlineState.HAS_INSTALL) || (state == PluginOnlineState.NEWER)
|| (state == PluginOnlineState.OLDER))
{
final boolean doInstall;
if (state == PluginOnlineState.OLDER)
doInstall = ConfirmDialog
.confirm("You'll replace your plugin by an older version !\nAre you sure you want to continue ?");
else
doInstall = true;
// install plugin
if (doInstall)
PluginInstaller.install(plugin, true);
}
}
// refresh state
refreshTableData();
}
@Override
protected void repositoryChanged()
{
refreshPlugins();
}
@Override
protected void reloadPlugins()
{
PluginRepositoryLoader.reload();
// so we display the empty list during reload
pluginsChanged();
}
@Override
protected String getStateValue(PluginDescriptor plugin)
{
switch (getPluginOnlineState(plugin))
{
case INSTALLING:
return "installing...";
case REMOVING:
return "removing...";
case NEWER:
return "update available";
case OLDER:
return "outdated";
case INSTALLED:
return "installed";
case INSTALLED_FAULTY:
return "faulty";
}
return "";
}
@Override
protected List<PluginDescriptor> getPlugins()
{
// loading...
if (!PluginRepositoryLoader.isLoaded())
return new ArrayList<PluginDescriptor>();
// get selected repository
final Object selectedItem = repository.getSelectedItem();
// load plugins from repository
if (selectedItem != null)
return PluginRepositoryLoader.getPlugins((RepositoryInfo) selectedItem);
return PluginRepositoryLoader.getPlugins();
}
@Override
protected void updateButtonsStateInternal()
{
super.updateButtonsStateInternal();
final List<PluginDescriptor> selectedPlugins = getSelectedPlugins();
final boolean selected = (selectedPlugins.size() > 0);
if (PluginRepositoryLoader.isLoaded())
{
refreshButton.setText("Reload list");
refreshButton.setEnabled(true);
repository.setEnabled(true);
}
else
{
refreshButton.setText("Reloading...");
refreshButton.setEnabled(false);
repository.setEnabled(false);
}
if (!selected)
{
action1Button.setEnabled(false);
action2Button.setEnabled(false);
return;
}
PluginOnlineState state;
state = PluginOnlineState.NULL;
for (PluginDescriptor plugin : selectedPlugins)
{
switch (getPluginOnlineState(plugin))
{
case REMOVING:
if (state == PluginOnlineState.NULL)
state = PluginOnlineState.REMOVING;
break;
case INSTALLED:
case INSTALLED_FAULTY:
if ((state == PluginOnlineState.NULL) || (state == PluginOnlineState.REMOVING))
state = PluginOnlineState.INSTALLED;
break;
}
}
// some online plugins are already installed ?
switch (state)
{
case REMOVING:
// special case where plugins are currently begin removed
action1Button.setText("Deleting...");
action1Button.setEnabled(false);
break;
case INSTALLED:
action1Button.setText("Delete");
action1Button.setEnabled(true);
break;
case NULL:
action1Button.setText("Delete");
action1Button.setEnabled(false);
break;
}
state = PluginOnlineState.NULL;
for (PluginDescriptor plugin : selectedPlugins)
{
switch (getPluginOnlineState(plugin))
{
case INSTALLING:
if (state == PluginOnlineState.NULL)
state = PluginOnlineState.INSTALLING;
break;
case OLDER:
if ((state == PluginOnlineState.NULL) || (state == PluginOnlineState.INSTALLING))
state = PluginOnlineState.OLDER;
break;
case NEWER:
if ((state == PluginOnlineState.NULL) || (state == PluginOnlineState.INSTALLING)
|| (state == PluginOnlineState.OLDER))
state = PluginOnlineState.NEWER;
break;
case HAS_INSTALL:
state = PluginOnlineState.HAS_INSTALL;
break;
}
}
switch (state)
{
case INSTALLING:
action2Button.setText("Installing...");
action2Button.setEnabled(false);
break;
case HAS_INSTALL:
action2Button.setText("Install");
action2Button.setEnabled(true);
break;
case OLDER:
action2Button.setText("Revert");
action2Button.setEnabled(true);
break;
case NEWER:
action2Button.setText("Update");
action2Button.setEnabled(true);
break;
case NULL:
action2Button.setText("Install");
action2Button.setEnabled(false);
break;
}
}
@Override
public void pluginRepositeryLoaderChanged(PluginDescriptor plugin)
{
if (plugin != null)
{
final int ind = getPluginModelIndex(plugin.getClassName());
if (ind != -1)
{
ThreadUtil.invokeNow(new Runnable()
{
@Override
public void run()
{
try
{
tableModel.fireTableRowsUpdated(ind, ind);
}
catch (Exception e)
{
// ignore possible exception here
}
}
});
}
}
else
pluginsChanged();
}
@Override
public void pluginInstalled(PluginDescriptor plugin, boolean success)
{
refreshTableData();
}
@Override
public void pluginRemoved(PluginDescriptor plugin, boolean success)
{
refreshTableData();
}
}