LCOV - code coverage report
Current view: top level - svtools/source/contnr - svtabbx.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 598 0.2 %
Date: 2015-06-13 12:38:46 Functions: 2 101 2.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/svtabbx.hxx>
      21             : #include <svtools/headbar.hxx>
      22             : #include <svtools/svtresid.hxx>
      23             : #include <svtools/svlbitm.hxx>
      24             : #include <svtools/svtools.hrc>
      25             : #include <svtools/treelistentry.hxx>
      26             : #include <vcl/builderfactory.hxx>
      27             : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
      28             : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
      29             : #include "svtaccessiblefactory.hxx"
      30             : 
      31             : using namespace ::com::sun::star::uno;
      32             : using namespace ::com::sun::star::accessibility;
      33             : 
      34             : #define MYTABMASK \
      35             :     SvLBoxTabFlags( SvLBoxTabFlags::ADJUST_RIGHT | SvLBoxTabFlags::ADJUST_LEFT | SvLBoxTabFlags::ADJUST_CENTER | SvLBoxTabFlags::ADJUST_NUMERIC )
      36             : 
      37             : // SvTreeListBox callback
      38             : 
      39           0 : void SvTabListBox::SetTabs()
      40             : {
      41           0 :     SvTreeListBox::SetTabs();
      42           0 :     if( nTabCount )
      43             :     {
      44             :         DBG_ASSERT(pTabList,"TabList ?");
      45             : 
      46             :         // The tree listbox has now inserted its tabs into the list. Now we
      47             :         // fluff up the list with additional tabs and adjust the rightmost tab
      48             :         // of the tree listbox.
      49             : 
      50             :         // Picking the rightmost tab.
      51             :         // HACK for the explorer! If ViewParent != 0, the first tab of the tree
      52             :         // listbox is calculated by the tre listbox itself! This behavior is
      53             :         // necessary for ButtonsOnRoot, as the explorer does not know in this
      54             :         // case, which additional offset it need to add to the tabs in this mode
      55             :         // -- the tree listbox knows that, though!
      56             :         /*
      57             :         if( !pViewParent )
      58             :         {
      59             :         SvLBoxTab* pFirstTab = (SvLBoxTab*)aTabs.GetObject( aTabs.Count()-1 );
      60             :         pFirstTab->SetPos( pTabList[0].GetPos() );
      61             :         pFirstTab->nFlags &= ~MYTABMASK;
      62             :         pFirstTab->nFlags |= pTabList[0].nFlags;
      63             :         }
      64             :         */
      65             : 
      66             :         // append all other tabs to the list
      67           0 :         for( sal_uInt16 nCurTab = 1; nCurTab < nTabCount; nCurTab++ )
      68             :         {
      69           0 :             SvLBoxTab* pTab = pTabList+nCurTab;
      70           0 :             AddTab( pTab->GetPos(), pTab->nFlags );
      71             :         }
      72             :     }
      73           0 : }
      74             : 
      75           0 : void SvTabListBox::InitEntry(SvTreeListEntry* pEntry, const OUString& rStr,
      76             :     const Image& rColl, const Image& rExp, SvLBoxButtonKind eButtonKind)
      77             : {
      78           0 :     SvTreeListBox::InitEntry(pEntry, rStr, rColl, rExp, eButtonKind);
      79             : 
      80           0 :     sal_Int32 nIndex = 0;
      81             :     // TODO: verify if nTabCount is always >0 here!
      82           0 :     const sal_uInt16 nCount = nTabCount - 1;
      83           0 :     for( sal_uInt16 nToken = 0; nToken < nCount; nToken++ )
      84             :     {
      85           0 :         const OUString aToken = GetToken(aCurEntry, nIndex);
      86           0 :         SvLBoxString* pStr = new SvLBoxString( pEntry, 0, aToken );
      87           0 :         pEntry->AddItem( pStr );
      88           0 :     }
      89           0 : }
      90           0 : SvTabListBox::SvTabListBox( vcl::Window* pParent, WinBits nBits )
      91           0 :     : SvTreeListBox( pParent, nBits )
      92             : {
      93           0 :     pTabList = 0;
      94           0 :     nTabCount = 0;
      95           0 :     pViewParent = 0;
      96           0 :     SetHighlightRange();    // select full width
      97           0 : }
      98             : 
      99           0 : VCL_BUILDER_DECL_FACTORY(SvTabListBox)
     100             : {
     101           0 :     WinBits nWinStyle = WB_TABSTOP;
     102           0 :     OString sBorder = VclBuilder::extractCustomProperty(rMap);
     103           0 :     if (!sBorder.isEmpty())
     104           0 :         nWinStyle |= WB_BORDER;
     105           0 :     rRet = VclPtr<SvTabListBox>::Create(pParent, nWinStyle);
     106           0 : }
     107             : 
     108           0 : SvTabListBox::~SvTabListBox()
     109             : {
     110           0 :     disposeOnce();
     111           0 : }
     112             : 
     113           0 : void SvTabListBox::dispose()
     114             : {
     115             :     // delete array
     116           0 :     delete [] pTabList;
     117             : #ifdef DBG_UTIL
     118             :     pTabList = 0;
     119             :     nTabCount = 0;
     120             : #endif
     121           0 :     SvTreeListBox::dispose();
     122           0 : }
     123             : 
     124           0 : void SvTabListBox::SetTabs(const long* pTabs, MapUnit eMapUnit)
     125             : {
     126             :     DBG_ASSERT(pTabs,"SetTabs:NULL-Ptr");
     127           0 :     if( !pTabs )
     128           0 :         return;
     129             : 
     130           0 :     delete [] pTabList;
     131           0 :     sal_uInt16 nCount = (sal_uInt16)(*pTabs);
     132           0 :     pTabList = new SvLBoxTab[ nCount ];
     133           0 :     nTabCount = nCount;
     134             : 
     135           0 :     MapMode aMMSource( eMapUnit );
     136           0 :     MapMode aMMDest( MAP_PIXEL );
     137             : 
     138           0 :     pTabs++;
     139           0 :     for( sal_uInt16 nIdx = 0; nIdx < nCount; nIdx++, pTabs++ )
     140             :     {
     141           0 :         Size aSize( *pTabs, 0 );
     142           0 :         aSize = LogicToLogic( aSize, &aMMSource, &aMMDest );
     143           0 :         long nNewTab = aSize.Width();
     144           0 :         pTabList[nIdx].SetPos( nNewTab );
     145           0 :         pTabList[nIdx].nFlags=(SvLBoxTabFlags::ADJUST_LEFT| SvLBoxTabFlags::INV_ALWAYS);
     146             :     }
     147           0 :     SvTreeListBox::nTreeFlags |= SvTreeFlags::RECALCTABS;
     148           0 :     if( IsUpdateMode() )
     149           0 :         Invalidate();
     150             : }
     151             : 
     152           0 : void SvTabListBox::SetTab( sal_uInt16 nTab,long nValue,MapUnit eMapUnit )
     153             : {
     154             :     DBG_ASSERT(nTab<nTabCount,"Invalid Tab-Pos");
     155           0 :     if( nTab < nTabCount )
     156             :     {
     157             :         DBG_ASSERT(pTabList,"TabList?");
     158           0 :         MapMode aMMSource( eMapUnit );
     159           0 :         MapMode aMMDest( MAP_PIXEL );
     160           0 :         Size aSize( nValue, 0 );
     161           0 :         aSize = LogicToLogic( aSize, &aMMSource, &aMMDest );
     162           0 :         nValue = aSize.Width();
     163           0 :         pTabList[ nTab ].SetPos( nValue );
     164           0 :         SvTreeListBox::nTreeFlags |= SvTreeFlags::RECALCTABS;
     165           0 :         if( IsUpdateMode() )
     166           0 :             Invalidate();
     167             :     }
     168           0 : }
     169             : 
     170           0 : SvTreeListEntry* SvTabListBox::InsertEntry( const OUString& rText, SvTreeListEntry* pParent,
     171             :                                         bool /*bChildrenOnDemand*/,
     172             :                                         sal_uLong nPos, void* pUserData,
     173             :                                         SvLBoxButtonKind )
     174             : {
     175           0 :     return InsertEntryToColumn( rText, pParent, nPos, 0xffff, pUserData );
     176             : }
     177             : 
     178           0 : SvTreeListEntry* SvTabListBox::InsertEntry( const OUString& rText,
     179             :                                         const Image& rExpandedEntryBmp,
     180             :                                         const Image& rCollapsedEntryBmp,
     181             :                                         SvTreeListEntry* pParent,
     182             :                                         bool /*bChildrenOnDemand*/,
     183             :                                         sal_uLong nPos, void* pUserData,
     184             :                                         SvLBoxButtonKind )
     185             : {
     186             :     return InsertEntryToColumn( rText, rExpandedEntryBmp, rCollapsedEntryBmp,
     187           0 :                                 pParent, nPos, 0xffff, pUserData );
     188             : }
     189             : 
     190           0 : SvTreeListEntry* SvTabListBox::InsertEntryToColumn(const OUString& rStr,SvTreeListEntry* pParent,sal_uLong nPos,sal_uInt16 nCol,
     191             :     void* pUser )
     192             : {
     193           0 :     OUString aStr;
     194           0 :     if( nCol != 0xffff )
     195             :     {
     196           0 :         while( nCol )
     197             :         {
     198           0 :             aStr += "\t";
     199           0 :             nCol--;
     200             :         }
     201             :     }
     202           0 :     aStr += rStr;
     203           0 :     OUString aFirstStr( aStr );
     204           0 :     sal_Int32 nEnd = aFirstStr.indexOf( '\t' );
     205           0 :     if( nEnd != -1 )
     206             :     {
     207           0 :         aFirstStr = aFirstStr.copy(0, nEnd);
     208           0 :         aCurEntry = aStr.copy(++nEnd);
     209             :     }
     210             :     else
     211           0 :         aCurEntry.clear();
     212           0 :     return SvTreeListBox::InsertEntry( aFirstStr, pParent, false, nPos, pUser );
     213             : }
     214             : 
     215           0 : SvTreeListEntry* SvTabListBox::InsertEntryToColumn( const OUString& rStr,
     216             :     const Image& rExpandedEntryBmp, const Image& rCollapsedEntryBmp,
     217             :     SvTreeListEntry* pParent,sal_uLong nPos,sal_uInt16 nCol, void* pUser )
     218             : {
     219           0 :     OUString aStr;
     220           0 :     if( nCol != 0xffff )
     221             :     {
     222           0 :         while( nCol )
     223             :         {
     224           0 :             aStr += "\t";
     225           0 :             nCol--;
     226             :         }
     227             :     }
     228           0 :     aStr += rStr;
     229           0 :     OUString aFirstStr( aStr );
     230           0 :     sal_Int32 nEnd = aFirstStr.indexOf('\t');
     231           0 :     if (nEnd != -1)
     232             :     {
     233           0 :         aFirstStr = aFirstStr.copy(0, nEnd);
     234           0 :         aCurEntry = aStr.copy(++nEnd);
     235             :     }
     236             :     else
     237           0 :         aCurEntry.clear();
     238             : 
     239             :     return SvTreeListBox::InsertEntry(
     240             :         aFirstStr,
     241             :         rExpandedEntryBmp, rCollapsedEntryBmp,
     242           0 :         pParent, false, nPos, pUser );
     243             : }
     244             : 
     245           0 : SvTreeListEntry* SvTabListBox::InsertEntryToColumn( const OUString& rStr, sal_uLong nPos,
     246             :     sal_uInt16 nCol, void* pUser )
     247             : {
     248           0 :     return InsertEntryToColumn( rStr,0,nPos, nCol, pUser );
     249             : }
     250             : 
     251           0 : OUString SvTabListBox::GetEntryText( SvTreeListEntry* pEntry ) const
     252             : {
     253           0 :     return GetEntryText( pEntry, 0xffff );
     254             : }
     255             : 
     256           0 : OUString SvTabListBox::GetEntryText( SvTreeListEntry* pEntry, sal_uInt16 nCol )
     257             : {
     258             :     DBG_ASSERT(pEntry,"GetEntryText:Invalid Entry");
     259           0 :     OUString aResult;
     260           0 :     if( pEntry )
     261             :     {
     262           0 :         sal_uInt16 nCount = pEntry->ItemCount();
     263           0 :         sal_uInt16 nCur = 0;
     264           0 :         while( nCur < nCount )
     265             :         {
     266           0 :             const SvLBoxItem* pStr = pEntry->GetItem( nCur );
     267           0 :             if (pStr->GetType() == SV_ITEM_ID_LBOXSTRING)
     268             :             {
     269           0 :                 if( nCol == 0xffff )
     270             :                 {
     271           0 :                     if (!aResult.isEmpty())
     272           0 :                         aResult += "\t";
     273           0 :                     aResult += static_cast<const SvLBoxString*>(pStr)->GetText();
     274             :                 }
     275             :                 else
     276             :                 {
     277           0 :                     if( nCol == 0 )
     278           0 :                         return static_cast<const SvLBoxString*>(pStr)->GetText();
     279           0 :                     nCol--;
     280             :                 }
     281             :             }
     282           0 :             nCur++;
     283             :         }
     284             :     }
     285           0 :     return aResult;
     286             : }
     287             : 
     288           0 : OUString SvTabListBox::GetEntryText( sal_uLong nPos, sal_uInt16 nCol ) const
     289             : {
     290           0 :     SvTreeListEntry* pEntry = GetEntryOnPos( nPos );
     291           0 :     return GetEntryText( pEntry, nCol );
     292             : }
     293             : 
     294           0 : void SvTabListBox::SetEntryText(const OUString& rStr, sal_uLong nPos, sal_uInt16 nCol)
     295             : {
     296           0 :     SvTreeListEntry* pEntry = SvTreeListBox::GetEntry( nPos );
     297           0 :     SetEntryText( rStr, pEntry, nCol );
     298           0 : }
     299             : 
     300           0 : void SvTabListBox::SetEntryText(const OUString& rStr, SvTreeListEntry* pEntry, sal_uInt16 nCol)
     301             : {
     302             :     DBG_ASSERT(pEntry,"SetEntryText:Invalid Entry");
     303           0 :     if( !pEntry )
     304           0 :         return;
     305             : 
     306           0 :     OUString sOldText = GetEntryText(pEntry, nCol);
     307           0 :     if (sOldText == rStr)
     308           0 :         return;
     309             : 
     310           0 :     sal_Int32 nIndex = 0;
     311           0 :     const sal_uInt16 nTextColumn = nCol;
     312           0 :     const sal_uInt16 nCount = pEntry->ItemCount();
     313           0 :     for (sal_uInt16 nCur = 0; nCur < nCount; ++nCur)
     314             :     {
     315           0 :         SvLBoxItem* pStr = pEntry->GetItem( nCur );
     316           0 :         if (pStr && pStr->GetType() == SV_ITEM_ID_LBOXSTRING)
     317             :         {
     318           0 :             if (!nCol || nCol==0xFFFF)
     319             :             {
     320           0 :                 const OUString aTemp(GetToken(rStr, nIndex));
     321           0 :                 static_cast<SvLBoxString*>(pStr)->SetText( aTemp );
     322           0 :                 if (!nCol && nIndex<0)
     323           0 :                     break;
     324             :             }
     325             :             else
     326             :             {
     327           0 :                 --nCol;
     328             :             }
     329             :         }
     330             :     }
     331           0 :     GetModel()->InvalidateEntry( pEntry );
     332             : 
     333           0 :     TabListBoxEventData* pData = new TabListBoxEventData( pEntry, nTextColumn, sOldText );
     334           0 :     CallEventListeners( VCLEVENT_TABLECELL_NAMECHANGED, pData );
     335           0 :     delete pData;
     336             : }
     337             : 
     338           0 : OUString SvTabListBox::GetCellText( sal_uLong nPos, sal_uInt16 nCol ) const
     339             : {
     340           0 :     SvTreeListEntry* pEntry = GetEntryOnPos( nPos );
     341             :     DBG_ASSERT( pEntry, "SvTabListBox::GetCellText(): Invalid Entry" );
     342           0 :     OUString aResult;
     343           0 :     if (pEntry && pEntry->ItemCount() > static_cast<size_t>(nCol+1))
     344             :     {
     345           0 :         const SvLBoxItem* pStr = pEntry->GetItem( nCol + 1 );
     346           0 :         if (pStr && pStr->GetType() == SV_ITEM_ID_LBOXSTRING)
     347           0 :             aResult = static_cast<const SvLBoxString*>(pStr)->GetText();
     348             :     }
     349           0 :     return aResult;
     350             : }
     351             : 
     352           0 : sal_uLong SvTabListBox::GetEntryPos( const OUString& rStr, sal_uInt16 nCol )
     353             : {
     354           0 :     sal_uLong nPos = 0;
     355           0 :     SvTreeListEntry* pEntry = First();
     356           0 :     while( pEntry )
     357             :     {
     358           0 :         OUString aStr( GetEntryText( pEntry, nCol ));
     359           0 :         if( aStr == rStr )
     360           0 :             return nPos;
     361           0 :         pEntry = Next( pEntry );
     362           0 :         nPos++;
     363           0 :     }
     364           0 :     return 0xffffffff;
     365             : }
     366             : 
     367           0 : sal_uLong SvTabListBox::GetEntryPos( const SvTreeListEntry* pEntry ) const
     368             : {
     369           0 :     sal_uLong nPos = 0;
     370           0 :     SvTreeListEntry* pTmpEntry = First();
     371           0 :     while( pTmpEntry )
     372             :     {
     373           0 :         if ( pTmpEntry == pEntry )
     374           0 :             return nPos;
     375           0 :         pTmpEntry = Next( pTmpEntry );
     376           0 :         ++nPos;
     377             :     }
     378           0 :     return 0xffffffff;
     379             : }
     380             : 
     381           0 : void SvTabListBox::Resize()
     382             : {
     383           0 :     SvTreeListBox::Resize();
     384           0 : }
     385             : 
     386             : // static
     387           0 : OUString SvTabListBox::GetToken( const OUString &sStr, sal_Int32& nIndex )
     388             : {
     389           0 :     return sStr.getToken(0, '\t', nIndex);
     390             : }
     391             : 
     392           0 : OUString SvTabListBox::GetTabEntryText( sal_uLong nPos, sal_uInt16 nCol ) const
     393             : {
     394           0 :     SvTreeListEntry* pEntry = SvTreeListBox::GetEntry( nPos );
     395             :     DBG_ASSERT( pEntry, "GetTabEntryText(): Invalid entry " );
     396           0 :     OUString aResult;
     397           0 :     if ( pEntry )
     398             :     {
     399           0 :         sal_uInt16 nCount = pEntry->ItemCount();
     400           0 :         sal_uInt16 nCur = ( 0 == nCol && IsCellFocusEnabled() ) ? GetCurrentTabPos() : 0;
     401           0 :         while( nCur < nCount )
     402             :         {
     403           0 :             const SvLBoxItem* pStr = pEntry->GetItem( nCur );
     404           0 :             if (pStr->GetType() == SV_ITEM_ID_LBOXSTRING)
     405             :             {
     406           0 :                 if ( nCol == 0xffff )
     407             :                 {
     408           0 :                     if (!aResult.isEmpty())
     409           0 :                         aResult += "\t";
     410           0 :                     aResult += static_cast<const SvLBoxString*>(pStr)->GetText();
     411             :                 }
     412             :                 else
     413             :                 {
     414           0 :                     if ( nCol == 0 )
     415             :                     {
     416           0 :                         OUString sRet = static_cast<const SvLBoxString*>(pStr)->GetText();
     417           0 :                         if ( sRet.isEmpty() )
     418           0 :                             sRet = SVT_RESSTR( STR_SVT_ACC_EMPTY_FIELD );
     419           0 :                         return sRet;
     420             :                     }
     421           0 :                     --nCol;
     422             :                 }
     423             :             }
     424           0 :             ++nCur;
     425             :         }
     426             :     }
     427           0 :     return aResult;
     428             : }
     429             : 
     430           0 : SvTreeListEntry* SvTabListBox::GetEntryOnPos( sal_uLong _nEntryPos ) const
     431             : {
     432           0 :     SvTreeListEntry* pEntry = NULL;
     433           0 :     sal_uLong i, nPos = 0, nCount = GetLevelChildCount( NULL );
     434           0 :     for ( i = 0; i < nCount; ++i )
     435             :     {
     436           0 :         SvTreeListEntry* pParent = GetEntry(i);
     437           0 :         if ( nPos == _nEntryPos )
     438             :         {
     439           0 :             pEntry = pParent;
     440           0 :             break;
     441             :         }
     442             :         else
     443             :         {
     444           0 :             nPos++;
     445           0 :             pEntry = GetChildOnPos( pParent, _nEntryPos, nPos );
     446           0 :             if ( pEntry )
     447           0 :                 break;
     448             :         }
     449             :     }
     450             : 
     451           0 :     return pEntry;
     452             : }
     453             : 
     454           0 : SvTreeListEntry* SvTabListBox::GetChildOnPos( SvTreeListEntry* _pParent, sal_uLong _nEntryPos, sal_uLong& _rPos ) const
     455             : {
     456           0 :     sal_uLong i, nCount = GetLevelChildCount( _pParent );
     457           0 :     for ( i = 0; i < nCount; ++i )
     458             :     {
     459           0 :         SvTreeListEntry* pParent = GetEntry( _pParent, i );
     460           0 :         if ( _rPos == _nEntryPos )
     461           0 :             return pParent;
     462             :         else
     463             :         {
     464           0 :             _rPos++;
     465           0 :             SvTreeListEntry* pEntry = GetChildOnPos( pParent, _nEntryPos, _rPos );
     466           0 :             if ( pEntry )
     467           0 :                 return pEntry;
     468             :         }
     469             :     }
     470             : 
     471           0 :     return NULL;
     472             : }
     473             : 
     474           0 : void SvTabListBox::SetTabJustify( sal_uInt16 nTab, SvTabJustify eJustify)
     475             : {
     476           0 :     if( nTab >= nTabCount )
     477           0 :         return;
     478           0 :     SvLBoxTab* pTab = &(pTabList[ nTab ]);
     479           0 :     SvLBoxTabFlags nFlags = pTab->nFlags;
     480           0 :     nFlags &= (~MYTABMASK);
     481           0 :     nFlags |= static_cast<SvLBoxTabFlags>(eJustify);
     482           0 :     pTab->nFlags = nFlags;
     483           0 :     SvTreeListBox::nTreeFlags |= SvTreeFlags::RECALCTABS;
     484           0 :     if( IsUpdateMode() )
     485           0 :         Invalidate();
     486             : }
     487             : 
     488           0 : long SvTabListBox::GetLogicTab( sal_uInt16 nTab )
     489             : {
     490           0 :     if( SvTreeListBox::nTreeFlags & SvTreeFlags::RECALCTABS )
     491           0 :         SetTabs();
     492             : 
     493             :     DBG_ASSERT(nTab<nTabCount,"GetTabPos:Invalid Tab");
     494           0 :     return aTabs[ nTab ]->GetPos();
     495             : }
     496             : 
     497             : namespace svt
     498             : {
     499           0 :     struct SvHeaderTabListBoxImpl
     500             :     {
     501             :         VclPtr<HeaderBar>       m_pHeaderBar;
     502             :         AccessibleFactoryAccess m_aFactoryAccess;
     503             : 
     504           0 :         SvHeaderTabListBoxImpl() : m_pHeaderBar( NULL ) { }
     505             :     };
     506             : }
     507             : 
     508           0 : SvHeaderTabListBox::SvHeaderTabListBox( vcl::Window* pParent, WinBits nWinStyle )
     509             :     : SvTabListBox(pParent, nWinStyle)
     510             :     , m_bFirstPaint(true)
     511           0 :     , m_pImpl(new ::svt::SvHeaderTabListBoxImpl)
     512           0 :     , m_pAccessible(NULL)
     513             : {
     514           0 : }
     515             : 
     516           0 : SvHeaderTabListBox::~SvHeaderTabListBox()
     517             : {
     518           0 :     disposeOnce();
     519           0 : }
     520             : 
     521           0 : void SvHeaderTabListBox::dispose()
     522             : {
     523           0 :     delete m_pImpl;
     524           0 :     SvTabListBox::dispose();
     525           0 : }
     526             : 
     527           0 : void SvHeaderTabListBox::Paint( vcl::RenderContext& rRenderContext, const Rectangle& rRect )
     528             : {
     529           0 :     if (m_bFirstPaint)
     530             :     {
     531           0 :         m_bFirstPaint = false;
     532             :     }
     533           0 :     SvTabListBox::Paint(rRenderContext, rRect);
     534           0 : }
     535             : 
     536           0 : void SvHeaderTabListBox::InitHeaderBar( HeaderBar* pHeaderBar )
     537             : {
     538             :     DBG_ASSERT( !m_pImpl->m_pHeaderBar, "header bar already initialized" );
     539             :     DBG_ASSERT( pHeaderBar, "invalid header bar initialization" );
     540           0 :     m_pImpl->m_pHeaderBar = pHeaderBar;
     541           0 :     SetScrolledHdl( LINK( this, SvHeaderTabListBox, ScrollHdl_Impl ) );
     542           0 :     m_pImpl->m_pHeaderBar->SetCreateAccessibleHdl( LINK( this, SvHeaderTabListBox, CreateAccessibleHdl_Impl ) );
     543           0 : }
     544             : 
     545           0 : bool SvHeaderTabListBox::IsItemChecked( SvTreeListEntry* pEntry, sal_uInt16 nCol )
     546             : {
     547           0 :     SvButtonState eState = SV_BUTTON_UNCHECKED;
     548           0 :     SvLBoxButton* pItem = static_cast<SvLBoxButton*>( pEntry->GetItem( nCol + 1 ) );
     549             : 
     550           0 :     if (pItem && pItem->GetType() == SV_ITEM_ID_LBOXBUTTON)
     551             :     {
     552           0 :         SvItemStateFlags nButtonFlags = pItem->GetButtonFlags();
     553           0 :         eState = SvLBoxButtonData::ConvertToButtonState( nButtonFlags );
     554             :     }
     555             : 
     556           0 :     return ( eState == SV_BUTTON_CHECKED );
     557             : }
     558             : 
     559           0 : SvTreeListEntry* SvHeaderTabListBox::InsertEntryToColumn(
     560             :     const OUString& rStr, sal_uLong nPos, sal_uInt16 nCol, void* pUserData )
     561             : {
     562           0 :     SvTreeListEntry* pEntry = SvTabListBox::InsertEntryToColumn( rStr, nPos, nCol, pUserData );
     563           0 :     RecalculateAccessibleChildren();
     564           0 :     return pEntry;
     565             : }
     566             : 
     567           0 : SvTreeListEntry* SvHeaderTabListBox::InsertEntryToColumn(
     568             :     const OUString& rStr, SvTreeListEntry* pParent, sal_uLong nPos, sal_uInt16 nCol, void* pUserData )
     569             : {
     570           0 :     SvTreeListEntry* pEntry = SvTabListBox::InsertEntryToColumn( rStr, pParent, nPos, nCol, pUserData );
     571           0 :     RecalculateAccessibleChildren();
     572           0 :     return pEntry;
     573             : }
     574             : 
     575           0 : SvTreeListEntry* SvHeaderTabListBox::InsertEntryToColumn(
     576             :     const OUString& rStr, const Image& rExpandedEntryBmp, const Image& rCollapsedEntryBmp,
     577             :     SvTreeListEntry* pParent, sal_uLong nPos, sal_uInt16 nCol, void* pUserData )
     578             : {
     579             :     SvTreeListEntry* pEntry = SvTabListBox::InsertEntryToColumn(
     580           0 :         rStr, rExpandedEntryBmp, rCollapsedEntryBmp, pParent, nPos, nCol, pUserData );
     581           0 :     RecalculateAccessibleChildren();
     582           0 :     return pEntry;
     583             : }
     584             : 
     585           0 : sal_uLong SvHeaderTabListBox::Insert(
     586             :     SvTreeListEntry* pEnt, SvTreeListEntry* pPar, sal_uLong nPos )
     587             : {
     588           0 :     sal_uLong n = SvTabListBox::Insert( pEnt, pPar, nPos );
     589           0 :     RecalculateAccessibleChildren();
     590           0 :     return n;
     591             : }
     592             : 
     593           0 : sal_uLong SvHeaderTabListBox::Insert( SvTreeListEntry* pEntry, sal_uLong nRootPos )
     594             : {
     595           0 :     sal_uLong nPos = SvTabListBox::Insert( pEntry, nRootPos );
     596           0 :     RecalculateAccessibleChildren();
     597           0 :     return nPos;
     598             : }
     599             : 
     600           0 : void SvHeaderTabListBox::RemoveEntry( SvTreeListEntry* _pEntry )
     601             : {
     602           0 :     GetModel()->Remove( _pEntry );
     603           0 :     m_aAccessibleChildren.clear();
     604           0 : }
     605             : 
     606           0 : void SvHeaderTabListBox::Clear()
     607             : {
     608           0 :     SvTabListBox::Clear();
     609           0 :     m_aAccessibleChildren.clear();
     610           0 : }
     611             : 
     612           0 : IMPL_LINK_NOARG(SvHeaderTabListBox, ScrollHdl_Impl)
     613             : {
     614           0 :     m_pImpl->m_pHeaderBar->SetOffset( -GetXOffset() );
     615           0 :     return 0;
     616             : }
     617             : 
     618           0 : IMPL_LINK_NOARG(SvHeaderTabListBox, CreateAccessibleHdl_Impl)
     619             : {
     620           0 :     vcl::Window* pParent = m_pImpl->m_pHeaderBar->GetAccessibleParentWindow();
     621             :     DBG_ASSERT( pParent, "SvHeaderTabListBox..CreateAccessibleHdl_Impl - accessible parent not found" );
     622           0 :     if ( pParent )
     623             :     {
     624           0 :         ::com::sun::star::uno::Reference< XAccessible > xAccParent = pParent->GetAccessible();
     625           0 :         if ( xAccParent.is() )
     626             :         {
     627           0 :             Reference< XAccessible > xAccessible = m_pImpl->m_aFactoryAccess.getFactory().createAccessibleBrowseBoxHeaderBar(
     628           0 :                 xAccParent, *this, ::svt::BBTYPE_COLUMNHEADERBAR );
     629           0 :             m_pImpl->m_pHeaderBar->SetAccessible( xAccessible );
     630           0 :         }
     631             :     }
     632           0 :     return 0;
     633             : }
     634             : 
     635           0 : void SvHeaderTabListBox::RecalculateAccessibleChildren()
     636             : {
     637           0 :     if ( !m_aAccessibleChildren.empty() )
     638             :     {
     639           0 :         sal_uInt32 nCount = ( GetRowCount() + 1 ) * GetColumnCount();
     640           0 :         if ( m_aAccessibleChildren.size() < nCount )
     641           0 :             m_aAccessibleChildren.resize( nCount );
     642             :         else
     643             :         {
     644             :             DBG_ASSERT( m_aAccessibleChildren.size() == nCount, "wrong children count" );
     645             :         }
     646             :     }
     647           0 : }
     648             : 
     649           0 : bool SvHeaderTabListBox::IsCellCheckBox( long _nRow, sal_uInt16 _nColumn, TriState& _rState )
     650             : {
     651           0 :     bool bRet = false;
     652           0 :     SvTreeListEntry* pEntry = GetEntry( _nRow );
     653           0 :     if ( pEntry )
     654             :     {
     655           0 :         sal_uInt16 nItemCount = pEntry->ItemCount();
     656           0 :         if ( nItemCount > ( _nColumn + 1 ) )
     657             :         {
     658           0 :             SvLBoxButton* pItem = static_cast<SvLBoxButton*>( pEntry->GetItem( _nColumn + 1 ) );
     659           0 :             if (pItem && pItem->GetType() == SV_ITEM_ID_LBOXBUTTON)
     660             :             {
     661           0 :                 bRet = true;
     662           0 :                 _rState = ( ( pItem->GetButtonFlags() & SvItemStateFlags::UNCHECKED ) == SvItemStateFlags::NONE )
     663           0 :                             ? TRISTATE_TRUE : TRISTATE_FALSE;
     664             :             }
     665             :         }
     666             :         else
     667             :         {
     668             :             SAL_WARN( "svtools.contnr", "SvHeaderTabListBox::IsCellCheckBox(): column out of range" );
     669             :         }
     670             :     }
     671           0 :     return bRet;
     672             : }
     673           0 : long SvHeaderTabListBox::GetRowCount() const
     674             : {
     675           0 :     return GetEntryCount();
     676             : }
     677             : 
     678           0 : sal_uInt16 SvHeaderTabListBox::GetColumnCount() const
     679             : {
     680           0 :     return m_pImpl->m_pHeaderBar->GetItemCount();
     681             : }
     682             : 
     683           0 : sal_Int32 SvHeaderTabListBox::GetCurrRow() const
     684             : {
     685           0 :     sal_Int32 nRet = -1;
     686           0 :     SvTreeListEntry* pEntry = GetCurEntry();
     687           0 :     if ( pEntry )
     688             :     {
     689           0 :         sal_uLong nCount = GetEntryCount();
     690           0 :         for ( sal_uLong i = 0; i < nCount; ++i )
     691             :         {
     692           0 :             if ( pEntry == GetEntry(i) )
     693             :             {
     694           0 :                 nRet = i;
     695           0 :                 break;
     696             :             }
     697             :         }
     698             :     }
     699             : 
     700           0 :     return nRet;
     701             : }
     702             : 
     703           0 : sal_uInt16 SvHeaderTabListBox::GetCurrColumn() const
     704             : {
     705           0 :     sal_uInt16 nPos = GetCurrentTabPos() - 1;
     706           0 :     return nPos;
     707             : }
     708             : 
     709           0 : OUString SvHeaderTabListBox::GetRowDescription( sal_Int32 _nRow ) const
     710             : {
     711           0 :     return OUString( GetEntryText( _nRow ) );
     712             : }
     713             : 
     714           0 : OUString SvHeaderTabListBox::GetColumnDescription( sal_uInt16 _nColumn ) const
     715             : {
     716           0 :     return OUString( m_pImpl->m_pHeaderBar->GetItemText( m_pImpl->m_pHeaderBar->GetItemId( _nColumn ) ) );
     717             : }
     718             : 
     719           0 : bool SvHeaderTabListBox::HasRowHeader() const
     720             : {
     721           0 :     return false;
     722             : }
     723             : 
     724           0 : bool SvHeaderTabListBox::IsCellFocusable() const
     725             : {
     726           0 :     return IsCellFocusEnabled();
     727             : }
     728             : 
     729           0 : bool SvHeaderTabListBox::GoToCell( sal_Int32 _nRow, sal_uInt16 _nColumn )
     730             : {
     731           0 :     bool bRet = IsCellFocusEnabled();
     732           0 :     if ( bRet )
     733             :     {
     734             :         // first set cursor to _nRow
     735           0 :         SetCursor( GetEntry( _nRow ), true );
     736             :         // then set the focus into _nColumn
     737           0 :         bRet = SetCurrentTabPos( _nColumn );
     738             :     }
     739           0 :     return bRet;
     740             : }
     741             : 
     742           0 : void SvHeaderTabListBox::SetNoSelection()
     743             : {
     744           0 :     SvTreeListBox::SelectAll(false);
     745           0 : }
     746             : 
     747           0 : void SvHeaderTabListBox::SelectAll()
     748             : {
     749           0 :     SvTreeListBox::SelectAll(true);
     750           0 : }
     751             : 
     752           0 : void SvHeaderTabListBox::SelectAll( bool bSelect, bool bPaint )
     753             : {
     754             :     // overwritten just to disambiguate the SelectAll() from the base' class SelectAll( bool, bool )
     755           0 :     SvTabListBox::SelectAll( bSelect, bPaint );
     756           0 : }
     757           0 : void SvHeaderTabListBox::SelectRow( long _nRow, bool _bSelect, bool )
     758             : {
     759           0 :     Select( GetEntry( _nRow ), _bSelect );
     760           0 : }
     761             : 
     762           0 : void SvHeaderTabListBox::SelectColumn( sal_uInt16, bool )
     763             : {
     764           0 : }
     765             : 
     766           0 : sal_Int32 SvHeaderTabListBox::GetSelectedRowCount() const
     767             : {
     768           0 :     return GetSelectionCount();
     769             : }
     770             : 
     771           0 : sal_Int32 SvHeaderTabListBox::GetSelectedColumnCount() const
     772             : {
     773           0 :     return 0;
     774             : }
     775             : 
     776           0 : bool SvHeaderTabListBox::IsRowSelected( long _nRow ) const
     777             : {
     778           0 :     SvTreeListEntry* pEntry = GetEntry( _nRow );
     779           0 :     return ( pEntry && IsSelected( pEntry ) );
     780             : }
     781             : 
     782           0 : bool SvHeaderTabListBox::IsColumnSelected( long ) const
     783             : {
     784           0 :     return false;
     785             : }
     786             : 
     787           0 : void SvHeaderTabListBox::GetAllSelectedRows( ::com::sun::star::uno::Sequence< sal_Int32 >& ) const
     788             : {
     789           0 : }
     790             : 
     791           0 : void SvHeaderTabListBox::GetAllSelectedColumns( ::com::sun::star::uno::Sequence< sal_Int32 >& ) const
     792             : {
     793           0 : }
     794             : 
     795           0 : bool SvHeaderTabListBox::IsCellVisible( sal_Int32, sal_uInt16 ) const
     796             : {
     797           0 :     return true;
     798             : }
     799             : 
     800           0 : OUString SvHeaderTabListBox::GetAccessibleCellText( long _nRow, sal_uInt16 _nColumnPos ) const
     801             : {
     802           0 :     return GetTabEntryText(_nRow, _nColumnPos);
     803             : }
     804             : 
     805           0 : Rectangle SvHeaderTabListBox::calcHeaderRect( bool _bIsColumnBar, bool _bOnScreen )
     806             : {
     807           0 :     Rectangle aRect;
     808           0 :     if ( _bIsColumnBar )
     809             :     {
     810           0 :         vcl::Window* pParent = NULL;
     811           0 :         if ( !_bOnScreen )
     812           0 :             pParent = m_pImpl->m_pHeaderBar->GetAccessibleParentWindow();
     813             : 
     814           0 :         aRect = m_pImpl->m_pHeaderBar->GetWindowExtentsRelative( pParent );
     815             :     }
     816           0 :     return aRect;
     817             : }
     818             : 
     819           0 : Rectangle SvHeaderTabListBox::calcTableRect( bool _bOnScreen )
     820             : {
     821           0 :     vcl::Window* pParent = NULL;
     822           0 :     if ( !_bOnScreen )
     823           0 :         pParent = GetAccessibleParentWindow();
     824             : 
     825           0 :     Rectangle aRect( GetWindowExtentsRelative( pParent ) );
     826           0 :     return aRect;
     827             : }
     828             : 
     829           0 : Rectangle SvHeaderTabListBox::GetFieldRectPixelAbs( sal_Int32 _nRow, sal_uInt16 _nColumn, bool _bIsHeader, bool _bOnScreen )
     830             : {
     831             :     DBG_ASSERT( !_bIsHeader || 0 == _nRow, "invalid parameters" );
     832           0 :     Rectangle aRect;
     833           0 :     SvTreeListEntry* pEntry = GetEntry( _nRow );
     834           0 :     if ( pEntry )
     835             :     {
     836           0 :         aRect = _bIsHeader ? calcHeaderRect( true, false ) : GetBoundingRect( pEntry );
     837           0 :         Point aTopLeft = aRect.TopLeft();
     838             :         DBG_ASSERT( m_pImpl->m_pHeaderBar->GetItemCount() > _nColumn, "invalid column" );
     839           0 :         Rectangle aItemRect = m_pImpl->m_pHeaderBar->GetItemRect( m_pImpl->m_pHeaderBar->GetItemId( _nColumn ) );
     840           0 :         aTopLeft.X() = aItemRect.Left();
     841           0 :         Size aSize = aItemRect.GetSize();
     842           0 :         aRect = Rectangle( aTopLeft, aSize );
     843           0 :         vcl::Window* pParent = NULL;
     844           0 :         if ( !_bOnScreen )
     845           0 :             pParent = GetAccessibleParentWindow();
     846           0 :         aTopLeft = aRect.TopLeft();
     847           0 :         aTopLeft += GetWindowExtentsRelative( pParent ).TopLeft();
     848           0 :         aRect = Rectangle( aTopLeft, aRect.GetSize() );
     849             :     }
     850             : 
     851           0 :     return aRect;
     852             : }
     853             : 
     854           0 : Reference< XAccessible > SvHeaderTabListBox::CreateAccessibleCell( sal_Int32 _nRow, sal_uInt16 _nColumnPos )
     855             : {
     856             :     OSL_ENSURE( m_pAccessible, "Invalid call: Accessible is null" );
     857             : 
     858           0 :     Reference< XAccessible > xChild;
     859           0 :     sal_Int32 nIndex = -1;
     860             : 
     861           0 :     if ( !AreChildrenTransient() )
     862             :     {
     863           0 :         const sal_uInt16 nColumnCount = GetColumnCount();
     864             : 
     865             :         // first call? -> initial list
     866           0 :         if ( m_aAccessibleChildren.empty() )
     867             :         {
     868           0 :             sal_Int32 nCount = ( GetRowCount() + 1 ) * nColumnCount;
     869           0 :             m_aAccessibleChildren.assign( nCount, Reference< XAccessible >() );
     870             :         }
     871             : 
     872           0 :         nIndex = ( _nRow * nColumnCount ) + _nColumnPos + nColumnCount;
     873           0 :         xChild = m_aAccessibleChildren[ nIndex ];
     874             :     }
     875             : 
     876           0 :     if ( !xChild.is() )
     877             :     {
     878           0 :         TriState eState = TRISTATE_INDET;
     879           0 :         bool bIsCheckBox = IsCellCheckBox( _nRow, _nColumnPos, eState );
     880           0 :         if ( bIsCheckBox )
     881           0 :             xChild = m_pImpl->m_aFactoryAccess.getFactory().createAccessibleCheckBoxCell(
     882           0 :                 m_pAccessible->getHeaderBar(), *this, NULL, _nRow, _nColumnPos, eState, false );
     883             :         else
     884           0 :             xChild = m_pImpl->m_aFactoryAccess.getFactory().createAccessibleBrowseBoxTableCell(
     885           0 :                 m_pAccessible->getHeaderBar(), *this, NULL, _nRow, _nColumnPos, OFFSET_NONE );
     886             : 
     887             :         // insert into list
     888           0 :         if ( !AreChildrenTransient() )
     889           0 :             m_aAccessibleChildren[ nIndex ] = xChild;
     890             :     }
     891             : 
     892           0 :     return xChild;
     893             : }
     894             : 
     895           0 : Reference< XAccessible > SvHeaderTabListBox::CreateAccessibleRowHeader( sal_Int32 )
     896             : {
     897           0 :     Reference< XAccessible > xHeader;
     898           0 :     return xHeader;
     899             : }
     900             : 
     901           0 : Reference< XAccessible > SvHeaderTabListBox::CreateAccessibleColumnHeader( sal_uInt16 _nColumn )
     902             : {
     903             :     // first call? -> initial list
     904           0 :     if ( m_aAccessibleChildren.empty() )
     905             :     {
     906           0 :         const sal_uInt16 nColumnCount = GetColumnCount();
     907           0 :         sal_Int32 nCount = AreChildrenTransient() ?
     908           0 :                 nColumnCount : ( GetRowCount() + 1 ) * nColumnCount;
     909           0 :         m_aAccessibleChildren.assign( nCount, Reference< XAccessible >() );
     910             :     }
     911             : 
     912             :     // get header
     913           0 :     Reference< XAccessible > xChild = m_aAccessibleChildren[ _nColumn ];
     914             :     // already exists?
     915           0 :     if ( !xChild.is() && m_pAccessible )
     916             :     {
     917             :         // no -> create new header cell
     918           0 :         xChild = m_pImpl->m_aFactoryAccess.getFactory().createAccessibleBrowseBoxHeaderCell(
     919           0 :             _nColumn, m_pAccessible->getHeaderBar(),
     920             :             *this, NULL, ::svt::BBTYPE_COLUMNHEADERCELL
     921           0 :         );
     922             : 
     923             :         // insert into list
     924           0 :         m_aAccessibleChildren[ _nColumn ] = xChild;
     925             :     }
     926             : 
     927           0 :     return xChild;
     928             : }
     929             : 
     930           0 : sal_Int32 SvHeaderTabListBox::GetAccessibleControlCount() const
     931             : {
     932           0 :     return -1;
     933             : }
     934             : 
     935           0 : Reference< XAccessible > SvHeaderTabListBox::CreateAccessibleControl( sal_Int32 )
     936             : {
     937           0 :     Reference< XAccessible > xControl;
     938           0 :     return xControl;
     939             : }
     940             : 
     941           0 : bool SvHeaderTabListBox::ConvertPointToControlIndex( sal_Int32&, const Point& )
     942             : {
     943           0 :     return false;
     944             : }
     945             : 
     946           0 : bool SvHeaderTabListBox::ConvertPointToCellAddress( sal_Int32&, sal_uInt16&, const Point& )
     947             : {
     948           0 :     return false;
     949             : }
     950             : 
     951           0 : bool SvHeaderTabListBox::ConvertPointToRowHeader( sal_Int32&, const Point& )
     952             : {
     953           0 :     return false;
     954             : }
     955             : 
     956           0 : bool SvHeaderTabListBox::ConvertPointToColumnHeader( sal_uInt16&, const Point& )
     957             : {
     958           0 :     return false;
     959             : }
     960             : 
     961           0 : OUString SvHeaderTabListBox::GetAccessibleObjectName( ::svt::AccessibleBrowseBoxObjType _eType, sal_Int32 _nPos ) const
     962             : {
     963           0 :     OUString aRetText;
     964           0 :     switch( _eType )
     965             :     {
     966             :         case ::svt::BBTYPE_BROWSEBOX:
     967             :         case ::svt::BBTYPE_TABLE:
     968             :         case ::svt::BBTYPE_COLUMNHEADERBAR:
     969             :             // should be empty now (see #i63983)
     970           0 :             aRetText.clear();
     971           0 :             break;
     972             : 
     973             :         case ::svt::BBTYPE_TABLECELL:
     974             :         {
     975             :             // here we need a valid pos, we can not handle -1
     976           0 :             if ( _nPos >= 0 )
     977             :             {
     978           0 :                 sal_uInt16 nColumnCount = GetColumnCount();
     979           0 :                 if (nColumnCount > 0)
     980             :                 {
     981           0 :                     sal_Int32 nRow = _nPos / nColumnCount;
     982           0 :                     sal_uInt16 nColumn  = static_cast< sal_uInt16 >( _nPos % nColumnCount );
     983           0 :                     aRetText = GetCellText( nRow, nColumn );
     984             :                 }
     985             :             }
     986           0 :             break;
     987             :         }
     988             :         case ::svt::BBTYPE_CHECKBOXCELL:
     989             :         {
     990           0 :             break; // checkbox cells have no name
     991             :         }
     992             :         case ::svt::BBTYPE_COLUMNHEADERCELL:
     993             :         {
     994           0 :             aRetText = m_pImpl->m_pHeaderBar->GetItemText( m_pImpl->m_pHeaderBar->GetItemId( (sal_uInt16)_nPos ) );
     995           0 :             break;
     996             :         }
     997             : 
     998             :         case ::svt::BBTYPE_ROWHEADERBAR:
     999             :         case ::svt::BBTYPE_ROWHEADERCELL:
    1000           0 :             aRetText = "error";
    1001           0 :             break;
    1002             : 
    1003             :         default:
    1004             :             OSL_FAIL("BrowseBox::GetAccessibleName: invalid enum!");
    1005             :     }
    1006           0 :     return aRetText;
    1007             : }
    1008             : 
    1009           0 : OUString SvHeaderTabListBox::GetAccessibleObjectDescription( ::svt::AccessibleBrowseBoxObjType _eType, sal_Int32 _nPos ) const
    1010             : {
    1011           0 :     OUString aRetText;
    1012             : 
    1013           0 :     if( _eType == ::svt::BBTYPE_TABLECELL && _nPos != -1 )
    1014             :     {
    1015           0 :         const OUString sVar1( "%1" );
    1016           0 :         const OUString sVar2( "%2" );
    1017             : 
    1018           0 :         sal_uInt16 nColumnCount = GetColumnCount();
    1019           0 :         if (nColumnCount > 0)
    1020             :         {
    1021           0 :             sal_Int32 nRow = _nPos / nColumnCount;
    1022           0 :             sal_uInt16 nColumn  = static_cast< sal_uInt16 >( _nPos % nColumnCount );
    1023             : 
    1024           0 :             OUString aText( SVT_RESSTR(STR_SVT_ACC_DESC_TABLISTBOX) );
    1025           0 :             aText = aText.replaceFirst( sVar1, OUString::number( nRow ) );
    1026           0 :             OUString sColHeader = m_pImpl->m_pHeaderBar->GetItemText( m_pImpl->m_pHeaderBar->GetItemId( nColumn ) );
    1027           0 :             if ( sColHeader.isEmpty() )
    1028           0 :                 sColHeader = OUString::number( nColumn );
    1029           0 :             aText = aText.replaceFirst( sVar2, sColHeader );
    1030           0 :             aRetText = aText;
    1031           0 :         }
    1032             :     }
    1033             : 
    1034           0 :     return aRetText;
    1035             : }
    1036             : 
    1037           0 : void SvHeaderTabListBox::FillAccessibleStateSet( ::utl::AccessibleStateSetHelper& _rStateSet, ::svt::AccessibleBrowseBoxObjType _eType ) const
    1038             : {
    1039           0 :     switch( _eType )
    1040             :     {
    1041             :         case ::svt::BBTYPE_BROWSEBOX:
    1042             :         case ::svt::BBTYPE_TABLE:
    1043             :         {
    1044           0 :             _rStateSet.AddState( AccessibleStateType::FOCUSABLE );
    1045           0 :             if ( HasFocus() )
    1046           0 :                 _rStateSet.AddState( AccessibleStateType::FOCUSED );
    1047           0 :             if ( IsActive() )
    1048           0 :                 _rStateSet.AddState( AccessibleStateType::ACTIVE );
    1049           0 :             if ( IsEnabled() )
    1050             :             {
    1051           0 :                 _rStateSet.AddState( AccessibleStateType::ENABLED );
    1052           0 :                 _rStateSet.AddState( AccessibleStateType::SENSITIVE );
    1053             :             }
    1054           0 :             if ( IsReallyVisible() )
    1055           0 :                 _rStateSet.AddState( AccessibleStateType::VISIBLE );
    1056           0 :             if ( _eType == ::svt::BBTYPE_TABLE )
    1057             :             {
    1058             : 
    1059           0 :                 if ( AreChildrenTransient() )
    1060           0 :                     _rStateSet.AddState( AccessibleStateType::MANAGES_DESCENDANTS );
    1061           0 :                 _rStateSet.AddState( AccessibleStateType::MULTI_SELECTABLE );
    1062             :             }
    1063           0 :             break;
    1064             :         }
    1065             : 
    1066             :         case ::svt::BBTYPE_COLUMNHEADERBAR:
    1067             :         {
    1068           0 :             sal_Int32 nCurRow = GetCurrRow();
    1069           0 :             sal_uInt16 nCurColumn = GetCurrColumn();
    1070           0 :             if ( IsCellVisible( nCurRow, nCurColumn ) )
    1071           0 :                 _rStateSet.AddState( AccessibleStateType::VISIBLE );
    1072           0 :             if ( IsEnabled() )
    1073           0 :                 _rStateSet.AddState( AccessibleStateType::ENABLED );
    1074           0 :             _rStateSet.AddState( AccessibleStateType::TRANSIENT );
    1075           0 :             break;
    1076             :         }
    1077             : 
    1078             :         case ::svt::BBTYPE_ROWHEADERCELL:
    1079             :         case ::svt::BBTYPE_COLUMNHEADERCELL:
    1080             :         {
    1081           0 :             _rStateSet.AddState( AccessibleStateType::VISIBLE );
    1082           0 :             _rStateSet.AddState( AccessibleStateType::FOCUSABLE );
    1083           0 :             _rStateSet.AddState( AccessibleStateType::TRANSIENT );
    1084           0 :             if ( IsEnabled() )
    1085           0 :                 _rStateSet.AddState( AccessibleStateType::ENABLED );
    1086           0 :             break;
    1087             :         }
    1088             :         default:
    1089           0 :             break;
    1090             :     }
    1091           0 : }
    1092             : 
    1093           0 : void SvHeaderTabListBox::FillAccessibleStateSetForCell( ::utl::AccessibleStateSetHelper& _rStateSet, sal_Int32 _nRow, sal_uInt16 _nColumn ) const
    1094             : {
    1095           0 :     _rStateSet.AddState( AccessibleStateType::SELECTABLE );
    1096           0 :     if ( AreChildrenTransient() )
    1097           0 :         _rStateSet.AddState( AccessibleStateType::TRANSIENT );
    1098             : 
    1099           0 :     if ( IsCellVisible( _nRow, _nColumn ) )
    1100             :     {
    1101           0 :         _rStateSet.AddState( AccessibleStateType::VISIBLE );
    1102           0 :         _rStateSet.AddState( AccessibleStateType::ENABLED );
    1103             :     }
    1104             : 
    1105           0 :     if ( IsRowSelected( _nRow ) )
    1106             :     {
    1107           0 :         _rStateSet.AddState( AccessibleStateType::ACTIVE );
    1108           0 :         _rStateSet.AddState( AccessibleStateType::SELECTED );
    1109             :     }
    1110           0 :     if ( IsEnabled() )
    1111           0 :         _rStateSet.AddState( AccessibleStateType::ENABLED );
    1112           0 : }
    1113             : 
    1114           0 : void SvHeaderTabListBox::GrabTableFocus()
    1115             : {
    1116           0 :     GrabFocus();
    1117           0 : }
    1118             : 
    1119           0 : bool SvHeaderTabListBox::GetGlyphBoundRects( const Point& rOrigin, const OUString& rStr, int nIndex, int nLen, int nBase, MetricVector& rVector )
    1120             : {
    1121           0 :     return Control::GetGlyphBoundRects( rOrigin, rStr, nIndex, nLen, nBase, rVector );
    1122             : }
    1123             : 
    1124           0 : Rectangle SvHeaderTabListBox::GetWindowExtentsRelative( vcl::Window *pRelativeWindow ) const
    1125             : {
    1126           0 :     return Control::GetWindowExtentsRelative( pRelativeWindow );
    1127             : }
    1128             : 
    1129           0 : void SvHeaderTabListBox::GrabFocus()
    1130             : {
    1131           0 :     Control::GrabFocus();
    1132           0 : }
    1133             : 
    1134           0 : Reference< XAccessible > SvHeaderTabListBox::GetAccessible( bool bCreate )
    1135             : {
    1136           0 :     return Control::GetAccessible( bCreate );
    1137             : }
    1138             : 
    1139           0 : vcl::Window* SvHeaderTabListBox::GetAccessibleParentWindow() const
    1140             : {
    1141           0 :     return Control::GetAccessibleParentWindow();
    1142             : }
    1143             : 
    1144           0 : vcl::Window* SvHeaderTabListBox::GetWindowInstance()
    1145             : {
    1146           0 :     return this;
    1147             : }
    1148             : 
    1149           0 : Reference< XAccessible > SvHeaderTabListBox::CreateAccessible()
    1150             : {
    1151           0 :     vcl::Window* pParent = GetAccessibleParentWindow();
    1152             :     DBG_ASSERT( pParent, "SvHeaderTabListBox::::CreateAccessible - accessible parent not found" );
    1153             : 
    1154           0 :     Reference< XAccessible > xAccessible;
    1155           0 :     if ( m_pAccessible ) xAccessible = m_pAccessible->getMyself();
    1156             : 
    1157           0 :     if( pParent && !m_pAccessible )
    1158             :     {
    1159           0 :         Reference< XAccessible > xAccParent = pParent->GetAccessible();
    1160           0 :         if ( xAccParent.is() )
    1161             :         {
    1162           0 :             m_pAccessible = m_pImpl->m_aFactoryAccess.getFactory().createAccessibleTabListBox( xAccParent, *this );
    1163           0 :             if ( m_pAccessible )
    1164           0 :                 xAccessible = m_pAccessible->getMyself();
    1165           0 :         }
    1166             :     }
    1167           0 :     return xAccessible;
    1168             : }
    1169             : 
    1170           0 : Rectangle SvHeaderTabListBox::GetFieldCharacterBounds(sal_Int32,sal_Int32,sal_Int32)
    1171             : {
    1172           0 :     Rectangle aRect;
    1173           0 :     return aRect;
    1174             : }
    1175             : 
    1176           0 : sal_Int32 SvHeaderTabListBox::GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint)
    1177             : {
    1178           0 :     OUString sText = GetAccessibleCellText( _nRow, static_cast< sal_uInt16 >( _nColumnPos ) );
    1179           0 :     MetricVector aRects;
    1180           0 :     if ( GetGlyphBoundRects(Point(0,0), sText, 0, sText.getLength(), 0, aRects) )
    1181             :     {
    1182           0 :         for (MetricVector::iterator aIter = aRects.begin(); aIter != aRects.end(); ++aIter)
    1183             :         {
    1184           0 :             if( aIter->IsInside(_rPoint) )
    1185           0 :                 return aIter - aRects.begin();
    1186             :         }
    1187             :     }
    1188             : 
    1189           0 :     return -1;
    1190         798 : }
    1191             : 
    1192             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11