View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2007 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.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 }