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