xref: /core/sw/source/ui/misc/pggrid.cxx (revision 384167ab)
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 <cmdid.h>
21 #include <hintids.hxx>
22 #include <svx/colorbox.hxx>
23 #include <editeng/sizeitem.hxx>
24 #include <editeng/lrspitem.hxx>
25 #include <editeng/ulspitem.hxx>
26 #include <editeng/boxitem.hxx>
27 #include <editeng/frmdiritem.hxx>
28 #include <svx/ruler.hxx>
29 #include <pggrid.hxx>
30 #include <tgrditem.hxx>
31 #include <svx/pageitem.hxx>
32 
33 #include <wrtsh.hxx>
34 #include <doc.hxx>
35 #include <swmodule.hxx>
36 #include <view.hxx>
37 
38 constexpr tools::Long constTwips_5mm = o3tl::toTwips(5, o3tl::Length::mm);
39 
40 SwTextGridPage::SwTextGridPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet &rSet)
41     : SfxTabPage(pPage, pController, "modules/swriter/ui/textgridpage.ui", "TextGridPage", &rSet)
42     , m_nRubyUserValue(0)
43     , m_bRubyUserValue(false)
44     , m_aPageSize(constTwips_5mm, constTwips_5mm)
45     , m_bVertical(false)
46     , m_bSquaredMode(false)
47     , m_bHRulerChanged(false)
48     , m_bVRulerChanged(false)
49     , m_xNoGridRB(m_xBuilder->weld_radio_button("radioRB_NOGRID"))
50     , m_xLinesGridRB(m_xBuilder->weld_radio_button("radioRB_LINESGRID"))
51     , m_xCharsGridRB(m_xBuilder->weld_radio_button("radioRB_CHARSGRID"))
52     , m_xSnapToCharsCB(m_xBuilder->weld_check_button("checkCB_SNAPTOCHARS"))
53     , m_xExampleWN(new weld::CustomWeld(*m_xBuilder, "drawingareaWN_EXAMPLE", m_aExampleWN))
54     , m_xLayoutFL(m_xBuilder->weld_widget("frameFL_LAYOUT"))
55     , m_xLinesPerPageNF(m_xBuilder->weld_spin_button("spinNF_LINESPERPAGE"))
56     , m_xLinesRangeFT(m_xBuilder->weld_label("labelFT_LINERANGE"))
57     , m_xTextSizeMF(m_xBuilder->weld_metric_spin_button("spinMF_TEXTSIZE", FieldUnit::POINT))
58     , m_xCharsPerLineFT(m_xBuilder->weld_label("labelFT_CHARSPERLINE"))
59     , m_xCharsPerLineNF(m_xBuilder->weld_spin_button("spinNF_CHARSPERLINE"))
60     , m_xCharsRangeFT(m_xBuilder->weld_label("labelFT_CHARRANGE"))
61     , m_xCharWidthFT(m_xBuilder->weld_label("labelFT_CHARWIDTH"))
62     , m_xCharWidthMF(m_xBuilder->weld_metric_spin_button("spinMF_CHARWIDTH", FieldUnit::POINT))
63     , m_xRubySizeFT(m_xBuilder->weld_label("labelFT_RUBYSIZE"))
64     , m_xRubySizeMF(m_xBuilder->weld_metric_spin_button("spinMF_RUBYSIZE", FieldUnit::POINT))
65     , m_xRubyBelowCB(m_xBuilder->weld_check_button("checkCB_RUBYBELOW"))
66     , m_xDisplayFL(m_xBuilder->weld_widget("frameFL_DISPLAY"))
67     , m_xDisplayCB(m_xBuilder->weld_check_button("checkCB_DISPLAY"))
68     , m_xPrintCB(m_xBuilder->weld_check_button("checkCB_PRINT"))
69     , m_xColorLB(new ColorListBox(m_xBuilder->weld_menu_button("listLB_COLOR"),
70                 [this]{ return GetDialogController()->getDialog(); }))
71 {
72     Link<weld::SpinButton&,void> aLink = LINK(this, SwTextGridPage, CharorLineChangedHdl);
73     m_xCharsPerLineNF->connect_value_changed(aLink);
74     m_xLinesPerPageNF->connect_value_changed(aLink);
75 
76     Link<weld::MetricSpinButton&,void> aSizeLink = LINK(this, SwTextGridPage, TextSizeChangedHdl);
77     m_xTextSizeMF->connect_value_changed(aSizeLink);
78     m_xRubySizeMF->connect_value_changed(aSizeLink);
79     m_xCharWidthMF->connect_value_changed(aSizeLink);
80 
81     Link<weld::Toggleable&,void> aGridTypeHdl = LINK(this, SwTextGridPage, GridTypeHdl);
82     m_xNoGridRB->connect_toggled(aGridTypeHdl);
83     m_xLinesGridRB->connect_toggled(aGridTypeHdl);
84     m_xCharsGridRB->connect_toggled(aGridTypeHdl);
85 
86     m_xColorLB->SetSelectHdl(LINK(this, SwTextGridPage, ColorModifyHdl));
87     m_xPrintCB->connect_toggled(LINK(this, SwTextGridPage, GridModifyClickHdl));
88     m_xRubyBelowCB->connect_toggled(LINK(this, SwTextGridPage, GridModifyClickHdl));
89 
90     m_xDisplayCB->connect_toggled(LINK(this, SwTextGridPage, DisplayGridHdl));
91 
92     //Get the default paper mode
93     SwView *pView   = ::GetActiveView();
94     if( pView )
95     {
96         SwWrtShell* pSh = pView->GetWrtShellPtr();
97         if( pSh )
98         {
99             m_bSquaredMode = pSh->GetDoc()->IsSquaredPageMode();
100         }
101     }
102     if( m_bSquaredMode )
103     {
104 
105         m_xRubySizeFT->show();
106         m_xRubySizeMF->show();
107         m_xRubyBelowCB->show();
108         m_xSnapToCharsCB->hide();
109         m_xCharWidthFT->hide();
110         m_xCharWidthMF->hide();
111     }
112     else
113     {
114         m_xRubySizeFT->hide();
115         m_xRubySizeMF->hide();
116         m_xRubyBelowCB->hide();
117         m_xSnapToCharsCB->show();
118         m_xCharWidthFT->show();
119         m_xCharWidthMF->show();
120     }
121 }
122 
123 SwTextGridPage::~SwTextGridPage()
124 {
125     m_xColorLB.reset();
126 }
127 
128 std::unique_ptr<SfxTabPage> SwTextGridPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet *rSet)
129 {
130     return std::make_unique<SwTextGridPage>(pPage, pController, *rSet);
131 }
132 
133 bool SwTextGridPage::FillItemSet(SfxItemSet *rSet)
134 {
135     bool bRet = false;
136     if (m_xNoGridRB->get_state_changed_from_saved() ||
137         m_xLinesGridRB->get_state_changed_from_saved() ||
138         m_xLinesPerPageNF->get_value_changed_from_saved() ||
139         m_xTextSizeMF->get_value_changed_from_saved() ||
140         m_xCharsPerLineNF->get_value_changed_from_saved() ||
141         m_xSnapToCharsCB->get_state_changed_from_saved() ||
142         m_xRubySizeMF->get_value_changed_from_saved() ||
143         m_xCharWidthMF->get_value_changed_from_saved() ||
144         m_xRubyBelowCB->get_state_changed_from_saved() ||
145         m_xDisplayCB->get_state_changed_from_saved() ||
146         m_xPrintCB->get_state_changed_from_saved() ||
147         m_xColorLB->IsValueChangedFromSaved())
148     {
149         PutGridItem(*rSet);
150         bRet = true;
151     }
152 
153     // draw ticks of ruler
154     SwView * pView = ::GetActiveView();
155     if ( m_bHRulerChanged )
156         pView->GetHRuler().DrawTicks();
157     if ( m_bVRulerChanged )
158         pView->GetVRuler().DrawTicks();
159     return bRet;
160 }
161 
162 void    SwTextGridPage::Reset(const SfxItemSet *rSet)
163 {
164     sal_Int32 nLinesPerPage = 0;
165 
166     if(SfxItemState::DEFAULT <= rSet->GetItemState(RES_TEXTGRID))
167     {
168         const SwTextGridItem& rGridItem = rSet->Get(RES_TEXTGRID);
169         weld::RadioButton* pButton = nullptr;
170         switch(rGridItem.GetGridType())
171         {
172             case GRID_NONE :        pButton = m_xNoGridRB.get();    break;
173             case GRID_LINES_ONLY  : pButton = m_xLinesGridRB.get(); break;
174             default:                pButton = m_xCharsGridRB.get();
175         }
176         pButton->set_active(true);
177         m_xDisplayCB->set_active(rGridItem.IsDisplayGrid());
178         GridTypeHdl(*pButton);
179         m_xSnapToCharsCB->set_active(rGridItem.IsSnapToChars());
180         nLinesPerPage = rGridItem.GetLines();
181 
182         SetLinesOrCharsRanges(*m_xLinesRangeFT , m_xLinesPerPageNF->get_max());
183         m_nRubyUserValue = rGridItem.GetBaseHeight();
184         m_bRubyUserValue = true;
185         m_xTextSizeMF->set_value(m_xTextSizeMF->normalize(m_nRubyUserValue), FieldUnit::TWIP);
186         m_xRubySizeMF->set_value(m_xRubySizeMF->normalize(rGridItem.GetRubyHeight()), FieldUnit::TWIP);
187         m_xCharWidthMF->set_value(m_xCharWidthMF->normalize(rGridItem.GetBaseWidth()), FieldUnit::TWIP);
188         m_xRubyBelowCB->set_active(rGridItem.IsRubyTextBelow());
189         m_xPrintCB->set_active(rGridItem.IsPrintGrid());
190         m_xColorLB->SelectEntry(rGridItem.GetColor());
191     }
192     UpdatePageSize(*rSet);
193 
194     if (nLinesPerPage > 0)
195         m_xLinesPerPageNF->set_value(nLinesPerPage);
196 
197     m_xNoGridRB->save_state();
198     m_xLinesGridRB->save_state();
199     m_xSnapToCharsCB->save_state();
200     m_xLinesPerPageNF->save_value();
201     m_xTextSizeMF->save_value();
202     m_xCharsPerLineNF->save_value();
203     m_xRubySizeMF->save_value();
204     m_xCharWidthMF->save_value();
205     m_xRubyBelowCB->save_state();
206     m_xDisplayCB->save_state();
207     m_xPrintCB->save_state();
208     m_xColorLB->SaveValue();
209 }
210 
211 void    SwTextGridPage::ActivatePage( const SfxItemSet& rSet )
212 {
213     m_aExampleWN.Hide();
214     m_aExampleWN.UpdateExample(rSet);
215     UpdatePageSize(rSet);
216     m_aExampleWN.Show();
217     m_aExampleWN.Invalidate();
218 }
219 
220 DeactivateRC SwTextGridPage::DeactivatePage( SfxItemSet* )
221 {
222     return DeactivateRC::LeavePage;
223 }
224 
225 void SwTextGridPage::PutGridItem(SfxItemSet& rSet)
226 {
227         SwTextGridItem aGridItem;
228         aGridItem.SetGridType(m_xNoGridRB->get_active() ? GRID_NONE :
229             m_xLinesGridRB->get_active() ? GRID_LINES_ONLY : GRID_LINES_CHARS );
230         aGridItem.SetSnapToChars(m_xSnapToCharsCB->get_active());
231         aGridItem.SetLines( static_cast< sal_uInt16 >(m_xLinesPerPageNF->get_value()) );
232         aGridItem.SetBaseHeight( static_cast< sal_uInt16 >(
233             m_bRubyUserValue ? m_nRubyUserValue :
234                 m_xTextSizeMF->denormalize(m_xTextSizeMF->get_value(FieldUnit::TWIP))) );
235         aGridItem.SetRubyHeight( static_cast< sal_uInt16 >(m_xRubySizeMF->denormalize(m_xRubySizeMF->get_value(FieldUnit::TWIP))) );
236         aGridItem.SetBaseWidth( static_cast< sal_uInt16 >(m_xCharWidthMF->denormalize(m_xCharWidthMF->get_value(FieldUnit::TWIP))) );
237         aGridItem.SetRubyTextBelow(m_xRubyBelowCB->get_active());
238         aGridItem.SetSquaredMode(m_bSquaredMode);
239         aGridItem.SetDisplayGrid(m_xDisplayCB->get_active());
240         aGridItem.SetPrintGrid(m_xPrintCB->get_active());
241         aGridItem.SetColor(m_xColorLB->GetSelectEntryColor());
242         rSet.Put(aGridItem);
243 
244         SwView * pView = ::GetActiveView();
245         if ( aGridItem.GetGridType() != GRID_NONE )
246         {
247             if ( aGridItem.GetGridType() == GRID_LINES_CHARS )
248             {
249                 m_bHRulerChanged = true;
250             }
251             m_bVRulerChanged = true;
252             pView->GetHRuler().SetCharWidth(static_cast<tools::Long>(m_xCharWidthMF->get_value(FieldUnit::TWIP)/56.7));
253             pView->GetVRuler().SetLineHeight(static_cast<tools::Long>(m_xTextSizeMF->get_value(FieldUnit::TWIP)/56.7));
254         }
255 }
256 
257 void SwTextGridPage::UpdatePageSize(const SfxItemSet& rSet)
258 {
259     if( SfxItemState::UNKNOWN !=  rSet.GetItemState( RES_FRAMEDIR ))
260     {
261         const SvxFrameDirectionItem& rDirItem =
262                     rSet.Get(RES_FRAMEDIR);
263         m_bVertical = rDirItem.GetValue() == SvxFrameDirection::Vertical_RL_TB||
264                     rDirItem.GetValue() == SvxFrameDirection::Vertical_LR_TB;
265     }
266 
267     if( SfxItemState::SET != rSet.GetItemState( SID_ATTR_PAGE_SIZE ))
268         return;
269 
270     const SvxSizeItem& rSize = rSet.Get(SID_ATTR_PAGE_SIZE);
271     const SvxLRSpaceItem& rLRSpace = rSet.Get( RES_LR_SPACE );
272     const SvxULSpaceItem& rULSpace = rSet.Get( RES_UL_SPACE );
273     const SvxBoxItem& rBox = rSet.Get(RES_BOX);
274     sal_Int32 nDistanceLR = rLRSpace.GetLeft() + rLRSpace.GetRight();
275     sal_Int32 nDistanceUL = rULSpace.GetUpper() + rULSpace.GetLower();
276 
277     for( const TypedWhichId<SvxSetItem> & nId : { SID_ATTR_PAGE_HEADERSET, SID_ATTR_PAGE_FOOTERSET })
278     {
279         if( const SvxSetItem* pItem = rSet.GetItemIfSet( nId, false ) )
280         {
281             const SfxItemSet& rExtraSet = pItem->GetItemSet();
282             const SfxBoolItem& rOn =
283                 rExtraSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_ON ) );
284 
285             if ( rOn.GetValue() )
286             {
287                 const SvxSizeItem& rSizeItem =
288                     rExtraSet.Get(rSet.GetPool()->GetWhich(SID_ATTR_PAGE_SIZE));
289                 nDistanceUL += rSizeItem.GetSize().Height();
290             }
291         }
292     }
293 
294     sal_Int32 nValue1 = rSize.GetSize().Height() - nDistanceUL -
295             rBox.GetDistance(SvxBoxItemLine::TOP) -
296                                 rBox.GetDistance(SvxBoxItemLine::BOTTOM);
297     sal_Int32 nValue2 = rSize.GetSize().Width() - nDistanceLR -
298             rBox.GetDistance(SvxBoxItemLine::LEFT) -
299                                 rBox.GetDistance(SvxBoxItemLine::RIGHT);
300     if(m_bVertical)
301     {
302         m_aPageSize.setWidth( nValue1 );
303         m_aPageSize.setHeight( nValue2 );
304     }
305     else
306     {
307         m_aPageSize.setWidth( nValue2 );
308         m_aPageSize.setHeight( nValue1 );
309     }
310 
311     sal_Int32 nTextSize = static_cast< sal_Int32 >(m_bRubyUserValue ?
312                 m_nRubyUserValue :
313                     m_xTextSizeMF->denormalize(m_xTextSizeMF->get_value(FieldUnit::TWIP)));
314 
315     if ( m_bSquaredMode )
316     {
317         sal_Int32 nCharsPerLine = m_aPageSize.Width() / nTextSize;
318         m_xCharsPerLineNF->set_max(nCharsPerLine);
319         m_xCharsPerLineNF->set_sensitive(nCharsPerLine != 0);
320         m_xCharsPerLineNF->set_value(nCharsPerLine);
321         sal_Int32 nMaxLines = m_aPageSize.Height() /
322         (   m_xTextSizeMF->denormalize(m_xTextSizeMF->get_value(FieldUnit::TWIP)) +
323                     m_xRubySizeMF->denormalize(m_xRubySizeMF->get_value(FieldUnit::TWIP)));
324         m_xLinesPerPageNF->set_max(nMaxLines);
325         m_xLinesPerPageNF->set_sensitive(nMaxLines != 0);
326         SetLinesOrCharsRanges( *m_xCharsRangeFT , m_xCharsPerLineNF->get_max() );
327         SetLinesOrCharsRanges( *m_xLinesRangeFT , m_xLinesPerPageNF->get_max() );
328     }
329     else
330     {
331         sal_Int32 nTextWidth = static_cast< sal_Int32 >(m_xCharWidthMF->denormalize(m_xCharWidthMF->get_value(FieldUnit::TWIP)));
332         m_xLinesPerPageNF->set_value(m_aPageSize.Height() / nTextSize);
333         if (nTextWidth)
334             m_xCharsPerLineNF->set_value(m_aPageSize.Width() / nTextWidth);
335         else
336             m_xCharsPerLineNF->set_value(45);
337         SetLinesOrCharsRanges( *m_xCharsRangeFT , m_xCharsPerLineNF->get_max() );
338         SetLinesOrCharsRanges( *m_xLinesRangeFT , m_xLinesPerPageNF->get_max() );
339     }
340 }
341 
342 void SwTextGridPage::SetLinesOrCharsRanges(weld::Label& rField, const sal_Int32 nValue )
343 {
344     OUString aFieldStr = "( 1 -" + OUString::number(nValue) + " )";
345     rField.set_label(aFieldStr);
346 }
347 
348 WhichRangesContainer SwTextGridPage::GetRanges()
349 {
350     return WhichRangesContainer(svl::Items<RES_TEXTGRID, RES_TEXTGRID>);
351 }
352 
353 IMPL_LINK(SwTextGridPage, CharorLineChangedHdl, weld::SpinButton&, rField, void)
354 {
355     //if in squared mode
356     if ( m_bSquaredMode )
357     {
358         if (m_xCharsPerLineNF.get() == &rField)
359         {
360             auto nValue = m_xCharsPerLineNF->get_value();
361             assert(nValue && "div-by-zero");
362             auto nWidth = m_aPageSize.Width() / nValue;
363             m_xTextSizeMF->set_value(m_xTextSizeMF->normalize(nWidth), FieldUnit::TWIP);
364             //prevent rounding errors in the MetricField by saving the used value
365             m_nRubyUserValue = nWidth;
366             m_bRubyUserValue = true;
367 
368         }
369         //set maximum line per page
370         {
371             sal_Int32 nMaxLines = static_cast< sal_Int32 >(m_aPageSize.Height() /
372                 (   m_xTextSizeMF->denormalize(m_xTextSizeMF->get_value(FieldUnit::TWIP)) +
373                     m_xRubySizeMF->denormalize(m_xRubySizeMF->get_value(FieldUnit::TWIP))));
374             m_xLinesPerPageNF->set_max(nMaxLines);
375             m_xLinesPerPageNF->set_sensitive(nMaxLines != 0);
376         }
377         SetLinesOrCharsRanges( *m_xLinesRangeFT , m_xLinesPerPageNF->get_max() );
378         SetLinesOrCharsRanges( *m_xCharsRangeFT , m_xCharsPerLineNF->get_max() );
379     }
380     else//in normal mode
381     {
382         if (m_xLinesPerPageNF.get() == &rField)
383         {
384             auto nValue = m_xLinesPerPageNF->get_value();
385             assert(nValue && "div-by-zero");
386             auto nHeight = m_aPageSize.Height() / nValue;
387             m_xTextSizeMF->set_value(m_xTextSizeMF->normalize(nHeight), FieldUnit::TWIP);
388             m_xRubySizeMF->set_value(0, FieldUnit::TWIP);
389             SetLinesOrCharsRanges( *m_xLinesRangeFT , m_xLinesPerPageNF->get_max() );
390 
391             m_nRubyUserValue = nHeight;
392             m_bRubyUserValue = true;
393         }
394         else if (m_xCharsPerLineNF.get() == &rField)
395         {
396             auto nValue = m_xCharsPerLineNF->get_value();
397             assert(nValue && "div-by-zero");
398             auto nWidth = m_aPageSize.Width() / nValue;
399             m_xCharWidthMF->set_value(m_xCharWidthMF->normalize(nWidth), FieldUnit::TWIP);
400             SetLinesOrCharsRanges( *m_xCharsRangeFT , m_xCharsPerLineNF->get_max() );
401         }
402     }
403     GridModifyHdl();
404 }
405 
406 IMPL_LINK(SwTextGridPage, TextSizeChangedHdl, weld::MetricSpinButton&, rField, void)
407 {
408     //if in squared mode
409     if( m_bSquaredMode )
410     {
411         if (m_xTextSizeMF.get() == &rField)
412         {
413             m_bRubyUserValue = false;
414 
415             // fdo#50941: set maximum characters per line
416             sal_Int32 nTextSize = static_cast< sal_Int32 >(m_xTextSizeMF->denormalize(m_xTextSizeMF->get_value(FieldUnit::TWIP)));
417             if (nTextSize > 0)
418             {
419                 sal_Int32 nMaxChars = m_aPageSize.Width() / nTextSize;
420                 m_xCharsPerLineNF->set_value(nMaxChars);
421                 m_xCharsPerLineNF->set_max(nMaxChars);
422                 m_xCharsPerLineNF->set_sensitive(nMaxChars != 0);
423                 SetLinesOrCharsRanges( *m_xCharsRangeFT , m_xCharsPerLineNF->get_max() );
424             }
425         }
426         //set maximum line per page
427         {
428             sal_Int32 nMaxLines = static_cast< sal_Int32 >(m_aPageSize.Height() /
429                 (   m_xTextSizeMF->denormalize(m_xTextSizeMF->get_value(FieldUnit::TWIP)) +
430                     m_xRubySizeMF->denormalize(m_xRubySizeMF->get_value(FieldUnit::TWIP))));
431             m_xLinesPerPageNF->set_max(nMaxLines);
432             m_xLinesPerPageNF->set_sensitive(nMaxLines != 0);
433             SetLinesOrCharsRanges( *m_xLinesRangeFT , m_xLinesPerPageNF->get_max() );
434         }
435     }
436     else
437     {
438         if (m_xTextSizeMF.get() == &rField)
439         {
440             sal_Int32 nTextSize = static_cast< sal_Int32 >(m_xTextSizeMF->denormalize(m_xTextSizeMF->get_value(FieldUnit::TWIP)));
441             m_xLinesPerPageNF->set_value(m_aPageSize.Height() / nTextSize);
442             m_bRubyUserValue = false;
443             SetLinesOrCharsRanges( *m_xLinesRangeFT , m_xLinesPerPageNF->get_max() );
444         }
445         else if (m_xCharWidthMF.get() == &rField)
446         {
447             sal_Int32 nTextWidth = static_cast< sal_Int32 >(m_xCharWidthMF->denormalize(m_xCharWidthMF->get_value(FieldUnit::TWIP)));
448             sal_Int32 nMaxChar = 45 ;
449             if (nTextWidth)
450                 nMaxChar = m_aPageSize.Width() / nTextWidth;
451             m_xCharsPerLineNF->set_value( nMaxChar );
452             SetLinesOrCharsRanges( *m_xCharsRangeFT , m_xCharsPerLineNF->get_max() );
453         }
454         //rubySize is disabled
455     }
456     GridModifyHdl();
457 }
458 
459 IMPL_LINK(SwTextGridPage, GridTypeHdl, weld::Toggleable&, rButton, void)
460 {
461     if (!rButton.get_active())
462         return;
463 
464     const bool bNoGrid = m_xNoGridRB.get() == &rButton;
465     m_xLayoutFL->set_sensitive(!bNoGrid);
466     m_xDisplayFL->set_sensitive(!bNoGrid);
467 
468     //one special case
469     if (!bNoGrid)
470         DisplayGridHdl(*m_xDisplayCB);
471 
472     bool bEnable = m_xCharsGridRB.get() == &rButton;
473     m_xSnapToCharsCB->set_sensitive(bEnable);
474 
475     bEnable = m_xLinesGridRB.get() == &rButton;
476     if (bEnable && !m_bSquaredMode)
477     {
478         m_xCharsPerLineFT->set_sensitive(false);
479         m_xCharsPerLineNF->set_sensitive(false);
480         m_xCharsRangeFT->set_sensitive(false);
481         m_xCharWidthFT->set_sensitive(false);
482         m_xCharWidthMF->set_sensitive(false);
483     }
484 
485     //recalc which dependencies are sensitive
486     if (!bNoGrid)
487         TextSizeChangedHdl(*m_xTextSizeMF);
488 
489     GridModifyHdl();
490 }
491 
492 IMPL_LINK_NOARG(SwTextGridPage, DisplayGridHdl, weld::Toggleable&, void)
493 {
494     bool bChecked = m_xDisplayCB->get_active();
495     m_xPrintCB->set_sensitive(bChecked);
496     m_xPrintCB->set_active(bChecked);
497 }
498 
499 IMPL_LINK_NOARG(SwTextGridPage, GridModifyClickHdl, weld::Toggleable&, void)
500 {
501     GridModifyHdl();
502 }
503 
504 IMPL_LINK_NOARG(SwTextGridPage, ColorModifyHdl, ColorListBox&, void)
505 {
506     GridModifyHdl();
507 }
508 
509 void SwTextGridPage::GridModifyHdl()
510 {
511     const SfxItemSet& rOldSet = GetItemSet();
512     SfxItemSet aSet(rOldSet);
513     const SfxItemSet* pExSet = GetDialogExampleSet();
514     if(pExSet)
515         aSet.Put(*pExSet);
516     PutGridItem(aSet);
517     m_aExampleWN.UpdateExample(aSet);
518 }
519 
520 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
521