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