/**************************************************************
 * 
 * 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_ContextInformation_idl__ 
#define __com_sun_star_script_ContextInformation_idl__ 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module script {  
 
//============================================================================= 
/** provides information about a certain stack frame.

	@deprecated
 */
published struct ContextInformation
{
	/** Full qualified name to address the module or function associated with the context.
		If the module or function can't be addressed by name, e.g., in case that a runtime 
		generated eval-module is executed, this string is empty
	 */
	string Name; 
 
	//------------------------------------------------------------------------- 
	/** Source code of the Module, that is associated with the context. If the source can 
		be accessed using the ModuleName or if the source is unknown (executing compiled 
		code) this string can be empty.
	 */
	string SourceCode; 
 
	//------------------------------------------------------------------------- 
	/** contains the first line in the module's source code associated with
		the context.
		
		<p>If "name" addresses a function, all line and column values
		are nevertheless given relative to the module's source. If
		source code is not available, this value addresses a binary
		position in the compiled code.  </p>

		@see XLibraryAccess::getModuleCode
		@see XLibraryAccess::getFunctionCode
	 */
	long StartLine; 
 
	//------------------------------------------------------------------------- 
	/** contains the first column in the <var>StartLine</var> associated with
		the context.
	 */
	long StartColumn; 
 
	//------------------------------------------------------------------------- 
	 
	/** contains the last line in the module's source code associated with
		the context.
	 */
	long EndLine; 
 
	//------------------------------------------------------------------------- 
	/** contains the first column in the <var>EndLine</var> that is NOT
		associated with the context.
	 */
	long EndColumn; 
 
	//------------------------------------------------------------------------- 
	/** Get all names of the local variable in this context.
	 */
	sequence<string> LocalVariableNames; 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
