LibreOffice Module vcl (master)  1
svtabbx.cxx
Go to the documentation of this file.
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 
22 #include <vcl/toolkit/svtabbx.hxx>
23 #include <vcl/headbar.hxx>
24 #include <vcl/svlbitm.hxx>
25 #include <vcl/treelistentry.hxx>
27 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
28 #include <sal/log.hxx>
29 #include <o3tl/safeint.hxx>
30 #include <osl/diagnose.h>
31 #include <strings.hrc>
32 #include <svdata.hxx>
33 #include <memory>
34 
35 using namespace ::com::sun::star::uno;
36 using namespace ::com::sun::star::accessibility;
37 
38 static constexpr SvLBoxTabFlags MYTABMASK =
40 
41 // SvTreeListBox callback
42 
44 {
46  if( mvTabList.empty() )
47  return;
48 
49  DBG_ASSERT(!mvTabList.empty(),"TabList ?");
50 
51  // The tree listbox has now inserted its tabs into the list. Now we
52  // fluff up the list with additional tabs and adjust the rightmost tab
53  // of the tree listbox.
54 
55  // Picking the rightmost tab.
56  // HACK for the explorer! If ViewParent != 0, the first tab of the tree
57  // listbox is calculated by the tree listbox itself! This behavior is
58  // necessary for ButtonsOnRoot, as the explorer does not know in this
59  // case, which additional offset it needs to add to the tabs in this mode
60  // -- the tree listbox knows that, though!
61  /*
62  if( !pViewParent )
63  {
64  SvLBoxTab* pFirstTab = (SvLBoxTab*)aTabs.GetObject( aTabs.Count()-1 );
65  pFirstTab->SetPos( pTabList[0].GetPos() );
66  pFirstTab->nFlags &= ~MYTABMASK;
67  pFirstTab->nFlags |= pTabList[0].nFlags;
68  }
69  */
70 
71  // append all other tabs to the list
72  for( sal_uInt16 nCurTab = 1; nCurTab < sal_uInt16(mvTabList.size()); nCurTab++ )
73  {
74  SvLBoxTab& rTab = mvTabList[nCurTab];
75  AddTab( rTab.GetPos(), rTab.nFlags );
76  }
77 }
78 
79 void SvTabListBox::InitEntry(SvTreeListEntry* pEntry, const OUString& rStr,
80  const Image& rColl, const Image& rExp)
81 {
82  SvTreeListBox::InitEntry(pEntry, rStr, rColl, rExp);
83 
84  sal_Int32 nIndex = 0;
85  // TODO: verify if nTabCount is always >0 here!
86  const sal_uInt16 nCount = mvTabList.size() - 1;
87  for( sal_uInt16 nToken = 0; nToken < nCount; nToken++ )
88  {
89  const OUString aToken = GetToken(aCurEntry, nIndex);
90  pEntry->AddItem(std::make_unique<SvLBoxString>(aToken));
91  }
92 }
93 
95  : SvTreeListBox( pParent, nBits )
96 {
97  SetHighlightRange(); // select full width
98 }
99 
101 {
102  disposeOnce();
103 }
104 
106 {
107  mvTabList.clear();
109 }
110 
111 void SvTabListBox::SetTabs(sal_uInt16 nTabs, long const pTabPositions[], MapUnit eMapUnit)
112 {
113  mvTabList.resize(nTabs);
114 
115  MapMode aMMSource( eMapUnit );
116  MapMode aMMDest( MapUnit::MapPixel );
117 
118  for( sal_uInt16 nIdx = 0; nIdx < sal_uInt16(mvTabList.size()); nIdx++, pTabPositions++ )
119  {
120  Size aSize( *pTabPositions, 0 );
121  aSize = LogicToLogic( aSize, &aMMSource, &aMMDest );
122  long nNewTab = aSize.Width();
123  mvTabList[nIdx].SetPos( nNewTab );
124  mvTabList[nIdx].nFlags &= MYTABMASK;
125  }
127  if( IsUpdateMode() )
128  Invalidate();
129 }
130 
132  bool /*bChildrenOnDemand*/,
133  sal_uLong nPos, void* pUserData )
134 {
135  return InsertEntryToColumn( rText, pParent, nPos, 0xffff, pUserData );
136 }
137 
139  const Image& rExpandedEntryBmp,
140  const Image& rCollapsedEntryBmp,
141  SvTreeListEntry* pParent,
142  bool /*bChildrenOnDemand*/,
143  sal_uLong nPos, void* pUserData )
144 {
145  return InsertEntryToColumn( rText, rExpandedEntryBmp, rCollapsedEntryBmp,
146  pParent, nPos, 0xffff, pUserData );
147 }
148 
149 SvTreeListEntry* SvTabListBox::InsertEntryToColumn(const OUString& rStr,SvTreeListEntry* pParent,sal_uLong nPos,sal_uInt16 nCol,
150  void* pUser )
151 {
152  OUString aStr;
153  if( nCol != 0xffff )
154  {
155  while( nCol )
156  {
157  aStr += "\t";
158  nCol--;
159  }
160  }
161  aStr += rStr;
162  OUString aFirstStr( aStr );
163  sal_Int32 nEnd = aFirstStr.indexOf( '\t' );
164  if( nEnd != -1 )
165  {
166  aFirstStr = aFirstStr.copy(0, nEnd);
167  aCurEntry = aStr.copy(++nEnd);
168  }
169  else
170  aCurEntry.clear();
171  return SvTreeListBox::InsertEntry( aFirstStr, pParent, false, nPos, pUser );
172 }
173 
175  const Image& rExpandedEntryBmp, const Image& rCollapsedEntryBmp,
176  SvTreeListEntry* pParent,sal_uLong nPos,sal_uInt16 nCol, void* pUser )
177 {
178  OUString aStr;
179  if( nCol != 0xffff )
180  {
181  while( nCol )
182  {
183  aStr += "\t";
184  nCol--;
185  }
186  }
187  aStr += rStr;
188  OUString aFirstStr( aStr );
189  sal_Int32 nEnd = aFirstStr.indexOf('\t');
190  if (nEnd != -1)
191  {
192  aFirstStr = aFirstStr.copy(0, nEnd);
193  aCurEntry = aStr.copy(++nEnd);
194  }
195  else
196  aCurEntry.clear();
197 
199  aFirstStr,
200  rExpandedEntryBmp, rCollapsedEntryBmp,
201  pParent, false, nPos, pUser );
202 }
203 
205 {
206  return GetEntryText( pEntry, 0xffff );
207 }
208 
209 OUString SvTabListBox::GetEntryText( SvTreeListEntry* pEntry, sal_uInt16 nCol )
210 {
211  DBG_ASSERT(pEntry,"GetEntryText:Invalid Entry");
212  OUStringBuffer aResult;
213  if( pEntry )
214  {
215  sal_uInt16 nCount = pEntry->ItemCount();
216  sal_uInt16 nCur = 0;
217  while( nCur < nCount )
218  {
219  const SvLBoxItem& rStr = pEntry->GetItem( nCur );
220  if (rStr.GetType() == SvLBoxItemType::String)
221  {
222  if( nCol == 0xffff )
223  {
224  if (!aResult.isEmpty())
225  aResult.append("\t");
226  aResult.append(static_cast<const SvLBoxString&>(rStr).GetText());
227  }
228  else
229  {
230  if( nCol == 0 )
231  return static_cast<const SvLBoxString&>(rStr).GetText();
232  nCol--;
233  }
234  }
235  nCur++;
236  }
237  }
238  return aResult.makeStringAndClear();
239 }
240 
241 OUString SvTabListBox::GetEntryText( sal_uLong nPos, sal_uInt16 nCol ) const
242 {
243  SvTreeListEntry* pEntry = GetEntryOnPos( nPos );
244  return GetEntryText( pEntry, nCol );
245 }
246 
247 OUString SvTabListBox::GetCellText( sal_uLong nPos, sal_uInt16 nCol ) const
248 {
249  SvTreeListEntry* pEntry = GetEntryOnPos( nPos );
250  DBG_ASSERT( pEntry, "SvTabListBox::GetCellText(): Invalid Entry" );
251  OUString aResult;
252  if (pEntry && pEntry->ItemCount() > o3tl::make_unsigned(nCol+1))
253  {
254  const SvLBoxItem& rStr = pEntry->GetItem( nCol + 1 );
255  if (rStr.GetType() == SvLBoxItemType::String)
256  aResult = static_cast<const SvLBoxString&>(rStr).GetText();
257  }
258  return aResult;
259 }
260 
262 {
263  sal_uLong nPos = 0;
264  SvTreeListEntry* pTmpEntry = First();
265  while( pTmpEntry )
266  {
267  if ( pTmpEntry == pEntry )
268  return nPos;
269  pTmpEntry = Next( pTmpEntry );
270  ++nPos;
271  }
272  return 0xffffffff;
273 }
274 
275 // static
276 OUString SvTabListBox::GetToken( const OUString &sStr, sal_Int32& nIndex )
277 {
278  return sStr.getToken(0, '\t', nIndex);
279 }
280 
281 OUString SvTabListBox::GetTabEntryText( sal_uLong nPos, sal_uInt16 nCol ) const
282 {
283  SvTreeListEntry* pEntry = SvTreeListBox::GetEntry( nPos );
284  DBG_ASSERT( pEntry, "GetTabEntryText(): Invalid entry " );
285  OUStringBuffer aResult;
286  if ( pEntry )
287  {
288  sal_uInt16 nCount = pEntry->ItemCount();
289  sal_uInt16 nCur = 0;
290  while( nCur < nCount )
291  {
292  const SvLBoxItem& rBoxItem = pEntry->GetItem( nCur );
293  if (rBoxItem.GetType() == SvLBoxItemType::String)
294  {
295  if ( nCol == 0xffff )
296  {
297  if (!aResult.isEmpty())
298  aResult.append("\t");
299  aResult.append(static_cast<const SvLBoxString&>(rBoxItem).GetText());
300  }
301  else
302  {
303  if ( nCol == 0 )
304  {
305  OUString sRet = static_cast<const SvLBoxString&>(rBoxItem).GetText();
306  if ( sRet.isEmpty() )
307  sRet = VclResId( STR_SVT_ACC_EMPTY_FIELD );
308  return sRet;
309  }
310  --nCol;
311  }
312  }
313  ++nCur;
314  }
315  }
316  return aResult.makeStringAndClear();
317 }
318 
320 {
321  SvTreeListEntry* pEntry = nullptr;
322  sal_uLong i, nPos = 0, nCount = GetLevelChildCount( nullptr );
323  for ( i = 0; i < nCount; ++i )
324  {
325  SvTreeListEntry* pParent = GetEntry(i);
326  if ( nPos == _nEntryPos )
327  {
328  pEntry = pParent;
329  break;
330  }
331  else
332  {
333  nPos++;
334  pEntry = GetChildOnPos( pParent, _nEntryPos, nPos );
335  if ( pEntry )
336  break;
337  }
338  }
339 
340  return pEntry;
341 }
342 
344 {
345  sal_uLong i, nCount = GetLevelChildCount( _pParent );
346  for ( i = 0; i < nCount; ++i )
347  {
348  SvTreeListEntry* pParent = GetEntry( _pParent, i );
349  if ( _rPos == _nEntryPos )
350  return pParent;
351  else
352  {
353  _rPos++;
354  SvTreeListEntry* pEntry = GetChildOnPos( pParent, _nEntryPos, _rPos );
355  if ( pEntry )
356  return pEntry;
357  }
358  }
359 
360  return nullptr;
361 }
362 
363 void SvTabListBox::SetTabJustify( sal_uInt16 nTab, SvTabJustify eJustify)
364 {
365  DBG_ASSERT(nTab<mvTabList.size(),"GetTabPos:Invalid Tab");
366  if( nTab >= mvTabList.size() )
367  return;
368  SvLBoxTab& rTab = mvTabList[ nTab ];
369  SvLBoxTabFlags nFlags = rTab.nFlags;
370  nFlags &= ~MYTABMASK;
371  // see SvLBoxTab::CalcOffset for force, which only matters for centering
372  nFlags |= static_cast<SvLBoxTabFlags>(eJustify) | SvLBoxTabFlags::FORCE;
373  rTab.nFlags = nFlags;
375  if( IsUpdateMode() )
376  Invalidate();
377 }
378 
379 void SvTabListBox::SetTabEditable(sal_uInt16 nTab, bool bEditable)
380 {
381  DBG_ASSERT(nTab<mvTabList.size(),"GetTabPos:Invalid Tab");
382  if( nTab >= mvTabList.size() )
383  return;
384  SvLBoxTab& rTab = mvTabList[ nTab ];
385  if (bEditable)
387  else
388  rTab.nFlags &= ~SvLBoxTabFlags::EDITABLE;
389 }
390 
391 long SvTabListBox::GetLogicTab( sal_uInt16 nTab )
392 {
394  SetTabs();
395 
396  DBG_ASSERT(nTab<mvTabList.size(),"GetTabPos:Invalid Tab");
397  return aTabs[ nTab ]->GetPos();
398 }
399 
400 namespace vcl
401 {
403  {
405  AccessibleFactoryAccess m_aFactoryAccess;
406 
407  SvHeaderTabListBoxImpl() : m_pHeaderBar( nullptr ) { }
408  };
409 }
410 
412  : SvTabListBox(pParent, nWinStyle)
413  , m_bFirstPaint(true)
414  , m_pImpl(new ::vcl::SvHeaderTabListBoxImpl)
415  , m_pAccessible(nullptr)
416 {
417 }
418 
420 {
421  disposeOnce();
422 }
423 
425 {
426  m_pImpl.reset();
428 }
429 
430 void SvHeaderTabListBox::Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect )
431 {
432  if (m_bFirstPaint)
433  {
434  m_bFirstPaint = false;
435  }
436  SvTabListBox::Paint(rRenderContext, rRect);
437 }
438 
440 {
441  DBG_ASSERT( !m_pImpl->m_pHeaderBar, "header bar already initialized" );
442  DBG_ASSERT( pHeaderBar, "invalid header bar initialization" );
443  m_pImpl->m_pHeaderBar = pHeaderBar;
444  SetScrolledHdl( LINK( this, SvHeaderTabListBox, ScrollHdl_Impl ) );
445  m_pImpl->m_pHeaderBar->SetCreateAccessibleHdl( LINK( this, SvHeaderTabListBox, CreateAccessibleHdl_Impl ) );
446 }
447 
449 {
450  return m_pImpl ? m_pImpl->m_pHeaderBar : nullptr;
451 }
452 
453 bool SvHeaderTabListBox::IsItemChecked( SvTreeListEntry* pEntry, sal_uInt16 nCol )
454 {
456  SvLBoxButton& rItem = static_cast<SvLBoxButton&>( pEntry->GetItem( nCol + 1 ) );
457 
458  if (rItem.GetType() == SvLBoxItemType::Button)
459  {
460  SvItemStateFlags nButtonFlags = rItem.GetButtonFlags();
461  eState = SvLBoxButtonData::ConvertToButtonState( nButtonFlags );
462  }
463 
464  return ( eState == SvButtonState::Checked );
465 }
466 
468  const OUString& rStr, SvTreeListEntry* pParent, sal_uLong nPos, sal_uInt16 nCol, void* pUserData )
469 {
470  SvTreeListEntry* pEntry = SvTabListBox::InsertEntryToColumn( rStr, pParent, nPos, nCol, pUserData );
472  return pEntry;
473 }
474 
476  const OUString& rStr, const Image& rExpandedEntryBmp, const Image& rCollapsedEntryBmp,
477  SvTreeListEntry* pParent, sal_uLong nPos, sal_uInt16 nCol, void* pUserData )
478 {
480  rStr, rExpandedEntryBmp, rCollapsedEntryBmp, pParent, nPos, nCol, pUserData );
482  return pEntry;
483 }
484 
486  SvTreeListEntry* pEnt, SvTreeListEntry* pPar, sal_uLong nPos )
487 {
488  sal_uLong n = SvTabListBox::Insert( pEnt, pPar, nPos );
490  return n;
491 }
492 
494 {
495  sal_uLong nPos = SvTabListBox::Insert( pEntry, nRootPos );
497  return nPos;
498 }
499 
501 {
502  m_pImpl->m_pHeaderBar->SetOffset( -GetXOffset() );
503 }
504 
505 IMPL_LINK_NOARG(SvHeaderTabListBox, CreateAccessibleHdl_Impl, HeaderBar*, void)
506 {
507  vcl::Window* pParent = m_pImpl->m_pHeaderBar->GetAccessibleParentWindow();
508  DBG_ASSERT( pParent, "SvHeaderTabListBox..CreateAccessibleHdl_Impl - accessible parent not found" );
509  if ( pParent )
510  {
511  css::uno::Reference< XAccessible > xAccParent = pParent->GetAccessible();
512  if ( xAccParent.is() )
513  {
514  Reference< XAccessible > xAccessible = m_pImpl->m_aFactoryAccess.getFactory().createAccessibleBrowseBoxHeaderBar(
515  xAccParent, *this, ::vcl::BBTYPE_COLUMNHEADERBAR );
516  m_pImpl->m_pHeaderBar->SetAccessible( xAccessible );
517  }
518  }
519 }
520 
522 {
523  if ( !m_aAccessibleChildren.empty() )
524  {
525  sal_uInt32 nCount = ( GetRowCount() + 1 ) * GetColumnCount();
526  if ( m_aAccessibleChildren.size() < nCount )
527  m_aAccessibleChildren.resize( nCount );
528  else
529  {
530  DBG_ASSERT( m_aAccessibleChildren.size() == nCount, "wrong children count" );
531  }
532  }
533 }
534 
535 bool SvHeaderTabListBox::IsCellCheckBox( long _nRow, sal_uInt16 _nColumn, TriState& _rState )
536 {
537  bool bRet = false;
538  SvTreeListEntry* pEntry = GetEntry( _nRow );
539  if ( pEntry )
540  {
541  sal_uInt16 nItemCount = pEntry->ItemCount();
542  if ( nItemCount > ( _nColumn + 1 ) )
543  {
544  SvLBoxItem& rItem = pEntry->GetItem( _nColumn + 1 );
545  if (rItem.GetType() == SvLBoxItemType::Button)
546  {
547  bRet = true;
548  _rState = ( ( static_cast<SvLBoxButton&>(rItem).GetButtonFlags() & SvItemStateFlags::UNCHECKED ) == SvItemStateFlags::NONE )
550  }
551  }
552  else
553  {
554  SAL_WARN( "svtools.contnr", "SvHeaderTabListBox::IsCellCheckBox(): column out of range" );
555  }
556  }
557  return bRet;
558 }
560 {
561  return GetEntryCount();
562 }
563 
565 {
566  return m_pImpl->m_pHeaderBar->GetItemCount();
567 }
568 
570 {
571  sal_Int32 nRet = -1;
572  SvTreeListEntry* pEntry = GetCurEntry();
573  if ( pEntry )
574  {
576  for ( sal_uLong i = 0; i < nCount; ++i )
577  {
578  if ( pEntry == GetEntry(i) )
579  {
580  nRet = i;
581  break;
582  }
583  }
584  }
585 
586  return nRet;
587 }
588 
590 {
591  return 0;
592 }
593 
594 OUString SvHeaderTabListBox::GetRowDescription( sal_Int32 _nRow ) const
595 {
596  return GetEntryText( _nRow );
597 }
598 
599 OUString SvHeaderTabListBox::GetColumnDescription( sal_uInt16 _nColumn ) const
600 {
601  return m_pImpl->m_pHeaderBar->GetItemText( m_pImpl->m_pHeaderBar->GetItemId( _nColumn ) );
602 }
603 
605 {
606  return false;
607 }
608 
609 bool SvHeaderTabListBox::GoToCell( sal_Int32 /*_nRow*/, sal_uInt16 /*_nColumn*/ )
610 {
611  return false;
612 }
613 
615 {
617 }
618 
620 {
622 }
623 
624 void SvHeaderTabListBox::SelectRow( long _nRow, bool _bSelect, bool )
625 {
626  Select( GetEntry( _nRow ), _bSelect );
627 }
628 
629 void SvHeaderTabListBox::SelectColumn( sal_uInt16, bool )
630 {
631 }
632 
634 {
635  return GetSelectionCount();
636 }
637 
639 {
640  return 0;
641 }
642 
643 bool SvHeaderTabListBox::IsRowSelected( long _nRow ) const
644 {
645  SvTreeListEntry* pEntry = GetEntry( _nRow );
646  return ( pEntry && IsSelected( pEntry ) );
647 }
648 
650 {
651  return false;
652 }
653 
654 void SvHeaderTabListBox::GetAllSelectedRows( css::uno::Sequence< sal_Int32 >& ) const
655 {
656 }
657 
658 void SvHeaderTabListBox::GetAllSelectedColumns( css::uno::Sequence< sal_Int32 >& ) const
659 {
660 }
661 
662 bool SvHeaderTabListBox::IsCellVisible( sal_Int32, sal_uInt16 ) const
663 {
664  return true;
665 }
666 
667 OUString SvHeaderTabListBox::GetAccessibleCellText( long _nRow, sal_uInt16 _nColumnPos ) const
668 {
669  return GetTabEntryText(_nRow, _nColumnPos);
670 }
671 
672 tools::Rectangle SvHeaderTabListBox::calcHeaderRect( bool _bIsColumnBar, bool _bOnScreen )
673 {
674  tools::Rectangle aRect;
675  if ( _bIsColumnBar )
676  {
677  vcl::Window* pParent = nullptr;
678  if ( !_bOnScreen )
679  pParent = m_pImpl->m_pHeaderBar->GetAccessibleParentWindow();
680 
681  aRect = m_pImpl->m_pHeaderBar->GetWindowExtentsRelative( pParent );
682  }
683  return aRect;
684 }
685 
687 {
688  vcl::Window* pParent = nullptr;
689  if ( !_bOnScreen )
690  pParent = GetAccessibleParentWindow();
691 
692  tools::Rectangle aRect( GetWindowExtentsRelative( pParent ) );
693  return aRect;
694 }
695 
696 tools::Rectangle SvHeaderTabListBox::GetFieldRectPixelAbs( sal_Int32 _nRow, sal_uInt16 _nColumn, bool _bIsHeader, bool _bOnScreen )
697 {
698  DBG_ASSERT( !_bIsHeader || 0 == _nRow, "invalid parameters" );
699  tools::Rectangle aRect;
700  SvTreeListEntry* pEntry = GetEntry( _nRow );
701  if ( pEntry )
702  {
703  aRect = _bIsHeader ? calcHeaderRect( true, false ) : GetBoundingRect( pEntry );
704  Point aTopLeft = aRect.TopLeft();
705  DBG_ASSERT( m_pImpl->m_pHeaderBar->GetItemCount() > _nColumn, "invalid column" );
706  tools::Rectangle aItemRect = m_pImpl->m_pHeaderBar->GetItemRect( m_pImpl->m_pHeaderBar->GetItemId( _nColumn ) );
707  aTopLeft.setX( aItemRect.Left() );
708  Size aSize = aItemRect.GetSize();
709  aRect = tools::Rectangle( aTopLeft, aSize );
710  vcl::Window* pParent = nullptr;
711  if ( !_bOnScreen )
712  pParent = GetAccessibleParentWindow();
713  aTopLeft = aRect.TopLeft();
714  aTopLeft += GetWindowExtentsRelative( pParent ).TopLeft();
715  aRect = tools::Rectangle( aTopLeft, aRect.GetSize() );
716  }
717 
718  return aRect;
719 }
720 
721 Reference< XAccessible > SvHeaderTabListBox::CreateAccessibleCell( sal_Int32 _nRow, sal_uInt16 _nColumnPos )
722 {
723  OSL_ENSURE( m_pAccessible, "Invalid call: Accessible is null" );
724 
725  Reference< XAccessible > xChild;
726 
727  TriState eState = TRISTATE_INDET;
728  bool bIsCheckBox = IsCellCheckBox( _nRow, _nColumnPos, eState );
729  if ( bIsCheckBox )
730  xChild = m_pImpl->m_aFactoryAccess.getFactory().createAccessibleCheckBoxCell(
731  m_pAccessible->getHeaderBar(), *this, nullptr, _nRow, _nColumnPos, eState, false );
732  else
733  xChild = m_pImpl->m_aFactoryAccess.getFactory().createAccessibleBrowseBoxTableCell(
734  m_pAccessible->getHeaderBar(), *this, nullptr, _nRow, _nColumnPos, OFFSET_NONE );
735 
736  return xChild;
737 }
738 
739 Reference< XAccessible > SvHeaderTabListBox::CreateAccessibleRowHeader( sal_Int32 )
740 {
741  Reference< XAccessible > xHeader;
742  return xHeader;
743 }
744 
745 Reference< XAccessible > SvHeaderTabListBox::CreateAccessibleColumnHeader( sal_uInt16 _nColumn )
746 {
747  // first call? -> initial list
748  if ( m_aAccessibleChildren.empty() )
749  {
750  const sal_uInt16 nColumnCount = GetColumnCount();
751  m_aAccessibleChildren.assign( nColumnCount, Reference< XAccessible >() );
752  }
753 
754  // get header
755  Reference< XAccessible > xChild = m_aAccessibleChildren[ _nColumn ];
756  // already exists?
757  if ( !xChild.is() && m_pAccessible )
758  {
759  // no -> create new header cell
760  xChild = m_pImpl->m_aFactoryAccess.getFactory().createAccessibleBrowseBoxHeaderCell(
761  _nColumn, m_pAccessible->getHeaderBar(),
762  *this, nullptr, ::vcl::BBTYPE_COLUMNHEADERCELL
763  );
764 
765  // insert into list
766  m_aAccessibleChildren[ _nColumn ] = xChild;
767  }
768  return xChild;
769 }
770 
772 {
773  return -1;
774 }
775 
776 Reference< XAccessible > SvHeaderTabListBox::CreateAccessibleControl( sal_Int32 )
777 {
778  Reference< XAccessible > xControl;
779  return xControl;
780 }
781 
782 bool SvHeaderTabListBox::ConvertPointToControlIndex( sal_Int32&, const Point& )
783 {
784  return false;
785 }
786 
787 bool SvHeaderTabListBox::ConvertPointToCellAddress( sal_Int32&, sal_uInt16&, const Point& )
788 {
789  return false;
790 }
791 
792 bool SvHeaderTabListBox::ConvertPointToRowHeader( sal_Int32&, const Point& )
793 {
794  return false;
795 }
796 
797 bool SvHeaderTabListBox::ConvertPointToColumnHeader( sal_uInt16&, const Point& )
798 {
799  return false;
800 }
801 
803 {
804  OUString aRetText;
805  switch( _eType )
806  {
810  // should be empty now (see #i63983)
811  aRetText.clear();
812  break;
813 
815  {
816  // here we need a valid pos, we can not handle -1
817  if ( _nPos >= 0 )
818  {
819  sal_uInt16 nColumnCount = GetColumnCount();
820  if (nColumnCount > 0)
821  {
822  sal_Int32 nRow = _nPos / nColumnCount;
823  sal_uInt16 nColumn = static_cast< sal_uInt16 >( _nPos % nColumnCount );
824  aRetText = GetCellText( nRow, nColumn );
825  }
826  }
827  break;
828  }
830  {
831  break; // checkbox cells have no name
832  }
834  {
835  aRetText = m_pImpl->m_pHeaderBar->GetItemText( m_pImpl->m_pHeaderBar->GetItemId( static_cast<sal_uInt16>(_nPos) ) );
836  break;
837  }
838 
841  aRetText = "error";
842  break;
843 
844  default:
845  OSL_FAIL("BrowseBox::GetAccessibleName: invalid enum!");
846  }
847  return aRetText;
848 }
849 
851 {
852  OUString aRetText;
853 
854  if( _eType == ::vcl::BBTYPE_TABLECELL && _nPos != -1 )
855  {
856  const OUString sVar1( "%1" );
857  const OUString sVar2( "%2" );
858 
859  sal_uInt16 nColumnCount = GetColumnCount();
860  if (nColumnCount > 0)
861  {
862  sal_Int32 nRow = _nPos / nColumnCount;
863  sal_uInt16 nColumn = static_cast< sal_uInt16 >( _nPos % nColumnCount );
864 
865  OUString aText( VclResId(STR_SVT_ACC_DESC_TABLISTBOX) );
866  aText = aText.replaceFirst( sVar1, OUString::number( nRow ) );
867  OUString sColHeader = m_pImpl->m_pHeaderBar->GetItemText( m_pImpl->m_pHeaderBar->GetItemId( nColumn ) );
868  if ( sColHeader.isEmpty() )
869  sColHeader = OUString::number( nColumn );
870  aText = aText.replaceFirst( sVar2, sColHeader );
871  aRetText = aText;
872  }
873  }
874 
875  return aRetText;
876 }
877 
879 {
880  switch( _eType )
881  {
884  {
885  _rStateSet.AddState( AccessibleStateType::FOCUSABLE );
886  if ( HasFocus() )
887  _rStateSet.AddState( AccessibleStateType::FOCUSED );
888  if ( IsActive() )
889  _rStateSet.AddState( AccessibleStateType::ACTIVE );
890  if ( IsEnabled() )
891  {
892  _rStateSet.AddState( AccessibleStateType::ENABLED );
893  _rStateSet.AddState( AccessibleStateType::SENSITIVE );
894  }
895  if ( IsReallyVisible() )
896  _rStateSet.AddState( AccessibleStateType::VISIBLE );
897  if ( _eType == ::vcl::BBTYPE_TABLE )
898  {
899 
900  _rStateSet.AddState( AccessibleStateType::MANAGES_DESCENDANTS );
901  _rStateSet.AddState( AccessibleStateType::MULTI_SELECTABLE );
902  }
903  break;
904  }
905 
907  {
908  sal_Int32 nCurRow = GetCurrRow();
909  sal_uInt16 nCurColumn = GetCurrColumn();
910  if ( IsCellVisible( nCurRow, nCurColumn ) )
911  _rStateSet.AddState( AccessibleStateType::VISIBLE );
912  if ( IsEnabled() )
913  _rStateSet.AddState( AccessibleStateType::ENABLED );
914  _rStateSet.AddState( AccessibleStateType::TRANSIENT );
915  break;
916  }
917 
920  {
921  _rStateSet.AddState( AccessibleStateType::VISIBLE );
922  _rStateSet.AddState( AccessibleStateType::FOCUSABLE );
923  _rStateSet.AddState( AccessibleStateType::TRANSIENT );
924  if ( IsEnabled() )
925  _rStateSet.AddState( AccessibleStateType::ENABLED );
926  break;
927  }
928  default:
929  break;
930  }
931 }
932 
933 void SvHeaderTabListBox::FillAccessibleStateSetForCell( ::utl::AccessibleStateSetHelper& _rStateSet, sal_Int32 _nRow, sal_uInt16 _nColumn ) const
934 {
935  _rStateSet.AddState( AccessibleStateType::SELECTABLE );
936  _rStateSet.AddState( AccessibleStateType::TRANSIENT );
937 
938  if ( IsCellVisible( _nRow, _nColumn ) )
939  {
940  _rStateSet.AddState( AccessibleStateType::VISIBLE );
941  _rStateSet.AddState( AccessibleStateType::ENABLED );
942  }
943 
944  if ( IsRowSelected( _nRow ) )
945  {
946  _rStateSet.AddState( AccessibleStateType::ACTIVE );
947  _rStateSet.AddState( AccessibleStateType::SELECTED );
948  }
949  if ( IsEnabled() )
950  _rStateSet.AddState( AccessibleStateType::ENABLED );
951 }
952 
954 {
955  GrabFocus();
956 }
957 
958 bool SvHeaderTabListBox::GetGlyphBoundRects( const Point& rOrigin, const OUString& rStr, int nIndex, int nLen, MetricVector& rVector )
959 {
960  return Control::GetGlyphBoundRects( rOrigin, rStr, nIndex, nLen, rVector );
961 }
962 
964 {
965  return Control::GetWindowExtentsRelative( pRelativeWindow );
966 }
967 
969 {
971 }
972 
973 Reference< XAccessible > SvHeaderTabListBox::GetAccessible()
974 {
975  return Control::GetAccessible();
976 }
977 
979 {
981 }
982 
984 {
985  return this;
986 }
987 
988 Reference< XAccessible > SvHeaderTabListBox::CreateAccessible()
989 {
991  DBG_ASSERT( pParent, "SvHeaderTabListBox::::CreateAccessible - accessible parent not found" );
992 
993  Reference< XAccessible > xAccessible;
994  if ( m_pAccessible ) xAccessible = m_pAccessible->getMyself();
995 
996  if( pParent && !m_pAccessible )
997  {
998  Reference< XAccessible > xAccParent = pParent->GetAccessible();
999  if ( xAccParent.is() )
1000  {
1001  m_pAccessible = m_pImpl->m_aFactoryAccess.getFactory().createAccessibleTabListBox( xAccParent, *this );
1002  if ( m_pAccessible )
1003  xAccessible = m_pAccessible->getMyself();
1004  }
1005  }
1006  return xAccessible;
1007 }
1008 
1010 {
1011  return tools::Rectangle();
1012 }
1013 
1014 sal_Int32 SvHeaderTabListBox::GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint)
1015 {
1016  OUString sText = GetAccessibleCellText( _nRow, static_cast< sal_uInt16 >( _nColumnPos ) );
1017  MetricVector aRects;
1018  if ( GetGlyphBoundRects(Point(0,0), sText, 0, sText.getLength(), aRects) )
1019  {
1020  sal_Int32 nPos = 0;
1021  for (auto const& rectangle : aRects)
1022  {
1023  if( rectangle.IsInside(_rPoint) )
1024  return nPos;
1025  ++nPos;
1026  }
1027  }
1028 
1029  return -1;
1030 }
1031 
1032 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
void AddItem(std::unique_ptr< SvLBoxItem > pItem)
Point TopLeft() const
long Width() const
A cell of the column header bar.
virtual SvTreeListEntry * InsertEntry(const OUString &rText, SvTreeListEntry *pParent=nullptr, bool bChildrenOnDemand=false, sal_uLong nPos=TREELIST_APPEND, void *pUserData=nullptr) override
Definition: svtabbx.cxx:131
virtual void SelectAll() override
Definition: svtabbx.cxx:619
sal_Int32 nIndex
static SvButtonState ConvertToButtonState(SvItemStateFlags nItemFlags)
Definition: svlbitm.cxx:107
std::vector< tools::Rectangle > MetricVector
Definition: outdev.hxx:139
SvTabJustify
Definition: svtabbx.hxx:34
SvTabListBox(vcl::Window *pParent, WinBits)
Definition: svtabbx.cxx:94
virtual SvTreeListEntry * InsertEntryToColumn(const OUString &, SvTreeListEntry *pParent, sal_uLong nPos, sal_uInt16 nCol, void *pUserData=nullptr)
Definition: svtabbx.cxx:149
OUString aCurEntry
Definition: svtabbx.hxx:45
virtual void GrabFocus() override
Definition: svtabbx.cxx:968
Point LogicToLogic(const Point &rPtSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
Definition: map.cxx:1668
void SetTabEditable(sal_uInt16 nTab, bool bEditable)
Definition: svtabbx.cxx:379
vcl::Window * GetAccessibleParentWindow() const
bool IsCellCheckBox(long _nRow, sal_uInt16 _nColumn, TriState &_rState)
Definition: svtabbx.cxx:535
sal_uIntPtr sal_uLong
virtual sal_Int32 GetAccessibleControlCount() const override
Definition: svtabbx.cxx:771
sal_uLong GetEntryCount() const
virtual long GetRowCount() const override
Definition: svtabbx.cxx:559
sal_Int64 n
SvItemStateFlags
Definition: svlbitm.hxx:45
void SetScrolledHdl(const Link< SvTreeListBox *, void > &rLink)
AccessibleChildren m_aAccessibleChildren
Definition: svtabbx.hxx:108
SvTreeListEntry * GetEntryOnPos(sal_uLong _nEntryPos) const
Definition: svtabbx.cxx:319
sal_uLong GetEntryPos(const SvTreeListEntry *pEntry) const
Definition: svtabbx.cxx:261
long GetPos() const
SvTreeListEntry * GetCurEntry() const
TRISTATE_TRUE
::vcl::IAccessibleTabListBox * m_pAccessible
Definition: svtabbx.hxx:107
SvHeaderTabListBox(vcl::Window *pParent, WinBits nBits)
Definition: svtabbx.cxx:411
virtual bool ConvertPointToCellAddress(sal_Int32 &_rnRow, sal_uInt16 &_rnColPos, const Point &_rPoint) override
Definition: svtabbx.cxx:787
SvLBoxTabFlags nFlags
virtual sal_Int32 GetFieldIndexAtPoint(sal_Int32 _nRow, sal_Int32 _nColumnPos, const Point &_rPoint) override
Definition: svtabbx.cxx:1014
virtual vcl::Window * GetWindowInstance() override
Definition: svtabbx.cxx:983
sal_Int64 WinBits
virtual void SetNoSelection() override
Definition: svtabbx.cxx:614
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessibleCell(sal_Int32 _nRow, sal_uInt16 _nColumn) override
Definition: svtabbx.cxx:721
virtual sal_Int32 GetSelectedColumnCount() const override
Definition: svtabbx.cxx:638
css::uno::Reference< css::accessibility::XAccessible > GetAccessible(bool bCreate=true)
virtual tools::Rectangle calcTableRect(bool _bOnScreen=true) override
Definition: svtabbx.cxx:686
int nCount
virtual bool GetGlyphBoundRects(const Point &rOrigin, const OUString &rStr, int nIndex, int nLen, MetricVector &rVector) override
Definition: svtabbx.cxx:958
virtual OUString GetAccessibleObjectDescription(::vcl::AccessibleBrowseBoxObjType _eType, sal_Int32 _nPos=-1) const override
Definition: svtabbx.cxx:850
virtual OUString GetAccessibleCellText(long _nRow, sal_uInt16 _nColumnPos) const override
Definition: svtabbx.cxx:667
void SelectAll(bool bSelect, bool bPaint=true)
virtual OUString GetText() const
Definition: window.cxx:3110
VclPtr< HeaderBar > m_pHeaderBar
Definition: svtabbx.cxx:404
virtual bool IsColumnSelected(long _nColumn) const override
Definition: svtabbx.cxx:649
virtual bool GoToCell(sal_Int32 _nRow, sal_uInt16 _nColumn) override
Definition: svtabbx.cxx:609
virtual bool IsCellVisible(sal_Int32 _nRow, sal_uInt16 _nColumn) const override
Definition: svtabbx.cxx:662
static constexpr SvLBoxTabFlags MYTABMASK
Definition: svtabbx.cxx:38
virtual tools::Rectangle calcHeaderRect(bool _bIsColumnBar, bool _bOnScreen=true) override
Definition: svtabbx.cxx:672
virtual bool ConvertPointToControlIndex(sal_Int32 &_rnIndex, const Point &_rPoint) override
Definition: svtabbx.cxx:782
TRISTATE_INDET
virtual void SetTabs() override
Definition: svtabbx.cxx:43
void SetHighlightRange(sal_uInt16 nFirstTab=0, sal_uInt16 nLastTab=0xffff)
The row header bar ("handle column").
size_t ItemCount() const
virtual vcl::Window * GetAccessibleParentWindow() const override
Definition: svtabbx.cxx:978
sal_uLong GetLevelChildCount(SvTreeListEntry *pParent) const
virtual sal_uLong Insert(SvTreeListEntry *pEnt, SvTreeListEntry *pPar, sal_uLong nPos=TREELIST_APPEND) override
Definition: svtabbx.cxx:485
virtual void dispose() override
This is intended to be used to clear any locally held references to other Window-subclass objects...
Definition: svtabbx.cxx:105
#define DBG_ASSERT(sCon, aError)
virtual sal_Int32 GetSelectedRowCount() const override
Definition: svtabbx.cxx:633
int i
HeaderBar * GetHeaderBar()
Definition: svtabbx.cxx:448
std::unique_ptr<::vcl::SvHeaderTabListBoxImpl > m_pImpl
Definition: svtabbx.hxx:106
virtual void SetTabs()
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessibleColumnHeader(sal_uInt16 _nColumnPos) override
Definition: svtabbx.cxx:745
virtual bool ConvertPointToColumnHeader(sal_uInt16 &_rnColPos, const Point &_rPoint) override
Definition: svtabbx.cxx:797
TRISTATE_FALSE
virtual void SelectRow(long _nRow, bool _bSelect=true, bool bExpand=true) override
Definition: svtabbx.cxx:624
bool IsUpdateMode() const
Definition: window2.cxx:1173
bool IsSelected(SvTreeListEntry *pEntry) const
Definition: treelist.cxx:1368
Some things multiple-inherit from VclAbstractDialog and OutputDevice, so we need to use virtual inher...
Definition: outdev.hxx:304
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
virtual ~SvTabListBox() override
Definition: svtabbx.cxx:100
SvButtonState
Definition: treelistbox.hxx:57
std::vector< SvLBoxTab > mvTabList
Definition: svtabbx.hxx:44
void AddTab(long nPos, SvLBoxTabFlags nFlags)
A cell of the row header bar.
void InitHeaderBar(HeaderBar *pHeaderBar)
Definition: svtabbx.cxx:439
virtual SvTreeListEntry * InsertEntry(const OUString &rText, SvTreeListEntry *pParent=nullptr, bool bChildrenOnDemand=false, sal_uLong nPos=TREELIST_APPEND, void *pUserData=nullptr)
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override
Creates and returns the accessible object of the whole BrowseBox.
Definition: svtabbx.cxx:988
virtual void GetAllSelectedRows(css::uno::Sequence< sal_Int32 > &_rRows) const override
Definition: svtabbx.cxx:654
virtual void InitEntry(SvTreeListEntry *, const OUString &, const Image &, const Image &)
const SvLBoxItem & GetItem(size_t nPos) const
void SetTabJustify(sal_uInt16 nTab, SvTabJustify)
Definition: svtabbx.cxx:363
void GrabFocus()
Definition: window.cxx:3031
Size GetSize() const
SvItemStateFlags GetButtonFlags() const
Definition: svlbitm.hxx:173
#define OFFSET_NONE
virtual SvLBoxItemType GetType() const =0
bool GetGlyphBoundRects(const Point &rOrigin, const OUString &rStr, int nIndex, int nLen, MetricVector &rVector)
std::vector< std::unique_ptr< SvLBoxTab > > aTabs
SvTreeListEntry * Next(SvTreeListEntry *pEntry) const
virtual SvLBoxItemType GetType() const override
Definition: svlbitm.cxx:285
virtual sal_Int32 GetCurrRow() const override
Definition: svtabbx.cxx:569
OUString GetCellText(sal_uLong nPos, sal_uInt16 nCol) const
Definition: svtabbx.cxx:247
virtual css::uno::Reference< css::accessibility::XAccessible > getMyself()=0
returns the XAccessible object itself
SvTreeListEntry * First() const
virtual bool IsRowSelected(long _nRow) const override
Definition: svtabbx.cxx:643
virtual void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &) override
Definition: svtabbx.cxx:430
virtual void Invalidate(InvalidateFlags nFlags=InvalidateFlags::NONE) override
virtual void GetAllSelectedColumns(css::uno::Sequence< sal_Int32 > &_rColumns) const override
Definition: svtabbx.cxx:658
DefTokenId nToken
virtual tools::Rectangle GetFieldCharacterBounds(sal_Int32 _nRow, sal_Int32 _nColumnPos, sal_Int32 nIndex) override
Definition: svtabbx.cxx:1009
virtual tools::Rectangle GetWindowExtentsRelative(vcl::Window *pRelativeWindow) const override
Definition: svtabbx.cxx:963
def rectangle(l)
virtual OUString GetEntryText(SvTreeListEntry *pEntry) const override
Definition: svtabbx.cxx:204
virtual void InitEntry(SvTreeListEntry *, const OUString &, const Image &, const Image &) override
Definition: svtabbx.cxx:79
The BrowseBox itself.
virtual css::uno::Reference< css::accessibility::XAccessible > GetAccessible() override
Definition: svtabbx.cxx:973
virtual css::uno::Reference< css::accessibility::XAccessible > getHeaderBar()=0
returns the accessible object for the column header bar
OUString GetTabEntryText(sal_uLong nPos, sal_uInt16 nCol) const
Definition: svtabbx.cxx:281
SvTreeListEntry * GetEntry(SvTreeListEntry *pParent, sal_uLong nPos) const
Definition: image.hxx:40
AccessibleBrowseBoxObjType
This enumeration contains a constant for each kind of accessible object of a BrowseBox.
virtual bool HasRowHeader() const override
Definition: svtabbx.cxx:604
virtual void FillAccessibleStateSet(::utl::AccessibleStateSetHelper &_rStateSet,::vcl::AccessibleBrowseBoxObjType _eType) const override
Definition: svtabbx.cxx:878
virtual SvTreeListEntry * InsertEntryToColumn(const OUString &, SvTreeListEntry *pParent, sal_uLong nPos, sal_uInt16 nCol, void *pUserData=nullptr) override
Definition: svtabbx.cxx:467
virtual tools::Rectangle GetFieldRectPixelAbs(sal_Int32 _nRow, sal_uInt16 _nColumn, bool _bIsHeader, bool _bOnScreen=true) override
Definition: svtabbx.cxx:696
tools::Rectangle GetBoundingRect(SvTreeListEntry *pEntry)
Calculate and return the bounding rectangle of an entry.
AccessibleFactoryAccess m_aFactoryAccess
Definition: svtabbx.cxx:405
bool IsActive() const
Definition: window2.cxx:1183
SvxBoxItem & rBoxItem
virtual OUString GetAccessibleObjectName(::vcl::AccessibleBrowseBoxObjType _eType, sal_Int32 _nPos=-1) const override
Definition: svtabbx.cxx:802
virtual void dispose() override
This is intended to be used to clear any locally held references to other Window-subclass objects...
static OUString GetToken(const OUString &sStr, sal_Int32 &nIndex)
Definition: svtabbx.cxx:276
virtual void SelectColumn(sal_uInt16 _nColumn, bool _bSelect=true) override
Definition: svtabbx.cxx:629
virtual sal_uInt16 GetColumnCount() const override
Definition: svtabbx.cxx:564
bool IsEnabled() const
Definition: window2.cxx:1122
MapUnit
#define SAL_WARN(area, stream)
long GetLogicTab(sal_uInt16 nTab)
Definition: svtabbx.cxx:391
OUString VclResId(const char *pId)
Definition: svdata.cxx:266
virtual OUString GetRowDescription(sal_Int32 _nRow) const override
Definition: svtabbx.cxx:594
virtual bool Select(SvTreeListEntry *pEntry, bool bSelect=true)
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessibleRowHeader(sal_Int32 _nRow) override
Definition: svtabbx.cxx:739
virtual bool ConvertPointToRowHeader(sal_Int32 &_rnRow, const Point &_rPoint) override
Definition: svtabbx.cxx:792
virtual OUString GetColumnDescription(sal_uInt16 _nColumn) const override
Definition: svtabbx.cxx:599
SvLBoxTabFlags
Definition: treelistbox.hxx:63
::std::unique_ptr< XmlIdRegistry_Impl > m_pImpl
bool IsReallyVisible() const
Definition: window2.cxx:1107
SvTreeFlags nTreeFlags
TriState
virtual void FillAccessibleStateSetForCell(::utl::AccessibleStateSetHelper &_rStateSet, sal_Int32 _nRow, sal_uInt16 _nColumn) const override
Definition: svtabbx.cxx:933
bool HasFocus() const
Definition: window.cxx:3036
sal_uLong GetSelectionCount() const
Definition: treelist.cxx:1088
virtual void dispose() override
This is intended to be used to clear any locally held references to other Window-subclass objects...
Definition: svtabbx.cxx:424
virtual sal_uLong Insert(SvTreeListEntry *pEnt, SvTreeListEntry *pPar, sal_uLong nPos=TREELIST_APPEND)
void AddState(sal_Int16 aState)
virtual void GrabTableFocus() override
Definition: svtabbx.cxx:953
aStr
static bool IsItemChecked(SvTreeListEntry *pEntry, sal_uInt16 nCol)
Definition: svtabbx.cxx:453
tools::Rectangle GetWindowExtentsRelative(vcl::Window *pRelativeWindow) const
Definition: window.cxx:2955
virtual sal_uInt16 GetCurrColumn() const override
Definition: svtabbx.cxx:589
SvTreeListEntry * GetChildOnPos(SvTreeListEntry *_pParent, sal_uLong _nEntryPos, sal_uLong &_rPos) const
Definition: svtabbx.cxx:343
virtual void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect) override
The horizontal column header bar.
sal_uInt16 nPos
IMPL_LINK_NOARG(SvHeaderTabListBox, ScrollHdl_Impl, SvTreeListBox *, void)
Definition: svtabbx.cxx:500
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessibleControl(sal_Int32 _nIndex) override
Definition: svtabbx.cxx:776
virtual ~SvHeaderTabListBox() override
Definition: svtabbx.cxx:419
void RecalculateAccessibleChildren()
Definition: svtabbx.cxx:521