2012-09-03 15:03:03 +01:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
#include <toolkit/awt/scrollabledialog.hxx>
|
|
|
|
namespace toolkit
|
|
|
|
{
|
|
|
|
|
2012-09-04 20:12:45 +01:00
|
|
|
ScrollableDialog::ScrollableDialog( Window* pParent, WinBits nStyle ) : Dialog( pParent, nStyle | ~( WB_HSCROLL | WB_VSCROLL ) ), maHScrollBar( this, WB_HSCROLL | WB_DRAG), maVScrollBar( this, WB_VSCROLL | WB_DRAG ), mbHasHoriBar( false ), mbHasVertBar( false ), maScrollVis( None )
|
2012-09-03 15:03:03 +01:00
|
|
|
{
|
|
|
|
Link aLink( LINK( this, ScrollableDialog, ScrollBarHdl ) );
|
|
|
|
maVScrollBar.SetScrollHdl( aLink );
|
|
|
|
maHScrollBar.SetScrollHdl( aLink );
|
2012-09-04 20:12:45 +01:00
|
|
|
|
|
|
|
Size aOutSz = GetOutputSizePixel();
|
|
|
|
ScrollBarVisibility aVis = None;
|
|
|
|
|
|
|
|
if ( nStyle & ( WB_HSCROLL | WB_VSCROLL ) )
|
|
|
|
{
|
|
|
|
if ( nStyle & WB_HSCROLL )
|
|
|
|
aVis = Hori;
|
|
|
|
if ( nStyle & WB_VSCROLL )
|
|
|
|
{
|
|
|
|
if ( aVis == Hori )
|
|
|
|
aVis = Both;
|
|
|
|
else
|
|
|
|
aVis = Vert;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
setScrollVisibility( aVis );
|
|
|
|
mnScrWidth = GetSettings().GetStyleSettings().GetScrollBarSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScrollableDialog::setScrollVisibility( ScrollBarVisibility rVisState )
|
|
|
|
{
|
|
|
|
maScrollVis = rVisState;
|
|
|
|
if ( maScrollVis == Hori || maScrollVis == Both )
|
|
|
|
mbHasHoriBar = true;
|
|
|
|
if ( maScrollVis == Vert || maScrollVis == Both )
|
|
|
|
mbHasVertBar = true;
|
|
|
|
if ( mbHasVertBar )
|
|
|
|
maVScrollBar.Show();
|
|
|
|
if ( mbHasHoriBar )
|
|
|
|
maHScrollBar.Show();
|
|
|
|
if ( mbHasHoriBar || mbHasVertBar )
|
|
|
|
SetStyle( GetStyle() | WB_CLIPCHILDREN | SCROLL_UPDATE );
|
2012-09-03 15:03:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
ScrollableDialog::~ScrollableDialog()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Window* ScrollableDialog::getContentWindow()
|
|
|
|
{
|
2012-09-04 20:12:45 +01:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScrollableDialog::lcl_Scroll( long nX, long nY )
|
|
|
|
{
|
|
|
|
long nXScroll = mnScrollPos.Y() - nX;
|
|
|
|
long nYScroll = mnScrollPos.X() - nY;
|
|
|
|
|
|
|
|
mnScrollPos = Point( nX, nY );
|
|
|
|
|
|
|
|
Rectangle aScrollableArea( 0, 0, maScrollArea.Width(), maScrollArea.Height() );
|
|
|
|
Window::Scroll(nXScroll, nYScroll, aScrollableArea );
|
|
|
|
// Manually scroll all children ( except the scrollbars )
|
|
|
|
for ( int index = 0; index < GetChildCount(); ++index )
|
|
|
|
{
|
|
|
|
Window* pChild = GetChild( index );
|
|
|
|
if ( pChild && pChild != &maVScrollBar && pChild != &maHScrollBar )
|
|
|
|
{
|
|
|
|
Point aPos = pChild->GetPosPixel();
|
|
|
|
aPos += Point( nXScroll, nYScroll );
|
|
|
|
pChild->SetPosPixel( aPos );
|
|
|
|
}
|
|
|
|
}
|
2012-09-03 15:03:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
IMPL_LINK( ScrollableDialog, ScrollBarHdl, ScrollBar*, pSB )
|
|
|
|
{
|
|
|
|
sal_uInt16 nPos = (sal_uInt16) pSB->GetThumbPos();
|
2012-09-04 20:12:45 +01:00
|
|
|
if( pSB == &maVScrollBar )
|
|
|
|
Scroll(0, nPos );
|
|
|
|
else if( pSB == &maHScrollBar )
|
|
|
|
lcl_Scroll(nPos, 0 );
|
|
|
|
#if 0
|
|
|
|
sal_uInt16 nPos = (sal_uInt16) pSB->GetThumbPos();
|
|
|
|
Rectangle aScrollableArea( 0, 0, maScrollArea.Width(), maScrollArea.Height() );
|
|
|
|
Point aScroll;
|
2012-09-03 15:03:03 +01:00
|
|
|
if( pSB == &maVScrollBar )
|
|
|
|
{
|
|
|
|
printf("vertical scroll %d\n", nPos );
|
2012-09-04 20:12:45 +01:00
|
|
|
Size aTmpScroll( nPos, nPos );
|
|
|
|
long nScroll = mnScrollPos.Y() - aTmpScroll.Width();
|
|
|
|
// I'm guessing I need to call scroll for ( stuff ) to happen
|
|
|
|
Scroll(0, nScroll, aScrollableArea );
|
2012-09-03 15:03:03 +01:00
|
|
|
mnScrollPos.Y() = nPos;
|
2012-09-04 20:12:45 +01:00
|
|
|
aScroll.Y() = nScroll;
|
2012-09-03 15:03:03 +01:00
|
|
|
}
|
|
|
|
else if( pSB == &maHScrollBar )
|
|
|
|
{
|
|
|
|
printf("horizontal scroll %d\n", nPos );
|
2012-09-04 20:12:45 +01:00
|
|
|
Size aTmpScroll( nPos, nPos );
|
|
|
|
long nScroll = mnScrollPos.X() - aTmpScroll.Width();
|
|
|
|
Scroll( nScroll, 0, aScrollableArea);
|
2012-09-03 15:03:03 +01:00
|
|
|
mnScrollPos.X() = nPos;
|
2012-09-04 20:12:45 +01:00
|
|
|
aScroll.X() = nScroll;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Manually scroll all children ( except the scrollbars )
|
|
|
|
for ( int index = 0; index < GetChildCount(); ++index )
|
|
|
|
{
|
|
|
|
Window* pChild = GetChild( index );
|
|
|
|
if ( pChild && pChild != &maVScrollBar && pChild != &maHScrollBar )
|
|
|
|
{
|
|
|
|
Point aPos = pChild->GetPosPixel();
|
|
|
|
aPos += Point( aScroll.X(), aScroll.Y() );
|
|
|
|
pChild->SetPosPixel( aPos );
|
|
|
|
}
|
2012-09-03 15:03:03 +01:00
|
|
|
}
|
2012-09-04 20:12:45 +01:00
|
|
|
#endif
|
2012-09-03 15:03:03 +01:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2012-09-04 20:12:45 +01:00
|
|
|
void ScrollableDialog::SetScrollWidth( long nWidth )
|
|
|
|
{
|
|
|
|
maScrollArea.Width() = nWidth;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScrollableDialog::SetScrollHeight( long nHeight )
|
|
|
|
{
|
|
|
|
maScrollArea.Height() = nHeight;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScrollableDialog::Paint( const Rectangle& rRect )
|
|
|
|
{
|
|
|
|
printf("ScrollableDialog::Paint( %d, %d, %d, %d width %d height %d\n", rRect.Top(), rRect.Left(), rRect.Right(), rRect.Bottom(),GetSizePixel().Width(), GetSizePixel().Height() );
|
|
|
|
Dialog::Paint( rRect );
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScrollableDialog::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
|
|
|
|
{
|
|
|
|
printf("ScrollableDialog::Draw( ( %d, %d ) h %d, w %d \n", rPos.X(), rPos.Y(), rSize.Height(), rSize.Width() );
|
|
|
|
Dialog::Draw( pDev, rPos, rSize, nFlags );
|
|
|
|
}
|
|
|
|
|
2012-09-03 15:03:03 +01:00
|
|
|
void ScrollableDialog::Resize()
|
|
|
|
{
|
2012-09-04 20:12:45 +01:00
|
|
|
Size aOutSz = GetOutputSizePixel();
|
2012-09-03 15:03:03 +01:00
|
|
|
printf("ScrollableDialog::Resize() - size is width %d height %d\n", GetSizePixel().Width(), GetSizePixel().Height() );
|
|
|
|
// find the output area for the window
|
|
|
|
long nMaxX = GetSizePixel().Width();
|
|
|
|
long nMaxY = GetSizePixel().Height();
|
2012-09-04 20:12:45 +01:00
|
|
|
for ( int index = 0, count = GetChildCount(); index < count; ++index )
|
2012-09-03 15:03:03 +01:00
|
|
|
{
|
2012-09-04 20:12:45 +01:00
|
|
|
Window* pChild = GetChild( index );
|
2012-09-03 15:03:03 +01:00
|
|
|
if ( pChild )
|
|
|
|
{
|
|
|
|
Point aPos = pChild->GetPosPixel();
|
|
|
|
Size aSize = pChild->GetSizePixel();
|
|
|
|
long nX = aPos.X() + aSize.Width();
|
|
|
|
long nY = aPos.Y() + aSize.Height();
|
|
|
|
if ( nX > nMaxX )
|
|
|
|
nMaxX = nX;
|
|
|
|
if ( nY > nMaxY )
|
|
|
|
nMaxY = nY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-04 20:12:45 +01:00
|
|
|
#if 0
|
2012-09-03 15:03:03 +01:00
|
|
|
// assume for the moment that we have both hori & vert scroll bars
|
|
|
|
Size aContentsSize( aOutSz );
|
|
|
|
if ( mbHasVertBar )
|
|
|
|
{
|
2012-09-04 20:12:45 +01:00
|
|
|
aContentsSize.Width() -= mnScrWidth;
|
2012-09-03 15:03:03 +01:00
|
|
|
nMaxX += nScrWidth;
|
|
|
|
}
|
|
|
|
if ( mbHasHoriBar )
|
|
|
|
{
|
2012-09-04 20:12:45 +01:00
|
|
|
aContentsSize.Height() -= mnScrWidth;
|
|
|
|
nMaxY += mnScrWidth;
|
2012-09-03 15:03:03 +01:00
|
|
|
}
|
|
|
|
maContents.SetSizePixel( aContentsSize );
|
2012-09-04 20:12:45 +01:00
|
|
|
#endif
|
2012-09-03 15:03:03 +01:00
|
|
|
|
2012-09-04 20:12:45 +01:00
|
|
|
Point aVPos( aOutSz.Width() - mnScrWidth, 0 );
|
|
|
|
Point aHPos( 0, aOutSz.Height() - mnScrWidth );
|
2012-09-03 15:03:03 +01:00
|
|
|
|
2012-09-04 20:12:45 +01:00
|
|
|
maVScrollBar.SetPosSizePixel( aVPos, Size( mnScrWidth, GetSizePixel().Height() - mnScrWidth ) );
|
|
|
|
maHScrollBar.SetPosSizePixel( aHPos, Size( GetSizePixel().Width() - mnScrWidth, mnScrWidth ) );
|
|
|
|
maHScrollBar.SetRangeMax( maScrollArea.Width() );
|
2012-09-03 15:03:03 +01:00
|
|
|
maHScrollBar.SetVisibleSize( GetSizePixel().Width() );
|
2012-09-04 20:12:45 +01:00
|
|
|
maHScrollBar.SetPageSize( maScrollArea.Width() );
|
|
|
|
maVScrollBar.SetRangeMax( maScrollArea.Height() );
|
2012-09-03 15:03:03 +01:00
|
|
|
maVScrollBar.SetVisibleSize( GetSizePixel().Height() );
|
2012-09-04 20:12:45 +01:00
|
|
|
maVScrollBar.SetPageSize( maScrollArea.Height() );
|
2012-09-03 15:03:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
} // toolkit
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|