/* * Copyright 2004-2010 Information & Software Engineering Group (188/1) * Institute of Software Technology and Interactive Systems * Vienna University of Technology, Austria * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.ifs.tuwien.ac.at/dm/somtoolbox/license.html * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package at.tuwien.ifs.commons.gui.jsap; import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import com.martiansoftware.jsap.JSAP; import com.martiansoftware.jsap.JSAPException; import com.martiansoftware.jsap.JSAPResult; import com.martiansoftware.jsap.Option; import com.martiansoftware.jsap.Parameter; import at.tuwien.ifs.commons.gui.controls.TitledCollapsiblePanel; import at.tuwien.ifs.somtoolbox.SOMToolboxException; import at.tuwien.ifs.somtoolbox.apps.SOMToolboxApp; import at.tuwien.ifs.somtoolbox.apps.viewer.SOMViewer; /** * @author frank * @version $Id: GenericGUI.java 3867 2010-10-21 15:50:10Z mayer $ */ public class GenericGUI extends JFrame { private static final long serialVersionUID = 1L; private final ArrayList<ParameterControl> argList; /** * Generate a {@link GenericGUI} based on the given {@link SOMToolboxApp} * * @param app the {@link SOMToolboxApp} */ public GenericGUI(final Class<? extends SOMToolboxApp> app) { this(app, new String[] {}); } /** * Generate a {@link GenericGUI} based on the given {@link SOMToolboxApp} * * @param app the {@link SOMToolboxApp} * @param args the command line arguments */ public GenericGUI(Class<? extends SOMToolboxApp> app, String[] args) { argList = new ArrayList<ParameterControl>(); initialize(app, args); } /** * Build and initialize the GUI * * @param args initial settings for the params. */ private void initialize(final Class<? extends SOMToolboxApp> app, String[] args) { setTitle(app.getSimpleName() + " - Config"); setDefaultCloseOperation(EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); setContentPane(mainPanel); JPanel contentPanel = new JPanel(); contentPanel.setLayout(new GridBagLayout()); JScrollPane scroll = new JScrollPane(contentPanel); scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); mainPanel.add(scroll, BorderLayout.CENTER); Parameter[] params; try { Field f = app.getField("OPTIONS"); if (f.getType().equals(Parameter[].class)) { params = (Parameter[]) f.get(null); } else { params = new Parameter[0]; } } catch (Exception e1) { e1.printStackTrace(); params = new Parameter[0]; } JSAP jsap = new JSAP(); for (Parameter parameter : params) { try { jsap.registerParameter(parameter); } catch (JSAPException e1) { } } JSAPResult result = jsap.parse(args); if (params.length > 0) { Arrays.sort(params, new Comparator<Parameter>() { @Override public int compare(Parameter p1, Parameter p2) { boolean r1 = false, r2 = false; if (p1 instanceof Option) { r1 = ((Option) p1).required(); } if (p2 instanceof Option) { r2 = ((Option) p2).required(); } if (r1 == r2) { return 0; } else { if (r1) { return -1; } else { return 1; } } } }); TitledCollapsiblePanel requiredParamsPanel = new TitledCollapsiblePanel("Required Parameter", new GridBagLayout()); TitledCollapsiblePanel optionalParamsPanel = new TitledCollapsiblePanel("Optional Parameter", new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 0; c.gridy = 0; c.weightx = 1; c.anchor = GridBagConstraints.NORTH; contentPanel.add(requiredParamsPanel, c); c.gridy++; contentPanel.add(optionalParamsPanel, c); c.gridy++; c.weighty = 1; c.fill = GridBagConstraints.BOTH; contentPanel.add(new JPanel(), c); TitledCollapsiblePanel current = requiredParamsPanel; for (Parameter parameter : params) { if (parameter instanceof Option) { if (!((Option) parameter).required()) { current = optionalParamsPanel; } } addParameter(current, parameter, result); } } else { contentPanel.add(new JLabel("No command line arguments available")); this.addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { doProceed(app); } }); } JPanel southPanel = new JPanel(); southPanel.setLayout(new GridBagLayout()); GridBagConstraints gbc0 = new GridBagConstraints(); gbc0.gridx = 0; gbc0.anchor = GridBagConstraints.EAST; gbc0.gridy = 0; gbc0.insets = new Insets(2, 2, 2, 2); GridBagConstraints gbc1 = new GridBagConstraints(); gbc1.gridx = 1; gbc1.anchor = GridBagConstraints.EAST; gbc1.gridy = 0; gbc1.insets = new Insets(2, 2, 2, 2); JButton btnProceed = new JButton("Proceed"); getRootPane().setDefaultButton(btnProceed); btnProceed.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { doProceed(app); } }); JButton btnClose = new JButton("Close"); btnClose.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { GenericGUI.this.dispose(); } }); southPanel.add(btnClose, gbc0); southPanel.add(btnProceed, gbc1); mainPanel.add(southPanel, BorderLayout.SOUTH); pack(); } private void addParameter(TitledCollapsiblePanel contentPanel, Parameter parameter, JSAPResult result) { GridBagConstraints l = new GridBagConstraints(); l.gridx = 0; l.gridy = GridBagConstraints.RELATIVE; l.anchor = GridBagConstraints.EAST; l.insets = new Insets(2, 2, 2, 2); GridBagConstraints c = new GridBagConstraints(); c.gridx = 1; c.gridy = GridBagConstraints.RELATIVE; c.anchor = GridBagConstraints.WEST; c.fill = GridBagConstraints.BOTH; c.weightx = 1; c.insets = new Insets(2, 2, 2, 2); try { ParameterControl conf = ParameterControl.createParameterControl(parameter, result); argList.add(conf); contentPanel.add(conf.getLabel(), l); contentPanel.add(conf.getEditor(), c); } catch (SOMToolboxException e) { e.printStackTrace(); } } /** * @param app the app to proceed */ private void doProceed(final Class<? extends SOMToolboxApp> app) { if (validateInput()) { ArrayList<String> argL = new ArrayList<String>(); for (ParameterControl ed : argList) { argL.addAll(Arrays.asList(ed.getCommandLine())); } System.out.print("Starting " + app.getName()); final String[] args = argL.toArray(new String[argL.size()]); for (String a : args) { System.out.print(" " + a); } System.out.println(); new Thread() { @Override public void run() { try { setVisible(false); Method main = app.getDeclaredMethod("main", String[].class); main.invoke(null, new Object[] { args }); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }.start(); } else { System.err.printf("Some args are missing%n"); } } private boolean validateInput() { boolean valid = true; for (ParameterControl editor : argList) { valid &= editor.validate(); } return valid; } /** * @param args [empty] */ public static void main(String[] args) { new GenericGUI(SOMViewer.class).setVisible(true); } }