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