Line data Source code
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 : */
10 :
11 : #include <svx/CommonStylePreviewRenderer.hxx>
12 :
13 : #include <sfx2/objsh.hxx>
14 : #include <svl/style.hxx>
15 : #include <svl/itemset.hxx>
16 :
17 : #include <com/sun/star/drawing/FillStyle.hpp>
18 : #include <svx/xdef.hxx>
19 : #include <svx/xfillit0.hxx>
20 : #include <svx/xflclit.hxx>
21 : #include <svx/xcolit.hxx>
22 : #include <editeng/fontitem.hxx>
23 : #include <editeng/fhgtitem.hxx>
24 : #include <editeng/boxitem.hxx>
25 : #include <editeng/charreliefitem.hxx>
26 : #include <editeng/contouritem.hxx>
27 : #include <editeng/colritem.hxx>
28 : #include <editeng/crossedoutitem.hxx>
29 : #include <editeng/emphasismarkitem.hxx>
30 : #include <editeng/flstitem.hxx>
31 : #include <editeng/lineitem.hxx>
32 : #include <editeng/postitem.hxx>
33 : #include <editeng/shdditem.hxx>
34 : #include <editeng/udlnitem.hxx>
35 : #include <editeng/wghtitem.hxx>
36 : #include <editeng/svxfont.hxx>
37 : #include <editeng/cmapitem.hxx>
38 :
39 : #include <editeng/editids.hrc>
40 :
41 : using namespace css;
42 :
43 : namespace svx
44 : {
45 :
46 0 : CommonStylePreviewRenderer::CommonStylePreviewRenderer(
47 : const SfxObjectShell& rShell, OutputDevice& rOutputDev,
48 : SfxStyleSheetBase* pStyle, long nMaxHeight)
49 : : StylePreviewRenderer(rShell, rOutputDev, pStyle, nMaxHeight)
50 : , maFont()
51 : , maFontColor(COL_AUTO)
52 : , maBackgroundColor(COL_AUTO)
53 : , maPixelSize()
54 0 : , maStyleName(mpStyle->GetName())
55 : {
56 0 : }
57 :
58 0 : CommonStylePreviewRenderer::~CommonStylePreviewRenderer()
59 0 : {}
60 :
61 0 : bool CommonStylePreviewRenderer::recalculate()
62 : {
63 0 : const SfxItemSet& aItemSet = mpStyle->GetItemSet();
64 :
65 0 : maFont = SvxFont();
66 :
67 : const SfxPoolItem* pItem;
68 :
69 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_WEIGHT)) != nullptr)
70 : {
71 0 : maFont.SetWeight(static_cast<const SvxWeightItem*>(pItem)->GetWeight());
72 : }
73 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_POSTURE)) != nullptr)
74 : {
75 0 : maFont.SetItalic(static_cast<const SvxPostureItem*>(pItem)->GetPosture());
76 : }
77 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_CONTOUR)) != nullptr)
78 : {
79 0 : maFont.SetOutline(static_cast< const SvxContourItem*>(pItem)->GetValue());
80 : }
81 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_SHADOWED)) != nullptr)
82 : {
83 0 : maFont.SetShadow(static_cast<const SvxShadowedItem*>(pItem)->GetValue());
84 : }
85 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_RELIEF)) != nullptr)
86 : {
87 0 : maFont.SetRelief(static_cast<FontRelief>(static_cast<const SvxCharReliefItem*>(pItem)->GetValue()));
88 : }
89 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_UNDERLINE)) != nullptr)
90 : {
91 0 : maFont.SetUnderline(static_cast< const SvxUnderlineItem*>(pItem)->GetLineStyle());
92 : }
93 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_OVERLINE)) != nullptr)
94 : {
95 0 : maFont.SetOverline(static_cast<FontUnderline>(static_cast<const SvxOverlineItem*>(pItem)->GetValue()));
96 : }
97 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_STRIKEOUT)) != nullptr)
98 : {
99 0 : maFont.SetStrikeout(static_cast<const SvxCrossedOutItem*>(pItem)->GetStrikeout());
100 : }
101 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_CASEMAP)) != nullptr)
102 : {
103 0 : maFont.SetCaseMap(static_cast<const SvxCaseMapItem*>(pItem)->GetCaseMap());
104 : }
105 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_EMPHASISMARK)) != nullptr)
106 : {
107 0 : maFont.SetEmphasisMark(static_cast<const SvxEmphasisMarkItem*>(pItem)->GetEmphasisMark());
108 : }
109 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_COLOR)) != nullptr)
110 : {
111 0 : maFontColor = Color(static_cast<const SvxColorItem*>(pItem)->GetValue());
112 : }
113 :
114 0 : if (mpStyle->GetFamily() == SFX_STYLE_FAMILY_PARA)
115 : {
116 0 : if ((pItem = aItemSet.GetItem(XATTR_FILLSTYLE)) != nullptr)
117 : {
118 0 : sal_uInt16 aFillStyle = static_cast<const XFillStyleItem*>(pItem)->GetValue();
119 0 : if (aFillStyle == drawing::FillStyle_SOLID)
120 : {
121 0 : if ((pItem = aItemSet.GetItem(XATTR_FILLCOLOR)) != nullptr)
122 : {
123 0 : maBackgroundColor = Color(static_cast<const XFillColorItem*>(pItem)->GetColorValue());
124 : }
125 : }
126 : }
127 : }
128 :
129 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_FONT)) != nullptr)
130 : {
131 0 : const SvxFontItem* pFontItem = static_cast<const SvxFontItem*>(pItem);
132 0 : maFont.SetName(pFontItem->GetFamilyName());
133 0 : maFont.SetStyleName(pFontItem->GetStyleName());
134 : }
135 : else
136 : {
137 0 : return false;
138 : }
139 :
140 0 : if ((pItem = aItemSet.GetItem(SID_ATTR_CHAR_FONTHEIGHT)) != nullptr)
141 : {
142 0 : const SvxFontHeightItem* pFontHeightItem = static_cast<const SvxFontHeightItem*>(pItem);
143 0 : Size aFontSize(0, pFontHeightItem->GetHeight());
144 0 : maPixelSize = Size(mrOutputDev.LogicToPixel(aFontSize, mrShell.GetMapUnit()));
145 0 : maFont.SetSize(maPixelSize);
146 :
147 0 : vcl::Font aOldFont(mrOutputDev.GetFont());
148 :
149 0 : mrOutputDev.SetFont(maFont);
150 0 : Rectangle aTextRect;
151 0 : mrOutputDev.GetTextBoundRect(aTextRect, mpStyle->GetName());
152 0 : if (aTextRect.Bottom() > mnMaxHeight)
153 : {
154 0 : double ratio = double(mnMaxHeight) / aTextRect.Bottom();
155 0 : maPixelSize.Width() *= ratio;
156 0 : maPixelSize.Height() *= ratio;
157 0 : maFont.SetSize(maPixelSize);
158 : }
159 0 : mrOutputDev.SetFont(aOldFont);
160 : }
161 : else
162 : {
163 0 : return false;
164 : }
165 :
166 0 : return true;
167 : }
168 :
169 0 : Size CommonStylePreviewRenderer::getRenderSize()
170 : {
171 0 : maPixelSize = maFont.GetTextSize(&mrOutputDev, maStyleName);
172 0 : if (maPixelSize.Height() > mnMaxHeight)
173 0 : maPixelSize.Height() = mnMaxHeight;
174 0 : return maPixelSize;
175 : }
176 :
177 0 : bool CommonStylePreviewRenderer::render(const Rectangle& aRectangle)
178 : {
179 : // setup the device & draw
180 0 : vcl::Font aOldFont(mrOutputDev.GetFont());
181 0 : Color aOldColor(mrOutputDev.GetTextColor());
182 0 : Color aOldFillColor(mrOutputDev.GetFillColor());
183 :
184 0 : if (maBackgroundColor != COL_AUTO)
185 : {
186 0 : mrOutputDev.SetFillColor(maBackgroundColor);
187 0 : mrOutputDev.DrawRect(aRectangle);
188 : }
189 :
190 0 : mrOutputDev.SetFont(maFont);
191 0 : if (maFontColor != COL_AUTO)
192 0 : mrOutputDev.SetTextColor(maFontColor);
193 :
194 0 : Point aFontDrawPosition = aRectangle.TopLeft();
195 0 : if (aRectangle.GetHeight() > maPixelSize.Height())
196 0 : aFontDrawPosition.Y() += ( aRectangle.GetHeight() - maPixelSize.Height() ) / 2;
197 :
198 0 : mrOutputDev.DrawText(aFontDrawPosition, maStyleName);
199 :
200 0 : mrOutputDev.SetFillColor(aOldFillColor);
201 0 : mrOutputDev.SetTextColor(aOldColor);
202 0 : mrOutputDev.SetFont(aOldFont);
203 :
204 0 : return true;
205 : }
206 :
207 435 : } // end svx namespace
208 :
209 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|