LibreOffice Module sc (master)  1
commentsbuffer.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 
20 #include <oox/token/properties.hxx>
21 #include <oox/token/tokens.hxx>
22 
23 #include <commentsbuffer.hxx>
24 
25 #include <com/sun/star/beans/XPropertySet.hpp>
26 #include <com/sun/star/beans/XMultiPropertySet.hpp>
27 #include <com/sun/star/sheet/XSheetAnnotationAnchor.hpp>
28 #include <com/sun/star/sheet/XSheetAnnotationShapeSupplier.hpp>
29 #include <com/sun/star/sheet/XSheetAnnotations.hpp>
30 #include <com/sun/star/sheet/XSheetAnnotationsSupplier.hpp>
31 #include <com/sun/star/text/XText.hpp>
32 #include <osl/diagnose.h>
34 #include <oox/vml/vmlshape.hxx>
35 #include <addressconverter.hxx>
36 #include <drawingfragment.hxx>
37 #include <svx/sdtaitm.hxx>
38 #include <svx/svdocapt.hxx>
39 #include <svx/unoshape.hxx>
40 #include <tools/diagnose_ex.h>
41 #include <document.hxx>
42 #include <drwlayer.hxx>
43 #include <cellsuno.hxx>
44 #include <docfunc.hxx>
45 #include <docuno.hxx>
46 #include <docsh.hxx>
47 #include <postit.hxx>
48 
49 namespace oox::xls {
50 
51 using namespace ::com::sun::star::drawing;
52 using namespace ::com::sun::star::sheet;
53 using namespace ::com::sun::star::table;
54 using namespace ::com::sun::star::text;
55 using namespace ::com::sun::star::uno;
56 
57 static sal_Int32 lcl_ToHorizAlign( sal_Int32 nAlign )
58 {
59  switch( nAlign )
60  {
61  case XML_left:
63  case XML_right:
65  case XML_center:
67  default:
69  }
70 }
71 
72 static sal_Int32 lcl_ToVertAlign( sal_Int32 nAlign )
73 {
74  switch( nAlign )
75  {
76  case XML_top:
77  case XML_Top:
78  return SDRTEXTVERTADJUST_TOP;
79  case XML_center:
80  case XML_Center:
82  case XML_bottom:
83  case XML_Bottom:
85  default:
87  }
88 }
89 
90 static sal_Int16 lcl_ToParaAlign(sal_Int32 nAlign)
91 {
92  switch ( nAlign )
93  {
94  case XML_Left:
95  return sal_Int16(css::style::ParagraphAdjust_LEFT);
96  case XML_Right:
97  return sal_Int16(css::style::ParagraphAdjust_RIGHT);
98  case XML_Center:
99  return sal_Int16(css::style::ParagraphAdjust_CENTER);
100  default:
101  return sal_Int16(css::style::ParagraphAdjust_BLOCK);
102  }
103 }
104 
106  : mnAuthorId(-1)
107  , mbAutoFill(false)
108  , mbAutoScale(false)
109  , mbColHidden(false)
110  , mbLocked(false)
111  , mbRowHidden(false)
112  , mnTHA(0)
113  , mnTVA(0)
114 {
115 }
116 
118  WorksheetHelper( rHelper )
119 {
120 }
121 
122 void Comment::importComment( const AttributeList& rAttribs )
123 {
124  maModel.mnAuthorId = rAttribs.getInteger( XML_authorId, -1 );
125  // cell range will be checked while inserting the comment into the document
127 }
128 
130 {
131  maModel.mbAutoFill = rAttribs.getBool( XML_autoFill, true );
132  maModel.mbAutoScale = rAttribs.getBool( XML_autoScale, false );
133  maModel.mbColHidden = rAttribs.getBool( XML_colHidden, false );
134  maModel.mbLocked = rAttribs.getBool( XML_locked, false );
135  maModel.mbRowHidden = rAttribs.getBool( XML_rowHidden, false );
136  maModel.mnTHA = rAttribs.getToken( XML_textHAlign, XML_left );
137  maModel.mnTVA = rAttribs.getToken( XML_textVAlign, XML_top );
138 }
139 
141 {
142  BinRange aBinRange;
143  maModel.mnAuthorId = rStrm.readInt32();
144  rStrm >> aBinRange;
145  // cell range will be checked while inserting the comment into the document
147 }
148 
150 {
151  maModel.mxText = std::make_shared<RichString>( *this );
152  return maModel.mxText;
153 }
154 
156 {
157  // BIFF12 stores cell range instead of cell address, use first cell of this range
158  OSL_ENSURE( maModel.maRange.aStart == maModel.maRange.aEnd,
159  "Comment::finalizeImport - comment anchor should be a single cell" );
160  if( !getAddressConverter().checkCellAddress( maModel.maRange.aStart, true ) || !maModel.mxText )
161  return;
162 
163  try
164  {
165  ScTableSheetObj* pAnnosSupp = static_cast<ScTableSheetObj*>(getSheet().get());
166  rtl::Reference<ScAnnotationsObj> xAnnos = static_cast<ScAnnotationsObj*>(pAnnosSupp->getAnnotations().get());
167  ScDocShell* pDocShell = xAnnos->GetDocShell();
168  // non-empty string required by note implementation (real text will be added below)
169  ScPostIt* pPostIt = pDocShell->GetDocFunc().ImportNote( maModel.maRange.aStart, OUString( ' ' ) );
170  SdrCaptionObj* pCaption = pPostIt->GetOrCreateCaption( maModel.maRange.aStart );
171 
172  Reference< XShape > xAnnoShape( pCaption->getUnoShape(), UNO_QUERY_THROW ); // SvxShapeText
173  // setting a property triggers expensive process, so set them all at once
174  Reference< css::beans::XMultiPropertySet > xAnnoShapeMultiPropSet(xAnnoShape, UNO_QUERY_THROW);
175 
176  // Add shape formatting properties (autoFill, colHidden and rowHidden are dropped)
177  xAnnoShapeMultiPropSet->setPropertyValues(
178  Sequence<OUString> { "TextFitToSize", "MoveProtect", "TextHorizontalAdjust", "TextVerticalAdjust" },
179  Sequence<Any> { Any(maModel.mbAutoScale), Any(maModel.mbLocked),
181  if( maModel.maAnchor.Width > 0 && maModel.maAnchor.Height > 0 )
182  {
183  xAnnoShape->setPosition( css::awt::Point( maModel.maAnchor.X, maModel.maAnchor.Y ) );
184  xAnnoShape->setSize( css::awt::Size( maModel.maAnchor.Width, maModel.maAnchor.Height ) );
185  }
186 
187  // convert shape formatting and visibility
188  bool bVisible = true;
189  if( const ::oox::vml::ShapeBase* pVmlNoteShape = getVmlDrawing().getNoteShape( maModel.maRange.aStart ) )
190  {
191  // position and formatting
192  pVmlNoteShape->convertFormatting( xAnnoShape );
193  // visibility
194  bVisible = pVmlNoteShape->getTypeModel().mbVisible;
195 
196  // Setting comment text alignment
197  const ::oox::vml::ClientData* xClientData = pVmlNoteShape->getClientData();
198  xAnnoShapeMultiPropSet->setPropertyValues(
199  Sequence<OUString> { "TextVerticalAdjust", "ParaAdjust" },
200  Sequence<Any> { Any(lcl_ToVertAlign( xClientData->mnTextVAlign )), Any(lcl_ToParaAlign( xClientData->mnTextHAlign )) });
201  }
202  if (bVisible)
203  pDocShell->GetDocFunc().ShowNote( maModel.maRange.aStart, bVisible );
204 
205  // insert text and convert text formatting
206  maModel.mxText->finalizeImport();
207  Reference< XText > xAnnoText( xAnnoShape, UNO_QUERY_THROW );
208  maModel.mxText->convert( xAnnoText );
209  }
210  catch( Exception& )
211  {
213  }
214 }
215 
216 // private --------------------------------------------------------------------
217 
219  WorksheetHelper( rHelper )
220 {
221 }
222 
223 void CommentsBuffer::appendAuthor( const OUString& rAuthor )
224 {
225  maAuthors.push_back( rAuthor );
226 }
227 
229 {
230  CommentRef xComment = std::make_shared<Comment>( *this );
231  maComments.push_back( xComment );
232  return xComment;
233 }
234 
236 {
237  // keep the model locked to avoid repeated reformatting in the model
238  auto pModel = getScDocument().GetDrawLayer();
239  bool bWasLocked = pModel->isLocked();
240  pModel->setLock(true);
242  pModel->setLock(bWasLocked);
243 }
244 
245 } // namespace oox::xls
246 
247 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
void importCommentPr(const AttributeList &rAttribs)
Imports a cell comment Properties from the passed attributes of the comment element.
bool mbColHidden
Auto Scale comment text.
SDRTEXTVERTADJUST_TOP
virtual css::uno::Reference< css::sheet::XSheetAnnotations > SAL_CALL getAnnotations() override
Definition: cellsuno.cxx:6722
ScAddress aStart
Definition: address.hxx:500
bool bVisible
OptValue< bool > getBool(sal_Int32 nAttrToken) const
void appendAuthor(const OUString &rAuthor)
Appends a new author to the list of comment authors.
OptValue< sal_Int32 > getInteger(sal_Int32 nAttrToken) const
bool mbLocked
Comment cell's Column is Hidden.
A 2D cell range address struct for binary filters.
SDRTEXTVERTADJUST_BLOCK
ScAddress aEnd
Definition: address.hxx:501
SC_DLLPUBLIC bool ShowNote(const ScAddress &rPos, bool bShow)
Definition: docfunc.cxx:1278
std::vector< OUString > maAuthors
OptValue< OUString > getString(sal_Int32 nAttrToken) const
SC_DLLPUBLIC ScPostIt * ImportNote(const ScAddress &rPos, const OUString &rNoteText)
Definition: docfunc.cxx:1398
static bool convertToCellRangeUnchecked(ScRange &orRange, const OUString &rString, sal_Int16 nSheet)
Converts the passed string to a cell range address, without checking any sheet limits.
void importComment(const AttributeList &rAttribs)
Imports a cell comment from the passed attributes of the comment element.
void forEachMem(FuncType pFunc) const
void finalizeImport()
Finalizes the formatted string of all comments.
std::shared_ptr< RichString > RichStringRef
Definition: richstring.hxx:261
sal_Int32 mnTVA
Horizontal Alignment.
virtual css::uno::Reference< css::uno::XInterface > getUnoShape()
Additional class containing cell annotation data.
Definition: postit.hxx:160
css::awt::Rectangle maAnchor
Vertical Alignment.
sal_Int32 mnAuthorId
Formatted text of the comment (not used in BIFF8).
bool mbAutoScale
Auto Selection of comment object's fill style.
bool mbAutoFill
Identifier of the comment's author (OOXML and BIFF12 only).
bool isLocked() const
SDRTEXTHORZADJUST_CENTER
CommentsBuffer(const WorksheetHelper &rHelper)
static sal_Int32 lcl_ToVertAlign(sal_Int32 nAlign)
static sal_Int16 lcl_ToParaAlign(sal_Int32 nAlign)
CommentModel maModel
SDRTEXTVERTADJUST_BOTTOM
SDRTEXTHORZADJUST_BLOCK
SC_DLLPUBLIC ScDrawLayer * GetDrawLayer()
Definition: document.hxx:1059
#define DBG_UNHANDLED_EXCEPTION(...)
CommentRef createComment()
Creates and returns a new comment.
SDRTEXTHORZADJUST_LEFT
void finalizeImport()
Finalizes the formatted string of the comment.
RichStringRef const & createText()
Creates and returns a new rich-string object for the comment text.
std::shared_ptr< Comment > CommentRef
SdrCaptionObj * GetOrCreateCaption(const ScAddress &rPos) const
Returns the caption object of this note.
Definition: postit.cxx:950
sal_Int32 mnTHA
Comment cell's Row is Hidden.
Comment(const WorksheetHelper &rHelper)
SDRTEXTHORZADJUST_RIGHT
RichStringRef mxText
Position of the comment in the worksheet.
bool mbRowHidden
Comment changes Locked.
const css::uno::Reference< css::sheet::XSpreadsheet > & getSheet() const
Returns the XSpreadsheet interface of the current sheet.
SCTAB getSheetIndex() const
Returns the index of the current sheet.
static sal_Int32 lcl_ToHorizAlign(sal_Int32 nAlign)
ScDocFunc & GetDocFunc()
Definition: docsh.hxx:218
VmlDrawing & getVmlDrawing() const
Returns the VML drawing page for this sheet (OOXML/BIFF12 only).
CommentModel()
Anchor parameters.
OptValue< sal_Int32 > getToken(sal_Int32 nAttrToken) const
AddressConverter & getAddressConverter() const
Returns the converter for string to cell address/range conversion.
SDRTEXTVERTADJUST_CENTER