/**************************************************************
 * 
 * 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_text_LineNumberingSettings_idl__ 
#define __com_sun_star_text_LineNumberingSettings_idl__ 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module text {  
 
//============================================================================= 
 
/** provides access to the settings of the line numbering.
    @deprecated

    Actually there never was an implementation for this service.
 */
published service LineNumberingSettings
{ 
	//------------------------------------------------------------------------- 
	 
	/** If <TRUE/>, line numbering is used.
	 */
	[property] boolean On; 
 
	//------------------------------------------------------------------------- 
	 
	/** The name of the character style that is used for the line number.
	 */
	[property] string CharStyle; 
 
	//------------------------------------------------------------------------- 
	 
	/** If <TRUE/>, empty lines are counted.
	 */
	[property] boolean CountEmptyLines; 
 
	//------------------------------------------------------------------------- 
	 
	/** If <TRUE/>, lines in frames are included in counting.
	 */
	[property] boolean CountLinesInFrames; 
 
	//------------------------------------------------------------------------- 
	 
	/** specifies the distance between the line number and the start or 
		end of the text area.
	 */
	[property] long Distance; 
 
	//------------------------------------------------------------------------- 
	 
	/** Line numbers are shown on every <var>LineInterval</var>th line.
	 */
	[property] short LineInterval; 
 
	//------------------------------------------------------------------------- 
	 
	/** specifies the symbol that is shown between the line numbers.
	 */
	[property] string LineSeparator; 
 
	//------------------------------------------------------------------------- 
	 
	/** The line separator is shown every <var>SeparatorLineDistance</var>th line.
	 */
	[property] short SeparatorLineDistance; 
 
	//------------------------------------------------------------------------- 
	 
	/** specifies the position of the line number
	    (constant <type scope="com::sun::star::style::">LineNumberPosition</type> - left/right/inside/outside).
	 */
	[property] short NumberPosition; 
 
	//------------------------------------------------------------------------- 
	 
	/** specifies the type of the numbering.
	 */
	[property] short NumberingType; 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
#endif 
