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