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