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 : * 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 <sfx2/dialoghelper.hxx>
21 : #include <sfx2/viewsh.hxx>
22 : #include <sfx2/printer.hxx>
23 : #include <vcl/builderfactory.hxx>
24 : #include <vcl/metric.hxx>
25 : #include <vcl/svapp.hxx>
26 : #include <vcl/settings.hxx>
27 : #include <unicode/uchar.h>
28 : #include <com/sun/star/uno/Reference.h>
29 : #include <com/sun/star/i18n/BreakIterator.hpp>
30 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
31 : #include <comphelper/processfactory.hxx>
32 :
33 : #include <com/sun/star/i18n/ScriptType.hpp>
34 :
35 : #include <vector>
36 : #include <deque>
37 : #include <svtools/colorcfg.hxx>
38 : #include <svtools/sampletext.hxx>
39 :
40 : #include <svx/fntctrl.hxx>
41 : #include <svx/dialogs.hrc>
42 : #include <svx/sdasitm.hxx>
43 :
44 : // Item set includes
45 : #include <svl/itemset.hxx>
46 : #include <svl/itempool.hxx>
47 : #include <svl/stritem.hxx>
48 : #include <svl/languageoptions.hxx>
49 :
50 : #include <editeng/colritem.hxx>
51 : #include <editeng/fontitem.hxx>
52 : #include <editeng/editids.hrc>
53 : #include <editeng/postitem.hxx>
54 : #include <editeng/udlnitem.hxx>
55 : #include <editeng/crossedoutitem.hxx>
56 : #include <editeng/contouritem.hxx>
57 : #include <editeng/wghtitem.hxx>
58 : #include <editeng/fhgtitem.hxx>
59 : #include <editeng/shdditem.hxx>
60 : #include <editeng/escapementitem.hxx>
61 : #include <editeng/wrlmitem.hxx>
62 : #include <editeng/cmapitem.hxx>
63 : #include <editeng/kernitem.hxx>
64 : #include <editeng/brushitem.hxx>
65 : #include <editeng/emphasismarkitem.hxx>
66 : #include <editeng/charreliefitem.hxx>
67 : #include <editeng/twolinesitem.hxx>
68 : #include <editeng/charscaleitem.hxx>
69 : #include <editeng/langitem.hxx>
70 :
71 : //TODO: remove this and calculate off the actual size of text, not
72 : //an arbitrary number of characters
73 : #define TEXT_WIDTH 80
74 : #define ISITEMSET rSet.GetItemState(nWhich)>=SfxItemState::DEFAULT
75 :
76 : using namespace ::com::sun::star::uno;
77 : using namespace ::com::sun::star::lang;
78 : using ::com::sun::star::i18n::XBreakIterator;
79 : using ::com::sun::star::i18n::BreakIterator;
80 :
81 :
82 : // small helper functions to set fonts
83 :
84 : namespace
85 : {
86 0 : void scaleFontWidth(vcl::Font& rFont, vcl::RenderContext& rRenderContext,long& n100PercentFont)
87 : {
88 0 : rFont.SetWidth(0);
89 0 : n100PercentFont = rRenderContext.GetFontMetric(rFont).GetWidth();
90 0 : }
91 :
92 0 : void initFont(vcl::Font& rFont)
93 : {
94 0 : rFont.SetTransparent(true);
95 0 : rFont.SetAlign(ALIGN_BASELINE);
96 0 : }
97 :
98 0 : void setFontSize(vcl::Font& rFont)
99 : {
100 0 : Size aSize(rFont.GetSize());
101 0 : aSize.Height() = (aSize.Height() * 3) / 5;
102 0 : aSize.Width() = (aSize.Width() * 3) / 5;
103 0 : rFont.SetSize(aSize);
104 0 : }
105 :
106 0 : void calcFontHeightAnyAscent(vcl::RenderContext& rRenderContext, const vcl::Font& rFont, long& nHeight, long& nAscent)
107 : {
108 0 : if (!nHeight)
109 : {
110 0 : rRenderContext.SetFont(rFont);
111 0 : FontMetric aMetric(rRenderContext.GetFontMetric());
112 0 : nHeight = aMetric.GetLineHeight();
113 0 : nAscent = aMetric.GetAscent();
114 : }
115 0 : }
116 :
117 0 : void setFont(const SvxFont& rNewFont, SvxFont& rImplFont)
118 : {
119 0 : rImplFont = rNewFont;
120 0 : rImplFont.SetTransparent(true);
121 0 : rImplFont.SetAlign(ALIGN_BASELINE);
122 0 : }
123 :
124 : } // end anonymous namespace
125 :
126 : class FontPrevWin_Impl
127 : {
128 : friend class SvxFontPrevWindow;
129 :
130 : SvxFont maFont;
131 : VclPtr<Printer> mpPrinter;
132 : bool mbDelPrinter;
133 :
134 : Reference <XBreakIterator> mxBreak;
135 : std::vector<sal_uIntPtr> maTextWidth;
136 : std::deque<sal_Int32> maScriptChg;
137 : std::vector<sal_uInt16> maScriptType;
138 : SvxFont maCJKFont;
139 : SvxFont maCTLFont;
140 : OUString maText;
141 : OUString maScriptText;
142 : Color* mpColor;
143 : Color* mpBackColor;
144 : long mnAscent;
145 : sal_Unicode mcStartBracket;
146 : sal_Unicode mcEndBracket;
147 :
148 : long mn100PercentFontWidth; // initial -1 -> not set yet
149 : long mn100PercentFontWidthCJK;
150 : long mn100PercentFontWidthCTL;
151 : sal_uInt16 mnFontWidthScale;
152 :
153 : bool mbSelection : 1;
154 : bool mbGetSelection : 1;
155 : bool mbUseResText : 1;
156 : bool mbPreviewBackgroundToCharacter : 1;
157 : bool mbTwoLines : 1;
158 : bool mbUseFontNameAsText : 1;
159 : bool mbTextInited : 1;
160 :
161 : bool m_bCJKEnabled;
162 : bool m_bCTLEnabled;
163 :
164 :
165 : public:
166 0 : inline FontPrevWin_Impl() :
167 : mpPrinter(nullptr),
168 : mbDelPrinter(false),
169 : mpColor(nullptr),
170 : mpBackColor(0),
171 : mnAscent(0),
172 : mcStartBracket(0),
173 : mcEndBracket(0),
174 : mnFontWidthScale(100),
175 : mbSelection(false),
176 : mbGetSelection(false),
177 : mbUseResText(false),
178 : mbPreviewBackgroundToCharacter(false),
179 : mbTwoLines(false),
180 : mbUseFontNameAsText(false),
181 0 : mbTextInited(false)
182 : {
183 0 : SvtLanguageOptions aLanguageOptions;
184 0 : m_bCJKEnabled = aLanguageOptions.IsAnyEnabled();
185 0 : m_bCTLEnabled = aLanguageOptions.IsCTLFontEnabled();
186 :
187 0 : Invalidate100PercentFontWidth();
188 0 : }
189 :
190 0 : inline ~FontPrevWin_Impl()
191 0 : {
192 0 : delete mpColor;
193 0 : delete mpBackColor;
194 0 : if (mbDelPrinter)
195 0 : mpPrinter.disposeAndClear();
196 0 : }
197 :
198 : void CheckScript();
199 : Size CalcTextSize(vcl::RenderContext& rRenderContext, OutputDevice* pPrinter, const SvxFont& rFont);
200 : void DrawPrev(vcl::RenderContext& rRenderContext, Printer* pPrinter, Point& rPt, const SvxFont& rFont);
201 :
202 : bool SetFontWidthScale(sal_uInt16 nScaleInPercent);
203 : inline void Invalidate100PercentFontWidth();
204 : inline bool Is100PercentFontWidthValid() const;
205 : void ScaleFontWidth(vcl::RenderContext& rRenderContext);
206 : // scales rNonCJKFont and aCJKFont depending on nFontWidthScale and
207 : // sets the 100%-Font-Widths
208 : };
209 :
210 0 : inline void FontPrevWin_Impl::Invalidate100PercentFontWidth()
211 : {
212 0 : mn100PercentFontWidth = mn100PercentFontWidthCJK = mn100PercentFontWidthCTL = -1;
213 0 : }
214 :
215 0 : inline bool FontPrevWin_Impl::Is100PercentFontWidthValid() const
216 : {
217 : DBG_ASSERT( ( mn100PercentFontWidth == -1 && mn100PercentFontWidthCJK == -1 ) ||
218 : ( mn100PercentFontWidth != -1 && mn100PercentFontWidthCJK != -1 ) ||
219 : ( mn100PercentFontWidth == -1 && mn100PercentFontWidthCTL == -1 ) ||
220 : ( mn100PercentFontWidth != -1 && mn100PercentFontWidthCTL != -1 ),
221 : "*FontPrevWin_Impl::Is100PercentFontWidthValid(): 100PercentFontWidth's not synchronous" );
222 0 : return mn100PercentFontWidth != -1;
223 : }
224 :
225 : /*
226 : * evalutates the scripttypes of the actual string.
227 : * Afterwards the positions of script change are notified in aScriptChg,
228 : * the scripttypes in aScriptType.
229 : * The aTextWidth array will be filled with zero.
230 : */
231 0 : void FontPrevWin_Impl::CheckScript()
232 : {
233 : assert(!maText.isEmpty()); // must have a preview text here!
234 0 : if (maText == maScriptText)
235 : {
236 0 : return; // already initialized
237 : }
238 :
239 0 : maScriptText = maText;
240 :
241 0 : maScriptChg.clear();
242 0 : maScriptType.clear();
243 0 : maTextWidth.clear();
244 :
245 0 : if (!mxBreak.is())
246 : {
247 0 : Reference<XComponentContext> xContext = ::comphelper::getProcessComponentContext();
248 0 : mxBreak = BreakIterator::create(xContext);
249 : }
250 :
251 0 : sal_uInt16 nScript = 0;
252 0 : sal_Int32 nChg = 0;
253 :
254 0 : while (nChg < maText.getLength())
255 : {
256 0 : nScript = mxBreak->getScriptType(maText, nChg);
257 0 : nChg = mxBreak->endOfScript(maText, nChg, nScript);
258 0 : if (nChg < maText.getLength() && nChg > 0 &&
259 : (css::i18n::ScriptType::WEAK ==
260 0 : mxBreak->getScriptType(maText, nChg - 1)))
261 : {
262 0 : int8_t nType = u_charType(maText[nChg]);
263 0 : if (nType == U_NON_SPACING_MARK || nType == U_ENCLOSING_MARK ||
264 : nType == U_COMBINING_SPACING_MARK)
265 : {
266 0 : maScriptChg.push_back(nChg - 1);
267 : }
268 : else
269 : {
270 0 : maScriptChg.push_back(nChg);
271 : }
272 : }
273 : else
274 : {
275 0 : maScriptChg.push_back(nChg);
276 : }
277 0 : maScriptType.push_back(nScript);
278 0 : maTextWidth.push_back(0);
279 : }
280 : }
281 :
282 : /*
283 : * Size FontPrevWin_Impl::CalcTextSize(..)
284 : * fills the aTextWidth array with the text width of every part
285 : * of the actual string without a script change inside.
286 : * For Latin parts the given rFont will be used,
287 : * for Asian parts the aCJKFont.
288 : * The returned size contains the whole string.
289 : * The member nAscent is calculated to the maximal ascent of all used fonts.
290 : */
291 :
292 0 : Size FontPrevWin_Impl::CalcTextSize(vcl::RenderContext& rRenderContext, OutputDevice* _pPrinter, const SvxFont& rInFont)
293 : {
294 : sal_uInt16 nScript;
295 0 : sal_uInt16 nIdx = 0;
296 0 : sal_Int32 nStart = 0;
297 : sal_Int32 nEnd;
298 0 : size_t nCnt = maScriptChg.size();
299 :
300 0 : if (nCnt)
301 : {
302 0 : nEnd = maScriptChg[nIdx];
303 0 : nScript = maScriptType[nIdx];
304 : }
305 : else
306 : {
307 0 : nEnd = maText.getLength();
308 0 : nScript = css::i18n::ScriptType::LATIN;
309 : }
310 0 : long nTxtWidth = 0;
311 0 : long nCJKHeight = 0;
312 0 : long nCTLHeight = 0;
313 0 : long nHeight = 0;
314 0 : mnAscent = 0;
315 0 : long nCJKAscent = 0;
316 0 : long nCTLAscent = 0;
317 :
318 : do
319 : {
320 : const SvxFont& rFont = (nScript == css::i18n::ScriptType::ASIAN) ?
321 : maCJKFont :
322 : ((nScript == css::i18n::ScriptType::COMPLEX) ?
323 : maCTLFont :
324 0 : rInFont);
325 0 : sal_uIntPtr nWidth = rFont.GetTextSize(_pPrinter, maText, nStart, nEnd - nStart).Width();
326 0 : if (nIdx >= maTextWidth.size())
327 0 : break;
328 :
329 0 : maTextWidth[nIdx++] = nWidth;
330 0 : nTxtWidth += nWidth;
331 :
332 0 : switch (nScript)
333 : {
334 : case css::i18n::ScriptType::ASIAN:
335 0 : calcFontHeightAnyAscent(rRenderContext, maCJKFont, nCJKHeight, nCJKAscent);
336 0 : break;
337 : case css::i18n::ScriptType::COMPLEX:
338 0 : calcFontHeightAnyAscent(rRenderContext, maCTLFont, nCTLHeight, nCTLAscent);
339 0 : break;
340 : default:
341 0 : calcFontHeightAnyAscent(rRenderContext, rFont, nHeight, mnAscent);
342 : }
343 :
344 0 : if (nEnd < maText.getLength() && nIdx < nCnt)
345 : {
346 0 : nStart = nEnd;
347 0 : nEnd = maScriptChg[nIdx];
348 0 : nScript = maScriptType[nIdx];
349 : }
350 : else
351 0 : break;
352 : }
353 : while(true);
354 :
355 0 : nHeight -= mnAscent;
356 0 : nCJKHeight -= nCJKAscent;
357 0 : nCTLHeight -= nCTLAscent;
358 :
359 0 : if (nHeight < nCJKHeight)
360 0 : nHeight = nCJKHeight;
361 :
362 0 : if (mnAscent < nCJKAscent)
363 0 : mnAscent = nCJKAscent;
364 :
365 0 : if (nHeight < nCTLHeight)
366 0 : nHeight = nCTLHeight;
367 :
368 0 : if (mnAscent < nCTLAscent)
369 0 : mnAscent = nCTLAscent;
370 :
371 0 : nHeight += mnAscent;
372 :
373 0 : Size aTxtSize(nTxtWidth, nHeight);
374 0 : return aTxtSize;
375 : }
376 :
377 : /*
378 : * void FontPrevWin_Impl::DrawPrev(..)
379 : * calls SvxFont::DrawPrev(..) for every part of the string without a script
380 : * change inside, for Asian parts the aCJKFont will be used, otherwise the
381 : * given rFont.
382 : */
383 :
384 0 : void FontPrevWin_Impl::DrawPrev(vcl::RenderContext& rRenderContext, Printer* _pPrinter, Point &rPt, const SvxFont& rInFont)
385 : {
386 0 : vcl::Font aOldFont = _pPrinter->GetFont();
387 : sal_uInt16 nScript;
388 0 : sal_uInt16 nIdx = 0;
389 0 : sal_Int32 nStart = 0;
390 : sal_Int32 nEnd;
391 0 : size_t nCnt = maScriptChg.size();
392 0 : if (nCnt)
393 : {
394 0 : nEnd = maScriptChg[nIdx];
395 0 : nScript = maScriptType[nIdx];
396 : }
397 : else
398 : {
399 0 : nEnd = maText.getLength();
400 0 : nScript = css::i18n::ScriptType::LATIN;
401 : }
402 : do
403 : {
404 : const SvxFont& rFont = (nScript == css::i18n::ScriptType::ASIAN)
405 : ? maCJKFont
406 : : ((nScript == css::i18n::ScriptType::COMPLEX)
407 : ? maCTLFont
408 0 : : rInFont);
409 0 : _pPrinter->SetFont(rFont);
410 :
411 0 : rFont.DrawPrev(&rRenderContext, _pPrinter, rPt, maText, nStart, nEnd - nStart);
412 :
413 0 : rPt.X() += maTextWidth[nIdx++];
414 0 : if (nEnd < maText.getLength() && nIdx < nCnt)
415 : {
416 0 : nStart = nEnd;
417 0 : nEnd = maScriptChg[nIdx];
418 0 : nScript = maScriptType[nIdx];
419 : }
420 : else
421 0 : break;
422 : }
423 : while(true);
424 0 : _pPrinter->SetFont(aOldFont);
425 0 : }
426 :
427 :
428 :
429 0 : bool FontPrevWin_Impl::SetFontWidthScale(sal_uInt16 nScale)
430 : {
431 0 : if (mnFontWidthScale != nScale)
432 : {
433 0 : mnFontWidthScale = nScale;
434 0 : return true;
435 : }
436 :
437 0 : return false;
438 : }
439 :
440 0 : void FontPrevWin_Impl::ScaleFontWidth(vcl::RenderContext& rOutDev)
441 : {
442 0 : if (!Is100PercentFontWidthValid())
443 : {
444 0 : scaleFontWidth(maFont, rOutDev, mn100PercentFontWidth);
445 0 : scaleFontWidth(maCJKFont, rOutDev, mn100PercentFontWidthCJK);
446 0 : scaleFontWidth(maCTLFont, rOutDev, mn100PercentFontWidthCTL);
447 : }
448 :
449 0 : maFont.SetWidth(mn100PercentFontWidth * mnFontWidthScale / 100);
450 0 : maCJKFont.SetWidth(mn100PercentFontWidthCJK * mnFontWidthScale / 100);
451 0 : maCTLFont.SetWidth(mn100PercentFontWidthCTL * mnFontWidthScale / 100);
452 0 : }
453 :
454 0 : void SvxFontPrevWindow::ResetSettings(bool bForeground, bool bBackground)
455 : {
456 0 : mbResetForeground = bForeground;
457 0 : mbResetBackground = bBackground;
458 0 : Invalidate();
459 0 : }
460 :
461 0 : void SvxFontPrevWindow::ApplySettings(vcl::RenderContext& rRenderContext)
462 : {
463 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
464 :
465 0 : if (mbResetForeground)
466 : {
467 0 : svtools::ColorConfig aColorConfig;
468 0 : Color aTextColor(aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor);
469 :
470 0 : if (IsControlForeground())
471 0 : aTextColor = GetControlForeground();
472 0 : rRenderContext.SetTextColor(aTextColor);
473 0 : mbResetForeground = false;
474 : }
475 :
476 0 : if (mbResetBackground)
477 : {
478 0 : if (IsControlBackground())
479 0 : rRenderContext.SetBackground(GetControlBackground());
480 : else
481 0 : rRenderContext.SetBackground(rStyleSettings.GetWindowColor());
482 0 : mbResetBackground = false;
483 : }
484 0 : }
485 :
486 0 : void SvxFontPrevWindow::Init()
487 : {
488 0 : pImpl.reset(new FontPrevWin_Impl);
489 0 : SfxViewShell* pSh = SfxViewShell::Current();
490 :
491 0 : if (pSh)
492 0 : pImpl->mpPrinter = pSh->GetPrinter();
493 :
494 0 : if (!pImpl->mpPrinter)
495 : {
496 0 : pImpl->mpPrinter = VclPtr<Printer>::Create();
497 0 : pImpl->mbDelPrinter = true;
498 : }
499 0 : SetMapMode(MapMode(MAP_TWIP));
500 0 : initFont(pImpl->maFont);
501 0 : initFont(pImpl->maCJKFont);
502 0 : initFont(pImpl->maCTLFont);
503 :
504 0 : ResetSettings(true, true);
505 :
506 0 : SetBorderStyle(WindowBorderStyle::MONO);
507 0 : }
508 :
509 0 : SvxFontPrevWindow::SvxFontPrevWindow(vcl::Window* pParent, const ResId& rId)
510 : : Window(pParent, rId)
511 : , mbResetForeground(true)
512 0 : , mbResetBackground(true)
513 : {
514 0 : Init();
515 0 : }
516 :
517 0 : SvxFontPrevWindow::SvxFontPrevWindow(vcl::Window* pParent, WinBits nStyle)
518 : : Window(pParent, nStyle)
519 : , mbResetForeground(true)
520 0 : , mbResetBackground(true)
521 : {
522 0 : Init();
523 0 : }
524 :
525 0 : VCL_BUILDER_DECL_FACTORY(SvxFontPrevWindow)
526 : {
527 0 : WinBits nWinStyle = 0;
528 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
529 0 : if (!sBorder.isEmpty())
530 0 : nWinStyle |= WB_BORDER;
531 0 : rRet = VclPtr<SvxFontPrevWindow>::Create(pParent, nWinStyle);
532 0 : }
533 :
534 0 : SvxFontPrevWindow::~SvxFontPrevWindow()
535 : {
536 0 : disposeOnce();
537 0 : }
538 :
539 0 : void SvxFontPrevWindow::dispose()
540 : {
541 0 : pImpl.reset();
542 0 : vcl::Window::dispose();
543 0 : }
544 :
545 0 : SvxFont& SvxFontPrevWindow::GetCTLFont()
546 : {
547 0 : return pImpl->maCTLFont;
548 : }
549 :
550 0 : SvxFont& SvxFontPrevWindow::GetCJKFont()
551 : {
552 0 : return pImpl->maCJKFont;
553 : }
554 :
555 0 : void SvxFontPrevWindow::StateChanged( StateChangedType nType )
556 : {
557 0 : if (nType == StateChangedType::ControlForeground)
558 0 : ResetSettings(true, false);
559 0 : else if (nType == StateChangedType::ControlBackground)
560 0 : ResetSettings(false, true);
561 :
562 0 : Window::StateChanged(nType);
563 0 : Invalidate();
564 0 : }
565 :
566 0 : void SvxFontPrevWindow::DataChanged( const DataChangedEvent& rDCEvt )
567 : {
568 0 : if ((rDCEvt.GetType() == DataChangedEventType::SETTINGS) && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE))
569 0 : ResetSettings(true, true);
570 : else
571 0 : Window::DataChanged( rDCEvt );
572 0 : }
573 :
574 0 : SvxFont& SvxFontPrevWindow::GetFont()
575 : {
576 0 : pImpl->Invalidate100PercentFontWidth(); // because the user might change the size
577 0 : return pImpl->maFont;
578 : }
579 :
580 0 : const SvxFont& SvxFontPrevWindow::GetFont() const
581 : {
582 0 : return pImpl->maFont;
583 : }
584 :
585 0 : void SvxFontPrevWindow::SetPreviewText( const OUString& rString )
586 : {
587 0 : pImpl->maText = rString;
588 0 : pImpl->mbTextInited = true;
589 0 : }
590 :
591 0 : void SvxFontPrevWindow::SetFontNameAsPreviewText()
592 : {
593 0 : pImpl->mbUseFontNameAsText = true;
594 0 : }
595 :
596 0 : void SvxFontPrevWindow::SetFont( const SvxFont& rNormalOutFont, const SvxFont& rCJKOutFont, const SvxFont& rCTLFont )
597 : {
598 0 : setFont(rNormalOutFont, pImpl->maFont);
599 0 : setFont(rCJKOutFont, pImpl->maCJKFont);
600 0 : setFont(rCTLFont, pImpl->maCTLFont);
601 :
602 0 : pImpl->Invalidate100PercentFontWidth();
603 0 : Invalidate();
604 0 : }
605 :
606 0 : void SvxFontPrevWindow::SetColor(const Color &rColor)
607 : {
608 0 : delete pImpl->mpColor;
609 0 : pImpl->mpColor = new Color(rColor);
610 0 : Invalidate();
611 0 : }
612 :
613 0 : void SvxFontPrevWindow::ResetColor()
614 : {
615 0 : delete pImpl->mpColor;
616 0 : pImpl->mpColor = 0;
617 0 : Invalidate();
618 0 : }
619 :
620 0 : void SvxFontPrevWindow::SetBackColor(const Color &rColor)
621 : {
622 0 : delete pImpl->mpBackColor;
623 0 : pImpl->mpBackColor = new Color(rColor);
624 0 : Invalidate();
625 0 : }
626 :
627 0 : void SvxFontPrevWindow::UseResourceText(bool bUse)
628 : {
629 0 : pImpl->mbUseResText = bUse;
630 0 : }
631 :
632 0 : void SvxFontPrevWindow::Paint(vcl::RenderContext& rRenderContext, const Rectangle&)
633 : {
634 0 : ApplySettings(rRenderContext);
635 :
636 0 : Printer* pPrinter = pImpl->mpPrinter;
637 0 : const SvxFont& rFont = pImpl->maFont;
638 0 : const SvxFont& rCJKFont = pImpl->maCJKFont;
639 0 : const SvxFont& rCTLFont = pImpl->maCTLFont;
640 :
641 0 : if (!IsEnabled())
642 : {
643 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
644 0 : const Size aLogSize(rRenderContext.GetOutputSize());
645 :
646 0 : Rectangle aRect(Point(0, 0), aLogSize);
647 0 : rRenderContext.SetLineColor();
648 0 : rRenderContext.SetFillColor(rStyleSettings.GetWindowColor());
649 0 : rRenderContext.DrawRect(aRect);
650 : }
651 : else
652 : {
653 0 : if (pImpl->mbUseResText)
654 0 : pImpl->maText = GetText();
655 0 : else if (!pImpl->mbSelection && !pImpl->mbTextInited)
656 : {
657 : using namespace css::i18n::ScriptType;
658 :
659 0 : SfxViewShell* pSh = SfxViewShell::Current();
660 :
661 0 : if (pSh && !pImpl->mbGetSelection && !pImpl->mbUseFontNameAsText)
662 : {
663 0 : pImpl->maText = pSh->GetSelectionText();
664 0 : pImpl->mbGetSelection = true;
665 0 : pImpl->mbSelection = !pImpl->maText.isEmpty();
666 : }
667 :
668 0 : if (!pImpl->mbSelection || pImpl->mbUseFontNameAsText)
669 : {
670 : //If we're showing multiple sample texts, then they're all
671 : //sample texts. If only showing Latin, continue to use
672 : //the fontname as the preview
673 0 : if ((pImpl->m_bCJKEnabled) || (pImpl->m_bCTLEnabled))
674 0 : pImpl->maText = makeRepresentativeTextForFont(LATIN, rFont);
675 : else
676 0 : pImpl->maText = rFont.GetName();
677 :
678 0 : if (pImpl->m_bCJKEnabled)
679 : {
680 0 : if (!pImpl->maText.isEmpty())
681 0 : pImpl->maText += " ";
682 0 : pImpl->maText += makeRepresentativeTextForFont(ASIAN, rCJKFont);
683 :
684 : }
685 0 : if (pImpl->m_bCTLEnabled)
686 : {
687 0 : if (!pImpl->maText.isEmpty())
688 0 : pImpl->maText += " ";
689 0 : pImpl->maText += makeRepresentativeTextForFont(COMPLEX, rCTLFont);
690 : }
691 : }
692 :
693 0 : if (pImpl->maText.isEmpty())
694 0 : pImpl->maText = GetText();
695 :
696 0 : if (pImpl->maText.isEmpty())
697 : { // fdo#58427: still no text? let's try that one...
698 0 : pImpl->maText = makeRepresentativeTextForFont(LATIN, rFont);
699 : }
700 :
701 : // remove line feeds and carriage returns from string
702 0 : bool bNotEmpty = false;
703 0 : for (sal_Int32 i = 0; i < pImpl->maText.getLength(); ++i)
704 : {
705 0 : if (0xa == pImpl->maText[i] || 0xd == pImpl->maText[i])
706 0 : pImpl->maText = pImpl->maText.replaceAt(i, 1, " ");
707 : else
708 0 : bNotEmpty = true;
709 : }
710 0 : if (!bNotEmpty)
711 0 : pImpl->maText = GetText();
712 :
713 0 : if (pImpl->maText.getLength() > (TEXT_WIDTH - 1))
714 : {
715 0 : sal_Int32 nSpaceIdx = pImpl->maText.indexOf(" ", TEXT_WIDTH);
716 0 : if (nSpaceIdx != -1)
717 0 : pImpl->maText = pImpl->maText.copy(0, nSpaceIdx);
718 : }
719 : }
720 :
721 : // calculate text width scaling
722 0 : pImpl->ScaleFontWidth(rRenderContext);
723 :
724 0 : pImpl->CheckScript();
725 0 : Size aTxtSize = pImpl->CalcTextSize(rRenderContext, pPrinter, rFont);
726 :
727 0 : const Size aLogSize(rRenderContext.GetOutputSize());
728 :
729 0 : long nX = aLogSize.Width() / 2 - aTxtSize.Width() / 2;
730 0 : long nY = aLogSize.Height() / 2 - aTxtSize.Height() / 2;
731 :
732 0 : if (nY + pImpl->mnAscent > aLogSize.Height())
733 0 : nY = aLogSize.Height() - pImpl->mnAscent;
734 :
735 0 : if (pImpl->mpBackColor)
736 : {
737 0 : Rectangle aRect(Point(0, 0), aLogSize);
738 0 : Color aLineCol = rRenderContext.GetLineColor();
739 0 : Color aFillCol = rRenderContext.GetFillColor();
740 0 : rRenderContext.SetLineColor();
741 0 : rRenderContext.SetFillColor(*pImpl->mpBackColor);
742 0 : rRenderContext.DrawRect(aRect);
743 0 : rRenderContext.SetLineColor(aLineCol);
744 0 : rRenderContext.SetFillColor(aFillCol);
745 : }
746 0 : if (pImpl->mpColor)
747 : {
748 0 : Rectangle aRect(Point(nX, nY), aTxtSize);
749 0 : Color aLineCol = rRenderContext.GetLineColor();
750 0 : Color aFillCol = rRenderContext.GetFillColor();
751 0 : rRenderContext.SetLineColor();
752 0 : rRenderContext.SetFillColor(*pImpl->mpColor);
753 0 : rRenderContext.DrawRect(aRect);
754 0 : rRenderContext.SetLineColor(aLineCol);
755 0 : rRenderContext.SetFillColor(aFillCol);
756 : }
757 :
758 0 : long nStdAscent = pImpl->mnAscent;
759 0 : nY += nStdAscent;
760 :
761 0 : if (IsTwoLines())
762 : {
763 0 : SvxFont aSmallFont(rFont);
764 0 : Size aOldSize = pImpl->maCJKFont.GetSize();
765 0 : setFontSize(aSmallFont);
766 0 : setFontSize(pImpl->maCJKFont);
767 :
768 0 : long nStartBracketWidth = 0;
769 0 : long nEndBracketWidth = 0;
770 0 : long nTextWidth = 0;
771 0 : if (pImpl->mcStartBracket)
772 : {
773 0 : OUString sBracket(pImpl->mcStartBracket);
774 0 : nStartBracketWidth = rFont.GetTextSize(pPrinter, sBracket).Width();
775 : }
776 0 : if (pImpl->mcEndBracket)
777 : {
778 0 : OUString sBracket(pImpl->mcEndBracket);
779 0 : nEndBracketWidth = rFont.GetTextSize(pPrinter, sBracket).Width();
780 : }
781 0 : nTextWidth = pImpl->CalcTextSize(rRenderContext, pPrinter, aSmallFont).Width();
782 0 : long nResultWidth = nStartBracketWidth;
783 0 : nResultWidth += nEndBracketWidth;
784 0 : nResultWidth += nTextWidth;
785 :
786 0 : long _nX = (aLogSize.Width() - nResultWidth) / 2;
787 0 : rRenderContext.DrawLine(Point(0, nY), Point(_nX, nY));
788 0 : rRenderContext.DrawLine(Point(_nX + nResultWidth, nY), Point(aLogSize.Width(), nY));
789 :
790 0 : long nSmallAscent = pImpl->mnAscent;
791 0 : long nOffset = (nStdAscent - nSmallAscent) / 2;
792 :
793 0 : if (pImpl->mcStartBracket)
794 : {
795 0 : OUString sBracket(pImpl->mcStartBracket);
796 0 : rFont.DrawPrev(&rRenderContext, pPrinter, Point(_nX, nY - nOffset - 4), sBracket);
797 0 : _nX += nStartBracketWidth;
798 : }
799 :
800 0 : Point aTmpPoint1(_nX, nY - nSmallAscent - 2);
801 0 : Point aTmpPoint2(_nX, nY);
802 0 : pImpl->DrawPrev(rRenderContext, pPrinter, aTmpPoint1, aSmallFont);
803 0 : pImpl->DrawPrev(rRenderContext, pPrinter, aTmpPoint2, aSmallFont);
804 :
805 0 : _nX += nTextWidth;
806 0 : if (pImpl->mcEndBracket)
807 : {
808 0 : Point aTmpPoint( _nX + 1, nY - nOffset - 4);
809 0 : OUString sBracket(pImpl->mcEndBracket);
810 0 : rFont.DrawPrev(&rRenderContext, pPrinter, aTmpPoint, sBracket);
811 : }
812 0 : pImpl->maCJKFont.SetSize(aOldSize);
813 : }
814 : else
815 : {
816 :
817 0 : Color aLineCol = rRenderContext.GetLineColor();
818 :
819 0 : rRenderContext.SetLineColor(rFont.GetColor());
820 0 : rRenderContext.DrawLine(Point(0, nY), Point(nX, nY));
821 0 : rRenderContext.DrawLine(Point(nX + aTxtSize.Width(), nY), Point(aLogSize.Width(), nY));
822 0 : rRenderContext.SetLineColor(aLineCol);
823 :
824 0 : Point aTmpPoint(nX, nY);
825 0 : pImpl->DrawPrev(rRenderContext, pPrinter, aTmpPoint, rFont);
826 : }
827 : }
828 0 : }
829 :
830 0 : bool SvxFontPrevWindow::IsTwoLines() const
831 : {
832 0 : return pImpl->mbTwoLines;
833 : }
834 :
835 0 : void SvxFontPrevWindow::SetTwoLines(bool bSet)
836 : {
837 0 : pImpl->mbTwoLines = bSet;
838 0 : }
839 :
840 0 : void SvxFontPrevWindow::SetBrackets(sal_Unicode cStart, sal_Unicode cEnd)
841 : {
842 0 : pImpl->mcStartBracket = cStart;
843 0 : pImpl->mcEndBracket = cEnd;
844 0 : }
845 :
846 0 : void SvxFontPrevWindow::SetFontWidthScale( sal_uInt16 n )
847 : {
848 0 : if (pImpl->SetFontWidthScale(n))
849 0 : Invalidate();
850 0 : }
851 :
852 0 : void SvxFontPrevWindow::AutoCorrectFontColor()
853 : {
854 0 : Color aFontColor( GetTextColor() );
855 :
856 0 : if (COL_AUTO == pImpl->maFont.GetColor().GetColor())
857 0 : pImpl->maFont.SetColor(aFontColor);
858 :
859 0 : if (COL_AUTO == pImpl->maCJKFont.GetColor().GetColor())
860 0 : pImpl->maCJKFont.SetColor(aFontColor);
861 :
862 0 : if (COL_AUTO == pImpl->maCTLFont.GetColor().GetColor())
863 0 : pImpl->maCTLFont.SetColor(aFontColor);
864 0 : }
865 :
866 0 : static bool GetWhich (const SfxItemSet& rSet, sal_uInt16 nSlot, sal_uInt16& rWhich)
867 : {
868 0 : rWhich = rSet.GetPool()->GetWhich(nSlot, true);
869 0 : return rSet.GetItemState(rWhich) >= SfxItemState::DEFAULT;
870 : }
871 :
872 0 : static void SetPrevFont(const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont)
873 : {
874 : sal_uInt16 nWhich;
875 0 : if (GetWhich(rSet, nSlot, nWhich))
876 : {
877 0 : const SvxFontItem& rFontItem = static_cast<const SvxFontItem&>(rSet.Get(nWhich));
878 0 : rFont.SetFamily(rFontItem.GetFamily());
879 0 : rFont.SetName(rFontItem.GetFamilyName());
880 0 : rFont.SetPitch(rFontItem.GetPitch());
881 0 : rFont.SetCharSet(rFontItem.GetCharSet());
882 0 : rFont.SetStyleName(rFontItem.GetStyleName());
883 : }
884 0 : }
885 :
886 0 : static void SetPrevFontStyle( const SfxItemSet& rSet, sal_uInt16 nPosture, sal_uInt16 nWeight, SvxFont& rFont )
887 : {
888 : sal_uInt16 nWhich;
889 0 : if( GetWhich( rSet, nPosture, nWhich ) )
890 : {
891 0 : const SvxPostureItem& rItem = static_cast<const SvxPostureItem&>( rSet.Get( nWhich ) );
892 0 : rFont.SetItalic( ( FontItalic ) rItem.GetValue() != ITALIC_NONE ? ITALIC_NORMAL : ITALIC_NONE );
893 : }
894 :
895 0 : if( GetWhich( rSet, nWeight, nWhich ) )
896 : {
897 0 : const SvxWeightItem& rItem = static_cast<const SvxWeightItem&>( rSet.Get( nWhich ) );
898 0 : rFont.SetWeight( ( FontWeight ) rItem.GetValue() != WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL );
899 : }
900 0 : }
901 :
902 0 : void SvxFontPrevWindow::SetFontSize( const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont )
903 : {
904 : sal_uInt16 nWhich;
905 : long nH;
906 0 : if (GetWhich(rSet, nSlot, nWhich))
907 : {
908 0 : nH = LogicToLogic(static_cast<const SvxFontHeightItem&>(rSet.Get(nWhich)).GetHeight(),
909 0 : (MapUnit) rSet.GetPool()->GetMetric(nWhich),
910 0 : MAP_TWIP);
911 : }
912 : else
913 0 : nH = 240;// as default 12pt
914 :
915 0 : rFont.SetSize(Size(0, nH));
916 0 : }
917 :
918 0 : void SvxFontPrevWindow::SetFontLang(const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont)
919 : {
920 : sal_uInt16 nWhich;
921 : LanguageType nLang;
922 0 : if( GetWhich( rSet, nSlot, nWhich ) )
923 0 : nLang = static_cast<const SvxLanguageItem&>(rSet.Get(nWhich)).GetLanguage();
924 : else
925 0 : nLang = LANGUAGE_NONE;
926 0 : rFont.SetLanguage(nLang);
927 0 : }
928 :
929 0 : static void SetPrevFontEscapement(SvxFont& rFont, sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc)
930 : {
931 0 : rFont.SetPropr(nProp);
932 0 : rFont.SetProprRel(nEscProp);
933 0 : rFont.SetEscapement(nEsc);
934 0 : }
935 :
936 0 : void SvxFontPrevWindow::SetFromItemSet(const SfxItemSet &rSet, bool bPreviewBackgroundToCharacter)
937 : {
938 : sal_uInt16 nWhich;
939 0 : SvxFont& rFont = GetFont();
940 0 : SvxFont& rCJKFont = GetCJKFont();
941 0 : SvxFont& rCTLFont = GetCTLFont();
942 :
943 : // Preview string
944 0 : if( GetWhich( rSet, SID_CHAR_DLG_PREVIEW_STRING, nWhich ) )
945 : {
946 0 : const SfxStringItem& rItem = static_cast<const SfxStringItem&>( rSet.Get( nWhich ) );
947 0 : OUString aString = rItem.GetValue();
948 0 : if( !aString.isEmpty() )
949 0 : SetPreviewText( aString );
950 : else
951 0 : SetFontNameAsPreviewText();
952 : }
953 :
954 : // Underline
955 : FontUnderline eUnderline;
956 0 : if( GetWhich( rSet, SID_ATTR_CHAR_UNDERLINE, nWhich ) )
957 : {
958 0 : const SvxUnderlineItem& rItem = static_cast<const SvxUnderlineItem&>( rSet.Get( nWhich ) );
959 0 : eUnderline = ( FontUnderline ) rItem.GetValue();
960 0 : SetTextLineColor( rItem.GetColor() );
961 : }
962 : else
963 0 : eUnderline = UNDERLINE_NONE;
964 :
965 0 : rFont.SetUnderline( eUnderline );
966 0 : rCJKFont.SetUnderline( eUnderline );
967 0 : rCTLFont.SetUnderline( eUnderline );
968 :
969 : // Overline
970 : FontUnderline eOverline;
971 0 : if( GetWhich( rSet, SID_ATTR_CHAR_OVERLINE, nWhich ) )
972 : {
973 0 : const SvxOverlineItem& rItem = static_cast<const SvxOverlineItem&>( rSet.Get( nWhich ) );
974 0 : eOverline = ( FontUnderline ) rItem.GetValue();
975 0 : SetOverlineColor( rItem.GetColor() );
976 : }
977 : else
978 0 : eOverline = UNDERLINE_NONE;
979 :
980 0 : rFont.SetOverline( eOverline );
981 0 : rCJKFont.SetOverline( eOverline );
982 0 : rCTLFont.SetOverline( eOverline );
983 :
984 : // Strikeout
985 : FontStrikeout eStrikeout;
986 0 : if( GetWhich( rSet, SID_ATTR_CHAR_STRIKEOUT, nWhich ) )
987 : {
988 0 : const SvxCrossedOutItem& rItem = static_cast<const SvxCrossedOutItem&>( rSet.Get( nWhich ) );
989 0 : eStrikeout = ( FontStrikeout ) rItem.GetValue();
990 : }
991 : else
992 0 : eStrikeout = STRIKEOUT_NONE;
993 :
994 0 : rFont.SetStrikeout( eStrikeout );
995 0 : rCJKFont.SetStrikeout( eStrikeout );
996 0 : rCTLFont.SetStrikeout( eStrikeout );
997 :
998 : // WordLineMode
999 0 : if( GetWhich( rSet, SID_ATTR_CHAR_WORDLINEMODE, nWhich ) )
1000 : {
1001 0 : const SvxWordLineModeItem& rItem = static_cast<const SvxWordLineModeItem&>( rSet.Get( nWhich ) );
1002 0 : rFont.SetWordLineMode( rItem.GetValue() );
1003 0 : rCJKFont.SetWordLineMode( rItem.GetValue() );
1004 0 : rCTLFont.SetWordLineMode( rItem.GetValue() );
1005 : }
1006 :
1007 : // Emphasis
1008 0 : if( GetWhich( rSet, SID_ATTR_CHAR_EMPHASISMARK, nWhich ) )
1009 : {
1010 0 : const SvxEmphasisMarkItem& rItem = static_cast<const SvxEmphasisMarkItem&>( rSet.Get( nWhich ) );
1011 0 : FontEmphasisMark eMark = rItem.GetEmphasisMark();
1012 0 : rFont.SetEmphasisMark( eMark );
1013 0 : rCJKFont.SetEmphasisMark( eMark );
1014 0 : rCTLFont.SetEmphasisMark( eMark );
1015 : }
1016 :
1017 : // Relief
1018 0 : if( GetWhich( rSet, SID_ATTR_CHAR_RELIEF, nWhich ) )
1019 : {
1020 0 : const SvxCharReliefItem& rItem = static_cast<const SvxCharReliefItem&>( rSet.Get( nWhich ) );
1021 0 : FontRelief eFontRelief = ( FontRelief ) rItem.GetValue();
1022 0 : rFont.SetRelief( eFontRelief );
1023 0 : rCJKFont.SetRelief( eFontRelief );
1024 0 : rCTLFont.SetRelief( eFontRelief );
1025 : }
1026 :
1027 : // Effects
1028 0 : if( GetWhich( rSet, SID_ATTR_CHAR_CASEMAP, nWhich ) )
1029 : {
1030 0 : const SvxCaseMapItem& rItem = static_cast<const SvxCaseMapItem&>( rSet.Get( nWhich ) );
1031 0 : SvxCaseMap eCaseMap = ( SvxCaseMap ) rItem.GetValue();
1032 0 : rFont.SetCaseMap( eCaseMap );
1033 0 : rCJKFont.SetCaseMap( eCaseMap );
1034 : // #i78474# small caps do not exist in CTL fonts
1035 0 : rCTLFont.SetCaseMap( eCaseMap == SVX_CASEMAP_KAPITAELCHEN ? SVX_CASEMAP_NOT_MAPPED : eCaseMap );
1036 : }
1037 :
1038 : // Outline
1039 0 : if( GetWhich( rSet, SID_ATTR_CHAR_CONTOUR, nWhich ) )
1040 : {
1041 0 : const SvxContourItem& rItem = static_cast<const SvxContourItem&>( rSet.Get( nWhich ) );
1042 0 : bool bOutline = rItem.GetValue();
1043 0 : rFont.SetOutline( bOutline );
1044 0 : rCJKFont.SetOutline( bOutline );
1045 0 : rCTLFont.SetOutline( bOutline );
1046 : }
1047 :
1048 : // Shadow
1049 0 : if( GetWhich( rSet, SID_ATTR_CHAR_SHADOWED, nWhich ) )
1050 : {
1051 0 : const SvxShadowedItem& rItem = static_cast<const SvxShadowedItem&>( rSet.Get( nWhich ) );
1052 0 : bool bShadow = rItem.GetValue();
1053 0 : rFont.SetShadow( bShadow );
1054 0 : rCJKFont.SetShadow( bShadow );
1055 0 : rCTLFont.SetShadow( bShadow );
1056 : }
1057 :
1058 : // Background
1059 : bool bTransparent;
1060 0 : if( GetWhich( rSet, bPreviewBackgroundToCharacter ? SID_ATTR_BRUSH : SID_ATTR_BRUSH_CHAR, nWhich ) )
1061 : {
1062 0 : const SvxBrushItem& rBrush = static_cast<const SvxBrushItem&>( rSet.Get( nWhich ) );
1063 0 : const Color& rColor = rBrush.GetColor();
1064 0 : bTransparent = rColor.GetTransparency() > 0;
1065 0 : rFont.SetFillColor( rColor );
1066 0 : rCJKFont.SetFillColor( rColor );
1067 0 : rCTLFont.SetFillColor( rColor );
1068 : }
1069 : else
1070 0 : bTransparent = TRUE;
1071 :
1072 0 : rFont.SetTransparent( bTransparent );
1073 0 : rCJKFont.SetTransparent( bTransparent );
1074 0 : rCTLFont.SetTransparent( bTransparent );
1075 :
1076 0 : Color aBackCol( COL_TRANSPARENT );
1077 0 : if( !bPreviewBackgroundToCharacter )
1078 : {
1079 0 : if( GetWhich( rSet, SID_ATTR_BRUSH, nWhich ) )
1080 : {
1081 0 : const SvxBrushItem& rBrush = static_cast<const SvxBrushItem&>( rSet.Get( nWhich ) );
1082 0 : if( GPOS_NONE == rBrush.GetGraphicPos() )
1083 0 : aBackCol = rBrush.GetColor();
1084 : }
1085 : }
1086 0 : SetBackColor( aBackCol );
1087 :
1088 : // Font
1089 0 : SetPrevFont( rSet, SID_ATTR_CHAR_FONT, rFont );
1090 0 : SetPrevFont( rSet, SID_ATTR_CHAR_CJK_FONT, rCJKFont );
1091 0 : SetPrevFont( rSet, SID_ATTR_CHAR_CTL_FONT, rCTLFont );
1092 :
1093 : // Style
1094 0 : SetPrevFontStyle( rSet, SID_ATTR_CHAR_POSTURE, SID_ATTR_CHAR_WEIGHT, rFont );
1095 0 : SetPrevFontStyle( rSet, SID_ATTR_CHAR_CJK_POSTURE, SID_ATTR_CHAR_CJK_WEIGHT, rCJKFont );
1096 0 : SetPrevFontStyle( rSet, SID_ATTR_CHAR_CTL_POSTURE, SID_ATTR_CHAR_CTL_WEIGHT, rCTLFont );
1097 :
1098 : // Size
1099 0 : SetFontSize( rSet, SID_ATTR_CHAR_FONTHEIGHT, rFont );
1100 0 : SetFontSize( rSet, SID_ATTR_CHAR_CJK_FONTHEIGHT, rCJKFont );
1101 0 : SetFontSize( rSet, SID_ATTR_CHAR_CTL_FONTHEIGHT, rCTLFont );
1102 :
1103 : // Language
1104 0 : SetFontLang( rSet, SID_ATTR_CHAR_LANGUAGE, rFont );
1105 0 : SetFontLang( rSet, SID_ATTR_CHAR_CJK_LANGUAGE, rCJKFont );
1106 0 : SetFontLang( rSet, SID_ATTR_CHAR_CTL_LANGUAGE, rCTLFont );
1107 :
1108 : // Color
1109 0 : if( GetWhich( rSet, SID_ATTR_CHAR_COLOR, nWhich ) )
1110 : {
1111 0 : const SvxColorItem& rItem = static_cast<const SvxColorItem&>( rSet.Get( nWhich ) );
1112 0 : Color aCol( rItem.GetValue() );
1113 0 : rFont.SetColor( aCol );
1114 :
1115 0 : rCJKFont.SetColor( aCol );
1116 0 : rCTLFont.SetColor( aCol );
1117 :
1118 0 : AutoCorrectFontColor(); // handle color COL_AUTO
1119 : }
1120 :
1121 : // Kerning
1122 0 : if( GetWhich( rSet, SID_ATTR_CHAR_KERNING, nWhich ) )
1123 : {
1124 0 : const SvxKerningItem& rItem = static_cast<const SvxKerningItem&>( rSet.Get( nWhich ) );
1125 : short nKern = ( short )
1126 0 : LogicToLogic( rItem.GetValue(), ( MapUnit ) rSet.GetPool()->GetMetric( nWhich ), MAP_TWIP );
1127 0 : rFont.SetFixKerning( nKern );
1128 0 : rCJKFont.SetFixKerning( nKern );
1129 0 : rCTLFont.SetFixKerning( nKern );
1130 : }
1131 :
1132 : // Escapement
1133 0 : const sal_uInt8 nProp = 100;
1134 : short nEsc;
1135 : sal_uInt8 nEscProp;
1136 0 : if( GetWhich( rSet, SID_ATTR_CHAR_ESCAPEMENT, nWhich ) )
1137 : {
1138 0 : const SvxEscapementItem& rItem = static_cast<const SvxEscapementItem&>( rSet.Get( nWhich ) );
1139 0 : nEsc = rItem.GetEsc();
1140 0 : nEscProp = rItem.GetProp();
1141 :
1142 0 : if( nEsc == DFLT_ESC_AUTO_SUPER )
1143 0 : nEsc = DFLT_ESC_SUPER;
1144 0 : else if( nEsc == DFLT_ESC_AUTO_SUB )
1145 0 : nEsc = DFLT_ESC_SUB;
1146 : }
1147 : else
1148 : {
1149 0 : nEsc = 0;
1150 0 : nEscProp = 100;
1151 : }
1152 0 : SetPrevFontEscapement( rFont, nProp, nEscProp, nEsc );
1153 0 : SetPrevFontEscapement( rCJKFont, nProp, nEscProp, nEsc );
1154 0 : SetPrevFontEscapement( rCTLFont, nProp, nEscProp, nEsc );
1155 :
1156 : // Font width scale
1157 0 : if( GetWhich( rSet, SID_ATTR_CHAR_SCALEWIDTH, nWhich ) )
1158 : {
1159 0 : const SvxCharScaleWidthItem&rItem = static_cast<const SvxCharScaleWidthItem&>( rSet.Get( nWhich ) );
1160 0 : SetFontWidthScale( rItem.GetValue() );
1161 : }
1162 :
1163 0 : Invalidate();
1164 0 : }
1165 :
1166 0 : void SvxFontPrevWindow::Init(const SfxItemSet& rSet)
1167 : {
1168 0 : SvxFont& rFont = GetFont();
1169 0 : SvxFont& rCJKFont = GetCJKFont();
1170 0 : SvxFont& rCTLFont = GetCTLFont();
1171 :
1172 0 : initFont(rFont);
1173 0 : initFont(rCJKFont);
1174 0 : initFont(rCTLFont);
1175 0 : ResetSettings(true, true);
1176 :
1177 : sal_uInt16 nWhich;
1178 0 : nWhich = rSet.GetPool()->GetWhich( SID_CHAR_DLG_PREVIEW_STRING );
1179 0 : if (ISITEMSET)
1180 : {
1181 0 : const SfxStringItem& rItem = static_cast<const SfxStringItem&>( rSet.Get( nWhich ) );
1182 0 : OUString aString = rItem.GetValue();
1183 0 : if( !aString.isEmpty() )
1184 0 : SetPreviewText( aString );
1185 : else
1186 0 : SetFontNameAsPreviewText();
1187 : }
1188 :
1189 : // Underline
1190 : FontUnderline eUnderline;
1191 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_UNDERLINE );
1192 0 : if( ISITEMSET )
1193 : {
1194 0 : const SvxUnderlineItem& rItem = static_cast<const SvxUnderlineItem&>( rSet.Get( nWhich ) );
1195 0 : eUnderline = ( FontUnderline ) rItem.GetValue();
1196 0 : SetTextLineColor( rItem.GetColor() );
1197 : }
1198 : else
1199 0 : eUnderline = UNDERLINE_NONE;
1200 :
1201 0 : rFont.SetUnderline( eUnderline );
1202 0 : rCJKFont.SetUnderline( eUnderline );
1203 0 : rCTLFont.SetUnderline( eUnderline );
1204 :
1205 : // Overline
1206 : FontUnderline eOverline;
1207 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_OVERLINE );
1208 0 : if( ISITEMSET )
1209 : {
1210 0 : const SvxOverlineItem& rItem = static_cast<const SvxOverlineItem&>( rSet.Get( nWhich ) );
1211 0 : eOverline = ( FontUnderline ) rItem.GetValue();
1212 0 : SetOverlineColor( rItem.GetColor() );
1213 : }
1214 : else
1215 0 : eOverline = UNDERLINE_NONE;
1216 :
1217 0 : rFont.SetOverline( eOverline );
1218 0 : rCJKFont.SetOverline( eOverline );
1219 0 : rCTLFont.SetOverline( eOverline );
1220 :
1221 : // Strikeout
1222 : FontStrikeout eStrikeout;
1223 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_STRIKEOUT );
1224 0 : if( ISITEMSET )
1225 : {
1226 0 : const SvxCrossedOutItem& rItem = static_cast<const SvxCrossedOutItem&>( rSet.Get( nWhich ) );
1227 0 : eStrikeout = ( FontStrikeout ) rItem.GetValue();
1228 : }
1229 : else
1230 0 : eStrikeout = STRIKEOUT_NONE;
1231 :
1232 0 : rFont.SetStrikeout( eStrikeout );
1233 0 : rCJKFont.SetStrikeout( eStrikeout );
1234 0 : rCTLFont.SetStrikeout( eStrikeout );
1235 :
1236 : // WordLineMode
1237 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_WORDLINEMODE );
1238 0 : if( ISITEMSET )
1239 : {
1240 0 : const SvxWordLineModeItem& rItem = static_cast<const SvxWordLineModeItem&>( rSet.Get( nWhich ) );
1241 0 : rFont.SetWordLineMode( rItem.GetValue() );
1242 0 : rCJKFont.SetWordLineMode( rItem.GetValue() );
1243 0 : rCTLFont.SetWordLineMode( rItem.GetValue() );
1244 : }
1245 :
1246 : // Emphasis
1247 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_EMPHASISMARK );
1248 0 : if( ISITEMSET )
1249 : {
1250 0 : const SvxEmphasisMarkItem& rItem = static_cast<const SvxEmphasisMarkItem&>( rSet.Get( nWhich ) );
1251 0 : FontEmphasisMark eMark = rItem.GetEmphasisMark();
1252 0 : rFont.SetEmphasisMark( eMark );
1253 0 : rCJKFont.SetEmphasisMark( eMark );
1254 0 : rCTLFont.SetEmphasisMark( eMark );
1255 : }
1256 :
1257 : // Relief
1258 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_RELIEF );
1259 0 : if( ISITEMSET )
1260 : {
1261 0 : const SvxCharReliefItem& rItem = static_cast<const SvxCharReliefItem&>( rSet.Get( nWhich ) );
1262 0 : FontRelief eFontRelief = ( FontRelief ) rItem.GetValue();
1263 0 : rFont.SetRelief( eFontRelief );
1264 0 : rCJKFont.SetRelief( eFontRelief );
1265 0 : rCTLFont.SetRelief( eFontRelief );
1266 : }
1267 :
1268 : // Effects
1269 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_CASEMAP );
1270 0 : if( ISITEMSET )
1271 : {
1272 0 : const SvxCaseMapItem& rItem = static_cast<const SvxCaseMapItem&>( rSet.Get( nWhich ) );
1273 0 : SvxCaseMap eCaseMap = ( SvxCaseMap ) rItem.GetValue();
1274 0 : rFont.SetCaseMap( eCaseMap );
1275 0 : rCJKFont.SetCaseMap( eCaseMap );
1276 : // #i78474# small caps do not exist in CTL fonts
1277 0 : rCTLFont.SetCaseMap( eCaseMap == SVX_CASEMAP_KAPITAELCHEN ? SVX_CASEMAP_NOT_MAPPED : eCaseMap );
1278 : }
1279 :
1280 : // Outline
1281 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_CONTOUR );
1282 0 : if( ISITEMSET )
1283 : {
1284 0 : const SvxContourItem& rItem = static_cast<const SvxContourItem&>( rSet.Get( nWhich ) );
1285 0 : bool bOutline = rItem.GetValue();
1286 0 : rFont.SetOutline( bOutline );
1287 0 : rCJKFont.SetOutline( bOutline );
1288 0 : rCTLFont.SetOutline( bOutline );
1289 : }
1290 :
1291 : // Shadow
1292 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_SHADOWED );
1293 0 : if( ISITEMSET )
1294 : {
1295 0 : const SvxShadowedItem& rItem = static_cast<const SvxShadowedItem&>( rSet.Get( nWhich ) );
1296 0 : bool bShadow = rItem.GetValue();
1297 0 : rFont.SetShadow( bShadow );
1298 0 : rCJKFont.SetShadow( bShadow );
1299 0 : rCTLFont.SetShadow( bShadow );
1300 : }
1301 :
1302 : // Background
1303 : bool bTransparent;
1304 0 : nWhich = rSet.GetPool()->GetWhich(pImpl->mbPreviewBackgroundToCharacter ? SID_ATTR_BRUSH : SID_ATTR_BRUSH_CHAR);
1305 0 : if (ISITEMSET)
1306 : {
1307 0 : const SvxBrushItem& rBrush = static_cast<const SvxBrushItem&>( rSet.Get( nWhich ) );
1308 0 : const Color& rColor = rBrush.GetColor();
1309 0 : bTransparent = rColor.GetTransparency() > 0;
1310 0 : rFont.SetFillColor(rColor);
1311 0 : rCJKFont.SetFillColor(rColor);
1312 0 : rCTLFont.SetFillColor(rColor);
1313 : }
1314 : else
1315 0 : bTransparent = true;
1316 :
1317 0 : rFont.SetTransparent( bTransparent );
1318 0 : rCJKFont.SetTransparent( bTransparent );
1319 0 : rCTLFont.SetTransparent( bTransparent );
1320 :
1321 0 : Color aBackCol( COL_TRANSPARENT );
1322 0 : if (!pImpl->mbPreviewBackgroundToCharacter)
1323 : {
1324 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_BRUSH );
1325 0 : if (ISITEMSET)
1326 : {
1327 0 : const SvxBrushItem& rBrush = static_cast<const SvxBrushItem&>(rSet.Get(nWhich));
1328 0 : if (GPOS_NONE == rBrush.GetGraphicPos())
1329 0 : aBackCol = rBrush.GetColor();
1330 : }
1331 : }
1332 0 : SetBackColor(aBackCol);
1333 :
1334 : // Font
1335 0 : SetFont(rSet, SID_ATTR_CHAR_FONT, rFont);
1336 0 : SetFont(rSet, SID_ATTR_CHAR_CJK_FONT, rCJKFont);
1337 0 : SetFont(rSet, SID_ATTR_CHAR_CTL_FONT, rCTLFont);
1338 :
1339 : // Style
1340 0 : SetFontStyle(rSet, SID_ATTR_CHAR_POSTURE, SID_ATTR_CHAR_WEIGHT, rFont);
1341 0 : SetFontStyle(rSet, SID_ATTR_CHAR_CJK_POSTURE, SID_ATTR_CHAR_CJK_WEIGHT, rCJKFont);
1342 0 : SetFontStyle(rSet, SID_ATTR_CHAR_CTL_POSTURE, SID_ATTR_CHAR_CTL_WEIGHT, rCTLFont);
1343 :
1344 : // Size
1345 0 : SetFontSize(rSet, SID_ATTR_CHAR_FONTHEIGHT, rFont);
1346 0 : SetFontSize(rSet, SID_ATTR_CHAR_CJK_FONTHEIGHT, rCJKFont);
1347 0 : SetFontSize(rSet, SID_ATTR_CHAR_CTL_FONTHEIGHT, rCTLFont);
1348 :
1349 : // Language
1350 0 : SetFontLang( rSet, SID_ATTR_CHAR_LANGUAGE, rFont );
1351 0 : SetFontLang( rSet, SID_ATTR_CHAR_CJK_LANGUAGE, rCJKFont );
1352 0 : SetFontLang( rSet, SID_ATTR_CHAR_CTL_LANGUAGE, rCTLFont );
1353 :
1354 : // Color
1355 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_COLOR );
1356 0 : if( ISITEMSET )
1357 : {
1358 0 : const SvxColorItem& rItem = static_cast<const SvxColorItem&>( rSet.Get( nWhich ) );
1359 0 : Color aCol( rItem.GetValue() );
1360 0 : rFont.SetColor( aCol );
1361 0 : rCJKFont.SetColor( aCol );
1362 0 : rCTLFont.SetColor( aCol );
1363 :
1364 0 : AutoCorrectFontColor(); // handle color COL_AUTO
1365 : }
1366 :
1367 : // Kerning
1368 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_KERNING );
1369 0 : if( ISITEMSET )
1370 : {
1371 0 : const SvxKerningItem& rItem = static_cast<const SvxKerningItem&>( rSet.Get( nWhich ) );
1372 : short nKern = ( short )
1373 0 : LogicToLogic( rItem.GetValue(), ( MapUnit ) rSet.GetPool()->GetMetric( nWhich ), MAP_TWIP );
1374 0 : rFont.SetFixKerning( nKern );
1375 0 : rCJKFont.SetFixKerning( nKern );
1376 0 : rCTLFont.SetFixKerning( nKern );
1377 : }
1378 :
1379 : // Escapement
1380 0 : nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_ESCAPEMENT );
1381 0 : const sal_uInt8 nProp = 100;
1382 : short nEsc;
1383 : sal_uInt8 nEscProp;
1384 0 : if( ISITEMSET )
1385 : {
1386 0 : const SvxEscapementItem& rItem = static_cast<const SvxEscapementItem&>( rSet.Get( nWhich ) );
1387 0 : nEsc = rItem.GetEsc();
1388 0 : nEscProp = rItem.GetProp();
1389 :
1390 0 : if( nEsc == DFLT_ESC_AUTO_SUPER )
1391 0 : nEsc = DFLT_ESC_SUPER;
1392 0 : else if( nEsc == DFLT_ESC_AUTO_SUB )
1393 0 : nEsc = DFLT_ESC_SUB;
1394 : }
1395 : else
1396 : {
1397 0 : nEsc = 0;
1398 0 : nEscProp = 100;
1399 : }
1400 :
1401 0 : SetFontEscapement( nProp, nEscProp, nEsc );
1402 :
1403 : // Font width scale
1404 0 : SetFontWidthScale( rSet );
1405 :
1406 0 : Invalidate();
1407 0 : }
1408 :
1409 0 : void SvxFontPrevWindow::SetFont( const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont )
1410 : {
1411 0 : sal_uInt16 nWhich = rSet.GetPool()->GetWhich( nSlot );
1412 0 : if( ISITEMSET )
1413 : {
1414 0 : const SvxFontItem& rFontItem = static_cast<const SvxFontItem&>( rSet.Get(nWhich) );
1415 0 : rFont.SetFamily( rFontItem.GetFamily() );
1416 0 : rFont.SetName( rFontItem.GetFamilyName() );
1417 0 : rFont.SetPitch( rFontItem.GetPitch() );
1418 0 : rFont.SetCharSet( rFontItem.GetCharSet() );
1419 0 : rFont.SetStyleName( rFontItem.GetStyleName() );
1420 : }
1421 0 : }
1422 :
1423 0 : void SvxFontPrevWindow::SetFontStyle( const SfxItemSet& rSet, sal_uInt16 nPosture, sal_uInt16 nWeight, SvxFont& rFont )
1424 : {
1425 0 : sal_uInt16 nWhich = rSet.GetPool()->GetWhich( nPosture );
1426 0 : if( ISITEMSET )
1427 : {
1428 0 : const SvxPostureItem& rItem = static_cast<const SvxPostureItem&>( rSet.Get( nWhich ) );
1429 0 : rFont.SetItalic( ( FontItalic ) rItem.GetValue() != ITALIC_NONE ? ITALIC_NORMAL : ITALIC_NONE );
1430 : }
1431 :
1432 0 : nWhich = rSet.GetPool()->GetWhich( nWeight );
1433 0 : if( ISITEMSET )
1434 : {
1435 0 : const SvxWeightItem& rItem = static_cast<const SvxWeightItem&>( rSet.Get( nWhich ) );
1436 0 : rFont.SetWeight( ( FontWeight ) rItem.GetValue() != WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL );
1437 : }
1438 0 : }
1439 :
1440 0 : void SvxFontPrevWindow::SetFontWidthScale( const SfxItemSet& rSet )
1441 : {
1442 0 : sal_uInt16 nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_SCALEWIDTH );
1443 0 : if( ISITEMSET )
1444 : {
1445 0 : const SvxCharScaleWidthItem& rItem = static_cast<const SvxCharScaleWidthItem&>( rSet.Get( nWhich ) );
1446 :
1447 0 : SetFontWidthScale( rItem.GetValue() );
1448 : }
1449 0 : }
1450 :
1451 : namespace
1452 : {
1453 0 : void setFontEscapement(SvxFont& rFont, sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc)
1454 : {
1455 0 : rFont.SetPropr(nProp);
1456 0 : rFont.SetProprRel(nEscProp);
1457 0 : rFont.SetEscapement(nEsc);
1458 0 : }
1459 : }
1460 :
1461 0 : void SvxFontPrevWindow::SetFontEscapement(sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc)
1462 : {
1463 0 : setFontEscapement(GetFont(), nProp, nEscProp, nEsc);
1464 0 : setFontEscapement(GetCJKFont(), nProp, nEscProp, nEsc);
1465 0 : setFontEscapement(GetCTLFont(), nProp, nEscProp, nEsc);
1466 0 : Invalidate();
1467 0 : }
1468 :
1469 0 : Size SvxFontPrevWindow::GetOptimalSize() const
1470 : {
1471 0 : return getPreviewStripSize(this);
1472 390 : }
1473 :
1474 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|