1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #include "precompiled_vcl.hxx" 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir #include "svdata.hxx" 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #include "vcl/arrange.hxx" 33*cdf0e10cSrcweir #include "vcl/edit.hxx" 34*cdf0e10cSrcweir #include "vcl/svapp.hxx" 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include "com/sun/star/beans/PropertyValue.hpp" 37*cdf0e10cSrcweir #include "com/sun/star/awt/Rectangle.hpp" 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir #include "osl/diagnose.h" 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir using namespace vcl; 42*cdf0e10cSrcweir using namespace com::sun::star; 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir // ---------------------------------------- 45*cdf0e10cSrcweir // vcl::WindowArranger 46*cdf0e10cSrcweir //----------------------------------------- 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir long WindowArranger::getDefaultBorder() 49*cdf0e10cSrcweir { 50*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 51*cdf0e10cSrcweir long nResult = pSVData->maAppData.mnDefaultLayoutBorder; 52*cdf0e10cSrcweir if( nResult < 0 ) 53*cdf0e10cSrcweir { 54*cdf0e10cSrcweir OutputDevice* pDefDev = Application::GetDefaultDevice(); 55*cdf0e10cSrcweir if( pDefDev ) 56*cdf0e10cSrcweir { 57*cdf0e10cSrcweir Size aBorder( pDefDev->LogicToPixel( Size( 3, 3 ), MapMode( MAP_APPFONT ) ) ); 58*cdf0e10cSrcweir nResult = pSVData->maAppData.mnDefaultLayoutBorder = aBorder.Height(); 59*cdf0e10cSrcweir } 60*cdf0e10cSrcweir } 61*cdf0e10cSrcweir return nResult > 0 ? nResult : 0; 62*cdf0e10cSrcweir } 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir WindowArranger::~WindowArranger() 65*cdf0e10cSrcweir {} 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir void WindowArranger::setParent( WindowArranger* i_pParent ) 68*cdf0e10cSrcweir { 69*cdf0e10cSrcweir OSL_VERIFY( i_pParent->m_pParentWindow == m_pParentWindow || m_pParentWindow == NULL ); 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir m_pParentArranger = i_pParent; 72*cdf0e10cSrcweir m_pParentWindow = i_pParent->m_pParentWindow; 73*cdf0e10cSrcweir setParentWindow( m_pParentWindow ); 74*cdf0e10cSrcweir } 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir void WindowArranger::setParentWindow( Window* i_pNewParent ) 77*cdf0e10cSrcweir { 78*cdf0e10cSrcweir m_pParentWindow = i_pNewParent; 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir size_t nEle = countElements(); 81*cdf0e10cSrcweir for( size_t i = 0; i < nEle; i++ ) 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir Element* pEle = getElement( i ); 84*cdf0e10cSrcweir if( pEle ) // sanity check 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 87*cdf0e10cSrcweir if( pEle->m_pElement ) 88*cdf0e10cSrcweir { 89*cdf0e10cSrcweir OSL_VERIFY( pEle->m_pElement->GetParent() == i_pNewParent ); 90*cdf0e10cSrcweir } 91*cdf0e10cSrcweir #endif 92*cdf0e10cSrcweir if( pEle->m_pChild ) 93*cdf0e10cSrcweir pEle->m_pChild->setParentWindow( i_pNewParent ); 94*cdf0e10cSrcweir } 95*cdf0e10cSrcweir } 96*cdf0e10cSrcweir } 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir void WindowArranger::show( bool i_bShow, bool i_bImmediateUpdate ) 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir size_t nEle = countElements(); 101*cdf0e10cSrcweir for( size_t i = 0; i < nEle; i++ ) 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir Element* pEle = getElement( i ); 104*cdf0e10cSrcweir if( pEle ) // sanity check 105*cdf0e10cSrcweir { 106*cdf0e10cSrcweir pEle->m_bHidden = ! i_bShow; 107*cdf0e10cSrcweir if( pEle->m_pElement ) 108*cdf0e10cSrcweir pEle->m_pElement->Show( i_bShow ); 109*cdf0e10cSrcweir if( pEle->m_pChild.get() ) 110*cdf0e10cSrcweir pEle->m_pChild->show( i_bShow, false ); 111*cdf0e10cSrcweir } 112*cdf0e10cSrcweir } 113*cdf0e10cSrcweir if( m_pParentArranger ) 114*cdf0e10cSrcweir { 115*cdf0e10cSrcweir nEle = m_pParentArranger->countElements(); 116*cdf0e10cSrcweir for( size_t i = 0; i < nEle; i++ ) 117*cdf0e10cSrcweir { 118*cdf0e10cSrcweir Element* pEle = m_pParentArranger->getElement( i ); 119*cdf0e10cSrcweir if( pEle && pEle->m_pChild.get() == this ) 120*cdf0e10cSrcweir { 121*cdf0e10cSrcweir pEle->m_bHidden = ! i_bShow; 122*cdf0e10cSrcweir break; 123*cdf0e10cSrcweir } 124*cdf0e10cSrcweir } 125*cdf0e10cSrcweir } 126*cdf0e10cSrcweir if( i_bImmediateUpdate ) 127*cdf0e10cSrcweir { 128*cdf0e10cSrcweir // find the topmost parent 129*cdf0e10cSrcweir WindowArranger* pResize = this; 130*cdf0e10cSrcweir while( pResize->m_pParentArranger ) 131*cdf0e10cSrcweir pResize = pResize->m_pParentArranger; 132*cdf0e10cSrcweir pResize->resize(); 133*cdf0e10cSrcweir } 134*cdf0e10cSrcweir } 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir bool WindowArranger::isVisible() const 137*cdf0e10cSrcweir { 138*cdf0e10cSrcweir size_t nEle = countElements(); 139*cdf0e10cSrcweir for( size_t i = 0; i < nEle; i++ ) 140*cdf0e10cSrcweir { 141*cdf0e10cSrcweir const Element* pEle = getConstElement( i ); 142*cdf0e10cSrcweir if( pEle->isVisible() ) 143*cdf0e10cSrcweir return true; 144*cdf0e10cSrcweir } 145*cdf0e10cSrcweir return false; 146*cdf0e10cSrcweir } 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir bool WindowArranger::Element::isVisible() const 149*cdf0e10cSrcweir { 150*cdf0e10cSrcweir bool bVisible = false; 151*cdf0e10cSrcweir if( ! m_bHidden ) 152*cdf0e10cSrcweir { 153*cdf0e10cSrcweir if( m_pElement ) 154*cdf0e10cSrcweir bVisible = m_pElement->IsVisible(); 155*cdf0e10cSrcweir else if( m_pChild ) 156*cdf0e10cSrcweir bVisible = m_pChild->isVisible(); 157*cdf0e10cSrcweir } 158*cdf0e10cSrcweir return bVisible; 159*cdf0e10cSrcweir } 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir sal_Int32 WindowArranger::Element::getExpandPriority() const 162*cdf0e10cSrcweir { 163*cdf0e10cSrcweir sal_Int32 nPrio = m_nExpandPriority; 164*cdf0e10cSrcweir if( m_pChild && m_nExpandPriority >= 0 ) 165*cdf0e10cSrcweir { 166*cdf0e10cSrcweir size_t nElements = m_pChild->countElements(); 167*cdf0e10cSrcweir for( size_t i = 0; i < nElements; i++ ) 168*cdf0e10cSrcweir { 169*cdf0e10cSrcweir sal_Int32 nCPrio = m_pChild->getExpandPriority( i ); 170*cdf0e10cSrcweir if( nCPrio > nPrio ) 171*cdf0e10cSrcweir nPrio = nCPrio; 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir } 174*cdf0e10cSrcweir return nPrio; 175*cdf0e10cSrcweir } 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir Size WindowArranger::Element::getOptimalSize( WindowSizeType i_eType ) const 178*cdf0e10cSrcweir { 179*cdf0e10cSrcweir Size aResult; 180*cdf0e10cSrcweir if( ! m_bHidden ) 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir bool bVisible = false; 183*cdf0e10cSrcweir if( m_pElement && m_pElement->IsVisible() ) 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir aResult = m_pElement->GetOptimalSize( i_eType ); 186*cdf0e10cSrcweir bVisible = true; 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir else if( m_pChild && m_pChild->isVisible() ) 189*cdf0e10cSrcweir { 190*cdf0e10cSrcweir aResult = m_pChild->getOptimalSize( i_eType ); 191*cdf0e10cSrcweir bVisible = true; 192*cdf0e10cSrcweir } 193*cdf0e10cSrcweir if( bVisible ) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir if( aResult.Width() < m_aMinSize.Width() ) 196*cdf0e10cSrcweir aResult.Width() = m_aMinSize.Width(); 197*cdf0e10cSrcweir if( aResult.Height() < m_aMinSize.Height() ) 198*cdf0e10cSrcweir aResult.Height() = m_aMinSize.Height(); 199*cdf0e10cSrcweir aResult.Width() += getBorderValue( m_nLeftBorder ) + getBorderValue( m_nRightBorder ); 200*cdf0e10cSrcweir aResult.Height() += getBorderValue( m_nTopBorder ) + getBorderValue( m_nBottomBorder ); 201*cdf0e10cSrcweir } 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir return aResult; 205*cdf0e10cSrcweir } 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir void WindowArranger::Element::setPosSize( const Point& i_rPos, const Size& i_rSize ) 208*cdf0e10cSrcweir { 209*cdf0e10cSrcweir Point aPoint( i_rPos ); 210*cdf0e10cSrcweir Size aSize( i_rSize ); 211*cdf0e10cSrcweir aPoint.X() += getBorderValue( m_nLeftBorder ); 212*cdf0e10cSrcweir aPoint.Y() += getBorderValue( m_nTopBorder ); 213*cdf0e10cSrcweir aSize.Width() -= getBorderValue( m_nLeftBorder ) + getBorderValue( m_nRightBorder ); 214*cdf0e10cSrcweir aSize.Height() -= getBorderValue( m_nTopBorder ) + getBorderValue( m_nBottomBorder ); 215*cdf0e10cSrcweir if( m_pElement ) 216*cdf0e10cSrcweir m_pElement->SetPosSizePixel( aPoint, aSize ); 217*cdf0e10cSrcweir else if( m_pChild ) 218*cdf0e10cSrcweir m_pChild->setManagedArea( Rectangle( aPoint, aSize ) ); 219*cdf0e10cSrcweir } 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > WindowArranger::getProperties() const 222*cdf0e10cSrcweir { 223*cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aRet( 3 ); 224*cdf0e10cSrcweir aRet[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OuterBorder" ) ); 225*cdf0e10cSrcweir aRet[0].Value = uno::makeAny( sal_Int32( getBorderValue( m_nOuterBorder ) ) ); 226*cdf0e10cSrcweir aRet[1].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ManagedArea" ) ); 227*cdf0e10cSrcweir awt::Rectangle aArea( m_aManagedArea.getX(), m_aManagedArea.getY(), m_aManagedArea.getWidth(), m_aManagedArea.getHeight() ); 228*cdf0e10cSrcweir aRet[1].Value = uno::makeAny( aArea ); 229*cdf0e10cSrcweir aRet[2].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Visible" ) ); 230*cdf0e10cSrcweir aRet[2].Value = uno::makeAny( sal_Bool( isVisible() ) ); 231*cdf0e10cSrcweir return aRet; 232*cdf0e10cSrcweir } 233*cdf0e10cSrcweir 234*cdf0e10cSrcweir void WindowArranger::setProperties( const uno::Sequence< beans::PropertyValue >& i_rProps ) 235*cdf0e10cSrcweir { 236*cdf0e10cSrcweir const beans::PropertyValue* pProps = i_rProps.getConstArray(); 237*cdf0e10cSrcweir bool bResize = false; 238*cdf0e10cSrcweir for( sal_Int32 i = 0; i < i_rProps.getLength(); i++ ) 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir if( pProps[i].Name.equalsAscii( "OuterBorder" ) ) 241*cdf0e10cSrcweir { 242*cdf0e10cSrcweir sal_Int32 nVal = 0; 243*cdf0e10cSrcweir if( pProps[i].Value >>= nVal ) 244*cdf0e10cSrcweir { 245*cdf0e10cSrcweir if( getBorderValue( m_nOuterBorder ) != nVal ) 246*cdf0e10cSrcweir { 247*cdf0e10cSrcweir m_nOuterBorder = nVal; 248*cdf0e10cSrcweir bResize = true; 249*cdf0e10cSrcweir } 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir else if( pProps[i].Name.equalsAscii( "ManagedArea" ) ) 253*cdf0e10cSrcweir { 254*cdf0e10cSrcweir awt::Rectangle aArea( 0, 0, 0, 0 ); 255*cdf0e10cSrcweir if( pProps[i].Value >>= aArea ) 256*cdf0e10cSrcweir { 257*cdf0e10cSrcweir m_aManagedArea.setX( aArea.X ); 258*cdf0e10cSrcweir m_aManagedArea.setY( aArea.Y ); 259*cdf0e10cSrcweir m_aManagedArea.setWidth( aArea.Width ); 260*cdf0e10cSrcweir m_aManagedArea.setHeight( aArea.Height ); 261*cdf0e10cSrcweir bResize = true; 262*cdf0e10cSrcweir } 263*cdf0e10cSrcweir } 264*cdf0e10cSrcweir else if( pProps[i].Name.equalsAscii( "Visible" ) ) 265*cdf0e10cSrcweir { 266*cdf0e10cSrcweir sal_Bool bVal = sal_False; 267*cdf0e10cSrcweir if( pProps[i].Value >>= bVal ) 268*cdf0e10cSrcweir { 269*cdf0e10cSrcweir show( bVal, false ); 270*cdf0e10cSrcweir bResize = true; 271*cdf0e10cSrcweir } 272*cdf0e10cSrcweir } 273*cdf0e10cSrcweir } 274*cdf0e10cSrcweir if( bResize ) 275*cdf0e10cSrcweir resize(); 276*cdf0e10cSrcweir } 277*cdf0e10cSrcweir 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir // ---------------------------------------- 280*cdf0e10cSrcweir // vcl::RowOrColumn 281*cdf0e10cSrcweir //----------------------------------------- 282*cdf0e10cSrcweir 283*cdf0e10cSrcweir RowOrColumn::~RowOrColumn() 284*cdf0e10cSrcweir { 285*cdf0e10cSrcweir for( std::vector< WindowArranger::Element >::iterator it = m_aElements.begin(); 286*cdf0e10cSrcweir it != m_aElements.end(); ++it ) 287*cdf0e10cSrcweir { 288*cdf0e10cSrcweir it->deleteChild(); 289*cdf0e10cSrcweir } 290*cdf0e10cSrcweir } 291*cdf0e10cSrcweir 292*cdf0e10cSrcweir Size RowOrColumn::getOptimalSize( WindowSizeType i_eType ) const 293*cdf0e10cSrcweir { 294*cdf0e10cSrcweir Size aRet( 0, 0 ); 295*cdf0e10cSrcweir long nDistance = getBorderValue( m_nBorderWidth ); 296*cdf0e10cSrcweir for( std::vector< WindowArranger::Element >::const_iterator it = m_aElements.begin(); 297*cdf0e10cSrcweir it != m_aElements.end(); ++it ) 298*cdf0e10cSrcweir { 299*cdf0e10cSrcweir if( it->isVisible() ) 300*cdf0e10cSrcweir { 301*cdf0e10cSrcweir // get the size of type of the managed element 302*cdf0e10cSrcweir Size aElementSize( it->getOptimalSize( i_eType ) ); 303*cdf0e10cSrcweir if( m_bColumn ) 304*cdf0e10cSrcweir { 305*cdf0e10cSrcweir // add the distance between elements 306*cdf0e10cSrcweir aRet.Height() += nDistance; 307*cdf0e10cSrcweir // check if the width needs adjustment 308*cdf0e10cSrcweir if( aRet.Width() < aElementSize.Width() ) 309*cdf0e10cSrcweir aRet.Width() = aElementSize.Width(); 310*cdf0e10cSrcweir aRet.Height() += aElementSize.Height(); 311*cdf0e10cSrcweir } 312*cdf0e10cSrcweir else 313*cdf0e10cSrcweir { 314*cdf0e10cSrcweir // add the distance between elements 315*cdf0e10cSrcweir aRet.Width() += nDistance; 316*cdf0e10cSrcweir // check if the height needs adjustment 317*cdf0e10cSrcweir if( aRet.Height() < aElementSize.Height() ) 318*cdf0e10cSrcweir aRet.Height() = aElementSize.Height(); 319*cdf0e10cSrcweir aRet.Width() += aElementSize.Width(); 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir } 322*cdf0e10cSrcweir } 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir if( aRet.Width() != 0 || aRet.Height() != 0 ) 325*cdf0e10cSrcweir { 326*cdf0e10cSrcweir // subtract the border for the first element 327*cdf0e10cSrcweir if( m_bColumn ) 328*cdf0e10cSrcweir aRet.Height() -= nDistance; 329*cdf0e10cSrcweir else 330*cdf0e10cSrcweir aRet.Width() -= nDistance; 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir // add the outer border 333*cdf0e10cSrcweir long nOuterBorder = getBorderValue( m_nOuterBorder ); 334*cdf0e10cSrcweir aRet.Width() += 2*nOuterBorder; 335*cdf0e10cSrcweir aRet.Height() += 2*nOuterBorder; 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir return aRet; 339*cdf0e10cSrcweir } 340*cdf0e10cSrcweir 341*cdf0e10cSrcweir void RowOrColumn::distributeRowWidth( std::vector<Size>& io_rSizes, long /*i_nUsedWidth*/, long i_nExtraWidth ) 342*cdf0e10cSrcweir { 343*cdf0e10cSrcweir if( ! io_rSizes.empty() && io_rSizes.size() == m_aElements.size() ) 344*cdf0e10cSrcweir { 345*cdf0e10cSrcweir // find all elements with the highest expand priority 346*cdf0e10cSrcweir size_t nElements = m_aElements.size(); 347*cdf0e10cSrcweir std::vector< size_t > aIndices; 348*cdf0e10cSrcweir sal_Int32 nHighPrio = 0; 349*cdf0e10cSrcweir for( size_t i = 0; i < nElements; i++ ) 350*cdf0e10cSrcweir { 351*cdf0e10cSrcweir if( m_aElements[ i ].isVisible() ) 352*cdf0e10cSrcweir { 353*cdf0e10cSrcweir sal_Int32 nCurPrio = m_aElements[ i ].getExpandPriority(); 354*cdf0e10cSrcweir if( nCurPrio > nHighPrio ) 355*cdf0e10cSrcweir { 356*cdf0e10cSrcweir aIndices.clear(); 357*cdf0e10cSrcweir nHighPrio = nCurPrio; 358*cdf0e10cSrcweir } 359*cdf0e10cSrcweir if( nCurPrio == nHighPrio ) 360*cdf0e10cSrcweir aIndices.push_back( i ); 361*cdf0e10cSrcweir } 362*cdf0e10cSrcweir } 363*cdf0e10cSrcweir 364*cdf0e10cSrcweir // distribute extra space evenly among collected elements 365*cdf0e10cSrcweir nElements = aIndices.size(); 366*cdf0e10cSrcweir if( nElements > 0 ) 367*cdf0e10cSrcweir { 368*cdf0e10cSrcweir long nDelta = i_nExtraWidth / nElements; 369*cdf0e10cSrcweir for( size_t i = 0; i < nElements; i++ ) 370*cdf0e10cSrcweir { 371*cdf0e10cSrcweir io_rSizes[ aIndices[i] ].Width() += nDelta; 372*cdf0e10cSrcweir i_nExtraWidth -= nDelta; 373*cdf0e10cSrcweir } 374*cdf0e10cSrcweir // add the last pixels to the last row element 375*cdf0e10cSrcweir if( i_nExtraWidth > 0 && nElements > 0 ) 376*cdf0e10cSrcweir io_rSizes[aIndices.back()].Width() += i_nExtraWidth; 377*cdf0e10cSrcweir } 378*cdf0e10cSrcweir } 379*cdf0e10cSrcweir } 380*cdf0e10cSrcweir 381*cdf0e10cSrcweir void RowOrColumn::distributeColumnHeight( std::vector<Size>& io_rSizes, long /*i_nUsedHeight*/, long i_nExtraHeight ) 382*cdf0e10cSrcweir { 383*cdf0e10cSrcweir if( ! io_rSizes.empty() && io_rSizes.size() == m_aElements.size() ) 384*cdf0e10cSrcweir { 385*cdf0e10cSrcweir // find all elements with the highest expand priority 386*cdf0e10cSrcweir size_t nElements = m_aElements.size(); 387*cdf0e10cSrcweir std::vector< size_t > aIndices; 388*cdf0e10cSrcweir sal_Int32 nHighPrio = 3; 389*cdf0e10cSrcweir for( size_t i = 0; i < nElements; i++ ) 390*cdf0e10cSrcweir { 391*cdf0e10cSrcweir if( m_aElements[ i ].isVisible() ) 392*cdf0e10cSrcweir { 393*cdf0e10cSrcweir sal_Int32 nCurPrio = m_aElements[ i ].getExpandPriority(); 394*cdf0e10cSrcweir if( nCurPrio > nHighPrio ) 395*cdf0e10cSrcweir { 396*cdf0e10cSrcweir aIndices.clear(); 397*cdf0e10cSrcweir nHighPrio = nCurPrio; 398*cdf0e10cSrcweir } 399*cdf0e10cSrcweir if( nCurPrio == nHighPrio ) 400*cdf0e10cSrcweir aIndices.push_back( i ); 401*cdf0e10cSrcweir } 402*cdf0e10cSrcweir } 403*cdf0e10cSrcweir 404*cdf0e10cSrcweir // distribute extra space evenly among collected elements 405*cdf0e10cSrcweir nElements = aIndices.size(); 406*cdf0e10cSrcweir if( nElements > 0 ) 407*cdf0e10cSrcweir { 408*cdf0e10cSrcweir long nDelta = i_nExtraHeight / nElements; 409*cdf0e10cSrcweir for( size_t i = 0; i < nElements; i++ ) 410*cdf0e10cSrcweir { 411*cdf0e10cSrcweir io_rSizes[ aIndices[i] ].Height() += nDelta; 412*cdf0e10cSrcweir i_nExtraHeight -= nDelta; 413*cdf0e10cSrcweir } 414*cdf0e10cSrcweir // add the last pixels to the last row element 415*cdf0e10cSrcweir if( i_nExtraHeight > 0 && nElements > 0 ) 416*cdf0e10cSrcweir io_rSizes[aIndices.back()].Height() += i_nExtraHeight; 417*cdf0e10cSrcweir } 418*cdf0e10cSrcweir } 419*cdf0e10cSrcweir } 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir void RowOrColumn::resize() 422*cdf0e10cSrcweir { 423*cdf0e10cSrcweir // check if we can get optimal size, else fallback to minimal size 424*cdf0e10cSrcweir Size aOptSize( getOptimalSize( WINDOWSIZE_PREFERRED ) ); 425*cdf0e10cSrcweir WindowSizeType eType = WINDOWSIZE_PREFERRED; 426*cdf0e10cSrcweir if( m_bColumn ) 427*cdf0e10cSrcweir { 428*cdf0e10cSrcweir if( aOptSize.Height() > m_aManagedArea.GetHeight() ) 429*cdf0e10cSrcweir eType = WINDOWSIZE_MINIMUM; 430*cdf0e10cSrcweir } 431*cdf0e10cSrcweir else 432*cdf0e10cSrcweir { 433*cdf0e10cSrcweir if( aOptSize.Width() > m_aManagedArea.GetWidth() ) 434*cdf0e10cSrcweir eType = WINDOWSIZE_MINIMUM; 435*cdf0e10cSrcweir } 436*cdf0e10cSrcweir 437*cdf0e10cSrcweir size_t nElements = m_aElements.size(); 438*cdf0e10cSrcweir // get all element sizes for sizing 439*cdf0e10cSrcweir std::vector<Size> aElementSizes( nElements ); 440*cdf0e10cSrcweir long nDistance = getBorderValue( m_nBorderWidth ); 441*cdf0e10cSrcweir long nOuterBorder = getBorderValue( m_nOuterBorder ); 442*cdf0e10cSrcweir long nUsedWidth = 2*nOuterBorder - (nElements ? nDistance : 0); 443*cdf0e10cSrcweir for( size_t i = 0; i < nElements; i++ ) 444*cdf0e10cSrcweir { 445*cdf0e10cSrcweir if( m_aElements[i].isVisible() ) 446*cdf0e10cSrcweir { 447*cdf0e10cSrcweir aElementSizes[i] = m_aElements[i].getOptimalSize( eType ); 448*cdf0e10cSrcweir if( m_bColumn ) 449*cdf0e10cSrcweir { 450*cdf0e10cSrcweir aElementSizes[i].Width() = m_aManagedArea.GetWidth() - 2 * nOuterBorder; 451*cdf0e10cSrcweir nUsedWidth += aElementSizes[i].Height() + nDistance; 452*cdf0e10cSrcweir } 453*cdf0e10cSrcweir else 454*cdf0e10cSrcweir { 455*cdf0e10cSrcweir aElementSizes[i].Height() = m_aManagedArea.GetHeight() - 2 * nOuterBorder; 456*cdf0e10cSrcweir nUsedWidth += aElementSizes[i].Width() + nDistance; 457*cdf0e10cSrcweir } 458*cdf0e10cSrcweir } 459*cdf0e10cSrcweir } 460*cdf0e10cSrcweir 461*cdf0e10cSrcweir long nExtraWidth = (m_bColumn ? m_aManagedArea.GetHeight() : m_aManagedArea.GetWidth()) - nUsedWidth; 462*cdf0e10cSrcweir if( nExtraWidth > 0 ) 463*cdf0e10cSrcweir { 464*cdf0e10cSrcweir if( m_bColumn ) 465*cdf0e10cSrcweir distributeColumnHeight( aElementSizes, nUsedWidth, nExtraWidth ); 466*cdf0e10cSrcweir else 467*cdf0e10cSrcweir distributeRowWidth( aElementSizes, nUsedWidth, nExtraWidth ); 468*cdf0e10cSrcweir } 469*cdf0e10cSrcweir 470*cdf0e10cSrcweir // get starting position 471*cdf0e10cSrcweir Point aElementPos( m_aManagedArea.TopLeft() ); 472*cdf0e10cSrcweir // outer border 473*cdf0e10cSrcweir aElementPos.X() += nOuterBorder; 474*cdf0e10cSrcweir aElementPos.Y() += nOuterBorder; 475*cdf0e10cSrcweir 476*cdf0e10cSrcweir // position managed windows 477*cdf0e10cSrcweir for( size_t i = 0; i < nElements; i++ ) 478*cdf0e10cSrcweir { 479*cdf0e10cSrcweir // get the size of type of the managed element 480*cdf0e10cSrcweir if( m_aElements[i].isVisible() ) 481*cdf0e10cSrcweir { 482*cdf0e10cSrcweir m_aElements[i].setPosSize( aElementPos, aElementSizes[i] ); 483*cdf0e10cSrcweir if( m_bColumn ) 484*cdf0e10cSrcweir aElementPos.Y() += nDistance + aElementSizes[i].Height(); 485*cdf0e10cSrcweir else 486*cdf0e10cSrcweir aElementPos.X() += nDistance + aElementSizes[i].Width(); 487*cdf0e10cSrcweir } 488*cdf0e10cSrcweir } 489*cdf0e10cSrcweir } 490*cdf0e10cSrcweir 491*cdf0e10cSrcweir size_t RowOrColumn::addWindow( Window* i_pWindow, sal_Int32 i_nExpandPrio, const Size& i_rMinSize, size_t i_nIndex ) 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir size_t nIndex = i_nIndex; 494*cdf0e10cSrcweir if( i_nIndex >= m_aElements.size() ) 495*cdf0e10cSrcweir { 496*cdf0e10cSrcweir nIndex = m_aElements.size(); 497*cdf0e10cSrcweir m_aElements.push_back( WindowArranger::Element( i_pWindow, boost::shared_ptr<WindowArranger>(), i_nExpandPrio, i_rMinSize ) ); 498*cdf0e10cSrcweir } 499*cdf0e10cSrcweir else 500*cdf0e10cSrcweir { 501*cdf0e10cSrcweir std::vector< WindowArranger::Element >::iterator it = m_aElements.begin(); 502*cdf0e10cSrcweir while( i_nIndex-- ) 503*cdf0e10cSrcweir ++it; 504*cdf0e10cSrcweir m_aElements.insert( it, WindowArranger::Element( i_pWindow, boost::shared_ptr<WindowArranger>(), i_nExpandPrio, i_rMinSize ) ); 505*cdf0e10cSrcweir } 506*cdf0e10cSrcweir return nIndex; 507*cdf0e10cSrcweir } 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir size_t RowOrColumn::addChild( boost::shared_ptr<WindowArranger> const & i_pChild, sal_Int32 i_nExpandPrio, size_t i_nIndex ) 510*cdf0e10cSrcweir { 511*cdf0e10cSrcweir size_t nIndex = i_nIndex; 512*cdf0e10cSrcweir if( i_nIndex >= m_aElements.size() ) 513*cdf0e10cSrcweir { 514*cdf0e10cSrcweir nIndex = m_aElements.size(); 515*cdf0e10cSrcweir m_aElements.push_back( WindowArranger::Element( NULL, i_pChild, i_nExpandPrio ) ); 516*cdf0e10cSrcweir } 517*cdf0e10cSrcweir else 518*cdf0e10cSrcweir { 519*cdf0e10cSrcweir std::vector< WindowArranger::Element >::iterator it = m_aElements.begin(); 520*cdf0e10cSrcweir while( i_nIndex-- ) 521*cdf0e10cSrcweir ++it; 522*cdf0e10cSrcweir m_aElements.insert( it, WindowArranger::Element( NULL, i_pChild, i_nExpandPrio ) ); 523*cdf0e10cSrcweir } 524*cdf0e10cSrcweir return nIndex; 525*cdf0e10cSrcweir } 526*cdf0e10cSrcweir 527*cdf0e10cSrcweir void RowOrColumn::remove( Window* i_pWindow ) 528*cdf0e10cSrcweir { 529*cdf0e10cSrcweir if( i_pWindow ) 530*cdf0e10cSrcweir { 531*cdf0e10cSrcweir for( std::vector< WindowArranger::Element >::iterator it = m_aElements.begin(); 532*cdf0e10cSrcweir it != m_aElements.end(); ++it ) 533*cdf0e10cSrcweir { 534*cdf0e10cSrcweir if( it->m_pElement == i_pWindow ) 535*cdf0e10cSrcweir { 536*cdf0e10cSrcweir m_aElements.erase( it ); 537*cdf0e10cSrcweir return; 538*cdf0e10cSrcweir } 539*cdf0e10cSrcweir } 540*cdf0e10cSrcweir } 541*cdf0e10cSrcweir } 542*cdf0e10cSrcweir 543*cdf0e10cSrcweir void RowOrColumn::remove( boost::shared_ptr<WindowArranger> const & i_pChild ) 544*cdf0e10cSrcweir { 545*cdf0e10cSrcweir if( i_pChild ) 546*cdf0e10cSrcweir { 547*cdf0e10cSrcweir for( std::vector< WindowArranger::Element >::iterator it = m_aElements.begin(); 548*cdf0e10cSrcweir it != m_aElements.end(); ++it ) 549*cdf0e10cSrcweir { 550*cdf0e10cSrcweir if( it->m_pChild == i_pChild ) 551*cdf0e10cSrcweir { 552*cdf0e10cSrcweir m_aElements.erase( it ); 553*cdf0e10cSrcweir return; 554*cdf0e10cSrcweir } 555*cdf0e10cSrcweir } 556*cdf0e10cSrcweir } 557*cdf0e10cSrcweir } 558*cdf0e10cSrcweir 559*cdf0e10cSrcweir // ---------------------------------------- 560*cdf0e10cSrcweir // vcl::LabeledElement 561*cdf0e10cSrcweir //----------------------------------------- 562*cdf0e10cSrcweir 563*cdf0e10cSrcweir LabeledElement::~LabeledElement() 564*cdf0e10cSrcweir { 565*cdf0e10cSrcweir m_aLabel.deleteChild(); 566*cdf0e10cSrcweir m_aElement.deleteChild(); 567*cdf0e10cSrcweir } 568*cdf0e10cSrcweir 569*cdf0e10cSrcweir Size LabeledElement::getOptimalSize( WindowSizeType i_eType ) const 570*cdf0e10cSrcweir { 571*cdf0e10cSrcweir Size aRet( m_aLabel.getOptimalSize( WINDOWSIZE_MINIMUM ) ); 572*cdf0e10cSrcweir if( aRet.Width() != 0 ) 573*cdf0e10cSrcweir { 574*cdf0e10cSrcweir if( m_nLabelColumnWidth != 0 ) 575*cdf0e10cSrcweir aRet.Width() = m_nLabelColumnWidth; 576*cdf0e10cSrcweir else 577*cdf0e10cSrcweir aRet.Width() += getBorderValue( m_nDistance ); 578*cdf0e10cSrcweir } 579*cdf0e10cSrcweir Size aElementSize( m_aElement.getOptimalSize( i_eType ) ); 580*cdf0e10cSrcweir aRet.Width() += aElementSize.Width(); 581*cdf0e10cSrcweir if( aElementSize.Height() > aRet.Height() ) 582*cdf0e10cSrcweir aRet.Height() = aElementSize.Height(); 583*cdf0e10cSrcweir if( aRet.Height() != 0 ) 584*cdf0e10cSrcweir aRet.Height() += 2 * getBorderValue( m_nOuterBorder ); 585*cdf0e10cSrcweir 586*cdf0e10cSrcweir return aRet; 587*cdf0e10cSrcweir } 588*cdf0e10cSrcweir 589*cdf0e10cSrcweir void LabeledElement::resize() 590*cdf0e10cSrcweir { 591*cdf0e10cSrcweir Size aLabelSize( m_aLabel.getOptimalSize( WINDOWSIZE_MINIMUM ) ); 592*cdf0e10cSrcweir Size aElementSize( m_aElement.getOptimalSize( WINDOWSIZE_PREFERRED ) ); 593*cdf0e10cSrcweir long nDistance = getBorderValue( m_nDistance ); 594*cdf0e10cSrcweir long nOuterBorder = getBorderValue( m_nOuterBorder ); 595*cdf0e10cSrcweir if( nDistance + aLabelSize.Width() + aElementSize.Width() > m_aManagedArea.GetWidth() ) 596*cdf0e10cSrcweir aElementSize = m_aElement.getOptimalSize( WINDOWSIZE_MINIMUM ); 597*cdf0e10cSrcweir 598*cdf0e10cSrcweir // align label and element vertically in LabeledElement 599*cdf0e10cSrcweir long nYOff = (m_aManagedArea.GetHeight() - 2*nOuterBorder - aLabelSize.Height()) / 2; 600*cdf0e10cSrcweir Point aPos( m_aManagedArea.Left(), 601*cdf0e10cSrcweir m_aManagedArea.Top() + nOuterBorder + nYOff ); 602*cdf0e10cSrcweir Size aSize( aLabelSize ); 603*cdf0e10cSrcweir if( m_nLabelColumnWidth != 0 ) 604*cdf0e10cSrcweir aSize.Width() = m_nLabelColumnWidth; 605*cdf0e10cSrcweir m_aLabel.setPosSize( aPos, aSize ); 606*cdf0e10cSrcweir 607*cdf0e10cSrcweir aPos.X() += aSize.Width() + nDistance; 608*cdf0e10cSrcweir nYOff = (m_aManagedArea.GetHeight() - 2*nOuterBorder - aElementSize.Height()) / 2; 609*cdf0e10cSrcweir aPos.Y() = m_aManagedArea.Top() + nOuterBorder + nYOff; 610*cdf0e10cSrcweir aSize.Width() = aElementSize.Width(); 611*cdf0e10cSrcweir aSize.Height() = m_aManagedArea.GetHeight() - 2*nOuterBorder; 612*cdf0e10cSrcweir 613*cdf0e10cSrcweir // label style 614*cdf0e10cSrcweir // 0: position left and right 615*cdf0e10cSrcweir // 1: keep the element close to label and grow it 616*cdf0e10cSrcweir // 2: keep the element close and don't grow it 617*cdf0e10cSrcweir if( m_nLabelStyle == 0) 618*cdf0e10cSrcweir { 619*cdf0e10cSrcweir if( aPos.X() + aSize.Width() < m_aManagedArea.Right() ) 620*cdf0e10cSrcweir aPos.X() = m_aManagedArea.Right() - aSize.Width(); 621*cdf0e10cSrcweir } 622*cdf0e10cSrcweir else if( m_nLabelStyle == 1 ) 623*cdf0e10cSrcweir { 624*cdf0e10cSrcweir if( aPos.X() + aSize.Width() < m_aManagedArea.Right() ) 625*cdf0e10cSrcweir aSize.Width() = m_aManagedArea.Right() - aPos.X(); 626*cdf0e10cSrcweir } 627*cdf0e10cSrcweir m_aElement.setPosSize( aPos, aSize ); 628*cdf0e10cSrcweir } 629*cdf0e10cSrcweir 630*cdf0e10cSrcweir void LabeledElement::setLabel( Window* i_pLabel ) 631*cdf0e10cSrcweir { 632*cdf0e10cSrcweir m_aLabel.m_pElement = i_pLabel; 633*cdf0e10cSrcweir m_aLabel.m_pChild.reset(); 634*cdf0e10cSrcweir } 635*cdf0e10cSrcweir 636*cdf0e10cSrcweir void LabeledElement::setLabel( boost::shared_ptr<WindowArranger> const & i_pLabel ) 637*cdf0e10cSrcweir { 638*cdf0e10cSrcweir m_aLabel.m_pElement = NULL; 639*cdf0e10cSrcweir m_aLabel.m_pChild = i_pLabel; 640*cdf0e10cSrcweir } 641*cdf0e10cSrcweir 642*cdf0e10cSrcweir void LabeledElement::setElement( Window* i_pElement ) 643*cdf0e10cSrcweir { 644*cdf0e10cSrcweir m_aElement.m_pElement = i_pElement; 645*cdf0e10cSrcweir m_aElement.m_pChild.reset(); 646*cdf0e10cSrcweir } 647*cdf0e10cSrcweir 648*cdf0e10cSrcweir void LabeledElement::setElement( boost::shared_ptr<WindowArranger> const & i_pElement ) 649*cdf0e10cSrcweir { 650*cdf0e10cSrcweir m_aElement.m_pElement = NULL; 651*cdf0e10cSrcweir m_aElement.m_pChild = i_pElement; 652*cdf0e10cSrcweir } 653*cdf0e10cSrcweir 654*cdf0e10cSrcweir // ---------------------------------------- 655*cdf0e10cSrcweir // vcl::LabelColumn 656*cdf0e10cSrcweir //----------------------------------------- 657*cdf0e10cSrcweir LabelColumn::~LabelColumn() 658*cdf0e10cSrcweir { 659*cdf0e10cSrcweir } 660*cdf0e10cSrcweir 661*cdf0e10cSrcweir long LabelColumn::getLabelWidth() const 662*cdf0e10cSrcweir { 663*cdf0e10cSrcweir long nWidth = 0; 664*cdf0e10cSrcweir 665*cdf0e10cSrcweir size_t nEle = countElements(); 666*cdf0e10cSrcweir for( size_t i = 0; i < nEle; i++ ) 667*cdf0e10cSrcweir { 668*cdf0e10cSrcweir const Element* pEle = getConstElement( i ); 669*cdf0e10cSrcweir if( pEle && pEle->m_pChild.get() ) 670*cdf0e10cSrcweir { 671*cdf0e10cSrcweir const LabeledElement* pLabel = dynamic_cast< const LabeledElement* >(pEle->m_pChild.get()); 672*cdf0e10cSrcweir if( pLabel ) 673*cdf0e10cSrcweir { 674*cdf0e10cSrcweir Window* pLW = pLabel->getWindow( 0 ); 675*cdf0e10cSrcweir if( pLW ) 676*cdf0e10cSrcweir { 677*cdf0e10cSrcweir Size aLabSize( pLW->GetOptimalSize( WINDOWSIZE_MINIMUM ) ); 678*cdf0e10cSrcweir long nLB = 0; 679*cdf0e10cSrcweir pLabel->getBorders(0, &nLB); 680*cdf0e10cSrcweir aLabSize.Width() += getBorderValue( nLB ); 681*cdf0e10cSrcweir if( aLabSize.Width() > nWidth ) 682*cdf0e10cSrcweir nWidth = aLabSize.Width(); 683*cdf0e10cSrcweir } 684*cdf0e10cSrcweir } 685*cdf0e10cSrcweir } 686*cdf0e10cSrcweir } 687*cdf0e10cSrcweir return nWidth + getBorderValue( getBorderWidth() ); 688*cdf0e10cSrcweir } 689*cdf0e10cSrcweir 690*cdf0e10cSrcweir Size LabelColumn::getOptimalSize( WindowSizeType i_eType ) const 691*cdf0e10cSrcweir { 692*cdf0e10cSrcweir long nWidth = getLabelWidth(); 693*cdf0e10cSrcweir long nOuterBorder = getBorderValue( m_nOuterBorder ); 694*cdf0e10cSrcweir Size aColumnSize; 695*cdf0e10cSrcweir 696*cdf0e10cSrcweir // every child is a LabeledElement 697*cdf0e10cSrcweir size_t nEle = countElements(); 698*cdf0e10cSrcweir for( size_t i = 0; i < nEle; i++ ) 699*cdf0e10cSrcweir { 700*cdf0e10cSrcweir Size aElementSize; 701*cdf0e10cSrcweir const Element* pEle = getConstElement( i ); 702*cdf0e10cSrcweir if( pEle && pEle->m_pChild.get() ) 703*cdf0e10cSrcweir { 704*cdf0e10cSrcweir const LabeledElement* pLabel = dynamic_cast< const LabeledElement* >(pEle->m_pChild.get()); 705*cdf0e10cSrcweir if( pLabel ) // we have a label 706*cdf0e10cSrcweir { 707*cdf0e10cSrcweir aElementSize = pLabel->getLabelSize( WINDOWSIZE_MINIMUM ); 708*cdf0e10cSrcweir if( aElementSize.Width() ) 709*cdf0e10cSrcweir aElementSize.Width() = nWidth; 710*cdf0e10cSrcweir Size aSize( pLabel->getElementSize( i_eType ) ); 711*cdf0e10cSrcweir aElementSize.Width() += aSize.Width(); 712*cdf0e10cSrcweir if( aSize.Height() > aElementSize.Height() ) 713*cdf0e10cSrcweir aElementSize.Height() = aSize.Height(); 714*cdf0e10cSrcweir } 715*cdf0e10cSrcweir else // a non label, just treat it as a row 716*cdf0e10cSrcweir { 717*cdf0e10cSrcweir aElementSize = pEle->getOptimalSize( i_eType ); 718*cdf0e10cSrcweir } 719*cdf0e10cSrcweir } 720*cdf0e10cSrcweir else if( pEle && pEle->m_pElement ) // a general window, treat is as a row 721*cdf0e10cSrcweir { 722*cdf0e10cSrcweir aElementSize = pEle->getOptimalSize( i_eType ); 723*cdf0e10cSrcweir } 724*cdf0e10cSrcweir if( aElementSize.Width() ) 725*cdf0e10cSrcweir { 726*cdf0e10cSrcweir aElementSize.Width() += 2*nOuterBorder; 727*cdf0e10cSrcweir if( aElementSize.Width() > aColumnSize.Width() ) 728*cdf0e10cSrcweir aColumnSize.Width() = aElementSize.Width(); 729*cdf0e10cSrcweir } 730*cdf0e10cSrcweir if( aElementSize.Height() ) 731*cdf0e10cSrcweir { 732*cdf0e10cSrcweir aColumnSize.Height() += getBorderValue( getBorderWidth() ) + aElementSize.Height(); 733*cdf0e10cSrcweir } 734*cdf0e10cSrcweir } 735*cdf0e10cSrcweir if( nEle > 0 && aColumnSize.Height() ) 736*cdf0e10cSrcweir { 737*cdf0e10cSrcweir aColumnSize.Height() -= getBorderValue( getBorderWidth() ); // for the first element 738*cdf0e10cSrcweir aColumnSize.Height() += 2*nOuterBorder; 739*cdf0e10cSrcweir } 740*cdf0e10cSrcweir return aColumnSize; 741*cdf0e10cSrcweir } 742*cdf0e10cSrcweir 743*cdf0e10cSrcweir void LabelColumn::resize() 744*cdf0e10cSrcweir { 745*cdf0e10cSrcweir long nWidth = getLabelWidth(); 746*cdf0e10cSrcweir size_t nEle = countElements(); 747*cdf0e10cSrcweir for( size_t i = 0; i < nEle; i++ ) 748*cdf0e10cSrcweir { 749*cdf0e10cSrcweir Element* pEle = getElement( i ); 750*cdf0e10cSrcweir if( pEle && pEle->m_pChild.get() ) 751*cdf0e10cSrcweir { 752*cdf0e10cSrcweir LabeledElement* pLabel = dynamic_cast< LabeledElement* >(pEle->m_pChild.get()); 753*cdf0e10cSrcweir if( pLabel ) 754*cdf0e10cSrcweir pLabel->setLabelColumnWidth( nWidth ); 755*cdf0e10cSrcweir } 756*cdf0e10cSrcweir } 757*cdf0e10cSrcweir RowOrColumn::resize(); 758*cdf0e10cSrcweir } 759*cdf0e10cSrcweir 760*cdf0e10cSrcweir size_t LabelColumn::addRow( Window* i_pLabel, boost::shared_ptr<WindowArranger> const& i_rElement, long i_nIndent ) 761*cdf0e10cSrcweir { 762*cdf0e10cSrcweir boost::shared_ptr< LabeledElement > xLabel( new LabeledElement( this, 1 ) ); 763*cdf0e10cSrcweir xLabel->setLabel( i_pLabel ); 764*cdf0e10cSrcweir xLabel->setBorders( 0, i_nIndent, 0, 0, 0 ); 765*cdf0e10cSrcweir xLabel->setElement( i_rElement ); 766*cdf0e10cSrcweir size_t nIndex = addChild( xLabel ); 767*cdf0e10cSrcweir resize(); 768*cdf0e10cSrcweir return nIndex; 769*cdf0e10cSrcweir } 770*cdf0e10cSrcweir 771*cdf0e10cSrcweir size_t LabelColumn::addRow( Window* i_pLabel, Window* i_pElement, long i_nIndent, const Size& i_rElementMinSize ) 772*cdf0e10cSrcweir { 773*cdf0e10cSrcweir boost::shared_ptr< LabeledElement > xLabel( new LabeledElement( this, 1 ) ); 774*cdf0e10cSrcweir xLabel->setLabel( i_pLabel ); 775*cdf0e10cSrcweir xLabel->setBorders( 0, i_nIndent, 0, 0, 0 ); 776*cdf0e10cSrcweir xLabel->setElement( i_pElement ); 777*cdf0e10cSrcweir xLabel->setMinimumSize( 1, i_rElementMinSize ); 778*cdf0e10cSrcweir size_t nIndex = addChild( xLabel ); 779*cdf0e10cSrcweir resize(); 780*cdf0e10cSrcweir return nIndex; 781*cdf0e10cSrcweir } 782*cdf0e10cSrcweir 783*cdf0e10cSrcweir // ---------------------------------------- 784*cdf0e10cSrcweir // vcl::Indenter 785*cdf0e10cSrcweir //----------------------------------------- 786*cdf0e10cSrcweir 787*cdf0e10cSrcweir Indenter::~Indenter() 788*cdf0e10cSrcweir { 789*cdf0e10cSrcweir m_aElement.deleteChild(); 790*cdf0e10cSrcweir } 791*cdf0e10cSrcweir 792*cdf0e10cSrcweir Size Indenter::getOptimalSize( WindowSizeType i_eType ) const 793*cdf0e10cSrcweir { 794*cdf0e10cSrcweir Size aSize( m_aElement.getOptimalSize( i_eType ) ); 795*cdf0e10cSrcweir long nOuterBorder = getBorderValue( m_nOuterBorder ); 796*cdf0e10cSrcweir long nIndent = getBorderValue( m_nIndent ); 797*cdf0e10cSrcweir aSize.Width() += 2*nOuterBorder + nIndent; 798*cdf0e10cSrcweir aSize.Height() += 2*nOuterBorder; 799*cdf0e10cSrcweir return aSize; 800*cdf0e10cSrcweir } 801*cdf0e10cSrcweir 802*cdf0e10cSrcweir void Indenter::resize() 803*cdf0e10cSrcweir { 804*cdf0e10cSrcweir long nOuterBorder = getBorderValue( m_nOuterBorder ); 805*cdf0e10cSrcweir long nIndent = getBorderValue( m_nIndent ); 806*cdf0e10cSrcweir Point aPt( m_aManagedArea.TopLeft() ); 807*cdf0e10cSrcweir aPt.X() += nOuterBorder + nIndent; 808*cdf0e10cSrcweir aPt.Y() += nOuterBorder; 809*cdf0e10cSrcweir Size aSz( m_aManagedArea.GetSize() ); 810*cdf0e10cSrcweir aSz.Width() -= 2*nOuterBorder + nIndent; 811*cdf0e10cSrcweir aSz.Height() -= 2*nOuterBorder; 812*cdf0e10cSrcweir m_aElement.setPosSize( aPt, aSz ); 813*cdf0e10cSrcweir } 814*cdf0e10cSrcweir 815*cdf0e10cSrcweir void Indenter::setWindow( Window* i_pWindow, sal_Int32 i_nExpandPrio ) 816*cdf0e10cSrcweir { 817*cdf0e10cSrcweir OSL_VERIFY( (m_aElement.m_pElement == 0 && m_aElement.m_pChild == 0) || i_pWindow == 0 ); 818*cdf0e10cSrcweir OSL_VERIFY( i_pWindow == 0 || i_pWindow->GetParent() == m_pParentWindow ); 819*cdf0e10cSrcweir m_aElement.m_pElement = i_pWindow; 820*cdf0e10cSrcweir m_aElement.m_nExpandPriority = i_nExpandPrio; 821*cdf0e10cSrcweir } 822*cdf0e10cSrcweir 823*cdf0e10cSrcweir void Indenter::setChild( boost::shared_ptr<WindowArranger> const & i_pChild, sal_Int32 i_nExpandPrio ) 824*cdf0e10cSrcweir { 825*cdf0e10cSrcweir OSL_VERIFY( (m_aElement.m_pElement == 0 && m_aElement.m_pChild == 0 ) || i_pChild == 0 ); 826*cdf0e10cSrcweir m_aElement.m_pChild = i_pChild; 827*cdf0e10cSrcweir m_aElement.m_nExpandPriority = i_nExpandPrio; 828*cdf0e10cSrcweir } 829*cdf0e10cSrcweir 830*cdf0e10cSrcweir // ---------------------------------------- 831*cdf0e10cSrcweir // vcl::MatrixArranger 832*cdf0e10cSrcweir //----------------------------------------- 833*cdf0e10cSrcweir MatrixArranger::~MatrixArranger() 834*cdf0e10cSrcweir { 835*cdf0e10cSrcweir } 836*cdf0e10cSrcweir 837*cdf0e10cSrcweir Size MatrixArranger::getOptimalSize( WindowSizeType i_eType, 838*cdf0e10cSrcweir std::vector<long>& o_rColumnWidths, std::vector<long>& o_rRowHeights, 839*cdf0e10cSrcweir std::vector<sal_Int32>& o_rColumnPrio, std::vector<sal_Int32>& o_rRowPrio 840*cdf0e10cSrcweir ) const 841*cdf0e10cSrcweir { 842*cdf0e10cSrcweir long nOuterBorder = getBorderValue( m_nOuterBorder ); 843*cdf0e10cSrcweir Size aMatrixSize( 2*nOuterBorder, 2*nOuterBorder ); 844*cdf0e10cSrcweir 845*cdf0e10cSrcweir // first find out the current number of rows and columns 846*cdf0e10cSrcweir sal_uInt32 nRows = 0, nColumns = 0; 847*cdf0e10cSrcweir for( std::vector< MatrixElement >::const_iterator it = m_aElements.begin(); 848*cdf0e10cSrcweir it != m_aElements.end(); ++it ) 849*cdf0e10cSrcweir { 850*cdf0e10cSrcweir if( it->m_nX >= nColumns ) 851*cdf0e10cSrcweir nColumns = it->m_nX+1; 852*cdf0e10cSrcweir if( it->m_nY >= nRows ) 853*cdf0e10cSrcweir nRows = it->m_nY+1; 854*cdf0e10cSrcweir } 855*cdf0e10cSrcweir 856*cdf0e10cSrcweir // now allocate row and column depth vectors 857*cdf0e10cSrcweir o_rColumnWidths = std::vector< long >( nColumns, 0 ); 858*cdf0e10cSrcweir o_rRowHeights = std::vector< long >( nRows, 0 ); 859*cdf0e10cSrcweir o_rColumnPrio = std::vector< sal_Int32 >( nColumns, 0 ); 860*cdf0e10cSrcweir o_rRowPrio = std::vector< sal_Int32 >( nRows, 0 ); 861*cdf0e10cSrcweir 862*cdf0e10cSrcweir // get sizes an allocate them into rows/columns 863*cdf0e10cSrcweir for( std::vector< MatrixElement >::const_iterator it = m_aElements.begin(); 864*cdf0e10cSrcweir it != m_aElements.end(); ++it ) 865*cdf0e10cSrcweir { 866*cdf0e10cSrcweir Size aSize( it->getOptimalSize( i_eType ) ); 867*cdf0e10cSrcweir if( aSize.Width() > o_rColumnWidths[ it->m_nX ] ) 868*cdf0e10cSrcweir o_rColumnWidths[ it->m_nX ] = aSize.Width(); 869*cdf0e10cSrcweir if( aSize.Height() > o_rRowHeights[ it->m_nY ] ) 870*cdf0e10cSrcweir o_rRowHeights[ it->m_nY ] = aSize.Height(); 871*cdf0e10cSrcweir if( it->m_nExpandPriority > o_rColumnPrio[ it->m_nX ] ) 872*cdf0e10cSrcweir o_rColumnPrio[ it->m_nX ] = it->m_nExpandPriority; 873*cdf0e10cSrcweir if( it->m_nExpandPriority > o_rRowPrio[ it->m_nY ] ) 874*cdf0e10cSrcweir o_rRowPrio[ it->m_nY ] = it->m_nExpandPriority; 875*cdf0e10cSrcweir } 876*cdf0e10cSrcweir 877*cdf0e10cSrcweir // add up sizes 878*cdf0e10cSrcweir long nDistanceX = getBorderValue( m_nBorderX ); 879*cdf0e10cSrcweir long nDistanceY = getBorderValue( m_nBorderY ); 880*cdf0e10cSrcweir for( sal_uInt32 i = 0; i < nColumns; i++ ) 881*cdf0e10cSrcweir aMatrixSize.Width() += o_rColumnWidths[i] + nDistanceX; 882*cdf0e10cSrcweir if( nColumns > 0 ) 883*cdf0e10cSrcweir aMatrixSize.Width() -= nDistanceX; 884*cdf0e10cSrcweir 885*cdf0e10cSrcweir for( sal_uInt32 i = 0; i < nRows; i++ ) 886*cdf0e10cSrcweir aMatrixSize.Height() += o_rRowHeights[i] + nDistanceY; 887*cdf0e10cSrcweir if( nRows > 0 ) 888*cdf0e10cSrcweir aMatrixSize.Height() -= nDistanceY; 889*cdf0e10cSrcweir 890*cdf0e10cSrcweir return aMatrixSize; 891*cdf0e10cSrcweir } 892*cdf0e10cSrcweir 893*cdf0e10cSrcweir Size MatrixArranger::getOptimalSize( WindowSizeType i_eType ) const 894*cdf0e10cSrcweir { 895*cdf0e10cSrcweir std::vector<long> aColumnWidths, aRowHeights; 896*cdf0e10cSrcweir std::vector<sal_Int32> aColumnPrio, aRowPrio; 897*cdf0e10cSrcweir return getOptimalSize( i_eType, aColumnWidths, aRowHeights, aColumnPrio, aRowPrio ); 898*cdf0e10cSrcweir } 899*cdf0e10cSrcweir 900*cdf0e10cSrcweir void MatrixArranger::distributeExtraSize( std::vector<long>& io_rSizes, const std::vector<sal_Int32>& i_rPrios, long i_nExtraWidth ) 901*cdf0e10cSrcweir { 902*cdf0e10cSrcweir if( ! io_rSizes.empty() && io_rSizes.size() == i_rPrios.size() ) // sanity check 903*cdf0e10cSrcweir { 904*cdf0e10cSrcweir // find all elements with the highest expand priority 905*cdf0e10cSrcweir size_t nElements = io_rSizes.size(); 906*cdf0e10cSrcweir std::vector< size_t > aIndices; 907*cdf0e10cSrcweir sal_Int32 nHighPrio = 0; 908*cdf0e10cSrcweir for( size_t i = 0; i < nElements; i++ ) 909*cdf0e10cSrcweir { 910*cdf0e10cSrcweir sal_Int32 nCurPrio = i_rPrios[ i ]; 911*cdf0e10cSrcweir if( nCurPrio > nHighPrio ) 912*cdf0e10cSrcweir { 913*cdf0e10cSrcweir aIndices.clear(); 914*cdf0e10cSrcweir nHighPrio = nCurPrio; 915*cdf0e10cSrcweir } 916*cdf0e10cSrcweir if( nCurPrio == nHighPrio ) 917*cdf0e10cSrcweir aIndices.push_back( i ); 918*cdf0e10cSrcweir } 919*cdf0e10cSrcweir 920*cdf0e10cSrcweir // distribute extra space evenly among collected elements 921*cdf0e10cSrcweir nElements = aIndices.size(); 922*cdf0e10cSrcweir if( nElements > 0 ) 923*cdf0e10cSrcweir { 924*cdf0e10cSrcweir long nDelta = i_nExtraWidth / nElements; 925*cdf0e10cSrcweir for( size_t i = 0; i < nElements; i++ ) 926*cdf0e10cSrcweir { 927*cdf0e10cSrcweir io_rSizes[ aIndices[i] ] += nDelta; 928*cdf0e10cSrcweir i_nExtraWidth -= nDelta; 929*cdf0e10cSrcweir } 930*cdf0e10cSrcweir // add the last pixels to the last row element 931*cdf0e10cSrcweir if( i_nExtraWidth > 0 && nElements > 0 ) 932*cdf0e10cSrcweir io_rSizes[aIndices.back()] += i_nExtraWidth; 933*cdf0e10cSrcweir } 934*cdf0e10cSrcweir } 935*cdf0e10cSrcweir } 936*cdf0e10cSrcweir 937*cdf0e10cSrcweir 938*cdf0e10cSrcweir void MatrixArranger::resize() 939*cdf0e10cSrcweir { 940*cdf0e10cSrcweir // assure that we have at least one row and column 941*cdf0e10cSrcweir if( m_aElements.empty() ) 942*cdf0e10cSrcweir return; 943*cdf0e10cSrcweir 944*cdf0e10cSrcweir // check if we can get optimal size, else fallback to minimal size 945*cdf0e10cSrcweir std::vector<long> aColumnWidths, aRowHeights; 946*cdf0e10cSrcweir std::vector<sal_Int32> aColumnPrio, aRowPrio; 947*cdf0e10cSrcweir Size aOptSize( getOptimalSize( WINDOWSIZE_PREFERRED, aColumnWidths, aRowHeights, aColumnPrio, aRowPrio ) ); 948*cdf0e10cSrcweir if( aOptSize.Height() > m_aManagedArea.GetHeight() || 949*cdf0e10cSrcweir aOptSize.Width() > m_aManagedArea.GetWidth() ) 950*cdf0e10cSrcweir { 951*cdf0e10cSrcweir std::vector<long> aMinColumnWidths, aMinRowHeights; 952*cdf0e10cSrcweir getOptimalSize( WINDOWSIZE_MINIMUM, aMinColumnWidths, aMinRowHeights, aColumnPrio, aRowPrio ); 953*cdf0e10cSrcweir if( aOptSize.Height() > m_aManagedArea.GetHeight() ) 954*cdf0e10cSrcweir aRowHeights = aMinRowHeights; 955*cdf0e10cSrcweir if( aOptSize.Width() > m_aManagedArea.GetWidth() ) 956*cdf0e10cSrcweir aColumnWidths = aMinColumnWidths; 957*cdf0e10cSrcweir } 958*cdf0e10cSrcweir 959*cdf0e10cSrcweir // distribute extra space available 960*cdf0e10cSrcweir long nExtraSize = m_aManagedArea.GetWidth(); 961*cdf0e10cSrcweir for( size_t i = 0; i < aColumnWidths.size(); ++i ) 962*cdf0e10cSrcweir nExtraSize -= aColumnWidths[i] + m_nBorderX; 963*cdf0e10cSrcweir if( nExtraSize > 0 ) 964*cdf0e10cSrcweir distributeExtraSize( aColumnWidths, aColumnPrio, nExtraSize ); 965*cdf0e10cSrcweir nExtraSize = m_aManagedArea.GetHeight(); 966*cdf0e10cSrcweir for( size_t i = 0; i < aRowHeights.size(); ++i ) 967*cdf0e10cSrcweir nExtraSize -= aRowHeights[i] + m_nBorderY; 968*cdf0e10cSrcweir if( nExtraSize > 0 ) 969*cdf0e10cSrcweir distributeExtraSize( aRowHeights, aRowPrio, nExtraSize ); 970*cdf0e10cSrcweir 971*cdf0e10cSrcweir // prepare offsets 972*cdf0e10cSrcweir long nDistanceX = getBorderValue( m_nBorderX ); 973*cdf0e10cSrcweir long nDistanceY = getBorderValue( m_nBorderY ); 974*cdf0e10cSrcweir long nOuterBorder = getBorderValue( m_nOuterBorder ); 975*cdf0e10cSrcweir std::vector<long> aColumnX( aColumnWidths.size() ); 976*cdf0e10cSrcweir aColumnX[0] = m_aManagedArea.Left() + nOuterBorder; 977*cdf0e10cSrcweir for( size_t i = 1; i < aColumnX.size(); i++ ) 978*cdf0e10cSrcweir aColumnX[i] = aColumnX[i-1] + aColumnWidths[i-1] + nDistanceX; 979*cdf0e10cSrcweir 980*cdf0e10cSrcweir std::vector<long> aRowY( aRowHeights.size() ); 981*cdf0e10cSrcweir aRowY[0] = m_aManagedArea.Top() + nOuterBorder; 982*cdf0e10cSrcweir for( size_t i = 1; i < aRowY.size(); i++ ) 983*cdf0e10cSrcweir aRowY[i] = aRowY[i-1] + aRowHeights[i-1] + nDistanceY; 984*cdf0e10cSrcweir 985*cdf0e10cSrcweir // now iterate over the elements and assign their positions 986*cdf0e10cSrcweir for( std::vector< MatrixElement >::iterator it = m_aElements.begin(); 987*cdf0e10cSrcweir it != m_aElements.end(); ++it ) 988*cdf0e10cSrcweir { 989*cdf0e10cSrcweir Point aCellPos( aColumnX[it->m_nX], aRowY[it->m_nY] ); 990*cdf0e10cSrcweir Size aCellSize( aColumnWidths[it->m_nX], aRowHeights[it->m_nY] ); 991*cdf0e10cSrcweir it->setPosSize( aCellPos, aCellSize ); 992*cdf0e10cSrcweir } 993*cdf0e10cSrcweir } 994*cdf0e10cSrcweir 995*cdf0e10cSrcweir size_t MatrixArranger::addWindow( Window* i_pWindow, sal_uInt32 i_nX, sal_uInt32 i_nY, sal_Int32 i_nExpandPrio, const Size& i_rMinSize ) 996*cdf0e10cSrcweir { 997*cdf0e10cSrcweir sal_uInt64 nMapValue = getMap( i_nX, i_nY ); 998*cdf0e10cSrcweir std::map< sal_uInt64, size_t >::const_iterator it = m_aMatrixMap.find( nMapValue ); 999*cdf0e10cSrcweir size_t nIndex = 0; 1000*cdf0e10cSrcweir if( it == m_aMatrixMap.end() ) 1001*cdf0e10cSrcweir { 1002*cdf0e10cSrcweir m_aMatrixMap[ nMapValue ] = nIndex = m_aElements.size(); 1003*cdf0e10cSrcweir m_aElements.push_back( MatrixElement( i_pWindow, i_nX, i_nY, boost::shared_ptr<WindowArranger>(), i_nExpandPrio, i_rMinSize ) ); 1004*cdf0e10cSrcweir } 1005*cdf0e10cSrcweir else 1006*cdf0e10cSrcweir { 1007*cdf0e10cSrcweir MatrixElement& rEle( m_aElements[ it->second ] ); 1008*cdf0e10cSrcweir rEle.m_pElement = i_pWindow; 1009*cdf0e10cSrcweir rEle.m_pChild.reset(); 1010*cdf0e10cSrcweir rEle.m_nExpandPriority = i_nExpandPrio; 1011*cdf0e10cSrcweir rEle.m_aMinSize = i_rMinSize; 1012*cdf0e10cSrcweir rEle.m_nX = i_nX; 1013*cdf0e10cSrcweir rEle.m_nY = i_nY; 1014*cdf0e10cSrcweir nIndex = it->second; 1015*cdf0e10cSrcweir } 1016*cdf0e10cSrcweir return nIndex; 1017*cdf0e10cSrcweir } 1018*cdf0e10cSrcweir 1019*cdf0e10cSrcweir void MatrixArranger::remove( Window* i_pWindow ) 1020*cdf0e10cSrcweir { 1021*cdf0e10cSrcweir if( i_pWindow ) 1022*cdf0e10cSrcweir { 1023*cdf0e10cSrcweir for( std::vector< MatrixElement >::iterator it = m_aElements.begin(); 1024*cdf0e10cSrcweir it != m_aElements.end(); ++it ) 1025*cdf0e10cSrcweir { 1026*cdf0e10cSrcweir if( it->m_pElement == i_pWindow ) 1027*cdf0e10cSrcweir { 1028*cdf0e10cSrcweir m_aMatrixMap.erase( getMap( it->m_nX, it->m_nY ) ); 1029*cdf0e10cSrcweir m_aElements.erase( it ); 1030*cdf0e10cSrcweir return; 1031*cdf0e10cSrcweir } 1032*cdf0e10cSrcweir } 1033*cdf0e10cSrcweir } 1034*cdf0e10cSrcweir } 1035*cdf0e10cSrcweir 1036*cdf0e10cSrcweir size_t MatrixArranger::addChild( boost::shared_ptr<WindowArranger> const &i_pChild, sal_uInt32 i_nX, sal_uInt32 i_nY, sal_Int32 i_nExpandPrio ) 1037*cdf0e10cSrcweir { 1038*cdf0e10cSrcweir sal_uInt64 nMapValue = getMap( i_nX, i_nY ); 1039*cdf0e10cSrcweir std::map< sal_uInt64, size_t >::const_iterator it = m_aMatrixMap.find( nMapValue ); 1040*cdf0e10cSrcweir size_t nIndex = 0; 1041*cdf0e10cSrcweir if( it == m_aMatrixMap.end() ) 1042*cdf0e10cSrcweir { 1043*cdf0e10cSrcweir m_aMatrixMap[ nMapValue ] = nIndex = m_aElements.size(); 1044*cdf0e10cSrcweir m_aElements.push_back( MatrixElement( NULL, i_nX, i_nY, i_pChild, i_nExpandPrio ) ); 1045*cdf0e10cSrcweir } 1046*cdf0e10cSrcweir else 1047*cdf0e10cSrcweir { 1048*cdf0e10cSrcweir MatrixElement& rEle( m_aElements[ it->second ] ); 1049*cdf0e10cSrcweir rEle.m_pElement = 0; 1050*cdf0e10cSrcweir rEle.m_pChild = i_pChild; 1051*cdf0e10cSrcweir rEle.m_nExpandPriority = i_nExpandPrio; 1052*cdf0e10cSrcweir rEle.m_nX = i_nX; 1053*cdf0e10cSrcweir rEle.m_nY = i_nY; 1054*cdf0e10cSrcweir nIndex = it->second; 1055*cdf0e10cSrcweir } 1056*cdf0e10cSrcweir return nIndex; 1057*cdf0e10cSrcweir } 1058*cdf0e10cSrcweir 1059*cdf0e10cSrcweir void MatrixArranger::remove( boost::shared_ptr<WindowArranger> const &i_pChild ) 1060*cdf0e10cSrcweir { 1061*cdf0e10cSrcweir if( i_pChild ) 1062*cdf0e10cSrcweir { 1063*cdf0e10cSrcweir for( std::vector< MatrixElement >::iterator it = m_aElements.begin(); 1064*cdf0e10cSrcweir it != m_aElements.end(); ++it ) 1065*cdf0e10cSrcweir { 1066*cdf0e10cSrcweir if( it->m_pChild == i_pChild ) 1067*cdf0e10cSrcweir { 1068*cdf0e10cSrcweir m_aMatrixMap.erase( getMap( it->m_nX, it->m_nY ) ); 1069*cdf0e10cSrcweir m_aElements.erase( it ); 1070*cdf0e10cSrcweir return; 1071*cdf0e10cSrcweir } 1072*cdf0e10cSrcweir } 1073*cdf0e10cSrcweir } 1074*cdf0e10cSrcweir } 1075*cdf0e10cSrcweir 1076