package org.freeplane.plugin.script.addons;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.WindowConstants;
import org.freeplane.core.resources.ResourceController;
import org.freeplane.core.ui.MenuBuilder;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.util.TextUtils;
import org.freeplane.main.addons.AddOnProperties;
public class ManageAddOnsDialog extends JDialog {
private static final long serialVersionUID = 1L;
private AddOnInstallerPanel addOnInstallerPanel;
private JTabbedPane tabbedPane;
public ManageAddOnsDialog(final List<AddOnProperties> addOns) {
super(UITools.getFrame(), TextUtils.getText("ManageAddOnsAction.text"), true);
// stolen from FileRevisionsDialog - no idea if actually needed
if (getOwner() != null) {
final Window[] ownedWindows = getOwner().getOwnedWindows();
for (Window w : ownedWindows) {
if (w.isVisible()) {
w.toBack();
}
}
}
tabbedPane = new JTabbedPane();
tabbedPane.setPreferredSize(getPreferredSizeForWindow());
final ManageAddOnsPanel manageAddOnsPanel = new ManageAddOnsPanel(filterNonThemes(addOns));
final ManageAddOnsPanel manageThemesPanel = new ManageAddOnsPanel(filterThemes(addOns));
addOnInstallerPanel = new AddOnInstallerPanel(manageAddOnsPanel, manageThemesPanel);
tabbedPane.addTab(getText("tab.install"), createIcon("/images/install_addons.png"), addOnInstallerPanel,
getText("tab.install.tooltip"));
tabbedPane.addTab(getText("tab.manage"), createIcon("/images/manage_addons.png"), manageAddOnsPanel,
getText("tab.manage.tooltip"));
tabbedPane.addTab(getText("tab.manage.themes"), createIcon("/images/manage_themes.png"), manageThemesPanel,
getText("tab.manage.themes.tooltip"));
getContentPane().add(tabbedPane, BorderLayout.CENTER);
{
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
{
JButton closeButton = new JButton();
MenuBuilder.setLabelAndMnemonic(closeButton, TextUtils.getRawText("close_btn"));
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
buttonPane.add(closeButton);
}
}
pack();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
UITools.addEscapeActionToDialog(this);
}
private List<AddOnProperties> filterThemes(final List<AddOnProperties> addOns) {
final ArrayList<AddOnProperties> result = new ArrayList<AddOnProperties>(addOns.size());
for (AddOnProperties addOn : addOns) {
if (addOn.isTheme())
result.add(addOn);
}
return result;
}
private List<AddOnProperties> filterNonThemes(final List<AddOnProperties> addOns) {
final ArrayList<AddOnProperties> result = new ArrayList<AddOnProperties>(addOns.size());
for (AddOnProperties addOn : addOns) {
if (!addOn.isTheme())
result.add(addOn);
}
return result;
}
private ImageIcon createIcon(String resource) {
return new ImageIcon(ResourceController.getResourceController().getResource(resource));
}
private Dimension getPreferredSizeForWindow() {
final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
return new Dimension((int) screenSize.getWidth() * 4 / 5, (int) screenSize.getHeight() * 2 / 3);
}
private static String getResourceKey(final String key) {
return "ManageAddOnsDialog." + key;
}
static String getText(String key, Object... parameters) {
if (parameters.length == 0)
return TextUtils.getText(getResourceKey(key));
else
return TextUtils.format(getResourceKey(key), parameters);
}
public void install(final URL url) {
if (addOnInstallerPanel.isShowing()) {
addOnInstallerPanel.getUrlField().setText(url.toString());
tabbedPane.paintImmediately(0, 0, tabbedPane.getWidth(), tabbedPane.getHeight());
addOnInstallerPanel.getInstallButton().doClick();
}
else {
addOnInstallerPanel.addHierarchyListener(new HierarchyListener() {
public void hierarchyChanged(HierarchyEvent e) {
if (addOnInstallerPanel.isShowing()) {
addOnInstallerPanel.removeHierarchyListener(this);
install(url);
}
}
});
tabbedPane.setSelectedComponent(addOnInstallerPanel);
if (!isVisible())
setVisible(true);
}
}
}