blob: a948cfa14fb793c6ed6ba836a409078d7754424b [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef OOX_XLS_DRAWINGBASE_HXX
#define OOX_XLS_DRAWINGBASE_HXX
#include "oox/drawingml/drawingmltypes.hxx"
#include "oox/xls/worksheethelper.hxx"
namespace oox {
namespace xls {
// ============================================================================
/** Absolute position in a spreadsheet (in EMUs) independent from cells. */
struct AnchorPointModel : public ::oox::drawingml::EmuPoint
{
inline explicit AnchorPointModel() : ::oox::drawingml::EmuPoint( -1, -1 ) {}
inline bool isValid() const { return (X >= 0) && (Y >= 0); }
};
// ----------------------------------------------------------------------------
/** Absolute size in a spreadsheet (in EMUs). */
struct AnchorSizeModel : public ::oox::drawingml::EmuSize
{
inline explicit AnchorSizeModel() : ::oox::drawingml::EmuSize( -1, -1 ) {}
inline bool isValid() const { return (Width >= 0) && (Height >= 0); }
};
// ----------------------------------------------------------------------------
/** Position in spreadsheet (cell position and offset inside cell). */
struct CellAnchorModel
{
sal_Int32 mnCol; /// Column index.
sal_Int32 mnRow; /// Row index.
sal_Int64 mnColOffset; /// X offset inside the column.
sal_Int64 mnRowOffset; /// Y offset inside the row.
explicit CellAnchorModel();
inline bool isValid() const { return (mnCol >= 0) && (mnRow >= 0); }
};
// ----------------------------------------------------------------------------
/** Application-specific client data of a shape. */
struct AnchorClientDataModel
{
bool mbLocksWithSheet;
bool mbPrintsWithSheet;
explicit AnchorClientDataModel();
};
// ============================================================================
/** Contains the position of a shape in the spreadsheet. Supports different
shape anchor modes (absolute, one-cell, two-cell). */
class ShapeAnchor : public WorksheetHelper
{
public:
explicit ShapeAnchor( const WorksheetHelper& rHelper );
/** Imports the shape anchor (one of the elements xdr:absoluteAnchor, xdr:oneCellAnchor, xdr:twoCellAnchor). */
void importAnchor( sal_Int32 nElement, const AttributeList& rAttribs );
/** Imports the absolute anchor position from the xdr:pos element. */
void importPos( const AttributeList& rAttribs );
/** Imports the absolute anchor size from the xdr:ext element. */
void importExt( const AttributeList& rAttribs );
/** Imports the shape client data from the xdr:clientData element. */
void importClientData( const AttributeList& rAttribs );
/** Sets an attribute of the cell-dependent anchor position from xdr:from and xdr:to elements. */
void setCellPos( sal_Int32 nElement, sal_Int32 nParentContext, const ::rtl::OUString& rValue );
/** Imports the client anchor settings from a VML element. */
void importVmlAnchor( const ::rtl::OUString& rAnchor );
/** Imports the client anchor settings from a BIFF or DFF stream. */
void importBiffAnchor( BinaryInputStream& rStrm );
/** Calculates the resulting shape anchor in EMUs. */
::oox::drawingml::EmuRectangle calcAnchorRectEmu(
const ::com::sun::star::awt::Size& rPageSizeHmm ) const;
/** Calculates the resulting shape anchor in 1/100 mm. */
::com::sun::star::awt::Rectangle calcAnchorRectHmm(
const ::com::sun::star::awt::Size& rPageSizeHmm ) const;
private:
/** Converts the passed anchor to an absolute position in EMUs. */
::oox::drawingml::EmuPoint calcCellAnchorEmu( const CellAnchorModel& rModel ) const;
private:
enum AnchorType
{
ANCHOR_INVALID, /// Anchor type is unknown.
ANCHOR_ABSOLUTE, /// Absolute anchor (top-left corner and size in absolute units).
ANCHOR_ONECELL, /// One-cell anchor (top-left corner at cell, size in absolute units).
ANCHOR_TWOCELL /// Two-cell anchor (top-left and bottom-right corner at cell).
};
/** Specifies how cell positions from CellAnchorModel have to be processed. */
enum CellAnchorType
{
CELLANCHOR_EMU, /// Offsets are given in EMUs.
CELLANCHOR_PIXEL, /// Offsets are given in screen pixels.
CELLANCHOR_COLROW /// Offsets are given in fractions of column width or row height.
};
AnchorType meAnchorType; /// Type of this shape anchor.
CellAnchorType meCellAnchorType; /// Type of the cell anchor models.
AnchorPointModel maPos; /// Top-left position, if anchor is of type absolute.
AnchorSizeModel maSize; /// Anchor size, if anchor is not of type two-cell.
CellAnchorModel maFrom; /// Top-left position, if anchor is not of type absolute.
CellAnchorModel maTo; /// Bottom-right position, if anchor is of type two-cell.
AnchorClientDataModel maClientData; /// Shape client data.
sal_Int32 mnEditAs; /// Anchor mode as shown in the UI.
};
// ============================================================================
} // namespace xls
} // namespace oox
#endif