Class |
Line # |
Actions |
|||
---|---|---|---|---|---|
RestInputParamEditDialog | 39 | 84 | 29 |
1 | /* | |
2 | * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) | |
3 | * Copyright (C) $$Year-Rel$$ The Jalview Authors | |
4 | * | |
5 | * This file is part of Jalview. | |
6 | * | |
7 | * Jalview is free software: you can redistribute it and/or | |
8 | * modify it under the terms of the GNU General Public License | |
9 | * as published by the Free Software Foundation, either version 3 | |
10 | * of the License, or (at your option) any later version. | |
11 | * | |
12 | * Jalview is distributed in the hope that it will be useful, but | |
13 | * WITHOUT ANY WARRANTY; without even the implied warranty | |
14 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
15 | * PURPOSE. See the GNU General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU General Public License | |
18 | * along with Jalview. If not, see <http://www.gnu.org/licenses/>. | |
19 | * The Jalview Authors are detailed in the 'AUTHORS' file. | |
20 | */ | |
21 | package jalview.gui; | |
22 | ||
23 | import jalview.jbgui.GRestInputParamEditDialog; | |
24 | import jalview.ws.params.InvalidArgumentException; | |
25 | import jalview.ws.params.OptionI; | |
26 | import jalview.ws.params.ParameterI; | |
27 | import jalview.ws.rest.InputType; | |
28 | import jalview.ws.rest.RestServiceDescription; | |
29 | ||
30 | import java.util.ArrayList; | |
31 | import java.util.Hashtable; | |
32 | ||
33 | import javax.swing.JOptionPane; | |
34 | import javax.swing.JPanel; | |
35 | import javax.swing.event.ListSelectionEvent; | |
36 | ||
37 | import net.miginfocom.swing.MigLayout; | |
38 | ||
39 | public class RestInputParamEditDialog extends GRestInputParamEditDialog | |
40 | implements OptsParametersContainerI | |
41 | { | |
42 | Hashtable<String, Class> typeclass = new Hashtable<String, Class>(); | |
43 | ||
44 | Hashtable<String, ArrayList<JPanel>> typeopts = new Hashtable<String, ArrayList<JPanel>>(); | |
45 | ||
46 | Hashtable<String, OptsAndParamsPage> opanps = new Hashtable<String, OptsAndParamsPage>(); | |
47 | ||
48 | 0 | private InputType getTypeFor(String name) |
49 | { | |
50 | 0 | try |
51 | { | |
52 | 0 | return (InputType) (typeclass.get(name).getConstructor() |
53 | .newInstance()); | |
54 | } catch (Throwable x) | |
55 | { | |
56 | 0 | jalview.bin.Console.errPrintln( |
57 | "Unexpected exception when instantiating rest input type."); | |
58 | 0 | x.printStackTrace(); |
59 | } | |
60 | 0 | return null; |
61 | } | |
62 | ||
63 | int reply; | |
64 | ||
65 | JalviewDialog frame = new JalviewDialog() | |
66 | { | |
67 | ||
68 | 0 | @Override |
69 | protected void raiseClosed() | |
70 | { | |
71 | ||
72 | } | |
73 | ||
74 | 0 | @Override |
75 | protected void okPressed() | |
76 | { | |
77 | 0 | reply = JvOptionPane.OK_OPTION; |
78 | } | |
79 | ||
80 | 0 | @Override |
81 | protected void cancelPressed() | |
82 | { | |
83 | 0 | reply = JvOptionPane.CANCEL_OPTION; |
84 | ||
85 | } | |
86 | }; | |
87 | ||
88 | InputType old, current; | |
89 | ||
90 | 0 | public RestInputParamEditDialog( |
91 | RestServiceEditorPane restServiceEditorPane, | |
92 | RestServiceDescription currentservice, InputType toedit) | |
93 | { | |
94 | 0 | initFor(restServiceEditorPane, currentservice, toedit); |
95 | 0 | frame.waitForInput(); |
96 | // TODO: warn user if they are about to overwrite an existing parameter | |
97 | // because they have used the same name when editing a different parameter. | |
98 | // TODO: make any press of the return key cause 'OK' to be pressed | |
99 | } | |
100 | ||
101 | 0 | private void initFor(RestServiceEditorPane restServiceEditorPane, |
102 | RestServiceDescription currentservice, InputType toedit) | |
103 | { | |
104 | 0 | okcancel.add(frame.cancel); |
105 | 0 | okcancel.add(frame.ok); |
106 | 0 | frame.initDialogFrame(dpane, true, true, |
107 | "Edit parameter for service " + currentservice.getName(), 600, | |
108 | 800); | |
109 | ||
110 | 0 | initTypeLists(); |
111 | 0 | reply = JvOptionPane.CANCEL_OPTION; |
112 | 0 | old = toedit; |
113 | 0 | current = null; |
114 | 0 | if (old != null) |
115 | { | |
116 | 0 | setStateFor(old); |
117 | } | |
118 | 0 | updated = updated && reply == JvOptionPane.OK_OPTION; |
119 | 0 | frame.validate(); |
120 | } | |
121 | ||
122 | 0 | public RestInputParamEditDialog( |
123 | RestServiceEditorPane restServiceEditorPane, | |
124 | RestServiceDescription currentservice, String string) | |
125 | { | |
126 | 0 | initFor(restServiceEditorPane, currentservice, null); |
127 | 0 | tok.setText(string); |
128 | 0 | frame.waitForInput(); |
129 | } | |
130 | ||
131 | 0 | private void setStateFor(InputType current) |
132 | { | |
133 | 0 | tok.setText(current.token); |
134 | 0 | OptsAndParamsPage opanp = opanps.get(current.getURLtokenPrefix()); |
135 | 0 | for (OptionI ops : current.getOptions()) |
136 | { | |
137 | 0 | if (ops instanceof ParameterI) |
138 | { | |
139 | 0 | opanp.setParameter((ParameterI) ops); |
140 | } | |
141 | else | |
142 | { | |
143 | 0 | if (ops.getValue() != null && ops.getValue().length() > 0) |
144 | { | |
145 | 0 | opanp.selectOption(ops, ops.getValue()); |
146 | } | |
147 | } | |
148 | } | |
149 | 0 | typeList.setSelectedValue(current.getURLtokenPrefix(), true); |
150 | 0 | type_SelectionChangedActionPerformed(null); |
151 | } | |
152 | ||
153 | 0 | private void updateCurrentType() |
154 | { | |
155 | 0 | if (typeList.getSelectedValue() != null) |
156 | { | |
157 | 0 | InputType newType = getTypeFor((String) typeList.getSelectedValue()); |
158 | 0 | if (newType != null) |
159 | { | |
160 | 0 | newType.token = tok.getText().trim(); |
161 | 0 | try |
162 | { | |
163 | 0 | newType.configureFromArgumentI(opanps |
164 | .get(newType.getURLtokenPrefix()).getCurrentSettings()); | |
165 | 0 | current = newType; |
166 | 0 | updated = true; |
167 | } catch (InvalidArgumentException ex) | |
168 | { | |
169 | 0 | jalview.bin.Console.errPrintln( |
170 | "IMPLEMENTATION ERROR: Invalid argument for type : " | |
171 | + typeList.getSelectedValue() + "\n"); | |
172 | 0 | ex.printStackTrace(); |
173 | } | |
174 | } | |
175 | } | |
176 | ||
177 | } | |
178 | ||
179 | 0 | private void initTypeLists() |
180 | { | |
181 | 0 | ArrayList<String> types = new ArrayList<String>(); |
182 | // populate type list | |
183 | 0 | for (Class type : RestServiceDescription.getInputTypes()) |
184 | { | |
185 | ||
186 | 0 | InputType jtype = null; |
187 | 0 | try |
188 | { | |
189 | 0 | JPanel inopts = new JPanel(new MigLayout()); |
190 | 0 | ArrayList<JPanel> opts = new ArrayList<JPanel>(), |
191 | prms = new ArrayList<JPanel>(); | |
192 | 0 | jtype = (InputType) (type.getConstructor().newInstance()); |
193 | 0 | typeclass.put(jtype.getURLtokenPrefix(), type); |
194 | // and populate parameters from this type | |
195 | 0 | OptsAndParamsPage opanp = new OptsAndParamsPage(this, true); |
196 | 0 | opanps.put(jtype.getURLtokenPrefix(), opanp); |
197 | 0 | for (OptionI opt : jtype.getOptions()) |
198 | { | |
199 | ||
200 | 0 | if (opt instanceof ParameterI) |
201 | { | |
202 | 0 | prms.add(opanp.addParameter((ParameterI) opt)); |
203 | } | |
204 | else | |
205 | { | |
206 | 0 | opts.add(opanp.addOption(opt)); |
207 | } | |
208 | } | |
209 | // then tag the params at the end of the options. | |
210 | 0 | for (JPanel pnl : prms) |
211 | { | |
212 | 0 | opts.add(pnl); |
213 | } | |
214 | 0 | typeopts.put(jtype.getURLtokenPrefix(), opts); |
215 | 0 | types.add(jtype.getURLtokenPrefix()); |
216 | } catch (Throwable x) | |
217 | { | |
218 | 0 | jalview.bin.Console.errPrintln( |
219 | "Unexpected exception when instantiating rest input type."); | |
220 | 0 | x.printStackTrace(); |
221 | } | |
222 | } | |
223 | 0 | typeList.setListData(types.toArray()); |
224 | ||
225 | } | |
226 | ||
227 | 0 | @Override |
228 | protected void type_SelectionChangedActionPerformed(ListSelectionEvent e) | |
229 | { | |
230 | 0 | options.removeAll(); |
231 | 0 | String typen = (String) typeList.getSelectedValue(); |
232 | 0 | if (typeopts.get(typen) != null) |
233 | { | |
234 | 0 | for (JPanel opt : typeopts.get(typen)) |
235 | { | |
236 | 0 | opt.setOpaque(true); |
237 | 0 | options.add(opt, "wrap"); |
238 | } | |
239 | 0 | options.invalidate(); |
240 | 0 | optionsPanel.setVisible(true); |
241 | } | |
242 | else | |
243 | { | |
244 | 0 | optionsPanel.setVisible(false); |
245 | } | |
246 | 0 | dpane.revalidate(); |
247 | 0 | updateCurrentType(); |
248 | } | |
249 | ||
250 | boolean updated = false; | |
251 | ||
252 | 0 | public boolean wasUpdated() |
253 | { | |
254 | 0 | return updated; |
255 | } | |
256 | ||
257 | 0 | @Override |
258 | public void refreshParamLayout() | |
259 | { | |
260 | 0 | options.invalidate(); |
261 | 0 | dpane.revalidate(); |
262 | } | |
263 | ||
264 | 0 | @Override |
265 | protected void tokChanged_actionPerformed() | |
266 | { | |
267 | 0 | if (tok.getText().trim().length() > 0) |
268 | { | |
269 | 0 | if (current != null) |
270 | { | |
271 | 0 | current.token = tok.getText().trim(); |
272 | 0 | updated = true; |
273 | } | |
274 | } | |
275 | } | |
276 | ||
277 | 0 | @Override |
278 | public void argSetModified(Object modifiedElement, boolean b) | |
279 | { | |
280 | 0 | updated = updated | b; |
281 | 0 | if (updated) |
282 | { | |
283 | 0 | updateCurrentType(); |
284 | } | |
285 | } | |
286 | ||
287 | } |