/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" #define _TASKBAR_CXX #include #include #include #include // ======================================================================= TaskButtonBar::TaskButtonBar( Window* pParent, WinBits nWinStyle ) : ToolBox( pParent, nWinStyle | WB_3DLOOK ) { SetAlign( WINDOWALIGN_BOTTOM ); SetButtonType( BUTTON_SYMBOLTEXT ); } // ----------------------------------------------------------------------- TaskButtonBar::~TaskButtonBar() { } // ----------------------------------------------------------------------- void TaskButtonBar::RequestHelp( const HelpEvent& rHEvt ) { ToolBox::RequestHelp( rHEvt ); } // ======================================================================= WindowArrange::WindowArrange() { mpWinList = new List; } // ----------------------------------------------------------------------- WindowArrange::~WindowArrange() { delete mpWinList; } // ----------------------------------------------------------------------- static sal_uInt16 ImplCeilSqareRoot( sal_uInt16 nVal ) { sal_uInt16 i; // Ueberlauf verhindern if ( nVal > 0xFE * 0xFE ) return 0xFE; for ( i=0; i*i < nVal; i++ ) {} return i; } // ----------------------------------------------------------------------- static void ImplPosSizeWindow( Window* pWindow, long nX, long nY, long nWidth, long nHeight ) { if ( nWidth < 32 ) nWidth = 32; if ( nHeight < 24 ) nHeight = 24; pWindow->SetPosSizePixel( nX, nY, nWidth, nHeight ); } // ----------------------------------------------------------------------- void WindowArrange::ImplTile( const Rectangle& rRect ) { sal_uInt16 nCount = (sal_uInt16)mpWinList->Count(); if ( nCount < 3 ) { ImplVert( rRect ); return; } sal_uInt16 i; sal_uInt16 j; sal_uInt16 nCols; sal_uInt16 nRows; sal_uInt16 nActRows; sal_uInt16 nOffset; long nOverWidth; long nOverHeight; Window* pWindow; long nX = rRect.Left(); long nY = rRect.Top(); long nWidth = rRect.GetWidth(); long nHeight = rRect.GetHeight(); long nRectY = nY; long nRectWidth = nWidth; long nRectHeight = nHeight; long nTempWidth; long nTempHeight; nCols = ImplCeilSqareRoot( nCount ); nOffset = (nCols*nCols) - nCount; if ( nOffset >= nCols ) { nRows = nCols -1; nOffset = nOffset - nCols; } else nRows = nCols; nWidth /= nCols; if ( nWidth < 1 ) nWidth = 1; nOverWidth = nRectWidth-(nWidth*nCols); pWindow = (Window*)mpWinList->First(); for ( i = 0; i < nCols; i++ ) { if ( i < nOffset ) nActRows = nRows - 1; else nActRows = nRows; nTempWidth = nWidth; if ( nOverWidth > 0 ) { nTempWidth++; nOverWidth--; } nHeight = nRectHeight / nActRows; if ( nHeight < 1 ) nHeight = 1; nOverHeight = nRectHeight-(nHeight*nActRows); for ( j = 0; j < nActRows; j++ ) { // Ueberhang verteilen nTempHeight = nHeight; if ( nOverHeight > 0 ) { nTempHeight++; nOverHeight--; } ImplPosSizeWindow( pWindow, nX, nY, nTempWidth, nTempHeight ); nY += nTempHeight; pWindow = (Window*)mpWinList->Next(); if ( !pWindow ) break; } nX += nWidth; nY = nRectY; if ( !pWindow ) break; } } // ----------------------------------------------------------------------- void WindowArrange::ImplHorz( const Rectangle& rRect ) { long nCount = (long)mpWinList->Count(); long nX = rRect.Left(); long nY = rRect.Top(); long nWidth = rRect.GetWidth(); long nHeight = rRect.GetHeight(); long nRectHeight = nHeight; long nOver; long nTempHeight; Window* pWindow; nHeight /= nCount; if ( nHeight < 1 ) nHeight = 1; nOver = nRectHeight - (nCount*nHeight); pWindow = (Window*)mpWinList->First(); while ( pWindow ) { nTempHeight = nHeight; if ( nOver > 0 ) { nTempHeight++; nOver--; } ImplPosSizeWindow( pWindow, nX, nY, nWidth, nTempHeight ); nY += nTempHeight; pWindow = (Window*)mpWinList->Next(); } } // ----------------------------------------------------------------------- void WindowArrange::ImplVert( const Rectangle& rRect ) { long nCount = (long)mpWinList->Count(); long nX = rRect.Left(); long nY = rRect.Top(); long nWidth = rRect.GetWidth(); long nHeight = rRect.GetHeight(); long nRectWidth = nWidth; long nOver; long nTempWidth; Window* pWindow; nWidth /= nCount; if ( nWidth < 1 ) nWidth = 1; nOver = nRectWidth - (nCount*nWidth); pWindow = (Window*)mpWinList->First(); while ( pWindow ) { nTempWidth = nWidth; if ( nOver > 0 ) { nTempWidth++; nOver--; } ImplPosSizeWindow( pWindow, nX, nY, nTempWidth, nHeight ); nX += nTempWidth; pWindow = (Window*)mpWinList->Next(); } } // ----------------------------------------------------------------------- void WindowArrange::ImplCascade( const Rectangle& rRect ) { long nX = rRect.Left(); long nY = rRect.Top(); long nWidth = rRect.GetWidth(); long nHeight = rRect.GetHeight(); long nRectWidth = nWidth; long nRectHeight = nHeight; long nOff; long nCascadeWins; sal_Int32 nLeftBorder; sal_Int32 nTopBorder; sal_Int32 nRightBorder; sal_Int32 nBottomBorder; long nStartOverWidth; long nStartOverHeight; long nOverWidth = 0; long nOverHeight = 0; long nTempX; long nTempY; long nTempWidth; long nTempHeight; long i; Window* pWindow; Window* pTempWindow; // Border-Fenster suchen um den Versatz zu ermitteln pTempWindow = (Window*)mpWinList->First(); pTempWindow->GetBorder( nLeftBorder, nTopBorder, nRightBorder, nBottomBorder ); while ( !nTopBorder ) { Window* pBrdWin = pTempWindow->GetWindow( WINDOW_REALPARENT ); if ( !pBrdWin || (pBrdWin->GetWindow( WINDOW_CLIENT ) != pTempWindow) ) break; pTempWindow = pBrdWin; pTempWindow->GetBorder( nLeftBorder, nTopBorder, nRightBorder, nBottomBorder ); } if ( !nTopBorder ) nTopBorder = 22; nOff = nTopBorder; nCascadeWins = nRectHeight / 3 / nOff; if ( !nCascadeWins ) nCascadeWins = 1; nWidth -= nCascadeWins*nOff; nHeight -= nCascadeWins*nOff; if ( nWidth < 1 ) nWidth = 1; if ( nHeight < 1 ) nHeight = 1; nStartOverWidth = nRectWidth-(nWidth+(nCascadeWins*nOff)); nStartOverHeight = nRectHeight-(nHeight+(nCascadeWins*nOff)); i = 0; pWindow = (Window*)mpWinList->First(); while ( pWindow ) { if ( !i ) { nOverWidth = nStartOverWidth; nOverHeight = nStartOverHeight; } // Position nTempX = nX + (i*nOff); nTempY = nY + (i*nOff); // Ueberhang verteilen nTempWidth = nWidth; if ( nOverWidth > 0 ) { nTempWidth++; nOverWidth--; } nTempHeight = nHeight; if ( nOverHeight > 0 ) { nTempHeight++; nOverHeight--; } ImplPosSizeWindow( pWindow, nTempX, nTempY, nTempWidth, nTempHeight ); if ( i < nCascadeWins ) i++; else i = 0; pWindow = (Window*)mpWinList->Next(); } } // ----------------------------------------------------------------------- void WindowArrange::Arrange( sal_uInt16 nType, const Rectangle& rRect ) { if ( !mpWinList->Count() ) return; switch ( nType ) { case WINDOWARRANGE_TILE: ImplTile( rRect ); break; case WINDOWARRANGE_HORZ: ImplHorz( rRect ); break; case WINDOWARRANGE_VERT: ImplVert( rRect ); break; case WINDOWARRANGE_CASCADE: ImplCascade( rRect ); break; } }