xref: /trunk/main/svx/source/accessibility/charmapacc.cxx (revision ffad8df045fe8db79e3e50f731c1fa6ab6501c83)
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 //IAccessibility2 Implementation 2009-----
170 /*  const Point   aOutPos( mpParent->GetPosPixel() );
171     Size          aOutSize( mpParent->GetOutputSizePixel() );
172     if ( mpParent->getScrollBar()->IsVisible() )
173     {
174         const Size aScrollBar = mpParent->getScrollBar()->GetOutputSizePixel();
175         aOutSize.Width() -= aScrollBar.Width();
176         aOutSize.Height() -= aScrollBar.Height();
177     }
178 
179     awt::Rectangle aRet;
180 
181     aRet.X = aOutPos.X();
182     aRet.Y = aOutPos.Y();
183     aRet.Width = aOutSize.Width();
184     aRet.Height = aOutSize.Height();
185 
186     return aRet;
187 */
188     ::com::sun::star::awt::Rectangle aBounds ( 0, 0, 0, 0 );
189     Window* pWindow = mpParent;
190     if ( pWindow )
191     {
192         Rectangle aRect = pWindow->GetWindowExtentsRelative( NULL );
193         aBounds = AWTRectangle( aRect );
194         Window* pParent = pWindow->GetAccessibleParentWindow();
195         if ( pParent )
196         {
197             Rectangle aParentRect = pParent->GetWindowExtentsRelative( NULL );
198             ::com::sun::star::awt::Point aParentScreenLoc = AWTPoint( aParentRect.TopLeft() );
199             aBounds.X -= aParentScreenLoc.X;
200             aBounds.Y -= aParentScreenLoc.Y;
201         }
202     }
203     return aBounds;
204     //-----IAccessibility2 Implementation 2009
205 }
206 // -----------------------------------------------------------------------------
207 sal_Int16 SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleRole(  ) throw (RuntimeException)
208 {
209     return accessibility::AccessibleRole::SCROLL_PANE;
210 }
211 // -----------------------------------------------------------------------------
212 ::rtl::OUString SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleDescription(  ) throw (RuntimeException)
213 {
214     OExternalLockGuard aGuard( this );
215     return SVX_RESSTR( RID_SVXSTR_CHARACTER_SELECTION);
216 }
217 // -----------------------------------------------------------------------------
218 ::rtl::OUString SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleName(  ) throw (RuntimeException)
219 {
220     OExternalLockGuard aGuard( this );
221     return SVX_RESSTR( RID_SVXSTR_CHAR_SEL_DESC);
222 }
223 // -----------------------------------------------------------------------------
224 Reference< XAccessibleRelationSet > SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleRelationSet(  ) throw (RuntimeException)
225 {
226     return Reference< XAccessibleRelationSet >();
227 }
228 // -----------------------------------------------------------------------------
229 Reference< XAccessibleStateSet > SAL_CALL SvxShowCharSetVirtualAcc::getAccessibleStateSet(  ) throw (RuntimeException)
230 {
231     OExternalLockGuard aGuard( this );
232 
233     ::utl::AccessibleStateSetHelper*    pStateSet = new ::utl::AccessibleStateSetHelper;
234 
235     if( mpParent )
236     {
237         // SELECTABLE
238         pStateSet->AddState( AccessibleStateType::FOCUSABLE );
239         if ( mpParent->HasFocus() )
240             pStateSet->AddState( AccessibleStateType::FOCUSED );
241         if ( mpParent->IsActive() )
242             pStateSet->AddState( AccessibleStateType::ACTIVE );
243         if ( mpParent->IsEnabled() )
244         {
245             pStateSet->AddState( AccessibleStateType::ENABLED );
246             pStateSet->AddState( AccessibleStateType::SENSITIVE );
247         }
248         if ( mpParent->IsReallyVisible() )
249             pStateSet->AddState( AccessibleStateType::VISIBLE );
250     }
251 
252     return pStateSet;
253 }
254 // -----------------------------------------------------------------------------
255 void SAL_CALL SvxShowCharSetVirtualAcc::disposing()
256 {
257     OAccessibleContextHelper::disposing();
258     if ( m_pTable )
259         m_pTable->dispose();
260     m_pTable = NULL;
261 }
262 // -----------------------------------------------------------------------------
263 // ----------------
264 // - SvxShowCharSetItem -
265 // ----------------
266 
267 SvxShowCharSetItem::SvxShowCharSetItem( SvxShowCharSet& rParent,SvxShowCharSetAcc*  _pParent,sal_uInt16 _nPos ) :
268     mrParent( rParent )
269     ,mnId( _nPos )
270     ,m_pItem(NULL)
271     ,m_pParent(_pParent)
272 {
273 }
274 // -----------------------------------------------------------------------
275 
276 SvxShowCharSetItem::~SvxShowCharSetItem()
277 {
278     if ( m_xAcc.is() )
279     {
280         m_pItem->ParentDestroyed();
281         ClearAccessible();
282     }
283 }
284 
285 // -----------------------------------------------------------------------
286 
287 uno::Reference< accessibility::XAccessible > SvxShowCharSetItem::GetAccessible()
288 {
289     if( !m_xAcc.is() )
290     {
291         m_pItem = new SvxShowCharSetItemAcc( this );
292         m_xAcc = m_pItem;
293     }
294 
295     return m_xAcc;
296 }
297 
298 // -----------------------------------------------------------------------
299 
300 void SvxShowCharSetItem::ClearAccessible()
301 {
302     if ( m_xAcc.is() )
303     {
304         m_pItem = NULL;
305         m_xAcc  = NULL;
306     }
307 }
308 
309 
310 // ---------------
311 // - SvxShowCharSetAcc -
312 // ---------------
313 
314 SvxShowCharSetAcc::SvxShowCharSetAcc( SvxShowCharSetVirtualAcc* _pParent ) : OAccessibleSelectionHelper(new VCLExternalSolarLock())
315   ,m_pParent( _pParent )
316 {
317     osl_incrementInterlockedCount(&m_refCount);
318     { // #b6211265 #
319         lateInit(this);
320     }
321     osl_decrementInterlockedCount(&m_refCount);
322 }
323 
324 // -----------------------------------------------------------------------------
325 
326 SvxShowCharSetAcc::~SvxShowCharSetAcc()
327 {
328     ensureDisposed();
329     delete getExternalLock();
330 }
331 // -----------------------------------------------------------------------------
332 void SAL_CALL SvxShowCharSetAcc::disposing()
333 {
334     OAccessibleSelectionHelper::disposing();
335     ::std::vector< Reference< XAccessible > >::iterator aIter = m_aChildren.begin();
336     ::std::vector< Reference< XAccessible > >::iterator aEnd  = m_aChildren.end();
337     for (;aIter != aEnd ; ++aIter)
338         ::comphelper::disposeComponent(*aIter);
339 
340     m_aChildren.clear();
341     m_pParent = NULL;
342 }
343 
344 // -----------------------------------------------------------------------------
345 IMPLEMENT_FORWARD_XINTERFACE2( SvxShowCharSetAcc, OAccessibleSelectionHelper, OAccessibleHelper_Base )
346 IMPLEMENT_FORWARD_XTYPEPROVIDER2( SvxShowCharSetAcc, OAccessibleSelectionHelper, OAccessibleHelper_Base )
347 // -----------------------------------------------------------------------
348 sal_Bool SvxShowCharSetAcc::implIsSelected( sal_Int32 nAccessibleChildIndex ) throw (RuntimeException)
349 {
350     return m_pParent && m_pParent->getCharSetControl()->IsSelected(
351         sal::static_int_cast<sal_uInt16>(nAccessibleChildIndex));
352 }
353 // -----------------------------------------------------------------------------
354         // select the specified child => watch for special ChildIndexes (ACCESSIBLE_SELECTION_CHILD_xxx)
355 void SvxShowCharSetAcc::implSelect( sal_Int32 nAccessibleChildIndex, sal_Bool bSelect ) throw (IndexOutOfBoundsException, RuntimeException)
356 {
357     if ( m_pParent )
358     {
359         if ( bSelect )
360             m_pParent->getCharSetControl()->SelectIndex(nAccessibleChildIndex,sal_True);
361         else
362             m_pParent->getCharSetControl()->DeSelect();
363     }
364 }
365 // -----------------------------------------------------------------------------
366 ::com::sun::star::awt::Rectangle SAL_CALL SvxShowCharSetAcc::implGetBounds(  ) throw (RuntimeException)
367 {
368 //IAccessibility2 Implementation 2009-----
369     const Point   aOutPos;//( m_pParent->getCharSetControl()->GetPosPixel() );
370     Size          aOutSize( m_pParent->getCharSetControl()->GetOutputSizePixel());
371     if ( m_pParent->getCharSetControl()->getScrollBar()->IsVisible() )
372     {
373         const Size aScrollBar = m_pParent->getCharSetControl()->getScrollBar()->GetOutputSizePixel();
374         aOutSize.Width() -= aScrollBar.Width();
375         //aOutSize.Height() -= aScrollBar.Height();
376         //-----IAccessibility2 Implementation 2009
377     }
378 
379     awt::Rectangle aRet;
380 
381     aRet.X = aOutPos.X();
382     aRet.Y = aOutPos.Y();
383     aRet.Width = aOutSize.Width();
384     aRet.Height = aOutSize.Height();
385 
386     return aRet;
387 }
388 // -----------------------------------------------------------------------------
389 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleChildCount()
390     throw (uno::RuntimeException)
391 {
392     OExternalLockGuard aGuard( this );
393     ensureAlive();
394     return m_pParent->getCharSetControl()->getMaxCharCount();
395 }
396 
397 // -----------------------------------------------------------------------------
398 
399 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleChild( sal_Int32 i )
400     throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
401 {
402     OExternalLockGuard aGuard( this );
403     ensureAlive();
404     uno::Reference< accessibility::XAccessible >    xRet;
405     SvxShowCharSetItem* pItem = m_pParent->getCharSetControl()->ImplGetItem( static_cast< sal_uInt16 >( i ) );
406 
407     if( pItem )
408     {
409         pItem->m_pParent = this;
410         xRet = pItem->GetAccessible();
411         m_aChildren.push_back(xRet);
412     }
413     else
414         throw lang::IndexOutOfBoundsException();
415 
416     return xRet;
417 }
418 
419 // -----------------------------------------------------------------------------
420 
421 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleParent()
422     throw (uno::RuntimeException)
423 {
424     OExternalLockGuard aGuard( this );
425     ensureAlive();
426     return m_pParent;
427 }
428 
429 // -----------------------------------------------------------------------------
430 
431 sal_Int16 SAL_CALL SvxShowCharSetAcc::getAccessibleRole()
432     throw (uno::RuntimeException)
433 {
434     return accessibility::AccessibleRole::TABLE;
435 }
436 
437 // -----------------------------------------------------------------------------
438 
439 ::rtl::OUString SAL_CALL SvxShowCharSetAcc::getAccessibleDescription()
440     throw (uno::RuntimeException)
441 {
442     OExternalLockGuard aGuard( this );
443     return SVX_RESSTR( RID_SVXSTR_CHARACTER_SELECTION );
444 }
445 
446 // -----------------------------------------------------------------------------
447 
448 ::rtl::OUString SAL_CALL SvxShowCharSetAcc::getAccessibleName()
449     throw (uno::RuntimeException)
450 {
451     OExternalLockGuard aGuard( this );
452     ensureAlive();
453     return SVX_RESSTR( RID_SVXSTR_CHAR_SEL_DESC );
454 }
455 
456 // -----------------------------------------------------------------------------
457 
458 uno::Reference< accessibility::XAccessibleRelationSet > SAL_CALL SvxShowCharSetAcc::getAccessibleRelationSet()
459     throw (uno::RuntimeException)
460 {
461     return uno::Reference< accessibility::XAccessibleRelationSet >();
462 }
463 
464 // -----------------------------------------------------------------------------
465 
466 uno::Reference< accessibility::XAccessibleStateSet > SAL_CALL SvxShowCharSetAcc::getAccessibleStateSet()
467     throw (uno::RuntimeException)
468 {
469     OExternalLockGuard aGuard( this );
470 
471     ::utl::AccessibleStateSetHelper*    pStateSet = new ::utl::AccessibleStateSetHelper;
472 
473     if( m_pParent->getCharSetControl() )
474     {
475         // SELECTABLE
476         pStateSet->AddState( AccessibleStateType::FOCUSABLE );
477         if ( m_pParent->getCharSetControl()->HasFocus() )
478             pStateSet->AddState( AccessibleStateType::FOCUSED );
479         if ( m_pParent->getCharSetControl()->IsActive() )
480             pStateSet->AddState( AccessibleStateType::ACTIVE );
481         if ( m_pParent->getCharSetControl()->IsEnabled() )
482         {
483             pStateSet->AddState( AccessibleStateType::ENABLED );
484             pStateSet->AddState( AccessibleStateType::SENSITIVE );
485         }
486         if ( m_pParent->getCharSetControl()->IsReallyVisible() )
487             pStateSet->AddState( AccessibleStateType::VISIBLE );
488 
489         pStateSet->AddState( AccessibleStateType::MANAGES_DESCENDANTS );
490     }
491 
492     return pStateSet;
493 }
494 // -----------------------------------------------------------------------------
495 
496 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleAtPoint( const awt::Point& aPoint )
497     throw (uno::RuntimeException)
498 {
499     OExternalLockGuard aGuard( this );
500     ensureAlive();
501 
502     uno::Reference< accessibility::XAccessible >    xRet;
503     const sal_uInt16 nItemId = sal::static_int_cast<sal_uInt16>(
504         m_pParent->getCharSetControl()->PixelToMapIndex( Point( aPoint.X, aPoint.Y ) ));
505 
506     if( sal_uInt16(-1) != nItemId )
507     {
508         SvxShowCharSetItem* pItem = m_pParent->getCharSetControl()->ImplGetItem( nItemId );
509         xRet = pItem->GetAccessible();
510     }
511     return xRet;
512 }
513 
514 // -----------------------------------------------------------------------------
515 // -----------------------------------------------------------------------------
516 
517 void SAL_CALL SvxShowCharSetAcc::grabFocus()
518     throw (uno::RuntimeException)
519 {
520     OExternalLockGuard aGuard( this );
521     ensureAlive();
522     m_pParent->getCharSetControl()->GrabFocus();
523 }
524 
525 // -----------------------------------------------------------------------------
526 
527 uno::Any SAL_CALL SvxShowCharSetAcc::getAccessibleKeyBinding()
528     throw (uno::RuntimeException)
529 {
530     return uno::Any();
531 }
532 // -----------------------------------------------------------------------------
533 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleRowCount(  ) throw (RuntimeException)
534 {
535     return ((getAccessibleChildCount()-1) / COLUMN_COUNT) + 1;
536 }
537 // -----------------------------------------------------------------------------
538 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleColumnCount(  ) throw (RuntimeException)
539 {
540     return COLUMN_COUNT;
541 }
542 // -----------------------------------------------------------------------------
543 ::rtl::OUString SAL_CALL SvxShowCharSetAcc::getAccessibleRowDescription( sal_Int32 /*nRow*/ ) throw (IndexOutOfBoundsException, RuntimeException)
544 {
545     return ::rtl::OUString();
546 }
547 // -----------------------------------------------------------------------------
548 ::rtl::OUString SAL_CALL SvxShowCharSetAcc::getAccessibleColumnDescription( sal_Int32 /*nColumn*/ ) throw (IndexOutOfBoundsException, RuntimeException)
549 {
550     return ::rtl::OUString();
551 }
552 // -----------------------------------------------------------------------------
553 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleRowExtentAt( sal_Int32 /*nRow*/, sal_Int32 /*nColumn*/ ) throw (IndexOutOfBoundsException, RuntimeException)
554 {
555     return 1;
556 }
557 // -----------------------------------------------------------------------------
558 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleColumnExtentAt( sal_Int32 /*nRow*/, sal_Int32 /*nColumn*/ ) throw (IndexOutOfBoundsException, RuntimeException)
559 {
560     return 1;
561 }
562 // -----------------------------------------------------------------------------
563 Reference< XAccessibleTable > SAL_CALL SvxShowCharSetAcc::getAccessibleRowHeaders(  ) throw (RuntimeException)
564 {
565     return Reference< XAccessibleTable >();
566 }
567 // -----------------------------------------------------------------------------
568 Reference< XAccessibleTable > SAL_CALL SvxShowCharSetAcc::getAccessibleColumnHeaders(  ) throw (RuntimeException)
569 {
570     return Reference< XAccessibleTable >();
571 }
572 // -----------------------------------------------------------------------------
573 Sequence< sal_Int32 > SAL_CALL SvxShowCharSetAcc::getSelectedAccessibleRows(  ) throw (RuntimeException)
574 {
575     OExternalLockGuard aGuard( this );
576     ensureAlive();
577     Sequence< sal_Int32 > aSel(1);
578     aSel[0] = m_pParent->getCharSetControl()->GetRowPos(m_pParent->getCharSetControl()->GetSelectIndexId());
579     return aSel;
580 }
581 // -----------------------------------------------------------------------------
582 Sequence< sal_Int32 > SAL_CALL SvxShowCharSetAcc::getSelectedAccessibleColumns(  ) throw (RuntimeException)
583 {
584     OExternalLockGuard aGuard( this );
585     ensureAlive();
586     Sequence< sal_Int32 > aSel(1);
587     aSel[0] = m_pParent->getCharSetControl()->GetColumnPos(m_pParent->getCharSetControl()->GetSelectIndexId());
588     return aSel;
589 }
590 // -----------------------------------------------------------------------------
591 sal_Bool SAL_CALL SvxShowCharSetAcc::isAccessibleRowSelected( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException)
592 {
593     OExternalLockGuard aGuard( this );
594     ensureAlive();
595     return m_pParent->getCharSetControl()->GetRowPos(m_pParent->getCharSetControl()->GetSelectIndexId()) == nRow;
596 }
597 // -----------------------------------------------------------------------------
598 sal_Bool SAL_CALL SvxShowCharSetAcc::isAccessibleColumnSelected( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
599 {
600     OExternalLockGuard aGuard( this );
601     ensureAlive();
602     return m_pParent->getCharSetControl()->GetColumnPos(m_pParent->getCharSetControl()->GetSelectIndexId()) == nColumn;
603 }
604 // -----------------------------------------------------------------------------
605 Reference< XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
606 {
607     OExternalLockGuard aGuard( this );
608     ensureAlive();
609     ::svx::SvxShowCharSetItem* pItem = m_pParent->getCharSetControl()->ImplGetItem(
610         sal::static_int_cast<sal_uInt16>(getAccessibleIndex(nRow,nColumn) ));
611     if ( !pItem  )
612         throw IndexOutOfBoundsException();
613     return pItem->GetAccessible();
614 }
615 // -----------------------------------------------------------------------------
616 Reference< XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleCaption(  ) throw (RuntimeException)
617 {
618     return Reference< XAccessible >();
619 }
620 // -----------------------------------------------------------------------------
621 Reference< XAccessible > SAL_CALL SvxShowCharSetAcc::getAccessibleSummary(  ) throw (RuntimeException)
622 {
623     return Reference< XAccessible >();
624 }
625 // -----------------------------------------------------------------------------
626 sal_Bool SAL_CALL SvxShowCharSetAcc::isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
627 {
628     OExternalLockGuard aGuard( this );
629     ensureAlive();
630     return m_pParent->getCharSetControl()->GetSelectIndexId() == getAccessibleIndex(nRow,nColumn);
631 }
632 // -----------------------------------------------------------------------------
633 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
634 {
635     return (nRow*COLUMN_COUNT) + nColumn;
636 }
637 // -----------------------------------------------------------------------------
638 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleRow( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
639 {
640     OExternalLockGuard aGuard( this );
641     ensureAlive();
642     return m_pParent->getCharSetControl()->GetRowPos(sal::static_int_cast<sal_uInt16>(nChildIndex));
643 }
644 // -----------------------------------------------------------------------------
645 sal_Int32 SAL_CALL SvxShowCharSetAcc::getAccessibleColumn( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
646 {
647     OExternalLockGuard aGuard( this );
648     ensureAlive();
649     return m_pParent->getCharSetControl()->GetColumnPos(sal::static_int_cast<sal_uInt16>(nChildIndex));
650 }
651 // -----------------------------------------------------------------------------
652 
653 // -----------------------------------------------------------------------------
654 // ----------------
655 // - SvxShowCharSetItemAcc -
656 // ----------------
657 
658 SvxShowCharSetItemAcc::SvxShowCharSetItemAcc( SvxShowCharSetItem* pParent ) : OAccessibleComponentHelper(new VCLExternalSolarLock())
659 ,mpParent( pParent )
660 {
661     OSL_ENSURE(pParent,"NO parent supplied!");
662     osl_incrementInterlockedCount(&m_refCount);
663     { // #b6211265 #
664         lateInit(this);
665     }
666     osl_decrementInterlockedCount(&m_refCount);
667 }
668 
669 // -----------------------------------------------------------------------------
670 
671 SvxShowCharSetItemAcc::~SvxShowCharSetItemAcc()
672 {
673     ensureDisposed();
674     delete getExternalLock();
675 }
676 // -----------------------------------------------------------------------------
677 IMPLEMENT_FORWARD_XINTERFACE2( SvxShowCharSetItemAcc, OAccessibleComponentHelper, OAccessibleHelper_Base_2 )
678 IMPLEMENT_FORWARD_XTYPEPROVIDER2( SvxShowCharSetItemAcc, OAccessibleComponentHelper, OAccessibleHelper_Base_2 )
679 // -----------------------------------------------------------------------------
680 
681 void SvxShowCharSetItemAcc::ParentDestroyed()
682 {
683     const ::osl::MutexGuard aGuard( GetMutex() );
684     mpParent = NULL;
685 }
686 
687 // -----------------------------------------------------------------------------
688 
689 sal_Int32 SAL_CALL SvxShowCharSetItemAcc::getAccessibleChildCount()
690     throw (uno::RuntimeException)
691 {
692     return 0;
693 }
694 
695 // -----------------------------------------------------------------------------
696 
697 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetItemAcc::getAccessibleChild( sal_Int32 /*i*/ )
698     throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
699 {
700     throw lang::IndexOutOfBoundsException();
701 }
702 
703 // -----------------------------------------------------------------------------
704 
705 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetItemAcc::getAccessibleParent()
706     throw (uno::RuntimeException)
707 {
708     OExternalLockGuard aGuard( this );
709     ensureAlive();
710     return mpParent->m_pParent;
711 }
712 
713 // -----------------------------------------------------------------------------
714 
715 sal_Int16 SAL_CALL SvxShowCharSetItemAcc::getAccessibleRole()
716     throw (uno::RuntimeException)
717 {
718     //return accessibility::AccessibleRole::LABEL;
719 //IAccessibility2 Implementation 2009-----
720     return accessibility::AccessibleRole::TABLE_CELL;
721 //-----IAccessibility2 Implementation 2009
722 }
723 
724 // -----------------------------------------------------------------------------
725 
726 ::rtl::OUString SAL_CALL SvxShowCharSetItemAcc::getAccessibleDescription()
727     throw (uno::RuntimeException)
728 {
729     OExternalLockGuard aGuard( this );
730     ensureAlive();
731     String sDescription = SVX_RESSTR( RID_SVXSTR_CHARACTER_CODE );
732 
733     sal_Unicode c = mpParent->maText.GetChar(0);
734     char buf[16] = "0x0000";
735     sal_Unicode c_Shifted = c;
736 //IAccessibility2 Implementation 2009-----
737 /*
738     for( int i = 0; i < 4; ++i )
739     {
740         char h = (char)(c_Shifted & 0x0F);
741         buf[5-i] = (h > 9) ? (h - 10 + 'A') : (h + '0');
742         c_Shifted >>= 4;
743     }
744 */
745     int tmp_len = 4;
746     if(c_Shifted>0xFFFF) tmp_len = 8;
747     for( int i = 0; i < tmp_len; ++i )
748     {
749         char h = c_Shifted & 0x0F;
750         //buf[9-i] = (h > 9) ? (h - 10 + 'A') : (h + '0');
751         buf[tmp_len+1-i] = (h > 9) ? (h - 10 + 'A') : (h + '0');
752         c_Shifted >>= 4;
753     }
754 //-----IAccessibility2 Implementation 2009
755     if( c < 256 )
756         snprintf( buf+6, 10, " (%d)", c );
757     //IAccessibility2 Implementation 2009-----
758     sDescription.AppendAscii(" ");
759     //-----IAccessibility2 Implementation 2009
760     sDescription.AppendAscii(buf);
761 
762     return sDescription;
763 }
764 
765 // -----------------------------------------------------------------------------
766 
767 ::rtl::OUString SAL_CALL SvxShowCharSetItemAcc::getAccessibleName()
768     throw (uno::RuntimeException)
769 {
770     OExternalLockGuard aGuard( this );
771     ensureAlive();
772     String aRet;
773 
774     if( mpParent )
775     {
776         aRet = mpParent->maText;
777 
778         if( !aRet.Len() )
779             aRet = getAccessibleDescription();
780     }
781 
782     return aRet;
783 }
784 
785 // -----------------------------------------------------------------------------
786 
787 uno::Reference< accessibility::XAccessibleRelationSet > SAL_CALL SvxShowCharSetItemAcc::getAccessibleRelationSet()
788     throw (uno::RuntimeException)
789 {
790     return uno::Reference< accessibility::XAccessibleRelationSet >();
791 }
792 
793 // -----------------------------------------------------------------------------
794 
795 uno::Reference< accessibility::XAccessibleStateSet > SAL_CALL SvxShowCharSetItemAcc::getAccessibleStateSet()
796     throw (uno::RuntimeException)
797 {
798     OExternalLockGuard aGuard( this );
799     ensureAlive();
800 
801     ::utl::AccessibleStateSetHelper*    pStateSet = new ::utl::AccessibleStateSetHelper;
802 
803     if( mpParent )
804     {
805     //IAccessibility2 Implementation 2009-----
806         if(mpParent->mrParent.IsEnabled())
807         {
808             pStateSet->AddState( accessibility::AccessibleStateType::ENABLED );
809             // SELECTABLE
810             pStateSet->AddState( accessibility::AccessibleStateType::SELECTABLE );
811             pStateSet->AddState( accessibility::AccessibleStateType::FOCUSABLE );
812         }
813         //-----IAccessibility2 Implementation 2009
814 
815         // SELECTED
816         if( mpParent->mrParent.GetSelectIndexId() == mpParent->mnId )
817         {
818             pStateSet->AddState( accessibility::AccessibleStateType::SELECTED );
819             pStateSet->AddState( accessibility::AccessibleStateType::FOCUSED );
820         }
821         if ( mpParent->mnId >= mpParent->mrParent.FirstInView() && mpParent->mnId <= mpParent->mrParent.LastInView() )
822         //IAccessibility2 Implementation 2009-----
823         {
824             pStateSet->AddState( AccessibleStateType::VISIBLE );
825             pStateSet->AddState( AccessibleStateType::SHOWING );
826         }
827         //-----IAccessibility2 Implementation 2009
828         pStateSet->AddState( AccessibleStateType::TRANSIENT );
829     }
830 
831     return pStateSet;
832 }
833 
834 // -----------------------------------------------------------------------------
835 void SAL_CALL SvxShowCharSetItemAcc::grabFocus()
836     throw (uno::RuntimeException)
837 {
838     // nothing to do
839 }
840 
841 // -----------------------------------------------------------------------------
842 
843 uno::Any SAL_CALL SvxShowCharSetItemAcc::getAccessibleKeyBinding()
844     throw (uno::RuntimeException)
845 {
846     return uno::Any();
847 }
848 // -----------------------------------------------------------------------------
849 awt::Rectangle SAL_CALL SvxShowCharSetItemAcc::implGetBounds(  ) throw (RuntimeException)
850 {
851     awt::Rectangle      aRet;
852 
853     if( mpParent )
854     {
855         Rectangle   aRect( mpParent->maRect );
856         Point       aOrigin;
857         Rectangle   aParentRect( aOrigin, mpParent->mrParent.GetOutputSizePixel() );
858 
859         aRect.Intersection( aParentRect );
860 
861         aRet.X = aRect.Left();
862         aRet.Y = aRect.Top();
863         aRet.Width = aRect.GetWidth();
864         aRet.Height = aRect.GetHeight();
865     }
866 
867     return aRet;
868 }
869 // -----------------------------------------------------------------------------
870 uno::Reference< accessibility::XAccessible > SAL_CALL SvxShowCharSetItemAcc::getAccessibleAtPoint( const awt::Point& /*aPoint*/ )
871     throw (uno::RuntimeException)
872 {
873     return uno::Reference< accessibility::XAccessible >();
874 }
875 // -----------------------------------------------------------------------------
876 sal_Int32 SAL_CALL SvxShowCharSetVirtualAcc::getForeground(  ) throw (RuntimeException)
877 {
878     OExternalLockGuard aGuard( this );
879 
880     sal_Int32 nColor = 0;
881     if ( mpParent )
882     {
883         if ( mpParent->IsControlForeground() )
884             nColor = mpParent->GetControlForeground().GetColor();
885         else
886         {
887             Font aFont;
888             if ( mpParent->IsControlFont() )
889                 aFont = mpParent->GetControlFont();
890             else
891                 aFont = mpParent->GetFont();
892             nColor = aFont.GetColor().GetColor();
893         }
894     }
895 
896     return nColor;
897 }
898 // -----------------------------------------------------------------------------
899 sal_Int32 SAL_CALL SvxShowCharSetVirtualAcc::getBackground(  ) throw (RuntimeException)
900 {
901     OExternalLockGuard aGuard( this  );
902     sal_Int32 nColor = 0;
903     if ( mpParent )
904     {
905         if ( mpParent->IsControlBackground() )
906             nColor = mpParent->GetControlBackground().GetColor();
907         else
908             nColor = mpParent->GetBackground().GetColor().GetColor();
909     }
910 
911     return nColor;
912 }
913 // -----------------------------------------------------------------------------
914 sal_Int32 SAL_CALL SvxShowCharSetAcc::getForeground(  ) throw (RuntimeException)
915 {
916     OExternalLockGuard aGuard( this );
917 
918     sal_Int32 nColor = 0;
919     if ( m_pParent )
920         nColor = m_pParent->getForeground();
921     return nColor;
922 }
923 // -----------------------------------------------------------------------------
924 sal_Int32 SAL_CALL SvxShowCharSetAcc::getBackground(  ) throw (RuntimeException)
925 {
926     OExternalLockGuard aGuard( this  );
927     sal_Int32 nColor = 0;
928     if ( m_pParent )
929         nColor = m_pParent->getBackground();
930     return nColor;
931 }
932 // -----------------------------------------------------------------------------
933 
934 // -----------------------------------------------------------------------------
935 } // namespace svx
936 // -----------------------------------------------------------------------------
937 
938 
939