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;
    14
    15  import java.awt.BorderLayout;
    16  import java.awt.Color;
    17  import java.beans.PropertyChangeEvent;
    18  import java.beans.PropertyChangeListener;
    19  import java.util.ArrayList;
    20  import java.util.List;
    21
    22  import javax.swing.JPanel;
    23  import javax.swing.JTabbedPane;
    24  import javax.swing.SwingUtilities;
    25  import javax.swing.event.ChangeEvent;
    26  import javax.swing.event.ChangeListener;
    27
    28  import com.eviware.soapui.support.components.Inspector;
    29  import com.eviware.soapui.support.components.JInspectorPanel;
    30  import com.eviware.soapui.support.components.VTextIcon;
    31  import com.eviware.soapui.support.components.VerticalTabbedPaneUI;
    32
    33  /***
    34   * Editor-framework for Xml Documents
    35   *
    36   * @author ole.matzura
    37   */
    38
    39  @SuppressWarnings("serial")
    40  public class XmlEditor extends JPanel implements PropertyChangeListener, XmlLocationListener
    41  {
    42  	private JTabbedPane inputTabs;
    43  	private List<XmlEditorView> views = new ArrayList<XmlEditorView>();
    44  	private XmlEditorView currentView;
    45  	private XmlDocument xmlDocument;
    46  	private JInspectorPanel inspectorPanel;
    47  	private InputTabsChangeListener inputTabsChangeListener;
    48
    49  	public XmlEditor( XmlDocument xmlDocument )
    50  	{
    51  		super( new BorderLayout() );
    52  		this.xmlDocument = xmlDocument;
    53
    54  		setBackground(Color.LIGHT_GRAY);
    55  	   inputTabs = new JTabbedPane(JTabbedPane.LEFT, JTabbedPane.SCROLL_TAB_LAYOUT);
    56     	inputTabs.setUI(new VerticalTabbedPaneUI());
    57
    58  		inputTabs.setFont(inputTabs.getFont().deriveFont(8));
    59  		inputTabsChangeListener = new InputTabsChangeListener();
    60  		inputTabs.addChangeListener( inputTabsChangeListener );
    61
    62  		inspectorPanel = new JInspectorPanel( inputTabs );
    63  		add( inspectorPanel, BorderLayout.CENTER );
    64  	}
    65
    66  	public void addEditorView( XmlEditorView editorView )
    67  	{
    68  		views.add( editorView );
    69
    70  		inputTabs.addTab( null, new VTextIcon(inputTabs, editorView.getTitle(), VTextIcon.ROTATE_LEFT ),
    71  				editorView.getComponent() );
    72
    73  		editorView.addPropertyChangeListener( this );
    74  		editorView.addLocationListener( this );
    75
    76  		editorView.setXmlDocument( xmlDocument );
    77  	}
    78
    79  	public void propertyChange(PropertyChangeEvent evt)
    80  	{
    81  		if( evt.getPropertyName().equals( XmlEditorView.TITLE_PROPERTY ))
    82  		{
    83  			int ix = views.indexOf( evt.getSource() );
    84  			if( ix == -1 )
    85  				return;
    86
    87  			inputTabs.setTitleAt( ix, (String) evt.getNewValue() );
    88  		}
    89  	}
    90
    91  	public void selectView( int viewIndex )
    92  	{
    93  		inputTabs.setSelectedIndex( viewIndex );
    94  	}
    95
    96  	public void selectView( String viewId )
    97  	{
    98  		for( int c = 0; c < views.size(); c++ )
    99  		{
    100 			if( views.get( c ).getViewId().equals( viewId ))
    101 			{
    102 				inputTabs.setSelectedIndex( c );
    103 				return;
    104 			}
    105 		}
    106 	}
    107
    108
    109 	public void requestFocus()
    110 	{
    111 		if( currentView != null )
    112 			currentView.getComponent().requestFocus();
    113 	}
    114
    115 	public final XmlDocument getXmlDocument()
    116 	{
    117 		return xmlDocument;
    118 	}
    119
    120 	public boolean saveDocument( boolean validate )
    121 	{
    122 	   return currentView == null ? true : currentView.saveDocument( validate );
    123 	}
    124
    125 	public boolean hasFocus()
    126 	{
    127 		return currentView == null ? false : currentView.getComponent().hasFocus();
    128 	}
    129
    130 	public final void setXmlDocument(XmlDocument xmlDocument)
    131 	{
    132 		if( this.xmlDocument != null )
    133 			this.xmlDocument.release();
    134
    135 		this.xmlDocument = xmlDocument;
    136
    137 		for( XmlEditorView view : views )
    138 		{
    139 			view.setXmlDocument( xmlDocument );
    140 		}
    141 	}
    142
    143 	public final XmlEditorView getCurrentView()
    144 	{
    145 		return currentView;
    146 	}
    147
    148 	public final JTabbedPane getInputTabs()
    149 	{
    150 		return inputTabs;
    151 	}
    152
    153 	public final List<XmlEditorView> getViews()
    154 	{
    155 		return views;
    156 	}
    157
    158 	public XmlEditorView getView( String viewId )
    159 	{
    160 		for( XmlEditorView view : views )
    161 		{
    162 			if( view.getViewId().equals( viewId ))
    163 				return view;
    164 		}
    165
    166 		return null;
    167 	}
    168
    169 	public Inspector getInspector( String inspectorId  )
    170 	{
    171 		return inspectorPanel.getInspector( inspectorId );
    172 	}
    173
    174 	public void locationChanged(XmlLocation location)
    175 	{
    176 		if( location != null )
    177 		{
    178 			for( Inspector inspector : inspectorPanel.getInspectors() )
    179 			{
    180 				((XmlInspector)inspector).locationChanged( location );
    181 			}
    182 		}
    183 	}
    184
    185 	public void setEditable( boolean enabled )
    186 	{
    187 		for( XmlEditorView view : views )
    188 		{
    189 			view.setEditable( enabled );
    190 		}
    191 	}
    192
    193 	public void addInspector( XmlInspector inspector )
    194 	{
    195 		inspectorPanel.addInspector( inspector );
    196 	}
    197
    198 	private final class InputTabsChangeListener implements ChangeListener
    199 	{
    200 		private int lastDividerLocation;
    201
    202 		public void stateChanged( ChangeEvent e )
    203 		{
    204 			int currentViewIndex = views.indexOf( currentView );
    205
    206 			if( currentView != null )
    207 			{
    208 				if( inputTabs.getSelectedIndex() == currentViewIndex)
    209 					return;
    210
    211 				if( !currentView.deactivate() )
    212 				{
    213 					inputTabs.setSelectedIndex( currentViewIndex );
    214 					return;
    215 				}
    216 			}
    217
    218 			XmlEditorView previousView = currentView;
    219 			int selectedIndex = inputTabs.getSelectedIndex();
    220 			if( selectedIndex == -1 )
    221 			{
    222 				currentView = null;
    223 				return;
    224 			}
    225
    226 			currentView = views.get( selectedIndex );
    227
    228 			if( currentView != null && !currentView.activate( previousView == null ? null : previousView.getLocation() ))
    229 			{
    230 				inputTabs.setSelectedIndex( currentViewIndex );
    231 				if( currentViewIndex == -1 )
    232 					return;
    233 			}
    234
    235 			XmlInspector currentInspector = ( XmlInspector ) inspectorPanel.getCurrentInspector();
    236
    237 			if( !currentView.isInspectable() && currentInspector != null )
    238 				lastDividerLocation = inspectorPanel.getDividerLocation();
    239
    240 			inspectorPanel.setInspectorVisible( currentView.isInspectable() && currentInspector != null );
    241 			inspectorPanel.setToolbarVisible( currentView.isInspectable()  );
    242
    243 			if( currentView.isInspectable() && currentInspector != null )
    244 			{
    245 				if( lastDividerLocation == 0 )
    246 					inspectorPanel.setResetDividerLocation();
    247 				else
    248 					inspectorPanel.setDividerLocation( lastDividerLocation );
    249 			}
    250
    251 			SwingUtilities.invokeLater( new Runnable() {
    252
    253 				public void run()
    254 				{
    255 					if( currentView != null )
    256 						currentView.getComponent().requestFocus();
    257 				}} );
    258 		}
    259 	}
    260
    261 	public void release()
    262 	{
    263 		for( XmlEditorView view : views )
    264 		{
    265 			view.release();
    266 			view.removeLocationListener( this );
    267 			view.removePropertyChangeListener( this );
    268 		}
    269
    270 		views.clear();
    271
    272 		inputTabs.removeChangeListener( inputTabsChangeListener );
    273 		inputTabs.removeAll();
    274
    275 		inspectorPanel.release();
    276 		xmlDocument.release();
    277 	}
    278 }