xref: /trunk/main/sc/source/ui/Accessibility/AccessibleCellBase.cxx (revision 4d7c9de063a797b8b4f3d45e3561e82ad1f8ef1f)
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_sc.hxx"
26 
27 
28 #include "AccessibleCellBase.hxx"
29 #include "attrib.hxx"
30 #include "scitems.hxx"
31 #include "miscuno.hxx"
32 #include "document.hxx"
33 #include "docfunc.hxx"
34 #include "cell.hxx"
35 #include "unoguard.hxx"
36 #include "scresid.hxx"
37 #ifndef SC_SC_HRC
38 #include "sc.hrc"
39 #endif
40 #include "unonames.hxx"
41 #include "detfunc.hxx"
42 #include "chgtrack.hxx"
43 #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLEROLE_HPP_
44 #include <com/sun/star/accessibility/AccessibleRole.hpp>
45 #endif
46 #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLESTATETYPE_HPP_
47 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
48 #endif
49 #include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
50 #include <com/sun/star/sheet/XSpreadsheet.hpp>
51 #include <tools/debug.hxx>
52 #include <editeng/brshitem.hxx>
53 #include <rtl/uuid.h>
54 #include <comphelper/sequence.hxx>
55 #include <sfx2/objsh.hxx>
56 #include <com/sun/star/sheet/XSheetAnnotation.hpp>
57 #include <com/sun/star/sheet/XSheetAnnotationAnchor.hpp>
58 #include <com/sun/star/text/XSimpleText.hpp>
59 
60 #include <float.h>
61 
62 using namespace ::com::sun::star;
63 using namespace ::com::sun::star::accessibility;
64 
65 //=====  internal  ============================================================
66 
67 ScAccessibleCellBase::ScAccessibleCellBase(
68         const uno::Reference<XAccessible>& rxParent,
69         ScDocument* pDoc,
70         const ScAddress& rCellAddress,
71         sal_Int32 nIndex)
72     :
73     ScAccessibleContextBase(rxParent, AccessibleRole::TABLE_CELL),
74     maCellAddress(rCellAddress),
75     mpDoc(pDoc),
76     mnIndex(nIndex)
77 {
78 }
79 
80 ScAccessibleCellBase::~ScAccessibleCellBase()
81 {
82 }
83 
84     //=====  XAccessibleComponent  ============================================
85 
86 sal_Bool SAL_CALL ScAccessibleCellBase::isVisible(  )
87         throw (uno::RuntimeException)
88 {
89     ScUnoGuard aGuard;
90     IsObjectValid();
91     // test whether the cell is hidden (column/row - hidden/filtered)
92     sal_Bool bVisible(sal_True);
93     if (mpDoc)
94     {
95         bool bColHidden = mpDoc->ColHidden(maCellAddress.Col(), maCellAddress.Tab());
96         bool bRowHidden = mpDoc->RowHidden(maCellAddress.Row(), maCellAddress.Tab());
97         bool bColFiltered = mpDoc->ColFiltered(maCellAddress.Col(), maCellAddress.Tab());
98         bool bRowFiltered = mpDoc->RowFiltered(maCellAddress.Row(), maCellAddress.Tab());
99 
100         if (bColHidden || bColFiltered || bRowHidden || bRowFiltered)
101             bVisible = sal_False;
102     }
103     return bVisible;
104 }
105 
106 sal_Int32 SAL_CALL ScAccessibleCellBase::getForeground()
107     throw (uno::RuntimeException)
108 {
109     ScUnoGuard aGuard;
110     IsObjectValid();
111     sal_Int32 nColor(0);
112     if (mpDoc)
113     {
114         SfxObjectShell* pObjSh = mpDoc->GetDocumentShell();
115         if ( pObjSh )
116         {
117             uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY );
118             if ( xSpreadDoc.is() )
119             {
120                 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets();
121                 uno::Reference<container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY );
122                 if ( xIndex.is() )
123                 {
124                     uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab());
125                     uno::Reference<sheet::XSpreadsheet> xTable;
126                     if (aTable>>=xTable)
127                     {
128                         uno::Reference<table::XCell> xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row());
129                         if (xCell.is())
130                         {
131                             uno::Reference<beans::XPropertySet> xCellProps(xCell, uno::UNO_QUERY);
132                             if (xCellProps.is())
133                             {
134                                 uno::Any aAny = xCellProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_CCOLOR)));
135                                 aAny >>= nColor;
136                             }
137                         }
138                     }
139                 }
140             }
141         }
142     }
143     return nColor;
144 }
145 
146 sal_Int32 SAL_CALL ScAccessibleCellBase::getBackground()
147     throw (uno::RuntimeException)
148 {
149     ScUnoGuard aGuard;
150     IsObjectValid();
151     sal_Int32 nColor(0);
152 
153     if (mpDoc)
154     {
155         SfxObjectShell* pObjSh = mpDoc->GetDocumentShell();
156         if ( pObjSh )
157         {
158             uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY );
159             if ( xSpreadDoc.is() )
160             {
161                 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets();
162                 uno::Reference<container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY );
163                 if ( xIndex.is() )
164                 {
165                     uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab());
166                     uno::Reference<sheet::XSpreadsheet> xTable;
167                     if (aTable>>=xTable)
168                     {
169                         uno::Reference<table::XCell> xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row());
170                         if (xCell.is())
171                         {
172                             uno::Reference<beans::XPropertySet> xCellProps(xCell, uno::UNO_QUERY);
173                             if (xCellProps.is())
174                             {
175                                 uno::Any aAny = xCellProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_CELLBACK)));
176                                 aAny >>= nColor;
177                             }
178                         }
179                     }
180                 }
181             }
182         }
183     }
184 
185     return nColor;
186 }
187 
188     //=====  XInterface  =====================================================
189 
190 uno::Any SAL_CALL ScAccessibleCellBase::queryInterface( uno::Type const & rType )
191     throw (uno::RuntimeException)
192 {
193     uno::Any aAny (ScAccessibleCellBaseImpl::queryInterface(rType));
194     return aAny.hasValue() ? aAny : ScAccessibleContextBase::queryInterface(rType);
195 }
196 
197 void SAL_CALL ScAccessibleCellBase::acquire()
198     throw ()
199 {
200     ScAccessibleContextBase::acquire();
201 }
202 
203 void SAL_CALL ScAccessibleCellBase::release()
204     throw ()
205 {
206     ScAccessibleContextBase::release();
207 }
208 
209     //=====  XAccessibleContext  ==============================================
210 
211 sal_Int32
212     ScAccessibleCellBase::getAccessibleIndexInParent(void)
213         throw (uno::RuntimeException)
214 {
215     ScUnoGuard aGuard;
216     IsObjectValid();
217     return mnIndex;
218 }
219 
220 ::rtl::OUString SAL_CALL
221     ScAccessibleCellBase::createAccessibleDescription(void)
222     throw (uno::RuntimeException)
223 {
224     rtl::OUString sDescription = String(ScResId(STR_ACC_CELL_DESCR));
225 
226     return sDescription;
227 }
228 
229 ::rtl::OUString SAL_CALL
230     ScAccessibleCellBase::createAccessibleName(void)
231     throw (uno::RuntimeException)
232 {
233     //String sName( ScResId(STR_ACC_CELL_NAME) );
234     String sAddress;
235     // Document not needed, because only the cell address, but not the tablename is needed
236     // always us OOO notation
237     maCellAddress.Format( sAddress, SCA_VALID, NULL );
238     //sName.SearchAndReplaceAscii("%1", sAddress);
239     /*  #i65103# ZoomText merges cell address and contents, e.g. if value 2 is
240         contained in cell A1, ZT reads "cell A twelve" instead of "cell A1 - 2".
241         Simple solution: Append a space character to the cell address. */
242     //sName.Append( ' ' );
243     //return rtl::OUString(sName);
244     return rtl::OUString(sAddress);
245 }
246 
247     //=====  XAccessibleValue  ================================================
248 
249 uno::Any SAL_CALL
250     ScAccessibleCellBase::getCurrentValue(  )
251     throw (uno::RuntimeException)
252 {
253     ScUnoGuard aGuard;
254     IsObjectValid();
255     uno::Any aAny;
256     if (mpDoc)
257         //aAny <<= mpDoc->GetValue(maCellAddress);
258     {
259         String valStr;
260         mpDoc->GetString(maCellAddress.Col(),maCellAddress.Row(),maCellAddress.Tab(), valStr);
261         aAny <<= rtl::OUString(valStr);
262     }
263     return aAny;
264 }
265 
266 sal_Bool SAL_CALL
267     ScAccessibleCellBase::setCurrentValue( const uno::Any& aNumber )
268     throw (uno::RuntimeException)
269 {
270     ScUnoGuard aGuard;
271     IsObjectValid();
272     double fValue = 0;
273     sal_Bool bResult(sal_False);
274     if((aNumber >>= fValue) && mpDoc && mpDoc->GetDocumentShell())
275     {
276         uno::Reference<XAccessibleStateSet> xParentStates;
277         if (getAccessibleParent().is())
278         {
279             uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext();
280             xParentStates = xParentContext->getAccessibleStateSet();
281         }
282         if (IsEditable(xParentStates))
283         {
284             ScDocShell* pDocShell = (ScDocShell*) mpDoc->GetDocumentShell();
285             ScDocFunc aFunc(*pDocShell);
286             bResult = aFunc.PutCell( maCellAddress, new ScValueCell(fValue), sal_True );
287         }
288     }
289     return bResult;
290 }
291 
292 uno::Any SAL_CALL
293     ScAccessibleCellBase::getMaximumValue(  )
294     throw (uno::RuntimeException)
295 {
296     uno::Any aAny;
297     aAny <<= DBL_MAX;
298 
299     return aAny;
300 }
301 
302 uno::Any SAL_CALL
303     ScAccessibleCellBase::getMinimumValue(  )
304     throw (uno::RuntimeException)
305 {
306     uno::Any aAny;
307     aAny <<= -DBL_MAX;
308 
309     return aAny;
310 }
311 
312     //=====  XServiceInfo  ====================================================
313 
314 ::rtl::OUString SAL_CALL ScAccessibleCellBase::getImplementationName(void)
315         throw (uno::RuntimeException)
316 {
317     return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleCellBase"));
318 }
319 
320     //=====  XTypeProvider  ===================================================
321 
322 uno::Sequence< uno::Type > SAL_CALL ScAccessibleCellBase::getTypes()
323         throw (uno::RuntimeException)
324 {
325     return comphelper::concatSequences(ScAccessibleCellBaseImpl::getTypes(), ScAccessibleContextBase::getTypes());
326 }
327 
328 uno::Sequence<sal_Int8> SAL_CALL
329     ScAccessibleCellBase::getImplementationId(void)
330     throw (uno::RuntimeException)
331 {
332     ScUnoGuard aGuard;
333     IsObjectValid();
334     static uno::Sequence<sal_Int8> aId;
335     if (aId.getLength() == 0)
336     {
337         aId.realloc (16);
338         rtl_createUuid (reinterpret_cast<sal_uInt8 *>(aId.getArray()), 0, sal_True);
339     }
340     return aId;
341 }
342 
343 sal_Bool ScAccessibleCellBase::IsEditable(
344     const uno::Reference<XAccessibleStateSet>& rxParentStates)
345 {
346     sal_Bool bEditable(sal_False);
347     if (rxParentStates.is() && rxParentStates->contains(AccessibleStateType::EDITABLE))
348         bEditable = sal_True;
349     return bEditable;
350 }
351 ::rtl::OUString SAL_CALL ScAccessibleCellBase::GetNote(void)
352                                 throw (::com::sun::star::uno::RuntimeException)
353 {
354     ScUnoGuard aGuard;
355     IsObjectValid();
356     rtl::OUString msNote;
357     if (mpDoc)
358     {
359         SfxObjectShell* pObjSh = mpDoc->GetDocumentShell();
360         if ( pObjSh )
361         {
362             uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY );
363             if ( xSpreadDoc.is() )
364             {
365                 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets();
366                 uno::Reference<container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY );
367                 if ( xIndex.is() )
368                 {
369                     uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab());
370                     uno::Reference<sheet::XSpreadsheet> xTable;
371                     if (aTable>>=xTable)
372                     {
373                         uno::Reference<table::XCell> xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row());
374                         if (xCell.is())
375                         {
376                             uno::Reference <sheet::XSheetAnnotationAnchor> xAnnotationAnchor ( xCell, uno::UNO_QUERY);
377                             if(xAnnotationAnchor.is())
378                             {
379                                 uno::Reference <sheet::XSheetAnnotation> xSheetAnnotation = xAnnotationAnchor->getAnnotation();
380                                 if (xSheetAnnotation.is())
381                                 {
382                                     uno::Reference <text::XSimpleText> xText (xSheetAnnotation, uno::UNO_QUERY);
383                                     if (xText.is())
384                                     {
385                                         msNote = xText->getString();
386                                     }
387                                 }
388                             }
389                         }
390                     }
391                 }
392             }
393         }
394     }
395     return msNote;
396 }
397 #ifndef _COM_SUN_STAR_TABLE_SHADOWFORMAT_HPP_
398 #include <com/sun/star/table/ShadowFormat.hpp>
399 #endif
400 ::rtl::OUString SAL_CALL ScAccessibleCellBase::getShadowAttrs(void)
401                                         throw (::com::sun::star::uno::RuntimeException)
402 {
403     ScUnoGuard aGuard;
404     IsObjectValid();
405     table::ShadowFormat aShadowFmt;
406     if (mpDoc)
407     {
408         SfxObjectShell* pObjSh = mpDoc->GetDocumentShell();
409         if ( pObjSh )
410         {
411             uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY );
412             if ( xSpreadDoc.is() )
413             {
414                 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets();
415                 uno::Reference<container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY );
416                 if ( xIndex.is() )
417                 {
418                     uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab());
419                     uno::Reference<sheet::XSpreadsheet> xTable;
420                     if (aTable>>=xTable)
421                     {
422                         uno::Reference<table::XCell> xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row());
423                         if (xCell.is())
424                         {
425                             uno::Reference<beans::XPropertySet> xCellProps(xCell, uno::UNO_QUERY);
426                             if (xCellProps.is())
427                             {
428                                 uno::Any aAny = xCellProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHADOW)));
429                                 aAny >>= aShadowFmt;
430                             }
431                         }
432                     }
433                 }
434             }
435         }
436     }
437     //construct shadow attributes string
438     rtl::OUString sShadowAttrs( RTL_CONSTASCII_USTRINGPARAM("Shadow:") );
439     rtl::OUString sInnerSplit( RTL_CONSTASCII_USTRINGPARAM(",") );
440     rtl::OUString sOuterSplit( RTL_CONSTASCII_USTRINGPARAM(";") );
441     sal_Int32 nLocationVal = 0;
442     switch( aShadowFmt.Location )
443     {
444     case table::ShadowLocation_TOP_LEFT:
445         nLocationVal = 1;
446         break;
447     case table::ShadowLocation_TOP_RIGHT:
448         nLocationVal = 2;
449         break;
450     case table::ShadowLocation_BOTTOM_LEFT:
451         nLocationVal = 3;
452         break;
453     case table::ShadowLocation_BOTTOM_RIGHT:
454         nLocationVal = 4;
455         break;
456     default:
457         break;
458     }
459     //if there is no shadow property for the cell
460     if ( nLocationVal == 0 )
461     {
462         sShadowAttrs += sOuterSplit;
463         return sShadowAttrs;
464     }
465     //else return all the shadow properties
466     sShadowAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Location=") );
467     sShadowAttrs += rtl::OUString::valueOf( (sal_Int32)nLocationVal );
468     sShadowAttrs += sInnerSplit;
469     sShadowAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ShadowWidth=") );
470     sShadowAttrs += rtl::OUString::valueOf( (sal_Int32)aShadowFmt.ShadowWidth ) ;
471     sShadowAttrs += sInnerSplit;
472     sShadowAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("IsTransparent=") );
473     sShadowAttrs += rtl::OUString::valueOf( (sal_Bool)aShadowFmt.IsTransparent ) ;
474     sShadowAttrs += sInnerSplit;
475     sShadowAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Color=") );
476     sShadowAttrs += rtl::OUString::valueOf( (sal_Int32)aShadowFmt.Color );
477     sShadowAttrs += sOuterSplit;
478     return sShadowAttrs;
479 }
480 #ifndef _COM_SUN_STAR_TABLE_BORDERLINE_HPP_
481 #include <com/sun/star/table/BorderLine.hpp>
482 #endif
483 ::rtl::OUString SAL_CALL ScAccessibleCellBase::getBorderAttrs(void)
484                                         throw (::com::sun::star::uno::RuntimeException)
485 {
486     ScUnoGuard aGuard;
487     IsObjectValid();
488     table::BorderLine aTopBorder;
489     table::BorderLine aBottomBorder;
490     table::BorderLine aLeftBorder;
491     table::BorderLine aRightBorder;
492     if (mpDoc)
493     {
494         SfxObjectShell* pObjSh = mpDoc->GetDocumentShell();
495         if ( pObjSh )
496         {
497             uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY );
498             if ( xSpreadDoc.is() )
499             {
500                 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets();
501                 uno::Reference<container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY );
502                 if ( xIndex.is() )
503                 {
504                     uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab());
505                     uno::Reference<sheet::XSpreadsheet> xTable;
506                     if (aTable>>=xTable)
507                     {
508                         uno::Reference<table::XCell> xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row());
509                         if (xCell.is())
510                         {
511                             uno::Reference<beans::XPropertySet> xCellProps(xCell, uno::UNO_QUERY);
512                             if (xCellProps.is())
513                             {
514                                 uno::Any aAny = xCellProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_TOPBORDER)));
515                                 aAny >>= aTopBorder;
516                                 aAny = xCellProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_BOTTBORDER)));
517                                 aAny >>= aBottomBorder;
518                                 aAny = xCellProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_LEFTBORDER)));
519                                 aAny >>= aLeftBorder;
520                                 aAny = xCellProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_RIGHTBORDER)));
521                                 aAny >>= aRightBorder;
522                             }
523                         }
524                     }
525                 }
526             }
527         }
528     }
529 
530     Color aColor;
531     sal_Bool bIn = mpDoc ? mpDoc->IsCellInChangeTrack(maCellAddress,&aColor) : sal_False;
532     if (bIn)
533     {
534         aTopBorder.Color = aColor.GetColor();
535         aBottomBorder.Color = aColor.GetColor();
536         aLeftBorder.Color = aColor.GetColor();
537         aRightBorder.Color = aColor.GetColor();
538         aTopBorder.OuterLineWidth =2;
539         aBottomBorder.OuterLineWidth =2;
540         aLeftBorder.OuterLineWidth =2;
541         aRightBorder.OuterLineWidth =2;
542     }
543 
544     //construct border attributes string
545     rtl::OUString sBorderAttrs;
546     rtl::OUString sInnerSplit( RTL_CONSTASCII_USTRINGPARAM(",") );
547     rtl::OUString sOuterSplit( RTL_CONSTASCII_USTRINGPARAM(";") );
548     //top border
549     //if top of the cell has no border
550     if ( aTopBorder.InnerLineWidth == 0 && aTopBorder.OuterLineWidth == 0 )
551     {
552         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("TopBorder:;") );
553     }
554     else//add all the border properties to the return string.
555     {
556         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("TopBorder:Color=") );
557         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aTopBorder.Color );
558         sBorderAttrs += sInnerSplit;
559         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("InnerLineWidth=") );
560         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aTopBorder.InnerLineWidth );
561         sBorderAttrs += sInnerSplit;
562         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OuterLineWidth=") );
563         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aTopBorder.OuterLineWidth );
564         sBorderAttrs += sInnerSplit;
565         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LineDistance=") );
566         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aTopBorder.LineDistance );
567         sBorderAttrs += sOuterSplit;
568     }
569     //bottom border
570     if ( aBottomBorder.InnerLineWidth == 0 && aBottomBorder.OuterLineWidth == 0 )
571     {
572         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BottomBorde:;") );
573     }
574     else
575     {
576         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BottomBorder:Color=") );
577         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aBottomBorder.Color );
578         sBorderAttrs += sInnerSplit;
579         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("InnerLineWidth=") );
580         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aBottomBorder.InnerLineWidth );
581         sBorderAttrs += sInnerSplit;
582         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OuterLineWidth=") );
583         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aBottomBorder.OuterLineWidth );
584         sBorderAttrs += sInnerSplit;
585         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LineDistance=") );
586         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aBottomBorder.LineDistance );
587         sBorderAttrs += sOuterSplit;
588     }
589     //left border
590     if ( aLeftBorder.InnerLineWidth == 0 && aLeftBorder.OuterLineWidth == 0 )
591     {
592         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LeftBorder:;") );
593     }
594     else
595     {
596         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LeftBorder:Color=") );
597         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aLeftBorder.Color );
598         sBorderAttrs += sInnerSplit;
599         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("InnerLineWidth=") );
600         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aLeftBorder.InnerLineWidth );
601         sBorderAttrs += sInnerSplit;
602         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OuterLineWidth=") );
603         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aLeftBorder.OuterLineWidth );
604         sBorderAttrs += sInnerSplit;
605         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LineDistance=") );
606         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aLeftBorder.LineDistance );
607         sBorderAttrs += sOuterSplit;
608     }
609     //right border
610     if ( aRightBorder.InnerLineWidth == 0 && aRightBorder.OuterLineWidth == 0 )
611     {
612         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("RightBorder:;") );
613     }
614     else
615     {
616         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("RightBorder:Color=") );
617         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aRightBorder.Color );
618         sBorderAttrs += sInnerSplit;
619         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("InnerLineWidth=") );
620         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aRightBorder.InnerLineWidth );
621         sBorderAttrs += sInnerSplit;
622         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OuterLineWidth=") );
623         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aRightBorder.OuterLineWidth );
624         sBorderAttrs += sInnerSplit;
625         sBorderAttrs += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LineDistance=") );
626         sBorderAttrs += rtl::OUString::valueOf( (sal_Int32)aRightBorder.LineDistance );
627         sBorderAttrs += sOuterSplit;
628     }
629     return sBorderAttrs;
630 }
631 //end of cell attributes
632 
633 ::rtl::OUString SAL_CALL ScAccessibleCellBase::GetAllDisplayNote(void)
634     throw (::com::sun::star::uno::RuntimeException)
635 {
636     ::rtl::OUString strNote;
637     String strTrackText;
638     if (mpDoc)
639     {
640         sal_Bool bLeftedge=sal_False;
641         mpDoc->GetCellChangeTrackNote(maCellAddress,strTrackText,bLeftedge);
642     }
643     if (strTrackText.Len() > 0 )
644     {
645         ScDetectiveFunc::AppendChangTrackNoteSeparator(strTrackText);
646         strNote = strTrackText;
647     }
648     strNote += GetNote();
649     return strNote;
650 }
651