LibreOffice Module sc (master) 1
AccessibleCellBase.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
21#include <document.hxx>
22#include <docfunc.hxx>
23#include <docsh.hxx>
24#include <strings.hxx>
25#include <unonames.hxx>
26#include <detfunc.hxx>
27
28#include <com/sun/star/accessibility/AccessibleRole.hpp>
29#include <com/sun/star/accessibility/AccessibleStateType.hpp>
30#include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
31#include <com/sun/star/sheet/XSpreadsheet.hpp>
32#include <com/sun/star/sheet/XSheetAnnotationAnchor.hpp>
33#include <com/sun/star/text/XSimpleText.hpp>
34#include <com/sun/star/table/BorderLine.hpp>
35#include <com/sun/star/table/ShadowFormat.hpp>
37#include <sfx2/objsh.hxx>
38#include <vcl/svapp.hxx>
39
40#include <float.h>
41
42using namespace ::com::sun::star;
43using namespace ::com::sun::star::accessibility;
44
45#define DEFAULT_LINE_WIDTH 2
46
47//===== internal ============================================================
48
50 const uno::Reference<XAccessible>& rxParent,
51 ScDocument* pDoc,
52 const ScAddress& rCellAddress,
53 sal_Int64 nIndex)
54 :
55 ScAccessibleContextBase(rxParent, AccessibleRole::TABLE_CELL),
56 maCellAddress(rCellAddress),
57 mpDoc(pDoc),
59{
60}
61
63{
64}
65
66 //===== XAccessibleComponent ============================================
67
69{
70 SolarMutexGuard aGuard;
72 // test whether the cell is hidden (column/row - hidden/filtered)
73 bool bVisible(true);
74 if (mpDoc)
75 {
76 bool bColHidden = mpDoc->ColHidden(maCellAddress.Col(), maCellAddress.Tab());
77 bool bRowHidden = mpDoc->RowHidden(maCellAddress.Row(), maCellAddress.Tab());
78 bool bColFiltered = mpDoc->ColFiltered(maCellAddress.Col(), maCellAddress.Tab());
79 bool bRowFiltered = mpDoc->RowFiltered(maCellAddress.Row(), maCellAddress.Tab());
80
81 if (bColHidden || bColFiltered || bRowHidden || bRowFiltered)
82 bVisible = false;
83 }
84 return bVisible;
85}
86
88{
89 SolarMutexGuard aGuard;
91 sal_Int32 nColor(0);
92 if (mpDoc)
93 {
95 if ( pObjSh )
96 {
97 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY );
98 if ( xSpreadDoc.is() )
99 {
100 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets();
101 uno::Reference<container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY );
102 if ( xIndex.is() )
103 {
104 uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab());
105 uno::Reference<sheet::XSpreadsheet> xTable;
106 if (aTable>>=xTable)
107 {
108 uno::Reference<table::XCell> xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row());
109 if (xCell.is())
110 {
111 uno::Reference<beans::XPropertySet> xCellProps(xCell, uno::UNO_QUERY);
112 if (xCellProps.is())
113 {
114 uno::Any aAny = xCellProps->getPropertyValue(SC_UNONAME_CCOLOR);
115 aAny >>= nColor;
116 }
117 }
118 }
119 }
120 }
121 }
122 }
123 return nColor;
124}
125
127{
128 SolarMutexGuard aGuard;
130 sal_Int32 nColor(0);
131
132 if (mpDoc)
133 {
135 if ( pObjSh )
136 {
137 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY );
138 if ( xSpreadDoc.is() )
139 {
140 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets();
141 uno::Reference<container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY );
142 if ( xIndex.is() )
143 {
144 uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab());
145 uno::Reference<sheet::XSpreadsheet> xTable;
146 if (aTable>>=xTable)
147 {
148 uno::Reference<table::XCell> xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row());
149 if (xCell.is())
150 {
151 uno::Reference<beans::XPropertySet> xCellProps(xCell, uno::UNO_QUERY);
152 if (xCellProps.is())
153 {
154 uno::Any aAny = xCellProps->getPropertyValue(SC_UNONAME_CELLBACK);
155 aAny >>= nColor;
156 }
157 }
158 }
159 }
160 }
161 }
162 }
163
164 return nColor;
165}
166
167 //===== XInterface =====================================================
168
170{
172 return aAny.hasValue() ? aAny : ScAccessibleContextBase::queryInterface(rType);
173}
174
176 noexcept
177{
179}
180
182 noexcept
183{
185}
186
187 //===== XAccessibleContext ==============================================
188
189sal_Int64
191{
192 SolarMutexGuard aGuard;
194 return mnIndex;
195}
196
197OUString
199{
200 return STR_ACC_CELL_DESCR;
201}
202
203OUString
205{
206 // Document not needed, because only the cell address, but not the tablename is needed
207 // always us OOO notation
209}
210
211 //===== XAccessibleValue ================================================
212
213uno::Any SAL_CALL
215{
216 SolarMutexGuard aGuard;
218 uno::Any aAny;
219 if (mpDoc)
220 {
221 aAny <<= mpDoc->GetValue(maCellAddress);
222 }
223 return aAny;
224}
225
226sal_Bool SAL_CALL
228{
229 SolarMutexGuard aGuard;
231 double fValue = 0;
232 bool bResult = false;
233 if((aNumber >>= fValue) && mpDoc && mpDoc->GetDocumentShell())
234 {
235 sal_Int64 nParentStates = 0;
236 if (getAccessibleParent().is())
237 {
238 uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext();
239 nParentStates = xParentContext->getAccessibleStateSet();
240 }
241 if (IsEditable(nParentStates))
242 {
243 ScDocShell* pDocShell = static_cast<ScDocShell*>(mpDoc->GetDocumentShell());
244 bResult = pDocShell->GetDocFunc().SetValueCell(maCellAddress, fValue, false);
245 }
246 }
247 return bResult;
248}
249
250uno::Any SAL_CALL
252{
253 return uno::Any(DBL_MAX);
254}
255
256uno::Any SAL_CALL
258{
259 return uno::Any(-DBL_MAX);
260}
261
262uno::Any SAL_CALL
264{
265 return uno::Any();
266}
267
268 //===== XServiceInfo ====================================================
269
271{
272 return "ScAccessibleCellBase";
273}
274
275 //===== XTypeProvider ===================================================
276
277uno::Sequence< uno::Type > SAL_CALL ScAccessibleCellBase::getTypes()
278{
280}
281
282uno::Sequence<sal_Int8> SAL_CALL
284{
285 return css::uno::Sequence<sal_Int8>();
286}
287
288bool ScAccessibleCellBase::IsEditable(sal_Int64 nParentStates)
289{
290 bool bEditable = nParentStates & AccessibleStateType::EDITABLE;
291 return bEditable;
292}
293
295{
296 SolarMutexGuard aGuard;
298 OUString sNote;
299 if (mpDoc)
300 {
302 if ( pObjSh )
303 {
304 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY );
305 if ( xSpreadDoc.is() )
306 {
307 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets();
308 uno::Reference<container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY );
309 if ( xIndex.is() )
310 {
311 uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab());
312 uno::Reference<sheet::XSpreadsheet> xTable;
313 if (aTable>>=xTable)
314 {
315 uno::Reference<table::XCell> xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row());
316 if (xCell.is())
317 {
318 uno::Reference <sheet::XSheetAnnotationAnchor> xAnnotationAnchor ( xCell, uno::UNO_QUERY);
319 if(xAnnotationAnchor.is())
320 {
321 uno::Reference <sheet::XSheetAnnotation> xSheetAnnotation = xAnnotationAnchor->getAnnotation();
322 if (xSheetAnnotation.is())
323 {
324 uno::Reference <text::XSimpleText> xText (xSheetAnnotation, uno::UNO_QUERY);
325 if (xText.is())
326 {
327 sNote = xText->getString();
328 }
329 }
330 }
331 }
332 }
333 }
334 }
335 }
336 }
337 return sNote;
338}
339
341{
342 SolarMutexGuard aGuard;
344 table::ShadowFormat aShadowFmt;
345 if (mpDoc)
346 {
348 if ( pObjSh )
349 {
350 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY );
351 if ( xSpreadDoc.is() )
352 {
353 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets();
354 uno::Reference<container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY );
355 if ( xIndex.is() )
356 {
357 uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab());
358 uno::Reference<sheet::XSpreadsheet> xTable;
359 if (aTable>>=xTable)
360 {
361 uno::Reference<table::XCell> xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row());
362 if (xCell.is())
363 {
364 uno::Reference<beans::XPropertySet> xCellProps(xCell, uno::UNO_QUERY);
365 if (xCellProps.is())
366 {
367 uno::Any aAny = xCellProps->getPropertyValue(SC_UNONAME_SHADOW);
368 aAny >>= aShadowFmt;
369 }
370 }
371 }
372 }
373 }
374 }
375 }
376 //construct shadow attributes string
377 OUString sShadowAttrs("Shadow:");
378 OUString sInnerSplit(",");
379 OUString sOuterSplit(";");
380 sal_Int32 nLocationVal = 0;
381 switch( aShadowFmt.Location )
382 {
383 case table::ShadowLocation_TOP_LEFT:
384 nLocationVal = 1;
385 break;
386 case table::ShadowLocation_TOP_RIGHT:
387 nLocationVal = 2;
388 break;
389 case table::ShadowLocation_BOTTOM_LEFT:
390 nLocationVal = 3;
391 break;
392 case table::ShadowLocation_BOTTOM_RIGHT:
393 nLocationVal = 4;
394 break;
395 default:
396 break;
397 }
398 //if there is no shadow property for the cell
399 if ( nLocationVal == 0 )
400 {
401 sShadowAttrs += sOuterSplit;
402 return sShadowAttrs;
403 }
404 //else return all the shadow properties
405 sShadowAttrs += "Location=" +
406 OUString::number( nLocationVal ) +
407 sInnerSplit +
408 "ShadowWidth=" +
409 OUString::number( static_cast<sal_Int32>(aShadowFmt.ShadowWidth) ) +
410 sInnerSplit +
411 "IsTransparent=" +
412 OUString::number( static_cast<int>(aShadowFmt.IsTransparent) ) +
413 sInnerSplit +
414 "Color=" +
415 OUString::number( aShadowFmt.Color ) +
416 sOuterSplit;
417 return sShadowAttrs;
418}
419
421{
422 SolarMutexGuard aGuard;
424 table::BorderLine aTopBorder;
425 table::BorderLine aBottomBorder;
426 table::BorderLine aLeftBorder;
427 table::BorderLine aRightBorder;
428 if (mpDoc)
429 {
431 if ( pObjSh )
432 {
433 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( pObjSh->GetModel(), uno::UNO_QUERY );
434 if ( xSpreadDoc.is() )
435 {
436 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets();
437 uno::Reference<container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY );
438 if ( xIndex.is() )
439 {
440 uno::Any aTable = xIndex->getByIndex(maCellAddress.Tab());
441 uno::Reference<sheet::XSpreadsheet> xTable;
442 if (aTable>>=xTable)
443 {
444 uno::Reference<table::XCell> xCell = xTable->getCellByPosition(maCellAddress.Col(), maCellAddress.Row());
445 if (xCell.is())
446 {
447 uno::Reference<beans::XPropertySet> xCellProps(xCell, uno::UNO_QUERY);
448 if (xCellProps.is())
449 {
450 uno::Any aAny = xCellProps->getPropertyValue(SC_UNONAME_TOPBORDER);
451 aAny >>= aTopBorder;
452 aAny = xCellProps->getPropertyValue(SC_UNONAME_BOTTBORDER);
453 aAny >>= aBottomBorder;
454 aAny = xCellProps->getPropertyValue(SC_UNONAME_LEFTBORDER);
455 aAny >>= aLeftBorder;
456 aAny = xCellProps->getPropertyValue(SC_UNONAME_RIGHTBORDER);
457 aAny >>= aRightBorder;
458 }
459 }
460 }
461 }
462 }
463 }
464 }
465
466 Color aColor;
467 bool bIn = mpDoc && mpDoc->IsCellInChangeTrack(maCellAddress,&aColor);
468 if (bIn)
469 {
470 aTopBorder.Color = sal_Int32(aColor);
471 aBottomBorder.Color = sal_Int32(aColor);
472 aLeftBorder.Color = sal_Int32(aColor);
473 aRightBorder.Color = sal_Int32(aColor);
474 aTopBorder.OuterLineWidth = DEFAULT_LINE_WIDTH;
475 aBottomBorder.OuterLineWidth = DEFAULT_LINE_WIDTH;
476 aLeftBorder.OuterLineWidth = DEFAULT_LINE_WIDTH;
477 aRightBorder.OuterLineWidth = DEFAULT_LINE_WIDTH;
478 }
479
480 //construct border attributes string
481 OUString sBorderAttrs;
482 OUString sInnerSplit(",");
483 OUString sOuterSplit(";");
484 //top border
485 //if top of the cell has no border
486 if ( aTopBorder.InnerLineWidth == 0 && aTopBorder.OuterLineWidth == 0 )
487 {
488 sBorderAttrs += "TopBorder:;";
489 }
490 else//add all the border properties to the return string.
491 {
492 sBorderAttrs += "TopBorder:Color=" +
493 OUString::number( aTopBorder.Color ) +
494 sInnerSplit +
495 "InnerLineWidth=" +
496 OUString::number( static_cast<sal_Int32>(aTopBorder.InnerLineWidth) ) +
497 sInnerSplit +
498 "OuterLineWidth=" +
499 OUString::number( static_cast<sal_Int32>(aTopBorder.OuterLineWidth) ) +
500 sInnerSplit +
501 "LineDistance=" +
502 OUString::number( static_cast<sal_Int32>(aTopBorder.LineDistance) ) +
503 sOuterSplit;
504 }
505 //bottom border
506 if ( aBottomBorder.InnerLineWidth == 0 && aBottomBorder.OuterLineWidth == 0 )
507 {
508 sBorderAttrs += "BottomBorder:;";
509 }
510 else
511 {
512 sBorderAttrs += "BottomBorder:Color=" +
513 OUString::number( aBottomBorder.Color ) +
514 sInnerSplit +
515 "InnerLineWidth=" +
516 OUString::number( static_cast<sal_Int32>(aBottomBorder.InnerLineWidth) ) +
517 sInnerSplit +
518 "OuterLineWidth=" +
519 OUString::number( static_cast<sal_Int32>(aBottomBorder.OuterLineWidth) ) +
520 sInnerSplit +
521 "LineDistance=" +
522 OUString::number( static_cast<sal_Int32>(aBottomBorder.LineDistance) ) +
523 sOuterSplit;
524 }
525 //left border
526 if ( aLeftBorder.InnerLineWidth == 0 && aLeftBorder.OuterLineWidth == 0 )
527 {
528 sBorderAttrs += "LeftBorder:;";
529 }
530 else
531 {
532 sBorderAttrs += "LeftBorder:Color=" +
533 OUString::number( aLeftBorder.Color ) +
534 sInnerSplit +
535 "InnerLineWidth=" +
536 OUString::number( static_cast<sal_Int32>(aLeftBorder.InnerLineWidth) ) +
537 sInnerSplit +
538 "OuterLineWidth=" +
539 OUString::number( static_cast<sal_Int32>(aLeftBorder.OuterLineWidth) ) +
540 sInnerSplit +
541 "LineDistance=" +
542 OUString::number( static_cast<sal_Int32>(aLeftBorder.LineDistance) ) +
543 sOuterSplit;
544 }
545 //right border
546 if ( aRightBorder.InnerLineWidth == 0 && aRightBorder.OuterLineWidth == 0 )
547 {
548 sBorderAttrs += "RightBorder:;";
549 }
550 else
551 {
552 sBorderAttrs += "RightBorder:Color=" +
553 OUString::number( aRightBorder.Color ) +
554 sInnerSplit +
555 "InnerLineWidth=" +
556 OUString::number( static_cast<sal_Int32>(aRightBorder.InnerLineWidth) ) +
557 sInnerSplit +
558 "OuterLineWidth=" +
559 OUString::number( static_cast<sal_Int32>(aRightBorder.OuterLineWidth) ) +
560 sInnerSplit +
561 "LineDistance=" +
562 OUString::number( static_cast<sal_Int32>(aRightBorder.LineDistance) ) +
563 sOuterSplit;
564 }
565 return sBorderAttrs;
566}
567//end of cell attributes
568
570{
571 OUString strNote;
572 OUString strTrackText;
573 if (mpDoc)
574 {
575 bool bLeftedge = false;
576 mpDoc->GetCellChangeTrackNote(maCellAddress,strTrackText,bLeftedge);
577 }
578 if (!strTrackText.isEmpty())
579 {
581 strNote = strTrackText;
582 }
583 strNote += GetNote();
584 return strNote;
585}
586
587/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
#define DEFAULT_LINE_WIDTH
int mnIndex
virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override
===== XTypeProvider ===================================================
virtual sal_Int32 SAL_CALL getForeground() override
===== XAccessibleComponent ============================================
virtual ~ScAccessibleCellBase() override
virtual sal_Int64 SAL_CALL getAccessibleIndexInParent() override
===== XAccessibleContext ==============================================
OUString getShadowAttrs() const
virtual css::uno::Any SAL_CALL getCurrentValue() override
===== XAccessibleValue ================================================
virtual css::uno::Any SAL_CALL getMaximumValue() override
virtual OUString createAccessibleDescription() override
Return this object's description.
virtual OUString SAL_CALL getImplementationName() override
===== XServiceInfo ====================================================
virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override
Returns an implementation id.
virtual bool IsEditable(sal_Int64 nParentStates)
ScAccessibleCellBase(const css::uno::Reference< css::accessibility::XAccessible > &rxParent, ScDocument *pDoc, const ScAddress &rCellAddress, sal_Int64 nIndex)
virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const &rType) override
===== XInterface =====================================================
OUString GetAllDisplayNote() const
virtual sal_Bool SAL_CALL setCurrentValue(const css::uno::Any &aNumber) override
virtual css::uno::Any SAL_CALL getMinimumIncrement() override
virtual void SAL_CALL acquire() noexcept override
virtual bool isVisible() override
virtual void SAL_CALL release() noexcept override
virtual OUString createAccessibleName() override
Return the object's current name.
virtual css::uno::Any SAL_CALL getMinimumValue() override
virtual sal_Int32 SAL_CALL getBackground() override
virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const &rType) override
===== XInterface =====================================================
virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override
===== XTypeProvider ===================================================
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent() override
Return a reference to the parent.
virtual void SAL_CALL release() noexcept override
virtual void SAL_CALL acquire() noexcept override
SCTAB Tab() const
Definition: address.hxx:283
SC_DLLPUBLIC void Format(OStringBuffer &r, ScRefFlags nFlags, const ScDocument *pDocument=nullptr, const Details &rDetails=detailsOOOa1) const
Definition: address.cxx:2074
SCROW Row() const
Definition: address.hxx:274
SCCOL Col() const
Definition: address.hxx:279
static void AppendChangTrackNoteSeparator(OUString &str)
Definition: detfunc.cxx:1748
bool SetValueCell(const ScAddress &rPos, double fVal, bool bInteraction)
Definition: docfunc.cxx:867
ScDocFunc & GetDocFunc()
Definition: docsh.hxx:222
bool IsCellInChangeTrack(const ScAddress &cell, Color *pColCellBorder)
Definition: documen2.cxx:1280
SC_DLLPUBLIC bool RowFiltered(SCROW nRow, SCTAB nTab, SCROW *pFirstRow=nullptr, SCROW *pLastRow=nullptr) const
Definition: document.cxx:4562
bool ColFiltered(SCCOL nCol, SCTAB nTab) const
Definition: document.cxx:4578
SC_DLLPUBLIC double GetValue(const ScAddress &rPos) const
Definition: document.cxx:3671
void GetCellChangeTrackNote(const ScAddress &cell, OUString &strTrackText, bool &pbLeftEdge)
Definition: documen2.cxx:1343
SC_DLLPUBLIC bool RowHidden(SCROW nRow, SCTAB nTab, SCROW *pFirstRow=nullptr, SCROW *pLastRow=nullptr) const
Definition: document.cxx:4492
SfxObjectShell * GetDocumentShell() const
Definition: document.hxx:1081
SC_DLLPUBLIC bool ColHidden(SCCOL nCol, SCTAB nTab, SCCOL *pFirstCol=nullptr, SCCOL *pLastCol=nullptr) const
Definition: document.cxx:4508
css::uno::Reference< css::frame::XModel3 > GetModel() const
virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const &rType) SAL_OVERRIDE
virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() SAL_OVERRIDE
sal_Int32 nIndex
css::uno::Sequence< T > concatSequences(const css::uno::Sequence< T > &rS1, const Ss &... rSn)
constexpr OUStringLiteral STR_ACC_CELL_DESCR
Definition: strings.hxx:18
bool hasValue()
bool bVisible
unsigned char sal_Bool
#define SC_UNONAME_BOTTBORDER
Definition: unonames.hxx:124
#define SC_UNONAME_CCOLOR
Definition: unonames.hxx:52
#define SC_UNONAME_SHADOW
Definition: unonames.hxx:109
#define SC_UNONAME_CELLBACK
Definition: unonames.hxx:99
#define SC_UNONAME_LEFTBORDER
Definition: unonames.hxx:125
#define SC_UNONAME_TOPBORDER
Definition: unonames.hxx:127
#define SC_UNONAME_RIGHTBORDER
Definition: unonames.hxx:126