xref: /AOO41X/main/svx/source/accessibility/charmapacc.cxx (revision 8809db7a87f97847b57a57f4cd2b0104b2b83182)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 
27 #define _SVX_CHARMAP_CXX_
28 #include <unotools/accessiblestatesethelper.hxx>
29 #include <vcl/svapp.hxx>
30 #include <stdio.h>
31 #include <svx/charmap.hxx>
32 #include "charmapacc.hxx"
33 #include <com/sun/star/accessibility/AccessibleRole.hpp>
34 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
35 #include <toolkit/helper/externallock.hxx>
36 #include <toolkit/helper/convert.hxx>
37 #include <osl/interlck.h>
38 #include <svx/dialmgr.hxx>
39 #include "accessibility.hrc"
40 #include <comphelper/types.hxx>
41 
42 namespace svx
43 {
44     using namespace comphelper;
45     using namespace ::com::sun::star;
46     using namespace ::com::sun::star::uno;
47     using namespace ::com::sun::star::lang;
48     using namespace ::com::sun::star::accessibility;
49 
50 // ----------------
51 // - SvxShowCharSetVirtualAcc -
52 // ----------------
53 SvxShowCharSetVirtualAcc::SvxShowCharSetVirtualAcc( SvxShowCharSet* pParent ) : OAccessibleComponentHelper(new VCLExternalSolarLock())
54 ,mpParent( pParent )
55 ,m_pTable(NULL)
56 {
57     osl_incrementInterlockedCount(&m_refCount);
58     { // #b6211265 #
59         lateInit(this);
60     }
61     osl_decrementInterlockedCount(&m_refCount);
62 }
63 
64 // -----------------------------------------------------------------------------
65 
66 SvxShowCharSetVirtualAcc::~SvxShowCharSetVirtualAcc()
67 {
68     ensureDisposed();
69     delete getExternalLock();
70 }
71 // -----------------------------------------------------------------------------
72 IMPLEMENT_FORWARD_XINTERFACE2( SvxShowCharSetVirtualAcc, OAccessibleComponentHelper, OAccessibleHelper_Base_2 )
73 IMPLEMENT_FORWARD_XTYPEPROVIDER2( SvxShowCharSetVirtualAcc, OAccessibleComponentHelper, OAccessibleHelper_Base_2 )
74 
75 void SAL_CALL SvxShowCharSetVirtualAcc::fireEvent(
76                     const sal_Int16 _nEventId,
77                     const ::com::sun::star::uno::Any& _rOldValue,
78                     const ::com::sun::star::uno::Any& _rNewValue
79                 )
80 {
81     if ( m_pTable )
82         m_pTable->fireEvent(_nEventId,_rOldValue,_rNewValue);
83 }
84 // -----------------------------------------------------------------------------
85 sal_Int32 SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleChildCount(  ) throw (RuntimeException)
86 {
87     OExternalLockGuard aGuard( this );
88     ensureAlive();
89     return ( mpParent->getScrollBar()->IsVisible() ) ? 2 : 1;
90 }
91 // -----------------------------------------------------------------------------
92 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleAtPoint( const awt::Point& aPoint )
93     throw (uno::RuntimeException)
94 {
95     OExternalLockGuard aGuard( this );
96     ensureAlive();
97 
98     uno::Reference< accessibility::XAccessible >    xRet;
99     const sal_uInt16 nItemId = sal::static_int_cast<sal_uInt16>(mpParent->PixelToMapIndex( Point( aPoint.X, aPoint.Y ) ));
100 
101     if( sal_uInt16(-1) != nItemId )
102     {
103         if ( !m_pTable )
104             m_pTable = new SvxShowCharSetAcc(this);
105         xRet = m_pTable;
106     }
107     else if ( mpParent->getScrollBar()->IsVisible() )
108     {
109         const Point aOutPos( mpParent->getScrollBar()->GetPosPixel() );
110         const Size  aScrollBar = mpParent->getScrollBar()->GetOutputSizePixel();
111         Rectangle aRect(aOutPos,aScrollBar);
112 
113         if ( aRect.IsInside(VCLPoint(aPoint)) )
114             xRet = mpParent->getScrollBar()->GetAccessible();
115     }
116     return xRet;
117 }
118 // -----------------------------------------------------------------------------
119 uno::Any SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleKeyBinding()
120     throw (uno::RuntimeException)
121 {
122     return uno::Any();
123 }
124 // -----------------------------------------------------------------------------
125 void SAL_CALL SvxShowCharSetVirtualAcc::grabFocus()
126     throw (uno::RuntimeException)
127 {
128     OExternalLockGuard aGuard( this );
129     ensureAlive();
130     mpParent->GrabFocus();
131 }
132 
133 
134 // -----------------------------------------------------------------------------
135 Reference< XAccessible > SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException)
136 {
137     OExternalLockGuard aGuard( this );
138     ensureAlive();
139     if ( mpParent->getScrollBar()->IsVisible() && i == 0 )
140         return mpParent->getScrollBar()->GetAccessible();
141     else if ( i == 1 )
142     {
143         if ( !m_xAcc.is() )
144         {
145             m_pTable = new SvxShowCharSetAcc(this);
146             m_xAcc = m_pTable;
147         }
148     }
149     else
150         throw IndexOutOfBoundsException();
151     return m_xAcc;
152 }
153 // -----------------------------------------------------------------------------
154 Reference< XAccessible > SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleParent(  ) throw (RuntimeException)
155 {
156     OExternalLockGuard aGuard( this );
157     ensureAlive();
158     Window*                                         pParent = mpParent->GetParent();
159     uno::Reference< accessibility::XAccessible >    xRet;
160 
161     if ( pParent )
162         xRet = pParent->GetAccessible();
163 
164     return xRet;
165 }
166 // -----------------------------------------------------------------------------
167 ::com::sun::star::awt::Rectangle SAL_CALL SvxShowCharSetVirtualAcc::implGetBounds(  ) throw (RuntimeException)
168 {
169     const Point   aOutPos( mpParent->GetPosPixel() );
170     Size          aOutSize( mpParent->GetOutputSizePixel() );
171     if ( mpParent->getScrollBar()->IsVisible() )
172     {
173         const Size aScrollBar = mpParent->getScrollBar()->GetOutputSizePixel();
174         aOutSize.Width() -= aScrollBar.Width();
175         aOutSize.Height() -= aScrollBar.Height();
176     }
177 
178     awt::Rectangle aRet;
179 
180     aRet.X = aOutPos.X();
181     aRet.Y = aOutPos.Y();
182     aRet.Width = aOutSize.Width();
183     aRet.Height = aOutSize.Height();
184 
185     return aRet;
186 }
187 // -----------------------------------------------------------------------------
188 sal_Int16 SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleRole(  ) throw (RuntimeException)
189 {
190     return accessibility::AccessibleRole::SCROLL_PANE;
191 }
192 // -----------------------------------------------------------------------------
193 ::rtl::OUString SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleDescription(  ) throw (RuntimeException)
194 {
195     OExternalLockGuard aGuard( this );
196     return SVX_RESSTR( RID_SVXSTR_CHARACTER_SELECTION);
197 }
198 // -----------------------------------------------------------------------------
199 ::rtl::OUString SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleName(  ) throw (RuntimeException)
200 {
201     OExternalLockGuard aGuard( this );
202     return SVX_RESSTR( RID_SVXSTR_CHAR_SEL_DESC);
203 }
204 // -----------------------------------------------------------------------------
205 Reference< XAccessibleRelationSet > SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleRelationSet(  ) throw (RuntimeException)
206 {
207     return Reference< XAccessibleRelationSet >();
208 }
209 // -----------------------------------------------------------------------------
210 Reference< XAccessibleStateSet > SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleStateSet(  ) throw (RuntimeException)
211 {
212     OExternalLockGuard aGuard( this );
213 
214     ::utl::AccessibleStateSetHelper*    pStateSet = new ::utl::AccessibleStateSetHelper;
215 
216     if( mpParent )
217     {
218         // SELECTABLE
219         pStateSet->AddState( AccessibleStateType::FOCUSABLE );
220         if ( mpParent->HasFocus() )
221             pStateSet->AddState( AccessibleStateType::FOCUSED );
222         if ( mpParent->IsActive() )
223             pStateSet->AddState( AccessibleStateType::ACTIVE );
224         if ( mpParent->IsEnabled() )
225         {
226             pStateSet->AddState( AccessibleStateType::ENABLED );
227             pStateSet->AddState( AccessibleStateType::SENSITIVE );
228         }
229         if ( mpParent->IsReallyVisible() )
230             pStateSet->AddState( AccessibleStateType::VISIBLE );
231     }
232 
233     return pStateSet;
234 }
235 // -----------------------------------------------------------------------------
236 void SAL_CALL SvxShowCharSetVirtualAcc::disposing()
237 {
238     OAccessibleContextHelper::disposing();
239     if ( m_pTable )
240         m_pTable->dispose();
241     m_pTable = NULL;
242 }
243 // -----------------------------------------------------------------------------
244 // ----------------
245 // - SvxShowCharSetItem -
246 // ----------------
247 
248 SvxShowCharSetItem::SvxShowCharSetItem( SvxShowCharSet& rParent,SvxShowCharSetAcc*  _pParent,sal_uInt16 _nPos ) :
249     mrParent( rParent )
250     ,mnId( _nPos )
251     ,m_pItem(NULL)
252     ,m_pParent(_pParent)
253 {
254 }
255 // -----------------------------------------------------------------------
256 
257 SvxShowCharSetItem::~SvxShowCharSetItem()
258 {
259     if ( m_xAcc.is() )
260     {
261         m_pItem->ParentDestroyed();
262         ClearAccessible();
263     }
264 }
265 
266 // -----------------------------------------------------------------------
267 
268 uno::Reference< accessibility::XAccessible > SvxShowCharSetItem::GetAccessible()
269 {
270     if( !m_xAcc.is() )
271     {
272         m_pItem = new SvxShowCharSetItemAcc( this );
273         m_xAcc = m_pItem;
274     }
275 
276     return m_xAcc;
277 }
278 
279 // -----------------------------------------------------------------------
280 
281 void SvxShowCharSetItem::ClearAccessible()
282 {
283     if ( m_xAcc.is() )
284     {
285         m_pItem = NULL;
286         m_xAcc  = NULL;
287     }
288 }
289 
290 
291 // ---------------
292 // - SvxShowCharSetAcc -
293 // ---------------
294 
295 SvxShowCharSetAcc::SvxShowCharSetAcc( SvxShowCharSetVirtualAcc* _pParent ) : OAccessibleSelectionHelper(new VCLExternalSolarLock())
296   ,m_pParent( _pParent )
297 {
298     osl_incrementInterlockedCount(&m_refCount);
299     { // #b6211265 #
300         lateInit(this);
301     }
302     osl_decrementInterlockedCount(&m_refCount);
303 }
304 
305 // -----------------------------------------------------------------------------
306 
307 SvxShowCharSetAcc::~SvxShowCharSetAcc()
308 {
309     ensureDisposed();
310     delete getExternalLock();
311 }
312 // -----------------------------------------------------------------------------
313 void SAL_CALL SvxShowCharSetAcc::disposing()
314 {
315     OAccessibleSelectionHelper::disposing();
316     ::std::vector< Reference< XAccessible > >::iterator aIter = m_aChildren.begin();
317     ::std::vector< Reference< XAccessible > >::iterator aEnd  = m_aChildren.end();
318     for (;aIter != aEnd ; ++aIter)
319         ::comphelper::disposeComponent(*aIter);
320 
321     m_aChildren.clear();
322     m_pParent = NULL;
323 }
324 
325 // -----------------------------------------------------------------------------
326 IMPLEMENT_FORWARD_XINTERFACE2( SvxShowCharSetAcc, OAccessibleSelectionHelper, OAccessibleHelper_Base )
327 IMPLEMENT_FORWARD_XTYPEPROVIDER2( SvxShowCharSetAcc, OAccessibleSelectionHelper, OAccessibleHelper_Base )
328 // -----------------------------------------------------------------------
329 sal_Bool SvxShowCharSetAcc::implIsSelected( sal_Int32 nAccessibleChildIndex ) throw (RuntimeException)
330 {
331     return m_pParent && m_pParent->getCharSetControl()->IsSelected(
332         sal::static_int_cast<sal_uInt16>(nAccessibleChildIndex));
333 }
334 // -----------------------------------------------------------------------------
335         // select the specified child => watch for special ChildIndexes (ACCESSIBLE_SELECTION_CHILD_xxx)
336 void SvxShowCharSetAcc::implSelect( sal_Int32 nAccessibleChildIndex, sal_Bool bSelect ) throw (IndexOutOfBoundsException, RuntimeException)
337 {
338     if ( m_pParent )
339     {
340         if ( bSelect )
341             m_pParent->getCharSetControl()->SelectIndex(nAccessibleChildIndex,sal_True);
342         else
343             m_pParent->getCharSetControl()->DeSelect();
344     }
345 }
346 // -----------------------------------------------------------------------------
347 ::com::sun::star::awt::Rectangle SAL_CALL SvxShowCharSetAcc::implGetBounds(  ) throw (RuntimeException)
348 {
349     const Point   aOutPos( m_pParent->getCharSetControl()->GetPosPixel() );
350     Size          aOutSize( m_pParent->getCharSetControl()->GetOutputSizePixel());
351     if ( m_pParent->getCharSetControl()->getScrollBar()->IsVisible() )
352     {
353         const Size aScrollBar = m_pParent->getCharSetControl()->getScrollBar()->GetOutputSizePixel();
354         aOutSize.Width() -= aScrollBar.Width();
355         aOutSize.Height() -= aScrollBar.Height();
356     }
357 
358     awt::Rectangle aRet;
359 
360     aRet.X = aOutPos.X();
361     aRet.Y = aOutPos.Y();
362     aRet.Width = aOutSize.Width();
363     aRet.Height = aOutSize.Height();
364 
365     return aRet;
366 }
367 // -----------------------------------------------------------------------------
368 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleChildCount()
369     throw (uno::RuntimeException)
370 {
371     OExternalLockGuard aGuard( this );
372     ensureAlive();
373     return m_pParent->getCharSetControl()->getMaxCharCount();
374 }
375 
376 // -----------------------------------------------------------------------------
377 
378 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleChild( sal_Int32 i )
379     throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
380 {
381     OExternalLockGuard aGuard( this );
382     ensureAlive();
383     uno::Reference< accessibility::XAccessible >    xRet;
384     SvxShowCharSetItem* pItem = m_pParent->getCharSetControl()->ImplGetItem( static_cast< sal_uInt16 >( i ) );
385 
386     if( pItem )
387     {
388         pItem->m_pParent = this;
389         xRet = pItem->GetAccessible();
390         m_aChildren.push_back(xRet);
391     }
392     else
393         throw lang::IndexOutOfBoundsException();
394 
395     return xRet;
396 }
397 
398 // -----------------------------------------------------------------------------
399 
400 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleParent()
401     throw (uno::RuntimeException)
402 {
403     OExternalLockGuard aGuard( this );
404     ensureAlive();
405     return m_pParent;
406 }
407 
408 // -----------------------------------------------------------------------------
409 
410 sal_Int16 SAL_CALL SvxShowCharSetAcc::getAccessibleRole()
411     throw (uno::RuntimeException)
412 {
413     return accessibility::AccessibleRole::TABLE;
414 }
415 
416 // -----------------------------------------------------------------------------
417 
418 ::rtl::OUString SAL_CALL SvxShowCharSetAcc::getAccessibleDescription()
419     throw (uno::RuntimeException)
420 {
421     OExternalLockGuard aGuard( this );
422     return SVX_RESSTR( RID_SVXSTR_CHARACTER_SELECTION );
423 }
424 
425 // -----------------------------------------------------------------------------
426 
427 ::rtl::OUString SAL_CALL SvxShowCharSetAcc::getAccessibleName()
428     throw (uno::RuntimeException)
429 {
430     OExternalLockGuard aGuard( this );
431     ensureAlive();
432     return SVX_RESSTR( RID_SVXSTR_CHAR_SEL_DESC );
433 }
434 
435 // -----------------------------------------------------------------------------
436 
437 uno::Reference< accessibility::XAccessibleRelationSet > SAL_CALL SvxShowCharSetAcc::getAccessibleRelationSet()
438     throw (uno::RuntimeException)
439 {
440     return uno::Reference< accessibility::XAccessibleRelationSet >();
441 }
442 
443 // -----------------------------------------------------------------------------
444 
445 uno::Reference< accessibility::XAccessibleStateSet > SAL_CALL SvxShowCharSetAcc::getAccessibleStateSet()
446     throw (uno::RuntimeException)
447 {
448     OExternalLockGuard aGuard( this );
449 
450     ::utl::AccessibleStateSetHelper*    pStateSet = new ::utl::AccessibleStateSetHelper;
451 
452     if( m_pParent->getCharSetControl() )
453     {
454         // SELECTABLE
455         pStateSet->AddState( AccessibleStateType::FOCUSABLE );
456         if ( m_pParent->getCharSetControl()->HasFocus() )
457             pStateSet->AddState( AccessibleStateType::FOCUSED );
458         if ( m_pParent->getCharSetControl()->IsActive() )
459             pStateSet->AddState( AccessibleStateType::ACTIVE );
460         if ( m_pParent->getCharSetControl()->IsEnabled() )
461         {
462             pStateSet->AddState( AccessibleStateType::ENABLED );
463             pStateSet->AddState( AccessibleStateType::SENSITIVE );
464         }
465         if ( m_pParent->getCharSetControl()->IsReallyVisible() )
466             pStateSet->AddState( AccessibleStateType::VISIBLE );
467 
468         pStateSet->AddState( AccessibleStateType::MANAGES_DESCENDANTS );
469     }
470 
471     return pStateSet;
472 }
473 // -----------------------------------------------------------------------------
474 
475 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleAtPoint( const awt::Point& aPoint )
476     throw (uno::RuntimeException)
477 {
478     OExternalLockGuard aGuard( this );
479     ensureAlive();
480 
481     uno::Reference< accessibility::XAccessible >    xRet;
482     const sal_uInt16 nItemId = sal::static_int_cast<sal_uInt16>(
483         m_pParent->getCharSetControl()->PixelToMapIndex( Point( aPoint.X, aPoint.Y ) ));
484 
485     if( sal_uInt16(-1) != nItemId )
486     {
487         SvxShowCharSetItem* pItem = m_pParent->getCharSetControl()->ImplGetItem( nItemId );
488         xRet = pItem->GetAccessible();
489     }
490     return xRet;
491 }
492 
493 // -----------------------------------------------------------------------------
494 // -----------------------------------------------------------------------------
495 
496 void SAL_CALL SvxShowCharSetAcc::grabFocus()
497     throw (uno::RuntimeException)
498 {
499     OExternalLockGuard aGuard( this );
500     ensureAlive();
501     m_pParent->getCharSetControl()->GrabFocus();
502 }
503 
504 // -----------------------------------------------------------------------------
505 
506 uno::Any SAL_CALL SvxShowCharSetAcc::getAccessibleKeyBinding()
507     throw (uno::RuntimeException)
508 {
509     return uno::Any();
510 }
511 // -----------------------------------------------------------------------------
512 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleRowCount(  ) throw (RuntimeException)
513 {
514     return ((getAccessibleChildCount()-1) / COLUMN_COUNT) + 1;
515 }
516 // -----------------------------------------------------------------------------
517 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleColumnCount(  ) throw (RuntimeException)
518 {
519     return COLUMN_COUNT;
520 }
521 // -----------------------------------------------------------------------------
522 ::rtl::OUString SAL_CALL SvxShowCharSetAcc::getAccessibleRowDescription( sal_Int32 /*nRow*/ ) throw (IndexOutOfBoundsException, RuntimeException)
523 {
524     return ::rtl::OUString();
525 }
526 // -----------------------------------------------------------------------------
527 ::rtl::OUString SAL_CALL SvxShowCharSetAcc::getAccessibleColumnDescription( sal_Int32 /*nColumn*/ ) throw (IndexOutOfBoundsException, RuntimeException)
528 {
529     return ::rtl::OUString();
530 }
531 // -----------------------------------------------------------------------------
532 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleRowExtentAt( sal_Int32 /*nRow*/, sal_Int32 /*nColumn*/ ) throw (IndexOutOfBoundsException, RuntimeException)
533 {
534     return 1;
535 }
536 // -----------------------------------------------------------------------------
537 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleColumnExtentAt( sal_Int32 /*nRow*/, sal_Int32 /*nColumn*/ ) throw (IndexOutOfBoundsException, RuntimeException)
538 {
539     return 1;
540 }
541 // -----------------------------------------------------------------------------
542 Reference< XAccessibleTable > SAL_CALL SvxShowCharSetAcc::getAccessibleRowHeaders(  ) throw (RuntimeException)
543 {
544     return Reference< XAccessibleTable >();
545 }
546 // -----------------------------------------------------------------------------
547 Reference< XAccessibleTable > SAL_CALL SvxShowCharSetAcc::getAccessibleColumnHeaders(  ) throw (RuntimeException)
548 {
549     return Reference< XAccessibleTable >();
550 }
551 // -----------------------------------------------------------------------------
552 Sequence< sal_Int32 > SAL_CALL SvxShowCharSetAcc::getSelectedAccessibleRows(  ) throw (RuntimeException)
553 {
554     OExternalLockGuard aGuard( this );
555     ensureAlive();
556     Sequence< sal_Int32 > aSel(1);
557     aSel[0] = m_pParent->getCharSetControl()->GetRowPos(m_pParent->getCharSetControl()->GetSelectIndexId());
558     return aSel;
559 }
560 // -----------------------------------------------------------------------------
561 Sequence< sal_Int32 > SAL_CALL SvxShowCharSetAcc::getSelectedAccessibleColumns(  ) throw (RuntimeException)
562 {
563     OExternalLockGuard aGuard( this );
564     ensureAlive();
565     Sequence< sal_Int32 > aSel(1);
566     aSel[0] = m_pParent->getCharSetControl()->GetColumnPos(m_pParent->getCharSetControl()->GetSelectIndexId());
567     return aSel;
568 }
569 // -----------------------------------------------------------------------------
570 sal_Bool SAL_CALL SvxShowCharSetAcc::isAccessibleRowSelected( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException)
571 {
572     OExternalLockGuard aGuard( this );
573     ensureAlive();
574     return m_pParent->getCharSetControl()->GetRowPos(m_pParent->getCharSetControl()->GetSelectIndexId()) == nRow;
575 }
576 // -----------------------------------------------------------------------------
577 sal_Bool SAL_CALL SvxShowCharSetAcc::isAccessibleColumnSelected( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
578 {
579     OExternalLockGuard aGuard( this );
580     ensureAlive();
581     return m_pParent->getCharSetControl()->GetColumnPos(m_pParent->getCharSetControl()->GetSelectIndexId()) == nColumn;
582 }
583 // -----------------------------------------------------------------------------
584 Reference< XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
585 {
586     OExternalLockGuard aGuard( this );
587     ensureAlive();
588     ::svx::SvxShowCharSetItem* pItem = m_pParent->getCharSetControl()->ImplGetItem(
589         sal::static_int_cast<sal_uInt16>(getAccessibleIndex(nRow,nColumn) ));
590     if ( !pItem  )
591         throw IndexOutOfBoundsException();
592     return pItem->GetAccessible();
593 }
594 // -----------------------------------------------------------------------------
595 Reference< XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleCaption(  ) throw (RuntimeException)
596 {
597     return Reference< XAccessible >();
598 }
599 // -----------------------------------------------------------------------------
600 Reference< XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleSummary(  ) throw (RuntimeException)
601 {
602     return Reference< XAccessible >();
603 }
604 // -----------------------------------------------------------------------------
605 sal_Bool SAL_CALL SvxShowCharSetAcc::isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
606 {
607     OExternalLockGuard aGuard( this );
608     ensureAlive();
609     return m_pParent->getCharSetControl()->GetSelectIndexId() == getAccessibleIndex(nRow,nColumn);
610 }
611 // -----------------------------------------------------------------------------
612 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
613 {
614     return (nRow*COLUMN_COUNT) + nColumn;
615 }
616 // -----------------------------------------------------------------------------
617 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleRow( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
618 {
619     OExternalLockGuard aGuard( this );
620     ensureAlive();
621     return m_pParent->getCharSetControl()->GetRowPos(sal::static_int_cast<sal_uInt16>(nChildIndex));
622 }
623 // -----------------------------------------------------------------------------
624 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleColumn( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
625 {
626     OExternalLockGuard aGuard( this );
627     ensureAlive();
628     return m_pParent->getCharSetControl()->GetColumnPos(sal::static_int_cast<sal_uInt16>(nChildIndex));
629 }
630 // -----------------------------------------------------------------------------
631 
632 // -----------------------------------------------------------------------------
633 // ----------------
634 // - SvxShowCharSetItemAcc -
635 // ----------------
636 
637 SvxShowCharSetItemAcc::SvxShowCharSetItemAcc( SvxShowCharSetItem* pParent ) : OAccessibleComponentHelper(new VCLExternalSolarLock())
638 ,mpParent( pParent )
639 {
640     OSL_ENSURE(pParent,"NO parent supplied!");
641     osl_incrementInterlockedCount(&m_refCount);
642     { // #b6211265 #
643         lateInit(this);
644     }
645     osl_decrementInterlockedCount(&m_refCount);
646 }
647 
648 // -----------------------------------------------------------------------------
649 
650 SvxShowCharSetItemAcc::~SvxShowCharSetItemAcc()
651 {
652     ensureDisposed();
653     delete getExternalLock();
654 }
655 // -----------------------------------------------------------------------------
656 IMPLEMENT_FORWARD_XINTERFACE2( SvxShowCharSetItemAcc, OAccessibleComponentHelper, OAccessibleHelper_Base_2 )
657 IMPLEMENT_FORWARD_XTYPEPROVIDER2( SvxShowCharSetItemAcc, OAccessibleComponentHelper, OAccessibleHelper_Base_2 )
658 // -----------------------------------------------------------------------------
659 
660 void SvxShowCharSetItemAcc::ParentDestroyed()
661 {
662     const ::osl::MutexGuard aGuard( GetMutex() );
663     mpParent = NULL;
664 }
665 
666 // -----------------------------------------------------------------------------
667 
668 sal_Int32 SAL_CALL SvxShowCharSetItemAcc::getAccessibleChildCount()
669     throw (uno::RuntimeException)
670 {
671     return 0;
672 }
673 
674 // -----------------------------------------------------------------------------
675 
676 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetItemAcc::getAccessibleChild( sal_Int32 /*i*/ )
677     throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
678 {
679     throw lang::IndexOutOfBoundsException();
680 }
681 
682 // -----------------------------------------------------------------------------
683 
684 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetItemAcc::getAccessibleParent()
685     throw (uno::RuntimeException)
686 {
687     OExternalLockGuard aGuard( this );
688     ensureAlive();
689     return mpParent->m_pParent;
690 }
691 
692 // -----------------------------------------------------------------------------
693 
694 sal_Int16 SAL_CALL SvxShowCharSetItemAcc::getAccessibleRole()
695     throw (uno::RuntimeException)
696 {
697     return accessibility::AccessibleRole::LABEL;
698 }
699 
700 // -----------------------------------------------------------------------------
701 
702 ::rtl::OUString SAL_CALL SvxShowCharSetItemAcc::getAccessibleDescription()
703     throw (uno::RuntimeException)
704 {
705     OExternalLockGuard aGuard( this );
706     ensureAlive();
707     String sDescription = SVX_RESSTR( RID_SVXSTR_CHARACTER_CODE );
708 
709     sal_Unicode c = mpParent->maText.GetChar(0);
710     char buf[16] = "0x0000";
711     sal_Unicode c_Shifted = c;
712     for( int i = 0; i < 4; ++i )
713     {
714         char h = (char)(c_Shifted & 0x0F);
715         buf[5-i] = (h > 9) ? (h - 10 + 'A') : (h + '0');
716         c_Shifted >>= 4;
717     }
718     if( c < 256 )
719         snprintf( buf+6, 10, " (%d)", c );
720     sDescription.AppendAscii(buf);
721 
722     return sDescription;
723 }
724 
725 // -----------------------------------------------------------------------------
726 
727 ::rtl::OUString SAL_CALL SvxShowCharSetItemAcc::getAccessibleName()
728     throw (uno::RuntimeException)
729 {
730     OExternalLockGuard aGuard( this );
731     ensureAlive();
732     String aRet;
733 
734     if( mpParent )
735     {
736         aRet = mpParent->maText;
737 
738         if( !aRet.Len() )
739             aRet = getAccessibleDescription();
740     }
741 
742     return aRet;
743 }
744 
745 // -----------------------------------------------------------------------------
746 
747 uno::Reference< accessibility::XAccessibleRelationSet > SAL_CALL SvxShowCharSetItemAcc::getAccessibleRelationSet()
748     throw (uno::RuntimeException)
749 {
750     return uno::Reference< accessibility::XAccessibleRelationSet >();
751 }
752 
753 // -----------------------------------------------------------------------------
754 
755 uno::Reference< accessibility::XAccessibleStateSet > SAL_CALL SvxShowCharSetItemAcc::getAccessibleStateSet()
756     throw (uno::RuntimeException)
757 {
758     OExternalLockGuard aGuard( this );
759     ensureAlive();
760 
761     ::utl::AccessibleStateSetHelper*    pStateSet = new ::utl::AccessibleStateSetHelper;
762 
763     if( mpParent )
764     {
765         // SELECTABLE
766         pStateSet->AddState( accessibility::AccessibleStateType::SELECTABLE );
767         pStateSet->AddState( accessibility::AccessibleStateType::FOCUSABLE );
768 
769         // SELECTED
770         if( mpParent->mrParent.GetSelectIndexId() == mpParent->mnId )
771         {
772             pStateSet->AddState( accessibility::AccessibleStateType::SELECTED );
773             pStateSet->AddState( accessibility::AccessibleStateType::FOCUSED );
774         }
775         if ( mpParent->mnId >= mpParent->mrParent.FirstInView() && mpParent->mnId <= mpParent->mrParent.LastInView() )
776             pStateSet->AddState( AccessibleStateType::VISIBLE );
777         pStateSet->AddState( AccessibleStateType::TRANSIENT );
778     }
779 
780     return pStateSet;
781 }
782 
783 // -----------------------------------------------------------------------------
784 void SAL_CALL SvxShowCharSetItemAcc::grabFocus()
785     throw (uno::RuntimeException)
786 {
787     // nothing to do
788 }
789 
790 // -----------------------------------------------------------------------------
791 
792 uno::Any SAL_CALL SvxShowCharSetItemAcc::getAccessibleKeyBinding()
793     throw (uno::RuntimeException)
794 {
795     return uno::Any();
796 }
797 // -----------------------------------------------------------------------------
798 awt::Rectangle SAL_CALL SvxShowCharSetItemAcc::implGetBounds(  ) throw (RuntimeException)
799 {
800     awt::Rectangle      aRet;
801 
802     if( mpParent )
803     {
804         Rectangle   aRect( mpParent->maRect );
805         Point       aOrigin;
806         Rectangle   aParentRect( aOrigin, mpParent->mrParent.GetOutputSizePixel() );
807 
808         aRect.Intersection( aParentRect );
809 
810         aRet.X = aRect.Left();
811         aRet.Y = aRect.Top();
812         aRet.Width = aRect.GetWidth();
813         aRet.Height = aRect.GetHeight();
814     }
815 
816     return aRet;
817 }
818 // -----------------------------------------------------------------------------
819 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetItemAcc::getAccessibleAtPoint( const awt::Point& /*aPoint*/ )
820     throw (uno::RuntimeException)
821 {
822     return uno::Reference< accessibility::XAccessible >();
823 }
824 // -----------------------------------------------------------------------------
825 sal_Int32 SAL_CALL SvxShowCharSetVirtualAcc::getForeground(  ) throw (RuntimeException)
826 {
827     OExternalLockGuard aGuard( this );
828 
829     sal_Int32 nColor = 0;
830     if ( mpParent )
831     {
832         if ( mpParent->IsControlForeground() )
833             nColor = mpParent->GetControlForeground().GetColor();
834         else
835         {
836             Font aFont;
837             if ( mpParent->IsControlFont() )
838                 aFont = mpParent->GetControlFont();
839             else
840                 aFont = mpParent->GetFont();
841             nColor = aFont.GetColor().GetColor();
842         }
843     }
844 
845     return nColor;
846 }
847 // -----------------------------------------------------------------------------
848 sal_Int32 SAL_CALL SvxShowCharSetVirtualAcc::getBackground(  ) throw (RuntimeException)
849 {
850     OExternalLockGuard aGuard( this  );
851     sal_Int32 nColor = 0;
852     if ( mpParent )
853     {
854         if ( mpParent->IsControlBackground() )
855             nColor = mpParent->GetControlBackground().GetColor();
856         else
857             nColor = mpParent->GetBackground().GetColor().GetColor();
858     }
859 
860     return nColor;
861 }
862 // -----------------------------------------------------------------------------
863 sal_Int32 SAL_CALL SvxShowCharSetAcc::getForeground(  ) throw (RuntimeException)
864 {
865     OExternalLockGuard aGuard( this );
866 
867     sal_Int32 nColor = 0;
868     if ( m_pParent )
869         nColor = m_pParent->getForeground();
870     return nColor;
871 }
872 // -----------------------------------------------------------------------------
873 sal_Int32 SAL_CALL SvxShowCharSetAcc::getBackground(  ) throw (RuntimeException)
874 {
875     OExternalLockGuard aGuard( this  );
876     sal_Int32 nColor = 0;
877     if ( m_pParent )
878         nColor = m_pParent->getBackground();
879     return nColor;
880 }
881 // -----------------------------------------------------------------------------
882 
883 // -----------------------------------------------------------------------------
884 } // namespace svx
885 // -----------------------------------------------------------------------------
886 
887 
888