diff options
Diffstat (limited to 'sw/source/core/edit/edtox.cxx')
-rw-r--r-- | sw/source/core/edit/edtox.cxx | 502 |
1 files changed, 502 insertions, 0 deletions
diff --git a/sw/source/core/edit/edtox.cxx b/sw/source/core/edit/edtox.cxx new file mode 100644 index 000000000000..230e45f71079 --- /dev/null +++ b/sw/source/core/edit/edtox.cxx @@ -0,0 +1,502 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" +#include <com/sun/star/util/SearchOptions.hpp> +#include <com/sun/star/util/SearchFlags.hpp> +#include <com/sun/star/i18n/TransliterationModules.hpp> + + +#include <tools/urlobj.hxx> +#include <svtools/txtcmp.hxx> +#ifndef SVTOOLS_FSTATHELPER_HXX +#include <svl/fstathelper.hxx> +#endif +#include <sfx2/docfile.hxx> +#include "editeng/unolingu.hxx" +#include <swtypes.hxx> +#include <editsh.hxx> +#include <doc.hxx> +#include <pam.hxx> +#include <viewopt.hxx> +#include <ndtxt.hxx> +#include <errhdl.hxx> +#include <swundo.hxx> +#include <undobj.hxx> +#include <txttxmrk.hxx> +#include <edimp.hxx> +#include <tox.hxx> +#include <doctxm.hxx> +#include <docary.hxx> +#include <mdiexp.hxx> +#ifndef _STATSTR_HRC +#include <statstr.hrc> +#endif +#include <bookmrk.hxx> +#include <xmloff/odffields.hxx> + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::i18n; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::util; + +/*-------------------------------------------------------------------- + Beschreibung: Verzeichnismarkierung ins Dokument einfuegen/loeschen + --------------------------------------------------------------------*/ + + +void SwEditShell::Insert(const SwTOXMark& rMark) +{ + BOOL bInsAtPos = rMark.IsAlternativeText(); + StartAllAction(); + FOREACHPAM_START(this) + + const SwPosition *pStt = PCURCRSR->Start(), + *pEnd = PCURCRSR->End(); + if( bInsAtPos ) + { + SwPaM aTmp( *pStt ); + GetDoc()->InsertPoolItem( aTmp, rMark, 0 ); + } + else if( *pEnd != *pStt ) + { + GetDoc()->InsertPoolItem( *PCURCRSR, rMark, + nsSetAttrMode::SETATTR_DONTEXPAND ); + } + + FOREACHPAM_END() + EndAllAction(); +} + + + +void SwEditShell::DeleteTOXMark( SwTOXMark* pMark ) +{ + SET_CURR_SHELL( this ); + StartAllAction(); + + pDoc->DeleteTOXMark( pMark ); + + EndAllAction(); +} + + +/*-------------------------------------------------------------------- + Beschreibung: Alle Verzeichnismarkierungen am SPoint zusammensuchen + --------------------------------------------------------------------*/ + +USHORT SwEditShell::GetCurTOXMarks(SwTOXMarks& rMarks) const +{ + return GetDoc()->GetCurTOXMark( *GetCrsr()->Start(), rMarks ); +} + +/* -----------------01.09.99 16:05------------------- + + --------------------------------------------------*/ +BOOL SwEditShell::IsTOXBaseReadonly(const SwTOXBase& rTOXBase) const +{ + ASSERT( rTOXBase.ISA( SwTOXBaseSection ), "no TOXBaseSection!" ); + const SwTOXBaseSection& rTOXSect = (const SwTOXBaseSection&)rTOXBase; + return rTOXSect.IsProtect(); +} +/* -----------------18.10.99 15:53------------------- + + --------------------------------------------------*/ +void SwEditShell::SetTOXBaseReadonly(const SwTOXBase& rTOXBase, BOOL bReadonly) +{ + ASSERT( rTOXBase.ISA( SwTOXBaseSection ), "no TOXBaseSection!" ); + const SwTOXBaseSection& rTOXSect = (const SwTOXBaseSection&)rTOXBase; + ((SwTOXBase&)rTOXBase).SetProtected(bReadonly); + ASSERT( rTOXSect.SwSection::GetType() == TOX_CONTENT_SECTION, "not a TOXContentSection" ); + + SwSectionData aSectionData(rTOXSect); + aSectionData.SetProtectFlag(bReadonly); + UpdateSection( GetSectionFmtPos( *rTOXSect.GetFmt() ), aSectionData, 0 ); +} + +/* -----------------02.09.99 07:47------------------- + + --------------------------------------------------*/ +const SwTOXBase* SwEditShell::GetDefaultTOXBase( TOXTypes eTyp, BOOL bCreate ) +{ + return GetDoc()->GetDefaultTOXBase( eTyp, bCreate ); +} +/* -----------------02.09.99 08:05------------------- + + --------------------------------------------------*/ +void SwEditShell::SetDefaultTOXBase(const SwTOXBase& rBase) +{ + GetDoc()->SetDefaultTOXBase(rBase); +} + +/*-------------------------------------------------------------------- + Beschreibung: Verzeichnis einfuegen, und Inhalt erzeugen + --------------------------------------------------------------------*/ + +void SwEditShell::InsertTableOf( const SwTOXBase& rTOX, const SfxItemSet* pSet ) +{ + SET_CURR_SHELL( this ); + StartAllAction(); + + SwDocShell* pDocSh = GetDoc()->GetDocShell(); + ::StartProgress( STR_STATSTR_TOX_INSERT, 0, 0, pDocSh ); + ::SetProgressText( STR_STATSTR_TOX_INSERT, pDocSh ); + + // Einfuegen des Verzeichnisses + const SwTOXBaseSection* pTOX = pDoc->InsertTableOf( + *GetCrsr()->GetPoint(), rTOX, pSet, TRUE ); + ASSERT(pTOX, "Kein aktuelles Verzeichnis"); + + // Formatierung anstossen + CalcLayout(); + + // Seitennummern eintragen + ((SwTOXBaseSection*)pTOX)->UpdatePageNum(); + + pTOX->SetPosAtStartEnd( *GetCrsr()->GetPoint() ); + + // Fix fuer leere Verzeichnisse + InvalidateWindows( aVisArea ); + ::EndProgress( pDocSh ); + EndAllAction(); +} + +/*-------------------------------------------------------------------- + Beschreibung: Verzeichnisinhalt erneuern + --------------------------------------------------------------------*/ + +BOOL SwEditShell::UpdateTableOf( const SwTOXBase& rTOX, const SfxItemSet* pSet ) +{ + BOOL bRet = FALSE; + + ASSERT( rTOX.ISA( SwTOXBaseSection ), "keine TOXBaseSection!" ); + SwTOXBaseSection* pTOX = (SwTOXBaseSection*)&rTOX; + ASSERT(pTOX, "Keine aktuelles Verzeichnis"); + const SwSectionNode* pSectNd; + if( pTOX && 0 != ( pSectNd = pTOX->GetFmt()->GetSectionNode() ) ) + { + SwDoc* pMyDoc = GetDoc(); + SwDocShell* pDocSh = pMyDoc->GetDocShell(); + + BOOL bInIndex = pTOX == GetCurTOX(); + SET_CURR_SHELL( this ); + StartAllAction(); + + ::StartProgress( STR_STATSTR_TOX_UPDATE, 0, 0, pDocSh ); + ::SetProgressText( STR_STATSTR_TOX_UPDATE, pDocSh ); + + pMyDoc->StartUndo(UNDO_TOXCHANGE, NULL); + + // Verzeichnisrumpf erzeugen + pTOX->Update(pSet); + + // Cursor korrigieren + if( bInIndex ) + pTOX->SetPosAtStartEnd( *GetCrsr()->GetPoint() ); + + // Formatierung anstossen + CalcLayout(); + + // Seitennummern eintragen + pTOX->UpdatePageNum(); + + pMyDoc->EndUndo(UNDO_TOXCHANGE, NULL); + + ::EndProgress( pDocSh ); + EndAllAction(); + } + return bRet; +} + +BOOL SwEditShell::UpdateField( sw::mark::IFieldmark &fieldBM) +{ +// SwDocShell* pDocSh = pDoc->GetDocShell(); + //@TODO implement me...; add undo etc... + if ( pDoc && fieldBM.IsExpanded( ) ) { + SwPosition aSttPos = fieldBM.GetMarkStart( ); + aSttPos.nContent++; + + SwPosition aEndPos = fieldBM.GetMarkEnd( ); + aEndPos.nContent--; + + SwPaM aPaM( aSttPos, aEndPos ); + pDoc->DeleteRange(aPaM); + pDoc->InsertString(aPaM, String::CreateFromAscii("Implement me ;-)") ); + } + return TRUE; +} + + +/*-------------------------------------------------------------------- + Beschreibung: Aktuelles Verzeichnis vor oder in dem der Cursor + steht + --------------------------------------------------------------------*/ + +const SwTOXBase* SwEditShell::GetCurTOX() const +{ + return GetDoc()->GetCurTOX( *GetCrsr()->GetPoint() ); +} + +BOOL SwEditShell::DeleteTOX( const SwTOXBase& rTOXBase, BOOL bDelNodes ) +{ + return GetDoc()->DeleteTOX( (SwTOXBase&)rTOXBase, bDelNodes ); +} + +/*-------------------------------------------------------------------- + Beschreibung: Typen der Verzeichnisse verwalten + --------------------------------------------------------------------*/ + +const SwTOXType* SwEditShell::GetTOXType(TOXTypes eTyp, USHORT nId) const +{ + return pDoc->GetTOXType(eTyp, nId); +} + +/*-------------------------------------------------------------------- + Beschreibung: Schluessel fuer Stichwortverzeichnisse verwalten + --------------------------------------------------------------------*/ + +USHORT SwEditShell::GetTOIKeys( SwTOIKeyType eTyp, SvStringsSort& rArr ) const +{ + return GetDoc()->GetTOIKeys( eTyp, rArr ); +} + + +USHORT SwEditShell::GetTOXCount() const +{ + const SwSectionFmts& rFmts = GetDoc()->GetSections(); + USHORT nRet = 0; + for( USHORT n = rFmts.Count(); n; ) + { + const SwSection* pSect = rFmts[ --n ]->GetSection(); + if( TOX_CONTENT_SECTION == pSect->GetType() && + pSect->GetFmt()->GetSectionNode() ) + ++nRet; + } + return nRet; +} + + +const SwTOXBase* SwEditShell::GetTOX( USHORT nPos ) const +{ + const SwSectionFmts& rFmts = GetDoc()->GetSections(); + for( USHORT n = 0, nCnt = 0; n < rFmts.Count(); ++n ) + { + const SwSection* pSect = rFmts[ n ]->GetSection(); + if( TOX_CONTENT_SECTION == pSect->GetType() && + pSect->GetFmt()->GetSectionNode() && + nCnt++ == nPos ) + { + ASSERT( pSect->ISA( SwTOXBaseSection ), "keine TOXBaseSection!" ); + return (SwTOXBaseSection*)pSect; + } + } + return 0; +} + + + // nach einlesen einer Datei alle Verzeichnisse updaten +void SwEditShell::SetUpdateTOX( BOOL bFlag ) +{ + GetDoc()->SetUpdateTOX( bFlag ); +} + + +BOOL SwEditShell::IsUpdateTOX() const +{ + return GetDoc()->IsUpdateTOX(); +} + +/* -----------------26.08.99 13:49------------------- + + --------------------------------------------------*/ +const String& SwEditShell::GetTOIAutoMarkURL() const +{ + return GetDoc()->GetTOIAutoMarkURL(); +} +/* -----------------26.08.99 13:49------------------- + + --------------------------------------------------*/ +void SwEditShell::SetTOIAutoMarkURL(const String& rSet) +{ + GetDoc()->SetTOIAutoMarkURL(rSet); +} +/* -----------------26.08.99 09:29------------------- + + --------------------------------------------------*/ +void SwEditShell::ApplyAutoMark() +{ + StartAllAction(); + BOOL bDoesUndo = DoesUndo(); + DoUndo(FALSE); + //1. remove all automatic generated index entries if AutoMarkURL has a + // length and the file exists + //2. load file + //3. select all occurrences of the searched words + //4. apply index entries + + String sAutoMarkURL(GetDoc()->GetTOIAutoMarkURL()); + if( sAutoMarkURL.Len() && FStatHelper::IsDocument( sAutoMarkURL )) + { + //1. + const SwTOXType* pTOXType = GetTOXType(TOX_INDEX, 0); + SwClientIter aIter(*(SwTOXType*)pTOXType); + SwTOXMark* pMark = (SwTOXMark*)aIter.First(TYPE(SwTOXMark)); + while( pMark ) + { + if(pMark->IsAutoGenerated() && pMark->GetTxtTOXMark()) + DeleteTOXMark(pMark); + pMark = (SwTOXMark*)aIter.Next(); + } + + //2. + SfxMedium aMedium( sAutoMarkURL, STREAM_STD_READ, TRUE ); + SvStream& rStrm = *aMedium.GetInStream(); + const String sZero('0'); + Push(); + rtl_TextEncoding eChrSet = ::gsl_getSystemTextEncoding(); + + // + // SearchOptions to be used in loop below + // + //SearchAlgorithms eSrchType = SearchAlgorithms_ABSOLUTE; + //OUString aSrchStr = rText; + BOOL bCaseSensitive = TRUE; + BOOL bWordOnly = FALSE; + BOOL bSrchInSel = FALSE; + BOOL bLEV_Relaxed = TRUE; + INT32 nLEV_Other = 2; // -> changedChars; + INT32 nLEV_Longer = 3; //! -> deletedChars; + INT32 nLEV_Shorter = 1; //! -> insertedChars; + INT32 nTransliterationFlags = 0; + // + INT32 nSrchFlags = 0; + if (!bCaseSensitive) + { + nSrchFlags |= SearchFlags::ALL_IGNORE_CASE; + nTransliterationFlags |= TransliterationModules_IGNORE_CASE; + } + if ( bWordOnly) + nSrchFlags |= SearchFlags::NORM_WORD_ONLY; + if ( bLEV_Relaxed) + nSrchFlags |= SearchFlags::LEV_RELAXED; + if ( bSrchInSel) + nSrchFlags |= (SearchFlags::REG_NOT_BEGINOFLINE | + SearchFlags::REG_NOT_ENDOFLINE ); + // + rtl::OUString sEmpty; + SearchOptions aSearchOpt( + SearchAlgorithms_ABSOLUTE, nSrchFlags, + sEmpty, sEmpty, + SvxCreateLocale( LANGUAGE_SYSTEM ), + nLEV_Other, nLEV_Longer, nLEV_Shorter, + nTransliterationFlags ); + + while( !rStrm.GetError() && !rStrm.IsEof() ) + { + ByteString aRdLine; + rStrm.ReadLine( aRdLine ); + + // # -> comment + // ; -> delimiter between entries -> + // Format: TextToSearchFor;AlternativeString;PrimaryKey;SecondaryKey;CaseSensitive;WordOnly + // Leading and trailing blanks are ignored + if( aRdLine.Len() && '#' != aRdLine.GetChar(0) ) + { + String sLine( aRdLine, eChrSet ); + + xub_StrLen nTokenPos = 0; + String sToSelect( sLine.GetToken(0, ';', nTokenPos ) ); + if( sToSelect.Len() ) + { + String sAlternative = sLine.GetToken(0, ';', nTokenPos); + String sPrimary = sLine.GetToken(0, ';', nTokenPos); + String sSecondary = sLine.GetToken(0, ';', nTokenPos); + String sCase = sLine.GetToken(0, ';', nTokenPos); + String sWordOnly = sLine.GetToken(0, ';', nTokenPos); + + //3. + bCaseSensitive = sCase.Len() && sCase != sZero; + bWordOnly = sWordOnly.Len() && sWordOnly != sZero; + // + if (!bCaseSensitive) + { + //nSrchFlags |= SearchFlags::ALL_IGNORE_CASE; + aSearchOpt.transliterateFlags |= + TransliterationModules_IGNORE_CASE; + } + else + { + //aSearchOpt.searchFlag &= ~SearchFlags::ALL_IGNORE_CASE; + aSearchOpt.transliterateFlags &= + ~TransliterationModules_IGNORE_CASE; + } + if ( bWordOnly) + aSearchOpt.searchFlag |= SearchFlags::NORM_WORD_ONLY; + else + aSearchOpt.searchFlag &= ~SearchFlags::NORM_WORD_ONLY; + // + aSearchOpt.searchString = sToSelect; + + KillPams(); + BOOL bCancel; + + // todo/mba: assuming that notes shouldn't be searched + BOOL bSearchInNotes = FALSE; + ULONG nRet = Find( aSearchOpt, bSearchInNotes, DOCPOS_START, DOCPOS_END, bCancel, + (FindRanges)(FND_IN_SELALL|FND_IN_BODYONLY), + FALSE ); + + if(nRet) + { + SwTOXMark* pTmpMark = new SwTOXMark(pTOXType); + if( sPrimary.Len() ) + { + pTmpMark->SetPrimaryKey( sPrimary ); + if( sSecondary.Len() ) + pTmpMark->SetSecondaryKey( sSecondary ); + } + if(sAlternative.Len()) + pTmpMark->SetAlternativeText(sAlternative); + pTmpMark->SetMainEntry(FALSE); + pTmpMark->SetAutoGenerated(TRUE); + //4. + SwEditShell::Insert(*pTmpMark); + } + } + } + } + KillPams(); + Pop(FALSE); + } + DoUndo(bDoesUndo); + EndAllAction(); +} + + + |