LibreOffice Module sw (master) 1
drpcps.cxx
Go to the documentation of this file.
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 <hintids.hxx>
21
22#include <cmdid.h>
23#include <docsh.hxx>
24#include <swmodule.hxx>
25#include <view.hxx>
26#include <wrtsh.hxx>
27#include <strings.hrc>
28
29#include <vcl/metric.hxx>
30#include <vcl/settings.hxx>
31
32#include <rtl/ustrbuf.hxx>
33#include <svl/stritem.hxx>
34#include <editeng/fontitem.hxx>
35#include <sfx2/dialoghelper.hxx>
36#include <sfx2/htmlmode.hxx>
37#include <sfx2/objsh.hxx>
38#include <sfx2/printer.hxx>
39#include <svtools/unitconv.hxx>
40#include <vcl/print.hxx>
41#include <vcl/svapp.hxx>
42#include <com/sun/star/i18n/BreakIterator.hpp>
43#include <com/sun/star/i18n/ScriptType.hpp>
45#include <osl/diagnose.h>
46
47#include <charatr.hxx>
48#include <viewopt.hxx>
49#include <drpcps.hxx>
50#include <paratr.hxx>
51#include <uitool.hxx>
52#include <charfmt.hxx>
53
54using namespace css;
55using namespace css::uno;
56using namespace css::lang;
57
58const WhichRangesContainer SwDropCapsPage::s_aPageRg(svl::Items<RES_PARATR_DROP, RES_PARATR_DROP>);
59
60void SwDropCapsPict::SetText( const OUString& rT )
61{
62 maText = rT;
64}
65
67{
68 CustomWidgetController::SetDrawingArea(pDrawingArea);
69 Size aPrefSize(getParagraphPreviewOptimalSize(pDrawingArea->get_ref_device()));
70 pDrawingArea->set_size_request(aPrefSize.Width(), aPrefSize.Height());
71}
72
74{
75 CustomWidgetController::Resize();
77}
78
80{
81 mnLines = nL;
83}
84
85void SwDropCapsPict::SetDistance( sal_uInt16 nD )
86{
87 mnDistance = nD;
89}
90
91void SwDropCapsPict::SetValues( const OUString& rText, sal_uInt8 nLines, sal_uInt16 nDistance )
92{
93 maText = rText;
94 mnLines = nLines;
95 mnDistance = nDistance;
96
98}
99
101{
102 if( !mpPrinter )
103 InitPrinter_();
104}
105
106// Create Default-String from character-count (A, AB, ABC, ...)
107static OUString GetDefaultString(sal_Int32 nChars)
108{
109 OUStringBuffer aStr(nChars);
110 for (sal_Int32 i = 0; i < nChars; i++)
111 aStr.append(static_cast<sal_Unicode>(i + 65));
112 return aStr.makeStringAndClear();
113}
114
115static void calcFontHeightAnyAscent(vcl::RenderContext& rWin, vcl::Font const & _rFont, tools::Long& _nHeight, tools::Long& _nAscent)
116{
117 if ( !_nHeight )
118 {
120 rWin.SetFont(_rFont);
121 FontMetric aMetric(rWin.GetFontMetric());
122 _nHeight = aMetric.GetLineHeight();
123 _nAscent = aMetric.GetAscent();
124 rWin.Pop();
125 }
126}
127
129{
130 if (mbDelPrinter)
132}
133
138void SwDropCapsPict::GetFirstScriptSegment(sal_Int32 &start, sal_Int32 &end, sal_uInt16 &scriptType)
139{
140 start = 0;
141 if( maScriptChanges.empty() )
142 {
143 end = maText.getLength();
144 scriptType = css::i18n::ScriptType::LATIN;
145 }
146 else
147 {
148 end = maScriptChanges[ 0 ].changePos;
149 scriptType = maScriptChanges[ 0 ].scriptType;
150 }
151}
152
159bool SwDropCapsPict::GetNextScriptSegment(size_t &nIdx, sal_Int32 &start, sal_Int32 &end, sal_uInt16 &scriptType)
160{
161 if (maScriptChanges.empty() || nIdx >= maScriptChanges.size() - 1 || end >= maText.getLength())
162 return false;
163 start = maScriptChanges[nIdx++].changePos;
164 end = maScriptChanges[ nIdx ].changePos;
165 scriptType = maScriptChanges[ nIdx ].scriptType;
166 return true;
167}
168
169#define LINES 10
170#define BORDER 2
171
172void SwDropCapsPict::GetFontSettings( vcl::Font& _rFont, sal_uInt16 _nWhich )
173{
174 SwView* pView = GetActiveView();
175 if (!pView)
176 return;
177 SwWrtShell& rWrtShell = pView->GetWrtShell();
178
179 SfxItemSet aSet( rWrtShell.GetAttrPool(), _nWhich, _nWhich);
180 rWrtShell.GetCurAttr(aSet);
181 SvxFontItem aFormatFont(static_cast<const SvxFontItem &>( aSet.Get(_nWhich)));
182
183 _rFont.SetFamily(aFormatFont.GetFamily());
184 _rFont.SetFamilyName(aFormatFont.GetFamilyName());
185 _rFont.SetPitch(aFormatFont.GetPitch());
186 _rFont.SetCharSet(aFormatFont.GetCharSet());
187}
188
190{
191 SwView* pView = GetActiveView();
192 if (!pView)
193 return;
194 SwWrtShell& rWrtShell = pView->GetWrtShell();
195
198
199 // gray lines
201 mnLineH = mnTotLineH - 2;
202
203 vcl::Font aFont;
204 if (mpPage)
205 {
206 // tdf#135244: preview generation should not jump document view
207 auto aLock(rWrtShell.GetView().GetDocShell()->LockAllViews());
208
209 if (!mpPage->m_xTemplateBox->get_active())
210 {
211 // query the Font at paragraph's beginning
212 rWrtShell.Push();
213 rWrtShell.SttCursorMove();
214 rWrtShell.ClearMark();
215 SwWhichPara pSwuifnParaCurr = GoCurrPara;
216 SwMoveFnCollection const & pSwuifnParaStart = fnParaStart;
217 rWrtShell.MovePara(pSwuifnParaCurr,pSwuifnParaStart);
218 // normal
220
221 // CJK
223
224 // CTL
226
227 rWrtShell.EndCursorMove();
229 }
230 else
231 {
232 // query Font at character template
233 SwCharFormat *pFormat = rWrtShell.GetCharStyle(
234 mpPage->m_xTemplateBox->get_active_text(),
236 OSL_ENSURE(pFormat, "character style doesn't exist!");
237 const SvxFontItem &rFormatFont = pFormat->GetFont();
238
239 aFont.SetFamily(rFormatFont.GetFamily());
240 aFont.SetFamilyName(rFormatFont.GetFamilyName());
241 aFont.SetPitch(rFormatFont.GetPitch());
242 aFont.SetCharSet(rFormatFont.GetCharSet());
243 }
244
245 const Color& rFontColor = rWrtShell.GetViewOptions()->GetFontColor();
246 aFont.SetColor( rFontColor );
247 maCJKFont.SetColor( rFontColor );
248 maCTLFont.SetColor( rFontColor );
249 }
250
252 aFont.SetFontSize(Size(0, mnTextH));
253 maCJKFont.SetFontSize(Size(0, mnTextH));
254 maCTLFont.SetFontSize(Size(0, mnTextH));
255
256 aFont.SetTransparent(true);
257 maCJKFont.SetTransparent(true);
258 maCTLFont.SetTransparent(true);
259
260 aFont.SetFillColor(Application::GetSettings().GetStyleSettings().GetWindowColor());
261 maCJKFont.SetFillColor(Application::GetSettings().GetStyleSettings().GetWindowColor());
262 maCTLFont.SetFillColor(Application::GetSettings().GetStyleSettings().GetWindowColor());
263
264 maCJKFont.SetFontSize(Size(0, maCJKFont.GetFontSize().Height()));
265 maCTLFont.SetFontSize(Size(0, maCTLFont.GetFontSize().Height()));
266
267 aFont.SetFontSize(Size(0, aFont.GetFontSize().Height()));
268 maFont = aFont;
269
270 CheckScript();
271
273
274 Invalidate();
275}
276
277void SwDropCapsPict::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& /*rRect*/)
278{
279 if (!IsVisible())
280 return;
281
282 rRenderContext.SetMapMode(MapMode(MapUnit::MapPixel));
283 rRenderContext.SetLineColor();
284
285 rRenderContext.SetFillColor(maBackColor);
286
287 Size aOutputSizePixel(GetOutputSizePixel());
288
289 rRenderContext.DrawRect(tools::Rectangle(Point(0, 0), aOutputSizePixel));
291 Size(aOutputSizePixel.Width () - 2 * BORDER,
292 aOutputSizePixel.Height() - 2 * BORDER))));
293
294 OSL_ENSURE(mnLineH > 0, "We cannot make it that small");
295 tools::Long nY0 = (aOutputSizePixel.Height() - (LINES * mnTotLineH)) / 2;
296
297 rRenderContext.SetFillColor(maTextLineColor);
298
299 for (int i = 0; i < LINES; ++i)
300 {
301 rRenderContext.DrawRect(tools::Rectangle(Point(BORDER, nY0 + i * mnTotLineH),
302 Size(aOutputSizePixel.Width() - 2 * BORDER, mnLineH)));
303 }
304
305 // Text background with gap (240 twips ~ 1 line height)
306 const tools::Long nDistW = (((static_cast<tools::Long>(mnDistance) * 100) / 240) * mnTotLineH) / 100;
307 rRenderContext.SetFillColor(maBackColor);
308 if (mpPage && mpPage->m_xDropCapsBox->get_active())
309 {
310 const Size aTextSize(maTextSize.Width() + nDistW, maTextSize.Height());
311 rRenderContext.DrawRect(tools::Rectangle(Point(BORDER, nY0), aTextSize));
312
313 // draw Text
314 DrawPrev(rRenderContext, Point(BORDER, nY0));
315 }
316 rRenderContext.SetClipRegion();
317}
318
319void SwDropCapsPict::DrawPrev(vcl::RenderContext& rRenderContext, const Point& rPt)
320{
321 Point aPt(rPt);
322 InitPrinter();
323
324 vcl::Font aOldFont = mpPrinter->GetFont();
325 sal_uInt16 nScript;
326 size_t nIdx = 0;
327 sal_Int32 nStart;
328 sal_Int32 nEnd;
329
330 GetFirstScriptSegment(nStart, nEnd, nScript);
331
332 do
333 {
334 SvxFont& rFnt = (nScript == css::i18n::ScriptType::ASIAN)
335 ? maCJKFont
336 : ((nScript == css::i18n::ScriptType::COMPLEX)
337 ? maCTLFont
338 : maFont);
339 mpPrinter->SetFont(rFnt);
340
341 rFnt.DrawPrev(&rRenderContext, mpPrinter, aPt, maText, nStart, nEnd - nStart);
342
343 if (!maScriptChanges.empty())
344 aPt.AdjustX(maScriptChanges[nIdx].textWidth );
345
346 if (!GetNextScriptSegment(nIdx, nStart, nEnd, nScript))
347 break;
348 }
349 while(true);
350
351 mpPrinter->SetFont(aOldFont);
352}
353
355{
356 if( maScriptText == maText )
357 return;
358
360 maScriptChanges.clear();
361 if( !m_xBreak.is() )
362 {
363 Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
364 m_xBreak = css::i18n::BreakIterator::create(xContext);
365 }
366 sal_Int16 nScript = m_xBreak->getScriptType( maText, 0 );
367 sal_Int32 nChg = 0;
368 if( css::i18n::ScriptType::WEAK == nScript )
369 {
370 nChg = m_xBreak->endOfScript( maText, nChg, nScript );
371 if( nChg < maText.getLength() )
372 nScript = m_xBreak->getScriptType( maText, nChg );
373 else
374 nScript = css::i18n::ScriptType::LATIN;
375 }
376
377 for(;;)
378 {
379 nChg = m_xBreak->endOfScript( maText, nChg, nScript );
380 maScriptChanges.emplace_back(nScript, nChg );
381 if( nChg >= maText.getLength() || nChg < 0 )
382 break;
383 nScript = m_xBreak->getScriptType( maText, nChg );
384 }
385}
386
388{
389 InitPrinter();
390
391 sal_uInt16 nScript;
392 size_t nIdx = 0;
393 sal_Int32 nStart;
394 sal_Int32 nEnd;
395 GetFirstScriptSegment(nStart, nEnd, nScript);
396 tools::Long nTextWidth = 0;
397 tools::Long nCJKHeight = 0;
398 tools::Long nCTLHeight = 0;
399 tools::Long nHeight = 0;
400 tools::Long nAscent = 0;
401 tools::Long nCJKAscent = 0;
402 tools::Long nCTLAscent = 0;
403 do
404 {
405 SvxFont& rFnt = (nScript == css::i18n::ScriptType::ASIAN)
406 ? maCJKFont
407 : ((nScript == css::i18n::ScriptType::COMPLEX)
408 ? maCTLFont
409 : maFont);
410
411 sal_uLong nWidth = rFnt.GetTextSize(*mpPrinter, maText, nStart, nEnd-nStart ).Width();
412
413 if (nIdx < maScriptChanges.size())
414 maScriptChanges[nIdx].textWidth = nWidth;
415 nTextWidth += nWidth;
416 switch(nScript)
417 {
418 case css::i18n::ScriptType::ASIAN:
419 calcFontHeightAnyAscent(GetDrawingArea()->get_ref_device(), maCJKFont, nCJKHeight, nCJKAscent);
420 break;
421 case css::i18n::ScriptType::COMPLEX:
422 calcFontHeightAnyAscent(GetDrawingArea()->get_ref_device(), maCTLFont, nCTLHeight, nCTLAscent);
423 break;
424 default:
425 calcFontHeightAnyAscent(GetDrawingArea()->get_ref_device(), maFont, nHeight, nAscent);
426 }
427
428 if (!GetNextScriptSegment(nIdx, nStart, nEnd, nScript))
429 break;
430 }
431 while(true);
432
433 nHeight -= nAscent;
434 nCJKHeight -= nCJKAscent;
435 nCTLHeight -= nCTLAscent;
436 if (nHeight < nCJKHeight)
437 nHeight = nCJKHeight;
438 if (nAscent < nCJKAscent)
439 nAscent = nCJKAscent;
440 if (nHeight < nCTLHeight)
441 nHeight = nCTLHeight;
442 if (nAscent < nCTLAscent)
443 nAscent = nCTLAscent;
444 nHeight += nAscent;
445
446 Size aTextSize(nTextWidth, nHeight);
447 return aTextSize;
448}
449
451{
453
454 if (pSh)
455 mpPrinter = pSh->GetPrinter();
456
457 if (!mpPrinter)
458 {
460 mbDelPrinter = true;
461 }
462}
463
466{
467 auto xNewPage(SwDropCapsPage::Create(get_content_area(), this, &rSet));
468 static_cast<SwDropCapsPage*>(xNewPage.get())->SetFormat(false);
469 SetTabPage(std::move(xNewPage));
470}
471
473 : SfxTabPage(pPage, pController, "modules/swriter/ui/dropcapspage.ui", "DropCapPage", &rSet)
474 , m_bModified(false)
475 , m_bFormat(true)
476 , m_xDropCapsBox(m_xBuilder->weld_check_button("checkCB_SWITCH"))
477 , m_xWholeWordCB(m_xBuilder->weld_check_button("checkCB_WORD"))
478 , m_xSwitchText(m_xBuilder->weld_label("labelFT_DROPCAPS"))
479 , m_xDropCapsField(m_xBuilder->weld_spin_button("spinFLD_DROPCAPS"))
480 , m_xLinesText(m_xBuilder->weld_label("labelTXT_LINES"))
481 , m_xLinesField(m_xBuilder->weld_spin_button("spinFLD_LINES"))
482 , m_xDistanceText(m_xBuilder->weld_label("labelTXT_DISTANCE"))
483 , m_xDistanceField(m_xBuilder->weld_metric_spin_button("spinFLD_DISTANCE", FieldUnit::CM))
484 , m_xTextText(m_xBuilder->weld_label("labelTXT_TEXT"))
485 , m_xTextEdit(m_xBuilder->weld_entry("entryEDT_TEXT"))
486 , m_xTemplateText(m_xBuilder->weld_label("labelTXT_TEMPLATE"))
487 , m_xTemplateBox(m_xBuilder->weld_combo_box("comboBOX_TEMPLATE"))
488 , m_xPict(new weld::CustomWeld(*m_xBuilder, "drawingareaWN_EXAMPLE", m_aPict))
489{
491
493
494 const sal_uInt16 nHtmlMode = ::GetHtmlMode(static_cast<const SwDocShell*>(SfxObjectShell::Current()));
495 m_bHtmlMode = (nHtmlMode & HTMLMODE_ON) != 0;
496
497 // tdf#92154 limit comboBOX_TEMPLATE length
498 const int nMaxWidth(m_xTemplateBox->get_approximate_digit_width() * 50);
499 m_xTemplateBox->set_size_request(nMaxWidth , -1);
500
501 // In the template dialog the text is not influenceable
502 m_xTextText->set_sensitive(!m_bFormat);
503 m_xTextEdit->set_sensitive(!m_bFormat);
504
505 // Metrics
507
508 // Install handler
509 Link<weld::SpinButton&,void> aValueChangedLk = LINK(this, SwDropCapsPage, ValueChangedHdl);
510 m_xDropCapsField->connect_value_changed(aValueChangedLk);
511 m_xLinesField->connect_value_changed(aValueChangedLk);
512 Link<weld::MetricSpinButton&,void> aMetricValueChangedLk = LINK(this, SwDropCapsPage, MetricValueChangedHdl);
513 m_xDistanceField->connect_value_changed(aMetricValueChangedLk);
514 m_xTextEdit->connect_changed(LINK(this, SwDropCapsPage, ModifyHdl));
515 m_xDropCapsBox->connect_toggled(LINK(this, SwDropCapsPage, ClickHdl));
516 m_xTemplateBox->connect_changed(LINK(this, SwDropCapsPage, SelectHdl));
517 m_xWholeWordCB->connect_toggled(LINK(this, SwDropCapsPage, WholeWordHdl));
518}
519
521{
522}
523
525{
526 if (_pSet)
527 FillSet(*_pSet);
528
529 return DeactivateRC::LeavePage;
530}
531
532std::unique_ptr<SfxTabPage> SwDropCapsPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet *rSet)
533{
534 return std::make_unique<SwDropCapsPage>(pPage, pController, *rSet);
535}
536
538{
539 if (m_bModified)
540 FillSet(*rSet);
541 return m_bModified;
542}
543
545{
546 // Characters, lines, gap and text
547 SwFormatDrop aFormatDrop( rSet->Get(RES_PARATR_DROP) );
548 if (aFormatDrop.GetLines() > 1)
549 {
550 m_xDropCapsField->set_value(aFormatDrop.GetChars());
551 m_xLinesField->set_value(aFormatDrop.GetLines());
552 m_xDistanceField->set_value(m_xDistanceField->normalize(aFormatDrop.GetDistance()), FieldUnit::TWIP);
553 m_xWholeWordCB->set_active(aFormatDrop.GetWholeWord());
554 }
555 else
556 {
557 m_xDropCapsField->set_value(1);
558 m_xLinesField->set_value(3);
559 m_xDistanceField->set_value(0, FieldUnit::TWIP);
560 }
561
562 SwView* pView = GetActiveView();
563 if (pView)
565
566 m_xTemplateBox->insert_text(0, SwResId(SW_STR_NONE));
567
568 // Reset format
569 int nSelect = 0;
570 if (aFormatDrop.GetCharFormat())
571 {
572 int nPos = m_xTemplateBox->find_text(aFormatDrop.GetCharFormat()->GetName());
573 if (nPos != -1)
574 nSelect = nPos;
575 }
576 m_xTemplateBox->set_active(nSelect);
577
578 // Enable controls
579 m_xDropCapsBox->set_active(aFormatDrop.GetLines() > 1);
580 const sal_Int32 nVal = m_xDropCapsField->get_value();
581 if (m_bFormat)
582 m_xTextEdit->set_text(GetDefaultString(nVal));
583 else
584 {
585 if (pView)
586 m_xTextEdit->set_text(pView->GetWrtShell().GetDropText(nVal));
587 m_xTextEdit->set_sensitive(true);
588 m_xTextText->set_sensitive(true);
589 }
590
591 // Preview
592 m_aPict.SetValues(m_xTextEdit->get_text(),
593 sal_uInt8(m_xLinesField->get_value()),
594 sal_uInt16(m_xDistanceField->denormalize(m_xDistanceField->get_value(FieldUnit::TWIP))));
595
596 ClickHdl(*m_xDropCapsBox);
597 m_bModified = false;
598}
599
601{
602 bool bChecked = m_xDropCapsBox->get_active();
603
604 m_xWholeWordCB->set_sensitive(bChecked && !m_bHtmlMode);
605
606 m_xSwitchText->set_sensitive(bChecked && !m_xWholeWordCB->get_active());
607 m_xDropCapsField->set_sensitive(bChecked && !m_xWholeWordCB->get_active());
608 m_xLinesText->set_sensitive( bChecked );
609 m_xLinesField->set_sensitive( bChecked );
610 m_xDistanceText->set_sensitive( bChecked );
611 m_xDistanceField->set_sensitive( bChecked );
612 m_xTemplateText->set_sensitive( bChecked );
613 m_xTemplateBox->set_sensitive( bChecked );
614 m_xTextEdit->set_sensitive( bChecked && !m_bFormat );
615 m_xTextText->set_sensitive( bChecked && !m_bFormat );
616
617 if ( bChecked )
618 {
619 ValueChangedHdl(*m_xDropCapsField);
620 m_xDropCapsField->grab_focus();
621 }
622 else
623 m_aPict.SetText("");
624
625 m_bModified = true;
626}
627
629{
630 m_xDropCapsField->set_sensitive(!m_xWholeWordCB->get_active());
631 m_xSwitchText->set_sensitive(!m_xWholeWordCB->get_active());
632
633 ValueChangedHdl(*m_xDropCapsField);
634
635 m_bModified = true;
636}
637
639{
640 OUString sPreview;
641
642 // set text if applicable
643 if (&rEdit == m_xDropCapsField.get())
644 {
645 const sal_Int32 nVal = !m_xWholeWordCB->get_active()
646 ? static_cast<sal_Int32>(m_xDropCapsField->get_value())
647 : 0;
648 bool bSetText = false;
649
650 if (SwView* pView = GetActiveView())
651 {
652 if (m_bFormat || pView->GetWrtShell().GetDropText(1).isEmpty())
654 else
655 {
656 bSetText = true;
657 sPreview = pView->GetWrtShell().GetDropText(nVal);
658 }
659 }
660
661 OUString sEdit(m_xTextEdit->get_text());
662
663 if (!sEdit.isEmpty() && !sPreview.startsWith(sEdit))
664 {
665 sPreview = sEdit.copy(0, std::min(sEdit.getLength(), sPreview.getLength()));
666 bSetText = false;
667 }
668
669 if (bSetText)
670 m_xTextEdit->set_text(sPreview);
671 }
672 else if (&rEdit == m_xTextEdit.get()) // set quantity if applicable
673 {
674 const sal_Int32 nTmp = m_xTextEdit->get_text().getLength();
675 m_xDropCapsField->set_value(std::max<sal_Int32>(1, nTmp));
676 sPreview = m_xTextEdit->get_text();
677 }
678
679 // adjust image
680 if (&rEdit == m_xDropCapsField.get() || &rEdit == m_xTextEdit.get())
682 else if (&rEdit == m_xLinesField.get())
683 m_aPict.SetLines(static_cast<sal_uInt8>(m_xLinesField->get_value()));
684 else
685 m_aPict.SetDistance(o3tl::narrowing<sal_uInt16>(m_xDistanceField->denormalize(m_xDistanceField->get_value(FieldUnit::TWIP))));
686
687 m_bModified = true;
688}
689
690IMPL_LINK(SwDropCapsPage, ModifyHdl, weld::Entry&, rEdit, void)
691{
692 ModifyEntry(rEdit);
693}
694
695IMPL_LINK(SwDropCapsPage, ValueChangedHdl, weld::SpinButton&, rEdit, void)
696{
697 ModifyEntry(rEdit);
698}
699
700IMPL_LINK(SwDropCapsPage, MetricValueChangedHdl, weld::MetricSpinButton&, rEdit, void)
701{
702 ModifyEntry(rEdit.get_widget());
703}
704
706{
707 m_aPict.UpdatePaintSettings();
708 m_bModified = true;
709}
710
712{
713 if(!m_bModified)
714 return;
715
716 SwFormatDrop aFormat;
717
718 bool bOn = m_xDropCapsBox->get_active();
719 if (bOn)
720 {
721 // quantity, lines, gap
722 aFormat.GetChars() = static_cast<sal_uInt8>(m_xDropCapsField->get_value());
723 aFormat.GetLines() = static_cast<sal_uInt8>(m_xLinesField->get_value());
724 aFormat.GetDistance() = o3tl::narrowing<sal_uInt16>(m_xDistanceField->denormalize(m_xDistanceField->get_value(FieldUnit::TWIP)));
725 aFormat.GetWholeWord() = m_xWholeWordCB->get_active();
726
727 // template
728 if (SwView* pView = GetActiveView())
729 if (m_xTemplateBox->get_active())
730 aFormat.SetCharFormat(pView->GetWrtShell().GetCharStyle(m_xTemplateBox->get_active_text()));
731 }
732 else
733 {
734 aFormat.GetChars() = 1;
735 aFormat.GetLines() = 1;
736 aFormat.GetDistance() = 0;
737 }
738
739 // set attributes
740 const SfxPoolItem* pOldItem;
741 if (nullptr == (pOldItem = GetOldItem(rSet, FN_FORMAT_DROPCAPS)) || aFormat != *pOldItem)
742 rSet.Put(aFormat);
743
744 // hard text formatting
745 // Bug 24974: in designer/template catalog this doesn't make sense!!
746 if (!m_bFormat && m_xDropCapsBox->get_active())
747 {
748 OUString sText(m_xTextEdit->get_text());
749
750 if (!m_xWholeWordCB->get_active())
751 {
752 sText = sText.copy(0, std::min<sal_Int32>(sText.getLength(), m_xDropCapsField->get_value()));
753 }
754
755 SfxStringItem aStr(FN_PARAM_1, sText);
756 rSet.Put(aStr);
757 }
758}
759
760/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
constexpr OUStringLiteral sPreview
const StyleSettings & GetStyleSettings() const
static const AllSettings & GetSettings()
tools::Long GetLineHeight() const
tools::Long GetAscent() const
void SetFont(const vcl::Font &rNewFont)
void DrawRect(const tools::Rectangle &rRect)
void SetLineColor()
void SetMapMode()
void SetClipRegion()
void SetFillColor()
FontMetric GetFontMetric() const
void Push(vcl::PushFlags nFlags=vcl::PushFlags::ALL)
tools::Long AdjustX(tools::Long nHorzMove)
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
static SAL_WARN_UNUSED_RESULT SfxObjectShell * Current()
void SetTabPage(std::unique_ptr< SfxTabPage > xTabPage)
weld::Container * get_content_area()
void SetExchangeSupport()
const SfxPoolItem * GetOldItem(const SfxItemSet &rSet, sal_uInt16 nSlot, bool bDeep=true)
virtual SfxPrinter * GetPrinter(bool bCreate=false)
static SAL_WARN_UNUSED_RESULT SfxViewShell * Current()
constexpr tools::Long Height() const
constexpr tools::Long Width() const
const Color & GetWindowColor() const
FontFamily GetFamily() const
FontPitch GetPitch() const
rtl_TextEncoding GetCharSet() const
const OUString & GetFamilyName() const
Size GetTextSize(const OutputDevice &rOut, const OUString &rTxt, const sal_Int32 nIdx=0, const sal_Int32 nLen=SAL_MAX_INT32) const
void DrawPrev(OutputDevice *pOut, Printer *pPrinter, const Point &rPos, const OUString &rTxt, const sal_Int32 nIdx=0, const sal_Int32 nLen=SAL_MAX_INT32) const
Represents the style of a text portion.
Definition: charfmt.hxx:27
void Push()
store a copy of the current cursor on the cursor stack
Definition: crsrsh.cxx:2550
void SttCursorMove()
Definition: crsrsh.cxx:301
bool MovePara(SwWhichPara, SwMoveFnCollection const &)
Definition: crsrsh.cxx:982
void ClearMark()
Definition: crsrsh.cxx:1225
void EndCursorMove(const bool bIdleEnd=false)
Definition: crsrsh.cxx:310
virtual std::unique_ptr< LockAllViewsGuard > LockAllViews() override
Definition: docsh.cxx:366
SwDropCapsDlg(weld::Window *pParent, const SfxItemSet &rSet)
Definition: drpcps.cxx:464
std::unique_ptr< weld::CheckButton > m_xWholeWordCB
Definition: drpcps.hxx:122
std::unique_ptr< weld::ComboBox > m_xTemplateBox
Definition: drpcps.hxx:132
virtual ~SwDropCapsPage() override
Definition: drpcps.cxx:520
bool m_bModified
Definition: drpcps.hxx:117
std::unique_ptr< weld::Entry > m_xTextEdit
Definition: drpcps.hxx:130
virtual DeactivateRC DeactivatePage(SfxItemSet *pSet) override
Definition: drpcps.cxx:524
void ModifyEntry(const weld::Entry &rEdit)
Definition: drpcps.cxx:638
std::unique_ptr< weld::Label > m_xTextText
Definition: drpcps.hxx:129
virtual bool FillItemSet(SfxItemSet *rSet) override
Definition: drpcps.cxx:537
static const WhichRangesContainer s_aPageRg
Definition: drpcps.hxx:147
std::unique_ptr< weld::SpinButton > m_xLinesField
Definition: drpcps.hxx:126
void FillSet(SfxItemSet &rSet)
Definition: drpcps.cxx:711
std::unique_ptr< weld::SpinButton > m_xDropCapsField
Definition: drpcps.hxx:124
SwDropCapsPict m_aPict
Definition: drpcps.hxx:115
SwDropCapsPage(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rSet)
Definition: drpcps.cxx:472
virtual void Reset(const SfxItemSet *rSet) override
Definition: drpcps.cxx:544
std::unique_ptr< weld::CheckButton > m_xDropCapsBox
Definition: drpcps.hxx:121
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *rSet)
Definition: drpcps.cxx:532
std::unique_ptr< weld::MetricSpinButton > m_xDistanceField
Definition: drpcps.hxx:128
bool m_bHtmlMode
Definition: drpcps.hxx:119
bool m_bFormat
Definition: drpcps.hxx:118
void InitPrinter_()
Definition: drpcps.cxx:450
Color maBackColor
Definition: drpcps.hxx:46
void GetFirstScriptSegment(sal_Int32 &start, sal_Int32 &end, sal_uInt16 &scriptType)
Get the details of the first script change.
Definition: drpcps.cxx:138
void CheckScript()
Definition: drpcps.cxx:354
tools::Long mnLineH
Definition: drpcps.hxx:50
void InitPrinter()
Definition: drpcps.cxx:100
SwDropCapsPage * mpPage
Definition: drpcps.hxx:43
sal_uInt8 mnLines
Definition: drpcps.hxx:48
sal_uInt16 mnDistance
Definition: drpcps.hxx:52
virtual void Resize() override
Definition: drpcps.cxx:73
void SetValues(const OUString &rText, sal_uInt8 nLines, sal_uInt16 nDistance)
Definition: drpcps.cxx:91
OUString maScriptText
Definition: drpcps.hxx:45
static void GetFontSettings(vcl::Font &_rFont, sal_uInt16 _nWhich)
Definition: drpcps.cxx:172
SvxFont maFont
Definition: drpcps.hxx:66
void SetDistance(sal_uInt16 nD)
Definition: drpcps.cxx:85
OUString maText
Definition: drpcps.hxx:44
virtual void SetDrawingArea(weld::DrawingArea *pDrawingArea) override
Definition: drpcps.cxx:66
void SetLines(sal_uInt8 nL)
Definition: drpcps.cxx:79
tools::Long mnTextH
Definition: drpcps.hxx:51
SvxFont maCTLFont
Definition: drpcps.hxx:68
css::uno::Reference< css::i18n::XBreakIterator > m_xBreak
Definition: drpcps.hxx:70
std::vector< ScriptInfo > maScriptChanges
Definition: drpcps.hxx:65
Size CalcTextSize()
Definition: drpcps.cxx:387
void SetDropCapsPage(SwDropCapsPage *pPage)
Definition: drpcps.hxx:94
bool mbDelPrinter
Definition: drpcps.hxx:54
void UpdatePaintSettings()
Definition: drpcps.cxx:189
virtual void Paint(vcl::RenderContext &, const tools::Rectangle &rRect) override
Definition: drpcps.cxx:277
Size maTextSize
Definition: drpcps.hxx:69
SvxFont maCJKFont
Definition: drpcps.hxx:67
void SetText(const OUString &rT)
Definition: drpcps.cxx:60
virtual ~SwDropCapsPict() override
Definition: drpcps.cxx:128
void DrawPrev(vcl::RenderContext &rRenderContext, const Point &rPt)
Definition: drpcps.cxx:319
Color maTextLineColor
Definition: drpcps.hxx:47
VclPtr< Printer > mpPrinter
Definition: drpcps.hxx:53
tools::Long mnTotLineH
Definition: drpcps.hxx:49
bool GetNextScriptSegment(size_t &nIdx, sal_Int32 &start, sal_Int32 &end, sal_uInt16 &scriptType)
Get the details of the first script change.
Definition: drpcps.cxx:159
bool GetCurAttr(SfxItemSet &, const bool bMergeIndentValuesOfNumRule=false) const
Definition: edattr.cxx:171
OUString GetDropText(const sal_Int32 nChars) const
Definition: editsh.cxx:452
If SwFormatDrop is a Client, it is the CharFormat that describes the font for the DropCaps.
Definition: paratr.hxx:72
sal_uInt8 GetLines() const
Definition: paratr.hxx:110
sal_uInt8 GetChars() const
Definition: paratr.hxx:113
void SetCharFormat(SwCharFormat *pNew)
Definition: paratr.cxx:64
const SwCharFormat * GetCharFormat() const
Definition: paratr.hxx:122
sal_uInt16 GetDistance() const
Definition: paratr.hxx:119
bool GetWholeWord() const
Definition: paratr.hxx:116
const OUString & GetName() const
Definition: format.hxx:131
const SvxFontItem & GetFont(bool=true) const
Definition: charatr.hxx:122
const Color & GetFontColor() const
Definition: viewopt.cxx:517
const SwViewOption * GetViewOptions() const
Definition: viewsh.hxx:452
const SfxItemPool & GetAttrPool() const
Definition: viewsh.hxx:648
Definition: view.hxx:146
SwWrtShell & GetWrtShell() const
Definition: view.hxx:423
SwDocShell * GetDocShell()
Definition: view.cxx:1193
Used by the UI to modify the document model.
Definition: wrtsh.hxx:97
SwCharFormat * GetCharStyle(const OUString &rFormatName, GetStyle eCreate=GETSTYLE_NOCREATE)
Definition: wrtsh1.cxx:1840
@ GETSTYLE_CREATEANY
Definition: wrtsh.hxx:363
bool Pop(SwCursorShell::PopMode, ::std::optional< SwCallLink > &roLink)
Definition: wrtsh1.cxx:2047
const SwView & GetView() const
Definition: wrtsh.hxx:443
void disposeAndClear()
static VclPtr< reference_type > Create(Arg &&... arg)
void SetFontSize(const Size &)
void SetPitch(FontPitch ePitch)
void SetTransparent(bool bTransparent)
void SetFillColor(const Color &)
void SetColor(const Color &)
void SetFamily(FontFamily)
void SetCharSet(rtl_TextEncoding)
const Size & GetFontSize() const
void SetFamilyName(const OUString &rFamilyName)
weld::DrawingArea * GetDrawingArea() const
Size const & GetOutputSizePixel() const
virtual OutputDevice & get_ref_device()=0
virtual void set_size_request(int nWidth, int nHeight)=0
#define FN_FORMAT_DROPCAPS
Definition: cmdid.h:352
constexpr ::Color COL_LIGHTGRAY(0xC0, 0xC0, 0xC0)
bool(* SwWhichPara)(SwPaM &, SwMoveFnCollection const &)
Definition: cshtyp.hxx:43
Size SFX2_DLLPUBLIC getParagraphPreviewOptimalSize(const OutputDevice &rReference)
IMPL_LINK(SwDropCapsPage, ModifyHdl, weld::Entry &, rEdit, void)
Definition: drpcps.cxx:690
static OUString GetDefaultString(sal_Int32 nChars)
Definition: drpcps.cxx:107
#define LINES
Definition: drpcps.cxx:169
IMPL_LINK_NOARG(SwDropCapsPage, ClickHdl, weld::Toggleable &, void)
Definition: drpcps.cxx:600
#define BORDER
Definition: drpcps.cxx:170
static void calcFontHeightAnyAscent(vcl::RenderContext &rWin, vcl::Font const &_rFont, tools::Long &_nHeight, tools::Long &_nAscent)
Definition: drpcps.cxx:115
FieldUnit
constexpr TypedWhichId< SvxFontItem > RES_CHRATR_CJK_FONT(22)
constexpr TypedWhichId< SvxFontItem > RES_CHRATR_CTL_FONT(27)
constexpr TypedWhichId< SwFormatDrop > RES_PARATR_DROP(70)
constexpr TypedWhichId< SvxFontItem > RES_CHRATR_FONT(7)
HTMLMODE_ON
sal_uInt16 nPos
aStr
int i
end
long Long
SwNodeOffset min(const SwNodeOffset &a, const SwNodeOffset &b)
Definition: nodeoffset.hxx:35
bool GoCurrPara(SwPaM &rPam, SwMoveFnCollection const &aPosPara)
Definition: pam.cxx:1248
SwMoveFnCollection const & fnParaStart
Definition: paminit.cxx:48
static SfxItemSet & rSet
sal_uIntPtr sal_uLong
SwView * GetActiveView()
Definition: swmodul1.cxx:115
OUString SwResId(TranslateId aId)
Definition: swmodule.cxx:168
DeactivateRC
void SetFormat(LotusContext &rContext, SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt8 nFormat, sal_uInt8 nSt)
unsigned char sal_uInt8
sal_uInt16 sal_Unicode
SW_DLLPUBLIC void FillCharStyleListBox(weld::ComboBox &rToFill, SwDocShell *pDocSh, bool bSorted=false, bool bWithDefault=false)
Definition: uitool.cxx:781
SW_DLLPUBLIC FieldUnit GetDfltMetric(bool bWeb)
Definition: uitool.cxx:756
SVT_DLLPUBLIC void SetFieldUnit(weld::MetricSpinButton &rCtrl, FieldUnit eUnit, bool bAll=false)
sal_uInt16 GetHtmlMode(const SwDocShell *pShell)
Definition: viewopt.cxx:415