1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef INCLUDED_SC_SOURCE_FILTER_INC_DRAWINGBASE_HXX
21 #define INCLUDED_SC_SOURCE_FILTER_INC_DRAWINGBASE_HXX
23 #include <oox/drawingml/drawingmltypes.hxx>
24 #include "worksheethelper.hxx"
26 #include <com/sun/star/drawing/XShape.hpp>
27 #include <com/sun/star/table/XCell.hpp>
32 /** Absolute position in a spreadsheet (in EMUs) independent from cells. */
33 struct AnchorPointModel
: public ::oox::drawingml::EmuPoint
35 inline explicit AnchorPointModel() : ::oox::drawingml::EmuPoint( -1, -1 ) {}
36 inline bool isValid() const { return (X
>= 0) && (Y
>= 0); }
39 /** Absolute size in a spreadsheet (in EMUs). */
40 struct AnchorSizeModel
: public ::oox::drawingml::EmuSize
42 inline explicit AnchorSizeModel() : ::oox::drawingml::EmuSize( -1, -1 ) {}
43 inline bool isValid() const { return (Width
>= 0) && (Height
>= 0); }
46 /** Position in spreadsheet (cell position and offset inside cell). */
47 struct CellAnchorModel
49 sal_Int32 mnCol
; /// Column index.
50 sal_Int32 mnRow
; /// Row index.
51 sal_Int64 mnColOffset
; /// X offset inside the column.
52 sal_Int64 mnRowOffset
; /// Y offset inside the row.
54 explicit CellAnchorModel();
55 inline bool isValid() const { return (mnCol
>= 0) && (mnRow
>= 0); }
58 /** Application-specific client data of a shape. */
59 struct AnchorClientDataModel
61 bool mbLocksWithSheet
;
62 bool mbPrintsWithSheet
;
64 explicit AnchorClientDataModel();
67 /** Contains the position of a shape in the spreadsheet. Supports different
68 shape anchor modes (absolute, one-cell, two-cell). */
69 class ShapeAnchor
: public WorksheetHelper
74 ANCHOR_INVALID
, /// Anchor type is unknown.
75 ANCHOR_ABSOLUTE
, /// Absolute anchor (top-left corner and size in absolute units).
76 ANCHOR_ONECELL
, /// One-cell anchor (top-left corner at cell, size in absolute units).
77 ANCHOR_TWOCELL
, /// Two-cell anchor (top-left and bottom-right corner at cell).
80 explicit ShapeAnchor( const WorksheetHelper
& rHelper
);
82 /** Imports the shape anchor (one of the elements xdr:absoluteAnchor, xdr:oneCellAnchor, xdr:twoCellAnchor). */
83 void importAnchor( sal_Int32 nElement
, const AttributeList
& rAttribs
);
84 /** Imports the absolute anchor position from the xdr:pos element. */
85 void importPos( const AttributeList
& rAttribs
);
86 /** Imports the absolute anchor size from the xdr:ext element. */
87 void importExt( const AttributeList
& rAttribs
);
88 /** Imports the shape client data from the xdr:clientData element. */
89 void importClientData( const AttributeList
& rAttribs
);
90 /** Sets an attribute of the cell-dependent anchor position from xdr:from and xdr:to elements. */
91 void setCellPos( sal_Int32 nElement
, sal_Int32 nParentContext
, const OUString
& rValue
);
92 /** Imports the client anchor settings from a VML element. */
93 void importVmlAnchor( const OUString
& rAnchor
);
95 /** Calculates the resulting shape anchor in EMUs. */
96 ::oox::drawingml::EmuRectangle
calcAnchorRectEmu(
97 const ::com::sun::star::awt::Size
& rPageSizeHmm
) const;
98 /** Calculates the resulting shape anchor in 1/100 mm. */
99 ::com::sun::star::awt::Rectangle
calcAnchorRectHmm(
100 const ::com::sun::star::awt::Size
& rPageSizeHmm
) const;
101 AnchorType
getEditAs() const { return meEditAs
; }
103 /** Converts the passed anchor to an absolute position in EMUs. */
104 ::oox::drawingml::EmuPoint
calcCellAnchorEmu( const CellAnchorModel
& rModel
) const;
108 /** Specifies how cell positions from CellAnchorModel have to be processed. */
111 CELLANCHOR_EMU
, /// Offsets are given in EMUs.
112 CELLANCHOR_PIXEL
, /// Offsets are given in screen pixels.
113 CELLANCHOR_COLROW
/// Offsets are given in fractions of column width or row height.
116 AnchorType meAnchorType
; /// Type of this shape anchor.
117 CellAnchorType meCellAnchorType
; /// Type of the cell anchor models.
118 AnchorPointModel maPos
; /// Top-left position, if anchor is of type absolute.
119 AnchorSizeModel maSize
; /// Anchor size, if anchor is not of type two-cell.
120 CellAnchorModel maFrom
; /// Top-left position, if anchor is not of type absolute.
121 CellAnchorModel maTo
; /// Bottom-right position, if anchor is of type two-cell.
122 AnchorClientDataModel maClientData
; /// Shape client data.
123 AnchorType meEditAs
; /// Anchor mode as shown in the UI.
131 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */