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