/**************************************************************
 *
 * 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
