1 package com.eviware.soapui.support.components;
2
3 import java.awt.BorderLayout;
4 import java.awt.CardLayout;
5 import java.awt.Color;
6 import java.awt.Dimension;
7 import java.awt.event.ActionEvent;
8 import java.beans.PropertyChangeEvent;
9 import java.beans.PropertyChangeListener;
10 import java.util.ArrayList;
11 import java.util.HashMap;
12 import java.util.List;
13 import java.util.Map;
14
15 import javax.swing.AbstractAction;
16 import javax.swing.BorderFactory;
17 import javax.swing.JComponent;
18 import javax.swing.JPanel;
19 import javax.swing.JSplitPane;
20 import javax.swing.JToggleButton;
21 import javax.swing.JToolBar;
22
23 import com.eviware.soapui.support.UISupport;
24
25 public class JInspectorPanel extends JPanel implements PropertyChangeListener
26 {
27 private float defaultDividerLocation = 0.7F;
28
29 private final JSplitPane mainSplit;
30 private JPanel inspectorPanel;
31 private int lastDividerLocation = 0;
32 private JXToolBar inspectToolbar;
33 private List<Inspector> inspectors = new ArrayList<Inspector>();
34 private Map<Inspector,JToggleButton> inspectorButtons = new HashMap<Inspector,JToggleButton>();
35 public Inspector currentInspector;
36
37 private final int orientation;
38
39 public JInspectorPanel( JComponent contentComponent )
40 {
41 this( contentComponent, JSplitPane.VERTICAL_SPLIT );
42 }
43
44 public JInspectorPanel(JComponent contentComponent, int orientation )
45 {
46 super( new BorderLayout() );
47 this.orientation = orientation;
48
49 inspectorPanel = new JPanel(new CardLayout());
50 inspectorPanel.setVisible( false );
51
52 mainSplit = new JSplitPane( orientation );
53 mainSplit.setDividerSize( 6 );
54 mainSplit.setBorder( null );
55 mainSplit.setOneTouchExpandable( false );
56
57 JXToolBar toolbar = createInspectButtons();
58 if( orientation == JSplitPane.VERTICAL_SPLIT )
59 {
60 mainSplit.setTopComponent( contentComponent );
61 mainSplit.setBottomComponent( inspectorPanel );
62 mainSplit.setResizeWeight( 0.8 );
63 toolbar.setBorder( BorderFactory.createEmptyBorder( 1, 2, 3, 2 ));
64 add( toolbar, BorderLayout.SOUTH );
65 }
66 else
67 {
68 mainSplit.setRightComponent( contentComponent );
69
70 JPanel p = new JPanel( new BorderLayout() );
71 p.add( toolbar );
72 toolbar.setBorder( BorderFactory.createEmptyBorder( 2, 3, 0, 4 ));
73 mainSplit.setLeftComponent( inspectorPanel );
74 mainSplit.setResizeWeight( 0.2 );
75
76 toolbar.setOrientation( JToolBar.VERTICAL );
77
78 add(p, BorderLayout.WEST );
79 }
80
81 add(mainSplit, BorderLayout.CENTER);
82
83 }
84
85 private JXToolBar createInspectButtons()
86 {
87 inspectToolbar = UISupport.createToolbar();
88 if( orientation == JSplitPane.VERTICAL_SPLIT )
89 inspectToolbar.addSpace( 10 );
90 inspectToolbar.setBackground( Color.WHITE );
91 inspectToolbar.setOpaque( true );
92 return inspectToolbar;
93 }
94
95 public float getDefaultDividerLocation()
96 {
97 return defaultDividerLocation;
98 }
99
100 public void setDefaultDividerLocation( float defaultDividerLocation )
101 {
102 this.defaultDividerLocation = defaultDividerLocation;
103 }
104
105 public <T extends Inspector> T addInspector( final T inspector )
106 {
107 if( inspectors.size() > 0 )
108 {
109 inspectToolbar.addSeparator();
110 }
111
112 inspectors.add( inspector );
113 inspector.addPropertyChangeListener( JInspectorPanel.this );
114
115 inspectorPanel.add( inspector.getComponent(), inspector.getInspectorId() );
116 JToggleButton button = new JToggleButton( new SelectInspectorAction( inspector ));
117
118 inspectorButtons.put( inspector, button );
119 if( orientation == JSplitPane.HORIZONTAL_SPLIT )
120 {
121 String text = button.getText();
122 button.setText( null );
123 button.setPreferredSize( new Dimension( 17, 10 ) );
124 button.setIcon( new VTextIcon( inspectToolbar, text, VTextIcon.ROTATE_LEFT) );
125 inspectToolbar.add( button );
126 }
127 else
128 inspectToolbar.add( button );
129
130 inspectToolbar.invalidate();
131 repaint();
132
133 return inspector;
134 }
135
136 public Inspector getInspector( String inspectorId )
137 {
138 for( Inspector inspector : inspectors )
139 {
140 if( inspector.getInspectorId().equals( inspectorId ))
141 return inspector;
142 }
143
144 return null;
145 }
146
147 public Inspector getInspectorByTitle( String title )
148 {
149 for( Inspector inspector : inspectors )
150 {
151 if( inspector.getTitle().equals( title ))
152 return inspector;
153 }
154
155 return null;
156 }
157
158 public void propertyChange(PropertyChangeEvent evt)
159 {
160 if( evt.getPropertyName().equals( Inspector.ENABLED_PROPERTY ))
161 {
162 JToggleButton toggleButton = inspectorButtons.get( evt.getSource() );
163 toggleButton.setEnabled( ( Boolean ) evt.getNewValue() );
164 }
165 }
166
167 public class SelectInspectorAction extends AbstractAction implements PropertyChangeListener
168 {
169 private final Inspector inspector;
170
171 public SelectInspectorAction( Inspector inspector )
172 {
173 super( inspector.getTitle());
174 this.inspector = inspector;
175
176 putValue( AbstractAction.SHORT_DESCRIPTION, inspector.getDescription() );
177 putValue( AbstractAction.SMALL_ICON, inspector.getIcon());
178 setEnabled( inspector.isEnabled() );
179
180 inspector.addPropertyChangeListener( this );
181 }
182
183 public void actionPerformed( ActionEvent arg0 )
184 {
185 JToggleButton button = inspectorButtons.get( inspector );
186 if( !button.isSelected() )
187 {
188 currentInspector = null;
189 button.setBackground( inspectToolbar.getBackground() );
190 lastDividerLocation = mainSplit.getDividerLocation();
191 inspectorPanel.setVisible( false );
192 }
193 else
194 {
195 activate( inspector );
196 }
197 }
198
199 public void propertyChange( PropertyChangeEvent evt )
200 {
201 if( evt.getPropertyName().equals( Inspector.TITLE_PROPERTY ))
202 putValue( AbstractAction.NAME, evt.getNewValue() );
203 else if( evt.getPropertyName().equals( Inspector.ICON_PROPERTY ))
204 putValue( AbstractAction.SMALL_ICON, evt.getNewValue() );
205 else if( evt.getPropertyName().equals( Inspector.DESCRIPTION_PROPERTY ))
206 putValue( AbstractAction.SHORT_DESCRIPTION, evt.getNewValue() );
207 else if( evt.getPropertyName().equals( Inspector.ENABLED_PROPERTY ))
208 {
209 boolean enable = ((Boolean)evt.getNewValue()).booleanValue();
210 setEnabled( enable );
211
212 if( !enable && currentInspector == inspector )
213 {
214 inspectorButtons.get( currentInspector ).setSelected( false );
215 }
216 }
217 }
218 }
219
220 public void release()
221 {
222 for( Inspector inspector : inspectors )
223 {
224 inspector.removePropertyChangeListener( this );
225 inspector.release();
226 }
227
228 inspectors.clear();
229 inspectorPanel.removeAll();
230 mainSplit.removeAll();
231 }
232
233 public List<Inspector> getInspectors()
234 {
235 return inspectors;
236 }
237
238 public Inspector getCurrentInspector()
239 {
240 return currentInspector;
241 }
242
243 public void setInspectorVisible( boolean b )
244 {
245 inspectorPanel.setVisible( b );
246 }
247
248 public void setToolbarVisible( boolean b )
249 {
250 inspectToolbar.setVisible( b );
251 }
252
253 public double getResizeWeight()
254 {
255 return mainSplit.getResizeWeight();
256 }
257
258 public void setResizeWeight( double value )
259 {
260 mainSplit.setResizeWeight( value );
261 }
262
263 public int getDividerLocation()
264 {
265 return mainSplit.getDividerLocation();
266 }
267
268 public void setResetDividerLocation()
269 {
270 mainSplit.setDividerLocation( defaultDividerLocation );
271 }
272
273 public void setDividerLocation( int dividerLocation )
274 {
275 mainSplit.setDividerLocation( dividerLocation );
276 }
277
278 public void setCurrentInspector( String string )
279 {
280 for( Inspector inspector : inspectors )
281 {
282 if( inspector.getTitle().equals( string ))
283 {
284 activate( inspector );
285 break;
286 }
287 }
288 }
289
290 public void deactivate()
291 {
292 activate( null );
293 }
294
295 public void activate( Inspector inspector )
296 {
297 if( inspector == currentInspector )
298 return;
299
300 if( currentInspector != null )
301 {
302 inspectorButtons.get( currentInspector ).setSelected( false );
303 currentInspector.deactivate();
304 }
305
306 if( inspector == null )
307 {
308 currentInspector = null;
309 inspectorPanel.setVisible( false );
310 }
311 else
312 {
313 JToggleButton button = inspectorButtons.get( inspector );
314 currentInspector = inspector;
315
316 button.setSelected( true );
317 button.setBackground( Color.WHITE );
318
319 if( !inspectorPanel.isVisible() )
320 {
321 inspectorPanel.setVisible( true );
322 if( lastDividerLocation == 0 )
323 mainSplit.setDividerLocation( defaultDividerLocation );
324 else
325 mainSplit.setDividerLocation( lastDividerLocation );
326 }
327
328 CardLayout cards = ( CardLayout ) inspectorPanel.getLayout();
329 cards.show( inspectorPanel, inspector.getInspectorId() );
330
331 currentInspector.activate();
332 }
333 }
334
335 public void setContentComponent( JComponent content )
336 {
337 mainSplit.setTopComponent( content );
338 }
339 }