1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.panels.request.components.editor.inspectors.attachments;
14
15 import java.awt.Component;
16 import java.awt.Toolkit;
17 import java.awt.datatransfer.DataFlavor;
18 import java.awt.datatransfer.Transferable;
19 import java.awt.dnd.DnDConstants;
20 import java.awt.dnd.DropTarget;
21 import java.awt.dnd.DropTargetDragEvent;
22 import java.awt.dnd.DropTargetDropEvent;
23 import java.awt.dnd.DropTargetEvent;
24 import java.awt.dnd.DropTargetListener;
25 import java.awt.event.ActionEvent;
26 import java.awt.event.MouseAdapter;
27 import java.awt.event.MouseEvent;
28 import java.beans.PropertyChangeEvent;
29 import java.beans.PropertyChangeListener;
30 import java.io.File;
31 import java.io.FileOutputStream;
32 import java.io.IOException;
33 import java.util.List;
34
35 import javax.swing.AbstractListModel;
36 import javax.swing.ComboBoxModel;
37 import javax.swing.DefaultCellEditor;
38 import javax.swing.JButton;
39 import javax.swing.JComboBox;
40 import javax.swing.JFileChooser;
41 import javax.swing.JTable;
42 import javax.swing.event.ListSelectionEvent;
43 import javax.swing.event.ListSelectionListener;
44
45 import com.eviware.soapui.SoapUI;
46 import com.eviware.soapui.impl.wsdl.AttachmentContainer;
47 import com.eviware.soapui.impl.wsdl.WsdlAttachmentPart;
48 import com.eviware.soapui.impl.wsdl.actions.support.ShowOnlineHelpAction;
49 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
50 import com.eviware.soapui.model.iface.Attachment;
51 import com.eviware.soapui.support.Tools;
52 import com.eviware.soapui.support.UISupport;
53 import com.eviware.soapui.support.components.JXToolBar;
54
55 /***
56 * Utility Panel for displaying a table of attachments
57 *
58 * @author emibre
59 */
60
61 public class AttachmentPanel extends javax.swing.JPanel
62 {
63 private DropTarget dropTarget;
64 private FileTransferHandler fileTransferHandler;
65 private AttachmentsTableModel tableModel;
66 private JFileChooser fc;
67 private final AttachmentContainer container;
68 private JButton exportBtn;
69
70 /*** Creates new form FileTableList */
71 public AttachmentPanel(AttachmentContainer container)
72 {
73 this.container = container;
74 initComponents();
75 initFileTransfer();
76 }
77
78 public void release()
79 {
80 tableModel.release();
81 if( attachmentPartCellEditor != null )
82 attachmentPartCellEditor.release();
83 }
84
85 private void initFileTransfer()
86 {
87 if (!container.isReadOnly())
88 {
89 fileTransferHandler = new FileTransferHandler(tableModel);
90 fileTable.setDragEnabled(true);
91 fileTable.setTransferHandler(fileTransferHandler);
92
93 dropTarget = new DropTarget();
94 dropTarget.setActive(true);
95 try
96 {
97 dropTarget.addDropTargetListener(new DropTargetListener()
98 {
99 public void dragEnter(DropTargetDragEvent dtde)
100 {
101 }
102
103 public void dragExit(DropTargetEvent dte)
104 {
105 }
106
107 public void dragOver(DropTargetDragEvent dtde)
108 {
109 }
110
111 @SuppressWarnings("unchecked")
112 public void drop(DropTargetDropEvent dtde)
113 {
114 try
115 {
116 dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
117 Transferable trans = dtde.getTransferable();
118 List<File> files = (List<File>) trans.getTransferData(DataFlavor.javaFileListFlavor);
119 for (File f : files)
120 {
121 System.out.println("Dropping file: " + f.getName());
122
123 Boolean retval = UISupport.confirmOrCancel("Cache attachment in request?", "Att Attachment");
124 if (retval == null)
125 return;
126
127 tableModel.addFile(f, retval);
128 }
129
130 }
131 catch (Exception e)
132 {
133 SoapUI.logError( e );
134 }
135 }
136
137 public void dropActionChanged(DropTargetDragEvent dtde)
138 {
139 }
140 });
141 }
142 catch (Exception e)
143 {
144 SoapUI.logError( e );
145 }
146
147 jScrollPane1.getViewport().setDropTarget(dropTarget);
148 }
149 }
150
151 private void initComponents()
152 {
153 jScrollPane1 = new javax.swing.JScrollPane();
154 tableModel = new AttachmentsTableModel(container);
155 fileTable = new JTable(tableModel);
156
157 if (!container.isReadOnly())
158 {
159 attachmentPartCellEditor = new AttachmentPartCellEditor();
160 fileTable.getColumnModel().getColumn(3).setCellEditor(attachmentPartCellEditor);
161 }
162
163 setLayout(new java.awt.BorderLayout());
164 jScrollPane1.setViewportView(fileTable);
165
166 add(jScrollPane1, java.awt.BorderLayout.CENTER);
167
168 jPanel1 = UISupport.createToolbar();
169
170 if (!container.isReadOnly())
171 {
172 addFileBtn = new javax.swing.JButton();
173 removeBtn = new javax.swing.JButton();
174
175 addFileBtn.setIcon(UISupport.createImageIcon( "/add_property.gif" ));
176 addFileBtn.setToolTipText( "Adds an attachment to this request" );
177 addFileBtn.addActionListener(new java.awt.event.ActionListener()
178 {
179 public void actionPerformed(java.awt.event.ActionEvent evt)
180 {
181 addFileBtnActionPerformed(evt);
182 }
183 });
184
185 jPanel1.addFixed(addFileBtn);
186
187 removeBtn.setIcon(UISupport.createImageIcon( "/remove_property.gif" ));
188 removeBtn.setToolTipText( "Removes the selected attachment from this request" );
189 removeBtn.setEnabled(false);
190 removeBtn.addActionListener(new java.awt.event.ActionListener()
191 {
192 public void actionPerformed(java.awt.event.ActionEvent evt)
193 {
194 removeBtnActionPerformed(evt);
195 }
196 });
197
198 jPanel1.addFixed(removeBtn);
199 }
200
201 exportBtn = new javax.swing.JButton();
202 exportBtn.setIcon(UISupport.createImageIcon( "/export.gif" ));
203 exportBtn.setToolTipText( "Exports the selected attachment to a file" );
204 exportBtn.setEnabled(false);
205 exportBtn.addActionListener(new java.awt.event.ActionListener()
206 {
207 public void actionPerformed(java.awt.event.ActionEvent evt)
208 {
209 exportBtnActionPerformed(evt);
210 }
211 });
212
213 jPanel1.addFixed(exportBtn);
214 jPanel1.addGlue();
215 jPanel1.addFixed( UISupport.createToolbarButton( new ShowOnlineHelpAction(HelpUrls.ATTACHMENTS_HELP_URL)));
216 add(jPanel1, java.awt.BorderLayout.NORTH);
217
218 fileTable.getSelectionModel().addListSelectionListener(new ListSelectionListener()
219 {
220 public void valueChanged(ListSelectionEvent e)
221 {
222 if( removeBtn != null )
223 removeBtn.setEnabled(fileTable.getSelectedRowCount() > 0);
224
225 exportBtn.setEnabled(fileTable.getSelectedRowCount() > 0);
226 }
227 });
228
229 fileTable.addMouseListener(new MouseAdapter()
230 {
231 public void mouseClicked(MouseEvent e)
232 {
233 if (e.getClickCount() < 2)
234 return;
235
236 int ix = fileTable.getSelectedRow();
237 if (ix == -1)
238 return;
239
240 Attachment attachment = container.getAttachmentAt(ix);
241 String url = attachment.getUrl();
242 if (url != null)
243 {
244 Tools.openURL(url);
245 }
246 else
247 {
248 Toolkit.getDefaultToolkit().beep();
249 }
250 }
251 });
252 }
253
254 protected void exportBtnActionPerformed( ActionEvent evt )
255 {
256 File file = UISupport.getFileDialogs().saveAs( this, "Export Attachment.." );
257 while( file != null && file.exists() &&
258 !UISupport.confirm( "File " + file.getName() + " exists, overwrite?", "Export Attachment" ))
259 {
260 file = UISupport.getFileDialogs().saveAs( this, "Export Attachment.." );
261 }
262
263 if( file != null )
264 {
265 Attachment attachment = tableModel.getAttachmentAt(fileTable.getSelectedRow());
266 try
267 {
268 FileOutputStream out = new FileOutputStream( file );
269
270 long total = Tools.writeAll( out, attachment.getInputStream() );
271 out.close();
272 UISupport.showInfoMessage( "Written [" + total + "] bytes to " + file.getName() );
273 }
274 catch( Exception e )
275 {
276 UISupport.showErrorMessage( e );
277 }
278 }
279 }
280
281 private void addFileBtnActionPerformed(java.awt.event.ActionEvent evt)
282 {
283 if (fc == null)
284 fc = new JFileChooser();
285
286 int returnVal = fc.showOpenDialog(this);
287
288 if (returnVal == JFileChooser.APPROVE_OPTION)
289 {
290 File file = fc.getSelectedFile();
291 Boolean retval = UISupport.confirmOrCancel("Cache attachment in request?", "Att Attachment");
292 if (retval == null)
293 return;
294 try
295 {
296 tableModel.addFile(file, retval);
297 }
298 catch (IOException e)
299 {
300 UISupport.showErrorMessage(e);
301 }
302 }
303 else
304 {
305 System.out.println("Open command cancelled by user.");
306 }
307 }
308
309 private void removeBtnActionPerformed(java.awt.event.ActionEvent evt)
310 {
311 if (UISupport.confirm("Remove selected attachments?", "Remove Attachments"))
312 tableModel.removeAttachment(fileTable.getSelectedRows());
313 }
314
315
316 private javax.swing.JButton addFileBtn;
317 private JTable fileTable;
318 private JXToolBar jPanel1;
319 private javax.swing.JScrollPane jScrollPane1;
320 private javax.swing.JButton removeBtn;
321 private AttachmentPartCellEditor attachmentPartCellEditor;
322
323
324
325 private class AttachmentPartCellEditor extends DefaultCellEditor
326 {
327 public AttachmentPartCellEditor()
328 {
329 super(new JComboBox(new PartsComboBoxModel()));
330 }
331
332 public void release()
333 {
334 ((PartsComboBoxModel) ((JComboBox) editorComponent).getModel()).release();
335 }
336
337 public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
338 {
339 ((PartsComboBoxModel) ((JComboBox) editorComponent).getModel()).init(tableModel.getAttachmentAt(row));
340 return super.getTableCellEditorComponent(table, value, isSelected, row, column);
341 }
342 }
343
344 private final class PartsComboBoxModel extends AbstractListModel implements ComboBoxModel, PropertyChangeListener
345 {
346 private Attachment attachment;
347 private WsdlAttachmentPart[] parts;
348
349 public PartsComboBoxModel()
350 {
351 container.addAttachmentsChangeListener( this );
352 }
353
354 public void release()
355 {
356 container.removeAttachmentsChangeListener( this );
357 }
358
359 public void init(Attachment attachment)
360 {
361 System.out.println( "Initializing parts..");
362 this.attachment = attachment;
363 parts = container.getDefinedAttachmentParts();
364 }
365
366 public Object getElementAt(int index)
367 {
368 return parts == null ? null : parts[index].getName();
369 }
370
371 public int getSize()
372 {
373 return parts == null ? 0 : parts.length;
374 }
375
376 public Object getSelectedItem()
377 {
378 return attachment == null ? null : attachment.getPart();
379 }
380
381 public void setSelectedItem(Object anItem)
382 {
383 if (attachment != null)
384 attachment.setPart((String) anItem);
385 }
386
387 public void propertyChange( PropertyChangeEvent arg0 )
388 {
389
390 if( arg0.getOldValue() == attachment && arg0.getNewValue() == null )
391 {
392 attachment = null;
393 parts = null;
394 }
395 }
396 }
397 }