package jalview.gui; import java.util.ArrayList; import java.util.Hashtable; import javax.swing.JDialog; import javax.swing.JInternalFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.event.ListSelectionEvent; import com.sun.tools.corba.se.idl.InvalidArgument; import net.miginfocom.swing.MigLayout; import jalview.jbgui.GRestInputParamEditDialog; import jalview.ws.params.ArgumentI; import jalview.ws.params.InvalidArgumentException; import jalview.ws.params.OptionI; import jalview.ws.params.ParameterI; import jalview.ws.rest.InputType; import jalview.ws.rest.RestServiceDescription; public class RestInputParamEditDialog extends GRestInputParamEditDialog implements OptsParametersContainerI { Hashtable typeclass = new Hashtable(); Hashtable> typeopts = new Hashtable>(); Hashtable opanps = new Hashtable(); private InputType getTypeFor(String name) { try { return (InputType) (typeclass.get(name).getConstructor() .newInstance(null)); } catch (Throwable x) { System.err .println("Unexpected exception when instantiating rest input type."); x.printStackTrace(); } return null; } int reply; JalviewDialog frame = new JalviewDialog() { @Override protected void raiseClosed() { } @Override protected void okPressed() { reply=JOptionPane.OK_OPTION; } @Override protected void cancelPressed() { reply=JOptionPane.CANCEL_OPTION; } }; InputType old,current; public RestInputParamEditDialog( RestServiceEditorPane restServiceEditorPane, RestServiceDescription currentservice, InputType toedit) { initFor(restServiceEditorPane, currentservice, toedit); frame.waitForInput(); // TODO: warn user if they are about to overwrite an existing parameter because they have used the same name when editing a different parameter. // TODO: make any press of the return key cause 'OK' to be pressed } private void initFor(RestServiceEditorPane restServiceEditorPane, RestServiceDescription currentservice, InputType toedit) { okcancel.add(frame.cancel); okcancel.add(frame.ok); frame.initDialogFrame(dpane, true, true, "Edit parameter for service "+currentservice.getName(), 600,800); initTypeLists(); reply=JOptionPane.CANCEL_OPTION; old = toedit; current = null; if (old!=null) { setStateFor(old); } updated = updated && reply==JOptionPane.OK_OPTION; frame.validate(); } public RestInputParamEditDialog( RestServiceEditorPane restServiceEditorPane, RestServiceDescription currentservice, String string) { initFor(restServiceEditorPane, currentservice,null); tok.setText(string); frame.waitForInput(); } private void setStateFor(InputType current) { tok.setText(current.token); OptsAndParamsPage opanp=opanps.get(current.getURLtokenPrefix()); for (OptionI ops:current.getOptions()) { if (ops instanceof ParameterI) { opanp.setParameter((ParameterI) ops); } else { if (ops.getValue()!=null && ops.getValue().length()>0) { opanp.selectOption(ops, ops.getValue()); } } } typeList.setSelectedValue(current.getURLtokenPrefix(), true); type_SelectionChangedActionPerformed(null); } private void updateCurrentType() { if (typeList.getSelectedValue()!=null) { InputType newType = getTypeFor((String)typeList.getSelectedValue()); if (newType!=null) { newType.token = tok.getText().trim(); try { newType.configureFromArgumentI(opanps.get(newType.getURLtokenPrefix()).getCurrentSettings()); current=newType; updated=true; } catch (InvalidArgumentException ex) { System.err.println("IMPLEMENTATION ERROR: Invalid argument for type : "+typeList.getSelectedValue()+"\n"); ex.printStackTrace(); } } } } private void initTypeLists() { ArrayList types=new ArrayList(); // populate type list for (Class type : RestServiceDescription.getInputTypes()) { InputType jtype = null; try { JPanel inopts = new JPanel(new MigLayout()); ArrayList opts = new ArrayList(), prms = new ArrayList(); jtype = (InputType) (type.getConstructor().newInstance(null)); typeclass.put(jtype.getURLtokenPrefix(), type); // and populate parameters from this type OptsAndParamsPage opanp = new OptsAndParamsPage(this,true); opanps.put(jtype.getURLtokenPrefix(),opanp); for (OptionI opt : jtype.getOptions()) { if (opt instanceof ParameterI) { prms.add(opanp.addParameter((ParameterI) opt)); } else { opts.add(opanp.addOption(opt)); } } // then tag the params at the end of the options. for (JPanel pnl : prms) { opts.add(pnl); } typeopts.put(jtype.getURLtokenPrefix(), opts); types.add(jtype.getURLtokenPrefix()); } catch (Throwable x) { System.err .println("Unexpected exception when instantiating rest input type."); x.printStackTrace(); } } typeList.setListData(types.toArray()); } @Override protected void type_SelectionChangedActionPerformed(ListSelectionEvent e) { options.removeAll(); String typen = (String) typeList.getSelectedValue(); if (typeopts.get(typen) != null) { for (JPanel opt : typeopts.get(typen)) { opt.setOpaque(true); options.add(opt,"wrap"); } options.invalidate(); optionsPanel.setVisible(true); } else { optionsPanel.setVisible(false); } dpane.revalidate(); updateCurrentType(); } boolean updated=false; public boolean wasUpdated() { return updated; } @Override public void refreshParamLayout() { options.invalidate(); dpane.revalidate(); } @Override protected void tokChanged_actionPerformed() { if (tok.getText().trim().length()>0) { if (current!=null) { current.token = tok.getText().trim(); updated = true; } } } @Override public void argSetModified(Object modifiedElement, boolean b) { updated = updated | b; if (updated) { updateCurrentType(); } } }