/************************************************************** * * 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_sd.hxx" #include "DialogListBox.hxx" namespace sd { DialogListBox::DialogListBox( Window* pParent, WinBits nWinStyle ) : Control( pParent, nWinStyle ), mpChild( 0 ) { mpVScrollBar = new ScrollBar( this, WB_VSCROLL | WB_DRAG ); mpHScrollBar = new ScrollBar( this, WB_HSCROLL | WB_DRAG ); mpScrollBarBox = new ScrollBarBox( this ); Link aLink( LINK( this, DialogListBox, ScrollBarHdl ) ); mpVScrollBar->SetScrollHdl( aLink ); mpHScrollBar->SetScrollHdl( aLink ); mbVScroll = false; mbHScroll = false; mbAutoHScroll = ( nWinStyle & WB_AUTOHSCROLL ) ? true : false; } // ----------------------------------------------------------------------- DialogListBox::~DialogListBox() { delete mpHScrollBar; delete mpVScrollBar; delete mpScrollBarBox; delete mpChild; } // ----------------------------------------------------------------------- void DialogListBox::SetChildWindow( Window* pChild, const Size& rMinSize ) { if( mpChild ) delete mpChild; mpChild = pChild; maMinSize = rMinSize; ImplResizeControls(); ImplCheckScrollBars(); } // ----------------------------------------------------------------------- void DialogListBox::GetFocus() { if( mpChild ) mpChild->GrabFocus(); } // ----------------------------------------------------------------------- ::Window* DialogListBox::GetPreferredKeyInputWindow() { if( mpChild ) return mpChild; else return this; } // ----------------------------------------------------------------------- void DialogListBox::Resize() { Control::Resize(); ImplResizeControls(); ImplCheckScrollBars(); } // ----------------------------------------------------------------------- IMPL_LINK( DialogListBox, ScrollBarHdl, ScrollBar*, EMPTYARG ) { ImplResizeChild(); return 1; } // ----------------------------------------------------------------------- void DialogListBox::ImplCheckScrollBars() { bool bArrange = false; Size aOutSz = GetOutputSizePixel(); // vert. ScrollBar if( aOutSz.Height() < maMinSize.Height() ) { if( !mbVScroll ) bArrange = true; mbVScroll = true; } else { if( mbVScroll ) bArrange = true; mbVScroll = false; } // horz. ScrollBar if( mbAutoHScroll ) { long nWidth = aOutSz.Width(); if ( mbVScroll ) nWidth -= mpVScrollBar->GetSizePixel().Width(); if( nWidth < maMinSize.Width() ) { if( !mbHScroll ) bArrange = true; mbHScroll = true; if ( !mbVScroll ) { int nHeight = aOutSz.Height() - mpHScrollBar->GetSizePixel().Height(); if( nHeight < maMinSize.Height() ) { if( !mbVScroll ) bArrange = true; mbVScroll = true; } } } else { if( mbHScroll ) bArrange = true; mbHScroll = false; } } if( bArrange ) ImplResizeControls(); ImplInitScrollBars(); } // ----------------------------------------------------------------------- void DialogListBox::ImplInitScrollBars() { if( mpChild ) { Size aOutSize( GetOutputSizePixel() ); if( mbHScroll ) aOutSize.Height() -= mpHScrollBar->GetSizePixel().Height(); if( mbVScroll ) aOutSize.Width() -= mpVScrollBar->GetSizePixel().Width(); if ( mbVScroll ) { mpVScrollBar->SetRangeMax( maMinSize.Height() ); mpVScrollBar->SetVisibleSize( aOutSize.Height() ); mpVScrollBar->SetPageSize( 16 ); } if ( mbHScroll ) { mpHScrollBar->SetRangeMax( maMinSize.Width() ); mpHScrollBar->SetVisibleSize( aOutSize.Width() ); mpHScrollBar->SetPageSize( 16 ); } } } // ----------------------------------------------------------------------- void DialogListBox::ImplResizeControls() { Size aOutSz( GetOutputSizePixel() ); long nSBWidth = GetSettings().GetStyleSettings().GetScrollBarSize(); nSBWidth = CalcZoom( nSBWidth ); maInnerSize = aOutSz; if ( mbVScroll ) maInnerSize.Width() -= nSBWidth; if ( mbHScroll ) maInnerSize.Height() -= nSBWidth; // ScrollBarBox if( mbVScroll && mbHScroll ) { Point aBoxPos( maInnerSize.Width(), maInnerSize.Height() ); mpScrollBarBox->SetPosSizePixel( aBoxPos, Size( nSBWidth, nSBWidth ) ); mpScrollBarBox->Show(); } else { mpScrollBarBox->Hide(); } // vert. ScrollBar if( mbVScroll ) { // Scrollbar on left or right side? Point aVPos( aOutSz.Width() - nSBWidth, 0 ); mpVScrollBar->SetPosSizePixel( aVPos, Size( nSBWidth, maInnerSize.Height() ) ); mpVScrollBar->Show(); } else { mpVScrollBar->Hide(); } // horz. ScrollBar if( mbHScroll ) { Point aHPos( 0, aOutSz.Height() - nSBWidth ); mpHScrollBar->SetPosSizePixel( aHPos, Size( maInnerSize.Width(), nSBWidth ) ); mpHScrollBar->Show(); } else { mpHScrollBar->Hide(); } ImplResizeChild(); } void DialogListBox::ImplResizeChild() { Point aWinPos; Size aSize( maInnerSize ); int nOffset; if( mbHScroll ) { nOffset = mpHScrollBar->GetThumbPos(); aWinPos.X() = -nOffset; aSize.Width() += nOffset; } if( mbVScroll ) { nOffset = mpVScrollBar->GetThumbPos(); aWinPos.Y() = -nOffset; aSize.Height() += nOffset; } mpChild->SetPosSizePixel( aWinPos, aSize ); } // ----------------------------------------------------------------------- void DialogListBox::StateChanged( StateChangedType nType ) { if ( nType == STATE_CHANGE_INITSHOW ) { ImplCheckScrollBars(); } else if ( ( nType == STATE_CHANGE_UPDATEMODE ) || ( nType == STATE_CHANGE_DATA ) ) { sal_Bool bUpdate = IsUpdateMode(); mpChild->SetUpdateMode( bUpdate ); if ( bUpdate && IsReallyVisible() ) ImplCheckScrollBars(); } else if( nType == STATE_CHANGE_ENABLE ) { mpHScrollBar->Enable( IsEnabled() ); mpVScrollBar->Enable( IsEnabled() ); mpScrollBarBox->Enable( IsEnabled() ); Invalidate(); } else if ( nType == STATE_CHANGE_ZOOM ) { mpChild->SetZoom( GetZoom() ); Resize(); } else if ( nType == STATE_CHANGE_CONTROLFONT ) { mpChild->SetControlFont( GetControlFont() ); } else if ( nType == STATE_CHANGE_CONTROLFOREGROUND ) { mpChild->SetControlForeground( GetControlForeground() ); } else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) { mpChild->SetControlBackground( GetControlBackground() ); } else if( nType == STATE_CHANGE_VISIBLE ) { mpChild->Show( IsVisible() ); } Control::StateChanged( nType ); } // ----------------------------------------------------------------------- long DialogListBox::Notify( NotifyEvent& rNEvt ) { long nDone = 0; if ( rNEvt.GetType() == EVENT_COMMAND ) { const CommandEvent& rCEvt = *rNEvt.GetCommandEvent(); if ( rCEvt.GetCommand() == COMMAND_WHEEL ) { const CommandWheelData* pData = rCEvt.GetWheelData(); if( !pData->GetModifier() && ( pData->GetMode() == COMMAND_WHEEL_SCROLL ) ) { nDone = HandleScrollCommand( rCEvt, mpHScrollBar, mpVScrollBar ); } } } return nDone ? nDone : Window::Notify( rNEvt ); } } // namespace sd