LCOV - code coverage report
Current view: top level - svtools/source/brwbox - brwbox1.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 1059 0.0 %
Date: 2014-04-14 Functions: 0 73 0.0 %
Legend: Lines: hit not hit

          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             : #include <svtools/brwbox.hxx>
      21             : #include <svtools/brwhead.hxx>
      22             : #include "datwin.hxx"
      23             : #include <tools/debug.hxx>
      24             : #include <tools/stream.hxx>
      25             : 
      26             : #include <functional>
      27             : #include <algorithm>
      28             : #include <com/sun/star/accessibility/AccessibleTableModelChange.hpp>
      29             : #include <com/sun/star/accessibility/AccessibleTableModelChangeType.hpp>
      30             : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
      31             : #include <com/sun/star/accessibility/XAccessible.hpp>
      32             : #include <tools/multisel.hxx>
      33             : #include "brwimpl.hxx"
      34             : 
      35             : 
      36             : extern const char* BrowseBoxCheckInvariants( const void* pVoid );
      37             : 
      38             : #define SCROLL_FLAGS (SCROLL_CLIP | SCROLL_NOCHILDREN)
      39             : #define getDataWindow() ((BrowserDataWin*)pDataWin)
      40             : 
      41             : using namespace com::sun::star::accessibility::AccessibleEventId;
      42             : using namespace com::sun::star::accessibility::AccessibleTableModelChangeType;
      43             : using com::sun::star::accessibility::AccessibleTableModelChange;
      44             : using com::sun::star::lang::XComponent;
      45             : using namespace ::com::sun::star::uno;
      46             : using namespace svt;
      47             : 
      48             : namespace
      49             : {
      50           0 :     void disposeAndClearHeaderCell(::svt::BrowseBoxImpl::THeaderCellMap& _rHeaderCell)
      51             :     {
      52             :         ::std::for_each(
      53             :                         _rHeaderCell.begin(),
      54             :                         _rHeaderCell.end(),
      55             :                         ::svt::BrowseBoxImpl::THeaderCellMapFunctorDispose()
      56           0 :                             );
      57           0 :         _rHeaderCell.clear();
      58           0 :     }
      59             : }
      60             : 
      61             : 
      62             : 
      63           0 : void BrowseBox::ConstructImpl( BrowserMode nMode )
      64             : {
      65             :     OSL_TRACE( "BrowseBox: %p->ConstructImpl", this );
      66           0 :     bMultiSelection = false;
      67           0 :     pColSel = 0;
      68           0 :     pDataWin = 0;
      69           0 :     pVScroll = 0;
      70             : 
      71           0 :     pDataWin = new BrowserDataWin( this );
      72           0 :     pCols = new BrowserColumns;
      73           0 :     m_pImpl.reset( new ::svt::BrowseBoxImpl() );
      74             : 
      75           0 :     aGridLineColor = Color( COL_LIGHTGRAY );
      76           0 :     InitSettings_Impl( this );
      77           0 :     InitSettings_Impl( pDataWin );
      78             : 
      79           0 :     bBootstrapped = false;
      80           0 :     nDataRowHeight = 0;
      81           0 :     nTitleLines = 1;
      82           0 :     nFirstCol = 0;
      83           0 :     nTopRow = 0;
      84           0 :     nCurRow = BROWSER_ENDOFSELECTION;
      85           0 :     nCurColId = 0;
      86           0 :     bResizing = false;
      87           0 :     bSelect = false;
      88           0 :     bSelecting = false;
      89           0 :     bScrolling = false;
      90           0 :     bSelectionIsVisible = false;
      91           0 :     bNotToggleSel = false;
      92           0 :     bRowDividerDrag = false;
      93           0 :     bHit = false;
      94           0 :     mbInteractiveRowHeight = false;
      95           0 :     bHideSelect = false;
      96           0 :     bHideCursor = TRISTATE_FALSE;
      97           0 :     nRowCount = 0;
      98           0 :     m_bFocusOnlyCursor = true;
      99           0 :     m_aCursorColor = COL_TRANSPARENT;
     100           0 :     m_nCurrentMode = 0;
     101           0 :     nControlAreaWidth = USHRT_MAX;
     102           0 :     uRow.nSel = BROWSER_ENDOFSELECTION;
     103             : 
     104           0 :     aHScroll.SetLineSize(1);
     105           0 :     aHScroll.SetScrollHdl( LINK( this, BrowseBox, ScrollHdl ) );
     106           0 :     aHScroll.SetEndScrollHdl( LINK( this, BrowseBox, EndScrollHdl ) );
     107           0 :     pDataWin->Show();
     108             : 
     109           0 :     SetMode( nMode );
     110           0 :     bSelectionIsVisible = bKeepHighlight;
     111           0 :     bHasFocus = HasChildPathFocus();
     112             :     getDataWindow()->nCursorHidden =
     113           0 :                 ( bHasFocus ? 0 : 1 ) + ( GetUpdateMode() ? 0 : 1 );
     114           0 : }
     115             : 
     116             : 
     117             : 
     118           0 : BrowseBox::BrowseBox( Window* pParent, WinBits nBits, BrowserMode nMode )
     119             :     :Control( pParent, nBits | WB_3DLOOK )
     120             :     ,DragSourceHelper( this )
     121             :     ,DropTargetHelper( this )
     122           0 :     ,aHScroll( this, WinBits( WB_HSCROLL ) )
     123             : {
     124           0 :     ConstructImpl( nMode );
     125           0 : }
     126             : 
     127             : 
     128             : 
     129           0 : BrowseBox::BrowseBox( Window* pParent, const ResId& rId, BrowserMode nMode )
     130             :     :Control( pParent, rId )
     131             :     ,DragSourceHelper( this )
     132             :     ,DropTargetHelper( this )
     133           0 :     ,aHScroll( this, WinBits(WB_HSCROLL) )
     134             : {
     135           0 :     ConstructImpl(nMode);
     136           0 : }
     137             : 
     138             : 
     139           0 : BrowseBox::~BrowseBox()
     140             : {
     141             :     OSL_TRACE( "BrowseBox: %p~", this );
     142             : 
     143           0 :     if ( m_pImpl->m_pAccessible )
     144             :     {
     145           0 :         disposeAndClearHeaderCell(m_pImpl->m_aColHeaderCellMap);
     146           0 :         disposeAndClearHeaderCell(m_pImpl->m_aRowHeaderCellMap);
     147           0 :         m_pImpl->m_pAccessible->dispose();
     148             :     }
     149             : 
     150           0 :     Hide();
     151           0 :     delete getDataWindow()->pHeaderBar;
     152           0 :     delete getDataWindow()->pCornerWin;
     153           0 :     delete pDataWin;
     154           0 :     delete pVScroll;
     155             : 
     156             :     // free columns-space
     157           0 :     for ( size_t i = 0, n = pCols->size(); i < n; ++i )
     158           0 :         delete (*pCols)[ i ];
     159           0 :     pCols->clear();
     160           0 :     delete pCols;
     161           0 :     delete pColSel;
     162           0 :     if ( bMultiSelection )
     163           0 :         delete uRow.pSel;
     164           0 : }
     165             : 
     166             : 
     167             : 
     168           0 : short BrowseBox::GetCursorHideCount() const
     169             : {
     170           0 :     return getDataWindow()->nCursorHidden;
     171             : }
     172             : 
     173             : 
     174             : 
     175           0 : void BrowseBox::DoShowCursor( const char * )
     176             : {
     177           0 :     short nHiddenCount = --getDataWindow()->nCursorHidden;
     178           0 :     if (PaintCursorIfHiddenOnce())
     179             :     {
     180           0 :         if (1 == nHiddenCount)
     181           0 :             DrawCursor();
     182             :     }
     183             :     else
     184             :     {
     185           0 :         if (0 == nHiddenCount)
     186           0 :             DrawCursor();
     187             :     }
     188           0 : }
     189             : 
     190             : 
     191             : 
     192           0 : void BrowseBox::DoHideCursor( const char * )
     193             : {
     194           0 :     short nHiddenCount = ++getDataWindow()->nCursorHidden;
     195           0 :     if (PaintCursorIfHiddenOnce())
     196             :     {
     197           0 :         if (2 == nHiddenCount)
     198           0 :             DrawCursor();
     199             :     }
     200             :     else
     201             :     {
     202           0 :         if (1 == nHiddenCount)
     203           0 :             DrawCursor();
     204             :     }
     205           0 : }
     206             : 
     207             : 
     208             : 
     209           0 : void BrowseBox::SetRealRowCount( const OUString &rRealRowCount )
     210             : {
     211           0 :     getDataWindow()->aRealRowCount = rRealRowCount;
     212           0 : }
     213             : 
     214             : 
     215             : 
     216           0 : void BrowseBox::SetFont( const Font& rNewFont )
     217             : {
     218           0 :     pDataWin->SetFont( rNewFont );
     219           0 :     ImpGetDataRowHeight();
     220           0 : }
     221             : 
     222             : 
     223             : 
     224           0 : sal_uLong BrowseBox::GetDefaultColumnWidth( const OUString& _rText ) const
     225             : {
     226           0 :     return GetDataWindow().GetTextWidth( _rText ) + GetDataWindow().GetTextWidth(OUString('0')) * 4;
     227             : }
     228             : 
     229             : 
     230             : 
     231           0 : void BrowseBox::InsertHandleColumn( sal_uLong nWidth )
     232             : {
     233             : 
     234             : #if OSL_DEBUG_LEVEL > 0
     235             :     OSL_ENSURE( ColCount() == 0 || (*pCols)[0]->GetId() != HandleColumnId , "BrowseBox::InsertHandleColumn: there is already a handle column" );
     236             :     {
     237             :         BrowserColumns::iterator iCol = pCols->begin();
     238             :         const BrowserColumns::iterator colsEnd = pCols->end();
     239             :         if ( iCol < colsEnd )
     240             :             for (++iCol; iCol < colsEnd; ++iCol)
     241             :                 OSL_ENSURE( (*iCol)->GetId() != HandleColumnId, "BrowseBox::InsertHandleColumn: there is a non-Handle column with handle ID" );
     242             :     }
     243             : #endif
     244             : 
     245           0 :     pCols->insert( pCols->begin(), new BrowserColumn( 0, Image(), OUString(), nWidth, GetZoom() ) );
     246           0 :     FreezeColumn( 0 );
     247             : 
     248             :     // adjust headerbar
     249           0 :     if ( getDataWindow()->pHeaderBar )
     250             :     {
     251             :         getDataWindow()->pHeaderBar->SetPosSizePixel(
     252             :                     Point(nWidth, 0),
     253           0 :                     Size( GetOutputSizePixel().Width() - nWidth, GetTitleHeight() )
     254           0 :                     );
     255             :     }
     256             : 
     257           0 :     ColumnInserted( 0 );
     258           0 : }
     259             : 
     260             : 
     261             : 
     262           0 : void BrowseBox::InsertDataColumn( sal_uInt16 nItemId, const OUString& rText,
     263             :         long nWidth, HeaderBarItemBits nBits, sal_uInt16 nPos )
     264             : {
     265             : 
     266             :     OSL_ENSURE( nItemId != HandleColumnId, "BrowseBox::InsertDataColumn: nItemId is HandleColumnId" );
     267             :     OSL_ENSURE( nItemId != BROWSER_INVALIDID, "BrowseBox::InsertDataColumn: nItemId is reserved value BROWSER_INVALIDID" );
     268             : 
     269             : #if OSL_DEBUG_LEVEL > 0
     270             :     {
     271             :         const BrowserColumns::iterator colsEnd = pCols->end();
     272             :         for (BrowserColumns::iterator iCol = pCols->begin(); iCol < colsEnd; ++iCol)
     273             :             OSL_ENSURE( (*iCol)->GetId() != nItemId, "BrowseBox::InsertDataColumn: duplicate column Id" );
     274             :     }
     275             : #endif
     276             : 
     277           0 :     if ( nPos < pCols->size() )
     278             :     {
     279           0 :         BrowserColumns::iterator it = pCols->begin();
     280           0 :         ::std::advance( it, nPos );
     281           0 :         pCols->insert( it, new BrowserColumn( nItemId, Image(), rText, nWidth, GetZoom() ) );
     282             :     }
     283             :     else
     284             :     {
     285           0 :         pCols->push_back( new BrowserColumn( nItemId, Image(), rText, nWidth, GetZoom() ) );
     286             :     }
     287           0 :     if ( nCurColId == 0 )
     288           0 :         nCurColId = nItemId;
     289             : 
     290           0 :     if ( getDataWindow()->pHeaderBar )
     291             :     {
     292             :         // Handle column not in the header bar
     293           0 :         sal_uInt16 nHeaderPos = nPos;
     294           0 :         if (nHeaderPos != HEADERBAR_APPEND && GetColumnId(0) == HandleColumnId )
     295           0 :             nHeaderPos--;
     296             :         getDataWindow()->pHeaderBar->InsertItem(
     297           0 :                 nItemId, rText, nWidth, nBits, nHeaderPos );
     298             :     }
     299           0 :     ColumnInserted( nPos );
     300           0 : }
     301             : 
     302             : 
     303           0 : sal_uInt16 BrowseBox::ToggleSelectedColumn()
     304             : {
     305           0 :     sal_uInt16 nSelectedColId = BROWSER_INVALIDID;
     306           0 :     if ( pColSel && pColSel->GetSelectCount() )
     307             :     {
     308           0 :         DoHideCursor( "ToggleSelectedColumn" );
     309           0 :         ToggleSelection();
     310           0 :         nSelectedColId = (*pCols)[ pColSel->FirstSelected() ]->GetId();
     311           0 :         pColSel->SelectAll(false);
     312             :     }
     313           0 :     return nSelectedColId;
     314             : }
     315             : 
     316           0 : void BrowseBox::SetToggledSelectedColumn(sal_uInt16 _nSelectedColumnId)
     317             : {
     318           0 :     if ( pColSel && _nSelectedColumnId != BROWSER_INVALIDID )
     319             :     {
     320           0 :         pColSel->Select( GetColumnPos( _nSelectedColumnId ) );
     321           0 :         ToggleSelection();
     322             :         OSL_TRACE( "BrowseBox: %p->SetToggledSelectedColumn", this );
     323           0 :         DoShowCursor( "SetToggledSelectedColumn" );
     324             :     }
     325           0 : }
     326             : 
     327           0 : void BrowseBox::FreezeColumn( sal_uInt16 nItemId, bool bFreeze )
     328             : {
     329             : 
     330             :     // never unfreeze the handle-column
     331           0 :     if ( nItemId == HandleColumnId && !bFreeze )
     332           0 :         return;
     333             : 
     334             :     // get the position in the current array
     335           0 :     size_t nItemPos = GetColumnPos( nItemId );
     336           0 :     if ( nItemPos >= pCols->size() )
     337             :         // not available!
     338           0 :         return;
     339             : 
     340             :     // doesn't the state change?
     341           0 :     if ( (*pCols)[ nItemPos ]->IsFrozen() == (bFreeze ? 1 : 0) )
     342           0 :         return;
     343             : 
     344             :     // remark the column selection
     345           0 :     sal_uInt16 nSelectedColId = ToggleSelectedColumn();
     346             : 
     347             :     // freeze or unfreeze?
     348           0 :     if ( bFreeze )
     349             :     {
     350             :         // to be moved?
     351           0 :         if ( nItemPos != 0 && !(*pCols)[ nItemPos-1 ]->IsFrozen() )
     352             :         {
     353             :             // move to the right of the last frozen column
     354           0 :             sal_uInt16 nFirstScrollable = FrozenColCount();
     355           0 :             BrowserColumn *pColumn = (*pCols)[ nItemPos ];
     356           0 :             BrowserColumns::iterator it = pCols->begin();
     357           0 :             ::std::advance( it, nItemPos );
     358           0 :             pCols->erase( it );
     359           0 :             nItemPos = nFirstScrollable;
     360           0 :             it = pCols->begin();
     361           0 :             ::std::advance( it, nItemPos );
     362           0 :             pCols->insert( it, pColumn );
     363             :         }
     364             : 
     365             :         // adjust the number of the first scrollable and visible column
     366           0 :         if ( nFirstCol <= nItemPos )
     367           0 :             nFirstCol = nItemPos + 1;
     368             :     }
     369             :     else
     370             :     {
     371             :         // to be moved?
     372           0 :         if ( (sal_Int32)nItemPos != FrozenColCount()-1 )
     373             :         {
     374             :             // move to the leftmost scrollable column
     375           0 :             sal_uInt16 nFirstScrollable = FrozenColCount();
     376           0 :             BrowserColumn *pColumn = (*pCols)[ nItemPos ];
     377           0 :             BrowserColumns::iterator it = pCols->begin();
     378           0 :             ::std::advance( it, nItemPos );
     379           0 :             pCols->erase( it );
     380           0 :             nItemPos = nFirstScrollable;
     381           0 :             it = pCols->begin();
     382           0 :             ::std::advance( it, nItemPos );
     383           0 :             pCols->insert( it, pColumn );
     384             :         }
     385             : 
     386             :         // adjust the number of the first scrollable and visible column
     387           0 :         nFirstCol = nItemPos;
     388             :     }
     389             : 
     390             :     // toggle the freeze-state of the column
     391           0 :     (*pCols)[ nItemPos ]->Freeze( bFreeze );
     392             : 
     393             :     // align the scrollbar-range
     394           0 :     UpdateScrollbars();
     395             : 
     396             :     // repaint
     397           0 :     Control::Invalidate();
     398           0 :     getDataWindow()->Invalidate();
     399             : 
     400             :     // remember the column selection
     401           0 :     SetToggledSelectedColumn(nSelectedColId);
     402             : }
     403             : 
     404             : 
     405             : 
     406           0 : void BrowseBox::SetColumnPos( sal_uInt16 nColumnId, sal_uInt16 nPos )
     407             : {
     408             :     // never set pos of the handle column
     409           0 :     if ( nColumnId == HandleColumnId )
     410           0 :         return;
     411             : 
     412             :     // get the position in the current array
     413           0 :     sal_uInt16 nOldPos = GetColumnPos( nColumnId );
     414           0 :     if ( nOldPos >= pCols->size() )
     415             :         // not available!
     416           0 :         return;
     417             : 
     418             :     // does the state change?
     419           0 :     if (nOldPos != nPos)
     420             :     {
     421             :         // remark the column selection
     422           0 :         sal_uInt16 nSelectedColId = ToggleSelectedColumn();
     423             : 
     424             :         // determine old column area
     425           0 :         Size aDataWinSize( pDataWin->GetSizePixel() );
     426           0 :         if ( getDataWindow()->pHeaderBar )
     427           0 :             aDataWinSize.Height() += getDataWindow()->pHeaderBar->GetSizePixel().Height();
     428             : 
     429           0 :         Rectangle aFromRect( GetFieldRect( nColumnId) );
     430           0 :         aFromRect.Right() += 2*MIN_COLUMNWIDTH;
     431             : 
     432           0 :         sal_uInt16 nNextPos = nOldPos + 1;
     433           0 :         if ( nOldPos > nPos )
     434           0 :             nNextPos = nOldPos - 1;
     435             : 
     436           0 :         BrowserColumn *pNextCol = (*pCols)[ nNextPos ];
     437           0 :         Rectangle aNextRect(GetFieldRect( pNextCol->GetId() ));
     438             : 
     439             :         // move column internally
     440             :         {
     441           0 :             BrowserColumns::iterator it = pCols->begin();
     442           0 :             ::std::advance( it, nOldPos );
     443           0 :             BrowserColumn* pTemp = *it;
     444           0 :             pCols->erase( it );
     445           0 :             it = pCols->begin();
     446           0 :             ::std::advance( it, nPos );
     447           0 :             pCols->insert( it, pTemp );
     448             :         }
     449             : 
     450             :         // determine new column area
     451           0 :         Rectangle aToRect( GetFieldRect( nColumnId ) );
     452           0 :         aToRect.Right() += 2*MIN_COLUMNWIDTH;
     453             : 
     454             :         // do scroll, let redraw
     455           0 :         if( pDataWin->GetBackground().IsScrollable() )
     456             :         {
     457           0 :             long nScroll = -aFromRect.GetWidth();
     458           0 :             Rectangle aScrollArea;
     459           0 :             if ( nOldPos > nPos )
     460             :             {
     461           0 :                 long nFrozenWidth = GetFrozenWidth();
     462           0 :                 if ( aToRect.Left() < nFrozenWidth )
     463           0 :                     aToRect.Left() = nFrozenWidth;
     464           0 :                 aScrollArea = Rectangle(Point(aToRect.Left(),0),
     465           0 :                                         Point(aNextRect.Right(),aDataWinSize.Height()));
     466           0 :                 nScroll *= -1; // reverse direction
     467             :             }
     468             :             else
     469           0 :                 aScrollArea = Rectangle(Point(aNextRect.Left(),0),
     470           0 :                                         Point(aToRect.Right(),aDataWinSize.Height()));
     471             : 
     472           0 :             pDataWin->Scroll( nScroll, 0, aScrollArea );
     473           0 :             aToRect.Top() = 0;
     474           0 :             aToRect.Bottom() = aScrollArea.Bottom();
     475           0 :             Invalidate( aToRect );
     476             :         }
     477             :         else
     478           0 :             pDataWin->Window::Invalidate( INVALIDATE_NOCHILDREN );
     479             : 
     480             :         // adjust header bar positions
     481           0 :         if ( getDataWindow()->pHeaderBar )
     482             :         {
     483           0 :             sal_uInt16 nNewPos = nPos;
     484           0 :             if ( GetColumnId(0) == HandleColumnId )
     485           0 :                 --nNewPos;
     486           0 :             getDataWindow()->pHeaderBar->MoveItem(nColumnId,nNewPos);
     487             :         }
     488             :         // remember the column selection
     489           0 :         SetToggledSelectedColumn(nSelectedColId);
     490             : 
     491           0 :         if ( isAccessibleAlive() )
     492             :         {
     493             :             commitTableEvent(
     494             :                 TABLE_MODEL_CHANGED,
     495             :                 makeAny( AccessibleTableModelChange(
     496             :                             DELETE,
     497             :                             0,
     498           0 :                             GetRowCount(),
     499             :                             nOldPos,
     500             :                             nOldPos
     501             :                         )
     502             :                 ),
     503             :                 Any()
     504           0 :             );
     505             : 
     506             :             commitTableEvent(
     507             :                 TABLE_MODEL_CHANGED,
     508             :                 makeAny( AccessibleTableModelChange(
     509             :                             INSERT,
     510             :                             0,
     511           0 :                             GetRowCount(),
     512             :                             nPos,
     513             :                             nPos
     514             :                         )
     515             :                 ),
     516             :                 Any()
     517           0 :             );
     518             :         }
     519             :     }
     520             : 
     521             : }
     522             : 
     523             : 
     524             : 
     525           0 : void BrowseBox::SetColumnTitle( sal_uInt16 nItemId, const OUString& rTitle )
     526             : {
     527             : 
     528             :     // never set title of the handle-column
     529           0 :     if ( nItemId == HandleColumnId )
     530           0 :         return;
     531             : 
     532             :     // get the position in the current array
     533           0 :     sal_uInt16 nItemPos = GetColumnPos( nItemId );
     534           0 :     if ( nItemPos >= pCols->size() )
     535             :         // not available!
     536           0 :         return;
     537             : 
     538             :     // does the state change?
     539           0 :     BrowserColumn *pCol = (*pCols)[ nItemPos ];
     540           0 :     if ( pCol->Title() != rTitle )
     541             :     {
     542           0 :         OUString sNew(rTitle);
     543           0 :         OUString sOld(pCol->Title());
     544             : 
     545           0 :         pCol->Title() = rTitle;
     546             : 
     547             :         // adjust headerbar column
     548           0 :         if ( getDataWindow()->pHeaderBar )
     549           0 :             getDataWindow()->pHeaderBar->SetItemText( nItemId, rTitle );
     550             :         else
     551             :         {
     552             :             // redraw visible columns
     553           0 :             if ( GetUpdateMode() && ( pCol->IsFrozen() || nItemPos > nFirstCol ) )
     554             :                 Invalidate( Rectangle( Point(0,0),
     555           0 :                     Size( GetOutputSizePixel().Width(), GetTitleHeight() ) ) );
     556             :         }
     557             : 
     558           0 :         if ( isAccessibleAlive() )
     559             :         {
     560             :             commitTableEvent(   TABLE_COLUMN_DESCRIPTION_CHANGED,
     561             :                 makeAny( sNew ),
     562             :                 makeAny( sOld )
     563           0 :             );
     564           0 :         }
     565             :     }
     566             : }
     567             : 
     568             : 
     569             : 
     570           0 : void BrowseBox::SetColumnWidth( sal_uInt16 nItemId, sal_uLong nWidth )
     571             : {
     572             : 
     573             :     // get the position in the current array
     574           0 :     size_t nItemPos = GetColumnPos( nItemId );
     575           0 :     if ( nItemPos >= pCols->size() )
     576           0 :         return;
     577             : 
     578             :     // does the state change?
     579           0 :     nWidth = QueryColumnResize( nItemId, nWidth );
     580           0 :     if ( nWidth >= LONG_MAX || (*pCols)[ nItemPos ]->Width() != nWidth )
     581             :     {
     582           0 :         long nOldWidth = (*pCols)[ nItemPos ]->Width();
     583             : 
     584             :         // adjust last column, if necessary
     585           0 :         if ( IsVisible() && nItemPos == pCols->size() - 1 )
     586             :         {
     587           0 :             long nMaxWidth = pDataWin->GetSizePixel().Width();
     588             :             nMaxWidth -= getDataWindow()->bAutoSizeLastCol
     589           0 :                     ? GetFieldRect(nItemId).Left()
     590           0 :                     : GetFrozenWidth();
     591           0 :             if ( ( (BrowserDataWin*)pDataWin )->bAutoSizeLastCol || nWidth > (sal_uLong)nMaxWidth )
     592             :             {
     593           0 :                 nWidth = nMaxWidth > 16 ? nMaxWidth : nOldWidth;
     594           0 :                 nWidth = QueryColumnResize( nItemId, nWidth );
     595             :             }
     596             :         }
     597             : 
     598             :         // OV
     599             :         // In AutoSizeLastColumn(), we call SetColumnWidth with nWidth==0xffff.
     600             :         // Thus, check here, if the width has actually changed.
     601           0 :         if( (sal_uLong)nOldWidth == nWidth )
     602           0 :             return;
     603             : 
     604             :         // do we want to display the change immediately?
     605           0 :         bool bUpdate = GetUpdateMode() &&
     606           0 :                        ( (*pCols)[ nItemPos ]->IsFrozen() || nItemPos >= nFirstCol );
     607             : 
     608           0 :         if ( bUpdate )
     609             :         {
     610             :             // Selection hidden
     611           0 :             DoHideCursor( "SetColumnWidth" );
     612           0 :             ToggleSelection();
     613             :             //!getDataWindow()->Update();
     614             :             //!Control::Update();
     615             :         }
     616             : 
     617             :         // set width
     618           0 :         (*pCols)[ nItemPos ]->SetWidth(nWidth, GetZoom());
     619             : 
     620             :         // scroll and invalidate
     621           0 :         if ( bUpdate )
     622             :         {
     623             :             // get X-Pos of the column changed
     624           0 :             long nX = 0;
     625           0 :             for ( sal_uInt16 nCol = 0; nCol < nItemPos; ++nCol )
     626             :             {
     627           0 :                 BrowserColumn *pCol = (*pCols)[ nCol ];
     628           0 :                 if ( pCol->IsFrozen() || nCol >= nFirstCol )
     629           0 :                     nX += pCol->Width();
     630             :             }
     631             : 
     632             :             // actually scroll+invalidate
     633           0 :             pDataWin->SetClipRegion();
     634           0 :             bool bSelVis = bSelectionIsVisible;
     635           0 :             bSelectionIsVisible = false;
     636           0 :             if( GetBackground().IsScrollable() )
     637             :             {
     638             : 
     639           0 :                 Rectangle aScrRect( nX + std::min( (sal_uLong)nOldWidth, nWidth ), 0,
     640           0 :                                     GetSizePixel().Width() , // the header is longer than the datawin
     641           0 :                                     pDataWin->GetPosPixel().Y() - 1 );
     642           0 :                 Control::Scroll( nWidth-nOldWidth, 0, aScrRect, SCROLL_FLAGS );
     643           0 :                 aScrRect.Bottom() = pDataWin->GetSizePixel().Height();
     644           0 :                 getDataWindow()->Scroll( nWidth-nOldWidth, 0, aScrRect, SCROLL_FLAGS );
     645           0 :                 Rectangle aInvRect( nX, 0, nX + std::max( nWidth, (sal_uLong)nOldWidth ), USHRT_MAX );
     646           0 :                 Control::Invalidate( aInvRect, INVALIDATE_NOCHILDREN );
     647           0 :                 ( (BrowserDataWin*)pDataWin )->Invalidate( aInvRect );
     648             :             }
     649             :             else
     650             :             {
     651           0 :                 Control::Invalidate( INVALIDATE_NOCHILDREN );
     652           0 :                 getDataWindow()->Window::Invalidate( INVALIDATE_NOCHILDREN );
     653             :             }
     654             : 
     655             : 
     656             :             //!getDataWindow()->Update();
     657             :             //!Control::Update();
     658           0 :             bSelectionIsVisible = bSelVis;
     659           0 :             ToggleSelection();
     660           0 :             DoShowCursor( "SetColumnWidth" );
     661             :         }
     662           0 :         UpdateScrollbars();
     663             : 
     664             :         // adjust headerbar column
     665           0 :         if ( getDataWindow()->pHeaderBar )
     666             :             getDataWindow()->pHeaderBar->SetItemSize(
     667           0 :                     nItemId ? nItemId : USHRT_MAX - 1, nWidth );
     668             : 
     669             :         // adjust last column
     670           0 :         if ( nItemPos != pCols->size() - 1 )
     671           0 :             AutoSizeLastColumn();
     672             : 
     673             :     }
     674             : }
     675             : 
     676             : 
     677             : 
     678           0 : void BrowseBox::AutoSizeLastColumn()
     679             : {
     680           0 :     if ( getDataWindow()->bAutoSizeLastCol &&
     681           0 :          getDataWindow()->GetUpdateMode() )
     682             :     {
     683           0 :         sal_uInt16 nId = GetColumnId( (sal_uInt16)pCols->size() - 1 );
     684           0 :         SetColumnWidth( nId, LONG_MAX );
     685           0 :         ColumnResized( nId );
     686             :     }
     687           0 : }
     688             : 
     689             : 
     690             : 
     691           0 : void BrowseBox::RemoveColumn( sal_uInt16 nItemId )
     692             : {
     693             : 
     694             :     // get column position
     695           0 :     sal_uInt16 nPos = GetColumnPos(nItemId);
     696           0 :     if ( nPos >= ColCount() )
     697             :         // not available
     698           0 :         return;
     699             : 
     700             :     // correct column selection
     701           0 :     if ( pColSel )
     702           0 :         pColSel->Remove( nPos );
     703             : 
     704             :     // correct column cursor
     705           0 :     if ( nCurColId == nItemId )
     706           0 :         nCurColId = 0;
     707             : 
     708             :     // delete column
     709           0 :     BrowserColumns::iterator it = pCols->begin();
     710           0 :     ::std::advance( it, nPos );
     711           0 :     delete *it;
     712           0 :     pCols->erase( it );
     713           0 :     if ( nFirstCol >= nPos && nFirstCol > FrozenColCount() )
     714             :     {
     715             :         OSL_ENSURE(nFirstCol > 0,"FirstCol must be greater zero!");
     716           0 :         --nFirstCol;
     717             :     }
     718             : 
     719             :     // handlecolumn not in headerbar
     720           0 :     if (nItemId)
     721             :     {
     722           0 :         if ( getDataWindow()->pHeaderBar )
     723           0 :             getDataWindow()->pHeaderBar->RemoveItem( nItemId );
     724             :     }
     725             :     else
     726             :     {
     727             :         // adjust headerbar
     728           0 :         if ( getDataWindow()->pHeaderBar )
     729             :         {
     730             :             getDataWindow()->pHeaderBar->SetPosSizePixel(
     731             :                         Point(0, 0),
     732           0 :                         Size( GetOutputSizePixel().Width(), GetTitleHeight() )
     733           0 :                         );
     734             :         }
     735             :     }
     736             : 
     737             :     // correct vertical scrollbar
     738           0 :     UpdateScrollbars();
     739             : 
     740             :     // trigger repaint, if necessary
     741           0 :     if ( GetUpdateMode() )
     742             :     {
     743           0 :         getDataWindow()->Invalidate();
     744           0 :         Control::Invalidate();
     745           0 :         if ( getDataWindow()->bAutoSizeLastCol && nPos ==ColCount() )
     746           0 :             SetColumnWidth( GetColumnId( nPos - 1 ), LONG_MAX );
     747             :     }
     748             : 
     749           0 :     if ( isAccessibleAlive() )
     750             :     {
     751             :         commitTableEvent(
     752             :             TABLE_MODEL_CHANGED,
     753             :             makeAny( AccessibleTableModelChange(    DELETE,
     754             :                                                     0,
     755           0 :                                                     GetRowCount(),
     756             :                                                     nPos,
     757             :                                                     nPos
     758             :                                                )
     759             :             ),
     760             :             Any()
     761           0 :         );
     762             : 
     763             :         commitHeaderBarEvent(
     764             :             CHILD,
     765             :             Any(),
     766           0 :             makeAny( CreateAccessibleColumnHeader( nPos ) ),
     767             :             true
     768           0 :         );
     769             :     }
     770             : }
     771             : 
     772             : 
     773             : 
     774           0 : void BrowseBox::RemoveColumns()
     775             : {
     776             : 
     777           0 :     size_t nOldCount = pCols->size();
     778             : 
     779             :     // remove all columns
     780           0 :     for ( size_t i = 0; i < nOldCount; ++i )
     781           0 :         delete (*pCols)[ i ];
     782           0 :     pCols->clear();
     783             : 
     784             :     // correct column selection
     785           0 :     if ( pColSel )
     786             :     {
     787           0 :         pColSel->SelectAll(false);
     788           0 :         pColSel->SetTotalRange( Range( 0, 0 ) );
     789             :     }
     790             : 
     791             :     // correct column cursor
     792           0 :     nCurColId = 0;
     793           0 :     nFirstCol = 0;
     794             : 
     795           0 :     if ( getDataWindow()->pHeaderBar )
     796           0 :         getDataWindow()->pHeaderBar->Clear( );
     797             : 
     798             :     // correct vertical scrollbar
     799           0 :     UpdateScrollbars();
     800             : 
     801             :     // trigger repaint if necessary
     802           0 :     if ( GetUpdateMode() )
     803             :     {
     804           0 :         getDataWindow()->Invalidate();
     805           0 :         Control::Invalidate();
     806             :     }
     807             : 
     808           0 :     if ( isAccessibleAlive() )
     809             :     {
     810           0 :         if ( pCols->size() != nOldCount )
     811             :         {
     812             :             // all columns should be removed, so we remove the column header bar and append it again
     813             :             // to avoid to notify every column remove
     814             :             commitBrowseBoxEvent(
     815             :                 CHILD,
     816             :                 Any(),
     817             :                 makeAny(m_pImpl->getAccessibleHeaderBar(BBTYPE_COLUMNHEADERBAR))
     818           0 :             );
     819             : 
     820             :             // and now append it again
     821             :             commitBrowseBoxEvent(
     822             :                 CHILD,
     823             :                 makeAny(m_pImpl->getAccessibleHeaderBar(BBTYPE_COLUMNHEADERBAR)),
     824             :                 Any()
     825           0 :             );
     826             : 
     827             :             // notify a table model change
     828             :             commitTableEvent(
     829             :                 TABLE_MODEL_CHANGED,
     830             :                 makeAny ( AccessibleTableModelChange( DELETE,
     831             :                                 0,
     832           0 :                                 GetRowCount(),
     833             :                                 0,
     834             :                                 nOldCount
     835             :                             )
     836             :                         ),
     837             :                 Any()
     838           0 :             );
     839             :         }
     840             :     }
     841           0 : }
     842             : 
     843             : 
     844             : 
     845           0 : OUString BrowseBox::GetColumnTitle( sal_uInt16 nId ) const
     846             : {
     847             : 
     848           0 :     sal_uInt16 nItemPos = GetColumnPos( nId );
     849           0 :     if ( nItemPos >= pCols->size() )
     850           0 :         return OUString();
     851           0 :     return (*pCols)[ nItemPos ]->Title();
     852             : }
     853             : 
     854             : 
     855             : 
     856           0 : long BrowseBox::GetRowCount() const
     857             : {
     858           0 :     return nRowCount;
     859             : }
     860             : 
     861             : 
     862             : 
     863           0 : sal_uInt16 BrowseBox::ColCount() const
     864             : {
     865             : 
     866           0 :     return (sal_uInt16) pCols->size();
     867             : }
     868             : 
     869             : 
     870             : 
     871           0 : long BrowseBox::ImpGetDataRowHeight() const
     872             : {
     873             : 
     874           0 :     BrowseBox *pThis = (BrowseBox*)this;
     875           0 :     pThis->nDataRowHeight = pThis->CalcReverseZoom(pDataWin->GetTextHeight() + 2);
     876           0 :     pThis->Resize();
     877           0 :     getDataWindow()->Invalidate();
     878           0 :     return nDataRowHeight;
     879             : }
     880             : 
     881             : 
     882             : 
     883           0 : void BrowseBox::SetDataRowHeight( long nPixel )
     884             : {
     885             : 
     886           0 :     nDataRowHeight = CalcReverseZoom(nPixel);
     887           0 :     Resize();
     888           0 :     getDataWindow()->Invalidate();
     889           0 : }
     890             : 
     891             : 
     892             : 
     893           0 : void BrowseBox::SetTitleLines( sal_uInt16 nLines )
     894             : {
     895             : 
     896           0 :     nTitleLines = nLines;
     897           0 : }
     898             : 
     899             : 
     900             : 
     901           0 : long BrowseBox::ScrollColumns( long nCols )
     902             : {
     903             : 
     904           0 :     if ( nFirstCol + nCols < 0 ||
     905           0 :          nFirstCol + nCols >= (long)pCols->size() )
     906           0 :         return 0;
     907             : 
     908             :     // implicitly hides cursor while scrolling
     909           0 :     StartScroll();
     910           0 :     bScrolling = true;
     911           0 :     bool bScrollable = pDataWin->GetBackground().IsScrollable();
     912           0 :     bool bInvalidateView = false;
     913             : 
     914             :     // scrolling one column to the right?
     915           0 :     if ( nCols == 1 )
     916             :     {
     917             :         // update internal value and scrollbar
     918           0 :         ++nFirstCol;
     919           0 :         aHScroll.SetThumbPos( nFirstCol - FrozenColCount() );
     920             : 
     921           0 :         if ( !bScrollable )
     922             :         {
     923           0 :             bInvalidateView = true;
     924             :         }
     925             :         else
     926             :         {
     927           0 :             long nDelta = (*pCols)[ nFirstCol-1 ]->Width();
     928           0 :             long nFrozenWidth = GetFrozenWidth();
     929             : 
     930             :             Rectangle aScrollRect(  Point( nFrozenWidth + nDelta, 0 ),
     931           0 :                                     Size ( GetOutputSizePixel().Width() - nFrozenWidth - nDelta,
     932           0 :                                            GetTitleHeight() - 1
     933           0 :                                          ) );
     934             : 
     935             :             // scroll the header bar area (if there is no dedicated HeaderBar control)
     936           0 :             if ( !getDataWindow()->pHeaderBar && nTitleLines )
     937             :             {
     938             :                 // actually scroll
     939           0 :                 Scroll( -nDelta, 0, aScrollRect, SCROLL_FLAGS );
     940             : 
     941             :                 // invalidate the area of the column which was scrolled out to the left hand side
     942           0 :                 Rectangle aInvalidateRect( aScrollRect );
     943           0 :                 aInvalidateRect.Left() = nFrozenWidth;
     944           0 :                 aInvalidateRect.Right() = nFrozenWidth + nDelta - 1;
     945           0 :                 Invalidate( aInvalidateRect );
     946             :             }
     947             : 
     948             :             // scroll the data-area
     949           0 :             aScrollRect.Bottom() = pDataWin->GetOutputSizePixel().Height();
     950             : 
     951             :             // actually scroll
     952           0 :             pDataWin->Scroll( -nDelta, 0, aScrollRect, SCROLL_FLAGS );
     953             : 
     954             :             // invalidate the area of the column which was scrolled out to the left hand side
     955           0 :             aScrollRect.Left() = nFrozenWidth;
     956           0 :             aScrollRect.Right() = nFrozenWidth + nDelta - 1;
     957           0 :             getDataWindow()->Invalidate( aScrollRect );
     958             :         }
     959             :     }
     960             : 
     961             :     // scrolling one column to the left?
     962           0 :     else if ( nCols == -1 )
     963             :     {
     964           0 :         --nFirstCol;
     965           0 :         aHScroll.SetThumbPos( nFirstCol - FrozenColCount() );
     966             : 
     967           0 :         if ( !bScrollable )
     968             :         {
     969           0 :             bInvalidateView = true;
     970             :         }
     971             :         else
     972             :         {
     973           0 :             long nDelta = (*pCols)[ nFirstCol ]->Width();
     974           0 :             long nFrozenWidth = GetFrozenWidth();
     975             : 
     976             :             Rectangle aScrollRect(  Point(  nFrozenWidth, 0 ),
     977           0 :                                     Size (  GetOutputSizePixel().Width() - nFrozenWidth,
     978           0 :                                             GetTitleHeight() - 1
     979           0 :                                          ) );
     980             : 
     981             :             // scroll the header bar area (if there is no dedicated HeaderBar control)
     982           0 :             if ( !getDataWindow()->pHeaderBar && nTitleLines )
     983             :             {
     984           0 :                 Scroll( nDelta, 0, aScrollRect, SCROLL_FLAGS );
     985             :             }
     986             : 
     987             :             // scroll the data-area
     988           0 :             aScrollRect.Bottom() = pDataWin->GetOutputSizePixel().Height();
     989           0 :             pDataWin->Scroll( nDelta, 0, aScrollRect, SCROLL_FLAGS );
     990             :         }
     991             :     }
     992             :     else
     993             :     {
     994           0 :         if ( GetUpdateMode() )
     995             :         {
     996             :             Invalidate( Rectangle(
     997             :                 Point( GetFrozenWidth(), 0 ),
     998           0 :                 Size( GetOutputSizePixel().Width(), GetTitleHeight() ) ) );
     999             :             getDataWindow()->Invalidate( Rectangle(
    1000             :                 Point( GetFrozenWidth(), 0 ),
    1001           0 :                 pDataWin->GetSizePixel() ) );
    1002             :         }
    1003             : 
    1004           0 :         nFirstCol = nFirstCol + (sal_uInt16)nCols;
    1005           0 :         aHScroll.SetThumbPos( nFirstCol - FrozenColCount() );
    1006             :     }
    1007             : 
    1008             :     // adjust external headerbar, if necessary
    1009           0 :     if ( getDataWindow()->pHeaderBar )
    1010             :     {
    1011           0 :         long nWidth = 0;
    1012           0 :         for ( size_t nCol = 0;
    1013           0 :               nCol < pCols->size() && nCol < nFirstCol;
    1014             :               ++nCol )
    1015             :         {
    1016             :             // not the handle column
    1017           0 :             if ( (*pCols)[ nCol ]->GetId() )
    1018           0 :                 nWidth += (*pCols)[ nCol ]->Width();
    1019             :         }
    1020             : 
    1021           0 :         getDataWindow()->pHeaderBar->SetOffset( nWidth );
    1022             :     }
    1023             : 
    1024           0 :     if( bInvalidateView )
    1025             :     {
    1026           0 :         Control::Invalidate( INVALIDATE_NOCHILDREN );
    1027           0 :         pDataWin->Window::Invalidate( INVALIDATE_NOCHILDREN );
    1028             :     }
    1029             : 
    1030             :     // implicitly show cursor after scrolling
    1031           0 :     if ( nCols )
    1032             :     {
    1033           0 :         getDataWindow()->Update();
    1034           0 :         Update();
    1035             :     }
    1036           0 :     bScrolling = false;
    1037           0 :     EndScroll();
    1038             : 
    1039           0 :     return nCols;
    1040             : }
    1041             : 
    1042             : 
    1043             : 
    1044           0 : long BrowseBox::ScrollRows( long nRows )
    1045             : {
    1046             : 
    1047             :     // out of range?
    1048           0 :     if ( getDataWindow()->bNoScrollBack && nRows < 0 )
    1049           0 :         return 0;
    1050             : 
    1051             :     // compute new top row
    1052           0 :     long nTmpMin = std::min( (long)(nTopRow + nRows), (long)(nRowCount - 1) );
    1053             : 
    1054           0 :     long nNewTopRow = std::max( (long)nTmpMin, (long)0 );
    1055             : 
    1056           0 :     if ( nNewTopRow == nTopRow )
    1057           0 :         return 0;
    1058             : 
    1059             :     sal_uInt16 nVisibleRows =
    1060           0 :         (sal_uInt16)(pDataWin->GetOutputSizePixel().Height() / GetDataRowHeight() + 1);
    1061             : 
    1062           0 :     VisibleRowsChanged(nNewTopRow, nVisibleRows);
    1063             : 
    1064             :     // compute new top row again (nTopRow might have changed!)
    1065           0 :     nTmpMin = std::min( (long)(nTopRow + nRows), (long)(nRowCount - 1) );
    1066             : 
    1067           0 :     nNewTopRow = std::max( (long)nTmpMin, (long)0 );
    1068             : 
    1069           0 :     StartScroll();
    1070             : 
    1071             :     // scroll area on screen and/or repaint
    1072           0 :     long nDeltaY = GetDataRowHeight() * ( nNewTopRow - nTopRow );
    1073           0 :     long nOldTopRow = nTopRow;
    1074           0 :     nTopRow = nNewTopRow;
    1075             : 
    1076           0 :     if ( GetUpdateMode() )
    1077             :     {
    1078           0 :         pVScroll->SetRange( Range( 0L, nRowCount ) );
    1079           0 :         pVScroll->SetThumbPos( nTopRow );
    1080             : 
    1081           0 :         if( pDataWin->GetBackground().IsScrollable() &&
    1082           0 :             std::abs( nDeltaY ) > 0 &&
    1083           0 :             std::abs( nDeltaY ) < pDataWin->GetSizePixel().Height() )
    1084             :         {
    1085           0 :             pDataWin->Scroll( 0, (short)-nDeltaY, SCROLL_FLAGS );
    1086             :         }
    1087             :         else
    1088           0 :             getDataWindow()->Invalidate();
    1089             : 
    1090           0 :         if ( nTopRow - nOldTopRow )
    1091           0 :             getDataWindow()->Update();
    1092             :     }
    1093             : 
    1094           0 :     EndScroll();
    1095             : 
    1096           0 :     return nTopRow - nOldTopRow;
    1097             : }
    1098             : 
    1099             : 
    1100             : 
    1101           0 : void BrowseBox::RowModified( long nRow, sal_uInt16 nColId )
    1102             : {
    1103             : 
    1104           0 :     if ( !GetUpdateMode() )
    1105           0 :         return;
    1106             : 
    1107           0 :     Rectangle aRect;
    1108           0 :     if ( nColId == BROWSER_INVALIDID )
    1109             :         // invalidate the whole row
    1110           0 :         aRect = Rectangle( Point( 0, (nRow-nTopRow) * GetDataRowHeight() ),
    1111           0 :                     Size( pDataWin->GetSizePixel().Width(), GetDataRowHeight() ) );
    1112             :     else
    1113             :     {
    1114             :         // invalidate the specific field
    1115           0 :         aRect = GetFieldRectPixel( nRow, nColId, false );
    1116             :     }
    1117           0 :     getDataWindow()->Invalidate( aRect );
    1118             : }
    1119             : 
    1120             : 
    1121             : 
    1122           0 : void BrowseBox::Clear()
    1123             : {
    1124             : 
    1125             :     // adjust the total number of rows
    1126           0 :     DoHideCursor( "Clear" );
    1127           0 :     long nOldRowCount = nRowCount;
    1128           0 :     nRowCount = 0;
    1129           0 :     if(bMultiSelection)
    1130             :     {
    1131             :         assert(uRow.pSel);
    1132           0 :         *uRow.pSel = MultiSelection();
    1133             :     }
    1134             :     else
    1135           0 :         uRow.nSel = BROWSER_ENDOFSELECTION;
    1136           0 :     nCurRow = BROWSER_ENDOFSELECTION;
    1137           0 :     nTopRow = 0;
    1138           0 :     nCurColId = 0;
    1139             : 
    1140             :     // nFirstCol may not be reset, else the scrolling code will become confused.
    1141             :     // nFirstCol may only be changed when adding or deleting columns
    1142             :     // nFirstCol = 0; -> wrong!
    1143           0 :     aHScroll.SetThumbPos( 0 );
    1144           0 :     pVScroll->SetThumbPos( 0 );
    1145             : 
    1146           0 :     Invalidate();
    1147           0 :     UpdateScrollbars();
    1148           0 :     SetNoSelection();
    1149           0 :     DoShowCursor( "Clear" );
    1150           0 :     CursorMoved();
    1151             : 
    1152           0 :     if ( isAccessibleAlive() )
    1153             :     {
    1154             :         // all rows should be removed, so we remove the row header bar and append it again
    1155             :         // to avoid to notify every row remove
    1156           0 :         if ( nOldRowCount != nRowCount )
    1157             :         {
    1158             :             commitBrowseBoxEvent(
    1159             :                 CHILD,
    1160             :                 Any(),
    1161             :                 makeAny( m_pImpl->getAccessibleHeaderBar( BBTYPE_ROWHEADERBAR ) )
    1162           0 :             );
    1163             : 
    1164             :             // and now append it again
    1165             :             commitBrowseBoxEvent(
    1166             :                 CHILD,
    1167             :                 makeAny( m_pImpl->getAccessibleHeaderBar( BBTYPE_ROWHEADERBAR ) ),
    1168             :                 Any()
    1169           0 :             );
    1170             : 
    1171             :             // notify a table model change
    1172             :             commitTableEvent(
    1173             :                 TABLE_MODEL_CHANGED,
    1174             :                 makeAny( AccessibleTableModelChange( DELETE,
    1175             :                     0,
    1176             :                     nOldRowCount,
    1177             :                     0,
    1178           0 :                     GetColumnCount())
    1179             :                 ),
    1180             :                 Any()
    1181           0 :             );
    1182             :         }
    1183             :     }
    1184           0 : }
    1185             : 
    1186           0 : void BrowseBox::RowInserted( long nRow, long nNumRows, bool bDoPaint, bool bKeepSelection )
    1187             : {
    1188             : 
    1189           0 :     if (nRow < 0)
    1190           0 :         nRow = 0;
    1191           0 :     else if (nRow > nRowCount) // maximal = nRowCount
    1192           0 :         nRow = nRowCount;
    1193             : 
    1194           0 :     if ( nNumRows <= 0 )
    1195           0 :         return;
    1196             : 
    1197             :     // adjust total row count
    1198           0 :     bool bLastRow = nRow >= nRowCount;
    1199           0 :     nRowCount += nNumRows;
    1200             : 
    1201           0 :     DoHideCursor( "RowInserted" );
    1202             : 
    1203             :     // must we paint the new rows?
    1204           0 :     long nOldCurRow = nCurRow;
    1205           0 :     Size aSz = pDataWin->GetOutputSizePixel();
    1206           0 :     if ( bDoPaint && nRow >= nTopRow &&
    1207           0 :          nRow <= nTopRow + aSz.Height() / GetDataRowHeight() )
    1208             :     {
    1209           0 :         long nY = (nRow-nTopRow) * GetDataRowHeight();
    1210           0 :         if ( !bLastRow )
    1211             :         {
    1212             :             // scroll down the rows behind the new row
    1213           0 :             pDataWin->SetClipRegion();
    1214           0 :             if( pDataWin->GetBackground().IsScrollable() )
    1215             :             {
    1216           0 :                 pDataWin->Scroll( 0, GetDataRowHeight() * nNumRows,
    1217             :                                 Rectangle( Point( 0, nY ),
    1218           0 :                                         Size( aSz.Width(), aSz.Height() - nY ) ),
    1219           0 :                                 SCROLL_FLAGS );
    1220             :             }
    1221             :             else
    1222           0 :                 pDataWin->Window::Invalidate( INVALIDATE_NOCHILDREN );
    1223             :         }
    1224             :         else
    1225             :             // scroll would cause a repaint, so we must explicitly invalidate
    1226             :             pDataWin->Invalidate( Rectangle( Point( 0, nY ),
    1227           0 :                          Size( aSz.Width(), nNumRows * GetDataRowHeight() ) ) );
    1228             :     }
    1229             : 
    1230             :     // correct top row if necessary
    1231           0 :     if ( nRow < nTopRow )
    1232           0 :         nTopRow += nNumRows;
    1233             : 
    1234             :     // adjust the selection
    1235           0 :     if ( bMultiSelection )
    1236           0 :         uRow.pSel->Insert( nRow, nNumRows );
    1237           0 :     else if ( uRow.nSel != BROWSER_ENDOFSELECTION && nRow <= uRow.nSel )
    1238           0 :         uRow.nSel += nNumRows;
    1239             : 
    1240             :     // adjust the cursor
    1241           0 :     if ( nCurRow == BROWSER_ENDOFSELECTION )
    1242           0 :         GoToRow( 0, false, bKeepSelection );
    1243           0 :     else if ( nRow <= nCurRow )
    1244           0 :         GoToRow( nCurRow += nNumRows, false, bKeepSelection );
    1245             : 
    1246             :     // adjust the vertical scrollbar
    1247           0 :     if ( bDoPaint )
    1248             :     {
    1249           0 :         UpdateScrollbars();
    1250           0 :         AutoSizeLastColumn();
    1251             :     }
    1252             : 
    1253           0 :     DoShowCursor( "RowInserted" );
    1254             :     // notify accessible that rows were inserted
    1255           0 :     if ( isAccessibleAlive() )
    1256             :     {
    1257             :         commitTableEvent(
    1258             :             TABLE_MODEL_CHANGED,
    1259             :             makeAny( AccessibleTableModelChange(
    1260             :                         INSERT,
    1261             :                         nRow,
    1262           0 :                         nRow + nNumRows,
    1263             :                         0,
    1264           0 :                         GetColumnCount()
    1265             :                     )
    1266             :             ),
    1267             :             Any()
    1268           0 :         );
    1269             : 
    1270           0 :         for (sal_Int32 i = nRow+1 ; i <= nRowCount ; ++i)
    1271             :         {
    1272             :             commitHeaderBarEvent(
    1273             :                 CHILD,
    1274           0 :                 makeAny( CreateAccessibleRowHeader( i ) ),
    1275             :                 Any(),
    1276             :                 false
    1277           0 :             );
    1278             :         }
    1279             :     }
    1280             : 
    1281           0 :     if ( nCurRow != nOldCurRow )
    1282           0 :         CursorMoved();
    1283             : 
    1284             :     DBG_ASSERT(nRowCount > 0,"BrowseBox: nRowCount <= 0");
    1285             :     DBG_ASSERT(nCurRow >= 0,"BrowseBox: nCurRow < 0");
    1286             :     DBG_ASSERT(nCurRow < nRowCount,"nCurRow >= nRowCount");
    1287             : }
    1288             : 
    1289             : 
    1290             : 
    1291           0 : void BrowseBox::RowRemoved( long nRow, long nNumRows, bool bDoPaint )
    1292             : {
    1293             : 
    1294           0 :     if ( nRow < 0 )
    1295           0 :         nRow = 0;
    1296           0 :     else if ( nRow >= nRowCount )
    1297           0 :         nRow = nRowCount - 1;
    1298             : 
    1299           0 :     if ( nNumRows <= 0 )
    1300           0 :         return;
    1301             : 
    1302           0 :     if ( nRowCount <= 0 )
    1303           0 :         return;
    1304             : 
    1305           0 :     if ( bDoPaint )
    1306             :     {
    1307             :         // hide cursor and selection
    1308             :         OSL_TRACE( "BrowseBox: %p->HideCursor", this );
    1309           0 :         ToggleSelection();
    1310           0 :         DoHideCursor( "RowRemoved" );
    1311             :     }
    1312             : 
    1313             :     // adjust total row count
    1314           0 :     nRowCount -= nNumRows;
    1315           0 :     if (nRowCount < 0) nRowCount = 0;
    1316           0 :     long nOldCurRow = nCurRow;
    1317             : 
    1318             :     // adjust the selection
    1319           0 :     if ( bMultiSelection )
    1320             :         // uRow.pSel->Remove( nRow, nNumRows );
    1321           0 :         for ( long i = 0; i < nNumRows; i++ )
    1322           0 :             uRow.pSel->Remove( nRow );
    1323           0 :     else if ( nRow < uRow.nSel && uRow.nSel >= nNumRows )
    1324           0 :         uRow.nSel -= nNumRows;
    1325           0 :     else if ( nRow <= uRow.nSel )
    1326           0 :         uRow.nSel = BROWSER_ENDOFSELECTION;
    1327             : 
    1328             :     // adjust the cursor
    1329           0 :     if ( nRowCount == 0 )   // don't compare nRowCount with nNumRows as nNumRows already was subtracted from nRowCount
    1330           0 :         nCurRow = BROWSER_ENDOFSELECTION;
    1331           0 :     else if ( nRow < nCurRow )
    1332             :     {
    1333           0 :         nCurRow -= std::min( nCurRow - nRow, nNumRows );
    1334             :         // with the above nCurRow points a) to the first row after the removed block or b) to the same line
    1335             :         // as before, but moved up nNumRows
    1336             :         // case a) needs an additional correction if the last n lines were deleted, as 'the first row after the
    1337             :         // removed block' is an invalid position then
    1338             :         // FS - 09/28/99 - 68429
    1339           0 :         if (nCurRow == nRowCount)
    1340           0 :             --nCurRow;
    1341             :     }
    1342           0 :     else if( nRow == nCurRow && nCurRow == nRowCount )
    1343           0 :         nCurRow = nRowCount-1;
    1344             : 
    1345             :     // is the deleted row visible?
    1346           0 :     Size aSz = pDataWin->GetOutputSizePixel();
    1347           0 :     if ( nRow >= nTopRow &&
    1348           0 :          nRow <= nTopRow + aSz.Height() / GetDataRowHeight() )
    1349             :     {
    1350           0 :         if ( bDoPaint )
    1351             :         {
    1352             :             // scroll up the rows behind the deleted row
    1353             :             // if there are Rows behind
    1354           0 :             if (nRow < nRowCount)
    1355             :             {
    1356           0 :                 long nY = (nRow-nTopRow) * GetDataRowHeight();
    1357           0 :                 pDataWin->SetClipRegion();
    1358           0 :                 if( pDataWin->GetBackground().IsScrollable() )
    1359             :                 {
    1360           0 :                     pDataWin->Scroll( 0, - (short) GetDataRowHeight() * nNumRows,
    1361           0 :                         Rectangle( Point( 0, nY ), Size( aSz.Width(),
    1362           0 :                             aSz.Height() - nY + nNumRows*GetDataRowHeight() ) ),
    1363           0 :                             SCROLL_FLAGS );
    1364             :                 }
    1365             :                 else
    1366           0 :                     pDataWin->Window::Invalidate( INVALIDATE_NOCHILDREN );
    1367             :             }
    1368             :             else
    1369             :             {
    1370             :                 // Repaint the Rect of the deleted row
    1371             :                 Rectangle aRect(
    1372           0 :                         Point( 0, (nRow-nTopRow)*GetDataRowHeight() ),
    1373           0 :                         Size( pDataWin->GetSizePixel().Width(),
    1374           0 :                               nNumRows * GetDataRowHeight() ) );
    1375           0 :                 pDataWin->Invalidate( aRect );
    1376             :             }
    1377             :         }
    1378             :     }
    1379             :     // is the deleted row above of the visible area?
    1380           0 :     else if ( nRow < nTopRow )
    1381           0 :         nTopRow = nTopRow >= nNumRows ? nTopRow-nNumRows : 0;
    1382             : 
    1383           0 :     if ( bDoPaint )
    1384             :     {
    1385             :         // reshow cursor and selection
    1386           0 :         ToggleSelection();
    1387             :         OSL_TRACE( "BrowseBox: %p->ShowCursor", this );
    1388           0 :         DoShowCursor( "RowRemoved" );
    1389             : 
    1390             :         // adjust the vertical scrollbar
    1391           0 :         UpdateScrollbars();
    1392           0 :         AutoSizeLastColumn();
    1393             :     }
    1394             : 
    1395           0 :     if ( isAccessibleAlive() )
    1396             :     {
    1397           0 :         if ( nRowCount == 0 )
    1398             :         {
    1399             :             // all columns should be removed, so we remove the column header bar and append it again
    1400             :             // to avoid to notify every column remove
    1401             :             commitBrowseBoxEvent(
    1402             :                 CHILD,
    1403             :                 Any(),
    1404             :                 makeAny( m_pImpl->getAccessibleHeaderBar( BBTYPE_ROWHEADERBAR ) )
    1405           0 :             );
    1406             : 
    1407             :             // and now append it again
    1408             :             commitBrowseBoxEvent(
    1409             :                 CHILD,
    1410             :                 makeAny(m_pImpl->getAccessibleHeaderBar(BBTYPE_ROWHEADERBAR)),
    1411             :                 Any()
    1412           0 :             );
    1413             :             commitBrowseBoxEvent(
    1414             :                 CHILD,
    1415             :                 Any(),
    1416             :                 makeAny( m_pImpl->getAccessibleTable() )
    1417           0 :             );
    1418             : 
    1419             :             // and now append it again
    1420             :             commitBrowseBoxEvent(
    1421             :                 CHILD,
    1422             :                 makeAny( m_pImpl->getAccessibleTable() ),
    1423             :                 Any()
    1424           0 :             );
    1425             :         }
    1426             :         else
    1427             :         {
    1428             :             commitTableEvent(
    1429             :                 TABLE_MODEL_CHANGED,
    1430             :                 makeAny( AccessibleTableModelChange(
    1431             :                             DELETE,
    1432             :                             nRow,
    1433           0 :                             nRow + nNumRows,
    1434             :                             0,
    1435           0 :                             GetColumnCount()
    1436             :                             )
    1437             :                 ),
    1438             :                 Any()
    1439           0 :             );
    1440             : 
    1441           0 :             for (sal_Int32 i = nRow+1 ; i <= (nRow+nNumRows) ; ++i)
    1442             :             {
    1443             :                 commitHeaderBarEvent(
    1444             :                     CHILD,
    1445             :                     Any(),
    1446           0 :                     makeAny( CreateAccessibleRowHeader( i ) ),
    1447             :                     false
    1448           0 :                 );
    1449             :             }
    1450             :         }
    1451             :     }
    1452             : 
    1453           0 :     if ( nOldCurRow != nCurRow )
    1454           0 :         CursorMoved();
    1455             : 
    1456             :     DBG_ASSERT(nRowCount >= 0,"BrowseBox: nRowCount < 0");
    1457             :     DBG_ASSERT(nCurRow >= 0 || nRowCount == 0,"BrowseBox: nCurRow < 0 && nRowCount != 0");
    1458             :     DBG_ASSERT(nCurRow < nRowCount,"nCurRow >= nRowCount");
    1459             : }
    1460             : 
    1461             : 
    1462             : 
    1463           0 : bool BrowseBox::GoToRow( long nRow)
    1464             : {
    1465           0 :     return GoToRow(nRow, false, false);
    1466             : }
    1467             : 
    1468             : 
    1469             : 
    1470           0 : bool BrowseBox::GoToRow( long nRow, bool bRowColMove, bool bKeepSelection )
    1471             : {
    1472             : 
    1473           0 :     long nOldCurRow = nCurRow;
    1474             : 
    1475             :     // nothing to do?
    1476           0 :     if ( nRow == nCurRow && ( bMultiSelection || uRow.nSel == nRow ) )
    1477           0 :         return true;
    1478             : 
    1479             :     // out of range?
    1480           0 :     if ( nRow < 0 || nRow >= nRowCount )
    1481           0 :         return false;
    1482             : 
    1483             :     // not allowed?
    1484           0 :     if ( ( !bRowColMove && !IsCursorMoveAllowed( nRow, nCurColId ) ) )
    1485           0 :         return false;
    1486             : 
    1487           0 :     if ( getDataWindow()->bNoScrollBack && nRow < nTopRow )
    1488           0 :         nRow = nTopRow;
    1489             : 
    1490             :     // compute the last visible row
    1491           0 :     Size aSz( pDataWin->GetSizePixel() );
    1492           0 :     sal_uInt16 nVisibleRows = sal_uInt16( aSz.Height() / GetDataRowHeight() - 1 );
    1493           0 :     long nLastRow = nTopRow + nVisibleRows;
    1494             : 
    1495             :     // suspend Updates
    1496           0 :     getDataWindow()->EnterUpdateLock();
    1497             : 
    1498             :     // remove old highlight, if necessary
    1499           0 :     if ( !bMultiSelection && !bKeepSelection )
    1500           0 :         ToggleSelection();
    1501           0 :     DoHideCursor( "GoToRow" );
    1502             : 
    1503             :     // must we scroll?
    1504           0 :     bool bWasVisible = bSelectionIsVisible;
    1505           0 :     if (! bMultiSelection)
    1506             :     {
    1507           0 :         if( !bKeepSelection )
    1508           0 :             bSelectionIsVisible = false;
    1509             :     }
    1510           0 :     if ( nRow < nTopRow )
    1511           0 :         ScrollRows( nRow - nTopRow );
    1512           0 :     else if ( nRow > nLastRow )
    1513           0 :         ScrollRows( nRow - nLastRow );
    1514           0 :     bSelectionIsVisible = bWasVisible;
    1515             : 
    1516             :     // adjust cursor (selection) and thumb
    1517           0 :     if ( GetUpdateMode() )
    1518           0 :         pVScroll->SetThumbPos( nTopRow );
    1519             : 
    1520             :     // relative positioning (because nCurRow might have changed in the meantime)!
    1521           0 :     if (nCurRow != BROWSER_ENDOFSELECTION )
    1522           0 :         nCurRow = nCurRow + (nRow - nOldCurRow);
    1523             : 
    1524             :     // make sure that the current position is valid
    1525           0 :     if (nCurRow == BROWSER_ENDOFSELECTION && nRowCount > 0)
    1526           0 :         nCurRow = 0;
    1527           0 :     else if ( nCurRow >= nRowCount )
    1528           0 :         nCurRow = nRowCount - 1;
    1529           0 :     aSelRange = Range( nCurRow, nCurRow );
    1530             : 
    1531             :     // display new highlight if necessary
    1532           0 :     if ( !bMultiSelection && !bKeepSelection )
    1533           0 :         uRow.nSel = nRow;
    1534             : 
    1535             :     // resume Updates
    1536           0 :     getDataWindow()->LeaveUpdateLock();
    1537             : 
    1538             :     // Cursor+Highlight
    1539           0 :     if ( !bMultiSelection && !bKeepSelection)
    1540           0 :         ToggleSelection();
    1541           0 :     DoShowCursor( "GoToRow" );
    1542           0 :     if ( !bRowColMove  && nOldCurRow != nCurRow )
    1543           0 :         CursorMoved();
    1544             : 
    1545           0 :     if ( !bMultiSelection && !bKeepSelection )
    1546             :     {
    1547           0 :         if ( !bSelecting )
    1548           0 :             Select();
    1549             :         else
    1550           0 :             bSelect = true;
    1551             :     }
    1552           0 :     return true;
    1553             : }
    1554             : 
    1555             : 
    1556             : 
    1557           0 : bool BrowseBox::GoToColumnId( sal_uInt16 nColId)
    1558             : {
    1559           0 :     return GoToColumnId(nColId, true, false);
    1560             : }
    1561             : 
    1562             : 
    1563           0 : bool BrowseBox::GoToColumnId( sal_uInt16 nColId, bool bMakeVisible, bool bRowColMove)
    1564             : {
    1565             : 
    1566           0 :     if (!bColumnCursor)
    1567           0 :         return false;
    1568             : 
    1569             :     // allowed?
    1570           0 :     if (!bRowColMove && !IsCursorMoveAllowed( nCurRow, nColId ) )
    1571           0 :         return false;
    1572             : 
    1573           0 :     if ( nColId != nCurColId || (bMakeVisible && !IsFieldVisible(nCurRow, nColId, true)))
    1574             :     {
    1575           0 :         sal_uInt16 nNewPos = GetColumnPos(nColId);
    1576           0 :         BrowserColumn* pColumn = (nNewPos < pCols->size()) ? (*pCols)[ nNewPos ] : NULL;
    1577             :         DBG_ASSERT( pColumn, "no column object - invalid id?" );
    1578           0 :         if ( !pColumn )
    1579           0 :             return false;
    1580             : 
    1581           0 :         DoHideCursor( "GoToColumnId" );
    1582           0 :         nCurColId = nColId;
    1583             : 
    1584           0 :         sal_uInt16 nFirstPos = nFirstCol;
    1585           0 :         sal_uInt16 nWidth = (sal_uInt16)pColumn->Width();
    1586             :         sal_uInt16 nLastPos = GetColumnAtXPosPixel(
    1587           0 :                             pDataWin->GetSizePixel().Width()-nWidth, false );
    1588           0 :         sal_uInt16 nFrozen = FrozenColCount();
    1589           0 :         if ( bMakeVisible && nLastPos &&
    1590           0 :              nNewPos >= nFrozen && ( nNewPos < nFirstPos || nNewPos > nLastPos ) )
    1591             :         {
    1592           0 :             if ( nNewPos < nFirstPos )
    1593           0 :                 ScrollColumns( nNewPos-nFirstPos );
    1594           0 :             else if ( nNewPos > nLastPos )
    1595           0 :                 ScrollColumns( nNewPos-nLastPos );
    1596             :         }
    1597             : 
    1598           0 :         DoShowCursor( "GoToColumnId" );
    1599           0 :         if (!bRowColMove)
    1600           0 :             CursorMoved();
    1601           0 :         return true;
    1602             :     }
    1603           0 :     return true;
    1604             : }
    1605             : 
    1606             : 
    1607             : 
    1608           0 : bool BrowseBox::GoToRowColumnId( long nRow, sal_uInt16 nColId )
    1609             : {
    1610             : 
    1611             :     // out of range?
    1612           0 :     if ( nRow < 0 || nRow >= nRowCount )
    1613           0 :         return false;
    1614             : 
    1615           0 :     if (!bColumnCursor)
    1616           0 :         return false;
    1617             : 
    1618             :     // nothing to do ?
    1619           0 :     if ( nRow == nCurRow && ( bMultiSelection || uRow.nSel == nRow ) &&
    1620           0 :          nColId == nCurColId && IsFieldVisible(nCurRow, nColId, true))
    1621           0 :         return true;
    1622             : 
    1623             :     // allowed?
    1624           0 :     if (!IsCursorMoveAllowed(nRow, nColId))
    1625           0 :         return false;
    1626             : 
    1627           0 :     DoHideCursor( "GoToRowColumnId" );
    1628           0 :     bool bMoved = GoToRow(nRow, true) && GoToColumnId(nColId, true, true);
    1629           0 :     DoShowCursor( "GoToRowColumnId" );
    1630             : 
    1631           0 :     if (bMoved)
    1632           0 :         CursorMoved();
    1633             : 
    1634           0 :     return bMoved;
    1635             : }
    1636             : 
    1637             : 
    1638             : 
    1639           0 : void BrowseBox::SetNoSelection()
    1640             : {
    1641             : 
    1642             :     // is there no selection
    1643           0 :     if ( ( !pColSel || !pColSel->GetSelectCount() ) &&
    1644           0 :          ( ( !bMultiSelection && uRow.nSel == BROWSER_ENDOFSELECTION ) ||
    1645           0 :            ( bMultiSelection && !uRow.pSel->GetSelectCount() ) ) )
    1646             :         // nothing to do
    1647           0 :         return;
    1648             : 
    1649             :     OSL_TRACE( "BrowseBox: %p->HideCursor", this );
    1650           0 :     ToggleSelection();
    1651             : 
    1652             :     // unselect all
    1653           0 :     if ( bMultiSelection )
    1654           0 :         uRow.pSel->SelectAll(false);
    1655             :     else
    1656           0 :         uRow.nSel = BROWSER_ENDOFSELECTION;
    1657           0 :     if ( pColSel )
    1658           0 :         pColSel->SelectAll(false);
    1659           0 :     if ( !bSelecting )
    1660           0 :         Select();
    1661             :     else
    1662           0 :         bSelect = true;
    1663             : 
    1664             :     // restore screen
    1665             :     OSL_TRACE( "BrowseBox: %p->ShowCursor", this );
    1666             : 
    1667           0 :     if ( isAccessibleAlive() )
    1668             :     {
    1669             :         commitTableEvent(
    1670             :             SELECTION_CHANGED,
    1671             :             Any(),
    1672             :             Any()
    1673           0 :         );
    1674             :     }
    1675             : }
    1676             : 
    1677             : 
    1678             : 
    1679           0 : void BrowseBox::SelectAll()
    1680             : {
    1681             : 
    1682           0 :     if ( !bMultiSelection )
    1683           0 :         return;
    1684             : 
    1685             :     OSL_TRACE( "BrowseBox: %p->HideCursor", this );
    1686           0 :     ToggleSelection();
    1687             : 
    1688             :     // select all rows
    1689           0 :     if ( pColSel )
    1690           0 :         pColSel->SelectAll(false);
    1691           0 :     uRow.pSel->SelectAll(true);
    1692             : 
    1693             :     // don't highlight handle column
    1694           0 :     BrowserColumn *pFirstCol = (*pCols)[ 0 ];
    1695           0 :     long nOfsX = pFirstCol->GetId() ? 0 : pFirstCol->Width();
    1696             : 
    1697             :     // highlight the row selection
    1698           0 :     if ( !bHideSelect )
    1699             :     {
    1700           0 :         Rectangle aHighlightRect;
    1701             :         sal_uInt16 nVisibleRows =
    1702           0 :             (sal_uInt16)(pDataWin->GetOutputSizePixel().Height() / GetDataRowHeight() + 1);
    1703           0 :         for ( long nRow = std::max( nTopRow, uRow.pSel->FirstSelected() );
    1704           0 :               nRow != BROWSER_ENDOFSELECTION && nRow < nTopRow + nVisibleRows;
    1705           0 :               nRow = uRow.pSel->NextSelected() )
    1706             :             aHighlightRect.Union( Rectangle(
    1707           0 :                 Point( nOfsX, (nRow-nTopRow)*GetDataRowHeight() ),
    1708           0 :                 Size( pDataWin->GetSizePixel().Width(), GetDataRowHeight() ) ) );
    1709           0 :         pDataWin->Invalidate( aHighlightRect );
    1710             :     }
    1711             : 
    1712           0 :     if ( !bSelecting )
    1713           0 :         Select();
    1714             :     else
    1715           0 :         bSelect = true;
    1716             : 
    1717             :     // restore screen
    1718             :     OSL_TRACE( "BrowseBox: %p->ShowCursor", this );
    1719             : 
    1720           0 :     if ( isAccessibleAlive() )
    1721             :     {
    1722             :         commitTableEvent(
    1723             :             SELECTION_CHANGED,
    1724             :             Any(),
    1725             :             Any()
    1726           0 :         );
    1727             :         commitHeaderBarEvent(
    1728             :             SELECTION_CHANGED,
    1729             :             Any(),
    1730             :             Any(),
    1731             :             true
    1732           0 :         ); // column header event
    1733             : 
    1734             :         commitHeaderBarEvent(
    1735             :             SELECTION_CHANGED,
    1736             :             Any(),
    1737             :             Any(),
    1738             :             false
    1739           0 :         ); // row header event
    1740             :     }
    1741             : }
    1742             : 
    1743             : 
    1744             : 
    1745           0 : void BrowseBox::SelectRow( long nRow, bool _bSelect, bool bExpand )
    1746             : {
    1747             : 
    1748           0 :     if ( !bMultiSelection )
    1749             :     {
    1750             :         // deselecting is impossible, selecting via cursor
    1751           0 :         if ( _bSelect )
    1752           0 :             GoToRow(nRow, false);
    1753           0 :         return;
    1754             :     }
    1755             : 
    1756             :     OSL_TRACE( "BrowseBox: %p->HideCursor", this );
    1757             : 
    1758             :     // remove old selection?
    1759           0 :     if ( !bExpand || !bMultiSelection )
    1760             :     {
    1761           0 :         ToggleSelection();
    1762           0 :         if ( bMultiSelection )
    1763           0 :             uRow.pSel->SelectAll(false);
    1764             :         else
    1765           0 :             uRow.nSel = BROWSER_ENDOFSELECTION;
    1766           0 :         if ( pColSel )
    1767           0 :             pColSel->SelectAll(false);
    1768             :     }
    1769             : 
    1770             :     // set new selection
    1771           0 :     if  (   !bHideSelect
    1772           0 :         &&  (   (   bMultiSelection
    1773           0 :                 &&  uRow.pSel->GetTotalRange().Max() >= nRow
    1774           0 :                 &&  uRow.pSel->Select( nRow, _bSelect )
    1775             :                 )
    1776           0 :             ||  (   !bMultiSelection
    1777           0 :                 &&  ( uRow.nSel = nRow ) != BROWSER_ENDOFSELECTION )
    1778             :                 )
    1779             :             )
    1780             :     {
    1781             :         // don't highlight handle column
    1782           0 :         BrowserColumn *pFirstCol = (*pCols)[ 0 ];
    1783           0 :         long nOfsX = pFirstCol->GetId() ? 0 : pFirstCol->Width();
    1784             : 
    1785             :         // highlight only newly selected part
    1786             :         Rectangle aRect(
    1787           0 :             Point( nOfsX, (nRow-nTopRow)*GetDataRowHeight() ),
    1788           0 :             Size( pDataWin->GetSizePixel().Width(), GetDataRowHeight() ) );
    1789           0 :         pDataWin->Invalidate( aRect );
    1790             :     }
    1791             : 
    1792           0 :     if ( !bSelecting )
    1793           0 :         Select();
    1794             :     else
    1795           0 :         bSelect = true;
    1796             : 
    1797             :     // restore screen
    1798             :     OSL_TRACE( "BrowseBox: %p->ShowCursor", this );
    1799             : 
    1800           0 :     if ( isAccessibleAlive() )
    1801             :     {
    1802             :         commitTableEvent(
    1803             :             SELECTION_CHANGED,
    1804             :             Any(),
    1805             :             Any()
    1806           0 :         );
    1807             :         commitHeaderBarEvent(
    1808             :             SELECTION_CHANGED,
    1809             :             Any(),
    1810             :             Any(),
    1811             :             false
    1812           0 :         ); // row header event
    1813             :     }
    1814             : }
    1815             : 
    1816             : 
    1817             : 
    1818           0 : long BrowseBox::GetSelectRowCount() const
    1819             : {
    1820             : 
    1821           0 :     return bMultiSelection ? uRow.pSel->GetSelectCount() :
    1822           0 :            uRow.nSel == BROWSER_ENDOFSELECTION ? 0 : 1;
    1823             : }
    1824             : 
    1825             : 
    1826             : 
    1827           0 : void BrowseBox::SelectColumnPos( sal_uInt16 nNewColPos, bool _bSelect, bool bMakeVisible )
    1828             : {
    1829             : 
    1830           0 :     if ( !bColumnCursor || nNewColPos == BROWSER_INVALIDID )
    1831           0 :         return;
    1832             : 
    1833           0 :     if ( !bMultiSelection )
    1834             :     {
    1835           0 :         if ( _bSelect )
    1836           0 :             GoToColumnId( (*pCols)[ nNewColPos ]->GetId(), bMakeVisible );
    1837           0 :         return;
    1838             :     }
    1839             :     else
    1840             :     {
    1841           0 :         if ( !GoToColumnId( (*pCols)[ nNewColPos ]->GetId(), bMakeVisible ) )
    1842           0 :             return;
    1843             :     }
    1844             : 
    1845             :     OSL_TRACE( "BrowseBox: %p->HideCursor", this );
    1846           0 :     ToggleSelection();
    1847           0 :     if ( bMultiSelection )
    1848           0 :         uRow.pSel->SelectAll(false);
    1849             :     else
    1850           0 :         uRow.nSel = BROWSER_ENDOFSELECTION;
    1851           0 :     pColSel->SelectAll(false);
    1852             : 
    1853           0 :     if ( pColSel->Select( nNewColPos, _bSelect ) )
    1854             :     {
    1855             :         // GoToColumnId( pCols->GetObject(nNewColPos)->GetId(), bMakeVisible );
    1856             : 
    1857             :         // only highlight painted areas
    1858           0 :         pDataWin->Update();
    1859           0 :         Rectangle aFieldRectPix( GetFieldRectPixel( nCurRow, nCurColId, false ) );
    1860             :         Rectangle aRect(
    1861           0 :             Point( aFieldRectPix.Left() - MIN_COLUMNWIDTH, 0 ),
    1862           0 :             Size( (*pCols)[ nNewColPos ]->Width(),
    1863           0 :                   pDataWin->GetOutputSizePixel().Height() ) );
    1864           0 :         pDataWin->Invalidate( aRect );
    1865           0 :         if ( !bSelecting )
    1866           0 :             Select();
    1867             :         else
    1868           0 :             bSelect = true;
    1869             : 
    1870           0 :         if ( isAccessibleAlive() )
    1871             :         {
    1872             :             commitTableEvent(
    1873             :                 SELECTION_CHANGED,
    1874             :                 Any(),
    1875             :                 Any()
    1876           0 :             );
    1877             :             commitHeaderBarEvent(
    1878             :                 SELECTION_CHANGED,
    1879             :                 Any(),
    1880             :                 Any(),
    1881             :                 true
    1882           0 :             ); // column header event
    1883             :         }
    1884             :     }
    1885             : 
    1886             :     // restore screen
    1887             :     OSL_TRACE( "BrowseBox: %p->ShowCursor", this );
    1888             : }
    1889             : 
    1890             : 
    1891             : 
    1892           0 : sal_uInt16 BrowseBox::GetSelectColumnCount() const
    1893             : {
    1894             : 
    1895             :     // while bAutoSelect (==!pColSel), 1 if any rows (yes rows!) else none
    1896           0 :     return pColSel ? (sal_uInt16) pColSel->GetSelectCount() :
    1897           0 :            nCurRow >= 0 ? 1 : 0;
    1898             : }
    1899             : 
    1900             : 
    1901           0 : long BrowseBox::FirstSelectedColumn( ) const
    1902             : {
    1903           0 :     return pColSel ? pColSel->FirstSelected() : BROWSER_ENDOFSELECTION;
    1904             : }
    1905             : 
    1906             : 
    1907             : 
    1908           0 : long BrowseBox::FirstSelectedRow( bool bInverse )
    1909             : {
    1910             : 
    1911           0 :     return bMultiSelection ? uRow.pSel->FirstSelected(bInverse) : uRow.nSel;
    1912             : }
    1913             : 
    1914             : 
    1915             : 
    1916           0 : long BrowseBox::NextSelectedRow()
    1917             : {
    1918             : 
    1919           0 :     return bMultiSelection ? uRow.pSel->NextSelected() : BROWSER_ENDOFSELECTION;
    1920             : }
    1921             : 
    1922             : 
    1923             : 
    1924           0 : long BrowseBox::LastSelectedRow()
    1925             : {
    1926             : 
    1927           0 :     return bMultiSelection ? uRow.pSel->LastSelected() : uRow.nSel;
    1928             : }
    1929             : 
    1930             : 
    1931             : 
    1932           0 : bool BrowseBox::IsRowSelected( long nRow ) const
    1933             : {
    1934             : 
    1935           0 :     return bMultiSelection ? uRow.pSel->IsSelected(nRow) : nRow == uRow.nSel;
    1936             : }
    1937             : 
    1938             : 
    1939             : 
    1940           0 : bool BrowseBox::IsColumnSelected( sal_uInt16 nColumnId ) const
    1941             : {
    1942             : 
    1943           0 :     return pColSel ? pColSel->IsSelected( GetColumnPos(nColumnId) ) :
    1944           0 :                      nCurColId == nColumnId;
    1945             : }
    1946             : 
    1947             : 
    1948             : 
    1949           0 : bool BrowseBox::MakeFieldVisible
    1950             : (
    1951             :     long    nRow,       // line number of the field (starting with 0)
    1952             :     sal_uInt16  nColId,     // column ID of the field
    1953             :     bool    bComplete   // (== false), true => make visible in its entirety
    1954             : )
    1955             : 
    1956             : /*  [Description]
    1957             : 
    1958             :     Makes visible the field described in 'nRow' and 'nColId' by scrolling
    1959             :     accordingly. If 'bComplete' is set, the field should become visible in its
    1960             :     entirety.
    1961             : 
    1962             :     [Returned Value]
    1963             : 
    1964             :     bool            true
    1965             :                     The given field is already visible or was already visible.
    1966             : 
    1967             :                     false
    1968             :                     The given field could not be made visible or in the case of
    1969             :                     'bComplete' could not be made visible in its entirety.
    1970             : */
    1971             : 
    1972             : {
    1973           0 :     Size aTestSize = pDataWin->GetSizePixel();
    1974             : 
    1975           0 :     if ( !bBootstrapped ||
    1976           0 :          ( aTestSize.Width() == 0 && aTestSize.Height() == 0 ) )
    1977           0 :         return false;
    1978             : 
    1979             :     // is it visible already?
    1980           0 :     bool bVisible = IsFieldVisible( nRow, nColId, bComplete );
    1981           0 :     if ( bVisible )
    1982           0 :         return true;
    1983             : 
    1984             :     // calculate column position, field rectangle and painting area
    1985           0 :     sal_uInt16 nColPos = GetColumnPos( nColId );
    1986           0 :     Rectangle aFieldRect = GetFieldRectPixel( nRow, nColId, false );
    1987           0 :     Rectangle aDataRect = Rectangle( Point(0, 0), pDataWin->GetSizePixel() );
    1988             : 
    1989             :     // positioned outside on the left?
    1990           0 :     if ( nColPos >= FrozenColCount() && nColPos < nFirstCol )
    1991             :         // => scroll to the right
    1992           0 :         ScrollColumns( nColPos - nFirstCol );
    1993             : 
    1994             :     // while outside on the right
    1995           0 :     while ( aDataRect.Right() < ( bComplete
    1996           0 :                 ? aFieldRect.Right()
    1997           0 :                 : aFieldRect.Left()+aFieldRect.GetWidth()/2 ) )
    1998             :     {
    1999             :         // => scroll to the left
    2000           0 :         if ( ScrollColumns( 1 ) != 1 )
    2001             :             // no more need to scroll
    2002           0 :             break;
    2003           0 :         aFieldRect = GetFieldRectPixel( nRow, nColId, false );
    2004             :     }
    2005             : 
    2006             :     // positioned outside above?
    2007           0 :     if ( nRow < nTopRow )
    2008             :         // scroll further to the bottom
    2009           0 :         ScrollRows( nRow - nTopRow );
    2010             : 
    2011             :     // positioned outside below?
    2012           0 :     long nBottomRow = nTopRow + GetVisibleRows();
    2013             :     // decrement nBottomRow to make it the number of the last visible line
    2014             :     // (count starts with 0!).
    2015             :     // Example: BrowseBox contains exactly one entry. nBottomRow := 0 + 1 - 1
    2016           0 :     if( nBottomRow )
    2017           0 :         nBottomRow--;
    2018             : 
    2019           0 :     if ( nRow > nBottomRow )
    2020             :         // scroll further to the top
    2021           0 :         ScrollRows( nRow - nBottomRow );
    2022             : 
    2023             :     // it might still not actually fit, e.g. if the window is too small
    2024           0 :     return IsFieldVisible( nRow, nColId, bComplete );
    2025             : }
    2026             : 
    2027             : 
    2028             : 
    2029           0 : bool BrowseBox::IsFieldVisible( long nRow, sal_uInt16 nColumnId,
    2030             :                                 bool bCompletely ) const
    2031             : {
    2032             : 
    2033             :     // hidden by frozen column?
    2034           0 :     sal_uInt16 nColPos = GetColumnPos( nColumnId );
    2035           0 :     if ( nColPos >= FrozenColCount() && nColPos < nFirstCol )
    2036           0 :         return false;
    2037             : 
    2038           0 :     Rectangle aRect( ImplFieldRectPixel( nRow, nColumnId ) );
    2039           0 :     if ( aRect.IsEmpty() )
    2040           0 :         return false;
    2041             : 
    2042             :     // get the visible area
    2043           0 :     Rectangle aOutRect( Point(0, 0), pDataWin->GetOutputSizePixel() );
    2044             : 
    2045           0 :     if ( bCompletely )
    2046             :         // test if the field is completely visible
    2047           0 :         return aOutRect.IsInside( aRect );
    2048             :     else
    2049             :         // test if the field is partly of completely visible
    2050           0 :         return !aOutRect.Intersection( aRect ).IsEmpty();
    2051             : }
    2052             : 
    2053             : 
    2054             : 
    2055           0 : Rectangle BrowseBox::GetFieldRectPixel( long nRow, sal_uInt16 nColumnId,
    2056             :                                         bool bRelToBrowser) const
    2057             : {
    2058             : 
    2059             :     // get the rectangle relative to DataWin
    2060           0 :     Rectangle aRect( ImplFieldRectPixel( nRow, nColumnId ) );
    2061           0 :     if ( aRect.IsEmpty() )
    2062           0 :         return aRect;
    2063             : 
    2064             :     // adjust relative to BrowseBox's output area
    2065           0 :     Point aTopLeft( aRect.TopLeft() );
    2066           0 :     if ( bRelToBrowser )
    2067             :     {
    2068           0 :         aTopLeft = pDataWin->OutputToScreenPixel( aTopLeft );
    2069           0 :         aTopLeft = ScreenToOutputPixel( aTopLeft );
    2070             :     }
    2071             : 
    2072           0 :     return Rectangle( aTopLeft, aRect.GetSize() );
    2073             : }
    2074             : 
    2075             : 
    2076             : 
    2077           0 : Rectangle BrowseBox::GetRowRectPixel( long nRow, bool bRelToBrowser  ) const
    2078             : {
    2079             : 
    2080             :     // get the rectangle relative to DataWin
    2081           0 :     Rectangle aRect;
    2082           0 :     if ( nTopRow > nRow )
    2083             :         // row is above visible area
    2084           0 :         return aRect;
    2085             :     aRect = Rectangle(
    2086           0 :         Point( 0, GetDataRowHeight() * (nRow-nTopRow) ),
    2087           0 :         Size( pDataWin->GetOutputSizePixel().Width(), GetDataRowHeight() ) );
    2088           0 :     if ( aRect.TopLeft().Y() > pDataWin->GetOutputSizePixel().Height() )
    2089             :         // row is below visible area
    2090           0 :         return aRect;
    2091             : 
    2092             :     // adjust relative to BrowseBox's output area
    2093           0 :     Point aTopLeft( aRect.TopLeft() );
    2094           0 :     if ( bRelToBrowser )
    2095             :     {
    2096           0 :         aTopLeft = pDataWin->OutputToScreenPixel( aTopLeft );
    2097           0 :         aTopLeft = ScreenToOutputPixel( aTopLeft );
    2098             :     }
    2099             : 
    2100           0 :     return Rectangle( aTopLeft, aRect.GetSize() );
    2101             : }
    2102             : 
    2103             : 
    2104             : 
    2105           0 : Rectangle BrowseBox::ImplFieldRectPixel( long nRow, sal_uInt16 nColumnId ) const
    2106             : {
    2107             : 
    2108             :     // compute the X-coordinate relative to DataWin by accumulation
    2109           0 :     long nColX = 0;
    2110           0 :     sal_uInt16 nFrozenCols = FrozenColCount();
    2111             :     size_t nCol;
    2112           0 :     for ( nCol = 0;
    2113           0 :           nCol < pCols->size() && (*pCols)[ nCol ]->GetId() != nColumnId;
    2114             :           ++nCol )
    2115           0 :         if ( (*pCols)[ nCol ]->IsFrozen() || nCol >= nFirstCol )
    2116           0 :             nColX += (*pCols)[ nCol ]->Width();
    2117             : 
    2118           0 :     if ( nCol >= pCols->size() || ( nCol >= nFrozenCols && nCol < nFirstCol ) )
    2119           0 :         return Rectangle();
    2120             : 
    2121             :     // compute the Y-coordinate relative to DataWin
    2122           0 :     long nRowY = GetDataRowHeight();
    2123           0 :     if ( nRow != BROWSER_ENDOFSELECTION ) // #105497# OJ
    2124           0 :         nRowY = ( nRow - nTopRow ) * GetDataRowHeight();
    2125             : 
    2126             :     // assemble the Rectangle relative to DataWin
    2127             :     return Rectangle(
    2128             :         Point( nColX + MIN_COLUMNWIDTH, nRowY ),
    2129           0 :         Size( (*pCols)[ nCol ]->Width() - 2*MIN_COLUMNWIDTH,
    2130           0 :               GetDataRowHeight() - 1 ) );
    2131             : }
    2132             : 
    2133             : 
    2134             : 
    2135           0 : long BrowseBox::GetRowAtYPosPixel( long nY, bool bRelToBrowser ) const
    2136             : {
    2137             : 
    2138             :     // compute the Y-coordinate
    2139           0 :     if ( bRelToBrowser )
    2140             :     {
    2141           0 :         Point aDataTopLeft = pDataWin->OutputToScreenPixel( Point(0, 0) );
    2142           0 :         Point aTopLeft = OutputToScreenPixel( Point(0, 0) );
    2143           0 :         nY -= aDataTopLeft.Y() - aTopLeft.Y();
    2144             :     }
    2145             : 
    2146             :     // no row there (e.g. in the header)
    2147           0 :     if ( nY < 0 || nY >= pDataWin->GetOutputSizePixel().Height() )
    2148           0 :         return -1;
    2149             : 
    2150           0 :     return nY / GetDataRowHeight() + nTopRow;
    2151             : }
    2152             : 
    2153             : 
    2154             : 
    2155           0 : Rectangle BrowseBox::GetFieldRect( sal_uInt16 nColumnId ) const
    2156             : {
    2157             : 
    2158           0 :     return GetFieldRectPixel( nCurRow, nColumnId );
    2159             : }
    2160             : 
    2161             : 
    2162             : 
    2163           0 : sal_uInt16 BrowseBox::GetColumnAtXPosPixel( long nX, bool ) const
    2164             : {
    2165             : 
    2166             :     // accumulate the widths of the visible columns
    2167           0 :     long nColX = 0;
    2168           0 :     for ( size_t nCol = 0; nCol < pCols->size(); ++nCol )
    2169             :     {
    2170           0 :         BrowserColumn *pCol = (*pCols)[ nCol ];
    2171           0 :         if ( pCol->IsFrozen() || nCol >= nFirstCol )
    2172           0 :             nColX += pCol->Width();
    2173             : 
    2174           0 :         if ( nColX > nX )
    2175           0 :             return nCol;
    2176             :     }
    2177             : 
    2178           0 :     return BROWSER_INVALIDID;
    2179             : }
    2180             : 
    2181             : 
    2182             : 
    2183           0 : void BrowseBox::ReserveControlArea( sal_uInt16 nWidth )
    2184             : {
    2185             : 
    2186           0 :     if ( nWidth != nControlAreaWidth )
    2187             :     {
    2188             :         OSL_ENSURE(nWidth,"Control area of 0 is not allowed, Use USHRT_MAX instead!");
    2189           0 :         nControlAreaWidth = nWidth;
    2190           0 :         UpdateScrollbars();
    2191             :     }
    2192           0 : }
    2193             : 
    2194             : 
    2195             : 
    2196           0 : Rectangle BrowseBox::GetControlArea() const
    2197             : {
    2198             : 
    2199             :     return Rectangle(
    2200           0 :         Point( 0, GetOutputSizePixel().Height() - aHScroll.GetSizePixel().Height() ),
    2201           0 :         Size( GetOutputSizePixel().Width() - aHScroll.GetSizePixel().Width(),
    2202           0 :              aHScroll.GetSizePixel().Height() ) );
    2203             : }
    2204             : 
    2205             : 
    2206             : 
    2207           0 : void BrowseBox::SetMode( BrowserMode nMode )
    2208             : {
    2209             : 
    2210           0 :     getDataWindow()->bAutoHScroll = BROWSER_AUTO_HSCROLL == ( nMode & BROWSER_AUTO_HSCROLL );
    2211           0 :     getDataWindow()->bAutoVScroll = BROWSER_AUTO_VSCROLL == ( nMode & BROWSER_AUTO_VSCROLL );
    2212           0 :     getDataWindow()->bNoHScroll   = BROWSER_NO_HSCROLL   == ( nMode & BROWSER_NO_HSCROLL );
    2213           0 :     getDataWindow()->bNoVScroll   = BROWSER_NO_VSCROLL   == ( nMode & BROWSER_NO_VSCROLL );
    2214             : 
    2215             :     DBG_ASSERT( !( getDataWindow()->bAutoHScroll && getDataWindow()->bNoHScroll ),
    2216             :         "BrowseBox::SetMode: AutoHScroll *and* NoHScroll?" );
    2217             :     DBG_ASSERT( !( getDataWindow()->bAutoVScroll && getDataWindow()->bNoVScroll ),
    2218             :         "BrowseBox::SetMode: AutoVScroll *and* NoVScroll?" );
    2219           0 :     if ( getDataWindow()->bAutoHScroll )
    2220           0 :         getDataWindow()->bNoHScroll = false;
    2221           0 :     if ( getDataWindow()->bAutoVScroll )
    2222           0 :         getDataWindow()->bNoVScroll = false;
    2223             : 
    2224           0 :     if ( getDataWindow()->bNoHScroll )
    2225           0 :         aHScroll.Hide();
    2226             : 
    2227           0 :     nControlAreaWidth = USHRT_MAX;
    2228             : 
    2229             :     getDataWindow()->bNoScrollBack =
    2230           0 :             BROWSER_NO_SCROLLBACK == ( nMode & BROWSER_NO_SCROLLBACK);
    2231             : 
    2232           0 :     long nOldRowSel = bMultiSelection ? uRow.pSel->FirstSelected() : uRow.nSel;
    2233           0 :     MultiSelection *pOldRowSel = bMultiSelection ? uRow.pSel : 0;
    2234           0 :     MultiSelection *pOldColSel = pColSel;
    2235             : 
    2236           0 :     delete pVScroll;
    2237             : 
    2238           0 :     bThumbDragging = ( nMode & BROWSER_THUMBDRAGGING ) == BROWSER_THUMBDRAGGING;
    2239           0 :     bMultiSelection = ( nMode & BROWSER_MULTISELECTION ) == BROWSER_MULTISELECTION;
    2240           0 :     bColumnCursor = ( nMode & BROWSER_COLUMNSELECTION ) == BROWSER_COLUMNSELECTION;
    2241           0 :     bKeepHighlight = ( nMode & BROWSER_KEEPSELECTION ) == BROWSER_KEEPSELECTION;
    2242             : 
    2243           0 :     bHideSelect = ((nMode & BROWSER_HIDESELECT) == BROWSER_HIDESELECT);
    2244             :     // default: do not hide the cursor at all (untaken scrolling and such)
    2245           0 :     bHideCursor = TRISTATE_FALSE;
    2246             : 
    2247           0 :     if ( BROWSER_SMART_HIDECURSOR == ( nMode & BROWSER_SMART_HIDECURSOR ) )
    2248             :     {   // smart cursor hide overrules hard cursor hide
    2249           0 :         bHideCursor = TRISTATE_INDET;
    2250             :     }
    2251           0 :     else if ( BROWSER_HIDECURSOR == ( nMode & BROWSER_HIDECURSOR ) )
    2252             :     {
    2253           0 :         bHideCursor = TRISTATE_TRUE;
    2254             :     }
    2255             : 
    2256           0 :     m_bFocusOnlyCursor = ((nMode & BROWSER_CURSOR_WO_FOCUS) == 0);
    2257             : 
    2258           0 :     bHLines = ( nMode & BROWSER_HLINESFULL ) == BROWSER_HLINESFULL;
    2259           0 :     bVLines = ( nMode & BROWSER_VLINESFULL ) == BROWSER_VLINESFULL;
    2260           0 :     bHDots  = ( nMode & BROWSER_HLINESDOTS ) == BROWSER_HLINESDOTS;
    2261           0 :     bVDots  = ( nMode & BROWSER_VLINESDOTS ) == BROWSER_VLINESDOTS;
    2262             : 
    2263             :     WinBits nVScrollWinBits =
    2264           0 :         WB_VSCROLL | ( ( nMode & BROWSER_THUMBDRAGGING ) ? WB_DRAG : 0 );
    2265           0 :     pVScroll = ( nMode & BROWSER_TRACKING_TIPS ) == BROWSER_TRACKING_TIPS
    2266             :                 ? new BrowserScrollBar( this, nVScrollWinBits,
    2267           0 :                                         (BrowserDataWin*) pDataWin )
    2268           0 :                 : new ScrollBar( this, nVScrollWinBits );
    2269           0 :     pVScroll->SetLineSize( 1 );
    2270           0 :     pVScroll->SetPageSize(1);
    2271           0 :     pVScroll->SetScrollHdl( LINK( this, BrowseBox, ScrollHdl ) );
    2272           0 :     pVScroll->SetEndScrollHdl( LINK( this, BrowseBox, EndScrollHdl ) );
    2273             : 
    2274             :     getDataWindow()->bAutoSizeLastCol =
    2275           0 :             BROWSER_AUTOSIZE_LASTCOL == ( nMode & BROWSER_AUTOSIZE_LASTCOL );
    2276             :     getDataWindow()->bOwnDataChangedHdl =
    2277           0 :             BROWSER_OWN_DATACHANGED == ( nMode & BROWSER_OWN_DATACHANGED );
    2278             : 
    2279             :     // create a headerbar. what happens, if a headerbar has to be created and
    2280             :     // there already are columns?
    2281           0 :     if ( BROWSER_HEADERBAR_NEW == ( nMode & BROWSER_HEADERBAR_NEW ) )
    2282             :     {
    2283           0 :         if (!getDataWindow()->pHeaderBar)
    2284           0 :             getDataWindow()->pHeaderBar = CreateHeaderBar( this );
    2285             :     }
    2286             :     else
    2287             :     {
    2288           0 :         DELETEZ(getDataWindow()->pHeaderBar);
    2289             :     }
    2290             : 
    2291             : 
    2292             : 
    2293           0 :     if ( bColumnCursor )
    2294             :     {
    2295           0 :         pColSel = pOldColSel ? pOldColSel : new MultiSelection;
    2296           0 :         pColSel->SetTotalRange( Range( 0, pCols->size()-1 ) );
    2297             :     }
    2298             :     else
    2299             :     {
    2300           0 :         pColSel = 0;
    2301           0 :         delete pColSel;
    2302             :     }
    2303             : 
    2304           0 :     if ( bMultiSelection )
    2305             :     {
    2306           0 :         if ( pOldRowSel )
    2307           0 :             uRow.pSel = pOldRowSel;
    2308             :         else
    2309           0 :             uRow.pSel = new MultiSelection;
    2310             :     }
    2311             :     else
    2312             :     {
    2313           0 :         uRow.nSel = nOldRowSel;
    2314           0 :         delete pOldRowSel;
    2315             :     }
    2316             : 
    2317           0 :     if ( bBootstrapped )
    2318             :     {
    2319           0 :         StateChanged( STATE_CHANGE_INITSHOW );
    2320           0 :         if ( bMultiSelection && !pOldRowSel &&
    2321             :              nOldRowSel != BROWSER_ENDOFSELECTION )
    2322           0 :             uRow.pSel->Select( nOldRowSel );
    2323             :     }
    2324             : 
    2325           0 :     if ( pDataWin )
    2326           0 :         pDataWin->Invalidate();
    2327             : 
    2328             :     // no cursor on handle column
    2329           0 :     if ( nCurColId == HandleColumnId )
    2330           0 :         nCurColId = GetColumnId( 1 );
    2331             : 
    2332           0 :     m_nCurrentMode = nMode;
    2333           0 : }
    2334             : 
    2335             : 
    2336             : 
    2337           0 : void BrowseBox::VisibleRowsChanged( long, sal_uInt16 )
    2338             : {
    2339             : 
    2340             :     // old behavior: automatically correct NumRows:
    2341           0 :     if ( nRowCount < GetRowCount() )
    2342             :     {
    2343           0 :         RowInserted(nRowCount,GetRowCount() - nRowCount, false);
    2344             :     }
    2345           0 :     else if ( nRowCount > GetRowCount() )
    2346             :     {
    2347           0 :         RowRemoved(nRowCount-(nRowCount - GetRowCount()),nRowCount - GetRowCount(), false);
    2348             :     }
    2349           0 : }
    2350             : 
    2351             : 
    2352             : 
    2353           0 : bool BrowseBox::IsCursorMoveAllowed( long, sal_uInt16 ) const
    2354             : 
    2355             : /*  [Description]
    2356             : 
    2357             :     This virtual method is always called before the cursor is moved directly.
    2358             :     By means of 'return sal_False', we avoid doing this if e.g. a record
    2359             :     contradicts any rules.
    2360             : 
    2361             :     This method is not called, if the cursor movement results from removing or
    2362             :     deleting a row/column (thus, in cases where only a "cursor correction" happens).
    2363             : 
    2364             :     The base implementation currently always returns true.
    2365             : */
    2366             : 
    2367             : {
    2368           0 :     return true;
    2369             : }
    2370             : 
    2371             : 
    2372             : 
    2373           0 : long BrowseBox::GetDataRowHeight() const
    2374             : {
    2375           0 :     return CalcZoom(nDataRowHeight ? nDataRowHeight : ImpGetDataRowHeight());
    2376             : }
    2377             : 
    2378             : 
    2379             : 
    2380           0 : BrowserHeader* BrowseBox::CreateHeaderBar( BrowseBox* pParent )
    2381             : {
    2382           0 :     BrowserHeader* pNewBar = new BrowserHeader( pParent );
    2383           0 :     pNewBar->SetStartDragHdl( LINK( this, BrowseBox, StartDragHdl ) );
    2384           0 :     return pNewBar;
    2385             : }
    2386             : 
    2387           0 : void BrowseBox::SetHeaderBar( BrowserHeader* pHeaderBar )
    2388             : {
    2389           0 :     delete ( (BrowserDataWin*)pDataWin )->pHeaderBar;
    2390           0 :     ( (BrowserDataWin*)pDataWin )->pHeaderBar = pHeaderBar;
    2391           0 :     ( (BrowserDataWin*)pDataWin )->pHeaderBar->SetStartDragHdl( LINK( this, BrowseBox, StartDragHdl ) );
    2392           0 : }
    2393             : 
    2394             : 
    2395             : #ifdef DBG_UTIL
    2396             : const char* BrowseBoxCheckInvariants( const void * pVoid )
    2397             : {
    2398             :     const BrowseBox * p = (const BrowseBox *)pVoid;
    2399             : 
    2400             :     if (p->nRowCount < 0) return "BrowseBox: nRowCount < 0";
    2401             :     if (p->nTopRow < 0) return "BrowseBox: nTopRow < 0";
    2402             :     if (p->nTopRow >= p->nRowCount && p->nRowCount != 0) return "BrowseBox: nTopRow >= nRowCount && nRowCount != 0";
    2403             :     if (p->nCurRow < -1) return "BrowseBox: nCurRow < -1";
    2404             :     if (p->nCurRow > p->nRowCount) return "BrowseBox: nCurRow > nRowCount";
    2405             : 
    2406             :     // Sadly not always the case when editing:
    2407             :     //if (p->nCurRow < 0 && p->nRowCount != 0) return "nCurRow < 0 && nRowCount != 0";
    2408             :     //if (p->nCurRow >= p->nRowCount && p->nRowCount != 0) return "nCurRow >= nRowCount && nRowCount != 0";
    2409             : 
    2410             :     return NULL;
    2411             : }
    2412             : #endif
    2413             : 
    2414             : 
    2415           0 : long BrowseBox::GetTitleHeight() const
    2416             : {
    2417             :     long nHeight;
    2418             :     // ask the header bar for the text height (if possible), as the header bar's font is adjusted with
    2419             :     // our (and the header's) zoom factor
    2420           0 :     HeaderBar* pHeaderBar = ( (BrowserDataWin*)pDataWin )->pHeaderBar;
    2421           0 :     if ( pHeaderBar )
    2422           0 :         nHeight = pHeaderBar->GetTextHeight();
    2423             :     else
    2424           0 :         nHeight = GetTextHeight();
    2425             : 
    2426           0 :     return nTitleLines ? nTitleLines * nHeight + 4 : 0;
    2427             : }
    2428             : 
    2429             : 
    2430           0 : long BrowseBox::CalcReverseZoom(long nVal)
    2431             : {
    2432           0 :     if (IsZoom())
    2433             :     {
    2434           0 :         const Fraction& rZoom = GetZoom();
    2435           0 :         double n = (double)nVal;
    2436           0 :         n *= (double)rZoom.GetDenominator();
    2437           0 :         n /= (double)rZoom.GetNumerator();
    2438           0 :         nVal = n>0 ? (long)(n + 0.5) : -(long)(-n + 0.5);
    2439             :     }
    2440             : 
    2441           0 :     return nVal;
    2442             : }
    2443             : 
    2444           0 : void BrowseBox::CursorMoved()
    2445             : {
    2446             :     // before implementing more here, please adjust the EditBrowseBox
    2447             : 
    2448           0 :     if ( isAccessibleAlive() && HasFocus() )
    2449             :         commitTableEvent(
    2450             :             ACTIVE_DESCENDANT_CHANGED,
    2451           0 :             makeAny( CreateAccessibleCell( GetCurRow(),GetColumnPos( GetCurColumnId() ) ) ),
    2452             :             Any()
    2453           0 :         );
    2454           0 : }
    2455             : 
    2456             : 
    2457             : 
    2458           0 : void BrowseBox::LoseFocus()
    2459             : {
    2460             :     OSL_TRACE( "BrowseBox: %p->LoseFocus", this );
    2461             : 
    2462           0 :     if ( bHasFocus )
    2463             :     {
    2464             :         OSL_TRACE( "BrowseBox: %p->HideCursor", this );
    2465           0 :         DoHideCursor( "LoseFocus" );
    2466             : 
    2467           0 :         if ( !bKeepHighlight )
    2468             :         {
    2469           0 :             ToggleSelection();
    2470           0 :             bSelectionIsVisible = false;
    2471             :         }
    2472             : 
    2473           0 :         bHasFocus = false;
    2474             :     }
    2475           0 :     Control::LoseFocus();
    2476           0 : }
    2477             : 
    2478             : 
    2479             : 
    2480           0 : void BrowseBox::GetFocus()
    2481             : {
    2482             :     OSL_TRACE( "BrowseBox: %p->GetFocus", this );
    2483             : 
    2484           0 :     if ( !bHasFocus )
    2485             :     {
    2486           0 :         if ( !bSelectionIsVisible )
    2487             :         {
    2488           0 :             bSelectionIsVisible = true;
    2489           0 :             if ( bBootstrapped )
    2490           0 :                 ToggleSelection();
    2491             :         }
    2492             : 
    2493           0 :         bHasFocus = true;
    2494           0 :         DoShowCursor( "GetFocus" );
    2495             :     }
    2496           0 :     Control::GetFocus();
    2497           0 : }
    2498             : 
    2499             : 
    2500             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10