1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.support.editor.inspectors.amfheader;
14
15 import java.awt.BorderLayout;
16 import java.awt.event.ActionEvent;
17 import java.beans.PropertyChangeEvent;
18 import java.beans.PropertyChangeListener;
19
20 import javax.swing.AbstractAction;
21 import javax.swing.JButton;
22 import javax.swing.JComponent;
23 import javax.swing.JPanel;
24 import javax.swing.JScrollPane;
25 import javax.swing.JTable;
26 import javax.swing.SwingUtilities;
27 import javax.swing.event.ListSelectionEvent;
28 import javax.swing.event.ListSelectionListener;
29 import javax.swing.event.TableModelEvent;
30 import javax.swing.event.TableModelListener;
31
32 import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction;
33 import com.eviware.soapui.impl.wsdl.panels.request.StringToStringMapTableModel;
34 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
35 import com.eviware.soapui.support.UISupport;
36 import com.eviware.soapui.support.components.JXToolBar;
37 import com.eviware.soapui.support.editor.EditorView;
38 import com.eviware.soapui.support.editor.inspectors.AbstractXmlInspector;
39 import com.eviware.soapui.support.editor.views.xml.raw.RawXmlEditorFactory;
40 import com.eviware.soapui.support.editor.xml.XmlDocument;
41
42 public class AMFHeadersInspector extends AbstractXmlInspector implements PropertyChangeListener
43 {
44 private StringToStringMapTableModel headersTableModel;
45 private final AMFHeadersInspectorModel model;
46 private JTable headersTable;
47 private JPanel panel;
48 private JButton removeButton;
49 public boolean changing;
50
51 protected AMFHeadersInspector( AMFHeadersInspectorModel model )
52 {
53 super( "AMF Headers (" + ( model.getHeaders() == null ? "0" : model.getHeaders().size() ) + ")",
54 "AMF Headers for this amf message", true, AMFHeadersInspectorFactory.INSPECTOR_ID);
55 this.model = model;
56
57 model.addPropertyChangeListener( this );
58 }
59
60 public JComponent getComponent()
61 {
62 if (panel != null)
63 return panel;
64
65 headersTableModel = new StringToStringMapTableModel(model.getHeaders(), "AMFHeader", "Value", !model.isReadOnly());
66 headersTableModel.addTableModelListener(new TableModelListener()
67 {
68 public void tableChanged(TableModelEvent arg0)
69 {
70 model.setHeaders(headersTableModel.getData());
71 setTitle("AMF Headers (" + (model.getHeaders() == null ? "0" : model.getHeaders().size()) + ")");
72 }
73 });
74
75 headersTable = new JTable(headersTableModel);
76
77 panel = new JPanel(new BorderLayout());
78 panel.add(new JScrollPane(headersTable), BorderLayout.CENTER);
79
80 if (!model.isReadOnly())
81 {
82 headersTable.setSurrendersFocusOnKeystroke(true);
83 headersTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
84
85 JXToolBar builder = UISupport.createSmallToolbar();
86 builder.addFixed(UISupport.createToolbarButton(new AddAction()));
87 removeButton = UISupport.createToolbarButton(new RemoveAction());
88 builder.addFixed(removeButton);
89 builder.addGlue();
90 builder.addFixed(UISupport.createToolbarButton(new ShowOnlineHelpAction(HelpUrls.HEADERS_HELP_URL)));
91
92 panel.add(builder, BorderLayout.NORTH);
93
94 headersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener()
95 {
96
97 public void valueChanged(ListSelectionEvent e)
98 {
99 removeButton.setEnabled(headersTable.getSelectedRow() != -1);
100 }
101 });
102
103 if (headersTable.getRowCount() > 0)
104 headersTable.setRowSelectionInterval(0, 0);
105 else
106 removeButton.setEnabled(false);
107 }
108
109 return panel;
110 }
111
112 public JTable getHeadersTable()
113 {
114 return headersTable;
115 }
116
117 @Override
118 public void release()
119 {
120 super.release();
121 model.release();
122 model.removePropertyChangeListener(this);
123 }
124
125 public void propertyChange(PropertyChangeEvent evt)
126 {
127 if (!changing)
128 headersTableModel.setData(model.getHeaders());
129 }
130
131 private final class RemoveAction extends AbstractAction
132 {
133 private RemoveAction()
134 {
135 super();
136 putValue(AbstractAction.SMALL_ICON, UISupport.createImageIcon("/remove_property.gif"));
137 putValue(AbstractAction.SHORT_DESCRIPTION, "Removes the selected custom AMF Header from this message");
138 }
139
140 public void actionPerformed(ActionEvent arg0)
141 {
142 int row = headersTable.getSelectedRow();
143 if (row != -1 && UISupport.confirm("Delete selected header?", "Remove Header"))
144 {
145 changing = true;
146 headersTableModel.remove(row);
147 changing = false;
148 }
149 }
150 }
151
152 private final class AddAction extends AbstractAction
153 {
154 private AddAction()
155 {
156 super();
157 putValue(AbstractAction.SMALL_ICON, UISupport.createImageIcon("/add_property.gif"));
158 putValue(AbstractAction.SHORT_DESCRIPTION, "Adds a custom AMF Header to this message");
159 }
160
161 public void actionPerformed(ActionEvent arg0)
162 {
163 Object header = UISupport.prompt("Specify name of header to add", "Add AMF Header", "");
164 if (header != null)
165 {
166 changing = true;
167 headersTableModel.add(header.toString(), "");
168 SwingUtilities.invokeLater(new Runnable()
169 {
170 public void run()
171 {
172 int row = headersTable.getRowCount() - 1;
173 headersTable.scrollRectToVisible(headersTable.getCellRect(row, 1, true));
174 headersTable.setRowSelectionInterval(row, row);
175
176 SwingUtilities.invokeLater(new Runnable()
177 {
178 public void run()
179 {
180 headersTable.editCellAt(headersTable.getRowCount() - 1, 1);
181 headersTable.getEditorComponent().requestFocusInWindow();
182 }
183 });
184 }
185 });
186
187 changing = false;
188 }
189 }
190 }
191
192 @Override
193 public boolean isEnabledFor(EditorView<XmlDocument> view)
194 {
195 return !view.getViewId().equals(RawXmlEditorFactory.VIEW_ID);
196 }
197 }