View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2010 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.amfheader;
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 AMFHeadersInspector extends AbstractXmlInspector implements PropertyChangeListener
43  {
44  	private StringToStringMapTableModel headersTableModel;
45  	private final AMFHeadersInspectorModel model;
46  	private JTable headersTable;
47  	private JPanel panel;
48  	private JButton removeButton;
49  	public boolean changing;
50  
51  	protected AMFHeadersInspector( AMFHeadersInspectorModel model )
52  	{
53  		super( "AMF Headers (" + ( model.getHeaders() == null ? "0" : model.getHeaders().size() ) + ")",
54  				"AMF Headers for this amf message", true, AMFHeadersInspectorFactory.INSPECTOR_ID);
55  		this.model = model;
56  
57  		model.addPropertyChangeListener( this );
58  	}
59  
60  	public JComponent getComponent()
61  	{
62  		if (panel != null)
63  			return panel;
64  
65  		headersTableModel = new StringToStringMapTableModel(model.getHeaders(), "AMFHeader", "Value", !model.isReadOnly());
66  		headersTableModel.addTableModelListener(new TableModelListener()
67  		{
68  			public void tableChanged(TableModelEvent arg0)
69  			{
70  				model.setHeaders(headersTableModel.getData());
71  				setTitle("AMF 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 AMF 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 AMF 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 AMF 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 }