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 #ifndef INCLUDED_SC_INC_PATATTR_HXX
21 #define INCLUDED_SC_INC_PATATTR_HXX
22 
23 #include <svl/poolitem.hxx>
24 #include <svl/itemset.hxx>
25 #include <svl/languageoptions.hxx>
26 #include <editeng/svxenum.hxx>
27 #include "scdllapi.h"
28 #include "fonthelper.hxx"
29 #include <memory>
30 
31 namespace vcl { class Font; }
32 class OutputDevice;
33 class Fraction;
34 class ScStyleSheet;
35 class SvNumberFormatter;
36 class ScDocument;
37 enum class ScRotateDir : sal_uInt8;
38 
39 ///  how to treat COL_AUTO in GetFont:
40 
41 enum ScAutoFontColorMode
42 {
43     SC_AUTOCOL_RAW,         ///< COL_AUTO is returned
44     SC_AUTOCOL_BLACK,       ///< always use black
45     SC_AUTOCOL_PRINT,       ///< black or white, depending on background
46     SC_AUTOCOL_DISPLAY,     ///< from style settings, or black/white if needed
47     SC_AUTOCOL_IGNOREFONT,  ///< like DISPLAY, but ignore stored font color (assume COL_AUTO)
48     SC_AUTOCOL_IGNOREBACK,  ///< like DISPLAY, but ignore stored background color (use configured color)
49     SC_AUTOCOL_IGNOREALL    ///< like DISPLAY, but ignore stored font and background colors
50 };
51 
52 class SC_DLLPUBLIC ScPatternAttr final : public SfxSetItem
53 {
54     boost::optional<OUString>  pName;
55     mutable boost::optional<size_t> mxHashCode;
56     ScStyleSheet*              pStyle;
57     sal_uInt64                 mnKey;
58 public:
59                             ScPatternAttr(std::unique_ptr<SfxItemSet>&& pItemSet, const OUString& rStyleName);
60                             ScPatternAttr(std::unique_ptr<SfxItemSet>&& pItemSet);
61                             ScPatternAttr(SfxItemPool* pItemPool);
62                             ScPatternAttr(const ScPatternAttr& rPatternAttr);
63 
64                             virtual ~ScPatternAttr() override;
65 
66     virtual SfxPoolItem*    Clone( SfxItemPool *pPool = nullptr ) const override;
67 
68     virtual bool            operator==(const SfxPoolItem& rCmp) const override;
69 
GetItem(sal_uInt16 nWhichP) const70     const SfxPoolItem&      GetItem( sal_uInt16 nWhichP ) const
71                                         { return GetItemSet().Get(nWhichP); }
GetItem(TypedWhichId<T> nWhich) const72     template<class T> const T& GetItem( TypedWhichId<T> nWhich ) const
73     { return static_cast<const T&>(GetItem(sal_uInt16(nWhich))); }
74 
75     static const SfxPoolItem& GetItem( sal_uInt16 nWhich, const SfxItemSet& rItemSet, const SfxItemSet* pCondSet );
GetItem(TypedWhichId<T> nWhich,const SfxItemSet & rItemSet,const SfxItemSet * pCondSet)76     template<class T> static const T& GetItem( TypedWhichId<T> nWhich, const SfxItemSet& rItemSet, const SfxItemSet* pCondSet )
77     { return static_cast<const T&>(GetItem(sal_uInt16(nWhich), rItemSet, pCondSet)); }
78 
79     const SfxPoolItem&      GetItem( sal_uInt16 nWhich, const SfxItemSet* pCondSet ) const;
GetItem(TypedWhichId<T> nWhich,const SfxItemSet * pCondSet) const80     template<class T> const T& GetItem( TypedWhichId<T> nWhich, const SfxItemSet* pCondSet  ) const
81     { return static_cast<const T&>(GetItem(sal_uInt16(nWhich), pCondSet)); }
82 
83                             /// @param pWhich are no ranges, but single IDs, 0-terminated
84     bool                    HasItemsSet( const sal_uInt16* pWhich ) const;
85     void                    ClearItems( const sal_uInt16* pWhich );
86 
87     void                    DeleteUnchanged( const ScPatternAttr* pOldAttrs );
88 
89     static SvxCellOrientation GetCellOrientation( const SfxItemSet& rItemSet, const SfxItemSet* pCondSet );
90     SvxCellOrientation      GetCellOrientation( const SfxItemSet* pCondSet = nullptr ) const;
91 
92     /** Static helper function to fill a font object from the passed item set. */
93     static void             GetFont( vcl::Font& rFont, const SfxItemSet& rItemSet,
94                                         ScAutoFontColorMode eAutoMode,
95                                         const OutputDevice* pOutDev = nullptr,
96                                         const Fraction* pScale = nullptr,
97                                         const SfxItemSet* pCondSet = nullptr,
98                                         SvtScriptType nScript = SvtScriptType::NONE, const Color* pBackConfigColor = nullptr,
99                                         const Color* pTextConfigColor = nullptr );
100 
101     static ScDxfFont        GetDxfFont(const SfxItemSet& rSet, SvtScriptType nScript);
102     /** Fills a font object from the own item set. */
103     void                    GetFont( vcl::Font& rFont, ScAutoFontColorMode eAutoMode,
104                                      const OutputDevice* pOutDev = nullptr,
105                                      const Fraction* pScale = nullptr,
106                                      const SfxItemSet* pCondSet = nullptr,
107                                      SvtScriptType nScript = SvtScriptType::NONE,
108                                      const Color* pBackConfigColor = nullptr,
109                                      const Color* pTextConfigColor = nullptr ) const;
110 
111     /** Converts all Calc items contained in rSrcSet to edit engine items and puts them into rEditSet. */
112     static void             FillToEditItemSet( SfxItemSet& rEditSet, const SfxItemSet& rSrcSet, const SfxItemSet* pCondSet = nullptr );
113     /** Converts all Calc items contained in the own item set to edit engine items and puts them into pEditSet. */
114     void                    FillEditItemSet( SfxItemSet* pEditSet, const SfxItemSet* pCondSet = nullptr ) const;
115 
116     /** Converts all edit engine items contained in rEditSet to Calc items and puts them into rDestSet. */
117     static void             GetFromEditItemSet( SfxItemSet& rDestSet, const SfxItemSet& rEditSet );
118     /** Converts all edit engine items contained in pEditSet to Calc items and puts them into the own item set. */
119     void                    GetFromEditItemSet( const SfxItemSet* pEditSet );
120 
121     void                    FillEditParaItems( SfxItemSet* pSet ) const;
122 
123     ScPatternAttr*          PutInPool( ScDocument* pDestDoc, ScDocument* pSrcDoc ) const;
124 
125     void                    SetStyleSheet(ScStyleSheet* pNewStyle, bool bClearDirectFormat = true);
GetStyleSheet() const126     const ScStyleSheet*     GetStyleSheet() const  { return pStyle; }
127     const OUString*         GetStyleName() const;
128     void                    UpdateStyleSheet(const ScDocument* pDoc);
129     void                    StyleToName();
130 
131     bool                    IsVisible() const;
132     bool                    IsVisibleEqual( const ScPatternAttr& rOther ) const;
133 
134                             /** If font is an old symbol font StarBats/StarMath
135                                 with text encoding RTL_TEXTENC_SYMBOL */
136     bool                    IsSymbolFont() const;
137 
138     sal_uInt32              GetNumberFormat( SvNumberFormatter* ) const;
139     sal_uInt32              GetNumberFormat( SvNumberFormatter* pFormatter,
140                                              const SfxItemSet* pCondSet ) const;
141 
142     long                    GetRotateVal( const SfxItemSet* pCondSet ) const;
143     ScRotateDir             GetRotateDir( const SfxItemSet* pCondSet ) const;
144 
145     void                    SetKey(sal_uInt64 nKey);
146     sal_uInt64              GetKey() const;
147 
148 private:
149     void                    CalcHashCode() const;
150 };
151 
152 #endif
153 
154 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
155