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() ) + ")",
54 "Additional HTTP Headers for this message", 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
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 HTTP 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 HTTP 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 HTTP 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 }