1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sw.hxx" 26 27 28 #include "swstylemanager.hxx" 29 #include <hash_map> 30 #include <svl/stylepool.hxx> 31 #include <doc.hxx> 32 #include <charfmt.hxx> 33 #include <docary.hxx> 34 #include <swtypes.hxx> 35 #include <istyleaccess.hxx> 36 37 typedef ::std::hash_map< const ::rtl::OUString, 38 StylePool::SfxItemSet_Pointer_t, 39 ::rtl::OUStringHash, 40 ::std::equal_to< ::rtl::OUString > > SwStyleNameCache; 41 42 class SwStyleCache 43 { 44 SwStyleNameCache mMap; 45 public: 46 SwStyleCache() {} 47 void addStyleName( StylePool::SfxItemSet_Pointer_t pStyle ) 48 { mMap[ StylePool::nameOf(pStyle) ] = pStyle; } 49 void addCompletePool( StylePool& rPool ); 50 StylePool::SfxItemSet_Pointer_t getByName( const rtl::OUString& rName ) { return mMap[rName]; } 51 }; 52 53 void SwStyleCache::addCompletePool( StylePool& rPool ) 54 { 55 IStylePoolIteratorAccess *pIter = rPool.createIterator(); 56 StylePool::SfxItemSet_Pointer_t pStyle = pIter->getNext(); 57 while( pStyle.get() ) 58 { 59 rtl::OUString aName( StylePool::nameOf(pStyle) ); 60 mMap[ aName ] = pStyle; 61 pStyle = pIter->getNext(); 62 } 63 delete pIter; 64 } 65 66 class SwStyleManager : public IStyleAccess 67 { 68 StylePool aAutoCharPool; 69 StylePool aAutoParaPool; 70 SwStyleCache *mpCharCache; 71 SwStyleCache *mpParaCache; 72 73 public: 74 // --> OD 2008-03-07 #refactorlists# 75 // accept empty item set for ignorable paragraph items. 76 SwStyleManager( SfxItemSet* pIgnorableParagraphItems ) 77 : aAutoCharPool(), 78 aAutoParaPool( pIgnorableParagraphItems ), 79 mpCharCache(0), 80 mpParaCache(0) 81 {} 82 // <-- 83 virtual ~SwStyleManager(); 84 virtual StylePool::SfxItemSet_Pointer_t getAutomaticStyle( const SfxItemSet& rSet, 85 IStyleAccess::SwAutoStyleFamily eFamily ); 86 virtual StylePool::SfxItemSet_Pointer_t getByName( const rtl::OUString& rName, 87 IStyleAccess::SwAutoStyleFamily eFamily ); 88 virtual void getAllStyles( std::vector<StylePool::SfxItemSet_Pointer_t> &rStyles, 89 IStyleAccess::SwAutoStyleFamily eFamily ); 90 virtual StylePool::SfxItemSet_Pointer_t cacheAutomaticStyle( const SfxItemSet& rSet, 91 SwAutoStyleFamily eFamily ); 92 virtual void clearCaches(); 93 }; 94 95 IStyleAccess *createStyleManager( SfxItemSet* pIgnorableParagraphItems ) 96 { 97 return new SwStyleManager( pIgnorableParagraphItems ); 98 } 99 100 SwStyleManager::~SwStyleManager() 101 { 102 delete mpCharCache; 103 delete mpParaCache; 104 } 105 106 void SwStyleManager::clearCaches() 107 { 108 delete mpCharCache; 109 mpCharCache = 0; 110 delete mpParaCache; 111 mpParaCache = 0; 112 } 113 114 StylePool::SfxItemSet_Pointer_t SwStyleManager::getAutomaticStyle( const SfxItemSet& rSet, 115 IStyleAccess::SwAutoStyleFamily eFamily ) 116 { 117 StylePool& rAutoPool = eFamily == IStyleAccess::AUTO_STYLE_CHAR ? aAutoCharPool : aAutoParaPool; 118 return rAutoPool.insertItemSet( rSet ); 119 } 120 121 StylePool::SfxItemSet_Pointer_t SwStyleManager::cacheAutomaticStyle( const SfxItemSet& rSet, 122 IStyleAccess::SwAutoStyleFamily eFamily ) 123 { 124 StylePool& rAutoPool = eFamily == IStyleAccess::AUTO_STYLE_CHAR ? aAutoCharPool : aAutoParaPool; 125 StylePool::SfxItemSet_Pointer_t pStyle = rAutoPool.insertItemSet( rSet ); 126 SwStyleCache* &rpCache = eFamily == IStyleAccess::AUTO_STYLE_CHAR ? 127 mpCharCache : mpParaCache; 128 if( !rpCache ) 129 rpCache = new SwStyleCache(); 130 rpCache->addStyleName( pStyle ); 131 return pStyle; 132 } 133 134 StylePool::SfxItemSet_Pointer_t SwStyleManager::getByName( const rtl::OUString& rName, 135 IStyleAccess::SwAutoStyleFamily eFamily ) 136 { 137 StylePool& rAutoPool = eFamily == IStyleAccess::AUTO_STYLE_CHAR ? aAutoCharPool : aAutoParaPool; 138 SwStyleCache* &rpCache = eFamily == IStyleAccess::AUTO_STYLE_CHAR ? mpCharCache : mpParaCache; 139 if( !rpCache ) 140 rpCache = new SwStyleCache(); 141 StylePool::SfxItemSet_Pointer_t pStyle = rpCache->getByName( rName ); 142 if( !pStyle.get() ) 143 { 144 // Ok, ok, it's allowed to ask for uncached styles (from UNO) but it should not be done 145 // during loading a document 146 ASSERT( false, "Don't ask for uncached styles" ); 147 rpCache->addCompletePool( rAutoPool ); 148 pStyle = rpCache->getByName( rName ); 149 } 150 return pStyle; 151 } 152 153 void SwStyleManager::getAllStyles( std::vector<StylePool::SfxItemSet_Pointer_t> &rStyles, 154 IStyleAccess::SwAutoStyleFamily eFamily ) 155 { 156 StylePool& rAutoPool = eFamily == IStyleAccess::AUTO_STYLE_CHAR ? aAutoCharPool : aAutoParaPool; 157 // --> OD 2008-03-07 #refactorlists# 158 // setup <StylePool> iterator, which skips unused styles and ignorable items 159 IStylePoolIteratorAccess *pIter = rAutoPool.createIterator( true, true ); 160 // <-- 161 StylePool::SfxItemSet_Pointer_t pStyle = pIter->getNext(); 162 while( pStyle.get() ) 163 { 164 rStyles.push_back( pStyle ); 165 166 pStyle = pIter->getNext(); 167 } 168 delete pIter; 169 } 170