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.teststeps.support;
    14
    15  import java.awt.BorderLayout;
    16  import java.awt.Font;
    17  import java.awt.event.ActionListener;
    18  import java.awt.event.FocusAdapter;
    19  import java.awt.event.FocusEvent;
    20
    21  import javax.swing.JPanel;
    22  import javax.swing.event.CaretListener;
    23  import javax.swing.text.Document;
    24
    25  import org.syntax.jedit.KeywordMap;
    26  import org.syntax.jedit.tokenmarker.CTokenMarker;
    27  import org.syntax.jedit.tokenmarker.GroovyTokenMarker;
    28  import org.syntax.jedit.tokenmarker.Token;
    29
    30  import com.eviware.soapui.model.settings.Settings;
    31  import com.eviware.soapui.model.settings.SettingsListener;
    32  import com.eviware.soapui.settings.UISettings;
    33  import com.eviware.soapui.support.DocumentListenerAdapter;
    34  import com.eviware.soapui.support.components.JEditorStatusBar.JEditorStatusBarTarget;
    35  import com.eviware.soapui.support.xml.JXEditTextArea;
    36
    37  /***
    38   * Groovy editor wrapper
    39   *
    40   * @author ole.matzura
    41   */
    42
    43  public class GroovyEditor extends JPanel implements JEditorStatusBarTarget
    44  {
    45  	private JXEditTextArea editArea;
    46  	private GroovyEditorModel model;
    47  	private InternalSettingsListener settingsListener;
    48  	private GroovyDocumentListener groovyDocumentListener;
    49
    50  	public GroovyEditor( GroovyEditorModel model )
    51  	{
    52  		super( new BorderLayout() );
    53  		this.model = model;
    54
    55  		editArea = new JXEditTextArea( new CTokenMarker( false, initKeywords() ) );
    56
    57  		Settings settings = model.getSettings();
    58  		String editorFont = settings.getString( UISettings.EDITOR_FONT, UISettings.DEFAULT_EDITOR_FONT );
    59  		if( editorFont != null && editorFont.length() > 0 )
    60  			editArea.setFont(Font.decode(editorFont));
    61  		else
    62  			editArea.setFont( Font.decode( UISettings.DEFAULT_EDITOR_FONT ));
    63
    64  		editArea.setText( model.getScript() );
    65  		editArea.setCaretPosition(  0 );
    66  		ActionListener runAction = model.getRunAction();
    67  		if( runAction != null )
    68  			editArea.getInputHandler().addKeyBinding( "A+ENTER", runAction );
    69
    70  		groovyDocumentListener = new GroovyDocumentListener();
    71  		editArea.getDocument().addDocumentListener( groovyDocumentListener );
    72
    73  		settingsListener = new InternalSettingsListener();
    74  		settings.addSettingsListener( settingsListener );
    75
    76  		add( editArea );
    77
    78  		addFocusListener( new FocusAdapter() {
    79
    80  			public void focusGained( FocusEvent e )
    81  			{
    82  				editArea.requestFocusInWindow();
    83  			}}
    84  		);
    85  	}
    86
    87  	public JXEditTextArea getEditArea()
    88  	{
    89  		return editArea;
    90  	}
    91
    92  	public void release()
    93  	{
    94  		model.getSettings().removeSettingsListener( settingsListener );
    95  		model = null;
    96  		editArea.getDocument().removeDocumentListener( groovyDocumentListener );
    97  		editArea.getInputHandler().removeAllKeyBindings();
    98  	}
    99
    100 	public void selectError(String message)
    101 	{
    102 		int ix = message == null ? -1 : message.indexOf( "@ line " );
    103 		if( ix >= 0 )
    104 		{
    105 			try
    106 			{
    107 				int ix2 = message.indexOf(',', ix);
    108 				int line = ix2 == -1 ? Integer.parseInt(message.substring(ix + 6).trim()) : Integer.parseInt(message
    109 						.substring(ix + 6, ix2).trim());
    110 				int column = 0;
    111 				if (ix2 != -1)
    112 				{
    113 					ix = message.indexOf("column ", ix2);
    114 					if (ix >= 0)
    115 					{
    116 						ix2 = message.indexOf('.', ix);
    117 						column = ix2 == -1 ? Integer.parseInt(message.substring(ix + 7).trim()) : Integer
    118 								.parseInt(message.substring(ix + 7, ix2).trim());
    119 					}
    120 				}
    121
    122 				editArea.setCaretPosition(editArea.getLineStartOffset(line - 1) + column - 1);
    123 			}
    124 			catch (Exception ex)
    125 			{
    126 			}
    127
    128 			editArea.requestFocus();
    129 		}
    130 	}
    131
    132 	private KeywordMap initKeywords()
    133 	{
    134 		KeywordMap keywords = GroovyTokenMarker.getKeywords();
    135
    136 		for( String keyword : model.getKeywords() )
    137 			keywords.add(keyword,Token.KEYWORD2);
    138 		return keywords;
    139 	}
    140
    141 	private final class GroovyDocumentListener extends DocumentListenerAdapter
    142 	{
    143 		public void update(Document document)
    144 		{
    145 			GroovyEditor.this.model.setScript( editArea.getText() );
    146 		}
    147 	}
    148
    149 	private final class InternalSettingsListener implements SettingsListener
    150 	{
    151 		public void settingChanged(String name, String newValue, String oldValue)
    152 		{
    153 			if( name.equals( UISettings.EDITOR_FONT ))
    154 			{
    155 				editArea.setFont( Font.decode( newValue ));
    156 				invalidate();
    157 			}
    158 		}
    159 	}
    160
    161 	public void addCaretListener( CaretListener listener )
    162 	{
    163 		editArea.addCaretListener( listener );
    164 	}
    165
    166 	public int getCaretPosition()
    167 	{
    168 		return editArea.getCaretPosition();
    169 	}
    170
    171 	public int getLineOfOffset( int offset ) throws Exception
    172 	{
    173 		return editArea.getLineOfOffset( offset );
    174 	}
    175
    176 	public int getLineStartOffset( int line ) throws Exception
    177 	{
    178 		return editArea.getLineStartOffset( line );
    179 	}
    180
    181 	public void removeCaretListener( CaretListener listener )
    182 	{
    183 		editArea.removeCaretListener( listener );
    184 	}
    185 }