summaryrefslogtreecommitdiff
path: root/sw/source/core/doc/swstylemanager.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/doc/swstylemanager.cxx')
-rw-r--r--sw/source/core/doc/swstylemanager.cxx173
1 files changed, 173 insertions, 0 deletions
diff --git a/sw/source/core/doc/swstylemanager.cxx b/sw/source/core/doc/swstylemanager.cxx
new file mode 100644
index 000000000000..ea8ba9366c75
--- /dev/null
+++ b/sw/source/core/doc/swstylemanager.cxx
@@ -0,0 +1,173 @@
+/*************************************************************************
+ *
+ * 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 "swstylemanager.hxx"
+#include <hash_map>
+#include <svl/stylepool.hxx>
+#include <doc.hxx>
+#include <charfmt.hxx>
+#include <docary.hxx>
+#include <swtypes.hxx>
+#include <istyleaccess.hxx>
+
+typedef ::std::hash_map< const ::rtl::OUString,
+ StylePool::SfxItemSet_Pointer_t,
+ ::rtl::OUStringHash,
+ ::std::equal_to< ::rtl::OUString > > SwStyleNameCache;
+
+class SwStyleCache
+{
+ SwStyleNameCache mMap;
+public:
+ SwStyleCache() {}
+ void addStyleName( StylePool::SfxItemSet_Pointer_t pStyle )
+ { mMap[ StylePool::nameOf(pStyle) ] = pStyle; }
+ void addCompletePool( StylePool& rPool );
+ StylePool::SfxItemSet_Pointer_t getByName( const rtl::OUString& rName ) { return mMap[rName]; }
+};
+
+void SwStyleCache::addCompletePool( StylePool& rPool )
+{
+ IStylePoolIteratorAccess *pIter = rPool.createIterator();
+ StylePool::SfxItemSet_Pointer_t pStyle = pIter->getNext();
+ while( pStyle.get() )
+ {
+ rtl::OUString aName( StylePool::nameOf(pStyle) );
+ mMap[ aName ] = pStyle;
+ pStyle = pIter->getNext();
+ }
+ delete pIter;
+}
+
+class SwStyleManager : public IStyleAccess
+{
+ StylePool aAutoCharPool;
+ StylePool aAutoParaPool;
+ SwStyleCache *mpCharCache;
+ SwStyleCache *mpParaCache;
+
+public:
+ // --> OD 2008-03-07 #refactorlists#
+ // accept empty item set for ignorable paragraph items.
+ SwStyleManager( SfxItemSet* pIgnorableParagraphItems )
+ : aAutoCharPool(),
+ aAutoParaPool( pIgnorableParagraphItems ),
+ mpCharCache(0),
+ mpParaCache(0)
+ {}
+ // <--
+ virtual ~SwStyleManager();
+ virtual StylePool::SfxItemSet_Pointer_t getAutomaticStyle( const SfxItemSet& rSet,
+ IStyleAccess::SwAutoStyleFamily eFamily );
+ virtual StylePool::SfxItemSet_Pointer_t getByName( const rtl::OUString& rName,
+ IStyleAccess::SwAutoStyleFamily eFamily );
+ virtual void getAllStyles( std::vector<StylePool::SfxItemSet_Pointer_t> &rStyles,
+ IStyleAccess::SwAutoStyleFamily eFamily );
+ virtual StylePool::SfxItemSet_Pointer_t cacheAutomaticStyle( const SfxItemSet& rSet,
+ SwAutoStyleFamily eFamily );
+ virtual void clearCaches();
+};
+
+IStyleAccess *createStyleManager( SfxItemSet* pIgnorableParagraphItems )
+{
+ return new SwStyleManager( pIgnorableParagraphItems );
+}
+
+SwStyleManager::~SwStyleManager()
+{
+ delete mpCharCache;
+ delete mpParaCache;
+}
+
+void SwStyleManager::clearCaches()
+{
+ delete mpCharCache;
+ mpCharCache = 0;
+ delete mpParaCache;
+ mpParaCache = 0;
+}
+
+StylePool::SfxItemSet_Pointer_t SwStyleManager::getAutomaticStyle( const SfxItemSet& rSet,
+ IStyleAccess::SwAutoStyleFamily eFamily )
+{
+ StylePool& rAutoPool = eFamily == IStyleAccess::AUTO_STYLE_CHAR ? aAutoCharPool : aAutoParaPool;
+ return rAutoPool.insertItemSet( rSet );
+}
+
+StylePool::SfxItemSet_Pointer_t SwStyleManager::cacheAutomaticStyle( const SfxItemSet& rSet,
+ IStyleAccess::SwAutoStyleFamily eFamily )
+{
+ StylePool& rAutoPool = eFamily == IStyleAccess::AUTO_STYLE_CHAR ? aAutoCharPool : aAutoParaPool;
+ StylePool::SfxItemSet_Pointer_t pStyle = rAutoPool.insertItemSet( rSet );
+ SwStyleCache* &rpCache = eFamily == IStyleAccess::AUTO_STYLE_CHAR ?
+ mpCharCache : mpParaCache;
+ if( !rpCache )
+ rpCache = new SwStyleCache();
+ rpCache->addStyleName( pStyle );
+ return pStyle;
+}
+
+StylePool::SfxItemSet_Pointer_t SwStyleManager::getByName( const rtl::OUString& rName,
+ IStyleAccess::SwAutoStyleFamily eFamily )
+{
+ StylePool& rAutoPool = eFamily == IStyleAccess::AUTO_STYLE_CHAR ? aAutoCharPool : aAutoParaPool;
+ SwStyleCache* &rpCache = eFamily == IStyleAccess::AUTO_STYLE_CHAR ? mpCharCache : mpParaCache;
+ if( !rpCache )
+ rpCache = new SwStyleCache();
+ StylePool::SfxItemSet_Pointer_t pStyle = rpCache->getByName( rName );
+ if( !pStyle.get() )
+ {
+ // Ok, ok, it's allowed to ask for uncached styles (from UNO) but it should not be done
+ // during loading a document
+ ASSERT( false, "Don't ask for uncached styles" );
+ rpCache->addCompletePool( rAutoPool );
+ pStyle = rpCache->getByName( rName );
+ }
+ return pStyle;
+}
+
+void SwStyleManager::getAllStyles( std::vector<StylePool::SfxItemSet_Pointer_t> &rStyles,
+ IStyleAccess::SwAutoStyleFamily eFamily )
+{
+ StylePool& rAutoPool = eFamily == IStyleAccess::AUTO_STYLE_CHAR ? aAutoCharPool : aAutoParaPool;
+ // --> OD 2008-03-07 #refactorlists#
+ // setup <StylePool> iterator, which skips unused styles and ignorable items
+ IStylePoolIteratorAccess *pIter = rAutoPool.createIterator( true, true );
+ // <--
+ StylePool::SfxItemSet_Pointer_t pStyle = pIter->getNext();
+ while( pStyle.get() )
+ {
+ rStyles.push_back( pStyle );
+
+ pStyle = pIter->getNext();
+ }
+ delete pIter;
+}