/************************************************************** * * 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. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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) { sal_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 --------------------------------------------------------------------*/ sal_uInt16 SwEditShell::GetCurTOXMarks(SwTOXMarks& rMarks) const { return GetDoc()->GetCurTOXMark( *GetCrsr()->Start(), rMarks ); } /* -----------------01.09.99 16:05------------------- --------------------------------------------------*/ sal_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, sal_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, sal_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, sal_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 --------------------------------------------------------------------*/ sal_Bool SwEditShell::UpdateTableOf( const SwTOXBase& rTOX, const SfxItemSet* pSet ) { sal_Bool bRet = sal_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(); sal_Bool bInIndex = pTOX == GetCurTOX(); SET_CURR_SHELL( this ); StartAllAction(); ::StartProgress( STR_STATSTR_TOX_UPDATE, 0, 0, pDocSh ); ::SetProgressText( STR_STATSTR_TOX_UPDATE, pDocSh ); pMyDoc->GetIDocumentUndoRedo().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->GetIDocumentUndoRedo().EndUndo(UNDO_TOXCHANGE, NULL); ::EndProgress( pDocSh ); EndAllAction(); } return bRet; } /*-------------------------------------------------------------------- Beschreibung: Aktuelles Verzeichnis vor oder in dem der Cursor steht --------------------------------------------------------------------*/ const SwTOXBase* SwEditShell::GetCurTOX() const { return GetDoc()->GetCurTOX( *GetCrsr()->GetPoint() ); } sal_Bool SwEditShell::DeleteTOX( const SwTOXBase& rTOXBase, sal_Bool bDelNodes ) { return GetDoc()->DeleteTOX( (SwTOXBase&)rTOXBase, bDelNodes ); } /*-------------------------------------------------------------------- Beschreibung: Typen der Verzeichnisse verwalten --------------------------------------------------------------------*/ const SwTOXType* SwEditShell::GetTOXType(TOXTypes eTyp, sal_uInt16 nId) const { return pDoc->GetTOXType(eTyp, nId); } /*-------------------------------------------------------------------- Beschreibung: Schluessel fuer Stichwortverzeichnisse verwalten --------------------------------------------------------------------*/ sal_uInt16 SwEditShell::GetTOIKeys( SwTOIKeyType eTyp, SvStringsSort& rArr ) const { return GetDoc()->GetTOIKeys( eTyp, rArr ); } sal_uInt16 SwEditShell::GetTOXCount() const { const SwSectionFmts& rFmts = GetDoc()->GetSections(); sal_uInt16 nRet = 0; for( sal_uInt16 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( sal_uInt16 nPos ) const { const SwSectionFmts& rFmts = GetDoc()->GetSections(); for( sal_uInt16 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( sal_Bool bFlag ) { GetDoc()->SetUpdateTOX( bFlag ); } sal_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(); sal_Bool bDoesUndo = DoesUndo(); DoUndo(sal_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); SwTOXMarks aMarks; SwTOXMark::InsertTOXMarks( aMarks, *pTOXType ); for( sal_uInt16 nMark=0; nMarkIsAutoGenerated() && pMark->GetTxtTOXMark()) // mba: test iteration; objects are deleted in iteration DeleteTOXMark(pMark); } //2. SfxMedium aMedium( sAutoMarkURL, STREAM_STD_READ, sal_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; sal_Bool bCaseSensitive = sal_True; sal_Bool bWordOnly = sal_False; sal_Bool bSrchInSel = sal_False; sal_Bool bLEV_Relaxed = sal_True; sal_Int32 nLEV_Other = 2; // -> changedChars; sal_Int32 nLEV_Longer = 3; //! -> deletedChars; sal_Int32 nLEV_Shorter = 1; //! -> insertedChars; sal_Int32 nTransliterationFlags = 0; // sal_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(); sal_Bool bCancel; // todo/mba: assuming that notes shouldn't be searched sal_Bool bSearchInNotes = sal_False; sal_uLong nRet = Find( aSearchOpt, bSearchInNotes, DOCPOS_START, DOCPOS_END, bCancel, (FindRanges)(FND_IN_SELALL|FND_IN_BODYONLY), sal_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(sal_False); pTmpMark->SetAutoGenerated(sal_True); //4. SwEditShell::Insert(*pTmpMark); } } } } KillPams(); Pop(sal_False); } DoUndo(bDoesUndo); EndAllAction(); }