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