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 #include <frmsidebarwincontainer.hxx> 28 29 #include <map> 30 #include <fmtfld.hxx> 31 #include <txtfld.hxx> 32 #include <SidebarWin.hxx> 33 34 namespace { 35 struct SidebarWinKey 36 { 37 const xub_StrLen mnIndex; 38 39 explicit SidebarWinKey( const xub_StrLen nIndex ) 40 : mnIndex( nIndex ) 41 {} 42 43 bool operator < ( const SidebarWinKey& rSidebarWinKey ) const 44 { 45 return mnIndex < rSidebarWinKey.mnIndex; 46 } 47 }; 48 49 struct SidebarWinOrder 50 { 51 sal_Bool operator()( const SidebarWinKey& rSidebarWinKeyA, 52 const SidebarWinKey& rSidebarWinKeyB ) const 53 { 54 return rSidebarWinKeyA < rSidebarWinKeyB; 55 } 56 }; 57 58 typedef ::std::map < SidebarWinKey, sw::sidebarwindows::SwSidebarWin*, SidebarWinOrder > SidebarWinContainer; 59 60 struct FrmKey 61 { 62 const SwFrm* mpFrm; 63 64 explicit FrmKey( const SwFrm* pFrm ) 65 : mpFrm( pFrm ) 66 {} 67 68 bool operator < ( const FrmKey& rFrmKey ) const 69 { 70 return mpFrm < rFrmKey.mpFrm; 71 } 72 }; 73 74 struct FrmOrder 75 { 76 sal_Bool operator()( const FrmKey& rFrmKeyA, 77 const FrmKey& rFrmKeyB ) const 78 { 79 return rFrmKeyA < rFrmKeyB; 80 } 81 }; 82 83 typedef ::std::map < FrmKey, SidebarWinContainer, FrmOrder > _FrmSidebarWinContainer; 84 } 85 86 namespace sw { namespace sidebarwindows { 87 88 class FrmSidebarWinContainer : public _FrmSidebarWinContainer 89 { 90 }; 91 92 SwFrmSidebarWinContainer::SwFrmSidebarWinContainer() 93 : mpFrmSidebarWinContainer( new FrmSidebarWinContainer() ) 94 {} 95 96 SwFrmSidebarWinContainer::~SwFrmSidebarWinContainer() 97 { 98 mpFrmSidebarWinContainer->clear(); 99 delete mpFrmSidebarWinContainer; 100 } 101 102 bool SwFrmSidebarWinContainer::insert( const SwFrm& rFrm, 103 const SwFmtFld& rFmtFld, 104 SwSidebarWin& rSidebarWin ) 105 { 106 bool bInserted( false ); 107 108 FrmKey aFrmKey( &rFrm ); 109 SidebarWinContainer& rSidebarWinContainer = (*mpFrmSidebarWinContainer)[ aFrmKey ]; 110 111 SidebarWinKey aSidebarWinKey( *(rFmtFld.GetTxtFld()->GetStart()) ); 112 if ( rSidebarWinContainer.empty() || 113 rSidebarWinContainer.find( aSidebarWinKey) == rSidebarWinContainer.end() ) 114 { 115 rSidebarWinContainer[ aSidebarWinKey ] = &rSidebarWin; 116 bInserted = true; 117 } 118 119 return bInserted; 120 } 121 122 bool SwFrmSidebarWinContainer::remove( const SwFrm& rFrm, 123 const SwSidebarWin& rSidebarWin ) 124 { 125 bool bRemoved( false ); 126 127 FrmKey aFrmKey( &rFrm ); 128 FrmSidebarWinContainer::iterator aFrmIter = mpFrmSidebarWinContainer->find( aFrmKey ); 129 if ( aFrmIter != mpFrmSidebarWinContainer->end() ) 130 { 131 SidebarWinContainer& rSidebarWinContainer = (*aFrmIter).second; 132 for ( SidebarWinContainer::iterator aIter = rSidebarWinContainer.begin(); 133 aIter != rSidebarWinContainer.end(); 134 ++aIter ) 135 { 136 if ( (*aIter).second == &rSidebarWin ) 137 { 138 rSidebarWinContainer.erase( aIter ); 139 bRemoved = true; 140 break; 141 } 142 } 143 } 144 145 return bRemoved; 146 } 147 148 bool SwFrmSidebarWinContainer::empty( const SwFrm& rFrm ) 149 { 150 bool bEmpty( true ); 151 152 FrmKey aFrmKey( &rFrm ); 153 FrmSidebarWinContainer::iterator aFrmIter = mpFrmSidebarWinContainer->find( aFrmKey ); 154 if ( aFrmIter != mpFrmSidebarWinContainer->end() ) 155 { 156 bEmpty = (*aFrmIter).second.empty(); 157 } 158 159 return bEmpty; 160 } 161 162 SwSidebarWin* SwFrmSidebarWinContainer::get( const SwFrm& rFrm, 163 const sal_Int32 nIndex ) 164 { 165 SwSidebarWin* pRet( 0 ); 166 167 FrmKey aFrmKey( &rFrm ); 168 FrmSidebarWinContainer::iterator aFrmIter = mpFrmSidebarWinContainer->find( aFrmKey ); 169 if ( aFrmIter != mpFrmSidebarWinContainer->end() ) 170 { 171 SidebarWinContainer& rSidebarWinContainer = (*aFrmIter).second; 172 sal_Int32 nCounter( nIndex ); 173 for ( SidebarWinContainer::iterator aIter = rSidebarWinContainer.begin(); 174 nCounter >= 0 && aIter != rSidebarWinContainer.end(); 175 ++aIter ) 176 { 177 if ( nCounter == 0 ) 178 { 179 pRet = (*aIter).second; 180 break; 181 } 182 183 --nCounter; 184 } 185 } 186 187 return pRet; 188 } 189 190 void SwFrmSidebarWinContainer::getAll( const SwFrm& rFrm, 191 std::vector< Window* >* pSidebarWins ) 192 { 193 pSidebarWins->clear(); 194 195 FrmKey aFrmKey( &rFrm ); 196 FrmSidebarWinContainer::iterator aFrmIter = mpFrmSidebarWinContainer->find( aFrmKey ); 197 if ( aFrmIter != mpFrmSidebarWinContainer->end() ) 198 { 199 SidebarWinContainer& rSidebarWinContainer = (*aFrmIter).second; 200 for ( SidebarWinContainer::iterator aIter = rSidebarWinContainer.begin(); 201 aIter != rSidebarWinContainer.end(); 202 ++aIter ) 203 { 204 pSidebarWins->push_back( (*aIter).second ); 205 } 206 } 207 } 208 209 } } // eof of namespace sw::sidebarwindows:: 210