1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svtools.hxx"
26
27 #include "datwin.hxx"
28
29 #ifndef GCC
30 #endif
31
32 #ifndef _APP_HXX //autogen
33 #include <vcl/svapp.hxx>
34 #endif
35
36 #ifndef _HELP_HXX
37 #include <vcl/help.hxx>
38 #endif
39 #ifndef _IMAGE_HXX
40 #include <vcl/image.hxx>
41 #endif
42
43 #include <tools/debug.hxx>
44
DECLARE_LIST(BrowserColumns,BrowserColumn *)45 DECLARE_LIST( BrowserColumns, BrowserColumn* )
46
47 //===================================================================
48 void ButtonFrame::Draw( OutputDevice& rDev )
49 {
50 Color aOldFillColor = rDev.GetFillColor();
51 Color aOldLineColor = rDev.GetLineColor();
52
53 const StyleSettings &rSettings = rDev.GetSettings().GetStyleSettings();
54 Color aColLight( rSettings.GetLightColor() );
55 Color aColShadow( rSettings.GetShadowColor() );
56 Color aColFace( rSettings.GetFaceColor() );
57
58 rDev.SetLineColor( aColFace );
59 rDev.SetFillColor( aColFace );
60 rDev.DrawRect( aRect );
61
62 if( rDev.GetOutDevType() == OUTDEV_WINDOW )
63 {
64 Window *pWin = (Window*) &rDev;
65 if( bPressed )
66 pWin->DrawSelectionBackground( aRect, 0, sal_True, sal_False, sal_False );
67 }
68 else
69 {
70 rDev.SetLineColor( bPressed ? aColShadow : aColLight );
71 rDev.DrawLine( aRect.TopLeft(), Point( aRect.Right(), aRect.Top() ) );
72 rDev.DrawLine( aRect.TopLeft(), Point( aRect.Left(), aRect.Bottom() - 1 ) );
73 rDev.SetLineColor( bPressed ? aColLight : aColShadow );
74 rDev.DrawLine( aRect.BottomRight(), Point( aRect.Right(), aRect.Top() ) );
75 rDev.DrawLine( aRect.BottomRight(), Point( aRect.Left(), aRect.Bottom() ) );
76 }
77
78 if ( aText.Len() )
79 {
80 String aVal = rDev.GetEllipsisString(aText,aInnerRect.GetWidth() - 2*MIN_COLUMNWIDTH);
81
82 Font aFont( rDev.GetFont() );
83 sal_Bool bOldTransp = aFont.IsTransparent();
84 if ( !bOldTransp )
85 {
86 aFont.SetTransparent( sal_True );
87 rDev.SetFont( aFont );
88 }
89
90 Color aOldColor = rDev.GetTextColor();
91 if (m_bDrawDisabled)
92 rDev.SetTextColor(rSettings.GetDisableColor());
93
94 rDev.DrawText( Point(
95 ( aInnerRect.Left() + aInnerRect.Right() ) / 2 - ( rDev.GetTextWidth(aVal) / 2 ),
96 aInnerRect.Top() ), aVal );
97
98 // restore settings
99 if ( !bOldTransp )
100 {
101 aFont.SetTransparent(sal_False);
102 rDev.SetFont( aFont );
103 }
104 if (m_bDrawDisabled)
105 rDev.SetTextColor(aOldColor);
106 }
107
108 if ( bCurs )
109 {
110 rDev.SetLineColor( Color( COL_BLACK ) );
111 rDev.SetFillColor();
112 rDev.DrawRect( Rectangle(
113 Point( aRect.Left(), aRect.Top() ), Point( aRect.Right(), aRect.Bottom() ) ) );
114 }
115
116 rDev.SetLineColor( aOldLineColor );
117 rDev.SetFillColor( aOldFillColor );
118 }
119
120 //-------------------------------------------------------------------
121
BrowserColumn(sal_uInt16 nItemId,const class Image & rImage,const String & rTitle,sal_uLong nWidthPixel,const Fraction & rCurrentZoom,HeaderBarItemBits nFlags)122 BrowserColumn::BrowserColumn( sal_uInt16 nItemId, const class Image &rImage,
123 const String& rTitle, sal_uLong nWidthPixel, const Fraction& rCurrentZoom,
124 HeaderBarItemBits nFlags )
125 : _nId( nItemId ),
126 _nWidth( nWidthPixel ),
127 _aImage( rImage ),
128 _aTitle( rTitle ),
129 _bFrozen( sal_False ),
130 _nFlags( nFlags )
131 {
132 double n = (double)_nWidth;
133 n *= (double)rCurrentZoom.GetDenominator();
134 n /= (double)rCurrentZoom.GetNumerator();
135 _nOriginalWidth = n>0 ? (long)(n+0.5) : -(long)(-n+0.5);
136 }
137
~BrowserColumn()138 BrowserColumn::~BrowserColumn()
139 {
140 }
141
142 //-------------------------------------------------------------------
143
SetWidth(sal_uLong nNewWidthPixel,const Fraction & rCurrentZoom)144 void BrowserColumn::SetWidth(sal_uLong nNewWidthPixel, const Fraction& rCurrentZoom)
145 {
146 _nWidth = nNewWidthPixel;
147 double n = (double)_nWidth;
148 n *= (double)rCurrentZoom.GetDenominator();
149 n /= (double)rCurrentZoom.GetNumerator();
150 _nOriginalWidth = n>0 ? (long)(n+0.5) : -(long)(-n+0.5);
151 }
152
153 //-------------------------------------------------------------------
154
Draw(BrowseBox & rBox,OutputDevice & rDev,const Point & rPos,sal_Bool bCurs)155 void BrowserColumn::Draw( BrowseBox& rBox, OutputDevice& rDev, const Point& rPos, sal_Bool bCurs )
156 {
157 if ( _nId == 0 )
158 {
159 // paint handle column
160 ButtonFrame( rPos, Size( Width()-1, rBox.GetDataRowHeight()-1 ),
161 String(), sal_False, bCurs,
162 0 != (BROWSER_COLUMN_TITLEABBREVATION&_nFlags) ).Draw( rDev );
163 Color aOldLineColor = rDev.GetLineColor();
164 rDev.SetLineColor( Color( COL_BLACK ) );
165 rDev.DrawLine(
166 Point( rPos.X(), rPos.Y()+rBox.GetDataRowHeight()-1 ),
167 Point( rPos.X() + Width() - 1, rPos.Y()+rBox.GetDataRowHeight()-1 ) );
168 rDev.DrawLine(
169 Point( rPos.X() + Width() - 1, rPos.Y() ),
170 Point( rPos.X() + Width() - 1, rPos.Y()+rBox.GetDataRowHeight()-1 ) );
171 rDev.SetLineColor( aOldLineColor );
172
173 rBox.DoPaintField( rDev,
174 Rectangle(
175 Point( rPos.X() + 2, rPos.Y() + 2 ),
176 Size( Width()-1, rBox.GetDataRowHeight()-1 ) ),
177 GetId(),
178 BrowseBox::BrowserColumnAccess() );
179 }
180 else
181 {
182 // paint data column
183 long nWidth = Width() == LONG_MAX ? rBox.GetDataWindow().GetSizePixel().Width() : Width();
184
185 rBox.DoPaintField( rDev,
186 Rectangle(
187 Point( rPos.X() + MIN_COLUMNWIDTH, rPos.Y() ),
188 Size( nWidth-2*MIN_COLUMNWIDTH, rBox.GetDataRowHeight()-1 ) ),
189 GetId(),
190 BrowseBox::BrowserColumnAccess() );
191 }
192 }
193
194 //-------------------------------------------------------------------
195
ZoomChanged(const Fraction & rNewZoom)196 void BrowserColumn::ZoomChanged(const Fraction& rNewZoom)
197 {
198 double n = (double)_nOriginalWidth;
199 n *= (double)rNewZoom.GetNumerator();
200 n /= (double)rNewZoom.GetDenominator();
201
202 _nWidth = n>0 ? (long)(n+0.5) : -(long)(-n+0.5);
203 }
204
205 //-------------------------------------------------------------------
206
BrowserDataWin(BrowseBox * pParent)207 BrowserDataWin::BrowserDataWin( BrowseBox* pParent )
208 :Control( pParent, WinBits(WB_CLIPCHILDREN) )
209 ,DragSourceHelper( this )
210 ,DropTargetHelper( this )
211 ,pHeaderBar( 0 )
212 ,pEventWin( pParent )
213 ,pCornerWin( 0 )
214 ,pDtorNotify( 0 )
215 ,bInPaint( sal_False )
216 ,bInCommand( sal_False )
217 ,bNoScrollBack( sal_False )
218 ,bNoHScroll( sal_False )
219 ,bNoVScroll( sal_False )
220 ,bUpdateMode( sal_True )
221 ,bResizeOnPaint( sal_False )
222 ,bUpdateOnUnlock( sal_False )
223 ,bInUpdateScrollbars( sal_False )
224 ,bHadRecursion( sal_False )
225 ,bOwnDataChangedHdl( sal_False )
226 ,bCallingDropCallback( sal_False )
227 ,nUpdateLock( 0 )
228 ,nCursorHidden( 0 )
229 ,m_nDragRowDividerLimit( 0 )
230 ,m_nDragRowDividerOffset( 0 )
231 {
232 aMouseTimer.SetTimeoutHdl( LINK( this, BrowserDataWin, RepeatedMouseMove ) );
233 aMouseTimer.SetTimeout( 100 );
234 }
235
236 //-------------------------------------------------------------------
~BrowserDataWin()237 BrowserDataWin::~BrowserDataWin()
238 {
239 if( pDtorNotify )
240 *pDtorNotify = sal_True;
241 }
242
243 //-------------------------------------------------------------------
LeaveUpdateLock()244 void BrowserDataWin::LeaveUpdateLock()
245 {
246 if ( !--nUpdateLock )
247 {
248 DoOutstandingInvalidations();
249 if (bUpdateOnUnlock )
250 {
251 Control::Update();
252 bUpdateOnUnlock = sal_False;
253 }
254 }
255 }
256
257 //-------------------------------------------------------------------
InitSettings_Impl(Window * pWin,sal_Bool bFont,sal_Bool bForeground,sal_Bool bBackground)258 void InitSettings_Impl( Window *pWin,
259 sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground )
260 {
261 const StyleSettings& rStyleSettings =
262 pWin->GetSettings().GetStyleSettings();
263
264 if ( bFont )
265 {
266 Font aFont = rStyleSettings.GetFieldFont();
267 if ( pWin->IsControlFont() )
268 aFont.Merge( pWin->GetControlFont() );
269 pWin->SetZoomedPointFont( aFont );
270 }
271
272 if ( bFont || bForeground )
273 {
274 Color aTextColor = rStyleSettings.GetWindowTextColor();
275 if ( pWin->IsControlForeground() )
276 aTextColor = pWin->GetControlForeground();
277 pWin->SetTextColor( aTextColor );
278 }
279
280 if ( bBackground )
281 {
282 if( pWin->IsControlBackground() )
283 pWin->SetBackground( pWin->GetControlBackground() );
284 else
285 pWin->SetBackground( rStyleSettings.GetWindowColor() );
286 }
287 }
288
289 //-------------------------------------------------------------------
Update()290 void BrowserDataWin::Update()
291 {
292 if ( !nUpdateLock )
293 Control::Update();
294 else
295 bUpdateOnUnlock = sal_True;
296 }
297
298 //-------------------------------------------------------------------
DataChanged(const DataChangedEvent & rDCEvt)299 void BrowserDataWin::DataChanged( const DataChangedEvent& rDCEvt )
300 {
301 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
302 (rDCEvt.GetFlags() & SETTINGS_STYLE) )
303 {
304 if( !bOwnDataChangedHdl )
305 {
306 InitSettings_Impl( this, sal_True, sal_True, sal_True );
307 Invalidate();
308 InitSettings_Impl( GetParent(), sal_True, sal_True, sal_True );
309 GetParent()->Invalidate();
310 GetParent()->Resize();
311 }
312 }
313 else
314 Control::DataChanged( rDCEvt );
315 }
316
317 //-------------------------------------------------------------------
Paint(const Rectangle & rRect)318 void BrowserDataWin::Paint( const Rectangle& rRect )
319 {
320 if ( !nUpdateLock && GetUpdateMode() )
321 {
322 if ( bInPaint )
323 {
324 aInvalidRegion.Insert( new Rectangle( rRect ) );
325 return;
326 }
327 bInPaint = sal_True;
328 ( (BrowseBox*) GetParent() )->PaintData( *this, rRect );
329 bInPaint = sal_False;
330 DoOutstandingInvalidations();
331 }
332 else
333 aInvalidRegion.Insert( new Rectangle( rRect ) );
334 }
335
336 //-------------------------------------------------------------------
337
CreateBrowseEvent(const Point & rPosPixel)338 BrowseEvent BrowserDataWin::CreateBrowseEvent( const Point& rPosPixel )
339 {
340 BrowseBox *pBox = GetParent();
341
342 // seek to row under mouse
343 long nRelRow = rPosPixel.Y() < 0
344 ? -1
345 : rPosPixel.Y() / pBox->GetDataRowHeight();
346 long nRow = nRelRow < 0 ? -1 : nRelRow + pBox->nTopRow;
347
348 // find column under mouse
349 long nMouseX = rPosPixel.X();
350 long nColX = 0;
351 sal_uInt16 nCol;
352 for ( nCol = 0;
353 nCol < pBox->pCols->Count() && nColX < GetSizePixel().Width();
354 ++nCol )
355 if ( pBox->pCols->GetObject(nCol)->IsFrozen() || nCol >= pBox->nFirstCol )
356 {
357 nColX += pBox->pCols->GetObject(nCol)->Width();
358 if ( nMouseX < nColX )
359 break;
360 }
361 sal_uInt16 nColId = BROWSER_INVALIDID;
362 if ( nCol < pBox->pCols->Count() )
363 nColId = pBox->pCols->GetObject(nCol)->GetId();
364
365 // compute the field rectangle and field relative MouseEvent
366 Rectangle aFieldRect;
367 if ( nCol < pBox->pCols->Count() )
368 {
369 nColX -= pBox->pCols->GetObject(nCol)->Width();
370 aFieldRect = Rectangle(
371 Point( nColX, nRelRow * pBox->GetDataRowHeight() ),
372 Size( pBox->pCols->GetObject(nCol)->Width(),
373 pBox->GetDataRowHeight() ) );
374 }
375
376 // assemble and return the BrowseEvent
377 return BrowseEvent( this, nRow, nCol, nColId, aFieldRect );
378 }
379
380 //-------------------------------------------------------------------
AcceptDrop(const AcceptDropEvent & _rEvt)381 sal_Int8 BrowserDataWin::AcceptDrop( const AcceptDropEvent& _rEvt )
382 {
383 bCallingDropCallback = sal_True;
384 sal_Int8 nReturn = DND_ACTION_NONE;
385 nReturn = GetParent()->AcceptDrop( BrowserAcceptDropEvent( this, _rEvt ) );
386 bCallingDropCallback = sal_False;
387 return nReturn;
388 }
389
390 //-------------------------------------------------------------------
ExecuteDrop(const ExecuteDropEvent & _rEvt)391 sal_Int8 BrowserDataWin::ExecuteDrop( const ExecuteDropEvent& _rEvt )
392 {
393 bCallingDropCallback = sal_True;
394 sal_Int8 nReturn = DND_ACTION_NONE;
395 nReturn = GetParent()->ExecuteDrop( BrowserExecuteDropEvent( this, _rEvt ) );
396 bCallingDropCallback = sal_False;
397 return nReturn;
398 }
399
400 //-------------------------------------------------------------------
StartDrag(sal_Int8 _nAction,const Point & _rPosPixel)401 void BrowserDataWin::StartDrag( sal_Int8 _nAction, const Point& _rPosPixel )
402 {
403 if ( !GetParent()->bRowDividerDrag )
404 {
405 Point aEventPos( _rPosPixel );
406 aEventPos.Y() += GetParent()->GetTitleHeight();
407 GetParent()->StartDrag( _nAction, aEventPos );
408 }
409 }
410
411 //-------------------------------------------------------------------
Command(const CommandEvent & rEvt)412 void BrowserDataWin::Command( const CommandEvent& rEvt )
413 {
414 // Scrollmaus-Event?
415 BrowseBox *pBox = GetParent();
416 if ( ( (rEvt.GetCommand() == COMMAND_WHEEL) ||
417 (rEvt.GetCommand() == COMMAND_STARTAUTOSCROLL) ||
418 (rEvt.GetCommand() == COMMAND_AUTOSCROLL) ) &&
419 ( HandleScrollCommand( rEvt, &pBox->aHScroll, pBox->pVScroll ) ) )
420 return;
421
422 Point aEventPos( rEvt.GetMousePosPixel() );
423 long nRow = pBox->GetRowAtYPosPixel( aEventPos.Y(), sal_False);
424 MouseEvent aMouseEvt( aEventPos, 1, MOUSE_SELECT, MOUSE_LEFT );
425 if ( COMMAND_CONTEXTMENU == rEvt.GetCommand() && rEvt.IsMouseEvent() &&
426 nRow < pBox->GetRowCount() && !pBox->IsRowSelected(nRow) )
427 {
428 sal_Bool bDeleted = sal_False;
429 pDtorNotify = &bDeleted;
430 bInCommand = sal_True;
431 MouseButtonDown( aMouseEvt );
432 if( bDeleted )
433 return;
434 MouseButtonUp( aMouseEvt );
435 if( bDeleted )
436 return;
437 pDtorNotify = 0;
438 bInCommand = sal_False;
439 }
440
441 aEventPos.Y() += GetParent()->GetTitleHeight();
442 CommandEvent aEvt( aEventPos, rEvt.GetCommand(),
443 rEvt.IsMouseEvent(), rEvt.GetData() );
444 bInCommand = sal_True;
445 sal_Bool bDeleted = sal_False;
446 pDtorNotify = &bDeleted;
447 GetParent()->Command( aEvt );
448 if( bDeleted )
449 return;
450 pDtorNotify = 0;
451 bInCommand = sal_False;
452
453 if ( COMMAND_STARTDRAG == rEvt.GetCommand() )
454 MouseButtonUp( aMouseEvt );
455
456 Control::Command( rEvt );
457 }
458
459 //-------------------------------------------------------------------
460
ImplRowDividerHitTest(const BrowserMouseEvent & _rEvent)461 sal_Bool BrowserDataWin::ImplRowDividerHitTest( const BrowserMouseEvent& _rEvent )
462 {
463 if ( ! ( GetParent()->IsInteractiveRowHeightEnabled()
464 && ( _rEvent.GetRow() >= 0 )
465 && ( _rEvent.GetRow() < GetParent()->GetRowCount() )
466 && ( _rEvent.GetColumnId() == 0 )
467 )
468 )
469 return sal_False;
470
471 long nDividerDistance = GetParent()->GetDataRowHeight() - ( _rEvent.GetPosPixel().Y() % GetParent()->GetDataRowHeight() );
472 return ( nDividerDistance <= 4 );
473 }
474
475 //-------------------------------------------------------------------
476
MouseButtonDown(const MouseEvent & rEvt)477 void BrowserDataWin::MouseButtonDown( const MouseEvent& rEvt )
478 {
479 aLastMousePos = OutputToScreenPixel( rEvt.GetPosPixel() );
480
481 BrowserMouseEvent aBrowserEvent( this, rEvt );
482 if ( ( aBrowserEvent.GetClicks() == 1 ) && ImplRowDividerHitTest( aBrowserEvent ) )
483 {
484 StartRowDividerDrag( aBrowserEvent.GetPosPixel() );
485 return;
486 }
487
488 GetParent()->MouseButtonDown( BrowserMouseEvent( this, rEvt ) );
489 }
490
491 //-------------------------------------------------------------------
492
MouseMove(const MouseEvent & rEvt)493 void BrowserDataWin::MouseMove( const MouseEvent& rEvt )
494 {
495 // Pseudo MouseMoves verhindern
496 Point aNewPos = OutputToScreenPixel( rEvt.GetPosPixel() );
497 if ( ( aNewPos == aLastMousePos ) )
498 return;
499 aLastMousePos = aNewPos;
500
501 // transform to a BrowseEvent
502 BrowserMouseEvent aBrowserEvent( this, rEvt );
503 GetParent()->MouseMove( aBrowserEvent );
504
505 // pointer shape
506 PointerStyle ePointerStyle = POINTER_ARROW;
507 if ( ImplRowDividerHitTest( aBrowserEvent ) )
508 ePointerStyle = POINTER_VSIZEBAR;
509 SetPointer( Pointer( ePointerStyle ) );
510
511 // dragging out of the visible area?
512 if ( rEvt.IsLeft() &&
513 ( rEvt.GetPosPixel().Y() > GetSizePixel().Height() ||
514 rEvt.GetPosPixel().Y() < 0 ) )
515 {
516 // repeat the event
517 aRepeatEvt = rEvt;
518 aMouseTimer.Start();
519 }
520 else
521 // killing old repeat-event
522 if ( aMouseTimer.IsActive() )
523 aMouseTimer.Stop();
524 }
525
526 //-------------------------------------------------------------------
527
IMPL_LINK_INLINE_START(BrowserDataWin,RepeatedMouseMove,void *,EMPTYARG)528 IMPL_LINK_INLINE_START( BrowserDataWin, RepeatedMouseMove, void *, EMPTYARG )
529 {
530 GetParent()->MouseMove( BrowserMouseEvent( this, aRepeatEvt ) );
531 return 0;
532 }
IMPL_LINK_INLINE_END(BrowserDataWin,RepeatedMouseMove,void *,EMPTYARG)533 IMPL_LINK_INLINE_END( BrowserDataWin, RepeatedMouseMove, void *, EMPTYARG )
534
535 //-------------------------------------------------------------------
536
537 void BrowserDataWin::MouseButtonUp( const MouseEvent& rEvt )
538 {
539 // Pseudo MouseMoves verhindern
540 Point aNewPos = OutputToScreenPixel( rEvt.GetPosPixel() );
541 aLastMousePos = aNewPos;
542
543 // Move an die aktuelle Position simulieren
544 MouseMove( rEvt );
545
546 // eigentliches Up-Handling
547 ReleaseMouse();
548 if ( aMouseTimer.IsActive() )
549 aMouseTimer.Stop();
550 GetParent()->MouseButtonUp( BrowserMouseEvent( this, rEvt ) );
551 }
552
553 //-------------------------------------------------------------------
554
StartRowDividerDrag(const Point & _rStartPos)555 void BrowserDataWin::StartRowDividerDrag( const Point& _rStartPos )
556 {
557 long nDataRowHeight = GetParent()->GetDataRowHeight();
558 // the exact separation pos of the two rows
559 long nDragRowDividerCurrentPos = _rStartPos.Y();
560 if ( ( nDragRowDividerCurrentPos % nDataRowHeight ) > nDataRowHeight / 2 )
561 nDragRowDividerCurrentPos += nDataRowHeight;
562 nDragRowDividerCurrentPos /= nDataRowHeight;
563 nDragRowDividerCurrentPos *= nDataRowHeight;
564
565 m_nDragRowDividerOffset = nDragRowDividerCurrentPos - _rStartPos.Y();
566
567 m_nDragRowDividerLimit = nDragRowDividerCurrentPos - nDataRowHeight;
568
569 GetParent()->bRowDividerDrag = sal_True;
570 GetParent()->ImplStartTracking();
571
572 Rectangle aDragSplitRect( 0, m_nDragRowDividerLimit, GetOutputSizePixel().Width(), nDragRowDividerCurrentPos );
573 ShowTracking( aDragSplitRect, SHOWTRACK_SMALL );
574
575 StartTracking();
576 }
577
578 //-------------------------------------------------------------------
579
Tracking(const TrackingEvent & rTEvt)580 void BrowserDataWin::Tracking( const TrackingEvent& rTEvt )
581 {
582 if ( !GetParent()->bRowDividerDrag )
583 return;
584
585 Point aMousePos = rTEvt.GetMouseEvent().GetPosPixel();
586 // stop resizing at our bottom line
587 if ( aMousePos.Y() > GetOutputSizePixel().Height() )
588 aMousePos.Y() = GetOutputSizePixel().Height();
589
590 if ( rTEvt.IsTrackingEnded() )
591 {
592 HideTracking();
593 GetParent()->bRowDividerDrag = sal_False;
594 GetParent()->ImplEndTracking();
595
596 if ( !rTEvt.IsTrackingCanceled() )
597 {
598 long nNewRowHeight = aMousePos.Y() + m_nDragRowDividerOffset - m_nDragRowDividerLimit;
599
600 // care for minimum row height
601 if ( nNewRowHeight < GetParent()->QueryMinimumRowHeight() )
602 nNewRowHeight = GetParent()->QueryMinimumRowHeight();
603
604 GetParent()->SetDataRowHeight( nNewRowHeight );
605 GetParent()->RowHeightChanged();
606 }
607 }
608 else
609 {
610 GetParent()->ImplTracking();
611
612 long nDragRowDividerCurrentPos = aMousePos.Y() + m_nDragRowDividerOffset;
613
614 // care for minimum row height
615 if ( nDragRowDividerCurrentPos < m_nDragRowDividerLimit + GetParent()->QueryMinimumRowHeight() )
616 nDragRowDividerCurrentPos = m_nDragRowDividerLimit + GetParent()->QueryMinimumRowHeight();
617
618 Rectangle aDragSplitRect( 0, m_nDragRowDividerLimit, GetOutputSizePixel().Width(), nDragRowDividerCurrentPos );
619 ShowTracking( aDragSplitRect, SHOWTRACK_SMALL );
620 }
621 }
622
623 //-------------------------------------------------------------------
624
KeyInput(const KeyEvent & rEvt)625 void BrowserDataWin::KeyInput( const KeyEvent& rEvt )
626 {
627 // pass to parent window
628 if ( !GetParent()->ProcessKey( rEvt ) )
629 Control::KeyInput( rEvt );
630 }
631
632 //-------------------------------------------------------------------
633
RequestHelp(const HelpEvent & rHEvt)634 void BrowserDataWin::RequestHelp( const HelpEvent& rHEvt )
635 {
636 pEventWin = this;
637 GetParent()->RequestHelp( rHEvt );
638 pEventWin = GetParent();
639 }
640
641 //===================================================================
642
BrowseEvent(Window * pWindow,long nAbsRow,sal_uInt16 nColumn,sal_uInt16 nColumnId,const Rectangle & rRect)643 BrowseEvent::BrowseEvent( Window* pWindow,
644 long nAbsRow, sal_uInt16 nColumn, sal_uInt16 nColumnId,
645 const Rectangle& rRect ):
646 pWin(pWindow),
647 nRow(nAbsRow),
648 aRect(rRect),
649 nCol(nColumn),
650 nColId(nColumnId)
651 {
652 }
653
654 //===================================================================
BrowserMouseEvent(BrowserDataWin * pWindow,const MouseEvent & rEvt)655 BrowserMouseEvent::BrowserMouseEvent( BrowserDataWin *pWindow,
656 const MouseEvent& rEvt ):
657 MouseEvent(rEvt),
658 BrowseEvent( pWindow->CreateBrowseEvent( rEvt.GetPosPixel() ) )
659 {
660 }
661
662 //-------------------------------------------------------------------
663
BrowserMouseEvent(Window * pWindow,const MouseEvent & rEvt,long nAbsRow,sal_uInt16 nColumn,sal_uInt16 nColumnId,const Rectangle & rRect)664 BrowserMouseEvent::BrowserMouseEvent( Window *pWindow, const MouseEvent& rEvt,
665 long nAbsRow, sal_uInt16 nColumn, sal_uInt16 nColumnId,
666 const Rectangle& rRect ):
667 MouseEvent(rEvt),
668 BrowseEvent( pWindow, nAbsRow, nColumn, nColumnId, rRect )
669 {
670 }
671
672 //===================================================================
673
BrowserAcceptDropEvent(BrowserDataWin * pWindow,const AcceptDropEvent & rEvt)674 BrowserAcceptDropEvent::BrowserAcceptDropEvent( BrowserDataWin *pWindow, const AcceptDropEvent& rEvt )
675 :AcceptDropEvent(rEvt)
676 ,BrowseEvent( pWindow->CreateBrowseEvent( rEvt.maPosPixel ) )
677 {
678 }
679
680 //===================================================================
681
BrowserExecuteDropEvent(BrowserDataWin * pWindow,const ExecuteDropEvent & rEvt)682 BrowserExecuteDropEvent::BrowserExecuteDropEvent( BrowserDataWin *pWindow, const ExecuteDropEvent& rEvt )
683 :ExecuteDropEvent(rEvt)
684 ,BrowseEvent( pWindow->CreateBrowseEvent( rEvt.maPosPixel ) )
685 {
686 }
687
688 //===================================================================
689
690 //-------------------------------------------------------------------
691
SetUpdateMode(sal_Bool bMode)692 void BrowserDataWin::SetUpdateMode( sal_Bool bMode )
693 {
694 DBG_ASSERT( !bUpdateMode || aInvalidRegion.Count() == 0,
695 "invalid region not empty" );
696 if ( bMode == bUpdateMode )
697 return;
698
699 bUpdateMode = bMode;
700 if ( bMode )
701 DoOutstandingInvalidations();
702 }
703
704 //-------------------------------------------------------------------
DoOutstandingInvalidations()705 void BrowserDataWin::DoOutstandingInvalidations()
706 {
707 for ( Rectangle* pRect = aInvalidRegion.First();
708 pRect;
709 pRect = aInvalidRegion.Next() )
710 {
711 Control::Invalidate( *pRect );
712 delete pRect;
713 }
714 aInvalidRegion.Clear();
715 }
716
717 //-------------------------------------------------------------------
718
Invalidate(sal_uInt16 nFlags)719 void BrowserDataWin::Invalidate( sal_uInt16 nFlags )
720 {
721 if ( !GetUpdateMode() )
722 {
723 for ( Rectangle* pRect = aInvalidRegion.First();
724 pRect;
725 pRect = aInvalidRegion.Next() )
726 delete pRect;
727 aInvalidRegion.Clear();
728 aInvalidRegion.Insert( new Rectangle( Point( 0, 0 ), GetOutputSizePixel() ) );
729 }
730 else
731 Window::Invalidate( nFlags );
732 }
733
734 //-------------------------------------------------------------------
735
Invalidate(const Rectangle & rRect,sal_uInt16 nFlags)736 void BrowserDataWin::Invalidate( const Rectangle& rRect, sal_uInt16 nFlags )
737 {
738 if ( !GetUpdateMode() )
739 aInvalidRegion.Insert( new Rectangle( rRect ) );
740 else
741 Window::Invalidate( rRect, nFlags );
742 }
743
744 //===================================================================
745
Tracking(const TrackingEvent & rTEvt)746 void BrowserScrollBar::Tracking( const TrackingEvent& rTEvt )
747 {
748 sal_uLong nPos = GetThumbPos();
749 if ( nPos != _nLastPos )
750 {
751 String aTip( String::CreateFromInt32(nPos) );
752 aTip += '/';
753 if ( _pDataWin->GetRealRowCount().Len() )
754 aTip += _pDataWin->GetRealRowCount();
755 else
756 aTip += String::CreateFromInt32(GetRangeMax());
757
758 Rectangle aRect( GetPointerPosPixel(), Size( GetTextHeight(), GetTextWidth( aTip ) ) );
759 if ( _nTip )
760 Help::UpdateTip( _nTip, this, aRect, aTip );
761 else
762 _nTip = Help::ShowTip( this, aRect, aTip );
763 _nLastPos = nPos;
764 }
765
766 ScrollBar::Tracking( rTEvt );
767 }
768
769 //-------------------------------------------------------------------
770
EndScroll()771 void BrowserScrollBar::EndScroll()
772 {
773 if ( _nTip )
774 Help::HideTip( _nTip );
775 _nTip = 0;
776 ScrollBar::EndScroll();
777 }
778
779
780