/*
* 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.plugin;
import icy.gui.component.ImageComponent;
import icy.gui.frame.IcyFrame;
import icy.gui.util.ComponentUtil;
import icy.gui.util.GuiUtil;
import icy.network.NetworkUtil;
import icy.plugin.PluginDescriptor;
import icy.plugin.PluginLauncher;
import icy.system.thread.ThreadUtil;
import icy.util.Random;
import icy.util.StringUtil;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
/**
* @author stephane
*/
public class PluginDetailPanel extends IcyFrame implements HyperlinkListener
{
private class ExecuteActionButton extends JButton implements ActionListener
{
/**
*
*/
private static final long serialVersionUID = 3096619820228575930L;
public ExecuteActionButton()
{
super("Execute");
setVisible(plugin.isActionable());
addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e)
{
PluginLauncher.start(plugin);
}
}
private class CloseActionButton extends JButton implements ActionListener
{
/**
*
*/
private static final long serialVersionUID = 4912851751410749786L;
public CloseActionButton()
{
super("Close");
addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e)
{
close();
}
}
final PluginDescriptor plugin;
// private final ChangesLogActionButton changesLogButton;
private final ExecuteActionButton executeButton;
private final CloseActionButton closeButton;
/**
* gui
*/
final JPanel imagePanel;
final ImageComponent pluginImage;
final JLabel pluginAuthorLabel;
final JLabel pluginWebsiteLabel;
final JLabel pluginEmailLabel;
final JTextPane pluginDescriptionText;
final JTextPane pluginChangeLogText;
/**
* @param plugin
*/
public PluginDetailPanel(PluginDescriptor plugin)
{
super(plugin.getName() + " " + plugin.getVersion(), false, true);
this.plugin = plugin;
// changesLogButton = new ChangesLogActionButton();
executeButton = new ExecuteActionButton();
closeButton = new CloseActionButton();
setPreferredSize(new Dimension(640, 480));
// build top panel
pluginDescriptionText = new JTextPane();
pluginDescriptionText.setContentType("text/html");
pluginDescriptionText.setEditable(false);
pluginDescriptionText.setOpaque(false);
pluginDescriptionText.addHyperlinkListener(this);
ComponentUtil.setFixedHeight(pluginDescriptionText, 256);
final JScrollPane scDescription = new JScrollPane(pluginDescriptionText);
scDescription.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
pluginImage = new ImageComponent(plugin.isImageLoaded() ? plugin.getImage() : PluginDescriptor.DEFAULT_IMAGE);
imagePanel = new JPanel(new BorderLayout());
imagePanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
imagePanel.add(pluginImage, BorderLayout.CENTER);
final JPanel topPanel = new JPanel(new BorderLayout());
topPanel.add(imagePanel, BorderLayout.WEST);
topPanel.add(scDescription, BorderLayout.CENTER);
// center panel
pluginAuthorLabel = new JLabel();
pluginWebsiteLabel = new JLabel();
pluginEmailLabel = new JLabel();
final JPanel infosPanel = new JPanel();
infosPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 8));
infosPanel.setLayout(new BoxLayout(infosPanel, BoxLayout.PAGE_AXIS));
infosPanel.add(GuiUtil.createTabBoldLabel("Author", 1));
infosPanel.add(GuiUtil.createTabLabel(pluginAuthorLabel, 32));
infosPanel.add(Box.createVerticalStrut(4));
infosPanel.add(GuiUtil.createTabBoldLabel("Web site", 1));
infosPanel.add(GuiUtil.createTabLabel(pluginWebsiteLabel, 32));
infosPanel.add(Box.createVerticalStrut(4));
infosPanel.add(GuiUtil.createTabBoldLabel("Email", 1));
infosPanel.add(GuiUtil.createTabLabel(pluginEmailLabel, 32));
infosPanel.add(Box.createVerticalStrut(4));
infosPanel.add(Box.createVerticalGlue());
pluginChangeLogText = new JTextPane();
pluginChangeLogText.setContentType("text/html");
pluginChangeLogText.setEditable(false);
pluginChangeLogText.setOpaque(false);
pluginChangeLogText.addHyperlinkListener(this);
final JScrollPane scChangeLog = new JScrollPane(pluginChangeLogText);
scChangeLog.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0));
final JPanel changeLogPanel = new JPanel(new BorderLayout());
changeLogPanel.setBorder(BorderFactory.createEmptyBorder(0, 8, 4, 4));
changeLogPanel.add(GuiUtil.createTabBoldLabel("ChangeLog", 1), BorderLayout.NORTH);
changeLogPanel.add(GuiUtil.createLineBoxPanel(Box.createHorizontalStrut(32), scChangeLog), BorderLayout.CENTER);
final JPanel centerPanel = new JPanel(new BorderLayout());
centerPanel.add(new JSeparator(SwingConstants.HORIZONTAL), BorderLayout.NORTH);
centerPanel.add(infosPanel, BorderLayout.WEST);
centerPanel.add(changeLogPanel, BorderLayout.CENTER);
// bottom panel
final JPanel buttonsPanel = new JPanel();
buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.LINE_AXIS));
buttonsPanel.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
buttonsPanel.add(executeButton);
buttonsPanel.add(Box.createHorizontalGlue());
buttonsPanel.add(Box.createHorizontalStrut(4));
buttonsPanel.add(closeButton);
final JPanel bottomPanel = new JPanel(new BorderLayout());
bottomPanel.add(new JSeparator(SwingConstants.HORIZONTAL), BorderLayout.NORTH);
bottomPanel.add(buttonsPanel, BorderLayout.CENTER);
setLayout(new BorderLayout());
add(topPanel, BorderLayout.NORTH);
add(centerPanel, BorderLayout.CENTER);
add(bottomPanel, BorderLayout.SOUTH);
updateGui();
addToDesktopPane();
// random position for more fun
setLocation(10 * Random.nextInt(20) + 40, 10 * Random.nextInt(10) + 40);
setVisible(true);
requestFocus();
// some parts of the descriptor are not loaded --> async update
if (!plugin.isAllLoaded())
{
ThreadUtil.bgRun(new Runnable()
{
@Override
public void run()
{
PluginDetailPanel.this.plugin.loadAll();
// rebuild interface
ThreadUtil.invokeLater(new Runnable()
{
@Override
public void run()
{
updateGui();
}
});
}
});
}
}
void updateGui()
{
final Font sysFont = pluginAuthorLabel.getFont();
final Image img = plugin.getImage();
final String description = plugin.getDescription();
final String changesLog = plugin.getChangeLog();
final String author = plugin.getAuthor();
final String email = plugin.getEmail();
final String web = plugin.getWeb();
if (img == null)
pluginImage.setImage(PluginDescriptor.DEFAULT_IMAGE);
else
pluginImage.setImage(img);
if (StringUtil.isEmpty(description))
pluginDescriptionText.setText("No description");
else
{
if (StringUtil.containHtmlCR(description))
pluginDescriptionText.setText(StringUtil.removeCR(description));
else
pluginDescriptionText.setText(StringUtil.toHtmlCR(description));
pluginDescriptionText.setCaretPosition(0);
}
ComponentUtil.setJTextPaneFont(pluginDescriptionText, sysFont, Color.black);
if (StringUtil.isEmpty(changesLog))
pluginChangeLogText.setText("---");
else
{
pluginChangeLogText.setText(StringUtil.toHtmlCR(changesLog));
pluginChangeLogText.setCaretPosition(0);
}
ComponentUtil.setJTextPaneFont(pluginChangeLogText, new Font("courier", Font.PLAIN, 11), Color.black);
if (StringUtil.isEmpty(author))
pluginAuthorLabel.setText("---");
else
pluginAuthorLabel.setText(author);
if (StringUtil.isEmpty(email))
pluginEmailLabel.setText("---");
else
pluginEmailLabel.setText(email);
if (StringUtil.isEmpty(web))
pluginWebsiteLabel.setText("---");
else
pluginWebsiteLabel.setText(web);
pack();
}
@Override
public void hyperlinkUpdate(HyperlinkEvent e)
{
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
NetworkUtil.openBrowser(e.getURL());
}
}