package apes.views;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import apes.controllers.PluginController;
import apes.interfaces.TransformPlugin;
import apes.lib.Language;
import apes.lib.PluginHandler;
/**
* Graphical view for the plugins.
*
* @author Johan Ã…hlander (johan.ahlander@gmail.com)
*/
public class PluginView extends JFrame
{
/**
* The plugin controller
*/
private PluginController pluginController;
/**
* The plugin handler
*/
private PluginHandler pluginHandler;
/**
* Mapping to fetch selected values from checkboxes.
*/
private Map<String, JCheckBox> choices;
/**
* Mapping to change descriptions.
*/
private Map<String, JTextArea> descs;
/**
* The language object.
*/
private Language language;
/**
* True if view has been created.
*/
private boolean viewCreated = false;
/**
* The effect menu.
*/
private JMenu effectMenu;
/**
* Last locale.
*/
private String lastLocale;
/**
* Creates a new <code>PluginView/code> instance.
*
* @param pH plugin handler.
* @param Pc plugin controller
*/
public PluginView(PluginHandler pH, PluginController pC)
{
pluginController = pC;
pluginHandler = pH;
choices = new HashMap<String, JCheckBox>();
descs = new HashMap<String, JTextArea>();
language = Language.getInstance();
effectMenu = new ApesMenu("menu.head.effects");
}
/**
* Creates the frame.
*/
public void create()
{
if(!viewCreated)
{
lastLocale = language.getLanguage();
setLayout(new BorderLayout());
add(createPluginPanel(), BorderLayout.NORTH);
add(createButtonPanel(), BorderLayout.SOUTH);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
pack();
setLocationRelativeTo(null);
viewCreated = true;
}
else
{
if(!lastLocale.equals(language.getLanguage()))
{
lastLocale = language.getLanguage();
updateDescriptions();
}
}
setVisible(true);
}
/**
* Update the descriptions when locale has changed.
*/
public void updateDescriptions()
{
for(String p : descs.keySet())
{
descs.get(p).setText(pluginHandler.getDescription(p, lastLocale));
}
}
/**
* Returns the top panel with selectable plugins.
*
* @return The top panel.
*/
public JPanel createPluginPanel()
{
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
panel.setLayout(new BorderLayout());
JPanel top = new JPanel();
JLabel header = new ApesLabel("plugins.header");
header.setFont(new Font("verdana", 1, 20));
top.add(header);
panel.add(top, BorderLayout.NORTH);
JPanel bottom = new JPanel();
GridBagConstraints c = new GridBagConstraints();
GridBagLayout gridbag = new GridBagLayout();
bottom.setLayout(gridbag);
bottom.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
ArrayList<String> names = pluginHandler.getPluginNames();
for(int i = 0; i < names.size(); i++)
{
JCheckBox pBox = new JCheckBox(names.get(i), pluginHandler.isLoaded(names.get(i)));
JTextArea pText = new JTextArea(pluginHandler.getDescription(names.get(i), language.getLanguage()));
c.gridx = 0;
c.gridy = i + 1;
c.gridwidth = 1;
;
c.ipadx = 10;
c.fill = GridBagConstraints.HORIZONTAL;
gridbag.setConstraints(pBox, c);
bottom.add(pBox);
c.gridx = 1;
gridbag.setConstraints(pText, c);
bottom.add(pText);
choices.put(names.get(i), pBox);
descs.put(names.get(i), pText);
}
panel.add(bottom, BorderLayout.SOUTH);
return panel;
}
/**
* Returns the bottom panel with buttons.
*
* @return The bottom panel.
*/
public JPanel createButtonPanel()
{
JPanel panel = new JPanel();
JButton applyButton = new JButton(language.get("plugins.apply"));
applyButton.addActionListener(pluginController);
applyButton.setName("apply");
panel.add(applyButton);
JButton closeButton = new JButton(language.get("plugins.close"));
closeButton.addActionListener(pluginController);
closeButton.setName("close");
panel.add(closeButton);
return panel;
}
/**
* Updates the effects menu.
*/
public void updateEffectMenu()
{
effectMenu.removeAll();
for(TransformPlugin p : pluginHandler.getTransforms())
{
JMenuItem effect = new JMenuItem(p.getName());
effect.setName("doEffect");
effect.addActionListener(pluginController);
effectMenu.add(effect);
}
}
/**
* Returns the effects menu.
*
* @return Effects menu.
*/
public JMenu getEffectMenu()
{
return effectMenu;
}
/**
* Returns mapping with plugin names and checkboxes.
*
* @return Selected options.
*/
public Map<String, JCheckBox> getChoices()
{
return choices;
}
}