| /******************************************************************************* |
| * Copyright (C) 2007 The University of Manchester |
| * |
| * Modifications to the initial code base are copyright of their |
| * respective authors, or their employers as appropriate. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public License |
| * as published by the Free Software Foundation; either version 2.1 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 |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
| ******************************************************************************/ |
| package net.sf.taverna.t2.workbench.ui.impl.configuration.ui; |
| |
| import static javax.swing.JSplitPane.HORIZONTAL_SPLIT; |
| import static net.sf.taverna.t2.workbench.helper.HelpCollator.registerComponent; |
| import static net.sf.taverna.t2.workbench.helper.Helper.setKeyCatcher; |
| |
| import java.awt.BorderLayout; |
| import java.awt.Dimension; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Comparator; |
| import java.util.List; |
| import java.util.Map; |
| |
| import javax.swing.JFrame; |
| import javax.swing.JList; |
| import javax.swing.JPanel; |
| import javax.swing.JScrollPane; |
| import javax.swing.JSplitPane; |
| import javax.swing.ListModel; |
| import javax.swing.border.EmptyBorder; |
| import javax.swing.event.ListSelectionEvent; |
| import javax.swing.event.ListSelectionListener; |
| |
| import net.sf.taverna.t2.workbench.configuration.workbench.ui.T2ConfigurationFrame; |
| |
| import org.apache.log4j.Logger; |
| |
| import uk.org.taverna.configuration.ConfigurationUIFactory; |
| |
| public class T2ConfigurationFrameImpl implements T2ConfigurationFrame { |
| private static Logger logger = Logger.getLogger(T2ConfigurationFrameImpl.class); |
| private static final int FRAME_WIDTH = 700; |
| private static final int FRAME_HEIGHT = 450; |
| |
| private List<ConfigurationUIFactory> configurationUIFactories = new ArrayList<>(); |
| |
| private JFrame frame; |
| private JSplitPane splitPane; |
| private JList<ConfigurableItem> list; |
| |
| public T2ConfigurationFrameImpl() { |
| } |
| |
| @Override |
| public void showFrame() { |
| getFrame().setVisible(true); |
| } |
| |
| @Override |
| public void showConfiguration(String name) { |
| showFrame(); |
| ListModel<ConfigurableItem> lm = list.getModel(); |
| for (int i = 0; i < lm.getSize(); i++) |
| if (lm.getElementAt(i).toString().equals(name)) { |
| list.setSelectedIndex(i); |
| break; |
| } |
| } |
| |
| private JFrame getFrame() { |
| if (frame != null) |
| return frame; |
| |
| frame = new JFrame(); |
| setKeyCatcher(frame); |
| registerComponent(frame); |
| frame.setLayout(new BorderLayout()); |
| |
| /* |
| * Split pane to hold list of properties (on the left) and their |
| * configurable options (on the right) |
| */ |
| splitPane = new JSplitPane(HORIZONTAL_SPLIT); |
| splitPane.setBorder(null); |
| |
| list = getConfigurationList(); |
| JScrollPane jspList = new JScrollPane(list); |
| jspList.setBorder(new EmptyBorder(5, 5, 5, 5)); |
| jspList.setMinimumSize(new Dimension(150, |
| jspList.getPreferredSize().height)); |
| |
| splitPane.setLeftComponent(jspList); |
| splitPane.setRightComponent(new JPanel()); |
| splitPane.setDividerSize(1); |
| |
| // select first item if one exists |
| if (list.getModel().getSize() > 0) |
| list.setSelectedValue(list.getModel().getElementAt(0), true); |
| |
| frame.add(splitPane); |
| frame.setSize(new Dimension(FRAME_WIDTH, FRAME_HEIGHT)); |
| return frame; |
| } |
| |
| private JList<ConfigurableItem> getConfigurationList() { |
| if (list != null) |
| return list; |
| |
| list = new JList<>(); |
| list.addListSelectionListener(new ListSelectionListener() { |
| @Override |
| public void valueChanged(ListSelectionEvent e) { |
| if (list.getSelectedValue() instanceof ConfigurableItem) { |
| ConfigurableItem item = (ConfigurableItem) list |
| .getSelectedValue(); |
| setMainPanel(item.getPanel()); |
| } |
| |
| /* |
| * Keep the split pane's divider at its current position - but |
| * looks ugly. The problem with divider moving from its current |
| * position after selecting an item from the list on the left is |
| * that the right hand side panels are loaded dynamically and it |
| * seems there is nothing we can do about it - it's just the |
| * JSplitPane's behaviour |
| */ |
| // splitPane.setDividerLocation(splitPane.getLastDividerLocation()); |
| } |
| }); |
| list.setListData(getListItems()); |
| return list; |
| } |
| |
| private void setMainPanel(JPanel panel) { |
| panel.setBorder(new EmptyBorder(15, 15, 15, 15)); |
| splitPane.setRightComponent(panel); |
| } |
| |
| public void setConfigurationUIFactories( |
| List<ConfigurationUIFactory> configurationUIFactories) { |
| this.configurationUIFactories = configurationUIFactories; |
| } |
| |
| private ConfigurableItem[] getListItems() { |
| List<ConfigurableItem> arrayList = new ArrayList<>(); |
| for (ConfigurationUIFactory fac : configurationUIFactories) { |
| String name = fac.getConfigurable().getDisplayName(); |
| if (name != null) { |
| logger.info("Adding configurable for name: " + name); |
| arrayList.add(new ConfigurableItem(fac)); |
| } else { |
| logger.warn("The configurable " + fac.getConfigurable().getClass() |
| + " has a null name"); |
| } |
| } |
| // Sort the list alphabetically |
| ConfigurableItem[] array = arrayList.toArray(new ConfigurableItem[0]); |
| Arrays.sort(array, new Comparator<ConfigurableItem>() { |
| @Override |
| public int compare(ConfigurableItem item1, ConfigurableItem item2) { |
| return item1.toString().compareToIgnoreCase(item2.toString()); |
| } |
| }); |
| return array; |
| } |
| |
| public void update(Object service, Map<?, ?> properties) { |
| getConfigurationList().setListData(getListItems()); |
| if (frame != null) { |
| frame.revalidate(); |
| frame.repaint(); |
| // select first item if one exists |
| if (list.getModel().getSize() > 0) |
| list.setSelectedValue(list.getModel().getElementAt(0), true); |
| } |
| } |
| |
| class ConfigurableItem { |
| private final ConfigurationUIFactory factory; |
| |
| public ConfigurableItem(ConfigurationUIFactory factory) { |
| this.factory = factory; |
| } |
| |
| public JPanel getPanel() { |
| return factory.getConfigurationPanel(); |
| } |
| |
| @Override |
| public String toString() { |
| return factory.getConfigurable().getDisplayName(); |
| } |
| } |
| } |