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 }