/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_script_XDebugging_idl__ 
#define __com_sun_star_script_XDebugging_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_script_ContextInformation_idl__ 
#include <com/sun/star/script/ContextInformation.idl> 
#endif 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module script {  
 
//============================================================================= 
 
// DocMerge from xml: interface com::sun::star::script::XDebugging
/** makes it possible to set breakpoints in an interpreter.
	@deprecated
 */
published interface XDebugging: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	/** returns the source code line where the breakpoint was set.  
				 
				<p>The value can differ from the parameter 
				<var>nSourceCodeLine</var> when this is not a valid line to 
				place it.  -1 indicates that the breakpoint cannot be set at 
				this position.
	 */
	long setBreakPoint( [in] string aModuleName, 
			 [in] long nSourceCodeLine, 
			 [in] boolean bOn ); 
 
	//------------------------------------------------------------------------- 
	/** clears all breakpoints in the module set by "setBreakPoint".
	 */
	void clearAllBreakPoints( [in] string aModuleName ); 
 
	//------------------------------------------------------------------------- 
	/** Evaluates an expression.

		@returns the value of the expression as string.

		@param CallStackPos	Position in the call stack for which the expression 
					should be evaluated. 0 is the top/actual position in the call 
					in the call stack, 1 the next and so on.
	 */
	string eval( [in] string aSourceCode, 
			 [in] short nCallStackPos ); 
 
	//------------------------------------------------------------------------- 
	/** Returns the engine's stack trace of the current execute position. Line break is the delimiter.
	 */
	sequence<string> getStackTrace(); 
 
	//------------------------------------------------------------------------- 
	/** returns more detailed information about a specified stack frame. 
				 
		 @param nCallStackPos 
				specifies the position in the call stack for the 
				variables that should be delivered.
	 */
	com::sun::star::script::ContextInformation getContextInformation( [in] short nCallStackPos ); 
 
	//------------------------------------------------------------------------- 
	/** returns the value of the variable at the given stack position.
	 */
	string dumpVariable( [in] string aVariableName, 
			 [in] short nCallStackPos ); 
 
	//------------------------------------------------------------------------- 
	/** sets the value of the specified variable within the specified
		stack frame.
	 */
	void setVariable( [in] string aVariableName, 
			 [in] string aValue, 
			 [in] short nCallStackPos ); 
 
	//------------------------------------------------------------------------- 
	/** returns whether the given variable exists within the specified stack frame.
	 */
	boolean isVariable( [in] string aVariableName, 
			 [in] short nCallStackPos ); 
 
	//------------------------------------------------------------------------- 
	/** stops the execution of the interpreter. 
		
		<p>To continue with the execution, call <method>XDebugging::doContinue</method>.
	 */
	void stop(); 
 
	//------------------------------------------------------------------------- 
	/** executes the next and only the next statement.
		
		<p>If the next statement is a function call, the function is
		executed completely.</p>
	 */
	void stepOver(); 
 
	//------------------------------------------------------------------------- 
	/** executes the next and only the next statement.
		
		<p>If the next statement is a function call, only the function 
		entered.</p>
	 */
	void stepIn(); 
 
	//------------------------------------------------------------------------- 
	/** executes the program until the next return from this stack frame.
	 */
	void stepOut(); 
 
	//------------------------------------------------------------------------- 
	/** continues the program execution.
	 */
	void doContinue(); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
