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