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 // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svtools.hxx"
26*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
27*b1cdbd2cSJim Jagielski #include <svtools/brwbox.hxx>
28*b1cdbd2cSJim Jagielski #include "datwin.hxx"
29*b1cdbd2cSJim Jagielski #include <svtools/colorcfg.hxx>
30*b1cdbd2cSJim Jagielski #include <vcl/salgtype.hxx>
31*b1cdbd2cSJim Jagielski
32*b1cdbd2cSJim Jagielski #ifndef GCC
33*b1cdbd2cSJim Jagielski #endif
34*b1cdbd2cSJim Jagielski #include <tools/multisel.hxx>
35*b1cdbd2cSJim Jagielski #include <algorithm>
36*b1cdbd2cSJim Jagielski
37*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::datatransfer;
38*b1cdbd2cSJim Jagielski
39*b1cdbd2cSJim Jagielski #define getDataWindow() ((BrowserDataWin*)pDataWin)
40*b1cdbd2cSJim Jagielski
41*b1cdbd2cSJim Jagielski
42*b1cdbd2cSJim Jagielski //===================================================================
43*b1cdbd2cSJim Jagielski
44*b1cdbd2cSJim Jagielski DBG_NAMEEX(BrowseBox)
45*b1cdbd2cSJim Jagielski
46*b1cdbd2cSJim Jagielski //===================================================================
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski extern const char* BrowseBoxCheckInvariants( const void * pVoid );
49*b1cdbd2cSJim Jagielski
DECLARE_LIST(BrowserColumns,BrowserColumn *)50*b1cdbd2cSJim Jagielski DECLARE_LIST( BrowserColumns, BrowserColumn* )
51*b1cdbd2cSJim Jagielski
52*b1cdbd2cSJim Jagielski //===================================================================
53*b1cdbd2cSJim Jagielski
54*b1cdbd2cSJim Jagielski void BrowseBox::StartDrag( sal_Int8 /* _nAction */, const Point& /* _rPosPixel */ )
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
57*b1cdbd2cSJim Jagielski // not interested in this event
58*b1cdbd2cSJim Jagielski }
59*b1cdbd2cSJim Jagielski
60*b1cdbd2cSJim Jagielski //===================================================================
61*b1cdbd2cSJim Jagielski
AcceptDrop(const AcceptDropEvent & _rEvt)62*b1cdbd2cSJim Jagielski sal_Int8 BrowseBox::AcceptDrop( const AcceptDropEvent& _rEvt )
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski BrowserDataWin* pDataWindow = static_cast<BrowserDataWin*>(pDataWin);
65*b1cdbd2cSJim Jagielski AcceptDropEvent aTransformed( _rEvt );
66*b1cdbd2cSJim Jagielski aTransformed.maPosPixel = pDataWindow->ScreenToOutputPixel( OutputToScreenPixel( _rEvt.maPosPixel ) );
67*b1cdbd2cSJim Jagielski return pDataWindow->AcceptDrop( aTransformed );
68*b1cdbd2cSJim Jagielski }
69*b1cdbd2cSJim Jagielski
70*b1cdbd2cSJim Jagielski //===================================================================
71*b1cdbd2cSJim Jagielski
ExecuteDrop(const ExecuteDropEvent & _rEvt)72*b1cdbd2cSJim Jagielski sal_Int8 BrowseBox::ExecuteDrop( const ExecuteDropEvent& _rEvt )
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski BrowserDataWin* pDataWindow = static_cast<BrowserDataWin*>(pDataWin);
75*b1cdbd2cSJim Jagielski ExecuteDropEvent aTransformed( _rEvt );
76*b1cdbd2cSJim Jagielski aTransformed.maPosPixel = pDataWindow->ScreenToOutputPixel( OutputToScreenPixel( _rEvt.maPosPixel ) );
77*b1cdbd2cSJim Jagielski return pDataWindow->ExecuteDrop( aTransformed );
78*b1cdbd2cSJim Jagielski }
79*b1cdbd2cSJim Jagielski
80*b1cdbd2cSJim Jagielski //===================================================================
81*b1cdbd2cSJim Jagielski
AcceptDrop(const BrowserAcceptDropEvent &)82*b1cdbd2cSJim Jagielski sal_Int8 BrowseBox::AcceptDrop( const BrowserAcceptDropEvent& )
83*b1cdbd2cSJim Jagielski {
84*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
85*b1cdbd2cSJim Jagielski // not interested in this event
86*b1cdbd2cSJim Jagielski return DND_ACTION_NONE;
87*b1cdbd2cSJim Jagielski }
88*b1cdbd2cSJim Jagielski
89*b1cdbd2cSJim Jagielski //===================================================================
90*b1cdbd2cSJim Jagielski
ExecuteDrop(const BrowserExecuteDropEvent &)91*b1cdbd2cSJim Jagielski sal_Int8 BrowseBox::ExecuteDrop( const BrowserExecuteDropEvent& )
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
94*b1cdbd2cSJim Jagielski // not interested in this event
95*b1cdbd2cSJim Jagielski return DND_ACTION_NONE;
96*b1cdbd2cSJim Jagielski }
97*b1cdbd2cSJim Jagielski
98*b1cdbd2cSJim Jagielski //===================================================================
99*b1cdbd2cSJim Jagielski
implGetDataFlavors() const100*b1cdbd2cSJim Jagielski void* BrowseBox::implGetDataFlavors() const
101*b1cdbd2cSJim Jagielski {
102*b1cdbd2cSJim Jagielski if (static_cast<BrowserDataWin*>(pDataWin)->bCallingDropCallback)
103*b1cdbd2cSJim Jagielski return &static_cast<BrowserDataWin*>(pDataWin)->GetDataFlavorExVector();
104*b1cdbd2cSJim Jagielski return &GetDataFlavorExVector();
105*b1cdbd2cSJim Jagielski }
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski //===================================================================
108*b1cdbd2cSJim Jagielski
IsDropFormatSupported(SotFormatStringId _nFormat)109*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::IsDropFormatSupported( SotFormatStringId _nFormat )
110*b1cdbd2cSJim Jagielski {
111*b1cdbd2cSJim Jagielski if ( static_cast< BrowserDataWin* >( pDataWin )->bCallingDropCallback )
112*b1cdbd2cSJim Jagielski return static_cast< BrowserDataWin* >( pDataWin )->IsDropFormatSupported( _nFormat );
113*b1cdbd2cSJim Jagielski
114*b1cdbd2cSJim Jagielski return DropTargetHelper::IsDropFormatSupported( _nFormat );
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski
117*b1cdbd2cSJim Jagielski //===================================================================
118*b1cdbd2cSJim Jagielski
IsDropFormatSupported(SotFormatStringId _nFormat) const119*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::IsDropFormatSupported( SotFormatStringId _nFormat ) const
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski return const_cast< BrowseBox* >( this )->IsDropFormatSupported( _nFormat );
122*b1cdbd2cSJim Jagielski }
123*b1cdbd2cSJim Jagielski
124*b1cdbd2cSJim Jagielski //===================================================================
125*b1cdbd2cSJim Jagielski
IsDropFormatSupported(const DataFlavor & _rFlavor)126*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::IsDropFormatSupported( const DataFlavor& _rFlavor )
127*b1cdbd2cSJim Jagielski {
128*b1cdbd2cSJim Jagielski if ( static_cast< BrowserDataWin* >( pDataWin )->bCallingDropCallback )
129*b1cdbd2cSJim Jagielski return static_cast< BrowserDataWin* >( pDataWin )->IsDropFormatSupported( _rFlavor );
130*b1cdbd2cSJim Jagielski
131*b1cdbd2cSJim Jagielski return DropTargetHelper::IsDropFormatSupported( _rFlavor );
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski
134*b1cdbd2cSJim Jagielski //===================================================================
135*b1cdbd2cSJim Jagielski
IsDropFormatSupported(const DataFlavor & _rFlavor) const136*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::IsDropFormatSupported( const DataFlavor& _rFlavor ) const
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski return const_cast< BrowseBox* >( this )->IsDropFormatSupported( _rFlavor );
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski
141*b1cdbd2cSJim Jagielski //===================================================================
142*b1cdbd2cSJim Jagielski
Command(const CommandEvent & rEvt)143*b1cdbd2cSJim Jagielski void BrowseBox::Command( const CommandEvent& rEvt )
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski if ( !getDataWindow()->bInCommand )
146*b1cdbd2cSJim Jagielski Control::Command( rEvt );
147*b1cdbd2cSJim Jagielski }
148*b1cdbd2cSJim Jagielski
149*b1cdbd2cSJim Jagielski //===================================================================
150*b1cdbd2cSJim Jagielski
IsInCommandEvent() const151*b1cdbd2cSJim Jagielski bool BrowseBox::IsInCommandEvent() const
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski return getDataWindow()->bInCommand;
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski //===================================================================
157*b1cdbd2cSJim Jagielski
StateChanged(StateChangedType nStateChange)158*b1cdbd2cSJim Jagielski void BrowseBox::StateChanged( StateChangedType nStateChange )
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski Control::StateChanged( nStateChange );
161*b1cdbd2cSJim Jagielski
162*b1cdbd2cSJim Jagielski if ( STATE_CHANGE_MIRRORING == nStateChange )
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski getDataWindow()->EnableRTL( IsRTLEnabled() );
165*b1cdbd2cSJim Jagielski
166*b1cdbd2cSJim Jagielski HeaderBar* pHeaderBar = getDataWindow()->pHeaderBar;
167*b1cdbd2cSJim Jagielski if ( pHeaderBar )
168*b1cdbd2cSJim Jagielski pHeaderBar->EnableRTL( IsRTLEnabled() );
169*b1cdbd2cSJim Jagielski aHScroll.EnableRTL( IsRTLEnabled() );
170*b1cdbd2cSJim Jagielski if( pVScroll )
171*b1cdbd2cSJim Jagielski pVScroll->EnableRTL( IsRTLEnabled() );
172*b1cdbd2cSJim Jagielski Resize();
173*b1cdbd2cSJim Jagielski }
174*b1cdbd2cSJim Jagielski else if ( STATE_CHANGE_INITSHOW == nStateChange )
175*b1cdbd2cSJim Jagielski {
176*b1cdbd2cSJim Jagielski bBootstrapped = sal_True; // muss zuerst gesetzt werden!
177*b1cdbd2cSJim Jagielski
178*b1cdbd2cSJim Jagielski Resize();
179*b1cdbd2cSJim Jagielski if ( bMultiSelection )
180*b1cdbd2cSJim Jagielski uRow.pSel->SetTotalRange( Range( 0, nRowCount - 1 ) );
181*b1cdbd2cSJim Jagielski if ( nRowCount == 0 )
182*b1cdbd2cSJim Jagielski nCurRow = BROWSER_ENDOFSELECTION;
183*b1cdbd2cSJim Jagielski else if ( nCurRow == BROWSER_ENDOFSELECTION )
184*b1cdbd2cSJim Jagielski nCurRow = 0;
185*b1cdbd2cSJim Jagielski
186*b1cdbd2cSJim Jagielski
187*b1cdbd2cSJim Jagielski if ( HasFocus() )
188*b1cdbd2cSJim Jagielski {
189*b1cdbd2cSJim Jagielski bSelectionIsVisible = sal_True;
190*b1cdbd2cSJim Jagielski bHasFocus = sal_True;
191*b1cdbd2cSJim Jagielski }
192*b1cdbd2cSJim Jagielski UpdateScrollbars();
193*b1cdbd2cSJim Jagielski AutoSizeLastColumn();
194*b1cdbd2cSJim Jagielski CursorMoved();
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski else if (STATE_CHANGE_ZOOM == nStateChange)
197*b1cdbd2cSJim Jagielski {
198*b1cdbd2cSJim Jagielski pDataWin->SetZoom(GetZoom());
199*b1cdbd2cSJim Jagielski HeaderBar* pHeaderBar = getDataWindow()->pHeaderBar;
200*b1cdbd2cSJim Jagielski if (pHeaderBar)
201*b1cdbd2cSJim Jagielski pHeaderBar->SetZoom(GetZoom());
202*b1cdbd2cSJim Jagielski
203*b1cdbd2cSJim Jagielski // let the cols calc their new widths and adjust the header bar
204*b1cdbd2cSJim Jagielski for ( sal_uInt16 nPos = 0; nPos < pCols->Count(); ++nPos )
205*b1cdbd2cSJim Jagielski {
206*b1cdbd2cSJim Jagielski pCols->GetObject(nPos)->ZoomChanged(GetZoom());
207*b1cdbd2cSJim Jagielski if ( pHeaderBar )
208*b1cdbd2cSJim Jagielski pHeaderBar->SetItemSize( pCols->GetObject(nPos)->GetId(), pCols->GetObject(nPos)->Width() );
209*b1cdbd2cSJim Jagielski }
210*b1cdbd2cSJim Jagielski
211*b1cdbd2cSJim Jagielski // all our controls have to be repositioned
212*b1cdbd2cSJim Jagielski Resize();
213*b1cdbd2cSJim Jagielski }
214*b1cdbd2cSJim Jagielski else if (STATE_CHANGE_ENABLE == nStateChange)
215*b1cdbd2cSJim Jagielski {
216*b1cdbd2cSJim Jagielski // do we have a handle column?
217*b1cdbd2cSJim Jagielski sal_Bool bHandleCol = pCols->Count() && (0 == pCols->GetObject(0)->GetId());
218*b1cdbd2cSJim Jagielski // do we have a header bar
219*b1cdbd2cSJim Jagielski sal_Bool bHeaderBar = (NULL != static_cast<BrowserDataWin&>(GetDataWindow()).pHeaderBar);
220*b1cdbd2cSJim Jagielski
221*b1cdbd2cSJim Jagielski if ( nTitleLines
222*b1cdbd2cSJim Jagielski && ( !bHeaderBar
223*b1cdbd2cSJim Jagielski || bHandleCol
224*b1cdbd2cSJim Jagielski )
225*b1cdbd2cSJim Jagielski )
226*b1cdbd2cSJim Jagielski // we draw the text in our header bar in a color dependent on the enabled state. So if this state changed
227*b1cdbd2cSJim Jagielski // -> redraw
228*b1cdbd2cSJim Jagielski Invalidate(Rectangle(Point(0, 0), Size(GetOutputSizePixel().Width(), GetTitleHeight() - 1)));
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski }
231*b1cdbd2cSJim Jagielski
232*b1cdbd2cSJim Jagielski //===================================================================
233*b1cdbd2cSJim Jagielski
Select()234*b1cdbd2cSJim Jagielski void BrowseBox::Select()
235*b1cdbd2cSJim Jagielski {
236*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
237*b1cdbd2cSJim Jagielski }
238*b1cdbd2cSJim Jagielski
239*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
240*b1cdbd2cSJim Jagielski
DoubleClick(const BrowserMouseEvent &)241*b1cdbd2cSJim Jagielski void BrowseBox::DoubleClick( const BrowserMouseEvent & )
242*b1cdbd2cSJim Jagielski {
243*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
244*b1cdbd2cSJim Jagielski }
245*b1cdbd2cSJim Jagielski
246*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
247*b1cdbd2cSJim Jagielski
QueryMinimumRowHeight()248*b1cdbd2cSJim Jagielski long BrowseBox::QueryMinimumRowHeight()
249*b1cdbd2cSJim Jagielski {
250*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
251*b1cdbd2cSJim Jagielski return CalcZoom( 5 );
252*b1cdbd2cSJim Jagielski }
253*b1cdbd2cSJim Jagielski
254*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
255*b1cdbd2cSJim Jagielski
ImplStartTracking()256*b1cdbd2cSJim Jagielski void BrowseBox::ImplStartTracking()
257*b1cdbd2cSJim Jagielski {
258*b1cdbd2cSJim Jagielski DBG_CHKTHIS( BrowseBox, BrowseBoxCheckInvariants );
259*b1cdbd2cSJim Jagielski }
260*b1cdbd2cSJim Jagielski
261*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
262*b1cdbd2cSJim Jagielski
ImplTracking()263*b1cdbd2cSJim Jagielski void BrowseBox::ImplTracking()
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski DBG_CHKTHIS( BrowseBox, BrowseBoxCheckInvariants );
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski
268*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
269*b1cdbd2cSJim Jagielski
ImplEndTracking()270*b1cdbd2cSJim Jagielski void BrowseBox::ImplEndTracking()
271*b1cdbd2cSJim Jagielski {
272*b1cdbd2cSJim Jagielski DBG_CHKTHIS( BrowseBox, BrowseBoxCheckInvariants );
273*b1cdbd2cSJim Jagielski }
274*b1cdbd2cSJim Jagielski
275*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
276*b1cdbd2cSJim Jagielski
RowHeightChanged()277*b1cdbd2cSJim Jagielski void BrowseBox::RowHeightChanged()
278*b1cdbd2cSJim Jagielski {
279*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
280*b1cdbd2cSJim Jagielski }
281*b1cdbd2cSJim Jagielski
282*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
283*b1cdbd2cSJim Jagielski
QueryColumnResize(sal_uInt16,long nWidth)284*b1cdbd2cSJim Jagielski long BrowseBox::QueryColumnResize( sal_uInt16, long nWidth )
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
287*b1cdbd2cSJim Jagielski return nWidth;
288*b1cdbd2cSJim Jagielski }
289*b1cdbd2cSJim Jagielski
290*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
291*b1cdbd2cSJim Jagielski
ColumnResized(sal_uInt16)292*b1cdbd2cSJim Jagielski void BrowseBox::ColumnResized( sal_uInt16 )
293*b1cdbd2cSJim Jagielski {
294*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
295*b1cdbd2cSJim Jagielski }
296*b1cdbd2cSJim Jagielski
297*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
298*b1cdbd2cSJim Jagielski
ColumnMoved(sal_uInt16)299*b1cdbd2cSJim Jagielski void BrowseBox::ColumnMoved( sal_uInt16 )
300*b1cdbd2cSJim Jagielski {
301*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski
304*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
305*b1cdbd2cSJim Jagielski
StartScroll()306*b1cdbd2cSJim Jagielski void BrowseBox::StartScroll()
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
309*b1cdbd2cSJim Jagielski //((Control*)pDataWin)->HideFocus();
310*b1cdbd2cSJim Jagielski DoHideCursor( "StartScroll" );
311*b1cdbd2cSJim Jagielski }
312*b1cdbd2cSJim Jagielski
313*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
314*b1cdbd2cSJim Jagielski
EndScroll()315*b1cdbd2cSJim Jagielski void BrowseBox::EndScroll()
316*b1cdbd2cSJim Jagielski {
317*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
318*b1cdbd2cSJim Jagielski UpdateScrollbars();
319*b1cdbd2cSJim Jagielski AutoSizeLastColumn();
320*b1cdbd2cSJim Jagielski DoShowCursor( "EndScroll" );
321*b1cdbd2cSJim Jagielski }
322*b1cdbd2cSJim Jagielski
323*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
324*b1cdbd2cSJim Jagielski
325*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
326*b1cdbd2cSJim Jagielski #pragma optimize( "", off )
327*b1cdbd2cSJim Jagielski #endif
328*b1cdbd2cSJim Jagielski
ToggleSelection(sal_Bool bForce)329*b1cdbd2cSJim Jagielski void BrowseBox::ToggleSelection( sal_Bool bForce )
330*b1cdbd2cSJim Jagielski {
331*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
332*b1cdbd2cSJim Jagielski
333*b1cdbd2cSJim Jagielski // selection highlight-toggling allowed?
334*b1cdbd2cSJim Jagielski if ( bHideSelect )
335*b1cdbd2cSJim Jagielski return;
336*b1cdbd2cSJim Jagielski if ( !bForce &&
337*b1cdbd2cSJim Jagielski ( bNotToggleSel || !IsUpdateMode() || !bSelectionIsVisible ) )
338*b1cdbd2cSJim Jagielski return;
339*b1cdbd2cSJim Jagielski
340*b1cdbd2cSJim Jagielski // only highlight painted areas!
341*b1cdbd2cSJim Jagielski bNotToggleSel = sal_True;
342*b1cdbd2cSJim Jagielski if ( sal_False && !getDataWindow()->bInPaint )
343*b1cdbd2cSJim Jagielski pDataWin->Update();
344*b1cdbd2cSJim Jagielski
345*b1cdbd2cSJim Jagielski // accumulate areas of rows to highlight
346*b1cdbd2cSJim Jagielski RectangleList aHighlightList;
347*b1cdbd2cSJim Jagielski long nLastRowInRect = 0; // fuer den CFront
348*b1cdbd2cSJim Jagielski
349*b1cdbd2cSJim Jagielski // Handle-Column nicht highlighten
350*b1cdbd2cSJim Jagielski BrowserColumn *pFirstCol = pCols->GetObject(0);
351*b1cdbd2cSJim Jagielski long nOfsX = (!pFirstCol || pFirstCol->GetId()) ? 0 : pFirstCol->Width();
352*b1cdbd2cSJim Jagielski
353*b1cdbd2cSJim Jagielski // accumulate old row selection
354*b1cdbd2cSJim Jagielski long nBottomRow = nTopRow +
355*b1cdbd2cSJim Jagielski pDataWin->GetOutputSizePixel().Height() / GetDataRowHeight();
356*b1cdbd2cSJim Jagielski if ( nBottomRow > GetRowCount() && GetRowCount() )
357*b1cdbd2cSJim Jagielski nBottomRow = GetRowCount();
358*b1cdbd2cSJim Jagielski for ( long nRow = bMultiSelection ? uRow.pSel->FirstSelected() : uRow.nSel;
359*b1cdbd2cSJim Jagielski nRow != BROWSER_ENDOFSELECTION && nRow <= nBottomRow;
360*b1cdbd2cSJim Jagielski nRow = bMultiSelection ? uRow.pSel->NextSelected() : BROWSER_ENDOFSELECTION )
361*b1cdbd2cSJim Jagielski {
362*b1cdbd2cSJim Jagielski if ( nRow < nTopRow )
363*b1cdbd2cSJim Jagielski continue;
364*b1cdbd2cSJim Jagielski
365*b1cdbd2cSJim Jagielski Rectangle aAddRect(
366*b1cdbd2cSJim Jagielski Point( nOfsX, (nRow-nTopRow)*GetDataRowHeight() ),
367*b1cdbd2cSJim Jagielski Size( pDataWin->GetSizePixel().Width(), GetDataRowHeight() ) );
368*b1cdbd2cSJim Jagielski if ( aHighlightList.Count() && nLastRowInRect == ( nRow - 1 ) )
369*b1cdbd2cSJim Jagielski aHighlightList.First()->Union( aAddRect );
370*b1cdbd2cSJim Jagielski else
371*b1cdbd2cSJim Jagielski aHighlightList.Insert( new Rectangle( aAddRect ), (sal_uLong) 0 );
372*b1cdbd2cSJim Jagielski nLastRowInRect = nRow;
373*b1cdbd2cSJim Jagielski }
374*b1cdbd2cSJim Jagielski
375*b1cdbd2cSJim Jagielski // unhighlight the old selection (if any)
376*b1cdbd2cSJim Jagielski while ( aHighlightList.Count() )
377*b1cdbd2cSJim Jagielski {
378*b1cdbd2cSJim Jagielski Rectangle *pRect = aHighlightList.Remove( aHighlightList.Count() - 1 );
379*b1cdbd2cSJim Jagielski pDataWin->Invalidate( *pRect );
380*b1cdbd2cSJim Jagielski delete pRect;
381*b1cdbd2cSJim Jagielski }
382*b1cdbd2cSJim Jagielski
383*b1cdbd2cSJim Jagielski // unhighlight old column selection (if any)
384*b1cdbd2cSJim Jagielski for ( long nColId = pColSel ? pColSel->FirstSelected() : BROWSER_ENDOFSELECTION;
385*b1cdbd2cSJim Jagielski nColId != BROWSER_ENDOFSELECTION;
386*b1cdbd2cSJim Jagielski nColId = pColSel->NextSelected() )
387*b1cdbd2cSJim Jagielski {
388*b1cdbd2cSJim Jagielski Rectangle aRect( GetFieldRectPixel(nCurRow,
389*b1cdbd2cSJim Jagielski pCols->GetObject(nColId)->GetId(),
390*b1cdbd2cSJim Jagielski sal_False ) );
391*b1cdbd2cSJim Jagielski aRect.Left() -= MIN_COLUMNWIDTH;
392*b1cdbd2cSJim Jagielski aRect.Right() += MIN_COLUMNWIDTH;
393*b1cdbd2cSJim Jagielski aRect.Top() = 0;
394*b1cdbd2cSJim Jagielski aRect.Bottom() = pDataWin->GetOutputSizePixel().Height();
395*b1cdbd2cSJim Jagielski pDataWin->Invalidate( aRect );
396*b1cdbd2cSJim Jagielski }
397*b1cdbd2cSJim Jagielski
398*b1cdbd2cSJim Jagielski bNotToggleSel = sal_False;
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski
401*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
402*b1cdbd2cSJim Jagielski #pragma optimize( "", on )
403*b1cdbd2cSJim Jagielski #endif
404*b1cdbd2cSJim Jagielski
405*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
406*b1cdbd2cSJim Jagielski
DrawCursor()407*b1cdbd2cSJim Jagielski void BrowseBox::DrawCursor()
408*b1cdbd2cSJim Jagielski {
409*b1cdbd2cSJim Jagielski sal_Bool bReallyHide = sal_False;
410*b1cdbd2cSJim Jagielski if ( SMART_CURSOR_HIDE == bHideCursor )
411*b1cdbd2cSJim Jagielski {
412*b1cdbd2cSJim Jagielski if ( !GetSelectRowCount() && !GetSelectColumnCount() )
413*b1cdbd2cSJim Jagielski bReallyHide = sal_True;
414*b1cdbd2cSJim Jagielski }
415*b1cdbd2cSJim Jagielski else if ( HARD_CURSOR_HIDE == bHideCursor )
416*b1cdbd2cSJim Jagielski {
417*b1cdbd2cSJim Jagielski bReallyHide = sal_True;
418*b1cdbd2cSJim Jagielski }
419*b1cdbd2cSJim Jagielski
420*b1cdbd2cSJim Jagielski bReallyHide |= !bSelectionIsVisible || !IsUpdateMode() || bScrolling || nCurRow < 0;
421*b1cdbd2cSJim Jagielski
422*b1cdbd2cSJim Jagielski if (PaintCursorIfHiddenOnce())
423*b1cdbd2cSJim Jagielski bReallyHide |= ( GetCursorHideCount() > 1 );
424*b1cdbd2cSJim Jagielski else
425*b1cdbd2cSJim Jagielski bReallyHide |= ( GetCursorHideCount() > 0 );
426*b1cdbd2cSJim Jagielski
427*b1cdbd2cSJim Jagielski // keine Cursor auf Handle-Column
428*b1cdbd2cSJim Jagielski if ( nCurColId == 0 )
429*b1cdbd2cSJim Jagielski nCurColId = GetColumnId(1);
430*b1cdbd2cSJim Jagielski
431*b1cdbd2cSJim Jagielski // Cursor-Rechteck berechnen
432*b1cdbd2cSJim Jagielski Rectangle aCursor;
433*b1cdbd2cSJim Jagielski if ( bColumnCursor )
434*b1cdbd2cSJim Jagielski {
435*b1cdbd2cSJim Jagielski aCursor = GetFieldRectPixel( nCurRow, nCurColId, sal_False );
436*b1cdbd2cSJim Jagielski //! --aCursor.Bottom();
437*b1cdbd2cSJim Jagielski aCursor.Left() -= MIN_COLUMNWIDTH;
438*b1cdbd2cSJim Jagielski aCursor.Right() += 1;
439*b1cdbd2cSJim Jagielski aCursor.Bottom() += 1;
440*b1cdbd2cSJim Jagielski }
441*b1cdbd2cSJim Jagielski else
442*b1cdbd2cSJim Jagielski aCursor = Rectangle(
443*b1cdbd2cSJim Jagielski Point( ( pCols->Count() && pCols->GetObject(0)->GetId() == 0 ) ?
444*b1cdbd2cSJim Jagielski pCols->GetObject(0)->Width() : 0,
445*b1cdbd2cSJim Jagielski (nCurRow - nTopRow) * GetDataRowHeight() + 1 ),
446*b1cdbd2cSJim Jagielski Size( pDataWin->GetOutputSizePixel().Width() + 1,
447*b1cdbd2cSJim Jagielski GetDataRowHeight() - 2 ) );
448*b1cdbd2cSJim Jagielski if ( bHLines )
449*b1cdbd2cSJim Jagielski {
450*b1cdbd2cSJim Jagielski if ( !bMultiSelection )
451*b1cdbd2cSJim Jagielski --aCursor.Top();
452*b1cdbd2cSJim Jagielski --aCursor.Bottom();
453*b1cdbd2cSJim Jagielski }
454*b1cdbd2cSJim Jagielski
455*b1cdbd2cSJim Jagielski //!mi_mac pDataWin->Update();
456*b1cdbd2cSJim Jagielski
457*b1cdbd2cSJim Jagielski if (m_aCursorColor == COL_TRANSPARENT)
458*b1cdbd2cSJim Jagielski {
459*b1cdbd2cSJim Jagielski // auf diesem Plattformen funktioniert der StarView-Focus richtig
460*b1cdbd2cSJim Jagielski if ( bReallyHide )
461*b1cdbd2cSJim Jagielski ((Control*)pDataWin)->HideFocus();
462*b1cdbd2cSJim Jagielski else
463*b1cdbd2cSJim Jagielski ((Control*)pDataWin)->ShowFocus( aCursor );
464*b1cdbd2cSJim Jagielski }
465*b1cdbd2cSJim Jagielski else
466*b1cdbd2cSJim Jagielski {
467*b1cdbd2cSJim Jagielski Color rCol = bReallyHide ? pDataWin->GetFillColor() : m_aCursorColor;
468*b1cdbd2cSJim Jagielski Color aOldFillColor = pDataWin->GetFillColor();
469*b1cdbd2cSJim Jagielski Color aOldLineColor = pDataWin->GetLineColor();
470*b1cdbd2cSJim Jagielski pDataWin->SetFillColor();
471*b1cdbd2cSJim Jagielski pDataWin->SetLineColor( rCol );
472*b1cdbd2cSJim Jagielski pDataWin->DrawRect( aCursor );
473*b1cdbd2cSJim Jagielski pDataWin->SetLineColor( aOldLineColor );
474*b1cdbd2cSJim Jagielski pDataWin->SetFillColor( aOldFillColor );
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski }
477*b1cdbd2cSJim Jagielski
478*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
479*b1cdbd2cSJim Jagielski
GetColumnWidth(sal_uInt16 nId) const480*b1cdbd2cSJim Jagielski sal_uLong BrowseBox::GetColumnWidth( sal_uInt16 nId ) const
481*b1cdbd2cSJim Jagielski {
482*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
483*b1cdbd2cSJim Jagielski
484*b1cdbd2cSJim Jagielski sal_uInt16 nItemPos = GetColumnPos( nId );
485*b1cdbd2cSJim Jagielski if ( nItemPos >= pCols->Count() )
486*b1cdbd2cSJim Jagielski return 0;
487*b1cdbd2cSJim Jagielski return pCols->GetObject(nItemPos)->Width();
488*b1cdbd2cSJim Jagielski }
489*b1cdbd2cSJim Jagielski
490*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
491*b1cdbd2cSJim Jagielski
GetColumnId(sal_uInt16 nPos) const492*b1cdbd2cSJim Jagielski sal_uInt16 BrowseBox::GetColumnId( sal_uInt16 nPos ) const
493*b1cdbd2cSJim Jagielski {
494*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
495*b1cdbd2cSJim Jagielski
496*b1cdbd2cSJim Jagielski if ( nPos >= pCols->Count() )
497*b1cdbd2cSJim Jagielski return 0;
498*b1cdbd2cSJim Jagielski return pCols->GetObject(nPos)->GetId();
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski
501*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
502*b1cdbd2cSJim Jagielski
GetColumnPos(sal_uInt16 nId) const503*b1cdbd2cSJim Jagielski sal_uInt16 BrowseBox::GetColumnPos( sal_uInt16 nId ) const
504*b1cdbd2cSJim Jagielski {
505*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
506*b1cdbd2cSJim Jagielski
507*b1cdbd2cSJim Jagielski for ( sal_uInt16 nPos = 0; nPos < pCols->Count(); ++nPos )
508*b1cdbd2cSJim Jagielski if ( pCols->GetObject(nPos)->GetId() == nId )
509*b1cdbd2cSJim Jagielski return nPos;
510*b1cdbd2cSJim Jagielski return BROWSER_INVALIDID;
511*b1cdbd2cSJim Jagielski }
512*b1cdbd2cSJim Jagielski
513*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
514*b1cdbd2cSJim Jagielski
IsFrozen(sal_uInt16 nColumnId) const515*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::IsFrozen( sal_uInt16 nColumnId ) const
516*b1cdbd2cSJim Jagielski {
517*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
518*b1cdbd2cSJim Jagielski
519*b1cdbd2cSJim Jagielski for ( sal_uInt16 nPos = 0; nPos < pCols->Count(); ++nPos )
520*b1cdbd2cSJim Jagielski if ( pCols->GetObject(nPos)->GetId() == nColumnId )
521*b1cdbd2cSJim Jagielski return pCols->GetObject(nPos)->IsFrozen();
522*b1cdbd2cSJim Jagielski return sal_False;
523*b1cdbd2cSJim Jagielski }
524*b1cdbd2cSJim Jagielski
525*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
526*b1cdbd2cSJim Jagielski
ExpandRowSelection(const BrowserMouseEvent & rEvt)527*b1cdbd2cSJim Jagielski void BrowseBox::ExpandRowSelection( const BrowserMouseEvent& rEvt )
528*b1cdbd2cSJim Jagielski {
529*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
530*b1cdbd2cSJim Jagielski
531*b1cdbd2cSJim Jagielski DoHideCursor( "ExpandRowSelection" );
532*b1cdbd2cSJim Jagielski
533*b1cdbd2cSJim Jagielski // expand the last selection
534*b1cdbd2cSJim Jagielski if ( bMultiSelection )
535*b1cdbd2cSJim Jagielski {
536*b1cdbd2cSJim Jagielski Range aJustifiedRange( aSelRange );
537*b1cdbd2cSJim Jagielski aJustifiedRange.Justify();
538*b1cdbd2cSJim Jagielski
539*b1cdbd2cSJim Jagielski sal_Bool bSelectThis = ( bSelect != aJustifiedRange.IsInside( rEvt.GetRow() ) );
540*b1cdbd2cSJim Jagielski
541*b1cdbd2cSJim Jagielski if ( aJustifiedRange.IsInside( rEvt.GetRow() ) )
542*b1cdbd2cSJim Jagielski {
543*b1cdbd2cSJim Jagielski // down and up
544*b1cdbd2cSJim Jagielski while ( rEvt.GetRow() < aSelRange.Max() )
545*b1cdbd2cSJim Jagielski { // ZTC/Mac bug - dont put these statemants together!
546*b1cdbd2cSJim Jagielski SelectRow( aSelRange.Max(), bSelectThis, sal_True );
547*b1cdbd2cSJim Jagielski --aSelRange.Max();
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski while ( rEvt.GetRow() > aSelRange.Max() )
550*b1cdbd2cSJim Jagielski { // ZTC/Mac bug - dont put these statemants together!
551*b1cdbd2cSJim Jagielski SelectRow( aSelRange.Max(), bSelectThis, sal_True );
552*b1cdbd2cSJim Jagielski ++aSelRange.Max();
553*b1cdbd2cSJim Jagielski }
554*b1cdbd2cSJim Jagielski }
555*b1cdbd2cSJim Jagielski else
556*b1cdbd2cSJim Jagielski {
557*b1cdbd2cSJim Jagielski // up and down
558*b1cdbd2cSJim Jagielski sal_Bool bOldSelecting = bSelecting;
559*b1cdbd2cSJim Jagielski bSelecting = sal_True;
560*b1cdbd2cSJim Jagielski while ( rEvt.GetRow() < aSelRange.Max() )
561*b1cdbd2cSJim Jagielski { // ZTC/Mac bug - dont put these statemants together!
562*b1cdbd2cSJim Jagielski --aSelRange.Max();
563*b1cdbd2cSJim Jagielski if ( !IsRowSelected( aSelRange.Max() ) )
564*b1cdbd2cSJim Jagielski {
565*b1cdbd2cSJim Jagielski SelectRow( aSelRange.Max(), bSelectThis, sal_True );
566*b1cdbd2cSJim Jagielski bSelect = sal_True;
567*b1cdbd2cSJim Jagielski }
568*b1cdbd2cSJim Jagielski }
569*b1cdbd2cSJim Jagielski while ( rEvt.GetRow() > aSelRange.Max() )
570*b1cdbd2cSJim Jagielski { // ZTC/Mac bug - dont put these statemants together!
571*b1cdbd2cSJim Jagielski ++aSelRange.Max();
572*b1cdbd2cSJim Jagielski if ( !IsRowSelected( aSelRange.Max() ) )
573*b1cdbd2cSJim Jagielski {
574*b1cdbd2cSJim Jagielski SelectRow( aSelRange.Max(), bSelectThis, sal_True );
575*b1cdbd2cSJim Jagielski bSelect = sal_True;
576*b1cdbd2cSJim Jagielski }
577*b1cdbd2cSJim Jagielski }
578*b1cdbd2cSJim Jagielski bSelecting = bOldSelecting;
579*b1cdbd2cSJim Jagielski if ( bSelect )
580*b1cdbd2cSJim Jagielski Select();
581*b1cdbd2cSJim Jagielski }
582*b1cdbd2cSJim Jagielski }
583*b1cdbd2cSJim Jagielski else
584*b1cdbd2cSJim Jagielski if ( !bMultiSelection || !IsRowSelected( rEvt.GetRow() ) )
585*b1cdbd2cSJim Jagielski SelectRow( rEvt.GetRow(), sal_True );
586*b1cdbd2cSJim Jagielski
587*b1cdbd2cSJim Jagielski GoToRow( rEvt.GetRow(), sal_False );
588*b1cdbd2cSJim Jagielski DoShowCursor( "ExpandRowSelection" );
589*b1cdbd2cSJim Jagielski }
590*b1cdbd2cSJim Jagielski
591*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
592*b1cdbd2cSJim Jagielski
Resize()593*b1cdbd2cSJim Jagielski void BrowseBox::Resize()
594*b1cdbd2cSJim Jagielski {
595*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
596*b1cdbd2cSJim Jagielski if ( !bBootstrapped && IsReallyVisible() )
597*b1cdbd2cSJim Jagielski BrowseBox::StateChanged( STATE_CHANGE_INITSHOW );
598*b1cdbd2cSJim Jagielski if ( !pCols->Count() )
599*b1cdbd2cSJim Jagielski {
600*b1cdbd2cSJim Jagielski getDataWindow()->bResizeOnPaint = sal_True;
601*b1cdbd2cSJim Jagielski return;
602*b1cdbd2cSJim Jagielski }
603*b1cdbd2cSJim Jagielski getDataWindow()->bResizeOnPaint = sal_False;
604*b1cdbd2cSJim Jagielski
605*b1cdbd2cSJim Jagielski // calc the size of the scrollbars
606*b1cdbd2cSJim Jagielski // (we can't ask the scrollbars for their widths cause if we're zoomed they still have to be
607*b1cdbd2cSJim Jagielski // resized - which is done in UpdateScrollbars)
608*b1cdbd2cSJim Jagielski sal_uLong nSBSize = GetSettings().GetStyleSettings().GetScrollBarSize();
609*b1cdbd2cSJim Jagielski if (IsZoom())
610*b1cdbd2cSJim Jagielski nSBSize = (sal_uLong)(nSBSize * (double)GetZoom());
611*b1cdbd2cSJim Jagielski
612*b1cdbd2cSJim Jagielski DoHideCursor( "Resize" );
613*b1cdbd2cSJim Jagielski sal_uInt16 nOldVisibleRows =
614*b1cdbd2cSJim Jagielski (sal_uInt16)(pDataWin->GetOutputSizePixel().Height() / GetDataRowHeight() + 1);
615*b1cdbd2cSJim Jagielski
616*b1cdbd2cSJim Jagielski // did we need a horiz. scroll bar oder gibt es eine Control Area?
617*b1cdbd2cSJim Jagielski if ( !getDataWindow()->bNoHScroll &&
618*b1cdbd2cSJim Jagielski ( ( pCols->Count() - FrozenColCount() ) > 1 ) )
619*b1cdbd2cSJim Jagielski aHScroll.Show();
620*b1cdbd2cSJim Jagielski else
621*b1cdbd2cSJim Jagielski aHScroll.Hide();
622*b1cdbd2cSJim Jagielski
623*b1cdbd2cSJim Jagielski // calculate the size of the data window
624*b1cdbd2cSJim Jagielski long nDataHeight = GetOutputSizePixel().Height() - GetTitleHeight();
625*b1cdbd2cSJim Jagielski if ( aHScroll.IsVisible() || ( nControlAreaWidth != USHRT_MAX ) )
626*b1cdbd2cSJim Jagielski nDataHeight -= nSBSize;
627*b1cdbd2cSJim Jagielski
628*b1cdbd2cSJim Jagielski long nDataWidth = GetOutputSizePixel().Width();
629*b1cdbd2cSJim Jagielski if ( pVScroll->IsVisible() )
630*b1cdbd2cSJim Jagielski nDataWidth -= nSBSize;
631*b1cdbd2cSJim Jagielski
632*b1cdbd2cSJim Jagielski // adjust position and size of data window
633*b1cdbd2cSJim Jagielski pDataWin->SetPosSizePixel(
634*b1cdbd2cSJim Jagielski Point( 0, GetTitleHeight() ),
635*b1cdbd2cSJim Jagielski Size( nDataWidth, nDataHeight ) );
636*b1cdbd2cSJim Jagielski
637*b1cdbd2cSJim Jagielski sal_uInt16 nVisibleRows =
638*b1cdbd2cSJim Jagielski (sal_uInt16)(pDataWin->GetOutputSizePixel().Height() / GetDataRowHeight() + 1);
639*b1cdbd2cSJim Jagielski
640*b1cdbd2cSJim Jagielski // TopRow ist unveraendert, aber die Anzahl sichtbarer Zeilen hat sich
641*b1cdbd2cSJim Jagielski // geaendert
642*b1cdbd2cSJim Jagielski if ( nVisibleRows != nOldVisibleRows )
643*b1cdbd2cSJim Jagielski VisibleRowsChanged(nTopRow, nVisibleRows);
644*b1cdbd2cSJim Jagielski
645*b1cdbd2cSJim Jagielski UpdateScrollbars();
646*b1cdbd2cSJim Jagielski
647*b1cdbd2cSJim Jagielski // Control-Area
648*b1cdbd2cSJim Jagielski Rectangle aInvalidArea( GetControlArea() );
649*b1cdbd2cSJim Jagielski aInvalidArea.Right() = GetOutputSizePixel().Width();
650*b1cdbd2cSJim Jagielski aInvalidArea.Left() = 0;
651*b1cdbd2cSJim Jagielski Invalidate( aInvalidArea );
652*b1cdbd2cSJim Jagielski
653*b1cdbd2cSJim Jagielski // external header-bar
654*b1cdbd2cSJim Jagielski HeaderBar* pHeaderBar = getDataWindow()->pHeaderBar;
655*b1cdbd2cSJim Jagielski if ( pHeaderBar )
656*b1cdbd2cSJim Jagielski {
657*b1cdbd2cSJim Jagielski // Handle-Column beruecksichtigen
658*b1cdbd2cSJim Jagielski BrowserColumn *pFirstCol = pCols->GetObject(0);
659*b1cdbd2cSJim Jagielski long nOfsX = pFirstCol->GetId() ? 0 : pFirstCol->Width();
660*b1cdbd2cSJim Jagielski pHeaderBar->SetPosSizePixel( Point( nOfsX, 0 ), Size( GetOutputSizePixel().Width() - nOfsX, GetTitleHeight() ) );
661*b1cdbd2cSJim Jagielski }
662*b1cdbd2cSJim Jagielski
663*b1cdbd2cSJim Jagielski AutoSizeLastColumn(); // adjust last column width
664*b1cdbd2cSJim Jagielski DoShowCursor( "Resize" );
665*b1cdbd2cSJim Jagielski }
666*b1cdbd2cSJim Jagielski
667*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
668*b1cdbd2cSJim Jagielski
Paint(const Rectangle & rRect)669*b1cdbd2cSJim Jagielski void BrowseBox::Paint( const Rectangle& rRect )
670*b1cdbd2cSJim Jagielski {
671*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
672*b1cdbd2cSJim Jagielski
673*b1cdbd2cSJim Jagielski // initializations
674*b1cdbd2cSJim Jagielski if ( !bBootstrapped && IsReallyVisible() )
675*b1cdbd2cSJim Jagielski BrowseBox::StateChanged( STATE_CHANGE_INITSHOW );
676*b1cdbd2cSJim Jagielski if ( !pCols->Count() )
677*b1cdbd2cSJim Jagielski return;
678*b1cdbd2cSJim Jagielski
679*b1cdbd2cSJim Jagielski BrowserColumn *pFirstCol = pCols->GetObject(0);
680*b1cdbd2cSJim Jagielski sal_Bool bHandleCol = pFirstCol && pFirstCol->GetId() == 0;
681*b1cdbd2cSJim Jagielski sal_Bool bHeaderBar = getDataWindow()->pHeaderBar != NULL;
682*b1cdbd2cSJim Jagielski
683*b1cdbd2cSJim Jagielski // draw delimitational lines
684*b1cdbd2cSJim Jagielski if ( !getDataWindow()->bNoHScroll )
685*b1cdbd2cSJim Jagielski DrawLine( Point( 0, aHScroll.GetPosPixel().Y() ),
686*b1cdbd2cSJim Jagielski Point( GetOutputSizePixel().Width(),
687*b1cdbd2cSJim Jagielski aHScroll.GetPosPixel().Y() ) );
688*b1cdbd2cSJim Jagielski
689*b1cdbd2cSJim Jagielski if ( nTitleLines )
690*b1cdbd2cSJim Jagielski {
691*b1cdbd2cSJim Jagielski if ( !bHeaderBar )
692*b1cdbd2cSJim Jagielski DrawLine( Point( 0, GetTitleHeight() - 1 ),
693*b1cdbd2cSJim Jagielski Point( GetOutputSizePixel().Width(),
694*b1cdbd2cSJim Jagielski GetTitleHeight() - 1 ) );
695*b1cdbd2cSJim Jagielski else if ( bHandleCol )
696*b1cdbd2cSJim Jagielski DrawLine( Point( 0, GetTitleHeight() - 1 ),
697*b1cdbd2cSJim Jagielski Point( pFirstCol->Width(), GetTitleHeight() - 1 ) );
698*b1cdbd2cSJim Jagielski }
699*b1cdbd2cSJim Jagielski
700*b1cdbd2cSJim Jagielski // Title Bar
701*b1cdbd2cSJim Jagielski // Wenn es eine Handle Column gibt und die Headerbar verfuegbar ist, dann nur
702*b1cdbd2cSJim Jagielski // die HandleColumn
703*b1cdbd2cSJim Jagielski // Handle-Column beruecksichtigen
704*b1cdbd2cSJim Jagielski if ( nTitleLines && (!bHeaderBar || bHandleCol) )
705*b1cdbd2cSJim Jagielski {
706*b1cdbd2cSJim Jagielski // iterate through columns to redraw
707*b1cdbd2cSJim Jagielski long nX = 0;
708*b1cdbd2cSJim Jagielski sal_uInt16 nCol;
709*b1cdbd2cSJim Jagielski for ( nCol = 0;
710*b1cdbd2cSJim Jagielski nCol < pCols->Count() && nX < rRect.Right();
711*b1cdbd2cSJim Jagielski ++nCol )
712*b1cdbd2cSJim Jagielski {
713*b1cdbd2cSJim Jagielski // skip invisible colums between frozen and scrollable area
714*b1cdbd2cSJim Jagielski if ( nCol < nFirstCol && !pCols->GetObject(nCol)->IsFrozen() )
715*b1cdbd2cSJim Jagielski nCol = nFirstCol;
716*b1cdbd2cSJim Jagielski
717*b1cdbd2cSJim Jagielski // nur die HandleCol ?
718*b1cdbd2cSJim Jagielski if (bHeaderBar && bHandleCol && nCol > 0)
719*b1cdbd2cSJim Jagielski break;
720*b1cdbd2cSJim Jagielski
721*b1cdbd2cSJim Jagielski BrowserColumn *pCol = pCols->GetObject(nCol);
722*b1cdbd2cSJim Jagielski
723*b1cdbd2cSJim Jagielski // draw the column and increment position
724*b1cdbd2cSJim Jagielski if ( pCol->Width() > 4 )
725*b1cdbd2cSJim Jagielski {
726*b1cdbd2cSJim Jagielski ButtonFrame aButtonFrame( Point( nX, 0 ),
727*b1cdbd2cSJim Jagielski Size( pCol->Width()-1, GetTitleHeight()-1 ),
728*b1cdbd2cSJim Jagielski pCol->Title(), sal_False, sal_False,
729*b1cdbd2cSJim Jagielski 0 != (BROWSER_COLUMN_TITLEABBREVATION&pCol->Flags()),
730*b1cdbd2cSJim Jagielski !IsEnabled());
731*b1cdbd2cSJim Jagielski aButtonFrame.Draw( *this );
732*b1cdbd2cSJim Jagielski DrawLine( Point( nX + pCol->Width() - 1, 0 ),
733*b1cdbd2cSJim Jagielski Point( nX + pCol->Width() - 1, GetTitleHeight()-1 ) );
734*b1cdbd2cSJim Jagielski }
735*b1cdbd2cSJim Jagielski else
736*b1cdbd2cSJim Jagielski {
737*b1cdbd2cSJim Jagielski Color aOldFillColor = GetFillColor();
738*b1cdbd2cSJim Jagielski SetFillColor( Color( COL_BLACK ) );
739*b1cdbd2cSJim Jagielski DrawRect( Rectangle( Point( nX, 0 ), Size( pCol->Width(), GetTitleHeight() - 1 ) ) );
740*b1cdbd2cSJim Jagielski SetFillColor( aOldFillColor );
741*b1cdbd2cSJim Jagielski }
742*b1cdbd2cSJim Jagielski
743*b1cdbd2cSJim Jagielski // skip column
744*b1cdbd2cSJim Jagielski nX += pCol->Width();
745*b1cdbd2cSJim Jagielski }
746*b1cdbd2cSJim Jagielski
747*b1cdbd2cSJim Jagielski // retouching
748*b1cdbd2cSJim Jagielski if ( !bHeaderBar && nCol == pCols->Count() )
749*b1cdbd2cSJim Jagielski {
750*b1cdbd2cSJim Jagielski const StyleSettings &rSettings = GetSettings().GetStyleSettings();
751*b1cdbd2cSJim Jagielski Color aColFace( rSettings.GetFaceColor() );
752*b1cdbd2cSJim Jagielski Color aOldFillColor = GetFillColor();
753*b1cdbd2cSJim Jagielski Color aOldLineColor = GetLineColor();
754*b1cdbd2cSJim Jagielski SetFillColor( aColFace );
755*b1cdbd2cSJim Jagielski SetLineColor( aColFace );
756*b1cdbd2cSJim Jagielski DrawRect( Rectangle(
757*b1cdbd2cSJim Jagielski Point( nX, 0 ),
758*b1cdbd2cSJim Jagielski Point( rRect.Right(), GetTitleHeight() - 2 ) ) );
759*b1cdbd2cSJim Jagielski SetFillColor( aOldFillColor); // aOldLineColor ); oj 09.02.00 seems to be a copy&paste bug
760*b1cdbd2cSJim Jagielski SetLineColor( aOldLineColor); // aOldFillColor );
761*b1cdbd2cSJim Jagielski }
762*b1cdbd2cSJim Jagielski }
763*b1cdbd2cSJim Jagielski }
764*b1cdbd2cSJim Jagielski
765*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
766*b1cdbd2cSJim Jagielski
PaintRow(OutputDevice &,const Rectangle &)767*b1cdbd2cSJim Jagielski void BrowseBox::PaintRow( OutputDevice&, const Rectangle& )
768*b1cdbd2cSJim Jagielski {
769*b1cdbd2cSJim Jagielski }
770*b1cdbd2cSJim Jagielski
771*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
772*b1cdbd2cSJim Jagielski
Draw(OutputDevice * pDev,const Point & rPos,const Size & rSize,sal_uLong nFlags)773*b1cdbd2cSJim Jagielski void BrowseBox::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
774*b1cdbd2cSJim Jagielski {
775*b1cdbd2cSJim Jagielski sal_Bool bDrawSelection = (nFlags & WINDOW_DRAW_NOSELECTION) == 0;
776*b1cdbd2cSJim Jagielski
777*b1cdbd2cSJim Jagielski // we need pixel coordinates
778*b1cdbd2cSJim Jagielski Size aRealSize = pDev->LogicToPixel(rSize);
779*b1cdbd2cSJim Jagielski Point aRealPos = pDev->LogicToPixel(rPos);
780*b1cdbd2cSJim Jagielski
781*b1cdbd2cSJim Jagielski if ((rSize.Width() < 3) || (rSize.Height() < 3))
782*b1cdbd2cSJim Jagielski // we want to have two pixels frame ...
783*b1cdbd2cSJim Jagielski return;
784*b1cdbd2cSJim Jagielski
785*b1cdbd2cSJim Jagielski Font aFont = GetDataWindow().GetDrawPixelFont( pDev );
786*b1cdbd2cSJim Jagielski // the 'normal' painting uses always the data window as device to output to, so we have to calc the new font
787*b1cdbd2cSJim Jagielski // relative to the data wins current settings
788*b1cdbd2cSJim Jagielski
789*b1cdbd2cSJim Jagielski pDev->Push();
790*b1cdbd2cSJim Jagielski pDev->SetMapMode();
791*b1cdbd2cSJim Jagielski pDev->SetFont( aFont );
792*b1cdbd2cSJim Jagielski
793*b1cdbd2cSJim Jagielski // draw a frame
794*b1cdbd2cSJim Jagielski const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
795*b1cdbd2cSJim Jagielski pDev->SetLineColor(rStyleSettings.GetDarkShadowColor());
796*b1cdbd2cSJim Jagielski pDev->DrawLine(Point(aRealPos.X(), aRealPos.Y()),
797*b1cdbd2cSJim Jagielski Point(aRealPos.X(), aRealPos.Y() + aRealSize.Height() - 1));
798*b1cdbd2cSJim Jagielski pDev->DrawLine(Point(aRealPos.X(), aRealPos.Y()),
799*b1cdbd2cSJim Jagielski Point(aRealPos.X() + aRealSize.Width() - 1, aRealPos.Y()));
800*b1cdbd2cSJim Jagielski pDev->SetLineColor(rStyleSettings.GetShadowColor());
801*b1cdbd2cSJim Jagielski pDev->DrawLine(Point(aRealPos.X() + aRealSize.Width() - 1, aRealPos.Y() + 1),
802*b1cdbd2cSJim Jagielski Point(aRealPos.X() + aRealSize.Width() - 1, aRealPos.Y() + aRealSize.Height() - 1));
803*b1cdbd2cSJim Jagielski pDev->DrawLine(Point(aRealPos.X() + aRealSize.Width() - 1, aRealPos.Y() + aRealSize.Height() - 1),
804*b1cdbd2cSJim Jagielski Point(aRealPos.X() + 1, aRealPos.Y() + aRealSize.Height() - 1));
805*b1cdbd2cSJim Jagielski
806*b1cdbd2cSJim Jagielski HeaderBar* pBar = getDataWindow()->pHeaderBar;
807*b1cdbd2cSJim Jagielski
808*b1cdbd2cSJim Jagielski // we're drawing onto a foreign device, so we have to fake the DataRowHeight for the subsequent ImplPaintData
809*b1cdbd2cSJim Jagielski // (as it is based on the settings of our data window, not the foreign device)
810*b1cdbd2cSJim Jagielski if (!nDataRowHeight)
811*b1cdbd2cSJim Jagielski ImpGetDataRowHeight();
812*b1cdbd2cSJim Jagielski long nHeightLogic = PixelToLogic(Size(0, nDataRowHeight), MAP_10TH_MM).Height();
813*b1cdbd2cSJim Jagielski long nForeignHeightPixel = pDev->LogicToPixel(Size(0, nHeightLogic), MAP_10TH_MM).Height();
814*b1cdbd2cSJim Jagielski
815*b1cdbd2cSJim Jagielski long nOriginalHeight = nDataRowHeight;
816*b1cdbd2cSJim Jagielski nDataRowHeight = nForeignHeightPixel;
817*b1cdbd2cSJim Jagielski
818*b1cdbd2cSJim Jagielski // this counts for the column widths, too
819*b1cdbd2cSJim Jagielski sal_uInt16 nPos;
820*b1cdbd2cSJim Jagielski for ( nPos = 0; nPos < pCols->Count(); ++nPos )
821*b1cdbd2cSJim Jagielski {
822*b1cdbd2cSJim Jagielski BrowserColumn* pCurrent = pCols->GetObject(nPos);
823*b1cdbd2cSJim Jagielski
824*b1cdbd2cSJim Jagielski long nWidthLogic = PixelToLogic(Size(pCurrent->Width(), 0), MAP_10TH_MM).Width();
825*b1cdbd2cSJim Jagielski long nForeignWidthPixel = pDev->LogicToPixel(Size(nWidthLogic, 0), MAP_10TH_MM).Width();
826*b1cdbd2cSJim Jagielski
827*b1cdbd2cSJim Jagielski pCurrent->SetWidth(nForeignWidthPixel, GetZoom());
828*b1cdbd2cSJim Jagielski if ( pBar )
829*b1cdbd2cSJim Jagielski pBar->SetItemSize( pCurrent->GetId(), pCurrent->Width() );
830*b1cdbd2cSJim Jagielski }
831*b1cdbd2cSJim Jagielski
832*b1cdbd2cSJim Jagielski // a smaller area for the content
833*b1cdbd2cSJim Jagielski ++aRealPos.X();
834*b1cdbd2cSJim Jagielski ++aRealPos.Y();
835*b1cdbd2cSJim Jagielski aRealSize.Width() -= 2;
836*b1cdbd2cSJim Jagielski aRealSize.Height() -= 2;
837*b1cdbd2cSJim Jagielski
838*b1cdbd2cSJim Jagielski // let the header bar draw itself
839*b1cdbd2cSJim Jagielski if ( pBar )
840*b1cdbd2cSJim Jagielski {
841*b1cdbd2cSJim Jagielski // the title height with respect to the font set for the given device
842*b1cdbd2cSJim Jagielski long nTitleHeight = PixelToLogic(Size(0, GetTitleHeight()), MAP_10TH_MM).Height();
843*b1cdbd2cSJim Jagielski nTitleHeight = pDev->LogicToPixel(Size(0, nTitleHeight), MAP_10TH_MM).Height();
844*b1cdbd2cSJim Jagielski
845*b1cdbd2cSJim Jagielski BrowserColumn* pFirstCol = pCols->Count() ? pCols->GetObject(0) : NULL;
846*b1cdbd2cSJim Jagielski
847*b1cdbd2cSJim Jagielski Point aHeaderPos(pFirstCol && (pFirstCol->GetId() == 0) ? pFirstCol->Width() : 0, 0);
848*b1cdbd2cSJim Jagielski Size aHeaderSize(aRealSize.Width() - aHeaderPos.X(), nTitleHeight);
849*b1cdbd2cSJim Jagielski
850*b1cdbd2cSJim Jagielski aHeaderPos += aRealPos;
851*b1cdbd2cSJim Jagielski // do this before converting to logics !
852*b1cdbd2cSJim Jagielski
853*b1cdbd2cSJim Jagielski // the header's draw expects logic coordinates, again
854*b1cdbd2cSJim Jagielski aHeaderPos = pDev->PixelToLogic(aHeaderPos);
855*b1cdbd2cSJim Jagielski aHeaderSize = pDev->PixelToLogic(aHeaderSize);
856*b1cdbd2cSJim Jagielski
857*b1cdbd2cSJim Jagielski pBar->Draw(pDev, aHeaderPos, aHeaderSize, nFlags);
858*b1cdbd2cSJim Jagielski
859*b1cdbd2cSJim Jagielski // draw the "upper left cell" (the intersection between the header bar and the handle column)
860*b1cdbd2cSJim Jagielski if (( pFirstCol->GetId() == 0 ) && ( pFirstCol->Width() > 4 ))
861*b1cdbd2cSJim Jagielski {
862*b1cdbd2cSJim Jagielski ButtonFrame aButtonFrame( aRealPos,
863*b1cdbd2cSJim Jagielski Size( pFirstCol->Width()-1, nTitleHeight-1 ),
864*b1cdbd2cSJim Jagielski pFirstCol->Title(), sal_False, sal_False, sal_False, !IsEnabled());
865*b1cdbd2cSJim Jagielski aButtonFrame.Draw( *pDev );
866*b1cdbd2cSJim Jagielski
867*b1cdbd2cSJim Jagielski pDev->Push( PUSH_LINECOLOR );
868*b1cdbd2cSJim Jagielski pDev->SetLineColor( Color( COL_BLACK ) );
869*b1cdbd2cSJim Jagielski
870*b1cdbd2cSJim Jagielski pDev->DrawLine( Point( aRealPos.X(), aRealPos.Y() + nTitleHeight-1 ),
871*b1cdbd2cSJim Jagielski Point( aRealPos.X() + pFirstCol->Width() - 1, aRealPos.Y() + nTitleHeight-1 ) );
872*b1cdbd2cSJim Jagielski pDev->DrawLine( Point( aRealPos.X() + pFirstCol->Width() - 1, aRealPos.Y() ),
873*b1cdbd2cSJim Jagielski Point( aRealPos.X() + pFirstCol->Width() - 1, aRealPos.Y() + nTitleHeight-1 ) );
874*b1cdbd2cSJim Jagielski
875*b1cdbd2cSJim Jagielski pDev->Pop();
876*b1cdbd2cSJim Jagielski }
877*b1cdbd2cSJim Jagielski
878*b1cdbd2cSJim Jagielski aRealPos.Y() += aHeaderSize.Height();
879*b1cdbd2cSJim Jagielski aRealSize.Height() -= aHeaderSize.Height();
880*b1cdbd2cSJim Jagielski }
881*b1cdbd2cSJim Jagielski
882*b1cdbd2cSJim Jagielski // draw our own content (with clipping)
883*b1cdbd2cSJim Jagielski Region aRegion(Rectangle(aRealPos, aRealSize));
884*b1cdbd2cSJim Jagielski pDev->SetClipRegion( pDev->PixelToLogic( aRegion ) );
885*b1cdbd2cSJim Jagielski
886*b1cdbd2cSJim Jagielski // do we have to paint the background
887*b1cdbd2cSJim Jagielski sal_Bool bBackground = !(nFlags & WINDOW_DRAW_NOBACKGROUND) && GetDataWindow().IsControlBackground();
888*b1cdbd2cSJim Jagielski if ( bBackground )
889*b1cdbd2cSJim Jagielski {
890*b1cdbd2cSJim Jagielski Rectangle aRect( aRealPos, aRealSize );
891*b1cdbd2cSJim Jagielski pDev->SetFillColor( GetDataWindow().GetControlBackground() );
892*b1cdbd2cSJim Jagielski pDev->DrawRect( aRect );
893*b1cdbd2cSJim Jagielski }
894*b1cdbd2cSJim Jagielski
895*b1cdbd2cSJim Jagielski ImplPaintData( *pDev, Rectangle( aRealPos, aRealSize ), sal_True, bDrawSelection );
896*b1cdbd2cSJim Jagielski
897*b1cdbd2cSJim Jagielski // restore the column widths/data row height
898*b1cdbd2cSJim Jagielski nDataRowHeight = nOriginalHeight;
899*b1cdbd2cSJim Jagielski for ( nPos = 0; nPos < pCols->Count(); ++nPos )
900*b1cdbd2cSJim Jagielski {
901*b1cdbd2cSJim Jagielski BrowserColumn* pCurrent = pCols->GetObject(nPos);
902*b1cdbd2cSJim Jagielski
903*b1cdbd2cSJim Jagielski long nForeignWidthLogic = pDev->PixelToLogic(Size(pCurrent->Width(), 0), MAP_10TH_MM).Width();
904*b1cdbd2cSJim Jagielski long nWidthPixel = LogicToPixel(Size(nForeignWidthLogic, 0), MAP_10TH_MM).Width();
905*b1cdbd2cSJim Jagielski
906*b1cdbd2cSJim Jagielski pCurrent->SetWidth(nWidthPixel, GetZoom());
907*b1cdbd2cSJim Jagielski if ( pBar )
908*b1cdbd2cSJim Jagielski pBar->SetItemSize( pCurrent->GetId(), pCurrent->Width() );
909*b1cdbd2cSJim Jagielski }
910*b1cdbd2cSJim Jagielski
911*b1cdbd2cSJim Jagielski pDev->Pop();
912*b1cdbd2cSJim Jagielski }
913*b1cdbd2cSJim Jagielski
914*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
915*b1cdbd2cSJim Jagielski
ImplPaintData(OutputDevice & _rOut,const Rectangle & _rRect,sal_Bool _bForeignDevice,sal_Bool _bDrawSelections)916*b1cdbd2cSJim Jagielski void BrowseBox::ImplPaintData(OutputDevice& _rOut, const Rectangle& _rRect, sal_Bool _bForeignDevice, sal_Bool _bDrawSelections)
917*b1cdbd2cSJim Jagielski {
918*b1cdbd2cSJim Jagielski Point aOverallAreaPos = _bForeignDevice ? _rRect.TopLeft() : Point(0,0);
919*b1cdbd2cSJim Jagielski Size aOverallAreaSize = _bForeignDevice ? _rRect.GetSize() : GetDataWindow().GetOutputSizePixel();
920*b1cdbd2cSJim Jagielski Point aOverallAreaBRPos = _bForeignDevice ? _rRect.BottomRight() : Point( aOverallAreaSize.Width(), aOverallAreaSize.Height() );
921*b1cdbd2cSJim Jagielski
922*b1cdbd2cSJim Jagielski long nDataRowHeigt = GetDataRowHeight();
923*b1cdbd2cSJim Jagielski
924*b1cdbd2cSJim Jagielski // compute relative rows to redraw
925*b1cdbd2cSJim Jagielski sal_uLong nRelTopRow = _bForeignDevice ? 0 : ((sal_uLong)_rRect.Top() / nDataRowHeigt);
926*b1cdbd2cSJim Jagielski sal_uLong nRelBottomRow = (sal_uLong)(_bForeignDevice ? aOverallAreaSize.Height() : _rRect.Bottom()) / nDataRowHeigt;
927*b1cdbd2cSJim Jagielski
928*b1cdbd2cSJim Jagielski // cache frequently used values
929*b1cdbd2cSJim Jagielski Point aPos( aOverallAreaPos.X(), nRelTopRow * nDataRowHeigt + aOverallAreaPos.Y() );
930*b1cdbd2cSJim Jagielski _rOut.SetLineColor( Color( COL_WHITE ) );
931*b1cdbd2cSJim Jagielski const AllSettings& rAllSets = _rOut.GetSettings();
932*b1cdbd2cSJim Jagielski const StyleSettings &rSettings = rAllSets.GetStyleSettings();
933*b1cdbd2cSJim Jagielski const Color &rHighlightTextColor = rSettings.GetHighlightTextColor();
934*b1cdbd2cSJim Jagielski const Color &rHighlightFillColor = rSettings.GetHighlightColor();
935*b1cdbd2cSJim Jagielski Color aOldTextColor = _rOut.GetTextColor();
936*b1cdbd2cSJim Jagielski Color aOldFillColor = _rOut.GetFillColor();
937*b1cdbd2cSJim Jagielski Color aOldLineColor = _rOut.GetLineColor();
938*b1cdbd2cSJim Jagielski long nHLineX = 0 == pCols->GetObject(0)->GetId()
939*b1cdbd2cSJim Jagielski ? pCols->GetObject(0)->Width()
940*b1cdbd2cSJim Jagielski : 0;
941*b1cdbd2cSJim Jagielski nHLineX += aOverallAreaPos.X();
942*b1cdbd2cSJim Jagielski
943*b1cdbd2cSJim Jagielski Color aDelimiterLineColor( ::svtools::ColorConfig().GetColorValue( ::svtools::CALCGRID ).nColor );
944*b1cdbd2cSJim Jagielski
945*b1cdbd2cSJim Jagielski // redraw the invalid fields
946*b1cdbd2cSJim Jagielski sal_Bool bRetouching = sal_False;
947*b1cdbd2cSJim Jagielski for ( sal_uLong nRelRow = nRelTopRow;
948*b1cdbd2cSJim Jagielski nRelRow <= nRelBottomRow && (sal_uLong)nTopRow+nRelRow < (sal_uLong)nRowCount;
949*b1cdbd2cSJim Jagielski ++nRelRow, aPos.Y() += nDataRowHeigt )
950*b1cdbd2cSJim Jagielski {
951*b1cdbd2cSJim Jagielski // get row
952*b1cdbd2cSJim Jagielski // Zur Sicherheit auf zul"assigen Bereich abfragen:
953*b1cdbd2cSJim Jagielski DBG_ASSERT( (sal_uInt16)(nTopRow+nRelRow) < nRowCount, "BrowseBox::ImplPaintData: invalid seek" );
954*b1cdbd2cSJim Jagielski if ( (nTopRow+long(nRelRow)) < 0 || (sal_uInt16)(nTopRow+nRelRow) >= nRowCount )
955*b1cdbd2cSJim Jagielski continue;
956*b1cdbd2cSJim Jagielski
957*b1cdbd2cSJim Jagielski // prepare row
958*b1cdbd2cSJim Jagielski sal_uLong nRow = nTopRow+nRelRow;
959*b1cdbd2cSJim Jagielski if ( !SeekRow( nRow) ) {
960*b1cdbd2cSJim Jagielski DBG_ERROR("BrowseBox::ImplPaintData: SeekRow gescheitert");
961*b1cdbd2cSJim Jagielski }
962*b1cdbd2cSJim Jagielski _rOut.SetClipRegion();
963*b1cdbd2cSJim Jagielski aPos.X() = aOverallAreaPos.X();
964*b1cdbd2cSJim Jagielski
965*b1cdbd2cSJim Jagielski
966*b1cdbd2cSJim Jagielski // #73325# don't paint the row outside the painting rectangle (DG)
967*b1cdbd2cSJim Jagielski // prepare auto-highlight
968*b1cdbd2cSJim Jagielski Rectangle aRowRect( Point( _rRect.TopLeft().X(), aPos.Y() ),
969*b1cdbd2cSJim Jagielski Size( _rRect.GetSize().Width(), nDataRowHeigt ) );
970*b1cdbd2cSJim Jagielski PaintRow( _rOut, aRowRect );
971*b1cdbd2cSJim Jagielski
972*b1cdbd2cSJim Jagielski sal_Bool bRowSelected = _bDrawSelections
973*b1cdbd2cSJim Jagielski && !bHideSelect
974*b1cdbd2cSJim Jagielski && IsRowSelected( nRow );
975*b1cdbd2cSJim Jagielski if ( bRowSelected )
976*b1cdbd2cSJim Jagielski {
977*b1cdbd2cSJim Jagielski _rOut.SetTextColor( rHighlightTextColor );
978*b1cdbd2cSJim Jagielski _rOut.SetFillColor( rHighlightFillColor );
979*b1cdbd2cSJim Jagielski _rOut.SetLineColor();
980*b1cdbd2cSJim Jagielski _rOut.DrawRect( aRowRect );
981*b1cdbd2cSJim Jagielski }
982*b1cdbd2cSJim Jagielski
983*b1cdbd2cSJim Jagielski // iterate through columns to redraw
984*b1cdbd2cSJim Jagielski sal_uInt16 nCol;
985*b1cdbd2cSJim Jagielski for ( nCol = 0; nCol < pCols->Count(); ++nCol )
986*b1cdbd2cSJim Jagielski {
987*b1cdbd2cSJim Jagielski // get column
988*b1cdbd2cSJim Jagielski BrowserColumn *pCol = pCols->GetObject(nCol);
989*b1cdbd2cSJim Jagielski
990*b1cdbd2cSJim Jagielski // at end of invalid area
991*b1cdbd2cSJim Jagielski if ( aPos.X() >= _rRect.Right() )
992*b1cdbd2cSJim Jagielski break;
993*b1cdbd2cSJim Jagielski
994*b1cdbd2cSJim Jagielski // skip invisible colums between frozen and scrollable area
995*b1cdbd2cSJim Jagielski if ( nCol < nFirstCol && !pCol->IsFrozen() )
996*b1cdbd2cSJim Jagielski {
997*b1cdbd2cSJim Jagielski nCol = nFirstCol;
998*b1cdbd2cSJim Jagielski pCol = pCols->GetObject(nCol);
999*b1cdbd2cSJim Jagielski if (!pCol)
1000*b1cdbd2cSJim Jagielski { // FS - 21.05.99 - 66325
1001*b1cdbd2cSJim Jagielski // ist zwar eigentlich woanders (an der richtigen Stelle) gefixt, aber sicher ist sicher ...
1002*b1cdbd2cSJim Jagielski DBG_ERROR("BrowseBox::PaintData : nFirstCol is probably invalid !");
1003*b1cdbd2cSJim Jagielski break;
1004*b1cdbd2cSJim Jagielski }
1005*b1cdbd2cSJim Jagielski }
1006*b1cdbd2cSJim Jagielski
1007*b1cdbd2cSJim Jagielski // prepare Column-AutoHighlight
1008*b1cdbd2cSJim Jagielski sal_Bool bColAutoHighlight = _bDrawSelections
1009*b1cdbd2cSJim Jagielski && bColumnCursor
1010*b1cdbd2cSJim Jagielski && IsColumnSelected( pCol->GetId() );
1011*b1cdbd2cSJim Jagielski if ( bColAutoHighlight )
1012*b1cdbd2cSJim Jagielski {
1013*b1cdbd2cSJim Jagielski _rOut.SetClipRegion();
1014*b1cdbd2cSJim Jagielski _rOut.SetTextColor( rHighlightTextColor );
1015*b1cdbd2cSJim Jagielski _rOut.SetFillColor( rHighlightFillColor );
1016*b1cdbd2cSJim Jagielski _rOut.SetLineColor();
1017*b1cdbd2cSJim Jagielski Rectangle aFieldRect( aPos,
1018*b1cdbd2cSJim Jagielski Size( pCol->Width(), nDataRowHeigt ) );
1019*b1cdbd2cSJim Jagielski _rOut.DrawRect( aFieldRect );
1020*b1cdbd2cSJim Jagielski }
1021*b1cdbd2cSJim Jagielski
1022*b1cdbd2cSJim Jagielski if (!m_bFocusOnlyCursor && (pCol->GetId() == GetCurColumnId()) && (nRow == (sal_uLong)GetCurRow()))
1023*b1cdbd2cSJim Jagielski DrawCursor();
1024*b1cdbd2cSJim Jagielski
1025*b1cdbd2cSJim Jagielski // draw a single field
1026*b1cdbd2cSJim Jagielski // #63864#, Sonst wird auch etwas gezeichnet, bsp Handle Column
1027*b1cdbd2cSJim Jagielski if (pCol->Width())
1028*b1cdbd2cSJim Jagielski {
1029*b1cdbd2cSJim Jagielski // clip the column's output to the field area
1030*b1cdbd2cSJim Jagielski if (_bForeignDevice)
1031*b1cdbd2cSJim Jagielski { // (not neccessary if painting onto the data window)
1032*b1cdbd2cSJim Jagielski Size aFieldSize(pCol->Width(), nDataRowHeigt);
1033*b1cdbd2cSJim Jagielski
1034*b1cdbd2cSJim Jagielski if (aPos.X() + aFieldSize.Width() > aOverallAreaBRPos.X())
1035*b1cdbd2cSJim Jagielski aFieldSize.Width() = aOverallAreaBRPos.X() - aPos.X();
1036*b1cdbd2cSJim Jagielski
1037*b1cdbd2cSJim Jagielski if (aPos.Y() + aFieldSize.Height() > aOverallAreaBRPos.Y() + 1)
1038*b1cdbd2cSJim Jagielski {
1039*b1cdbd2cSJim Jagielski // for non-handle cols we don't clip vertically : we just don't draw the cell if the line isn't completely visible
1040*b1cdbd2cSJim Jagielski if (pCol->GetId() != 0)
1041*b1cdbd2cSJim Jagielski continue;
1042*b1cdbd2cSJim Jagielski aFieldSize.Height() = aOverallAreaBRPos.Y() + 1 - aPos.Y();
1043*b1cdbd2cSJim Jagielski }
1044*b1cdbd2cSJim Jagielski
1045*b1cdbd2cSJim Jagielski Region aClipToField(Rectangle(aPos, aFieldSize));
1046*b1cdbd2cSJim Jagielski _rOut.SetClipRegion(aClipToField);
1047*b1cdbd2cSJim Jagielski }
1048*b1cdbd2cSJim Jagielski pCol->Draw( *this, _rOut, aPos, sal_False );
1049*b1cdbd2cSJim Jagielski if (_bForeignDevice)
1050*b1cdbd2cSJim Jagielski _rOut.SetClipRegion();
1051*b1cdbd2cSJim Jagielski }
1052*b1cdbd2cSJim Jagielski
1053*b1cdbd2cSJim Jagielski // reset Column-auto-highlight
1054*b1cdbd2cSJim Jagielski if ( bColAutoHighlight )
1055*b1cdbd2cSJim Jagielski {
1056*b1cdbd2cSJim Jagielski _rOut.SetTextColor( aOldTextColor );
1057*b1cdbd2cSJim Jagielski _rOut.SetFillColor( aOldFillColor );
1058*b1cdbd2cSJim Jagielski _rOut.SetLineColor( aOldLineColor );
1059*b1cdbd2cSJim Jagielski }
1060*b1cdbd2cSJim Jagielski
1061*b1cdbd2cSJim Jagielski // skip column
1062*b1cdbd2cSJim Jagielski aPos.X() += pCol->Width();
1063*b1cdbd2cSJim Jagielski }
1064*b1cdbd2cSJim Jagielski
1065*b1cdbd2cSJim Jagielski if ( nCol == pCols->Count() )
1066*b1cdbd2cSJim Jagielski bRetouching = sal_True;
1067*b1cdbd2cSJim Jagielski
1068*b1cdbd2cSJim Jagielski // reset auto-highlight
1069*b1cdbd2cSJim Jagielski if ( bRowSelected )
1070*b1cdbd2cSJim Jagielski {
1071*b1cdbd2cSJim Jagielski _rOut.SetTextColor( aOldTextColor );
1072*b1cdbd2cSJim Jagielski _rOut.SetFillColor( aOldFillColor );
1073*b1cdbd2cSJim Jagielski _rOut.SetLineColor( aOldLineColor );
1074*b1cdbd2cSJim Jagielski }
1075*b1cdbd2cSJim Jagielski
1076*b1cdbd2cSJim Jagielski if ( bHLines )
1077*b1cdbd2cSJim Jagielski {
1078*b1cdbd2cSJim Jagielski // draw horizontal delimitation lines
1079*b1cdbd2cSJim Jagielski _rOut.SetClipRegion();
1080*b1cdbd2cSJim Jagielski _rOut.Push( PUSH_LINECOLOR );
1081*b1cdbd2cSJim Jagielski _rOut.SetLineColor( aDelimiterLineColor );
1082*b1cdbd2cSJim Jagielski long nY = aPos.Y() + nDataRowHeigt - 1;
1083*b1cdbd2cSJim Jagielski if (nY <= aOverallAreaBRPos.Y())
1084*b1cdbd2cSJim Jagielski _rOut.DrawLine( Point( nHLineX, nY ),
1085*b1cdbd2cSJim Jagielski Point( bVLines
1086*b1cdbd2cSJim Jagielski ? std::min(long(long(aPos.X()) - 1), aOverallAreaBRPos.X())
1087*b1cdbd2cSJim Jagielski : aOverallAreaBRPos.X(),
1088*b1cdbd2cSJim Jagielski nY ) );
1089*b1cdbd2cSJim Jagielski _rOut.Pop();
1090*b1cdbd2cSJim Jagielski }
1091*b1cdbd2cSJim Jagielski }
1092*b1cdbd2cSJim Jagielski
1093*b1cdbd2cSJim Jagielski if (aPos.Y() > aOverallAreaBRPos.Y() + 1)
1094*b1cdbd2cSJim Jagielski aPos.Y() = aOverallAreaBRPos.Y() + 1;
1095*b1cdbd2cSJim Jagielski // needed for some of the following drawing
1096*b1cdbd2cSJim Jagielski
1097*b1cdbd2cSJim Jagielski // retouching
1098*b1cdbd2cSJim Jagielski _rOut.SetClipRegion();
1099*b1cdbd2cSJim Jagielski aOldLineColor = _rOut.GetLineColor();
1100*b1cdbd2cSJim Jagielski aOldFillColor = _rOut.GetFillColor();
1101*b1cdbd2cSJim Jagielski _rOut.SetFillColor( rSettings.GetFaceColor() );
1102*b1cdbd2cSJim Jagielski if ( pCols->Count() && ( pCols->GetObject(0)->GetId() == 0 ) && ( aPos.Y() <= _rRect.Bottom() ) )
1103*b1cdbd2cSJim Jagielski {
1104*b1cdbd2cSJim Jagielski // fill rectangle gray below handle column
1105*b1cdbd2cSJim Jagielski // DG: fill it only until the end of the drawing rect and not to the end, as this may overpaint handle columns
1106*b1cdbd2cSJim Jagielski _rOut.SetLineColor( Color( COL_BLACK ) );
1107*b1cdbd2cSJim Jagielski _rOut.DrawRect( Rectangle(
1108*b1cdbd2cSJim Jagielski Point( aOverallAreaPos.X() - 1, aPos.Y() - 1 ),
1109*b1cdbd2cSJim Jagielski Point( aOverallAreaPos.X() + pCols->GetObject(0)->Width() - 1,
1110*b1cdbd2cSJim Jagielski _rRect.Bottom() + 1) ) );
1111*b1cdbd2cSJim Jagielski }
1112*b1cdbd2cSJim Jagielski _rOut.SetFillColor( aOldFillColor );
1113*b1cdbd2cSJim Jagielski
1114*b1cdbd2cSJim Jagielski // draw vertical delimitational line between frozen and scrollable cols
1115*b1cdbd2cSJim Jagielski _rOut.SetLineColor( COL_BLACK );
1116*b1cdbd2cSJim Jagielski long nFrozenWidth = GetFrozenWidth()-1;
1117*b1cdbd2cSJim Jagielski _rOut.DrawLine( Point( aOverallAreaPos.X() + nFrozenWidth, aPos.Y() ),
1118*b1cdbd2cSJim Jagielski Point( aOverallAreaPos.X() + nFrozenWidth, bHLines
1119*b1cdbd2cSJim Jagielski ? aPos.Y() - 1
1120*b1cdbd2cSJim Jagielski : aOverallAreaBRPos.Y() ) );
1121*b1cdbd2cSJim Jagielski
1122*b1cdbd2cSJim Jagielski // draw vertical delimitational lines?
1123*b1cdbd2cSJim Jagielski if ( bVLines )
1124*b1cdbd2cSJim Jagielski {
1125*b1cdbd2cSJim Jagielski _rOut.SetLineColor( aDelimiterLineColor );
1126*b1cdbd2cSJim Jagielski Point aVertPos( aOverallAreaPos.X() - 1, aOverallAreaPos.Y() );
1127*b1cdbd2cSJim Jagielski long nDeltaY = aOverallAreaBRPos.Y();
1128*b1cdbd2cSJim Jagielski for ( sal_uInt16 nCol = 0; nCol < pCols->Count(); ++nCol )
1129*b1cdbd2cSJim Jagielski {
1130*b1cdbd2cSJim Jagielski // get column
1131*b1cdbd2cSJim Jagielski BrowserColumn *pCol = pCols->GetObject(nCol);
1132*b1cdbd2cSJim Jagielski
1133*b1cdbd2cSJim Jagielski // skip invisible colums between frozen and scrollable area
1134*b1cdbd2cSJim Jagielski if ( nCol < nFirstCol && !pCol->IsFrozen() )
1135*b1cdbd2cSJim Jagielski {
1136*b1cdbd2cSJim Jagielski nCol = nFirstCol;
1137*b1cdbd2cSJim Jagielski pCol = pCols->GetObject(nCol);
1138*b1cdbd2cSJim Jagielski }
1139*b1cdbd2cSJim Jagielski
1140*b1cdbd2cSJim Jagielski // skip column
1141*b1cdbd2cSJim Jagielski aVertPos.X() += pCol->Width();
1142*b1cdbd2cSJim Jagielski
1143*b1cdbd2cSJim Jagielski // at end of invalid area
1144*b1cdbd2cSJim Jagielski // invalid area is first reached when X > Right
1145*b1cdbd2cSJim Jagielski // and not >=
1146*b1cdbd2cSJim Jagielski if ( aVertPos.X() > _rRect.Right() )
1147*b1cdbd2cSJim Jagielski break;
1148*b1cdbd2cSJim Jagielski
1149*b1cdbd2cSJim Jagielski // draw a single line
1150*b1cdbd2cSJim Jagielski if ( pCol->GetId() != 0 )
1151*b1cdbd2cSJim Jagielski _rOut.DrawLine( aVertPos, Point( aVertPos.X(),
1152*b1cdbd2cSJim Jagielski bHLines
1153*b1cdbd2cSJim Jagielski ? aPos.Y() - 1
1154*b1cdbd2cSJim Jagielski : aPos.Y() + nDeltaY ) );
1155*b1cdbd2cSJim Jagielski }
1156*b1cdbd2cSJim Jagielski }
1157*b1cdbd2cSJim Jagielski
1158*b1cdbd2cSJim Jagielski _rOut.SetLineColor( aOldLineColor );
1159*b1cdbd2cSJim Jagielski }
1160*b1cdbd2cSJim Jagielski
1161*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1162*b1cdbd2cSJim Jagielski
PaintData(Window & rWin,const Rectangle & rRect)1163*b1cdbd2cSJim Jagielski void BrowseBox::PaintData( Window& rWin, const Rectangle& rRect )
1164*b1cdbd2cSJim Jagielski {
1165*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1166*b1cdbd2cSJim Jagielski if ( !bBootstrapped && IsReallyVisible() )
1167*b1cdbd2cSJim Jagielski BrowseBox::StateChanged( STATE_CHANGE_INITSHOW );
1168*b1cdbd2cSJim Jagielski
1169*b1cdbd2cSJim Jagielski // initializations
1170*b1cdbd2cSJim Jagielski if ( !pCols || !pCols->Count() || !rWin.IsUpdateMode() )
1171*b1cdbd2cSJim Jagielski return;
1172*b1cdbd2cSJim Jagielski if ( getDataWindow()->bResizeOnPaint )
1173*b1cdbd2cSJim Jagielski Resize();
1174*b1cdbd2cSJim Jagielski // MI: wer war das denn? Window::Update();
1175*b1cdbd2cSJim Jagielski
1176*b1cdbd2cSJim Jagielski ImplPaintData(rWin, rRect, sal_False, sal_True);
1177*b1cdbd2cSJim Jagielski }
1178*b1cdbd2cSJim Jagielski
1179*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1180*b1cdbd2cSJim Jagielski
UpdateScrollbars()1181*b1cdbd2cSJim Jagielski void BrowseBox::UpdateScrollbars()
1182*b1cdbd2cSJim Jagielski {
1183*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1184*b1cdbd2cSJim Jagielski
1185*b1cdbd2cSJim Jagielski if ( !bBootstrapped || !IsUpdateMode() )
1186*b1cdbd2cSJim Jagielski return;
1187*b1cdbd2cSJim Jagielski
1188*b1cdbd2cSJim Jagielski // Rekursionsschutz
1189*b1cdbd2cSJim Jagielski BrowserDataWin *pBDW = (BrowserDataWin*) pDataWin;
1190*b1cdbd2cSJim Jagielski if ( pBDW->bInUpdateScrollbars )
1191*b1cdbd2cSJim Jagielski {
1192*b1cdbd2cSJim Jagielski pBDW->bHadRecursion = sal_True;
1193*b1cdbd2cSJim Jagielski return;
1194*b1cdbd2cSJim Jagielski }
1195*b1cdbd2cSJim Jagielski pBDW->bInUpdateScrollbars = sal_True;
1196*b1cdbd2cSJim Jagielski
1197*b1cdbd2cSJim Jagielski // the size of the corner window (and the width of the VSB/height of the HSB)
1198*b1cdbd2cSJim Jagielski sal_uLong nCornerSize = GetSettings().GetStyleSettings().GetScrollBarSize();
1199*b1cdbd2cSJim Jagielski if (IsZoom())
1200*b1cdbd2cSJim Jagielski nCornerSize = (sal_uLong)(nCornerSize * (double)GetZoom());
1201*b1cdbd2cSJim Jagielski
1202*b1cdbd2cSJim Jagielski // needs VScroll?
1203*b1cdbd2cSJim Jagielski long nMaxRows = (pDataWin->GetSizePixel().Height()) / GetDataRowHeight();
1204*b1cdbd2cSJim Jagielski sal_Bool bNeedsVScroll = getDataWindow()->bAutoVScroll
1205*b1cdbd2cSJim Jagielski ? nTopRow || ( nRowCount > nMaxRows )
1206*b1cdbd2cSJim Jagielski : !getDataWindow()->bNoVScroll;
1207*b1cdbd2cSJim Jagielski Size aDataWinSize = pDataWin->GetSizePixel();
1208*b1cdbd2cSJim Jagielski if ( !bNeedsVScroll )
1209*b1cdbd2cSJim Jagielski {
1210*b1cdbd2cSJim Jagielski if ( pVScroll->IsVisible() )
1211*b1cdbd2cSJim Jagielski {
1212*b1cdbd2cSJim Jagielski pVScroll->Hide();
1213*b1cdbd2cSJim Jagielski Size aNewSize( aDataWinSize );
1214*b1cdbd2cSJim Jagielski aNewSize.Width() = GetOutputSizePixel().Width();
1215*b1cdbd2cSJim Jagielski aDataWinSize = aNewSize;
1216*b1cdbd2cSJim Jagielski }
1217*b1cdbd2cSJim Jagielski }
1218*b1cdbd2cSJim Jagielski else if ( !pVScroll->IsVisible() )
1219*b1cdbd2cSJim Jagielski {
1220*b1cdbd2cSJim Jagielski Size aNewSize( aDataWinSize );
1221*b1cdbd2cSJim Jagielski aNewSize.Width() = GetOutputSizePixel().Width() - nCornerSize;
1222*b1cdbd2cSJim Jagielski aDataWinSize = aNewSize;
1223*b1cdbd2cSJim Jagielski }
1224*b1cdbd2cSJim Jagielski
1225*b1cdbd2cSJim Jagielski // needs HScroll?
1226*b1cdbd2cSJim Jagielski sal_uLong nLastCol = GetColumnAtXPosPixel( aDataWinSize.Width() - 1 );
1227*b1cdbd2cSJim Jagielski
1228*b1cdbd2cSJim Jagielski sal_uInt16 nFrozenCols = FrozenColCount();
1229*b1cdbd2cSJim Jagielski sal_Bool bNeedsHScroll = getDataWindow()->bAutoHScroll
1230*b1cdbd2cSJim Jagielski ? ( nFirstCol > nFrozenCols ) || ( nLastCol <= pCols->Count() )
1231*b1cdbd2cSJim Jagielski : !getDataWindow()->bNoHScroll;
1232*b1cdbd2cSJim Jagielski if ( !bNeedsHScroll )
1233*b1cdbd2cSJim Jagielski {
1234*b1cdbd2cSJim Jagielski if ( aHScroll.IsVisible() )
1235*b1cdbd2cSJim Jagielski {
1236*b1cdbd2cSJim Jagielski aHScroll.Hide();
1237*b1cdbd2cSJim Jagielski }
1238*b1cdbd2cSJim Jagielski aDataWinSize.Height() = GetOutputSizePixel().Height() - GetTitleHeight();
1239*b1cdbd2cSJim Jagielski if ( nControlAreaWidth != USHRT_MAX )
1240*b1cdbd2cSJim Jagielski aDataWinSize.Height() -= nCornerSize;
1241*b1cdbd2cSJim Jagielski }
1242*b1cdbd2cSJim Jagielski else if ( !aHScroll.IsVisible() )
1243*b1cdbd2cSJim Jagielski {
1244*b1cdbd2cSJim Jagielski Size aNewSize( aDataWinSize );
1245*b1cdbd2cSJim Jagielski aNewSize.Height() = GetOutputSizePixel().Height() - GetTitleHeight() - nCornerSize;
1246*b1cdbd2cSJim Jagielski aDataWinSize = aNewSize;
1247*b1cdbd2cSJim Jagielski }
1248*b1cdbd2cSJim Jagielski
1249*b1cdbd2cSJim Jagielski // adjust position and Width of horizontal scrollbar
1250*b1cdbd2cSJim Jagielski sal_uLong nHScrX = nControlAreaWidth == USHRT_MAX
1251*b1cdbd2cSJim Jagielski ? 0
1252*b1cdbd2cSJim Jagielski : nControlAreaWidth;
1253*b1cdbd2cSJim Jagielski
1254*b1cdbd2cSJim Jagielski aHScroll.SetPosSizePixel(
1255*b1cdbd2cSJim Jagielski Point( nHScrX, GetOutputSizePixel().Height() - nCornerSize ),
1256*b1cdbd2cSJim Jagielski Size( aDataWinSize.Width() - nHScrX, nCornerSize ) );
1257*b1cdbd2cSJim Jagielski
1258*b1cdbd2cSJim Jagielski // Scrollable Columns insgesamt
1259*b1cdbd2cSJim Jagielski short nScrollCols = short(pCols->Count()) - (short)nFrozenCols;
1260*b1cdbd2cSJim Jagielski /*short nVisibleHSize= std::max(nLastCol == BROWSER_INVALIDID
1261*b1cdbd2cSJim Jagielski ? pCols->Count() - nFirstCol -1
1262*b1cdbd2cSJim Jagielski : nLastCol - nFirstCol - 1, 0);
1263*b1cdbd2cSJim Jagielski
1264*b1cdbd2cSJim Jagielski aHScroll.SetVisibleSize( nVisibleHSize );
1265*b1cdbd2cSJim Jagielski aHScroll.SetRange( Range( 0, Max( std::min(nScrollCols, nVisibleHSize), (short)0 ) ) );
1266*b1cdbd2cSJim Jagielski if ( bNeedsHScroll && !aHScroll.IsVisible() )
1267*b1cdbd2cSJim Jagielski aHScroll.Show();*/
1268*b1cdbd2cSJim Jagielski
1269*b1cdbd2cSJim Jagielski // Sichtbare Columns
1270*b1cdbd2cSJim Jagielski short nVisibleHSize = nLastCol == BROWSER_INVALIDID
1271*b1cdbd2cSJim Jagielski ? (short)( pCols->Count() - nFirstCol )
1272*b1cdbd2cSJim Jagielski : (short)( nLastCol - nFirstCol );
1273*b1cdbd2cSJim Jagielski
1274*b1cdbd2cSJim Jagielski short nRange = Max( nScrollCols, (short)0 );
1275*b1cdbd2cSJim Jagielski aHScroll.SetVisibleSize( nVisibleHSize );
1276*b1cdbd2cSJim Jagielski aHScroll.SetRange( Range( 0, nRange ));
1277*b1cdbd2cSJim Jagielski if ( bNeedsHScroll && !aHScroll.IsVisible() )
1278*b1cdbd2cSJim Jagielski aHScroll.Show();
1279*b1cdbd2cSJim Jagielski
1280*b1cdbd2cSJim Jagielski // adjust position and height of vertical scrollbar
1281*b1cdbd2cSJim Jagielski pVScroll->SetPageSize( nMaxRows );
1282*b1cdbd2cSJim Jagielski
1283*b1cdbd2cSJim Jagielski if ( nTopRow > nRowCount )
1284*b1cdbd2cSJim Jagielski {
1285*b1cdbd2cSJim Jagielski nTopRow = nRowCount - 1;
1286*b1cdbd2cSJim Jagielski DBG_ERROR("BrowseBox: nTopRow > nRowCount");
1287*b1cdbd2cSJim Jagielski }
1288*b1cdbd2cSJim Jagielski
1289*b1cdbd2cSJim Jagielski if ( pVScroll->GetThumbPos() != nTopRow )
1290*b1cdbd2cSJim Jagielski pVScroll->SetThumbPos( nTopRow );
1291*b1cdbd2cSJim Jagielski long nVisibleSize = Min( Min( nRowCount, nMaxRows ), long(nRowCount-nTopRow) );
1292*b1cdbd2cSJim Jagielski pVScroll->SetVisibleSize( nVisibleSize ? nVisibleSize : 1 );
1293*b1cdbd2cSJim Jagielski pVScroll->SetRange( Range( 0, nRowCount ) );
1294*b1cdbd2cSJim Jagielski pVScroll->SetPosSizePixel(
1295*b1cdbd2cSJim Jagielski Point( aDataWinSize.Width(), GetTitleHeight() ),
1296*b1cdbd2cSJim Jagielski Size( nCornerSize, aDataWinSize.Height()) );
1297*b1cdbd2cSJim Jagielski if ( nRowCount <
1298*b1cdbd2cSJim Jagielski long( aDataWinSize.Height() / GetDataRowHeight() ) )
1299*b1cdbd2cSJim Jagielski ScrollRows( -nTopRow );
1300*b1cdbd2cSJim Jagielski if ( bNeedsVScroll && !pVScroll->IsVisible() )
1301*b1cdbd2cSJim Jagielski pVScroll->Show();
1302*b1cdbd2cSJim Jagielski
1303*b1cdbd2cSJim Jagielski pDataWin->SetPosSizePixel(
1304*b1cdbd2cSJim Jagielski Point( 0, GetTitleHeight() ),
1305*b1cdbd2cSJim Jagielski aDataWinSize );
1306*b1cdbd2cSJim Jagielski
1307*b1cdbd2cSJim Jagielski // needs corner-window?
1308*b1cdbd2cSJim Jagielski // (do that AFTER positioning BOTH scrollbars)
1309*b1cdbd2cSJim Jagielski sal_uLong nActualCorderWidth = 0;
1310*b1cdbd2cSJim Jagielski if (aHScroll.IsVisible() && pVScroll && pVScroll->IsVisible() )
1311*b1cdbd2cSJim Jagielski {
1312*b1cdbd2cSJim Jagielski // if we have both scrollbars, the corner window fills the point of intersection of these two
1313*b1cdbd2cSJim Jagielski nActualCorderWidth = nCornerSize;
1314*b1cdbd2cSJim Jagielski }
1315*b1cdbd2cSJim Jagielski else if ( !aHScroll.IsVisible() && ( nControlAreaWidth != USHRT_MAX ) )
1316*b1cdbd2cSJim Jagielski {
1317*b1cdbd2cSJim Jagielski // if we have no horizontal scrollbar, but a control area, we need the corner window to
1318*b1cdbd2cSJim Jagielski // fill the space between the control are and the right border
1319*b1cdbd2cSJim Jagielski nActualCorderWidth = GetOutputSizePixel().Width() - nControlAreaWidth;
1320*b1cdbd2cSJim Jagielski }
1321*b1cdbd2cSJim Jagielski if ( nActualCorderWidth )
1322*b1cdbd2cSJim Jagielski {
1323*b1cdbd2cSJim Jagielski if ( !getDataWindow()->pCornerWin )
1324*b1cdbd2cSJim Jagielski getDataWindow()->pCornerWin = new ScrollBarBox( this, 0 );
1325*b1cdbd2cSJim Jagielski getDataWindow()->pCornerWin->SetPosSizePixel(
1326*b1cdbd2cSJim Jagielski Point( GetOutputSizePixel().Width() - nActualCorderWidth, aHScroll.GetPosPixel().Y() ),
1327*b1cdbd2cSJim Jagielski Size( nActualCorderWidth, nCornerSize ) );
1328*b1cdbd2cSJim Jagielski getDataWindow()->pCornerWin->Show();
1329*b1cdbd2cSJim Jagielski }
1330*b1cdbd2cSJim Jagielski else
1331*b1cdbd2cSJim Jagielski DELETEZ( getDataWindow()->pCornerWin );
1332*b1cdbd2cSJim Jagielski
1333*b1cdbd2cSJim Jagielski // ggf. Headerbar mitscrollen
1334*b1cdbd2cSJim Jagielski if ( getDataWindow()->pHeaderBar )
1335*b1cdbd2cSJim Jagielski {
1336*b1cdbd2cSJim Jagielski long nWidth = 0;
1337*b1cdbd2cSJim Jagielski for ( sal_uInt16 nCol = 0;
1338*b1cdbd2cSJim Jagielski nCol < pCols->Count() && nCol < nFirstCol;
1339*b1cdbd2cSJim Jagielski ++nCol )
1340*b1cdbd2cSJim Jagielski {
1341*b1cdbd2cSJim Jagielski // HandleColumn nicht
1342*b1cdbd2cSJim Jagielski if ( pCols->GetObject(nCol)->GetId() )
1343*b1cdbd2cSJim Jagielski nWidth += pCols->GetObject(nCol)->Width();
1344*b1cdbd2cSJim Jagielski }
1345*b1cdbd2cSJim Jagielski
1346*b1cdbd2cSJim Jagielski getDataWindow()->pHeaderBar->SetOffset( nWidth );
1347*b1cdbd2cSJim Jagielski }
1348*b1cdbd2cSJim Jagielski
1349*b1cdbd2cSJim Jagielski pBDW->bInUpdateScrollbars = sal_False;
1350*b1cdbd2cSJim Jagielski if ( pBDW->bHadRecursion )
1351*b1cdbd2cSJim Jagielski {
1352*b1cdbd2cSJim Jagielski pBDW->bHadRecursion = sal_False;
1353*b1cdbd2cSJim Jagielski UpdateScrollbars();
1354*b1cdbd2cSJim Jagielski }
1355*b1cdbd2cSJim Jagielski }
1356*b1cdbd2cSJim Jagielski
1357*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1358*b1cdbd2cSJim Jagielski
SetUpdateMode(sal_Bool bUpdate)1359*b1cdbd2cSJim Jagielski void BrowseBox::SetUpdateMode( sal_Bool bUpdate )
1360*b1cdbd2cSJim Jagielski {
1361*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1362*b1cdbd2cSJim Jagielski
1363*b1cdbd2cSJim Jagielski sal_Bool bWasUpdate = IsUpdateMode();
1364*b1cdbd2cSJim Jagielski if ( bWasUpdate == bUpdate )
1365*b1cdbd2cSJim Jagielski return;
1366*b1cdbd2cSJim Jagielski
1367*b1cdbd2cSJim Jagielski Control::SetUpdateMode( bUpdate );
1368*b1cdbd2cSJim Jagielski // OV
1369*b1cdbd2cSJim Jagielski // Wenn an der BrowseBox WB_CLIPCHILDREN gesetzt ist (wg. Flackerminimierung),
1370*b1cdbd2cSJim Jagielski // wird das Datenfenster nicht von SetUpdateMode invalidiert.
1371*b1cdbd2cSJim Jagielski if( bUpdate )
1372*b1cdbd2cSJim Jagielski getDataWindow()->Invalidate();
1373*b1cdbd2cSJim Jagielski getDataWindow()->SetUpdateMode( bUpdate );
1374*b1cdbd2cSJim Jagielski
1375*b1cdbd2cSJim Jagielski
1376*b1cdbd2cSJim Jagielski if ( bUpdate )
1377*b1cdbd2cSJim Jagielski {
1378*b1cdbd2cSJim Jagielski if ( bBootstrapped )
1379*b1cdbd2cSJim Jagielski {
1380*b1cdbd2cSJim Jagielski UpdateScrollbars();
1381*b1cdbd2cSJim Jagielski AutoSizeLastColumn();
1382*b1cdbd2cSJim Jagielski }
1383*b1cdbd2cSJim Jagielski DoShowCursor( "SetUpdateMode" );
1384*b1cdbd2cSJim Jagielski }
1385*b1cdbd2cSJim Jagielski else
1386*b1cdbd2cSJim Jagielski DoHideCursor( "SetUpdateMode" );
1387*b1cdbd2cSJim Jagielski }
1388*b1cdbd2cSJim Jagielski
1389*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1390*b1cdbd2cSJim Jagielski
GetUpdateMode() const1391*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::GetUpdateMode() const
1392*b1cdbd2cSJim Jagielski {
1393*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1394*b1cdbd2cSJim Jagielski
1395*b1cdbd2cSJim Jagielski return getDataWindow()->IsUpdateMode();
1396*b1cdbd2cSJim Jagielski }
1397*b1cdbd2cSJim Jagielski
1398*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1399*b1cdbd2cSJim Jagielski
GetFrozenWidth() const1400*b1cdbd2cSJim Jagielski long BrowseBox::GetFrozenWidth() const
1401*b1cdbd2cSJim Jagielski {
1402*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1403*b1cdbd2cSJim Jagielski
1404*b1cdbd2cSJim Jagielski long nWidth = 0;
1405*b1cdbd2cSJim Jagielski for ( sal_uInt16 nCol = 0;
1406*b1cdbd2cSJim Jagielski nCol < pCols->Count() && pCols->GetObject(nCol)->IsFrozen();
1407*b1cdbd2cSJim Jagielski ++nCol )
1408*b1cdbd2cSJim Jagielski nWidth += pCols->GetObject(nCol)->Width();
1409*b1cdbd2cSJim Jagielski return nWidth;
1410*b1cdbd2cSJim Jagielski }
1411*b1cdbd2cSJim Jagielski
1412*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1413*b1cdbd2cSJim Jagielski
ColumnInserted(sal_uInt16 nPos)1414*b1cdbd2cSJim Jagielski void BrowseBox::ColumnInserted( sal_uInt16 nPos )
1415*b1cdbd2cSJim Jagielski {
1416*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1417*b1cdbd2cSJim Jagielski
1418*b1cdbd2cSJim Jagielski if ( pColSel )
1419*b1cdbd2cSJim Jagielski pColSel->Insert( nPos );
1420*b1cdbd2cSJim Jagielski UpdateScrollbars();
1421*b1cdbd2cSJim Jagielski }
1422*b1cdbd2cSJim Jagielski
1423*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1424*b1cdbd2cSJim Jagielski
FrozenColCount() const1425*b1cdbd2cSJim Jagielski sal_uInt16 BrowseBox::FrozenColCount() const
1426*b1cdbd2cSJim Jagielski {
1427*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1428*b1cdbd2cSJim Jagielski sal_uInt16 nCol;
1429*b1cdbd2cSJim Jagielski for ( nCol = 0;
1430*b1cdbd2cSJim Jagielski nCol < pCols->Count() && pCols->GetObject(nCol)->IsFrozen();
1431*b1cdbd2cSJim Jagielski ++nCol )
1432*b1cdbd2cSJim Jagielski /* empty loop */;
1433*b1cdbd2cSJim Jagielski return nCol;
1434*b1cdbd2cSJim Jagielski }
1435*b1cdbd2cSJim Jagielski
1436*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1437*b1cdbd2cSJim Jagielski
IMPL_LINK(BrowseBox,ScrollHdl,ScrollBar *,pBar)1438*b1cdbd2cSJim Jagielski IMPL_LINK(BrowseBox,ScrollHdl,ScrollBar*,pBar)
1439*b1cdbd2cSJim Jagielski {
1440*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1441*b1cdbd2cSJim Jagielski
1442*b1cdbd2cSJim Jagielski if ( pBar->GetDelta() == 0 )
1443*b1cdbd2cSJim Jagielski return 0;
1444*b1cdbd2cSJim Jagielski
1445*b1cdbd2cSJim Jagielski if ( pBar->GetDelta() < 0 && getDataWindow()->bNoScrollBack )
1446*b1cdbd2cSJim Jagielski {
1447*b1cdbd2cSJim Jagielski UpdateScrollbars();
1448*b1cdbd2cSJim Jagielski return 0;
1449*b1cdbd2cSJim Jagielski }
1450*b1cdbd2cSJim Jagielski
1451*b1cdbd2cSJim Jagielski if ( pBar == &aHScroll )
1452*b1cdbd2cSJim Jagielski ScrollColumns( aHScroll.GetDelta() );
1453*b1cdbd2cSJim Jagielski if ( pBar == pVScroll )
1454*b1cdbd2cSJim Jagielski ScrollRows( pVScroll->GetDelta() );
1455*b1cdbd2cSJim Jagielski
1456*b1cdbd2cSJim Jagielski return 0;
1457*b1cdbd2cSJim Jagielski }
1458*b1cdbd2cSJim Jagielski
1459*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1460*b1cdbd2cSJim Jagielski
IMPL_LINK(BrowseBox,EndScrollHdl,ScrollBar *,EMPTYARG)1461*b1cdbd2cSJim Jagielski IMPL_LINK( BrowseBox,EndScrollHdl,ScrollBar*, EMPTYARG )
1462*b1cdbd2cSJim Jagielski {
1463*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1464*b1cdbd2cSJim Jagielski
1465*b1cdbd2cSJim Jagielski // kein Focus grabben!
1466*b1cdbd2cSJim Jagielski /// GrabFocus();
1467*b1cdbd2cSJim Jagielski
1468*b1cdbd2cSJim Jagielski if ( /*pBar->GetDelta() <= 0 &&*/ getDataWindow()->bNoScrollBack )
1469*b1cdbd2cSJim Jagielski {
1470*b1cdbd2cSJim Jagielski // UpdateScrollbars();
1471*b1cdbd2cSJim Jagielski EndScroll();
1472*b1cdbd2cSJim Jagielski return 0;
1473*b1cdbd2cSJim Jagielski }
1474*b1cdbd2cSJim Jagielski
1475*b1cdbd2cSJim Jagielski return 0;
1476*b1cdbd2cSJim Jagielski }
1477*b1cdbd2cSJim Jagielski
1478*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1479*b1cdbd2cSJim Jagielski
IMPL_LINK(BrowseBox,StartDragHdl,HeaderBar *,pBar)1480*b1cdbd2cSJim Jagielski IMPL_LINK( BrowseBox, StartDragHdl, HeaderBar*, pBar )
1481*b1cdbd2cSJim Jagielski {
1482*b1cdbd2cSJim Jagielski pBar->SetDragSize( pDataWin->GetOutputSizePixel().Height() );
1483*b1cdbd2cSJim Jagielski return 0;
1484*b1cdbd2cSJim Jagielski }
1485*b1cdbd2cSJim Jagielski
1486*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1487*b1cdbd2cSJim Jagielski // MI: es wurde immer nur die 1. Spalte resized
1488*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
1489*b1cdbd2cSJim Jagielski #pragma optimize("",off)
1490*b1cdbd2cSJim Jagielski #endif
1491*b1cdbd2cSJim Jagielski
MouseButtonDown(const MouseEvent & rEvt)1492*b1cdbd2cSJim Jagielski void BrowseBox::MouseButtonDown( const MouseEvent& rEvt )
1493*b1cdbd2cSJim Jagielski {
1494*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1495*b1cdbd2cSJim Jagielski
1496*b1cdbd2cSJim Jagielski GrabFocus();
1497*b1cdbd2cSJim Jagielski
1498*b1cdbd2cSJim Jagielski // onl< mouse events in the title-line are supported
1499*b1cdbd2cSJim Jagielski const Point &rEvtPos = rEvt.GetPosPixel();
1500*b1cdbd2cSJim Jagielski if ( rEvtPos.Y() >= GetTitleHeight() )
1501*b1cdbd2cSJim Jagielski return;
1502*b1cdbd2cSJim Jagielski
1503*b1cdbd2cSJim Jagielski long nX = 0;
1504*b1cdbd2cSJim Jagielski long nWidth = GetOutputSizePixel().Width();
1505*b1cdbd2cSJim Jagielski for ( sal_uInt16 nCol = 0; nCol < pCols->Count() && nX < nWidth; ++nCol )
1506*b1cdbd2cSJim Jagielski {
1507*b1cdbd2cSJim Jagielski // is this column visible?
1508*b1cdbd2cSJim Jagielski BrowserColumn *pCol = pCols->GetObject(nCol);
1509*b1cdbd2cSJim Jagielski if ( pCol->IsFrozen() || nCol >= nFirstCol )
1510*b1cdbd2cSJim Jagielski {
1511*b1cdbd2cSJim Jagielski // compute right end of column
1512*b1cdbd2cSJim Jagielski long nR = nX + pCol->Width() - 1;
1513*b1cdbd2cSJim Jagielski
1514*b1cdbd2cSJim Jagielski // at the end of a column (and not handle column)?
1515*b1cdbd2cSJim Jagielski if ( pCol->GetId() && Abs( nR - rEvtPos.X() ) < 2 )
1516*b1cdbd2cSJim Jagielski {
1517*b1cdbd2cSJim Jagielski // start resizing the column
1518*b1cdbd2cSJim Jagielski bResizing = sal_True;
1519*b1cdbd2cSJim Jagielski nResizeCol = nCol;
1520*b1cdbd2cSJim Jagielski nDragX = nResizeX = rEvtPos.X();
1521*b1cdbd2cSJim Jagielski SetPointer( Pointer( POINTER_HSPLIT ) );
1522*b1cdbd2cSJim Jagielski CaptureMouse();
1523*b1cdbd2cSJim Jagielski pDataWin->DrawLine( Point( nDragX, 0 ),
1524*b1cdbd2cSJim Jagielski Point( nDragX, pDataWin->GetSizePixel().Height() ) );
1525*b1cdbd2cSJim Jagielski nMinResizeX = nX + MIN_COLUMNWIDTH;
1526*b1cdbd2cSJim Jagielski return;
1527*b1cdbd2cSJim Jagielski }
1528*b1cdbd2cSJim Jagielski else if ( nX < rEvtPos.X() && nR > rEvtPos.X() )
1529*b1cdbd2cSJim Jagielski {
1530*b1cdbd2cSJim Jagielski MouseButtonDown( BrowserMouseEvent(
1531*b1cdbd2cSJim Jagielski this, rEvt, -1, nCol, pCol->GetId(), Rectangle() ) );
1532*b1cdbd2cSJim Jagielski return;
1533*b1cdbd2cSJim Jagielski }
1534*b1cdbd2cSJim Jagielski nX = nR + 1;
1535*b1cdbd2cSJim Jagielski }
1536*b1cdbd2cSJim Jagielski }
1537*b1cdbd2cSJim Jagielski
1538*b1cdbd2cSJim Jagielski // event occured out of data area
1539*b1cdbd2cSJim Jagielski if ( rEvt.IsRight() )
1540*b1cdbd2cSJim Jagielski pDataWin->Command(
1541*b1cdbd2cSJim Jagielski CommandEvent( Point( 1, LONG_MAX ), COMMAND_CONTEXTMENU, sal_True ) );
1542*b1cdbd2cSJim Jagielski else
1543*b1cdbd2cSJim Jagielski SetNoSelection();
1544*b1cdbd2cSJim Jagielski }
1545*b1cdbd2cSJim Jagielski
1546*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
1547*b1cdbd2cSJim Jagielski #pragma optimize("",on)
1548*b1cdbd2cSJim Jagielski #endif
1549*b1cdbd2cSJim Jagielski
1550*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1551*b1cdbd2cSJim Jagielski
MouseMove(const MouseEvent & rEvt)1552*b1cdbd2cSJim Jagielski void BrowseBox::MouseMove( const MouseEvent& rEvt )
1553*b1cdbd2cSJim Jagielski {
1554*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1555*b1cdbd2cSJim Jagielski DBG_TRACE( "BrowseBox::MouseMove( MouseEvent )" );
1556*b1cdbd2cSJim Jagielski
1557*b1cdbd2cSJim Jagielski Pointer aNewPointer;
1558*b1cdbd2cSJim Jagielski
1559*b1cdbd2cSJim Jagielski sal_uInt16 nX = 0;
1560*b1cdbd2cSJim Jagielski for ( sal_uInt16 nCol = 0;
1561*b1cdbd2cSJim Jagielski nCol < sal_uInt16(pCols->Count()) &&
1562*b1cdbd2cSJim Jagielski ( nX + pCols->GetObject(nCol)->Width() ) < sal_uInt16(GetOutputSizePixel().Width());
1563*b1cdbd2cSJim Jagielski ++nCol )
1564*b1cdbd2cSJim Jagielski // is this column visible?
1565*b1cdbd2cSJim Jagielski if ( pCols->GetObject(nCol)->IsFrozen() || nCol >= nFirstCol )
1566*b1cdbd2cSJim Jagielski {
1567*b1cdbd2cSJim Jagielski // compute right end of column
1568*b1cdbd2cSJim Jagielski BrowserColumn *pCol = pCols->GetObject(nCol);
1569*b1cdbd2cSJim Jagielski sal_uInt16 nR = (sal_uInt16)(nX + pCol->Width() - 1);
1570*b1cdbd2cSJim Jagielski
1571*b1cdbd2cSJim Jagielski // show resize-pointer?
1572*b1cdbd2cSJim Jagielski if ( bResizing || ( pCol->GetId() &&
1573*b1cdbd2cSJim Jagielski Abs( ((long) nR ) - rEvt.GetPosPixel().X() ) < MIN_COLUMNWIDTH ) )
1574*b1cdbd2cSJim Jagielski {
1575*b1cdbd2cSJim Jagielski aNewPointer = Pointer( POINTER_HSPLIT );
1576*b1cdbd2cSJim Jagielski if ( bResizing )
1577*b1cdbd2cSJim Jagielski {
1578*b1cdbd2cSJim Jagielski // alte Hilfslinie loeschen
1579*b1cdbd2cSJim Jagielski pDataWin->HideTracking() ;
1580*b1cdbd2cSJim Jagielski
1581*b1cdbd2cSJim Jagielski // erlaubte breite abholen und neues Delta
1582*b1cdbd2cSJim Jagielski nDragX = Max( rEvt.GetPosPixel().X(), nMinResizeX );
1583*b1cdbd2cSJim Jagielski long nDeltaX = nDragX - nResizeX;
1584*b1cdbd2cSJim Jagielski sal_uInt16 nId = GetColumnId(nResizeCol);
1585*b1cdbd2cSJim Jagielski sal_uLong nOldWidth = GetColumnWidth(nId);
1586*b1cdbd2cSJim Jagielski nDragX = QueryColumnResize( GetColumnId(nResizeCol),
1587*b1cdbd2cSJim Jagielski nOldWidth + nDeltaX )
1588*b1cdbd2cSJim Jagielski + nResizeX - nOldWidth;
1589*b1cdbd2cSJim Jagielski
1590*b1cdbd2cSJim Jagielski // neue Hilfslinie zeichnen
1591*b1cdbd2cSJim Jagielski pDataWin->ShowTracking( Rectangle( Point( nDragX, 0 ),
1592*b1cdbd2cSJim Jagielski Size( 1, pDataWin->GetSizePixel().Height() ) ),
1593*b1cdbd2cSJim Jagielski SHOWTRACK_SPLIT|SHOWTRACK_WINDOW );
1594*b1cdbd2cSJim Jagielski }
1595*b1cdbd2cSJim Jagielski
1596*b1cdbd2cSJim Jagielski }
1597*b1cdbd2cSJim Jagielski
1598*b1cdbd2cSJim Jagielski nX = nR + 1;
1599*b1cdbd2cSJim Jagielski }
1600*b1cdbd2cSJim Jagielski
1601*b1cdbd2cSJim Jagielski SetPointer( aNewPointer );
1602*b1cdbd2cSJim Jagielski }
1603*b1cdbd2cSJim Jagielski
1604*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1605*b1cdbd2cSJim Jagielski
MouseButtonUp(const MouseEvent & rEvt)1606*b1cdbd2cSJim Jagielski void BrowseBox::MouseButtonUp( const MouseEvent & rEvt )
1607*b1cdbd2cSJim Jagielski {
1608*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1609*b1cdbd2cSJim Jagielski
1610*b1cdbd2cSJim Jagielski if ( bResizing )
1611*b1cdbd2cSJim Jagielski {
1612*b1cdbd2cSJim Jagielski // Hilfslinie loeschen
1613*b1cdbd2cSJim Jagielski pDataWin->HideTracking();
1614*b1cdbd2cSJim Jagielski
1615*b1cdbd2cSJim Jagielski // width changed?
1616*b1cdbd2cSJim Jagielski nDragX = Max( rEvt.GetPosPixel().X(), nMinResizeX );
1617*b1cdbd2cSJim Jagielski if ( (nDragX - nResizeX) != (long)pCols->GetObject(nResizeCol)->Width() )
1618*b1cdbd2cSJim Jagielski {
1619*b1cdbd2cSJim Jagielski // resize column
1620*b1cdbd2cSJim Jagielski long nMaxX = pDataWin->GetSizePixel().Width();
1621*b1cdbd2cSJim Jagielski nDragX = Min( nDragX, nMaxX );
1622*b1cdbd2cSJim Jagielski long nDeltaX = nDragX - nResizeX;
1623*b1cdbd2cSJim Jagielski sal_uInt16 nId = GetColumnId(nResizeCol);
1624*b1cdbd2cSJim Jagielski SetColumnWidth( GetColumnId(nResizeCol), GetColumnWidth(nId) + nDeltaX );
1625*b1cdbd2cSJim Jagielski ColumnResized( nId );
1626*b1cdbd2cSJim Jagielski }
1627*b1cdbd2cSJim Jagielski
1628*b1cdbd2cSJim Jagielski // end action
1629*b1cdbd2cSJim Jagielski SetPointer( Pointer() );
1630*b1cdbd2cSJim Jagielski ReleaseMouse();
1631*b1cdbd2cSJim Jagielski bResizing = sal_False;
1632*b1cdbd2cSJim Jagielski }
1633*b1cdbd2cSJim Jagielski else
1634*b1cdbd2cSJim Jagielski MouseButtonUp( BrowserMouseEvent( (BrowserDataWin*)pDataWin,
1635*b1cdbd2cSJim Jagielski MouseEvent( Point( rEvt.GetPosPixel().X(),
1636*b1cdbd2cSJim Jagielski rEvt.GetPosPixel().Y() - pDataWin->GetPosPixel().Y() ),
1637*b1cdbd2cSJim Jagielski rEvt.GetClicks(), rEvt.GetMode(), rEvt.GetButtons(),
1638*b1cdbd2cSJim Jagielski rEvt.GetModifier() ) ) );
1639*b1cdbd2cSJim Jagielski }
1640*b1cdbd2cSJim Jagielski
1641*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1642*b1cdbd2cSJim Jagielski
1643*b1cdbd2cSJim Jagielski sal_Bool bExtendedMode = sal_False;
1644*b1cdbd2cSJim Jagielski sal_Bool bFieldMode = sal_False;
1645*b1cdbd2cSJim Jagielski
MouseButtonDown(const BrowserMouseEvent & rEvt)1646*b1cdbd2cSJim Jagielski void BrowseBox::MouseButtonDown( const BrowserMouseEvent& rEvt )
1647*b1cdbd2cSJim Jagielski {
1648*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1649*b1cdbd2cSJim Jagielski
1650*b1cdbd2cSJim Jagielski GrabFocus();
1651*b1cdbd2cSJim Jagielski
1652*b1cdbd2cSJim Jagielski // adjust selection while and after double-click
1653*b1cdbd2cSJim Jagielski if ( rEvt.GetClicks() == 2 )
1654*b1cdbd2cSJim Jagielski {
1655*b1cdbd2cSJim Jagielski SetNoSelection();
1656*b1cdbd2cSJim Jagielski if ( rEvt.GetRow() >= 0 )
1657*b1cdbd2cSJim Jagielski {
1658*b1cdbd2cSJim Jagielski GoToRow( rEvt.GetRow() );
1659*b1cdbd2cSJim Jagielski SelectRow( rEvt.GetRow(), sal_True, sal_False );
1660*b1cdbd2cSJim Jagielski }
1661*b1cdbd2cSJim Jagielski else
1662*b1cdbd2cSJim Jagielski {
1663*b1cdbd2cSJim Jagielski if ( bColumnCursor && rEvt.GetColumn() != 0 )
1664*b1cdbd2cSJim Jagielski {
1665*b1cdbd2cSJim Jagielski if ( rEvt.GetColumn() < pCols->Count() )
1666*b1cdbd2cSJim Jagielski SelectColumnPos( rEvt.GetColumn(), sal_True, sal_False);
1667*b1cdbd2cSJim Jagielski }
1668*b1cdbd2cSJim Jagielski }
1669*b1cdbd2cSJim Jagielski DoubleClick( rEvt );
1670*b1cdbd2cSJim Jagielski }
1671*b1cdbd2cSJim Jagielski // selections
1672*b1cdbd2cSJim Jagielski else if ( ( rEvt.GetMode() & ( MOUSE_SELECT | MOUSE_SIMPLECLICK ) ) &&
1673*b1cdbd2cSJim Jagielski ( bColumnCursor || rEvt.GetRow() >= 0 ) )
1674*b1cdbd2cSJim Jagielski {
1675*b1cdbd2cSJim Jagielski if ( rEvt.GetClicks() == 1 )
1676*b1cdbd2cSJim Jagielski {
1677*b1cdbd2cSJim Jagielski // initialise flags
1678*b1cdbd2cSJim Jagielski bHit = sal_False;
1679*b1cdbd2cSJim Jagielski a1stPoint =
1680*b1cdbd2cSJim Jagielski a2ndPoint = PixelToLogic( rEvt.GetPosPixel() );
1681*b1cdbd2cSJim Jagielski
1682*b1cdbd2cSJim Jagielski // selection out of range?
1683*b1cdbd2cSJim Jagielski if ( rEvt.GetRow() >= nRowCount ||
1684*b1cdbd2cSJim Jagielski rEvt.GetColumnId() == BROWSER_INVALIDID )
1685*b1cdbd2cSJim Jagielski {
1686*b1cdbd2cSJim Jagielski SetNoSelection();
1687*b1cdbd2cSJim Jagielski return;
1688*b1cdbd2cSJim Jagielski }
1689*b1cdbd2cSJim Jagielski
1690*b1cdbd2cSJim Jagielski // while selecting, no cursor
1691*b1cdbd2cSJim Jagielski bSelecting = sal_True;
1692*b1cdbd2cSJim Jagielski DoHideCursor( "MouseButtonDown" );
1693*b1cdbd2cSJim Jagielski
1694*b1cdbd2cSJim Jagielski // DataRow?
1695*b1cdbd2cSJim Jagielski if ( rEvt.GetRow() >= 0 )
1696*b1cdbd2cSJim Jagielski {
1697*b1cdbd2cSJim Jagielski // Zeilenselektion?
1698*b1cdbd2cSJim Jagielski if ( rEvt.GetColumnId() == 0 || !bColumnCursor )
1699*b1cdbd2cSJim Jagielski {
1700*b1cdbd2cSJim Jagielski if ( bMultiSelection )
1701*b1cdbd2cSJim Jagielski {
1702*b1cdbd2cSJim Jagielski // remove column-selection, if exists
1703*b1cdbd2cSJim Jagielski if ( pColSel && pColSel->GetSelectCount() )
1704*b1cdbd2cSJim Jagielski {
1705*b1cdbd2cSJim Jagielski ToggleSelection();
1706*b1cdbd2cSJim Jagielski if ( bMultiSelection )
1707*b1cdbd2cSJim Jagielski uRow.pSel->SelectAll(sal_False);
1708*b1cdbd2cSJim Jagielski else
1709*b1cdbd2cSJim Jagielski uRow.nSel = BROWSER_ENDOFSELECTION;
1710*b1cdbd2cSJim Jagielski if ( pColSel )
1711*b1cdbd2cSJim Jagielski pColSel->SelectAll(sal_False);
1712*b1cdbd2cSJim Jagielski bSelect = sal_True;
1713*b1cdbd2cSJim Jagielski }
1714*b1cdbd2cSJim Jagielski
1715*b1cdbd2cSJim Jagielski // expanding mode?
1716*b1cdbd2cSJim Jagielski if ( rEvt.GetMode() & MOUSE_RANGESELECT )
1717*b1cdbd2cSJim Jagielski {
1718*b1cdbd2cSJim Jagielski // select the further touched rows too
1719*b1cdbd2cSJim Jagielski bSelect = sal_True;
1720*b1cdbd2cSJim Jagielski ExpandRowSelection( rEvt );
1721*b1cdbd2cSJim Jagielski return;
1722*b1cdbd2cSJim Jagielski }
1723*b1cdbd2cSJim Jagielski
1724*b1cdbd2cSJim Jagielski // click in the selected area?
1725*b1cdbd2cSJim Jagielski else if ( IsRowSelected( rEvt.GetRow() ) )
1726*b1cdbd2cSJim Jagielski {
1727*b1cdbd2cSJim Jagielski // auf Drag&Drop warten
1728*b1cdbd2cSJim Jagielski bHit = sal_True;
1729*b1cdbd2cSJim Jagielski bExtendedMode = MOUSE_MULTISELECT ==
1730*b1cdbd2cSJim Jagielski ( rEvt.GetMode() & MOUSE_MULTISELECT );
1731*b1cdbd2cSJim Jagielski return;
1732*b1cdbd2cSJim Jagielski }
1733*b1cdbd2cSJim Jagielski
1734*b1cdbd2cSJim Jagielski // extension mode?
1735*b1cdbd2cSJim Jagielski else if ( rEvt.GetMode() & MOUSE_MULTISELECT )
1736*b1cdbd2cSJim Jagielski {
1737*b1cdbd2cSJim Jagielski // determine the new selection range
1738*b1cdbd2cSJim Jagielski // and selection/deselection
1739*b1cdbd2cSJim Jagielski aSelRange = Range( rEvt.GetRow(), rEvt.GetRow() );
1740*b1cdbd2cSJim Jagielski SelectRow( rEvt.GetRow(),
1741*b1cdbd2cSJim Jagielski !uRow.pSel->IsSelected( rEvt.GetRow() ) );
1742*b1cdbd2cSJim Jagielski bSelect = sal_True;
1743*b1cdbd2cSJim Jagielski return;
1744*b1cdbd2cSJim Jagielski }
1745*b1cdbd2cSJim Jagielski }
1746*b1cdbd2cSJim Jagielski
1747*b1cdbd2cSJim Jagielski // select directly
1748*b1cdbd2cSJim Jagielski SetNoSelection();
1749*b1cdbd2cSJim Jagielski GoToRow( rEvt.GetRow() );
1750*b1cdbd2cSJim Jagielski SelectRow( rEvt.GetRow(), sal_True );
1751*b1cdbd2cSJim Jagielski aSelRange = Range( rEvt.GetRow(), rEvt.GetRow() );
1752*b1cdbd2cSJim Jagielski bSelect = sal_True;
1753*b1cdbd2cSJim Jagielski }
1754*b1cdbd2cSJim Jagielski else // Column/Field-Selection
1755*b1cdbd2cSJim Jagielski {
1756*b1cdbd2cSJim Jagielski // click in selected column
1757*b1cdbd2cSJim Jagielski if ( IsColumnSelected( rEvt.GetColumn() ) ||
1758*b1cdbd2cSJim Jagielski IsRowSelected( rEvt.GetRow() ) )
1759*b1cdbd2cSJim Jagielski {
1760*b1cdbd2cSJim Jagielski bHit = sal_True;
1761*b1cdbd2cSJim Jagielski bFieldMode = sal_True;
1762*b1cdbd2cSJim Jagielski return;
1763*b1cdbd2cSJim Jagielski }
1764*b1cdbd2cSJim Jagielski
1765*b1cdbd2cSJim Jagielski SetNoSelection();
1766*b1cdbd2cSJim Jagielski GoToRowColumnId( rEvt.GetRow(), rEvt.GetColumnId() );
1767*b1cdbd2cSJim Jagielski bSelect = sal_True;
1768*b1cdbd2cSJim Jagielski }
1769*b1cdbd2cSJim Jagielski }
1770*b1cdbd2cSJim Jagielski else
1771*b1cdbd2cSJim Jagielski {
1772*b1cdbd2cSJim Jagielski if ( bMultiSelection && rEvt.GetColumnId() == 0 )
1773*b1cdbd2cSJim Jagielski {
1774*b1cdbd2cSJim Jagielski // toggle all-selection
1775*b1cdbd2cSJim Jagielski if ( uRow.pSel->GetSelectCount() > ( GetRowCount() / 2 ) )
1776*b1cdbd2cSJim Jagielski SetNoSelection();
1777*b1cdbd2cSJim Jagielski else
1778*b1cdbd2cSJim Jagielski SelectAll();
1779*b1cdbd2cSJim Jagielski }
1780*b1cdbd2cSJim Jagielski else
1781*b1cdbd2cSJim Jagielski SelectColumnId( rEvt.GetColumnId(), sal_True, sal_False );
1782*b1cdbd2cSJim Jagielski }
1783*b1cdbd2cSJim Jagielski
1784*b1cdbd2cSJim Jagielski // ggf. Cursor wieder an
1785*b1cdbd2cSJim Jagielski bSelecting = sal_False;
1786*b1cdbd2cSJim Jagielski DoShowCursor( "MouseButtonDown" );
1787*b1cdbd2cSJim Jagielski if ( bSelect )
1788*b1cdbd2cSJim Jagielski Select();
1789*b1cdbd2cSJim Jagielski }
1790*b1cdbd2cSJim Jagielski }
1791*b1cdbd2cSJim Jagielski }
1792*b1cdbd2cSJim Jagielski
1793*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1794*b1cdbd2cSJim Jagielski
MouseMove(const BrowserMouseEvent &)1795*b1cdbd2cSJim Jagielski void BrowseBox::MouseMove( const BrowserMouseEvent& )
1796*b1cdbd2cSJim Jagielski {
1797*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1798*b1cdbd2cSJim Jagielski }
1799*b1cdbd2cSJim Jagielski
1800*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1801*b1cdbd2cSJim Jagielski
MouseButtonUp(const BrowserMouseEvent & rEvt)1802*b1cdbd2cSJim Jagielski void BrowseBox::MouseButtonUp( const BrowserMouseEvent &rEvt )
1803*b1cdbd2cSJim Jagielski {
1804*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1805*b1cdbd2cSJim Jagielski
1806*b1cdbd2cSJim Jagielski // D&D was possible, but did not occur
1807*b1cdbd2cSJim Jagielski if ( bHit )
1808*b1cdbd2cSJim Jagielski {
1809*b1cdbd2cSJim Jagielski aSelRange = Range( rEvt.GetRow(), rEvt.GetRow() );
1810*b1cdbd2cSJim Jagielski if ( bExtendedMode )
1811*b1cdbd2cSJim Jagielski SelectRow( rEvt.GetRow(), sal_False );
1812*b1cdbd2cSJim Jagielski else
1813*b1cdbd2cSJim Jagielski {
1814*b1cdbd2cSJim Jagielski SetNoSelection();
1815*b1cdbd2cSJim Jagielski if ( bFieldMode )
1816*b1cdbd2cSJim Jagielski GoToRowColumnId( rEvt.GetRow(), rEvt.GetColumnId() );
1817*b1cdbd2cSJim Jagielski else
1818*b1cdbd2cSJim Jagielski {
1819*b1cdbd2cSJim Jagielski GoToRow( rEvt.GetRow() );
1820*b1cdbd2cSJim Jagielski SelectRow( rEvt.GetRow(), sal_True );
1821*b1cdbd2cSJim Jagielski }
1822*b1cdbd2cSJim Jagielski }
1823*b1cdbd2cSJim Jagielski bSelect = sal_True;
1824*b1cdbd2cSJim Jagielski bExtendedMode = sal_False;
1825*b1cdbd2cSJim Jagielski bFieldMode = sal_False;
1826*b1cdbd2cSJim Jagielski bHit = sal_False;
1827*b1cdbd2cSJim Jagielski }
1828*b1cdbd2cSJim Jagielski
1829*b1cdbd2cSJim Jagielski // activate cursor
1830*b1cdbd2cSJim Jagielski if ( bSelecting )
1831*b1cdbd2cSJim Jagielski {
1832*b1cdbd2cSJim Jagielski bSelecting = sal_False;
1833*b1cdbd2cSJim Jagielski DoShowCursor( "MouseButtonUp" );
1834*b1cdbd2cSJim Jagielski if ( bSelect )
1835*b1cdbd2cSJim Jagielski Select();
1836*b1cdbd2cSJim Jagielski }
1837*b1cdbd2cSJim Jagielski }
1838*b1cdbd2cSJim Jagielski
1839*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1840*b1cdbd2cSJim Jagielski
KeyInput(const KeyEvent & rEvt)1841*b1cdbd2cSJim Jagielski void BrowseBox::KeyInput( const KeyEvent& rEvt )
1842*b1cdbd2cSJim Jagielski {
1843*b1cdbd2cSJim Jagielski if ( !ProcessKey( rEvt ) )
1844*b1cdbd2cSJim Jagielski Control::KeyInput( rEvt );
1845*b1cdbd2cSJim Jagielski }
1846*b1cdbd2cSJim Jagielski
1847*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1848*b1cdbd2cSJim Jagielski
ProcessKey(const KeyEvent & rEvt)1849*b1cdbd2cSJim Jagielski sal_Bool BrowseBox::ProcessKey( const KeyEvent& rEvt )
1850*b1cdbd2cSJim Jagielski {
1851*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1852*b1cdbd2cSJim Jagielski
1853*b1cdbd2cSJim Jagielski sal_uInt16 nCode = rEvt.GetKeyCode().GetCode();
1854*b1cdbd2cSJim Jagielski sal_Bool bShift = rEvt.GetKeyCode().IsShift();
1855*b1cdbd2cSJim Jagielski sal_Bool bCtrl = rEvt.GetKeyCode().IsMod1();
1856*b1cdbd2cSJim Jagielski sal_Bool bAlt = rEvt.GetKeyCode().IsMod2();
1857*b1cdbd2cSJim Jagielski
1858*b1cdbd2cSJim Jagielski sal_uInt16 nId = BROWSER_NONE;
1859*b1cdbd2cSJim Jagielski
1860*b1cdbd2cSJim Jagielski if ( !bAlt && !bCtrl && !bShift )
1861*b1cdbd2cSJim Jagielski {
1862*b1cdbd2cSJim Jagielski switch ( nCode )
1863*b1cdbd2cSJim Jagielski {
1864*b1cdbd2cSJim Jagielski case KEY_DOWN: nId = BROWSER_CURSORDOWN; break;
1865*b1cdbd2cSJim Jagielski case KEY_UP: nId = BROWSER_CURSORUP; break;
1866*b1cdbd2cSJim Jagielski case KEY_HOME: nId = BROWSER_CURSORHOME; break;
1867*b1cdbd2cSJim Jagielski case KEY_END: nId = BROWSER_CURSOREND; break;
1868*b1cdbd2cSJim Jagielski case KEY_TAB:
1869*b1cdbd2cSJim Jagielski if ( !bColumnCursor )
1870*b1cdbd2cSJim Jagielski break;
1871*b1cdbd2cSJim Jagielski case KEY_RIGHT: nId = BROWSER_CURSORRIGHT; break;
1872*b1cdbd2cSJim Jagielski case KEY_LEFT: nId = BROWSER_CURSORLEFT; break;
1873*b1cdbd2cSJim Jagielski case KEY_SPACE: nId = BROWSER_SELECT; break;
1874*b1cdbd2cSJim Jagielski }
1875*b1cdbd2cSJim Jagielski if ( BROWSER_NONE != nId )
1876*b1cdbd2cSJim Jagielski SetNoSelection();
1877*b1cdbd2cSJim Jagielski
1878*b1cdbd2cSJim Jagielski switch ( nCode )
1879*b1cdbd2cSJim Jagielski {
1880*b1cdbd2cSJim Jagielski case KEY_PAGEDOWN: nId = BROWSER_CURSORPAGEDOWN; break;
1881*b1cdbd2cSJim Jagielski case KEY_PAGEUP: nId = BROWSER_CURSORPAGEUP; break;
1882*b1cdbd2cSJim Jagielski }
1883*b1cdbd2cSJim Jagielski }
1884*b1cdbd2cSJim Jagielski
1885*b1cdbd2cSJim Jagielski if ( !bAlt && !bCtrl && bShift )
1886*b1cdbd2cSJim Jagielski switch ( nCode )
1887*b1cdbd2cSJim Jagielski {
1888*b1cdbd2cSJim Jagielski case KEY_DOWN: nId = BROWSER_SELECTDOWN; break;
1889*b1cdbd2cSJim Jagielski case KEY_UP: nId = BROWSER_SELECTUP; break;
1890*b1cdbd2cSJim Jagielski case KEY_TAB:
1891*b1cdbd2cSJim Jagielski if ( !bColumnCursor )
1892*b1cdbd2cSJim Jagielski break;
1893*b1cdbd2cSJim Jagielski nId = BROWSER_CURSORLEFT; break;
1894*b1cdbd2cSJim Jagielski case KEY_HOME: nId = BROWSER_SELECTHOME; break;
1895*b1cdbd2cSJim Jagielski case KEY_END: nId = BROWSER_SELECTEND; break;
1896*b1cdbd2cSJim Jagielski }
1897*b1cdbd2cSJim Jagielski
1898*b1cdbd2cSJim Jagielski
1899*b1cdbd2cSJim Jagielski if ( !bAlt && bCtrl && !bShift )
1900*b1cdbd2cSJim Jagielski switch ( nCode )
1901*b1cdbd2cSJim Jagielski {
1902*b1cdbd2cSJim Jagielski case KEY_DOWN: nId = BROWSER_CURSORDOWN; break;
1903*b1cdbd2cSJim Jagielski case KEY_UP: nId = BROWSER_CURSORUP; break;
1904*b1cdbd2cSJim Jagielski case KEY_PAGEDOWN: nId = BROWSER_CURSORENDOFFILE; break;
1905*b1cdbd2cSJim Jagielski case KEY_PAGEUP: nId = BROWSER_CURSORTOPOFFILE; break;
1906*b1cdbd2cSJim Jagielski case KEY_HOME: nId = BROWSER_CURSORTOPOFSCREEN; break;
1907*b1cdbd2cSJim Jagielski case KEY_END: nId = BROWSER_CURSORENDOFSCREEN; break;
1908*b1cdbd2cSJim Jagielski case KEY_SPACE: nId = BROWSER_ENHANCESELECTION; break;
1909*b1cdbd2cSJim Jagielski case KEY_LEFT: nId = BROWSER_MOVECOLUMNLEFT; break;
1910*b1cdbd2cSJim Jagielski case KEY_RIGHT: nId = BROWSER_MOVECOLUMNRIGHT; break;
1911*b1cdbd2cSJim Jagielski }
1912*b1cdbd2cSJim Jagielski
1913*b1cdbd2cSJim Jagielski if ( nId != BROWSER_NONE )
1914*b1cdbd2cSJim Jagielski Dispatch( nId );
1915*b1cdbd2cSJim Jagielski return nId != BROWSER_NONE;
1916*b1cdbd2cSJim Jagielski }
1917*b1cdbd2cSJim Jagielski
1918*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
1919*b1cdbd2cSJim Jagielski
Dispatch(sal_uInt16 nId)1920*b1cdbd2cSJim Jagielski void BrowseBox::Dispatch( sal_uInt16 nId )
1921*b1cdbd2cSJim Jagielski {
1922*b1cdbd2cSJim Jagielski DBG_CHKTHIS(BrowseBox,BrowseBoxCheckInvariants);
1923*b1cdbd2cSJim Jagielski
1924*b1cdbd2cSJim Jagielski long nRowsOnPage = pDataWin->GetSizePixel().Height() / GetDataRowHeight();
1925*b1cdbd2cSJim Jagielski sal_Bool bDone = sal_False;
1926*b1cdbd2cSJim Jagielski
1927*b1cdbd2cSJim Jagielski switch ( nId )
1928*b1cdbd2cSJim Jagielski {
1929*b1cdbd2cSJim Jagielski case BROWSER_SELECTCOLUMN:
1930*b1cdbd2cSJim Jagielski if ( ColCount() )
1931*b1cdbd2cSJim Jagielski SelectColumnId( GetCurColumnId() );
1932*b1cdbd2cSJim Jagielski break;
1933*b1cdbd2cSJim Jagielski
1934*b1cdbd2cSJim Jagielski case BROWSER_CURSORDOWN:
1935*b1cdbd2cSJim Jagielski if ( ( GetCurRow() + 1 ) < nRowCount )
1936*b1cdbd2cSJim Jagielski bDone = GoToRow( GetCurRow() + 1, sal_False );
1937*b1cdbd2cSJim Jagielski break;
1938*b1cdbd2cSJim Jagielski case BROWSER_CURSORUP:
1939*b1cdbd2cSJim Jagielski if ( GetCurRow() > 0 )
1940*b1cdbd2cSJim Jagielski bDone = GoToRow( GetCurRow() - 1, sal_False );
1941*b1cdbd2cSJim Jagielski break;
1942*b1cdbd2cSJim Jagielski case BROWSER_SELECTHOME:
1943*b1cdbd2cSJim Jagielski if ( GetRowCount() )
1944*b1cdbd2cSJim Jagielski {
1945*b1cdbd2cSJim Jagielski DoHideCursor( "BROWSER_SELECTHOME" );
1946*b1cdbd2cSJim Jagielski for ( long nRow = GetCurRow(); nRow >= 0; --nRow )
1947*b1cdbd2cSJim Jagielski SelectRow( nRow );
1948*b1cdbd2cSJim Jagielski GoToRow( 0, sal_True );
1949*b1cdbd2cSJim Jagielski DoShowCursor( "BROWSER_SELECTHOME" );
1950*b1cdbd2cSJim Jagielski }
1951*b1cdbd2cSJim Jagielski break;
1952*b1cdbd2cSJim Jagielski case BROWSER_SELECTEND:
1953*b1cdbd2cSJim Jagielski if ( GetRowCount() )
1954*b1cdbd2cSJim Jagielski {
1955*b1cdbd2cSJim Jagielski DoHideCursor( "BROWSER_SELECTEND" );
1956*b1cdbd2cSJim Jagielski long nRows = GetRowCount();
1957*b1cdbd2cSJim Jagielski for ( long nRow = GetCurRow(); nRow < nRows; ++nRow )
1958*b1cdbd2cSJim Jagielski SelectRow( nRow );
1959*b1cdbd2cSJim Jagielski GoToRow( GetRowCount() - 1, sal_True );
1960*b1cdbd2cSJim Jagielski DoShowCursor( "BROWSER_SELECTEND" );
1961*b1cdbd2cSJim Jagielski }
1962*b1cdbd2cSJim Jagielski break;
1963*b1cdbd2cSJim Jagielski case BROWSER_SELECTDOWN:
1964*b1cdbd2cSJim Jagielski {
1965*b1cdbd2cSJim Jagielski if ( GetRowCount() && ( GetCurRow() + 1 ) < nRowCount )
1966*b1cdbd2cSJim Jagielski {
1967*b1cdbd2cSJim Jagielski // deselect the current row, if it isn't the first
1968*b1cdbd2cSJim Jagielski // and there is no other selected row above
1969*b1cdbd2cSJim Jagielski long nRow = GetCurRow();
1970*b1cdbd2cSJim Jagielski sal_Bool bLocalSelect = ( !IsRowSelected( nRow ) ||
1971*b1cdbd2cSJim Jagielski GetSelectRowCount() == 1 || IsRowSelected( nRow - 1 ) );
1972*b1cdbd2cSJim Jagielski SelectRow( nRow, bLocalSelect, sal_True );
1973*b1cdbd2cSJim Jagielski bDone = GoToRow( GetCurRow() + 1 , sal_False );
1974*b1cdbd2cSJim Jagielski if ( bDone )
1975*b1cdbd2cSJim Jagielski SelectRow( GetCurRow(), sal_True, sal_True );
1976*b1cdbd2cSJim Jagielski }
1977*b1cdbd2cSJim Jagielski else
1978*b1cdbd2cSJim Jagielski bDone = ScrollRows( 1 ) != 0;
1979*b1cdbd2cSJim Jagielski break;
1980*b1cdbd2cSJim Jagielski }
1981*b1cdbd2cSJim Jagielski case BROWSER_SELECTUP:
1982*b1cdbd2cSJim Jagielski if ( GetRowCount() )
1983*b1cdbd2cSJim Jagielski {
1984*b1cdbd2cSJim Jagielski // deselect the current row, if it isn't the first
1985*b1cdbd2cSJim Jagielski // and there is no other selected row under
1986*b1cdbd2cSJim Jagielski long nRow = GetCurRow();
1987*b1cdbd2cSJim Jagielski sal_Bool bLocalSelect = ( !IsRowSelected( nRow ) ||
1988*b1cdbd2cSJim Jagielski GetSelectRowCount() == 1 || IsRowSelected( nRow + 1 ) );
1989*b1cdbd2cSJim Jagielski SelectRow( nCurRow, bLocalSelect, sal_True );
1990*b1cdbd2cSJim Jagielski bDone = GoToRow( nRow - 1 , sal_False );
1991*b1cdbd2cSJim Jagielski if ( bDone )
1992*b1cdbd2cSJim Jagielski SelectRow( GetCurRow(), sal_True, sal_True );
1993*b1cdbd2cSJim Jagielski }
1994*b1cdbd2cSJim Jagielski break;
1995*b1cdbd2cSJim Jagielski case BROWSER_CURSORPAGEDOWN:
1996*b1cdbd2cSJim Jagielski bDone = (sal_Bool)ScrollRows( nRowsOnPage );
1997*b1cdbd2cSJim Jagielski break;
1998*b1cdbd2cSJim Jagielski case BROWSER_CURSORPAGEUP:
1999*b1cdbd2cSJim Jagielski bDone = (sal_Bool)ScrollRows( -nRowsOnPage );
2000*b1cdbd2cSJim Jagielski break;
2001*b1cdbd2cSJim Jagielski case BROWSER_CURSOREND:
2002*b1cdbd2cSJim Jagielski if ( bColumnCursor )
2003*b1cdbd2cSJim Jagielski {
2004*b1cdbd2cSJim Jagielski sal_uInt16 nNewId = GetColumnId(ColCount() -1);
2005*b1cdbd2cSJim Jagielski bDone = (nNewId != 0) && GoToColumnId( nNewId );
2006*b1cdbd2cSJim Jagielski break;
2007*b1cdbd2cSJim Jagielski }
2008*b1cdbd2cSJim Jagielski case BROWSER_CURSORENDOFFILE:
2009*b1cdbd2cSJim Jagielski bDone = GoToRow( nRowCount - 1, sal_False );
2010*b1cdbd2cSJim Jagielski break;
2011*b1cdbd2cSJim Jagielski case BROWSER_CURSORRIGHT:
2012*b1cdbd2cSJim Jagielski if ( bColumnCursor )
2013*b1cdbd2cSJim Jagielski {
2014*b1cdbd2cSJim Jagielski sal_uInt16 nNewPos = GetColumnPos( GetCurColumnId() ) + 1;
2015*b1cdbd2cSJim Jagielski sal_uInt16 nNewId = GetColumnId( nNewPos );
2016*b1cdbd2cSJim Jagielski if (nNewId != 0) // Am Zeilenende ?
2017*b1cdbd2cSJim Jagielski bDone = GoToColumnId( nNewId );
2018*b1cdbd2cSJim Jagielski else
2019*b1cdbd2cSJim Jagielski {
2020*b1cdbd2cSJim Jagielski sal_uInt16 nColId = ( GetColumnId(0) == 0 ) ? GetColumnId(1) : GetColumnId(0);
2021*b1cdbd2cSJim Jagielski if ( GetRowCount() )
2022*b1cdbd2cSJim Jagielski bDone = ( nCurRow < GetRowCount() - 1 ) && GoToRowColumnId( nCurRow + 1, nColId );
2023*b1cdbd2cSJim Jagielski else if ( ColCount() )
2024*b1cdbd2cSJim Jagielski GoToColumnId( nColId );
2025*b1cdbd2cSJim Jagielski }
2026*b1cdbd2cSJim Jagielski }
2027*b1cdbd2cSJim Jagielski else
2028*b1cdbd2cSJim Jagielski bDone = ScrollColumns( 1 ) != 0;
2029*b1cdbd2cSJim Jagielski break;
2030*b1cdbd2cSJim Jagielski case BROWSER_CURSORHOME:
2031*b1cdbd2cSJim Jagielski if ( bColumnCursor )
2032*b1cdbd2cSJim Jagielski {
2033*b1cdbd2cSJim Jagielski sal_uInt16 nNewId = GetColumnId(1);
2034*b1cdbd2cSJim Jagielski bDone = (nNewId != 0) && GoToColumnId( nNewId );
2035*b1cdbd2cSJim Jagielski break;
2036*b1cdbd2cSJim Jagielski }
2037*b1cdbd2cSJim Jagielski case BROWSER_CURSORTOPOFFILE:
2038*b1cdbd2cSJim Jagielski bDone = GoToRow( 0, sal_False );
2039*b1cdbd2cSJim Jagielski break;
2040*b1cdbd2cSJim Jagielski case BROWSER_CURSORLEFT:
2041*b1cdbd2cSJim Jagielski if ( bColumnCursor )
2042*b1cdbd2cSJim Jagielski {
2043*b1cdbd2cSJim Jagielski sal_uInt16 nNewPos = GetColumnPos( GetCurColumnId() ) - 1;
2044*b1cdbd2cSJim Jagielski sal_uInt16 nNewId = GetColumnId( nNewPos );
2045*b1cdbd2cSJim Jagielski if (nNewId != 0)
2046*b1cdbd2cSJim Jagielski bDone = GoToColumnId( nNewId );
2047*b1cdbd2cSJim Jagielski else
2048*b1cdbd2cSJim Jagielski {
2049*b1cdbd2cSJim Jagielski if ( GetRowCount() )
2050*b1cdbd2cSJim Jagielski bDone = (nCurRow > 0) && GoToRowColumnId(nCurRow - 1, GetColumnId(ColCount() -1));
2051*b1cdbd2cSJim Jagielski else if ( ColCount() )
2052*b1cdbd2cSJim Jagielski GoToColumnId( GetColumnId(ColCount() -1) );
2053*b1cdbd2cSJim Jagielski }
2054*b1cdbd2cSJim Jagielski }
2055*b1cdbd2cSJim Jagielski else
2056*b1cdbd2cSJim Jagielski bDone = ScrollColumns( -1 ) != 0;
2057*b1cdbd2cSJim Jagielski break;
2058*b1cdbd2cSJim Jagielski case BROWSER_ENHANCESELECTION:
2059*b1cdbd2cSJim Jagielski if ( GetRowCount() )
2060*b1cdbd2cSJim Jagielski SelectRow( GetCurRow(), !IsRowSelected( GetCurRow() ), sal_True );
2061*b1cdbd2cSJim Jagielski bDone = sal_True;
2062*b1cdbd2cSJim Jagielski break;
2063*b1cdbd2cSJim Jagielski case BROWSER_SELECT:
2064*b1cdbd2cSJim Jagielski if ( GetRowCount() )
2065*b1cdbd2cSJim Jagielski SelectRow( GetCurRow(), !IsRowSelected( GetCurRow() ), sal_False );
2066*b1cdbd2cSJim Jagielski bDone = sal_True;
2067*b1cdbd2cSJim Jagielski break;
2068*b1cdbd2cSJim Jagielski case BROWSER_MOVECOLUMNLEFT:
2069*b1cdbd2cSJim Jagielski case BROWSER_MOVECOLUMNRIGHT:
2070*b1cdbd2cSJim Jagielski { // check if column moving is allowed
2071*b1cdbd2cSJim Jagielski BrowserHeader* pHeaderBar = getDataWindow()->pHeaderBar;
2072*b1cdbd2cSJim Jagielski if ( pHeaderBar && pHeaderBar->IsDragable() )
2073*b1cdbd2cSJim Jagielski {
2074*b1cdbd2cSJim Jagielski sal_uInt16 nColId = GetCurColumnId();
2075*b1cdbd2cSJim Jagielski sal_Bool bColumnSelected = IsColumnSelected(nColId);
2076*b1cdbd2cSJim Jagielski sal_uInt16 nNewPos = GetColumnPos(nColId);
2077*b1cdbd2cSJim Jagielski sal_Bool bMoveAllowed = sal_False;
2078*b1cdbd2cSJim Jagielski if ( BROWSER_MOVECOLUMNLEFT == nId && nNewPos > 1 )
2079*b1cdbd2cSJim Jagielski --nNewPos,bMoveAllowed = sal_True;
2080*b1cdbd2cSJim Jagielski else if ( BROWSER_MOVECOLUMNRIGHT == nId && nNewPos < (ColCount()-1) )
2081*b1cdbd2cSJim Jagielski ++nNewPos,bMoveAllowed = sal_True;
2082*b1cdbd2cSJim Jagielski
2083*b1cdbd2cSJim Jagielski if ( bMoveAllowed )
2084*b1cdbd2cSJim Jagielski {
2085*b1cdbd2cSJim Jagielski SetColumnPos( nColId, nNewPos );
2086*b1cdbd2cSJim Jagielski ColumnMoved( nColId );
2087*b1cdbd2cSJim Jagielski MakeFieldVisible(GetCurRow(),nColId,sal_True);
2088*b1cdbd2cSJim Jagielski if ( bColumnSelected )
2089*b1cdbd2cSJim Jagielski SelectColumnId(nColId);
2090*b1cdbd2cSJim Jagielski }
2091*b1cdbd2cSJim Jagielski }
2092*b1cdbd2cSJim Jagielski }
2093*b1cdbd2cSJim Jagielski break;
2094*b1cdbd2cSJim Jagielski }
2095*b1cdbd2cSJim Jagielski
2096*b1cdbd2cSJim Jagielski //! return bDone;
2097*b1cdbd2cSJim Jagielski }
2098*b1cdbd2cSJim Jagielski
2099*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------
2100*b1cdbd2cSJim Jagielski
SetCursorColor(const Color & _rCol)2101*b1cdbd2cSJim Jagielski void BrowseBox::SetCursorColor(const Color& _rCol)
2102*b1cdbd2cSJim Jagielski {
2103*b1cdbd2cSJim Jagielski if (_rCol == m_aCursorColor)
2104*b1cdbd2cSJim Jagielski return;
2105*b1cdbd2cSJim Jagielski
2106*b1cdbd2cSJim Jagielski // ensure the cursor is hidden
2107*b1cdbd2cSJim Jagielski DoHideCursor("SetCursorColor");
2108*b1cdbd2cSJim Jagielski if (!m_bFocusOnlyCursor)
2109*b1cdbd2cSJim Jagielski DoHideCursor("SetCursorColor - force");
2110*b1cdbd2cSJim Jagielski
2111*b1cdbd2cSJim Jagielski m_aCursorColor = _rCol;
2112*b1cdbd2cSJim Jagielski
2113*b1cdbd2cSJim Jagielski if (!m_bFocusOnlyCursor)
2114*b1cdbd2cSJim Jagielski DoShowCursor("SetCursorColor - force");
2115*b1cdbd2cSJim Jagielski DoShowCursor("SetCursorColor");
2116*b1cdbd2cSJim Jagielski }
2117*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
calcHeaderRect(sal_Bool _bIsColumnBar,sal_Bool _bOnScreen)2118*b1cdbd2cSJim Jagielski Rectangle BrowseBox::calcHeaderRect(sal_Bool _bIsColumnBar,sal_Bool _bOnScreen)
2119*b1cdbd2cSJim Jagielski {
2120*b1cdbd2cSJim Jagielski Window* pParent = NULL;
2121*b1cdbd2cSJim Jagielski if ( !_bOnScreen )
2122*b1cdbd2cSJim Jagielski pParent = GetAccessibleParentWindow();
2123*b1cdbd2cSJim Jagielski
2124*b1cdbd2cSJim Jagielski Point aTopLeft;
2125*b1cdbd2cSJim Jagielski long nWidth;
2126*b1cdbd2cSJim Jagielski long nHeight;
2127*b1cdbd2cSJim Jagielski if ( _bIsColumnBar )
2128*b1cdbd2cSJim Jagielski {
2129*b1cdbd2cSJim Jagielski nWidth = GetDataWindow().GetOutputSizePixel().Width();
2130*b1cdbd2cSJim Jagielski nHeight = GetDataRowHeight();
2131*b1cdbd2cSJim Jagielski }
2132*b1cdbd2cSJim Jagielski else
2133*b1cdbd2cSJim Jagielski {
2134*b1cdbd2cSJim Jagielski aTopLeft.Y() = GetDataRowHeight();
2135*b1cdbd2cSJim Jagielski nWidth = GetColumnWidth(0);
2136*b1cdbd2cSJim Jagielski nHeight = GetWindowExtentsRelative( pParent ).GetHeight() - aTopLeft.Y() - GetControlArea().GetSize().B();
2137*b1cdbd2cSJim Jagielski }
2138*b1cdbd2cSJim Jagielski aTopLeft += GetWindowExtentsRelative( pParent ).TopLeft();
2139*b1cdbd2cSJim Jagielski return Rectangle(aTopLeft,Size(nWidth,nHeight));
2140*b1cdbd2cSJim Jagielski }
2141*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
calcTableRect(sal_Bool _bOnScreen)2142*b1cdbd2cSJim Jagielski Rectangle BrowseBox::calcTableRect(sal_Bool _bOnScreen)
2143*b1cdbd2cSJim Jagielski {
2144*b1cdbd2cSJim Jagielski Window* pParent = NULL;
2145*b1cdbd2cSJim Jagielski if ( !_bOnScreen )
2146*b1cdbd2cSJim Jagielski pParent = GetAccessibleParentWindow();
2147*b1cdbd2cSJim Jagielski
2148*b1cdbd2cSJim Jagielski Rectangle aRect( GetWindowExtentsRelative( pParent ) );
2149*b1cdbd2cSJim Jagielski Rectangle aRowBar = calcHeaderRect(sal_False,pParent == NULL);
2150*b1cdbd2cSJim Jagielski
2151*b1cdbd2cSJim Jagielski long nX = aRowBar.Right() - aRect.Left();
2152*b1cdbd2cSJim Jagielski long nY = aRowBar.Top() - aRect.Top();
2153*b1cdbd2cSJim Jagielski Size aSize(aRect.GetSize());
2154*b1cdbd2cSJim Jagielski
2155*b1cdbd2cSJim Jagielski return Rectangle(aRowBar.TopRight(), Size(aSize.A() - nX, aSize.B() - nY - aHScroll.GetSizePixel().Height()) );
2156*b1cdbd2cSJim Jagielski }
2157*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
GetFieldRectPixelAbs(sal_Int32 _nRowId,sal_uInt16 _nColId,sal_Bool,sal_Bool _bOnScreen)2158*b1cdbd2cSJim Jagielski Rectangle BrowseBox::GetFieldRectPixelAbs( sal_Int32 _nRowId,sal_uInt16 _nColId, sal_Bool /*_bIsHeader*/, sal_Bool _bOnScreen )
2159*b1cdbd2cSJim Jagielski {
2160*b1cdbd2cSJim Jagielski Window* pParent = NULL;
2161*b1cdbd2cSJim Jagielski if ( !_bOnScreen )
2162*b1cdbd2cSJim Jagielski pParent = GetAccessibleParentWindow();
2163*b1cdbd2cSJim Jagielski
2164*b1cdbd2cSJim Jagielski Rectangle aRect = GetFieldRectPixel(_nRowId,_nColId,_bOnScreen);
2165*b1cdbd2cSJim Jagielski
2166*b1cdbd2cSJim Jagielski Point aTopLeft = aRect.TopLeft();
2167*b1cdbd2cSJim Jagielski aTopLeft += GetWindowExtentsRelative( pParent ).TopLeft();
2168*b1cdbd2cSJim Jagielski
2169*b1cdbd2cSJim Jagielski return Rectangle(aTopLeft,aRect.GetSize());
2170*b1cdbd2cSJim Jagielski }
2171*b1cdbd2cSJim Jagielski
2172*b1cdbd2cSJim Jagielski // ------------------------------------------------------------------------- EOF
2173*b1cdbd2cSJim Jagielski
2174