/**************************************************************
 * 
 * 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_DocumentIndex_idl__
#define __com_sun_star_text_DocumentIndex_idl__

#include <com/sun/star/text/BaseIndex.idl>
#ifndef __com_sun_star_text_XDocumentIndexMark_idl__
#include <com/sun/star/text/XDocumentIndexMark.idl>
#endif

//=============================================================================

module com {  module sun {  module star {  module text {

//=============================================================================

/** specifies service of content indexes within a document.@see com::sun::star::text::BaseIndex
 */
published service DocumentIndex
{
	service  com::sun::star::text::BaseIndex;

	/** determins if alphabetical separators are genererated.
	 */
	[optional, property] boolean UseAlphabeticalSeparators;

	/** determins if a index entry is generated for each primary/secondary key.
	 */
	[optional, property] boolean UseKeyAsEntry;

	/** determins if same entries on different pages are combined into one index entry.
	 */
	[optional, property] boolean UseCombinedEntries;

	/** determins if the similarity of index entries is checked case sensitively.
	 */
	[optional, property] boolean IsCaseSensitive;

	/** determins if following page numbers are displayed using a 'pp.'.
	 */
	[optional, property] boolean UsePP;

	/** determins if if following page numbers are displayed using a dash.
	 */
	[optional, property] boolean UseDash;

	/** determins if all entries start with a capital letter.
	 */
	[optional, property] boolean UseUpperCase;

	/** determins the name of the character style that is applied to the number
	 of a page where main index entry is located.
	 */
	[optional, property] string MainEntryCharacterStyleName;

	/**
	 contains all index marks that are related to this index.
	 */
    [readonly, property] sequence <com::sun::star::text::XDocumentIndexMark> DocumentIndexMarks;

    //------------------------------------------------------------------------
    /** contains the locale of the index.
     */
    [property] com::sun::star::lang::Locale  Locale;

    //------------------------------------------------------------------------
    /** contains the name of the sort algorithm that is used to sort the entries.
     */
    [property] string SortAlgorithm;
};

//=============================================================================

}; }; }; };

#endif
