View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2008 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
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 }