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 :
23 : #include <vcl/svapp.hxx>
24 :
25 : #include <vcl/help.hxx>
26 : #include <vcl/image.hxx>
27 : #include <vcl/settings.hxx>
28 : #include <rtl/string.hxx>
29 : #include <tools/debug.hxx>
30 :
31 :
32 0 : void ButtonFrame::Draw( OutputDevice& rDev )
33 : {
34 0 : Color aOldFillColor = rDev.GetFillColor();
35 0 : Color aOldLineColor = rDev.GetLineColor();
36 :
37 0 : const StyleSettings &rSettings = rDev.GetSettings().GetStyleSettings();
38 0 : Color aColLight( rSettings.GetLightColor() );
39 0 : Color aColShadow( rSettings.GetShadowColor() );
40 0 : Color aColFace( rSettings.GetFaceColor() );
41 :
42 0 : rDev.SetLineColor( aColFace );
43 0 : rDev.SetFillColor( aColFace );
44 0 : rDev.DrawRect( aRect );
45 :
46 0 : if( rDev.GetOutDevType() == OUTDEV_WINDOW )
47 : {
48 0 : Window *pWin = (Window*) &rDev;
49 0 : 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 0 : if ( !aText.isEmpty() )
63 : {
64 0 : OUString aVal = rDev.GetEllipsisString(aText,aInnerRect.GetWidth() - 2*MIN_COLUMNWIDTH);
65 :
66 0 : Font aFont( rDev.GetFont() );
67 0 : sal_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 0 : 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 0 : rDev.SetLineColor( aOldLineColor );
101 0 : rDev.SetFillColor( aOldFillColor );
102 0 : }
103 :
104 :
105 :
106 0 : BrowserColumn::BrowserColumn( sal_uInt16 nItemId, const class Image &rImage,
107 : const OUString& rTitle, sal_uLong nWidthPixel, const Fraction& rCurrentZoom )
108 : : _nId( nItemId ),
109 : _nWidth( nWidthPixel ),
110 : _aImage( rImage ),
111 : _aTitle( rTitle ),
112 0 : _bFrozen( sal_False )
113 : {
114 0 : double n = (double)_nWidth;
115 0 : n *= (double)rCurrentZoom.GetDenominator();
116 0 : n /= (double)rCurrentZoom.GetNumerator();
117 0 : _nOriginalWidth = n>0 ? (long)(n+0.5) : -(long)(-n+0.5);
118 0 : }
119 :
120 0 : BrowserColumn::~BrowserColumn()
121 : {
122 0 : }
123 :
124 :
125 :
126 0 : void BrowserColumn::SetWidth(sal_uLong nNewWidthPixel, const Fraction& rCurrentZoom)
127 : {
128 0 : _nWidth = nNewWidthPixel;
129 0 : double n = (double)_nWidth;
130 0 : n *= (double)rCurrentZoom.GetDenominator();
131 0 : n /= (double)rCurrentZoom.GetNumerator();
132 0 : _nOriginalWidth = n>0 ? (long)(n+0.5) : -(long)(-n+0.5);
133 0 : }
134 :
135 :
136 :
137 0 : void BrowserColumn::Draw( BrowseBox& rBox, OutputDevice& rDev, const Point& rPos, sal_Bool bCurs )
138 : {
139 0 : if ( _nId == 0 )
140 : {
141 : // paint handle column
142 0 : ButtonFrame( rPos, Size( Width()-1, rBox.GetDataRowHeight()-1 ),
143 0 : "", sal_False, bCurs, false ).Draw( rDev );
144 0 : Color aOldLineColor = rDev.GetLineColor();
145 0 : rDev.SetLineColor( Color( COL_BLACK ) );
146 : rDev.DrawLine(
147 0 : Point( rPos.X(), rPos.Y()+rBox.GetDataRowHeight()-1 ),
148 0 : Point( rPos.X() + Width() - 1, rPos.Y()+rBox.GetDataRowHeight()-1 ) );
149 : rDev.DrawLine(
150 0 : Point( rPos.X() + Width() - 1, rPos.Y() ),
151 0 : Point( rPos.X() + Width() - 1, rPos.Y()+rBox.GetDataRowHeight()-1 ) );
152 0 : rDev.SetLineColor( aOldLineColor );
153 :
154 : rBox.DoPaintField( rDev,
155 : Rectangle(
156 0 : Point( rPos.X() + 2, rPos.Y() + 2 ),
157 0 : Size( Width()-1, rBox.GetDataRowHeight()-1 ) ),
158 0 : GetId(),
159 0 : BrowseBox::BrowserColumnAccess() );
160 : }
161 : else
162 : {
163 : // paint data column
164 0 : long nWidth = Width() == LONG_MAX ? rBox.GetDataWindow().GetSizePixel().Width() : Width();
165 :
166 : rBox.DoPaintField( rDev,
167 : Rectangle(
168 0 : Point( rPos.X() + MIN_COLUMNWIDTH, rPos.Y() ),
169 0 : Size( nWidth-2*MIN_COLUMNWIDTH, rBox.GetDataRowHeight()-1 ) ),
170 0 : GetId(),
171 0 : BrowseBox::BrowserColumnAccess() );
172 : }
173 0 : }
174 :
175 :
176 :
177 0 : void BrowserColumn::ZoomChanged(const Fraction& rNewZoom)
178 : {
179 0 : double n = (double)_nOriginalWidth;
180 0 : n *= (double)rNewZoom.GetNumerator();
181 0 : n /= (double)rNewZoom.GetDenominator();
182 :
183 0 : _nWidth = n>0 ? (long)(n+0.5) : -(long)(-n+0.5);
184 0 : }
185 :
186 :
187 :
188 0 : BrowserDataWin::BrowserDataWin( BrowseBox* pParent )
189 : :Control( pParent, WinBits(WB_CLIPCHILDREN) )
190 : ,DragSourceHelper( this )
191 : ,DropTargetHelper( this )
192 : ,pHeaderBar( 0 )
193 : ,pEventWin( pParent )
194 : ,pCornerWin( 0 )
195 : ,bInDtor( false )
196 : ,bInPaint( false )
197 : ,bInCommand( false )
198 : ,bNoScrollBack( false )
199 : ,bNoHScroll( false )
200 : ,bNoVScroll( false )
201 : ,bAutoHScroll(false)
202 : ,bAutoVScroll(false)
203 : ,bUpdateMode( true )
204 : ,bAutoSizeLastCol(false)
205 : ,bResizeOnPaint( false )
206 : ,bUpdateOnUnlock( false )
207 : ,bInUpdateScrollbars( false )
208 : ,bHadRecursion( false )
209 : ,bOwnDataChangedHdl( false )
210 : ,bCallingDropCallback( false )
211 : ,nUpdateLock( 0 )
212 : ,nCursorHidden( 0 )
213 : ,m_nDragRowDividerLimit( 0 )
214 0 : ,m_nDragRowDividerOffset( 0 )
215 : {
216 0 : aMouseTimer.SetTimeoutHdl( LINK( this, BrowserDataWin, RepeatedMouseMove ) );
217 0 : aMouseTimer.SetTimeout( 100 );
218 0 : }
219 :
220 :
221 0 : BrowserDataWin::~BrowserDataWin()
222 : {
223 0 : bInDtor = true;
224 :
225 0 : for ( size_t i = 0, n = aInvalidRegion.size(); i < n; ++i )
226 0 : delete aInvalidRegion[ i ];
227 0 : aInvalidRegion.clear();
228 0 : }
229 :
230 :
231 0 : void BrowserDataWin::LeaveUpdateLock()
232 : {
233 0 : if ( !--nUpdateLock )
234 : {
235 0 : DoOutstandingInvalidations();
236 0 : if (bUpdateOnUnlock )
237 : {
238 0 : Control::Update();
239 0 : bUpdateOnUnlock = false;
240 : }
241 : }
242 0 : }
243 :
244 :
245 0 : void InitSettings_Impl( Window *pWin,
246 : sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground )
247 : {
248 : const StyleSettings& rStyleSettings =
249 0 : pWin->GetSettings().GetStyleSettings();
250 :
251 0 : if ( bFont )
252 : {
253 0 : Font aFont = rStyleSettings.GetFieldFont();
254 0 : if ( pWin->IsControlFont() )
255 0 : aFont.Merge( pWin->GetControlFont() );
256 0 : pWin->SetZoomedPointFont( aFont );
257 : }
258 :
259 0 : if ( bFont || bForeground )
260 : {
261 0 : Color aTextColor = rStyleSettings.GetWindowTextColor();
262 0 : if ( pWin->IsControlForeground() )
263 0 : aTextColor = pWin->GetControlForeground();
264 0 : pWin->SetTextColor( aTextColor );
265 : }
266 :
267 0 : if ( bBackground )
268 : {
269 0 : if( pWin->IsControlBackground() )
270 0 : pWin->SetBackground( pWin->GetControlBackground() );
271 : else
272 0 : pWin->SetBackground( rStyleSettings.GetWindowColor() );
273 : }
274 0 : }
275 :
276 :
277 0 : void BrowserDataWin::Update()
278 : {
279 0 : if ( !nUpdateLock )
280 0 : Control::Update();
281 : else
282 0 : bUpdateOnUnlock = true;
283 0 : }
284 :
285 :
286 0 : void BrowserDataWin::DataChanged( const DataChangedEvent& rDCEvt )
287 : {
288 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
289 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
290 : {
291 0 : if( !bOwnDataChangedHdl )
292 : {
293 0 : InitSettings_Impl( this, sal_True, sal_True, sal_True );
294 0 : Invalidate();
295 0 : InitSettings_Impl( GetParent(), sal_True, sal_True, sal_True );
296 0 : GetParent()->Invalidate();
297 0 : GetParent()->Resize();
298 : }
299 : }
300 : else
301 0 : Control::DataChanged( rDCEvt );
302 0 : }
303 :
304 :
305 0 : void BrowserDataWin::Paint( const Rectangle& rRect )
306 : {
307 0 : if ( !nUpdateLock && GetUpdateMode() )
308 : {
309 0 : if ( bInPaint )
310 : {
311 0 : aInvalidRegion.push_back( new Rectangle( rRect ) );
312 0 : return;
313 : }
314 0 : bInPaint = true;
315 0 : ( (BrowseBox*) GetParent() )->PaintData( *this, rRect );
316 0 : bInPaint = false;
317 0 : DoOutstandingInvalidations();
318 : }
319 : else
320 0 : aInvalidRegion.push_back( new Rectangle( rRect ) );
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() == COMMAND_WHEEL) ||
402 0 : (rEvt.GetCommand() == COMMAND_STARTAUTOSCROLL) ||
403 0 : (rEvt.GetCommand() == COMMAND_AUTOSCROLL) ) &&
404 0 : ( HandleScrollCommand( rEvt, &pBox->aHScroll, 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, MOUSE_SELECT, MOUSE_LEFT );
410 0 : if ( COMMAND_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 0 : CommandEvent aEvt( aEventPos, rEvt.GetCommand(),
425 0 : rEvt.IsMouseEvent(), rEvt.GetData() );
426 0 : bInCommand = true;
427 0 : GetParent()->Command( aEvt );
428 0 : if( bInDtor )
429 0 : return;
430 0 : bInCommand = false;
431 :
432 0 : if ( COMMAND_STARTDRAG == rEvt.GetCommand() )
433 0 : MouseButtonUp( aMouseEvt );
434 :
435 0 : Control::Command( rEvt );
436 : }
437 :
438 :
439 :
440 0 : sal_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 sal_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 = POINTER_ARROW;
486 0 : if ( ImplRowDividerHitTest( aBrowserEvent ) )
487 0 : ePointerStyle = POINTER_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_INLINE_START(BrowserDataWin, RepeatedMouseMove)
508 : {
509 0 : GetParent()->MouseMove( BrowserMouseEvent( this, aRepeatEvt ) );
510 0 : return 0;
511 : }
512 0 : IMPL_LINK_NOARG_INLINE_END(BrowserDataWin, RepeatedMouseMove)
513 :
514 :
515 :
516 0 : void BrowserDataWin::MouseButtonUp( const MouseEvent& rEvt )
517 : {
518 : // avoid pseudo MouseMoves
519 0 : Point aNewPos = OutputToScreenPixel( rEvt.GetPosPixel() );
520 0 : aLastMousePos = aNewPos;
521 :
522 : // simulate a move to the current position
523 0 : MouseMove( rEvt );
524 :
525 : // actual button up handling
526 0 : ReleaseMouse();
527 0 : if ( aMouseTimer.IsActive() )
528 0 : aMouseTimer.Stop();
529 0 : GetParent()->MouseButtonUp( BrowserMouseEvent( this, rEvt ) );
530 0 : }
531 :
532 :
533 :
534 0 : void BrowserDataWin::StartRowDividerDrag( const Point& _rStartPos )
535 : {
536 0 : long nDataRowHeight = GetParent()->GetDataRowHeight();
537 : // the exact separation pos of the two rows
538 0 : long nDragRowDividerCurrentPos = _rStartPos.Y();
539 0 : if ( ( nDragRowDividerCurrentPos % nDataRowHeight ) > nDataRowHeight / 2 )
540 0 : nDragRowDividerCurrentPos += nDataRowHeight;
541 0 : nDragRowDividerCurrentPos /= nDataRowHeight;
542 0 : nDragRowDividerCurrentPos *= nDataRowHeight;
543 :
544 0 : m_nDragRowDividerOffset = nDragRowDividerCurrentPos - _rStartPos.Y();
545 :
546 0 : m_nDragRowDividerLimit = nDragRowDividerCurrentPos - nDataRowHeight;
547 :
548 0 : GetParent()->bRowDividerDrag = true;
549 0 : GetParent()->ImplStartTracking();
550 :
551 0 : Rectangle aDragSplitRect( 0, m_nDragRowDividerLimit, GetOutputSizePixel().Width(), nDragRowDividerCurrentPos );
552 0 : ShowTracking( aDragSplitRect, SHOWTRACK_SMALL );
553 :
554 0 : StartTracking();
555 0 : }
556 :
557 :
558 :
559 0 : void BrowserDataWin::Tracking( const TrackingEvent& rTEvt )
560 : {
561 0 : if ( !GetParent()->bRowDividerDrag )
562 0 : return;
563 :
564 0 : Point aMousePos = rTEvt.GetMouseEvent().GetPosPixel();
565 : // stop resizing at our bottom line
566 0 : if ( aMousePos.Y() > GetOutputSizePixel().Height() )
567 0 : aMousePos.Y() = GetOutputSizePixel().Height();
568 :
569 0 : if ( rTEvt.IsTrackingEnded() )
570 : {
571 0 : HideTracking();
572 0 : GetParent()->bRowDividerDrag = false;
573 0 : GetParent()->ImplEndTracking();
574 :
575 0 : if ( !rTEvt.IsTrackingCanceled() )
576 : {
577 0 : long nNewRowHeight = aMousePos.Y() + m_nDragRowDividerOffset - m_nDragRowDividerLimit;
578 :
579 : // care for minimum row height
580 0 : if ( nNewRowHeight < GetParent()->QueryMinimumRowHeight() )
581 0 : nNewRowHeight = GetParent()->QueryMinimumRowHeight();
582 :
583 0 : GetParent()->SetDataRowHeight( nNewRowHeight );
584 0 : GetParent()->RowHeightChanged();
585 : }
586 : }
587 : else
588 : {
589 0 : GetParent()->ImplTracking();
590 :
591 0 : long nDragRowDividerCurrentPos = aMousePos.Y() + m_nDragRowDividerOffset;
592 :
593 : // care for minimum row height
594 0 : if ( nDragRowDividerCurrentPos < m_nDragRowDividerLimit + GetParent()->QueryMinimumRowHeight() )
595 0 : nDragRowDividerCurrentPos = m_nDragRowDividerLimit + GetParent()->QueryMinimumRowHeight();
596 :
597 0 : Rectangle aDragSplitRect( 0, m_nDragRowDividerLimit, GetOutputSizePixel().Width(), nDragRowDividerCurrentPos );
598 0 : ShowTracking( aDragSplitRect, SHOWTRACK_SMALL );
599 : }
600 : }
601 :
602 :
603 :
604 0 : void BrowserDataWin::KeyInput( const KeyEvent& rEvt )
605 : {
606 : // pass to parent window
607 0 : if ( !GetParent()->ProcessKey( rEvt ) )
608 0 : Control::KeyInput( rEvt );
609 0 : }
610 :
611 :
612 :
613 0 : void BrowserDataWin::RequestHelp( const HelpEvent& rHEvt )
614 : {
615 0 : pEventWin = this;
616 0 : GetParent()->RequestHelp( rHEvt );
617 0 : pEventWin = GetParent();
618 0 : }
619 :
620 :
621 :
622 0 : BrowseEvent::BrowseEvent( Window* pWindow,
623 : long nAbsRow, sal_uInt16 nColumn, sal_uInt16 nColumnId,
624 : const Rectangle& rRect ):
625 : pWin(pWindow),
626 : nRow(nAbsRow),
627 : aRect(rRect),
628 : nCol(nColumn),
629 0 : nColId(nColumnId)
630 : {
631 0 : }
632 :
633 :
634 0 : BrowserMouseEvent::BrowserMouseEvent( BrowserDataWin *pWindow,
635 : const MouseEvent& rEvt ):
636 : MouseEvent(rEvt),
637 0 : BrowseEvent( pWindow->CreateBrowseEvent( rEvt.GetPosPixel() ) )
638 : {
639 0 : }
640 :
641 :
642 :
643 0 : BrowserMouseEvent::BrowserMouseEvent( Window *pWindow, const MouseEvent& rEvt,
644 : long nAbsRow, sal_uInt16 nColumn, sal_uInt16 nColumnId,
645 : const Rectangle& rRect ):
646 : MouseEvent(rEvt),
647 0 : BrowseEvent( pWindow, nAbsRow, nColumn, nColumnId, rRect )
648 : {
649 0 : }
650 :
651 :
652 :
653 0 : BrowserAcceptDropEvent::BrowserAcceptDropEvent( BrowserDataWin *pWindow, const AcceptDropEvent& rEvt )
654 : :AcceptDropEvent(rEvt)
655 0 : ,BrowseEvent( pWindow->CreateBrowseEvent( rEvt.maPosPixel ) )
656 : {
657 0 : }
658 :
659 :
660 :
661 0 : BrowserExecuteDropEvent::BrowserExecuteDropEvent( BrowserDataWin *pWindow, const ExecuteDropEvent& rEvt )
662 : :ExecuteDropEvent(rEvt)
663 0 : ,BrowseEvent( pWindow->CreateBrowseEvent( rEvt.maPosPixel ) )
664 : {
665 0 : }
666 :
667 :
668 :
669 :
670 :
671 0 : void BrowserDataWin::SetUpdateMode( sal_Bool bMode )
672 : {
673 : DBG_ASSERT( !bUpdateMode || aInvalidRegion.empty(), "invalid region not empty" );
674 0 : if ( (bool) bMode == bUpdateMode )
675 0 : return;
676 :
677 0 : bUpdateMode = bMode;
678 0 : if ( bMode )
679 0 : DoOutstandingInvalidations();
680 : }
681 :
682 :
683 0 : void BrowserDataWin::DoOutstandingInvalidations()
684 : {
685 0 : for ( size_t i = 0, n = aInvalidRegion.size(); i < n; ++i ) {
686 0 : Control::Invalidate( *aInvalidRegion[ i ] );
687 0 : delete aInvalidRegion[ i ];
688 : }
689 0 : aInvalidRegion.clear();
690 0 : }
691 :
692 :
693 :
694 0 : void BrowserDataWin::Invalidate( sal_uInt16 nFlags )
695 : {
696 0 : if ( !GetUpdateMode() )
697 : {
698 0 : for ( size_t i = 0, n = aInvalidRegion.size(); i < n; ++i )
699 0 : delete aInvalidRegion[ i ];
700 0 : aInvalidRegion.clear();
701 0 : aInvalidRegion.push_back( new Rectangle( Point( 0, 0 ), GetOutputSizePixel() ) );
702 : }
703 : else
704 0 : Window::Invalidate( nFlags );
705 0 : }
706 :
707 :
708 :
709 0 : void BrowserDataWin::Invalidate( const Rectangle& rRect, sal_uInt16 nFlags )
710 : {
711 0 : if ( !GetUpdateMode() )
712 0 : aInvalidRegion.push_back( new Rectangle( rRect ) );
713 : else
714 0 : Window::Invalidate( rRect, nFlags );
715 0 : }
716 :
717 :
718 :
719 0 : void BrowserScrollBar::Tracking( const TrackingEvent& rTEvt )
720 : {
721 0 : sal_uLong nPos = GetThumbPos();
722 0 : if ( nPos != _nLastPos )
723 : {
724 0 : OUString aTip( OUString::number(nPos) );
725 0 : aTip += "/";
726 0 : if ( !_pDataWin->GetRealRowCount().isEmpty() )
727 0 : aTip += _pDataWin->GetRealRowCount();
728 : else
729 0 : aTip += OUString::number(GetRangeMax());
730 :
731 0 : Rectangle aRect( GetPointerPosPixel(), Size( GetTextHeight(), GetTextWidth( aTip ) ) );
732 0 : if ( _nTip )
733 0 : Help::UpdateTip( _nTip, this, aRect, aTip );
734 : else
735 0 : _nTip = Help::ShowTip( this, aRect, aTip );
736 0 : _nLastPos = nPos;
737 : }
738 :
739 0 : ScrollBar::Tracking( rTEvt );
740 0 : }
741 :
742 :
743 :
744 0 : void BrowserScrollBar::EndScroll()
745 : {
746 0 : if ( _nTip )
747 0 : Help::HideTip( _nTip );
748 0 : _nTip = 0;
749 0 : ScrollBar::EndScroll();
750 0 : }
751 :
752 :
753 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|