office-gobmx/sw/inc/tox.hxx
2001-03-30 10:34:00 +00:00

701 lines
23 KiB
C++

/*************************************************************************
*
* $RCSfile: tox.hxx,v $
*
* $Revision: 1.3 $
*
* last change: $Author: os $ $Date: 2001-03-30 11:34:00 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifndef _TOX_HXX
#define _TOX_HXX
#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _TOXE_HXX
#include <toxe.hxx>
#endif
#ifndef _CALBCK_HXX
#include <calbck.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
class SwTOXType;
class SwTOXMark;
class SwTxtTOXMark;
class SwDoc;
SV_DECL_PTRARR(SwTOXMarks, SwTOXMark*, 0, 10)
/*--------------------------------------------------------------------
Beschreibung: Eintrag fuer Inhaltsverzeichnis oder Benutzerverz.
--------------------------------------------------------------------*/
#define IVER_TOXMARK_STRPOOL ((USHORT)1)
#define IVER_TOXMARK_NEWTOX ((USHORT)2)
class SwTOXMark : public SfxPoolItem, public SwClient
{
friend void _InitCore();
friend class SwTxtTOXMark;
String aAltText; // Der Text des Eintrages ist unterschiedlich
String aPrimaryKey, aSecondaryKey;
SwTxtTOXMark* pTxtAttr;
USHORT nLevel;
BOOL bAutoGenerated : 1; // generated using a concordance file
BOOL bMainEntry : 1; // main entry emphasized by character style
SwTOXMark(); // for crete the dflt. atr. in _InitCore
public:
TYPEINFO(); // fuers rtti
SwTOXMark( const SwTOXType* pTyp );
SwTOXMark( const SwTOXMark& rCopy );
virtual ~SwTOXMark();
// "pure virtual Methoden" vom SfxPoolItem
virtual int operator==( const SfxPoolItem& ) const;
virtual SfxPoolItem* Clone( SfxItemPool* pPool = 0 ) const;
virtual SfxPoolItem* Create(SvStream &, USHORT nVer) const;
virtual SvStream& Store(SvStream &, USHORT nIVer) const;
virtual USHORT GetVersion( USHORT nFFVer ) const;
SwTOXMark& operator=( const SwTOXMark& rCopy );
String GetText() const;
inline BOOL IsAlternativeText() const;
inline const String& GetAlternativeText() const;
inline void SetAlternativeText( const String& rAlt );
// Inhalts-/Benutzerverzeichnis - spezifisch
inline void SetLevel(USHORT nLevel);
inline USHORT GetLevel() const;
// Index - spezifisch
inline void SetPrimaryKey(const String& rStr );
inline void SetSecondaryKey(const String& rStr);
inline const String& GetPrimaryKey() const;
inline const String& GetSecondaryKey() const;
BOOL IsAutoGenerated() const {return bAutoGenerated;}
void SetAutoGenerated(BOOL bSet) {bAutoGenerated = bSet;}
BOOL IsMainEntry() const {return bMainEntry;}
void SetMainEntry(BOOL bSet) { bMainEntry = bSet;}
inline const SwTOXType* GetTOXType() const;
const SwTxtTOXMark* GetTxtTOXMark() const { return pTxtAttr; }
SwTxtTOXMark* GetTxtTOXMark() { return pTxtAttr; }
};
/*--------------------------------------------------------------------
Beschreibung: Typen einzelner Verzeichnisse
--------------------------------------------------------------------*/
class SwTOXType : public SwModify
{
public:
SwTOXType(TOXTypes eTyp, const String& aName);
SwTOXType(const SwTOXType& rCopy);
inline const String& GetTypeName() const;
void SetTypeName(const String& rName);
inline TOXTypes GetType() const;
private:
String aName;
TOXTypes eType;
};
/*--------------------------------------------------------------------
Beschreibung: Muster fuer Zeilen eines Verzeichnisses
--------------------------------------------------------------------*/
#define FORM_TITLE 0
#define FORM_ALPHA_DELIMITTER 1
#define FORM_PRIMARY_KEY 2
#define FORM_SECONDARY_KEY 3
#define FORM_ENTRY 4
/*
Pattern structure
<E#> - entry number <E# CharStyleName,PoolId>
<ET> - entry text <ET CharStyleName,PoolId>
<E> - entry text and number <E CharStyleName,PoolId>
<T> - tab stop <T,,Position,Adjust>
<C> - chapter info n = {0, 1, 2, 3, 4 } values of SwChapterFormat <C CharStyleName,PoolId>
<TX> - text token <X CharStyleName,PoolId, TOX_STYLE_DELIMITERTextContentTOX_STYLE_DELIMITER>
<#> - Page number <# CharStyleName,PoolId>
<LS> - Link start <LS>
<LE> - Link end <LE>
<A00> - Authority entry field <A02 CharStyleName, PoolId>
*/
// These enum values are stored and must not change!
enum FormTokenType
{
TOKEN_ENTRY_NO,
TOKEN_ENTRY_TEXT,
TOKEN_ENTRY,
TOKEN_TAB_STOP,
TOKEN_TEXT,
TOKEN_PAGE_NUMS,
TOKEN_CHAPTER_INFO,
TOKEN_LINK_START,
TOKEN_LINK_END,
TOKEN_AUTHORITY,
TOKEN_END
};
struct SwFormToken
{
String sText;
String sCharStyleName;
SwTwips nTabStopPosition;
FormTokenType eTokenType;
USHORT nPoolId;
USHORT eTabAlign;
USHORT nChapterFormat; //SwChapterFormat;
USHORT nAuthorityField; //enum ToxAuthorityField
sal_Unicode cTabFillChar;
SwFormToken(FormTokenType eType ) :
eTokenType(eType),
nTabStopPosition(0),
nPoolId(USHRT_MAX),
eTabAlign(0 /*SVX_TAB_ADJUST_LEFT*/),
cTabFillChar(' '),
nChapterFormat(0 /*CF_NUMBER*/),
nAuthorityField(0)/*AUTH_FIELD_IDENTIFIER*/{}
String GetString() const;
};
class SwFormTokenEnumerator
{
String sPattern;
xub_StrLen nCurPatternPos;
xub_StrLen nCurPatternLen;
FormTokenType _SearchNextToken( xub_StrLen nStt, xub_StrLen& rEnd,
xub_StrLen* pTokenLen = 0 ) const;
SwFormToken BuildToken( FormTokenType, xub_StrLen ) const;
public:
SwFormTokenEnumerator( const String& rPattern );
BOOL HasNextToken() const
{ return nCurPatternPos + nCurPatternLen < sPattern.Len(); }
SwFormToken GetNextToken();
SwFormToken GetCurToken() const;
FormTokenType GetCurTokenType();
FormTokenType GetNextTokenType();
FormTokenType GetPrevTokenType();
void RemoveCurToken();
void InsertToken( const SwFormToken& rToken );
const String& GetPattern() const { return sPattern; }
};
class SwForm
{
String aPattern[ AUTH_TYPE_END + 1 ];
String aTemplate[ AUTH_TYPE_END + 1 ];
USHORT nType, nFormMaxLevel;
//USHORT nFirstTabPos; -> Value in tab token
// BOOL bHasFirstTabPos : 1;
BOOL bGenerateTabPos : 1;
BOOL bIsRelTabPos : 1;
BOOL bCommaSeparated : 1;
public:
SwForm( USHORT nType = TOX_CONTENT );
SwForm( const SwForm& rForm );
SwForm& operator=( const SwForm& rForm );
inline void SetTemplate(USHORT nLevel, const String& rName);
inline const String& GetTemplate(USHORT nLevel) const;
inline void SetPattern(USHORT nLevel, const String& rName);
inline const String& GetPattern(USHORT nLevel) const;
//convert pattern string from old to new format or vice versa
static String ConvertPatternTo51(const String& rSource);
static String ConvertPatternFrom51(const String& rSource, TOXTypes eType);
// fill tab stop positions from template to pattern
void AdjustTabStops(SwDoc& rDoc);
SwFormTokenEnumerator CreateTokenEnumerator(USHORT nLevel) const
{return SwFormTokenEnumerator(GetPattern(nLevel));}
inline USHORT GetTOXType() const;
inline USHORT GetFormMax() const;
USHORT GetFirstTabPos() const ; //{ return nFirstTabPos; }
void SetFirstTabPos( USHORT n ); //{ nFirstTabPos = n; }
BOOL IsFirstTabPosFlag() const ; //{ return bHasFirstTabPos; }
void SetFirstTabPosFlag( BOOL b ); //{ bHasFirstTabPos = b; }
BOOL IsGenerateTabPos() const { return bGenerateTabPos; }
void SetGenerateTabPos( BOOL b ) { bGenerateTabPos = b; }
BOOL IsRelTabPos() const { return bIsRelTabPos; }
void SetRelTabPos( BOOL b ) { bIsRelTabPos = b; }
BOOL IsCommaSeparated() const { return bCommaSeparated;}
void SetCommaSeparated( BOOL b) { bCommaSeparated = b;}
static USHORT GetFormMaxLevel( USHORT nType );
static const sal_Char* aFormEntry; // <E>
static BYTE nFormEntryLen; // 3 Zeichen
static const sal_Char* aFormTab; // <T>
static BYTE nFormTabLen; // 3 Zeichen
static const sal_Char* aFormPageNums; // <P>
static BYTE nFormPageNumsLen; // 3 Zeichen
static const sal_Char* aFormLinkStt; // <LS>
static BYTE nFormLinkSttLen; // 4 Zeichen
static const sal_Char* aFormLinkEnd; // <LE>
static BYTE nFormLinkEndLen; // 4 Zeichen
static const sal_Char* aFormEntryNum; // <E#>
static BYTE nFormEntryNumLen; // 4 Zeichen
static const sal_Char* aFormEntryTxt; // <ET>
static BYTE nFormEntryTxtLen; // 4 Zeichen
static const sal_Char* aFormChapterMark; // <C>
static BYTE nFormChapterMarkLen; // 3 Zeichen
static const sal_Char* aFormText; // <TX>
static BYTE nFormTextLen; // 4 Zeichen
static const sal_Char* aFormAuth; // <Axx> xx - decimal enum value
static BYTE nFormAuthLen; // 3 chars
};
/*--------------------------------------------------------------------
Beschreibung: Inhalte aus denen Verzeichnisse generiert werden
--------------------------------------------------------------------*/
enum SwTOXElement
{
TOX_MARK = 1,
TOX_OUTLINELEVEL = 2,
TOX_TEMPLATE = 4,
TOX_OLE = 8,
TOX_TABLE = 16,
TOX_GRAPHIC = 32,
TOX_FRAME = 64,
TOX_SEQUENCE = 128
};
enum SwTOIOptions
{
TOI_SAME_ENTRY = 1,
TOI_FF = 2,
TOI_CASE_SENSITIVE = 4,
TOI_KEY_AS_ENTRY = 8,
TOI_ALPHA_DELIMITTER = 16,
TOI_DASH = 32,
TOI_INITIAL_CAPS = 64
};
//which part of the caption is to be displayed
enum SwCaptionDisplay
{
CAPTION_COMPLETE,
CAPTION_NUMBER,
CAPTION_TEXT
};
enum SwTOOElements
{
TOO_MATH = 0x01,
TOO_CHART = 0x02,
TOO_CALC = 0x08,
TOO_DRAW_IMPRESS= 0x10,
// TOO_IMPRESS = 0x20,
TOO_OTHER = 0x80
};
#define TOX_STYLE_DELIMITER ((sal_Unicode)0x01) //JP 19.07.00: use a control char
/*--------------------------------------------------------------------
Beschreibung: Klasse aller Verzeichnisse
--------------------------------------------------------------------*/
class SwTOXBase : public SwClient
{
// not implemented
SwTOXBase& operator=(const SwTOXBase& rSource);
//protected:
SwForm aForm; // Aussehen der Eintragzeile
String aName; // unique name
String aTitle; // Der Verzeichnistitel
String sMainEntryCharStyle; // name of the character style applied to main index entries
String aStyleNames[MAXLEVEL]; // (additional) style names TOX_CONTENT, TOX_USER
String sSequenceName; // FieldTypeName of a caption sequence
union {
USHORT nLevel; // Gliederungsebenen beachten
USHORT nOptions; // Optionen fuer Index
} aData;
USHORT nCreateType; // Quellen aus dem das Verzeichnis generiert wird
USHORT nOLEOptions; // OLE sources
SwCaptionDisplay eCaptionDisplay; //
BOOL bProtected : 1; // index protected ?
BOOL bFromChapter : 1; // create from chapter or document
BOOL bFromObjectNames : 1; // create a table or object index
// from the names rather than the caption
BOOL bLevelFromChapter : 1; // User index: get the level from the source chapter
public:
SwTOXBase( const SwTOXType* pTyp, const SwForm& rForm,
USHORT nCreaType, const String& rTitle );
SwTOXBase( const SwTOXBase& rCopy, SwDoc* pDoc = 0 );
virtual ~SwTOXBase();
virtual BOOL GetInfo( SfxPoolItem& rInfo ) const;
// a kind of CopyCtor - check if the TOXBase is at TOXType of the doc.
// If not, so create it an copy all other used things. The return is this
SwTOXBase& CopyTOXBase( SwDoc*, const SwTOXBase& );
const SwTOXType* GetTOXType() const; //
USHORT GetCreateType() const; // Aus Inhaltsformen generieren
const String& GetTOXName() const {return aName;}
void SetTOXName(const String& rSet) {aName = rSet;}
const String& GetTitle() const; // Titel des Verzeichnisses
const String& GetTypeName() const; // Name des Verzeichnisses
const SwForm& GetTOXForm() const; // Aussehen der Zeile
void SetCreate(USHORT);
void SetTitle(const String& rTitle);
void SetTOXForm(const SwForm& rForm);
TOXTypes GetType() const;
const String& GetMainEntryCharStyle() const {return sMainEntryCharStyle;}
void SetMainEntryCharStyle(const String& rSet) {sMainEntryCharStyle = rSet;}
// Inhaltsverzeichnis - spezifisch
inline void SetLevel(USHORT); // Gliederungsebene beachten
inline USHORT GetLevel() const;
// Index - spezifisch
inline USHORT GetOptions() const; // Optionen fuer Index
inline void SetOptions(USHORT nOpt);
// index of objects
USHORT GetOLEOptions() const {return nOLEOptions;}
void SetOLEOptions(USHORT nOpt) {nOLEOptions = nOpt;}
// index of objects
// Benutzerverzeichnis - spezifisch
inline void SetTemplateName(const String& rName); // Absatzlayout beachten
inline String GetTemplateName() const;
const String& GetStyleNames(USHORT nLevel) const
{
DBG_ASSERT( nLevel < MAXLEVEL, "Which level?");
return aStyleNames[nLevel];
}
void SetStyleNames(const String& rSet, USHORT nLevel)
{
DBG_ASSERT( nLevel < MAXLEVEL, "Which level?");
aStyleNames[nLevel] = rSet;
}
BOOL HasAnyStyleNames() const;
BOOL IsFromChapter() const { return bFromChapter;}
void SetFromChapter(BOOL bSet) { bFromChapter = bSet;}
BOOL IsFromObjectNames() const {return bFromObjectNames;}
void SetFromObjectNames(BOOL bSet) {bFromObjectNames = bSet;}
BOOL IsLevelFromChapter() const {return bLevelFromChapter;}
void SetLevelFromChapter(BOOL bSet) {bLevelFromChapter = bSet;}
BOOL IsProtected() const { return bProtected; }
void SetProtected(BOOL bSet) { bProtected = bSet; }
const String& GetSequenceName() const {return sSequenceName;}
void SetSequenceName(const String& rSet) {sSequenceName = rSet;}
SwCaptionDisplay GetCaptionDisplay() const { return eCaptionDisplay;}
void SetCaptionDisplay(SwCaptionDisplay eSet) {eCaptionDisplay = eSet;}
BOOL IsTOXBaseInReadonly() const;
const SfxItemSet* GetAttrSet() const;
void SetAttrSet( const SfxItemSet& );
static const String& GetTOXName(TOXTypes eType); // toxmgr.cxx
};
/*--------------------------------------------------------------------
Beschreibung: Inlines
--------------------------------------------------------------------*/
//
//SwTOXMark
//
inline const String& SwTOXMark::GetAlternativeText() const
{ return aAltText; }
inline const SwTOXType* SwTOXMark::GetTOXType() const
{ return (SwTOXType*)GetRegisteredIn(); }
inline BOOL SwTOXMark::IsAlternativeText() const
{ return aAltText.Len() > 0; }
inline void SwTOXMark::SetAlternativeText(const String& rAlt)
{
aAltText = rAlt;
}
inline void SwTOXMark::SetLevel( USHORT nLvl )
{
ASSERT( !GetTOXType() || GetTOXType()->GetType() != TOX_INDEX, "Falscher Feldtyp");
nLevel = nLvl;
}
inline void SwTOXMark::SetPrimaryKey( const String& rKey )
{
ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
aPrimaryKey = rKey;
}
inline void SwTOXMark::SetSecondaryKey( const String& rKey )
{
ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
aSecondaryKey = rKey;
}
inline USHORT SwTOXMark::GetLevel() const
{
ASSERT( !GetTOXType() || GetTOXType()->GetType() != TOX_INDEX, "Falscher Feldtyp");
return nLevel;
}
inline const String& SwTOXMark::GetPrimaryKey() const
{
ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
return aPrimaryKey;
}
inline const String& SwTOXMark::GetSecondaryKey() const
{
ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
return aSecondaryKey;
}
//
//SwForm
//
inline void SwForm::SetTemplate(USHORT nLevel, const String& rName)
{
ASSERT(nLevel < GetFormMax(), "Index >= FORM_MAX");
aTemplate[nLevel] = rName;
}
inline void SwForm::SetPattern(USHORT nLevel, const String& rName)
{
ASSERT(nLevel < GetFormMax(), "Index >= FORM_MAX");
aPattern[nLevel] = rName;
}
inline const String& SwForm::GetPattern(USHORT nLevel) const
{
ASSERT(nLevel < GetFormMax(), "Index >= FORM_MAX");
return aPattern[nLevel];
}
inline const String& SwForm::GetTemplate(USHORT nLevel) const
{
ASSERT(nLevel < GetFormMax(), "Index >= FORM_MAX");
return aTemplate[nLevel];
}
inline USHORT SwForm::GetTOXType() const
{
return nType;
}
inline USHORT SwForm::GetFormMax() const
{
return nFormMaxLevel;
}
//
//SwTOXType
//
inline const String& SwTOXType::GetTypeName() const
{ return aName; }
inline void SwTOXType::SetTypeName(const String& rName)
{ aName = rName; }
inline TOXTypes SwTOXType::GetType() const
{ return eType; }
//
// SwTOXBase
//
inline const SwTOXType* SwTOXBase::GetTOXType() const
{ return (SwTOXType*)GetRegisteredIn(); }
inline USHORT SwTOXBase::GetCreateType() const
{ return nCreateType; }
inline const String& SwTOXBase::GetTitle() const
{ return aTitle; }
inline const String& SwTOXBase::GetTypeName() const
{ return GetTOXType()->GetTypeName(); }
inline const SwForm& SwTOXBase::GetTOXForm() const
{ return aForm; }
inline void SwTOXBase::SetCreate(USHORT nCreate)
{ nCreateType = nCreate; }
inline void SwTOXBase::SetTitle(const String& rTitle)
{ aTitle = rTitle; }
inline void SwTOXBase::SetTOXForm(const SwForm& rForm)
{ aForm = rForm; }
inline TOXTypes SwTOXBase::GetType() const
{ return GetTOXType()->GetType(); }
inline void SwTOXBase::SetLevel(USHORT nLev)
{
ASSERT(GetTOXType()->GetType() != TOX_INDEX, "Falscher Feldtyp");
aData.nLevel = nLev;
}
inline USHORT SwTOXBase::GetLevel() const
{
ASSERT(GetTOXType()->GetType() != TOX_INDEX, "Falscher Feldtyp");
return aData.nLevel;
}
inline void SwTOXBase::SetTemplateName(const String& rName)
{
// ASSERT(GetTOXType()->GetType() == TOX_USER, "Falscher Feldtyp");
// ASSERT(aData.pTemplateName, "pTemplateName == 0");
// (*aData.pTemplateName) = rName;
DBG_WARNING("SwTOXBase::SetTemplateName obsolete")
aStyleNames[0] = rName;
}
inline String SwTOXBase::GetTemplateName() const
{
// ASSERT(GetTOXType()->GetType() == TOX_USER, "Falscher Feldtyp");
// return *aData.pTemplateName;
DBG_WARNING("SwTOXBase::GetTemplateName obsolete")
return aStyleNames[0].GetToken(0, TOX_STYLE_DELIMITER);
}
inline USHORT SwTOXBase::GetOptions() const
{
ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
return aData.nOptions;
}
inline void SwTOXBase::SetOptions(USHORT nOpt)
{
ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
aData.nOptions = nOpt;
}
#endif // _TOX_HXX