summaryrefslogtreecommitdiff
path: root/sw/source/ui/index/toxmgr.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/index/toxmgr.cxx')
-rw-r--r--sw/source/ui/index/toxmgr.cxx519
1 files changed, 519 insertions, 0 deletions
diff --git a/sw/source/ui/index/toxmgr.cxx b/sw/source/ui/index/toxmgr.cxx
new file mode 100644
index 000000000000..f3afd0c21d15
--- /dev/null
+++ b/sw/source/ui/index/toxmgr.cxx
@@ -0,0 +1,519 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * 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 <wrtsh.hxx>
+#include <shellres.hxx>
+#include <swwait.hxx>
+#include <view.hxx>
+#include <toxmgr.hxx>
+#include <crsskip.hxx>
+#include <doc.hxx>
+#include <IDocumentUndoRedo.hxx>
+#include <swundo.hxx>
+#include <globals.hrc>
+
+/*--------------------------------------------------------------------
+ Beschreibung: Handhabung der Verzeichnisse durch TOXMgr
+ --------------------------------------------------------------------*/
+
+
+SwTOXMgr::SwTOXMgr(SwWrtShell* pShell):
+ pSh(pShell)
+{
+ GetTOXMarks();
+ SetCurTOXMark(0);
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Aktuelle TOXMarks behandeln
+ --------------------------------------------------------------------*/
+
+
+sal_uInt16 SwTOXMgr::GetTOXMarks()
+{
+ return pSh->GetCurTOXMarks(aCurMarks);
+}
+
+
+SwTOXMark* SwTOXMgr::GetTOXMark(sal_uInt16 nId)
+{
+ if(aCurMarks.Count() > 0)
+ return aCurMarks[nId];
+ return 0;
+}
+
+
+void SwTOXMgr::DeleteTOXMark()
+{
+ SwTOXMark* pNext = 0;
+ if( pCurTOXMark )
+ {
+ pNext = (SwTOXMark*)&pSh->GotoTOXMark( *pCurTOXMark, TOX_NXT );
+ if( pNext == pCurTOXMark )
+ pNext = 0;
+
+ pSh->DeleteTOXMark( pCurTOXMark );
+ pSh->SetModified();
+ }
+ // zur naechsten wandern
+ pCurTOXMark = pNext;
+}
+
+void SwTOXMgr::InsertTOXMark(const SwTOXMarkDescription& rDesc)
+{
+ SwTOXMark* pMark = 0;
+ switch(rDesc.GetTOXType())
+ {
+ case TOX_CONTENT:
+ {
+ OSL_ENSURE(rDesc.GetLevel() > 0 && rDesc.GetLevel() <= MAXLEVEL,
+ "invalid InsertTOCMark level");
+ pMark = new SwTOXMark(pSh->GetTOXType(TOX_CONTENT, 0));
+ pMark->SetLevel( static_cast< sal_uInt16 >(rDesc.GetLevel()) );
+
+ if(rDesc.GetAltStr())
+ pMark->SetAlternativeText(*rDesc.GetAltStr());
+ }
+ break;
+ case TOX_INDEX:
+ {
+ pMark = new SwTOXMark(pSh->GetTOXType(TOX_INDEX, 0));
+
+ if( rDesc.GetPrimKey() && rDesc.GetPrimKey()->Len() )
+ {
+ pMark->SetPrimaryKey( *rDesc.GetPrimKey() );
+ if(rDesc.GetPhoneticReadingOfPrimKey())
+ pMark->SetPrimaryKeyReading( *rDesc.GetPhoneticReadingOfPrimKey() );
+
+ if( rDesc.GetSecKey() && rDesc.GetSecKey()->Len() )
+ {
+ pMark->SetSecondaryKey( *rDesc.GetSecKey() );
+ if(rDesc.GetPhoneticReadingOfSecKey())
+ pMark->SetSecondaryKeyReading( *rDesc.GetPhoneticReadingOfSecKey() );
+ }
+ }
+ if(rDesc.GetAltStr())
+ pMark->SetAlternativeText(*rDesc.GetAltStr());
+ if(rDesc.GetPhoneticReadingOfAltStr())
+ pMark->SetTextReading( *rDesc.GetPhoneticReadingOfAltStr() );
+ pMark->SetMainEntry(rDesc.IsMainEntry());
+ }
+ break;
+ case TOX_USER:
+ {
+ OSL_ENSURE(rDesc.GetLevel() > 0 && rDesc.GetLevel() <= MAXLEVEL,
+ "invalid InsertTOCMark level");
+ sal_uInt16 nId = rDesc.GetTOUName() ?
+ GetUserTypeID(*rDesc.GetTOUName()) : 0;
+ pMark = new SwTOXMark(pSh->GetTOXType(TOX_USER, nId));
+ pMark->SetLevel( static_cast< sal_uInt16 >(rDesc.GetLevel()) );
+
+ if(rDesc.GetAltStr())
+ pMark->SetAlternativeText(*rDesc.GetAltStr());
+ }
+ break;
+ default:; //prevent warning
+ }
+ pSh->StartAllAction();
+ pSh->SwEditShell::Insert(*pMark);
+ pSh->EndAllAction();
+}
+/*--------------------------------------------------------------------
+ Beschreibung: Update eines TOXMarks
+ --------------------------------------------------------------------*/
+
+
+void SwTOXMgr::UpdateTOXMark(const SwTOXMarkDescription& rDesc)
+{
+ OSL_ENSURE(pCurTOXMark, "no current TOXMark");
+
+ pSh->StartAllAction();
+ if(pCurTOXMark->GetTOXType()->GetType() == TOX_INDEX)
+ {
+ if(rDesc.GetPrimKey() && rDesc.GetPrimKey()->Len() )
+ {
+ pCurTOXMark->SetPrimaryKey( *rDesc.GetPrimKey() );
+ if(rDesc.GetPhoneticReadingOfPrimKey())
+ pCurTOXMark->SetPrimaryKeyReading( *rDesc.GetPhoneticReadingOfPrimKey() );
+ else
+ pCurTOXMark->SetPrimaryKeyReading( aEmptyStr );
+
+ if( rDesc.GetSecKey() && rDesc.GetSecKey()->Len() )
+ {
+ pCurTOXMark->SetSecondaryKey( *rDesc.GetSecKey() );
+ if(rDesc.GetPhoneticReadingOfSecKey())
+ pCurTOXMark->SetSecondaryKeyReading( *rDesc.GetPhoneticReadingOfSecKey() );
+ else
+ pCurTOXMark->SetSecondaryKeyReading( aEmptyStr );
+ }
+ else
+ {
+ pCurTOXMark->SetSecondaryKey( aEmptyStr );
+ pCurTOXMark->SetSecondaryKeyReading( aEmptyStr );
+ }
+ }
+ else
+ {
+ pCurTOXMark->SetPrimaryKey( aEmptyStr );
+ pCurTOXMark->SetPrimaryKeyReading( aEmptyStr );
+ pCurTOXMark->SetSecondaryKey( aEmptyStr );
+ pCurTOXMark->SetSecondaryKeyReading( aEmptyStr );
+ }
+ if(rDesc.GetPhoneticReadingOfAltStr())
+ pCurTOXMark->SetTextReading( *rDesc.GetPhoneticReadingOfAltStr() );
+ else
+ pCurTOXMark->SetTextReading( aEmptyStr );
+ pCurTOXMark->SetMainEntry(rDesc.IsMainEntry());
+ }
+ else
+ pCurTOXMark->SetLevel( static_cast< sal_uInt16 >(rDesc.GetLevel()) );
+
+ if(rDesc.GetAltStr())
+ {
+ // JP 26.08.96: Bug 30344 - entweder der Text aus dem Doc oder
+ // ein Alternativ-Text, beides gibts nicht!
+ sal_Bool bReplace = pCurTOXMark->IsAlternativeText();
+ if( bReplace )
+ pCurTOXMark->SetAlternativeText( *rDesc.GetAltStr() );
+ else
+ {
+ SwTOXMark aCpy( *pCurTOXMark );
+ aCurMarks.Remove(0, aCurMarks.Count());
+ pSh->DeleteTOXMark(pCurTOXMark);
+ aCpy.SetAlternativeText( *rDesc.GetAltStr() );
+ pSh->SwEditShell::Insert( aCpy );
+ pCurTOXMark = 0;
+ }
+ }
+ pSh->SetModified();
+ pSh->EndAllAction();
+ // Bug 36207 pCurTOXMark zeigt hier in den Wald!
+ if(!pCurTOXMark)
+ {
+ pSh->Left(CRSR_SKIP_CHARS, sal_False, 1, sal_False );
+ pSh->GetCurTOXMarks(aCurMarks);
+ SetCurTOXMark(0);
+ }
+}
+
+
+/*--------------------------------------------------------------------
+ Beschreibung: UserTypeID ermitteln
+ --------------------------------------------------------------------*/
+
+
+sal_uInt16 SwTOXMgr::GetUserTypeID(const String& rStr)
+{
+ sal_uInt16 nSize = pSh->GetTOXTypeCount(TOX_USER);
+ for(sal_uInt16 i=0; i < nSize; ++i)
+ {
+ const SwTOXType* pTmp = pSh->GetTOXType(TOX_USER, i);
+ if(pTmp && pTmp->GetTypeName() == rStr)
+ return i;
+ }
+ SwTOXType aUserType(TOX_USER, rStr);
+ pSh->InsertTOXType(aUserType);
+ return nSize;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Traveling zwischen den TOXMarks
+ --------------------------------------------------------------------*/
+
+
+void SwTOXMgr::NextTOXMark(sal_Bool bSame)
+{
+ OSL_ENSURE(pCurTOXMark, "no current TOXMark");
+ if( pCurTOXMark )
+ {
+ SwTOXSearch eDir = bSame ? TOX_SAME_NXT : TOX_NXT;
+ pCurTOXMark = (SwTOXMark*)&pSh->GotoTOXMark( *pCurTOXMark, eDir );
+ }
+}
+
+
+void SwTOXMgr::PrevTOXMark(sal_Bool bSame)
+{
+ OSL_ENSURE(pCurTOXMark, "no current TOXMark");
+ if( pCurTOXMark )
+ {
+ SwTOXSearch eDir = bSame ? TOX_SAME_PRV : TOX_PRV;
+ pCurTOXMark = (SwTOXMark*)&pSh->GotoTOXMark(*pCurTOXMark, eDir );
+ }
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Stichwortverzeichnis einfuegen
+ --------------------------------------------------------------------*/
+const SwTOXBase* SwTOXMgr::GetCurTOX()
+{
+ return pSh->GetCurTOX();
+}
+
+const SwTOXType* SwTOXMgr::GetTOXType(TOXTypes eTyp, sal_uInt16 nId) const
+{
+ return pSh->GetTOXType(eTyp, nId);
+}
+
+void SwTOXMgr::SetCurTOXMark(sal_uInt16 nId)
+{
+ pCurTOXMark = (nId < aCurMarks.Count()) ? aCurMarks[nId] : 0;
+}
+
+sal_Bool SwTOXMgr::UpdateOrInsertTOX(const SwTOXDescription& rDesc,
+ SwTOXBase** ppBase,
+ const SfxItemSet* pSet)
+{
+ SwWait aWait( *pSh->GetView().GetDocShell(), sal_True );
+ sal_Bool bRet = sal_True;
+ const SwTOXBase* pCurTOX = ppBase && *ppBase ? *ppBase : GetCurTOX();
+ SwTOXBase* pTOX = (SwTOXBase*)pCurTOX;
+
+ SwTOXBase * pNewTOX = NULL;
+
+ if (pTOX)
+ pNewTOX = new SwTOXBase(*pTOX);
+
+ TOXTypes eCurTOXType = rDesc.GetTOXType();
+ if(pCurTOX && !ppBase && pSh->HasSelection())
+ pSh->EnterStdMode();
+
+ switch(eCurTOXType)
+ {
+ case TOX_INDEX :
+ {
+ if(!pCurTOX || (ppBase && !(*ppBase)))
+ {
+ const SwTOXType* pType = pSh->GetTOXType(eCurTOXType, 0);
+ SwForm aForm(eCurTOXType);
+ pNewTOX = new SwTOXBase(pType, aForm, nsSwTOXElement::TOX_MARK, pType->GetTypeName());
+ }
+ pNewTOX->SetOptions(rDesc.GetIndexOptions());
+ pNewTOX->SetMainEntryCharStyle(rDesc.GetMainEntryCharStyle());
+ pSh->SetTOIAutoMarkURL(rDesc.GetAutoMarkURL());
+ pSh->ApplyAutoMark();
+ }
+ break;
+ case TOX_CONTENT :
+ {
+ if(!pCurTOX || (ppBase && !(*ppBase)))
+ {
+ const SwTOXType* pType = pSh->GetTOXType(eCurTOXType, 0);
+ SwForm aForm(eCurTOXType);
+ pNewTOX = new SwTOXBase(pType, aForm, rDesc.GetContentOptions(), pType->GetTypeName());
+ }
+ pNewTOX->SetCreate(rDesc.GetContentOptions());
+ pNewTOX->SetLevel(rDesc.GetLevel());
+ }
+ break;
+ case TOX_USER :
+ {
+ if(!pCurTOX || (ppBase && !(*ppBase)))
+ {
+ sal_uInt16 nPos = 0;
+ sal_uInt16 nSize = pSh->GetTOXTypeCount(eCurTOXType);
+ for(sal_uInt16 i=0; rDesc.GetTOUName() && i < nSize; ++i)
+ { const SwTOXType* pType = pSh->GetTOXType(TOX_USER, i);
+ if(pType->GetTypeName() == *rDesc.GetTOUName())
+ { nPos = i;
+ break;
+ }
+ }
+ const SwTOXType* pType = pSh->GetTOXType(eCurTOXType, nPos);
+
+ SwForm aForm(eCurTOXType);
+ pNewTOX = new SwTOXBase(pType, aForm, rDesc.GetContentOptions(), pType->GetTypeName());
+
+ }
+ else
+ {
+ const_cast<SwTOXBase*>( pCurTOX )->SetCreate(rDesc.GetContentOptions());
+ }
+ pNewTOX->SetLevelFromChapter(rDesc.IsLevelFromChapter());
+ }
+ break;
+ case TOX_OBJECTS:
+ case TOX_TABLES:
+ case TOX_AUTHORITIES:
+ case TOX_ILLUSTRATIONS:
+ {
+ //Special handling for TOX_AUTHORITY
+ if(TOX_AUTHORITIES == eCurTOXType)
+ {
+ SwAuthorityFieldType* pFType = (SwAuthorityFieldType*)
+ pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
+ if(!pFType)
+ pFType = (SwAuthorityFieldType*)pSh->InsertFldType(
+ SwAuthorityFieldType(pSh->GetDoc()));
+ pFType->SetPreSuffix(rDesc.GetAuthBrackets().GetChar(0),
+ rDesc.GetAuthBrackets().GetChar(1));
+ pFType->SetSequence(rDesc.IsAuthSequence());
+ SwTOXSortKey rArr[3];
+ rArr[0] = rDesc.GetSortKey1();
+ rArr[1] = rDesc.GetSortKey2();
+ rArr[2] = rDesc.GetSortKey3();
+ pFType->SetSortKeys(3, rArr);
+ pFType->SetSortByDocument(rDesc.IsSortByDocument());
+ pFType->SetLanguage(rDesc.GetLanguage());
+ pFType->SetSortAlgorithm(rDesc.GetSortAlgorithm());
+
+ pFType->UpdateFlds();
+ }
+ // TODO: consider properties of the current TOXType
+ if(!pCurTOX || (ppBase && !(*ppBase)))
+ {
+ const SwTOXType* pType = pSh->GetTOXType(eCurTOXType, 0);
+ SwForm aForm(eCurTOXType);
+ pNewTOX = new SwTOXBase(
+ pType, aForm,
+ TOX_AUTHORITIES == eCurTOXType ? nsSwTOXElement::TOX_MARK : 0, pType->GetTypeName());
+ }
+ else
+ {
+ if((!ppBase || !(*ppBase)) && pSh->HasSelection())
+ pSh->DelRight();
+ pNewTOX = (SwTOXBase*)pCurTOX;
+ }
+ pNewTOX->SetFromObjectNames(rDesc.IsCreateFromObjectNames());
+ pNewTOX->SetOLEOptions(rDesc.GetOLEOptions());
+ }
+ break;
+ }
+
+
+ OSL_ENSURE(pNewTOX, "no TOXBase created!" );
+ if(!pNewTOX)
+ return sal_False;
+
+ pNewTOX->SetFromChapter(rDesc.IsFromChapter());
+ pNewTOX->SetSequenceName(rDesc.GetSequenceName());
+ pNewTOX->SetCaptionDisplay(rDesc.GetCaptionDisplay());
+ pNewTOX->SetProtected(rDesc.IsReadonly());
+
+ for(sal_uInt16 nLevel = 0; nLevel < MAXLEVEL; nLevel++)
+ pNewTOX->SetStyleNames(rDesc.GetStyleNames(nLevel), nLevel);
+
+ if(rDesc.GetTitle())
+ pNewTOX->SetTitle(*rDesc.GetTitle());
+ if(rDesc.GetForm())
+ pNewTOX->SetTOXForm(*rDesc.GetForm());
+ pNewTOX->SetLanguage(rDesc.GetLanguage());
+ pNewTOX->SetSortAlgorithm(rDesc.GetSortAlgorithm());
+
+ if(!pCurTOX || (ppBase && !(*ppBase)) )
+ {
+ // wird ppBase uebergeben, dann wird das TOXBase hier nur erzeugt
+ // und dann ueber den Dialog in ein Globaldokument eingefuegt
+ if(ppBase)
+ (*ppBase) = pNewTOX;
+ else
+ {
+ pSh->InsertTableOf(*pNewTOX, pSet);
+ delete pNewTOX;
+ }
+ }
+ else
+ {
+ SwDoc * pDoc = pSh->GetDoc();
+
+ if (pDoc->GetIDocumentUndoRedo().DoesUndo())
+ {
+ if (pNewTOX != NULL)
+ {
+ pDoc->GetIDocumentUndoRedo().DelAllUndoObj();
+ }
+
+ pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_TOXCHANGE, NULL);
+ }
+
+ if (pNewTOX != NULL) // => pTOX != NULL
+ pDoc->ChgTOX(*pTOX, *pNewTOX);
+
+ bRet = pSh->UpdateTableOf(*pTOX, pSet);
+
+ if (pDoc->GetIDocumentUndoRedo().DoesUndo())
+ {
+ pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_TOXCHANGE, NULL);
+
+ if (pNewTOX == NULL)
+ {
+ pDoc->GetIDocumentUndoRedo().DelAllUndoObj();
+ }
+ }
+ }
+
+ return bRet;
+}
+
+void SwTOXDescription::SetSortKeys(SwTOXSortKey eKey1,
+ SwTOXSortKey eKey2,
+ SwTOXSortKey eKey3)
+{
+ SwTOXSortKey aArr[3];
+ sal_uInt16 nPos = 0;
+ if(AUTH_FIELD_END > eKey1.eField)
+ aArr[nPos++] = eKey1;
+ if(AUTH_FIELD_END > eKey2.eField)
+ aArr[nPos++] = eKey2;
+ if(AUTH_FIELD_END > eKey3.eField)
+ aArr[nPos++] = eKey3;
+
+ eSortKey1 = aArr[0];
+ eSortKey2 = aArr[1];
+ eSortKey3 = aArr[2];
+}
+
+void SwTOXDescription::ApplyTo(SwTOXBase& rTOXBase)
+{
+ for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
+ rTOXBase.SetStyleNames(GetStyleNames(i), i);
+ rTOXBase.SetTitle(GetTitle() ? *GetTitle() : aEmptyStr);
+ rTOXBase.SetCreate(GetContentOptions());
+
+ if(GetTOXType() == TOX_INDEX)
+ rTOXBase.SetOptions(GetIndexOptions());
+ if(GetTOXType() != TOX_INDEX)
+ rTOXBase.SetLevel(GetLevel());
+ rTOXBase.SetFromObjectNames(IsCreateFromObjectNames());
+ rTOXBase.SetSequenceName(GetSequenceName());
+ rTOXBase.SetCaptionDisplay(GetCaptionDisplay());
+ rTOXBase.SetFromChapter(IsFromChapter());
+ rTOXBase.SetProtected(IsReadonly());
+ rTOXBase.SetOLEOptions(GetOLEOptions());
+ rTOXBase.SetLevelFromChapter(IsLevelFromChapter());
+ rTOXBase.SetLanguage(eLanguage);
+ rTOXBase.SetSortAlgorithm(sSortAlgorithm);
+
+}
+
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */