1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #include "vclxscroller.hxx"
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include <assert.h>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/PosSize.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/ScrollBarOrientation.hpp>
29*b1cdbd2cSJim Jagielski #include <sal/macros.h>
30*b1cdbd2cSJim Jagielski #include <toolkit/helper/property.hxx>
31*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
32*b1cdbd2cSJim Jagielski #include <vcl/scrbar.hxx>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include "forward.hxx"
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski namespace layoutimpl
37*b1cdbd2cSJim Jagielski {
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
40*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::awt;
41*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
42*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
43*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
44*b1cdbd2cSJim Jagielski 
DBG_NAME(VCLXScroller)45*b1cdbd2cSJim Jagielski DBG_NAME( VCLXScroller )
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski VCLXScroller::VCLXScroller()
48*b1cdbd2cSJim Jagielski   : VCLXWindow()
49*b1cdbd2cSJim Jagielski   , Bin()
50*b1cdbd2cSJim Jagielski {
51*b1cdbd2cSJim Jagielski     DBG_CTOR( VCLXScroller, NULL );
52*b1cdbd2cSJim Jagielski     mpHorScrollBar = mpVerScrollBar = 0;
53*b1cdbd2cSJim Jagielski }
54*b1cdbd2cSJim Jagielski 
~VCLXScroller()55*b1cdbd2cSJim Jagielski VCLXScroller::~VCLXScroller()
56*b1cdbd2cSJim Jagielski {
57*b1cdbd2cSJim Jagielski     DBG_DTOR( VCLXScroller, NULL );
58*b1cdbd2cSJim Jagielski }
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski IMPLEMENT_2_FORWARD_XINTERFACE1( VCLXScroller, VCLXWindow, Container );
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski IMPLEMENT_FORWARD_XTYPEPROVIDER1( VCLXScroller, VCLXWindow );
63*b1cdbd2cSJim Jagielski 
dispose()64*b1cdbd2cSJim Jagielski void SAL_CALL VCLXScroller::dispose() throw(RuntimeException)
65*b1cdbd2cSJim Jagielski {
66*b1cdbd2cSJim Jagielski     {
67*b1cdbd2cSJim Jagielski         ::vos::OGuard aGuard( GetMutex() );
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski         EventObject aDisposeEvent;
70*b1cdbd2cSJim Jagielski         aDisposeEvent.Source = W3K_EXPLICIT_CAST (*this);
71*b1cdbd2cSJim Jagielski //            maTabListeners.disposeAndClear( aDisposeEvent );
72*b1cdbd2cSJim Jagielski     }
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski     VCLXWindow::dispose();
75*b1cdbd2cSJim Jagielski }
76*b1cdbd2cSJim Jagielski 
ensureScrollBars()77*b1cdbd2cSJim Jagielski void VCLXScroller::ensureScrollBars()
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski     if ( !mpVerScrollBar )
81*b1cdbd2cSJim Jagielski     {
82*b1cdbd2cSJim Jagielski         mpVerScrollBar = new ScrollBar( GetWindow() , WB_VERT );
83*b1cdbd2cSJim Jagielski         mpVerScrollBar->SetLineSize( 4 );
84*b1cdbd2cSJim Jagielski         mpVerScrollBar->SetPageSize( 15 );
85*b1cdbd2cSJim Jagielski         mpVerScrollBar->Show();
86*b1cdbd2cSJim Jagielski         mpVerScrollBar->SetScrollHdl( LINK( this, VCLXScroller, ScrollHdl ) );
87*b1cdbd2cSJim Jagielski     }
88*b1cdbd2cSJim Jagielski     if ( !mpHorScrollBar )
89*b1cdbd2cSJim Jagielski     {
90*b1cdbd2cSJim Jagielski         mpHorScrollBar = new ScrollBar( GetWindow() , WB_HORZ );
91*b1cdbd2cSJim Jagielski         mpHorScrollBar->SetLineSize( 4 );
92*b1cdbd2cSJim Jagielski         mpHorScrollBar->SetPageSize( 15 );
93*b1cdbd2cSJim Jagielski         mpHorScrollBar->Show();
94*b1cdbd2cSJim Jagielski         mpHorScrollBar->SetScrollHdl( LINK( this, VCLXScroller, ScrollHdl ) );
95*b1cdbd2cSJim Jagielski     } //        mpContent = new FixedImage( this, ImplGetWinBits( WindowAttributes, 0 ) );
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski }
98*b1cdbd2cSJim Jagielski 
allocateArea(const::com::sun::star::awt::Rectangle & rArea)99*b1cdbd2cSJim Jagielski void SAL_CALL VCLXScroller::allocateArea(
100*b1cdbd2cSJim Jagielski     const ::com::sun::star::awt::Rectangle &rArea )
101*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
102*b1cdbd2cSJim Jagielski {
103*b1cdbd2cSJim Jagielski     ensureScrollBars();        // shouldn't be needed
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski     maAllocation = rArea;
106*b1cdbd2cSJim Jagielski     setPosSize( rArea.X, rArea.Y, rArea.Width, rArea.Height, PosSize::POSSIZE );
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski     mpHorScrollBar->SetRangeMin( 0 );
109*b1cdbd2cSJim Jagielski     mpHorScrollBar->SetRangeMax( SAL_MAX( maChildRequisition.Width - rArea.Width, 0 ) );
110*b1cdbd2cSJim Jagielski     mpVerScrollBar->SetRangeMin( 0 );
111*b1cdbd2cSJim Jagielski     mpVerScrollBar->SetRangeMax( SAL_MAX( maChildRequisition.Height - rArea.Height, 0 ) );
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski     int thumbX = mpHorScrollBar->GetThumbPos();
114*b1cdbd2cSJim Jagielski     int thumbY = mpVerScrollBar->GetThumbPos();
115*b1cdbd2cSJim Jagielski     int thumbWidth = mpVerScrollBar->GetSizePixel().getWidth();
116*b1cdbd2cSJim Jagielski     int thumbHeight = mpHorScrollBar->GetSizePixel().getHeight();
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski     mpHorScrollBar->SetPosSizePixel( rArea.X, rArea.Y + rArea.Height - thumbHeight - 2,
119*b1cdbd2cSJim Jagielski                                      rArea.Width - thumbWidth, thumbHeight );
120*b1cdbd2cSJim Jagielski     mpVerScrollBar->SetPosSizePixel( rArea.X + rArea.Width - thumbWidth - 2, rArea.Y-2,
121*b1cdbd2cSJim Jagielski                                      thumbWidth, rArea.Height - thumbHeight );
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski     awt::Rectangle childRect( rArea.X - thumbX, rArea.Y - thumbY,
124*b1cdbd2cSJim Jagielski                               SAL_MAX( maChildRequisition.Width, rArea.Width ) - thumbWidth - 4,
125*b1cdbd2cSJim Jagielski                               SAL_MAX( maChildRequisition.Height, rArea.Height ) - thumbHeight - 4 );
126*b1cdbd2cSJim Jagielski     if ( mxChild.is() )
127*b1cdbd2cSJim Jagielski         allocateChildAt( mxChild, childRect );
128*b1cdbd2cSJim Jagielski }
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski #define MAX_CHILD_REQ 40
getMinimumSize()131*b1cdbd2cSJim Jagielski ::com::sun::star::awt::Size SAL_CALL VCLXScroller::getMinimumSize()
132*b1cdbd2cSJim Jagielski     throw(::com::sun::star::uno::RuntimeException)
133*b1cdbd2cSJim Jagielski {
134*b1cdbd2cSJim Jagielski     ensureScrollBars();
135*b1cdbd2cSJim Jagielski     assert( mpHorScrollBar && mpVerScrollBar );
136*b1cdbd2cSJim Jagielski     awt::Size childSize = Bin::getMinimumSize();
137*b1cdbd2cSJim Jagielski     int thumbWidth = mpVerScrollBar->GetSizePixel().getWidth();
138*b1cdbd2cSJim Jagielski     int thumbHeight = mpHorScrollBar->GetSizePixel().getHeight();
139*b1cdbd2cSJim Jagielski     maRequisition = awt::Size(
140*b1cdbd2cSJim Jagielski         SAL_MIN( MAX_CHILD_REQ, childSize.Width ) + thumbWidth,
141*b1cdbd2cSJim Jagielski         SAL_MIN( MAX_CHILD_REQ, childSize.Height ) + thumbHeight );
142*b1cdbd2cSJim Jagielski     return maRequisition;
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
ProcessWindowEvent(const VclWindowEvent & _rVclWindowEvent)145*b1cdbd2cSJim Jagielski void VCLXScroller::ProcessWindowEvent( const VclWindowEvent& _rVclWindowEvent )
146*b1cdbd2cSJim Jagielski {
147*b1cdbd2cSJim Jagielski /*
148*b1cdbd2cSJim Jagielski     ::vos::OClearableGuard aGuard( GetMutex() );
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski     switch ( _rVclWindowEvent.GetId() )
151*b1cdbd2cSJim Jagielski     {
152*b1cdbd2cSJim Jagielski         default:
153*b1cdbd2cSJim Jagielski             aGuard.clear();
154*b1cdbd2cSJim Jagielski */
155*b1cdbd2cSJim Jagielski             VCLXWindow::ProcessWindowEvent( _rVclWindowEvent );
156*b1cdbd2cSJim Jagielski /*
157*b1cdbd2cSJim Jagielski         break;
158*b1cdbd2cSJim Jagielski     }
159*b1cdbd2cSJim Jagielski */
160*b1cdbd2cSJim Jagielski }
161*b1cdbd2cSJim Jagielski 
setProperty(const::rtl::OUString & PropertyName,const Any & Value)162*b1cdbd2cSJim Jagielski void SAL_CALL VCLXScroller::setProperty( const ::rtl::OUString& PropertyName, const Any &Value ) throw(RuntimeException)
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski     ::vos::OGuard aGuard( GetMutex() );
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski     if ( GetWindow() )
167*b1cdbd2cSJim Jagielski     {
168*b1cdbd2cSJim Jagielski /*
169*b1cdbd2cSJim Jagielski         sal_uInt16 nPropertyId = GetPropertyId( PropertyName );
170*b1cdbd2cSJim Jagielski         switch ( nPropertyId )
171*b1cdbd2cSJim Jagielski         {
172*b1cdbd2cSJim Jagielski             default:
173*b1cdbd2cSJim Jagielski */
174*b1cdbd2cSJim Jagielski                 VCLXWindow::setProperty( PropertyName, Value );
175*b1cdbd2cSJim Jagielski /*
176*b1cdbd2cSJim Jagielski         }
177*b1cdbd2cSJim Jagielski */
178*b1cdbd2cSJim Jagielski     }
179*b1cdbd2cSJim Jagielski }
180*b1cdbd2cSJim Jagielski 
getProperty(const::rtl::OUString & PropertyName)181*b1cdbd2cSJim Jagielski Any SAL_CALL VCLXScroller::getProperty( const ::rtl::OUString& PropertyName ) throw(RuntimeException)
182*b1cdbd2cSJim Jagielski {
183*b1cdbd2cSJim Jagielski     ::vos::OGuard aGuard( GetMutex() );
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     Any aReturn;
186*b1cdbd2cSJim Jagielski     if ( GetWindow() )
187*b1cdbd2cSJim Jagielski     {
188*b1cdbd2cSJim Jagielski /*
189*b1cdbd2cSJim Jagielski         sal_uInt16 nPropertyId = GetPropertyId( PropertyName );
190*b1cdbd2cSJim Jagielski         switch ( nPropertyId )
191*b1cdbd2cSJim Jagielski         {
192*b1cdbd2cSJim Jagielski             default:
193*b1cdbd2cSJim Jagielski */
194*b1cdbd2cSJim Jagielski                 aReturn = VCLXWindow::getProperty( PropertyName );
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski //        }
197*b1cdbd2cSJim Jagielski     }
198*b1cdbd2cSJim Jagielski     return aReturn;
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski 
IMPL_LINK(VCLXScroller,ScrollHdl,ScrollBar *,pScrollBar)201*b1cdbd2cSJim Jagielski IMPL_LINK( VCLXScroller, ScrollHdl, ScrollBar *, pScrollBar )
202*b1cdbd2cSJim Jagielski {
203*b1cdbd2cSJim Jagielski     (void) pScrollBar;
204*b1cdbd2cSJim Jagielski     forceRecalc();
205*b1cdbd2cSJim Jagielski     return 0;
206*b1cdbd2cSJim Jagielski }
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski } // namespace layoutimpl
209