1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.support.resolver;
14
15 import java.awt.BorderLayout;
16 import java.awt.Color;
17 import java.awt.Component;
18 import java.util.ArrayList;
19
20 import javax.swing.AbstractCellEditor;
21 import javax.swing.BorderFactory;
22 import javax.swing.JComboBox;
23 import javax.swing.JDialog;
24 import javax.swing.JPanel;
25 import javax.swing.JScrollPane;
26 import javax.swing.JTable;
27 import javax.swing.table.AbstractTableModel;
28 import javax.swing.table.DefaultTableCellRenderer;
29 import javax.swing.table.TableCellEditor;
30 import javax.swing.table.TableCellRenderer;
31
32 import org.jdesktop.swingx.JXTable;
33
34 import com.eviware.soapui.impl.wsdl.AbstractWsdlModelItem;
35 import com.eviware.soapui.impl.wsdl.actions.project.SimpleDialog;
36 import com.eviware.soapui.support.UISupport;
37 import com.eviware.soapui.support.resolver.ResolveContext.PathToResolve;
38 import com.eviware.soapui.support.resolver.ResolveContext.Resolver;
39
40 /***
41 * Utility for resolving items
42 *
43 * @author Ole.Matzura
44 */
45
46 public class ResolveDialog
47 {
48
49 private JDialog dialog;
50 private ResolveContextTableModel resolveContextTableModel;
51 private boolean showOkMessage;
52 private String title;
53 private String description;
54 private String helpUrl;
55
56 public ResolveDialog(String title, String description, String helpUrl)
57 {
58 this.title = title;
59
60 this.description = description;
61 this.helpUrl = helpUrl;
62
63 }
64
65 private void buildDialog()
66 {
67 dialog = new SimpleDialog(title, description, helpUrl, false)
68 {
69 @Override
70 protected Component buildContent()
71 {
72 JPanel panel = new JPanel(new BorderLayout());
73 JXTable table = new JXTable(resolveContextTableModel);
74 table.setHorizontalScrollEnabled(true);
75 table.setDefaultRenderer(JComboBox.class, new ResolverRenderer());
76 table.setDefaultEditor(JComboBox.class, new ResolverEditor());
77 table.getColumn(2).setCellRenderer(new PathCellRenderer());
78 table.getColumn(3).setWidth(100);
79
80 panel.add(new JScrollPane(table), BorderLayout.CENTER);
81 panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
82
83 return panel;
84 }
85
86 @Override
87 protected boolean handleOk()
88 {
89
90 for (PathToResolve path : resolveContextTableModel.getContext().getPathsToResolve())
91 {
92 int index = resolveContextTableModel.getContext().getPathsToResolve().indexOf(path);
93 Object key = resolveContextTableModel.jbcList.get(index).getSelectedItem();
94 if (key instanceof Resolver)
95 {
96 path.setResolver(key);
97 }
98 }
99 int cnt = resolveContextTableModel.getContext().apply();
100 if (isShowOkMessage())
101 {
102 UISupport.showInfoMessage("Resolved " + cnt + " items");
103 }
104 return true;
105 }
106
107 };
108
109 dialog.setSize(550, 300);
110 }
111
112 public boolean isShowOkMessage()
113 {
114 return showOkMessage;
115 }
116
117 public void setShowOkMessage(boolean showOkMessage)
118 {
119 this.showOkMessage = showOkMessage;
120 }
121
122 public ResolveContext resolve(AbstractWsdlModelItem modelItem)
123 {
124 ResolveContext context = new ResolveContext(modelItem);
125 modelItem.resolve(context);
126 if (context.isEmpty())
127 {
128 if (isShowOkMessage())
129 {
130 UISupport.showInfoMessage("No resolve problems found", title);
131 }
132 }
133 else
134 {
135 resolveContextTableModel = new ResolveContextTableModel(context);
136 if (dialog == null)
137 buildDialog();
138
139 UISupport.centerDialog(dialog);
140 dialog.setVisible(true);
141 }
142
143 return context;
144 }
145
146 @SuppressWarnings("serial")
147 private class ResolveContextTableModel extends AbstractTableModel
148 {
149 private ResolveContext<?> context;
150 private ArrayList<JComboBox> jbcList = new ArrayList<JComboBox>();
151
152 @SuppressWarnings("unchecked")
153 public ResolveContextTableModel(ResolveContext<?> context2)
154 {
155 context = context2;
156 for (PathToResolve path : context.getPathsToResolve())
157 {
158 ArrayList<Object> resolversAndDefaultAction = new ArrayList<Object>();
159 if (path.getDefaultAction() != null)
160 {
161 resolversAndDefaultAction.add(path.getDefaultAction());
162 }
163 for (Object resolver : path.getResolvers())
164 {
165 resolversAndDefaultAction.add(resolver);
166 }
167 JComboBox jbc = new JComboBox(resolversAndDefaultAction.toArray());
168 jbcList.add(jbc);
169 }
170
171 }
172
173 public JComboBox getResolversAndActions(int row)
174 {
175 return jbcList.get(row);
176 }
177
178 public int getColumnCount()
179 {
180 return 4;
181 }
182
183 public void setContext(ResolveContext context)
184 {
185 this.context = context;
186 fireTableDataChanged();
187 }
188
189 @Override
190 public String getColumnName(int column)
191 {
192 switch (column)
193 {
194 case 0:
195 return "Item";
196 case 1:
197 return "Description";
198 case 2:
199 return "Value";
200 case 3:
201 return "Action";
202 }
203
204 return super.getColumnName(column);
205 }
206
207 @Override
208 public Class<?> getColumnClass(int arg0)
209 {
210 if (arg0 == 3)
211 return JComboBox.class;
212 else
213 return String.class;
214 }
215
216 public int getRowCount()
217 {
218 return context.getPathsToResolve().size();
219 }
220
221 @Override
222 public boolean isCellEditable(int rowIndex, int columnIndex)
223 {
224 return columnIndex == 3;
225 }
226
227 @SuppressWarnings("unchecked")
228 public Object getValueAt(int arg0, int arg1)
229 {
230 PathToResolve ptr = context.getPathsToResolve().get(arg0);
231 switch (arg1)
232 {
233 case 0:
234 return ptr.getOwner().getName();
235 case 1:
236 return ptr.getDescription();
237 case 2:
238 return ptr.getPath();
239
240 }
241
242 return null;
243 }
244
245 public ResolveContext<?> getContext()
246 {
247 return context;
248 }
249
250 public void setResolver(int pathIndex, Object resolveOrDefaultAction)
251 {
252 PathToResolve path = context.getPathsToResolve().get(pathIndex);
253 if (resolveOrDefaultAction instanceof Resolver)
254 {
255 path.setResolver(resolveOrDefaultAction);
256 }
257
258 }
259 }
260
261 private class ResolverRenderer implements TableCellRenderer
262 {
263
264 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
265 int row, int column)
266 {
267 return ((ResolveContextTableModel) table.getModel()).getResolversAndActions(row);
268 }
269 }
270
271 private class ResolverEditor extends AbstractCellEditor implements TableCellEditor
272 {
273 private JComboBox jbc = new JComboBox();
274
275 public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
276 {
277 jbc = ((ResolveContextTableModel) table.getModel()).getResolversAndActions(row);
278 return jbc;
279 }
280
281 public Object getCellEditorValue()
282 {
283 return null;
284 }
285
286 }
287
288 private class PathCellRenderer extends DefaultTableCellRenderer
289 {
290 private Color greenColor = Color.GREEN.darker().darker();
291 private Color redColor = Color.RED.darker().darker();
292
293 @Override
294 public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4,
295 int arg5)
296 {
297 Component comp = super.getTableCellRendererComponent(arg0, arg1, arg2, arg3, arg4, arg5);
298
299 PathToResolve ptr = resolveContextTableModel.getContext().getPathsToResolve().get(arg4);
300 boolean resolved = ptr.getResolver() != null && ptr.getResolver().isResolved();
301
302 if (resolved)
303 {
304 setForeground(greenColor);
305 setText(ptr.getResolver().getResolvedPath());
306 }
307 else
308 {
309 setForeground(redColor);
310 }
311
312 return comp;
313 }
314 }
315
316 }