Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <hintids.hxx>
21 : #include <comphelper/string.hxx>
22 : #include <vcl/layout.hxx>
23 : #include <vcl/msgbox.hxx>
24 : #include <svl/stritem.hxx>
25 : #include <svl/intitem.hxx>
26 : #include <editeng/keepitem.hxx>
27 : #include <editeng/formatbreakitem.hxx>
28 : #include <editeng/ulspitem.hxx>
29 : #include <editeng/frmdiritem.hxx>
30 : #include <svl/ctloptions.hxx>
31 : #include <swmodule.hxx>
32 : #include <fmtornt.hxx>
33 : #include <fmtpdsc.hxx>
34 : #include <fmtlsplt.hxx>
35 :
36 : #include <svtools/htmlcfg.hxx>
37 : #include <fmtrowsplt.hxx>
38 : #include <sfx2/htmlmode.hxx>
39 :
40 : #include "access.hrc"
41 :
42 : #include <docsh.hxx>
43 : #include <wrtsh.hxx>
44 : #include <view.hxx>
45 : #include <viewopt.hxx>
46 : #include <uitool.hxx>
47 : #include <frmatr.hxx>
48 : #include <tabledlg.hxx>
49 : #include <../../uibase/table/tablepg.hxx>
50 : #include <tablemgr.hxx>
51 : #include <pagedesc.hxx>
52 : #include <uiitems.hxx>
53 : #include <poolfmt.hxx>
54 : #include <SwStyleNameMapper.hxx>
55 :
56 : #include <app.hrc>
57 : #include <cmdid.h>
58 : #include <table.hrc>
59 : #include <svx/svxids.hrc>
60 : #include <svx/dialogs.hrc>
61 : #include <svx/flagsdef.hxx>
62 : #include <svx/svxdlg.hxx>
63 :
64 : using namespace ::com::sun::star;
65 :
66 0 : SwFormatTablePage::SwFormatTablePage(vcl::Window* pParent, const SfxItemSet& rSet)
67 : : SfxTabPage(pParent, "FormatTablePage", "modules/swriter/ui/formattablepage.ui", &rSet)
68 : , m_aTextFilter(" .<>")
69 : , pTableData(0)
70 : , nSaveWidth(0)
71 : , nMinTableWidth(MINLAY)
72 : , bModified(false)
73 : , bFull(false)
74 0 : , bHtmlMode(false)
75 : {
76 0 : get(m_pNameED, "name");
77 0 : get(m_pWidthFT, "widthft");
78 0 : m_aWidthMF.set(get<MetricField>("widthmf"));
79 0 : m_aLeftMF.set(get<MetricField>("leftmf"));
80 0 : m_aRightMF.set(get<MetricField>("rightmf"));
81 0 : get(m_pRelWidthCB, "relwidth");
82 0 : get(m_pFullBtn, "full");
83 0 : get(m_pLeftBtn, "left");
84 0 : get(m_pFromLeftBtn, "fromleft");
85 0 : get(m_pRightBtn, "right");
86 0 : get(m_pCenterBtn, "center");
87 0 : get(m_pFreeBtn, "free");
88 0 : get(m_pLeftFT, "leftft");
89 0 : get(m_pRightFT, "rightft");
90 0 : get(m_pTopFT, "aboveft");
91 0 : get(m_pTopMF, "abovemf");
92 0 : get(m_pBottomFT, "belowft");
93 0 : get(m_pBottomMF, "belowmf");
94 0 : get(m_pTextDirectionLB, "textdirection");
95 :
96 0 : SetExchangeSupport();
97 :
98 : const SfxPoolItem* pItem;
99 0 : if(SfxItemState::SET == rSet.GetItemState(SID_HTML_MODE, false, &pItem))
100 0 : bHtmlMode = 0 != (static_cast<const SfxUInt16Item*>(pItem)->GetValue() & HTMLMODE_ON);
101 :
102 0 : bool bCTL = SW_MOD()->GetCTLOptions().IsCTLFontEnabled();
103 0 : get<VclContainer>("properties")->Show(!bHtmlMode && bCTL);
104 :
105 0 : Init();
106 0 : }
107 :
108 0 : SwFormatTablePage::~SwFormatTablePage()
109 : {
110 0 : disposeOnce();
111 0 : }
112 :
113 0 : void SwFormatTablePage::dispose()
114 : {
115 0 : m_pNameED.clear();
116 0 : m_pWidthFT.clear();
117 0 : m_pRelWidthCB.clear();
118 0 : m_pFullBtn.clear();
119 0 : m_pLeftBtn.clear();
120 0 : m_pFromLeftBtn.clear();
121 0 : m_pRightBtn.clear();
122 0 : m_pCenterBtn.clear();
123 0 : m_pFreeBtn.clear();
124 0 : m_pLeftFT.clear();
125 0 : m_pRightFT.clear();
126 0 : m_pTopFT.clear();
127 0 : m_pTopMF.clear();
128 0 : m_pBottomFT.clear();
129 0 : m_pBottomMF.clear();
130 0 : m_pTextDirectionLB.clear();
131 0 : SfxTabPage::dispose();
132 0 : }
133 :
134 0 : void SwFormatTablePage::Init()
135 : {
136 0 : m_aLeftMF.SetMetricFieldMin(-999999);
137 0 : m_aRightMF.SetMetricFieldMin(-999999);
138 :
139 : //handler
140 0 : Link<> aLk = LINK( this, SwFormatTablePage, AutoClickHdl );
141 0 : m_pFullBtn->SetClickHdl( aLk );
142 0 : m_pFreeBtn->SetClickHdl( aLk );
143 0 : m_pLeftBtn->SetClickHdl( aLk );
144 0 : m_pFromLeftBtn->SetClickHdl( aLk );
145 0 : m_pRightBtn->SetClickHdl( aLk );
146 0 : m_pCenterBtn->SetClickHdl( aLk );
147 :
148 0 : aLk = LINK( this, SwFormatTablePage, UpDownLoseFocusHdl );
149 0 : m_pTopMF->SetUpHdl( aLk );
150 0 : m_pBottomMF->SetUpHdl( aLk );
151 0 : m_aRightMF.SetUpHdl( aLk );
152 0 : m_aLeftMF.SetUpHdl( aLk );
153 0 : m_aWidthMF.SetUpHdl( aLk );
154 :
155 0 : m_pTopMF->SetDownHdl( aLk );
156 0 : m_pBottomMF->SetDownHdl( aLk );
157 0 : m_aRightMF.SetDownHdl( aLk );
158 0 : m_aLeftMF.SetDownHdl( aLk );
159 0 : m_aWidthMF.SetDownHdl( aLk );
160 :
161 0 : m_pTopMF->SetLoseFocusHdl( aLk );
162 0 : m_pBottomMF->SetLoseFocusHdl( aLk );
163 0 : m_aRightMF.SetLoseFocusHdl( aLk );
164 0 : m_aLeftMF.SetLoseFocusHdl( aLk );
165 0 : m_aWidthMF.SetLoseFocusHdl( aLk );
166 :
167 0 : m_pRelWidthCB->SetClickHdl(LINK( this, SwFormatTablePage, RelWidthClickHdl ));
168 0 : }
169 :
170 0 : IMPL_LINK( SwFormatTablePage, RelWidthClickHdl, CheckBox *, pBtn )
171 : {
172 : OSL_ENSURE(pTableData, "table data not available?");
173 0 : bool bIsChecked = pBtn->IsChecked();
174 0 : sal_Int64 nLeft = m_aLeftMF.DenormalizePercent(m_aLeftMF.GetValue(FUNIT_TWIP ));
175 0 : sal_Int64 nRight = m_aRightMF.DenormalizePercent(m_aRightMF.GetValue(FUNIT_TWIP ));
176 0 : m_aWidthMF.ShowPercent(bIsChecked);
177 0 : m_aLeftMF.ShowPercent(bIsChecked);
178 0 : m_aRightMF.ShowPercent(bIsChecked);
179 :
180 0 : if (bIsChecked)
181 : {
182 0 : m_aWidthMF.SetRefValue(pTableData->GetSpace());
183 0 : m_aLeftMF.SetRefValue(pTableData->GetSpace());
184 0 : m_aRightMF.SetRefValue(pTableData->GetSpace());
185 0 : m_aLeftMF.SetMetricFieldMin(0); //will be overwritten by the Percentfield
186 0 : m_aRightMF.SetMetricFieldMin(0); //dito
187 0 : m_aLeftMF.SetMetricFieldMax(99);
188 0 : m_aRightMF.SetMetricFieldMax(99);
189 0 : m_aLeftMF.SetPrcntValue(m_aLeftMF.NormalizePercent(nLeft ), FUNIT_TWIP );
190 0 : m_aRightMF.SetPrcntValue(m_aRightMF.NormalizePercent(nRight ), FUNIT_TWIP );
191 : }
192 : else
193 0 : ModifyHdl(m_aLeftMF.get()); //correct values again
194 :
195 0 : if(m_pFreeBtn->IsChecked())
196 : {
197 0 : bool bEnable = !pBtn->IsChecked();
198 0 : m_aRightMF.Enable(bEnable);
199 0 : m_pRightFT->Enable(bEnable);
200 : }
201 0 : bModified = true;
202 :
203 0 : return 0;
204 : }
205 :
206 0 : IMPL_LINK( SwFormatTablePage, AutoClickHdl, void *, pControl )
207 : {
208 0 : bool bRestore = true,
209 0 : bLeftEnable = false,
210 0 : bRightEnable= false,
211 0 : bWidthEnable= false,
212 0 : bOthers = true;
213 0 : if (pControl == m_pFullBtn)
214 : {
215 0 : m_aLeftMF.SetPrcntValue(0);
216 0 : m_aRightMF.SetPrcntValue(0);
217 0 : nSaveWidth = static_cast< SwTwips >(m_aWidthMF.DenormalizePercent(m_aWidthMF.GetValue(FUNIT_TWIP )));
218 0 : m_aWidthMF.SetPrcntValue(m_aWidthMF.NormalizePercent(pTableData->GetSpace() ), FUNIT_TWIP );
219 0 : bFull = true;
220 0 : bRestore = false;
221 : }
222 0 : else if (pControl == m_pLeftBtn)
223 : {
224 0 : bRightEnable = bWidthEnable = true;
225 0 : m_aLeftMF.SetPrcntValue(0);
226 : }
227 0 : else if (pControl == m_pFromLeftBtn)
228 : {
229 0 : bLeftEnable = bWidthEnable = true;
230 0 : m_aRightMF.SetPrcntValue(0);
231 : }
232 0 : else if (pControl == m_pRightBtn)
233 : {
234 0 : bLeftEnable = bWidthEnable = true;
235 0 : m_aRightMF.SetPrcntValue(0);
236 : }
237 0 : else if (pControl == m_pCenterBtn)
238 : {
239 0 : bLeftEnable = bWidthEnable = true;
240 : }
241 0 : else if (pControl == m_pFreeBtn)
242 : {
243 0 : RightModify();
244 0 : bLeftEnable = true;
245 0 : bWidthEnable = true;
246 0 : bOthers = false;
247 : }
248 0 : m_aLeftMF.Enable(bLeftEnable);
249 0 : m_pLeftFT->Enable(bLeftEnable);
250 0 : m_aWidthMF.Enable(bWidthEnable);
251 0 : m_pWidthFT->Enable(bWidthEnable);
252 0 : if ( bOthers )
253 : {
254 0 : m_aRightMF.Enable(bRightEnable);
255 0 : m_pRightFT->Enable(bRightEnable);
256 0 : m_pRelWidthCB->Enable(bWidthEnable);
257 : }
258 :
259 0 : if(bFull && bRestore)
260 : {
261 : //After being switched on automatic, the width was pinned
262 : //in order to restore the width while switching back to.
263 0 : bFull = false;
264 0 : m_aWidthMF.SetPrcntValue(m_aWidthMF.NormalizePercent(nSaveWidth ), FUNIT_TWIP );
265 : }
266 0 : ModifyHdl(m_aWidthMF.get());
267 0 : bModified = true;
268 0 : return 0;
269 : }
270 :
271 0 : void SwFormatTablePage::RightModify()
272 : {
273 0 : if(m_pFreeBtn->IsChecked())
274 : {
275 0 : bool bEnable = m_aRightMF.GetValue() == 0;
276 0 : m_pRelWidthCB->Enable(bEnable);
277 0 : if ( !bEnable )
278 : {
279 0 : m_pRelWidthCB->Check(false);
280 0 : RelWidthClickHdl(m_pRelWidthCB);
281 : }
282 0 : bEnable = m_pRelWidthCB->IsChecked();
283 0 : m_aRightMF.Enable(!bEnable);
284 0 : m_pRightFT->Enable(!bEnable);
285 : }
286 0 : }
287 :
288 0 : IMPL_LINK( SwFormatTablePage, UpDownLoseFocusHdl, MetricField *, pEdit )
289 : {
290 0 : if( m_aRightMF.get() == pEdit)
291 0 : RightModify();
292 0 : ModifyHdl( pEdit );
293 0 : return 0;
294 : }
295 :
296 0 : void SwFormatTablePage::ModifyHdl(const Edit * pEdit)
297 : {
298 :
299 0 : SwTwips nCurWidth = static_cast< SwTwips >(m_aWidthMF.DenormalizePercent(m_aWidthMF.GetValue( FUNIT_TWIP )));
300 0 : SwTwips nPrevWidth = nCurWidth;
301 0 : SwTwips nRight = static_cast< SwTwips >(m_aRightMF.DenormalizePercent(m_aRightMF.GetValue( FUNIT_TWIP )));
302 0 : SwTwips nLeft = static_cast< SwTwips >(m_aLeftMF.DenormalizePercent(m_aLeftMF.GetValue( FUNIT_TWIP )));
303 : SwTwips nDiff;
304 :
305 0 : if (pEdit == m_aWidthMF.get())
306 : {
307 0 : if( nCurWidth < MINLAY )
308 0 : nCurWidth = MINLAY;
309 0 : nDiff = nRight + nLeft + nCurWidth - pTableData->GetSpace() ;
310 : //right aligned: only change the left margin
311 0 : if(m_pRightBtn->IsChecked())
312 0 : nLeft -= nDiff;
313 : //left aligned: only change the right margin
314 0 : else if(m_pLeftBtn->IsChecked())
315 0 : nRight -= nDiff;
316 : //left margin and width allowed - first right - then left
317 0 : else if(m_pFromLeftBtn->IsChecked())
318 : {
319 0 : if( nRight >= nDiff )
320 0 : nRight -= nDiff;
321 : else
322 : {
323 0 : nDiff -= nRight;
324 0 : nRight = 0;
325 0 : if(nLeft >= nDiff)
326 0 : nLeft -= nDiff;
327 : else
328 : {
329 0 : nRight += nLeft - nDiff;
330 0 : nLeft = 0;
331 0 : nCurWidth = pTableData->GetSpace();
332 : }
333 :
334 : }
335 : }
336 : //centered: change both sides equally
337 0 : else if(m_pCenterBtn->IsChecked())
338 : {
339 0 : if((nLeft != nRight))
340 : {
341 0 : nDiff += nLeft + nRight;
342 0 : nLeft = nDiff/2;
343 0 : nRight = nDiff/2;
344 : }
345 : else
346 : {
347 0 : nLeft -= nDiff/2;
348 0 : nRight -= nDiff/2;
349 : }
350 : }
351 : //free alignment: decrease both margins
352 0 : else if(m_pFreeBtn->IsChecked())
353 : {
354 0 : nLeft -= nDiff/2;
355 0 : nRight -= nDiff/2;
356 : }
357 : }
358 0 : if (pEdit == m_aRightMF.get())
359 : {
360 :
361 0 : if( nRight + nLeft > pTableData->GetSpace() - MINLAY )
362 0 : nRight = pTableData->GetSpace() -nLeft - MINLAY;
363 :
364 0 : nCurWidth = pTableData->GetSpace() - nLeft - nRight;
365 : }
366 0 : if (pEdit == m_aLeftMF.get())
367 : {
368 0 : if(!m_pFromLeftBtn->IsChecked())
369 : {
370 0 : bool bCenter = m_pCenterBtn->IsChecked();
371 0 : if( bCenter )
372 0 : nRight = nLeft;
373 0 : if(nRight + nLeft > pTableData->GetSpace() - MINLAY )
374 : {
375 0 : nLeft = bCenter ? (pTableData->GetSpace() - MINLAY) /2 :
376 0 : (pTableData->GetSpace() - MINLAY) - nRight;
377 0 : nRight = bCenter ? (pTableData->GetSpace() - MINLAY) /2 : nRight;
378 : }
379 0 : nCurWidth = pTableData->GetSpace() - nLeft - nRight;
380 : }
381 : else
382 : {
383 : //Upon changes on the left side the right margin will be changed at first,
384 : //thereafter the width.
385 0 : nDiff = nRight + nLeft + nCurWidth - pTableData->GetSpace() ;
386 :
387 0 : nRight -= nDiff;
388 0 : nCurWidth = pTableData->GetSpace() - nLeft - nRight;
389 : }
390 : }
391 0 : if (nCurWidth != nPrevWidth )
392 0 : m_aWidthMF.SetPrcntValue( m_aWidthMF.NormalizePercent( nCurWidth ), FUNIT_TWIP );
393 0 : m_aRightMF.SetPrcntValue( m_aRightMF.NormalizePercent( nRight ), FUNIT_TWIP );
394 0 : m_aLeftMF.SetPrcntValue( m_aLeftMF.NormalizePercent( nLeft ), FUNIT_TWIP );
395 0 : bModified = true;
396 0 : }
397 :
398 0 : VclPtr<SfxTabPage> SwFormatTablePage::Create( vcl::Window* pParent,
399 : const SfxItemSet* rAttrSet)
400 : {
401 0 : return VclPtr<SwFormatTablePage>::Create( pParent, *rAttrSet );
402 : }
403 :
404 0 : bool SwFormatTablePage::FillItemSet( SfxItemSet* rCoreSet )
405 : {
406 : //Test if one of the controls still has the focus
407 0 : if (m_aWidthMF.HasFocus())
408 0 : ModifyHdl(m_aWidthMF.get());
409 0 : else if (m_aLeftMF.HasFocus())
410 0 : ModifyHdl(m_aLeftMF.get());
411 0 : else if(m_aRightMF.HasFocus())
412 0 : ModifyHdl(m_aRightMF.get());
413 0 : else if(m_pTopMF->HasFocus())
414 0 : ModifyHdl(m_pTopMF);
415 0 : else if(m_pBottomMF->HasFocus())
416 0 : ModifyHdl(m_pBottomMF);
417 :
418 0 : if(bModified)
419 : {
420 0 : if( m_pBottomMF->IsValueChangedFromSaved() ||
421 0 : m_pTopMF->IsValueChangedFromSaved() )
422 : {
423 0 : SvxULSpaceItem aULSpace(RES_UL_SPACE);
424 0 : aULSpace.SetUpper( m_pTopMF->Denormalize(m_pTopMF->GetValue( FUNIT_TWIP )));
425 0 : aULSpace.SetLower( m_pBottomMF->Denormalize(m_pBottomMF->GetValue( FUNIT_TWIP )));
426 0 : rCoreSet->Put(aULSpace);
427 : }
428 :
429 : }
430 0 : if(m_pNameED->IsValueChangedFromSaved())
431 : {
432 0 : rCoreSet->Put(SfxStringItem( FN_PARAM_TABLE_NAME, m_pNameED->GetText()));
433 0 : bModified = true;
434 : }
435 :
436 0 : if( m_pTextDirectionLB->IsVisible() )
437 : {
438 0 : const sal_Int32 nPos = m_pTextDirectionLB->GetSelectEntryPos();
439 0 : if ( m_pTextDirectionLB->IsValueChangedFromSaved() )
440 : {
441 : const sal_uInt32 nDirection =
442 0 : (sal_uInt32)reinterpret_cast<sal_uIntPtr>(m_pTextDirectionLB->GetEntryData( nPos ));
443 0 : rCoreSet->Put( SvxFrameDirectionItem( (SvxFrameDirection)nDirection, RES_FRAMEDIR));
444 0 : bModified = true;
445 : }
446 : }
447 :
448 0 : return bModified;
449 : }
450 :
451 0 : void SwFormatTablePage::Reset( const SfxItemSet* )
452 : {
453 0 : const SfxItemSet& rSet = GetItemSet();
454 : const SfxPoolItem* pItem;
455 :
456 0 : if(bHtmlMode)
457 : {
458 0 : m_pNameED->Disable();
459 0 : m_pTopFT->Hide();
460 0 : m_pTopMF->Hide();
461 0 : m_pBottomFT->Hide();
462 0 : m_pBottomMF->Hide();
463 0 : m_pFreeBtn->Enable(false);
464 : }
465 0 : FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
466 0 : m_aWidthMF.SetMetric(aMetric);
467 0 : m_aRightMF.SetMetric(aMetric);
468 0 : m_aLeftMF.SetMetric(aMetric);
469 0 : SetMetric(*m_pTopMF, aMetric);
470 0 : SetMetric(*m_pBottomMF, aMetric);
471 :
472 : //Name
473 0 : if(SfxItemState::SET == rSet.GetItemState( FN_PARAM_TABLE_NAME, false, &pItem ))
474 : {
475 0 : m_pNameED->SetText(static_cast<const SfxStringItem*>(pItem)->GetValue());
476 0 : m_pNameED->SaveValue();
477 : }
478 :
479 0 : if(SfxItemState::SET == rSet.GetItemState( FN_TABLE_REP, false, &pItem ))
480 : {
481 0 : pTableData = static_cast<SwTableRep*>(static_cast<const SwPtrItem*>( pItem)->GetValue());
482 0 : nMinTableWidth = pTableData->GetColCount() * MINLAY;
483 :
484 0 : if(pTableData->GetWidthPercent())
485 : {
486 0 : m_pRelWidthCB->Check(true);
487 0 : RelWidthClickHdl(m_pRelWidthCB);
488 0 : m_aWidthMF.SetPrcntValue(pTableData->GetWidthPercent(), FUNIT_CUSTOM);
489 :
490 0 : m_aWidthMF.SaveValue();
491 0 : nSaveWidth = static_cast< SwTwips >(m_aWidthMF.GetValue(FUNIT_CUSTOM));
492 : }
493 : else
494 : {
495 : m_aWidthMF.SetPrcntValue(m_aWidthMF.NormalizePercent(
496 0 : pTableData->GetWidth()), FUNIT_TWIP);
497 0 : m_aWidthMF.SaveValue();
498 0 : nSaveWidth = pTableData->GetWidth();
499 0 : nMinTableWidth = std::min( nSaveWidth, nMinTableWidth );
500 : }
501 :
502 0 : m_aWidthMF.SetRefValue(pTableData->GetSpace());
503 0 : m_aWidthMF.SetLast(m_aWidthMF.NormalizePercent( pTableData->GetSpace() ));
504 0 : m_aLeftMF.SetLast(m_aLeftMF.NormalizePercent( pTableData->GetSpace() ));
505 0 : m_aRightMF.SetLast(m_aRightMF.NormalizePercent( pTableData->GetSpace() ));
506 :
507 : m_aLeftMF.SetPrcntValue(m_aLeftMF.NormalizePercent(
508 0 : pTableData->GetLeftSpace()), FUNIT_TWIP);
509 : m_aRightMF.SetPrcntValue(m_aRightMF.NormalizePercent(
510 0 : pTableData->GetRightSpace()), FUNIT_TWIP);
511 0 : m_aLeftMF.SaveValue();
512 0 : m_aRightMF.SaveValue();
513 :
514 0 : bool bSetRight = false, bSetLeft = false;
515 0 : switch( pTableData->GetAlign() )
516 : {
517 : case text::HoriOrientation::NONE:
518 0 : m_pFreeBtn->Check();
519 0 : if(m_pRelWidthCB->IsChecked())
520 0 : bSetRight = true;
521 0 : break;
522 : case text::HoriOrientation::FULL:
523 : {
524 0 : bSetRight = bSetLeft = true;
525 0 : m_pFullBtn->Check();
526 0 : m_aWidthMF.Enable(false);
527 0 : m_pRelWidthCB->Enable(false);
528 0 : m_pWidthFT->Enable(false);
529 : }
530 0 : break;
531 : case text::HoriOrientation::LEFT:
532 : {
533 0 : bSetLeft = true;
534 0 : m_pLeftBtn->Check();
535 : }
536 0 : break;
537 : case text::HoriOrientation::LEFT_AND_WIDTH :
538 : {
539 0 : bSetRight = true;
540 0 : m_pFromLeftBtn->Check();
541 : }
542 0 : break;
543 : case text::HoriOrientation::RIGHT:
544 : {
545 0 : bSetRight = true;
546 0 : m_pRightBtn->Check();
547 : }
548 0 : break;
549 : case text::HoriOrientation::CENTER:
550 : {
551 0 : bSetRight = true;
552 0 : m_pCenterBtn->Check();
553 : }
554 0 : break;
555 : }
556 0 : if ( bSetRight )
557 : {
558 0 : m_aRightMF.Enable(false);
559 0 : m_pRightFT->Enable(false);
560 : }
561 0 : if ( bSetLeft )
562 : {
563 0 : m_aLeftMF.Enable(false);
564 0 : m_pLeftFT->Enable(false);
565 : }
566 :
567 : }
568 :
569 : //Margins
570 0 : if(SfxItemState::SET == rSet.GetItemState( RES_UL_SPACE, false,&pItem ))
571 : {
572 0 : m_pTopMF->SetValue(m_pTopMF->Normalize(
573 0 : static_cast<const SvxULSpaceItem*>(pItem)->GetUpper()), FUNIT_TWIP);
574 0 : m_pBottomMF->SetValue(m_pBottomMF->Normalize(
575 0 : static_cast<const SvxULSpaceItem*>(pItem)->GetLower()), FUNIT_TWIP);
576 0 : m_pTopMF->SaveValue();
577 0 : m_pBottomMF->SaveValue();
578 : }
579 :
580 : //Text direction
581 0 : if( SfxItemState::SET == rSet.GetItemState( RES_FRAMEDIR, true, &pItem ) )
582 : {
583 0 : sal_uIntPtr nVal = static_cast<const SvxFrameDirectionItem*>(pItem)->GetValue();
584 0 : const sal_Int32 nPos = m_pTextDirectionLB->GetEntryPos( reinterpret_cast<void*>(nVal) );
585 0 : m_pTextDirectionLB->SelectEntryPos( nPos );
586 0 : m_pTextDirectionLB->SaveValue();
587 : }
588 :
589 0 : m_aWidthMF.SetMax( 2*m_aWidthMF.NormalizePercent( pTableData->GetSpace() ), FUNIT_TWIP );
590 0 : m_aRightMF.SetMax( m_aRightMF.NormalizePercent( pTableData->GetSpace() ), FUNIT_TWIP );
591 0 : m_aLeftMF.SetMax( m_aLeftMF.NormalizePercent( pTableData->GetSpace() ), FUNIT_TWIP );
592 0 : m_aWidthMF.SetMin( m_aWidthMF.NormalizePercent( nMinTableWidth ), FUNIT_TWIP );
593 :
594 0 : }
595 :
596 0 : void SwFormatTablePage::ActivatePage( const SfxItemSet& rSet )
597 : {
598 : OSL_ENSURE(pTableData, "table data not available?");
599 0 : if(SfxItemState::SET == rSet.GetItemState( FN_TABLE_REP ))
600 : {
601 0 : SwTwips nCurWidth = text::HoriOrientation::FULL != pTableData->GetAlign() ?
602 0 : pTableData->GetWidth() :
603 0 : pTableData->GetSpace();
604 0 : if(pTableData->GetWidthPercent() == 0 &&
605 0 : nCurWidth != m_aWidthMF.DenormalizePercent(m_aWidthMF.GetValue(FUNIT_TWIP )))
606 : {
607 : m_aWidthMF.SetPrcntValue(m_aWidthMF.NormalizePercent(
608 0 : nCurWidth), FUNIT_TWIP);
609 0 : m_aWidthMF.SaveValue();
610 0 : nSaveWidth = nCurWidth;
611 : m_aLeftMF.SetPrcntValue(m_aLeftMF.NormalizePercent(
612 0 : pTableData->GetLeftSpace()), FUNIT_TWIP);
613 0 : m_aLeftMF.SaveValue();
614 : m_aRightMF.SetPrcntValue(m_aRightMF.NormalizePercent(
615 0 : pTableData->GetRightSpace()), FUNIT_TWIP);
616 0 : m_aRightMF.SaveValue();
617 : }
618 : }
619 :
620 0 : }
621 :
622 0 : SfxTabPage::sfxpg SwFormatTablePage::DeactivatePage( SfxItemSet* _pSet )
623 : {
624 : //os: VCL doesn't take care of making the active widget
625 : //in the dialog lose the focus
626 0 : m_pNameED->GrabFocus();
627 : //test the table name for spaces
628 0 : OUString sTableName = m_pNameED->GetText();
629 0 : if(sTableName.indexOf(' ') != -1)
630 : {
631 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, SW_RES(STR_WRONG_TABLENAME), VCL_MESSAGE_INFO)->Execute();
632 0 : m_pNameED->GrabFocus();
633 0 : return KEEP_PAGE;
634 : }
635 0 : if(_pSet)
636 : {
637 0 : FillItemSet(_pSet);
638 0 : if(bModified)
639 : {
640 0 : SwTwips lLeft = static_cast< SwTwips >(m_aLeftMF.DenormalizePercent(m_aLeftMF.GetValue( FUNIT_TWIP )));
641 0 : SwTwips lRight = static_cast< SwTwips >(m_aRightMF.DenormalizePercent(m_aRightMF.GetValue( FUNIT_TWIP )));
642 :
643 0 : if( m_aLeftMF.GetText() != m_aLeftMF.GetSavedValue() ||
644 0 : m_aRightMF.GetText() != m_aRightMF.GetSavedValue() )
645 : {
646 0 : pTableData->SetWidthChanged();
647 0 : pTableData->SetLeftSpace( lLeft);
648 0 : pTableData->SetRightSpace( lRight);
649 : }
650 :
651 : SwTwips lWidth;
652 0 : if (m_pRelWidthCB->IsChecked() && m_pRelWidthCB->IsEnabled())
653 : {
654 0 : lWidth = pTableData->GetSpace() - lRight - lLeft;
655 0 : const sal_uInt16 nPercentWidth = m_aWidthMF.GetValue(FUNIT_CUSTOM);
656 0 : if(pTableData->GetWidthPercent() != nPercentWidth)
657 : {
658 0 : pTableData->SetWidthPercent(nPercentWidth);
659 0 : pTableData->SetWidthChanged();
660 : }
661 : }
662 : else
663 : {
664 0 : pTableData->SetWidthPercent(0);
665 0 : lWidth = static_cast< SwTwips >(m_aWidthMF.DenormalizePercent(m_aWidthMF.GetValue( FUNIT_TWIP )));
666 : }
667 0 : pTableData->SetWidth(lWidth);
668 :
669 0 : SwTwips nColSum = 0;
670 :
671 0 : for( sal_uInt16 i = 0; i < pTableData->GetColCount(); i++)
672 : {
673 0 : nColSum += pTableData->GetColumns()[i].nWidth;
674 : }
675 0 : if(nColSum != pTableData->GetWidth())
676 : {
677 : SwTwips nMinWidth = std::min( (long)MINLAY,
678 0 : (long) (pTableData->GetWidth() /
679 0 : pTableData->GetColCount() - 1));
680 0 : SwTwips nDiff = nColSum - pTableData->GetWidth();
681 0 : while ( std::abs(nDiff) > pTableData->GetColCount() + 1 )
682 : {
683 0 : SwTwips nSub = nDiff / pTableData->GetColCount();
684 0 : for( sal_uInt16 i = 0; i < pTableData->GetColCount(); i++)
685 : {
686 0 : if(pTableData->GetColumns()[i].nWidth - nMinWidth > nSub)
687 : {
688 0 : pTableData->GetColumns()[i].nWidth -= nSub;
689 0 : nDiff -= nSub;
690 : }
691 : else
692 : {
693 0 : nDiff -= pTableData->GetColumns()[i].nWidth - nMinWidth;
694 0 : pTableData->GetColumns()[i].nWidth = nMinWidth;
695 : }
696 :
697 : }
698 : }
699 : }
700 :
701 0 : sal_Int16 nAlign = 0;
702 0 : if(m_pRightBtn->IsChecked())
703 0 : nAlign = text::HoriOrientation::RIGHT;
704 0 : else if(m_pLeftBtn->IsChecked())
705 0 : nAlign = text::HoriOrientation::LEFT;
706 0 : else if(m_pFromLeftBtn->IsChecked())
707 0 : nAlign = text::HoriOrientation::LEFT_AND_WIDTH;
708 0 : else if(m_pCenterBtn->IsChecked())
709 0 : nAlign = text::HoriOrientation::CENTER;
710 0 : else if(m_pFreeBtn->IsChecked())
711 0 : nAlign = text::HoriOrientation::NONE;
712 0 : else if(m_pFullBtn->IsChecked())
713 : {
714 0 : nAlign = text::HoriOrientation::FULL;
715 0 : lWidth = lAutoWidth;
716 : }
717 0 : if(nAlign != pTableData->GetAlign())
718 : {
719 0 : pTableData->SetWidthChanged();
720 0 : pTableData->SetAlign(nAlign);
721 : }
722 :
723 0 : if(pTableData->GetWidth() != lWidth )
724 : {
725 0 : pTableData->SetWidthChanged();
726 : pTableData->SetWidth(
727 0 : nAlign == text::HoriOrientation::FULL ? pTableData->GetSpace() : lWidth );
728 : }
729 0 : if(pTableData->HasWidthChanged())
730 0 : _pSet->Put(SwPtrItem(FN_TABLE_REP, pTableData));
731 : }
732 : }
733 0 : return LEAVE_PAGE;
734 : }
735 :
736 : //Description: Page column configuration
737 0 : SwTableColumnPage::SwTableColumnPage(vcl::Window* pParent, const SfxItemSet& rSet)
738 : : SfxTabPage(pParent, "TableColumnPage",
739 : "modules/swriter/ui/tablecolumnpage.ui", &rSet)
740 : , pTableData(0)
741 : , nTableWidth(0)
742 : , nMinWidth(MINLAY)
743 : , nNoOfCols(0)
744 : , nNoOfVisibleCols(0)
745 : , bModified(false)
746 : , bModifyTable(false)
747 0 : , bPercentMode(false)
748 : {
749 0 : get(m_pModifyTableCB, "adaptwidth");
750 0 : get(m_pProportionalCB, "adaptcolumns");
751 0 : get(m_pSpaceFT, "spaceft");
752 0 : get(m_pSpaceED, "space-nospin");
753 0 : get(m_pUpBtn, "next");
754 0 : get(m_pDownBtn, "back");
755 :
756 0 : m_aFieldArr[0].set(get<MetricField>("width1"));
757 0 : m_aFieldArr[1].set(get<MetricField>("width2"));
758 0 : m_aFieldArr[2].set(get<MetricField>("width3"));
759 0 : m_aFieldArr[3].set(get<MetricField>("width4"));
760 0 : m_aFieldArr[4].set(get<MetricField>("width5"));
761 0 : m_aFieldArr[5].set(get<MetricField>("width6"));
762 :
763 0 : m_pTextArr[0] = get<FixedText>("1");
764 0 : m_pTextArr[1] = get<FixedText>("2");
765 0 : m_pTextArr[2] = get<FixedText>("3");
766 0 : m_pTextArr[3] = get<FixedText>("4");
767 0 : m_pTextArr[4] = get<FixedText>("5");
768 0 : m_pTextArr[5] = get<FixedText>("6");
769 :
770 0 : SetExchangeSupport();
771 :
772 : const SfxPoolItem* pItem;
773 0 : Init((SfxItemState::SET == rSet.GetItemState( SID_HTML_MODE, false,&pItem )
774 0 : && static_cast<const SfxUInt16Item*>(pItem)->GetValue() & HTMLMODE_ON));
775 0 : }
776 :
777 0 : SwTableColumnPage::~SwTableColumnPage()
778 : {
779 0 : disposeOnce();
780 0 : }
781 :
782 0 : void SwTableColumnPage::dispose()
783 : {
784 0 : m_pModifyTableCB.clear();
785 0 : m_pProportionalCB.clear();
786 0 : m_pSpaceFT.clear();
787 0 : m_pSpaceED.clear();
788 0 : m_pUpBtn.clear();
789 0 : m_pDownBtn.clear();
790 0 : for (auto p : m_pTextArr)
791 0 : p.clear();
792 0 : SfxTabPage::dispose();
793 0 : }
794 :
795 0 : VclPtr<SfxTabPage> SwTableColumnPage::Create( vcl::Window* pParent,
796 : const SfxItemSet* rAttrSet)
797 : {
798 0 : return VclPtr<SwTableColumnPage>::Create( pParent, *rAttrSet );
799 : }
800 :
801 0 : void SwTableColumnPage::Reset( const SfxItemSet* )
802 : {
803 0 : const SfxItemSet& rSet = GetItemSet();
804 :
805 : const SfxPoolItem* pItem;
806 0 : if(SfxItemState::SET == rSet.GetItemState( FN_TABLE_REP, false, &pItem ))
807 : {
808 0 : pTableData = static_cast<SwTableRep*>(static_cast<const SwPtrItem*>( pItem)->GetValue());
809 0 : nNoOfVisibleCols = pTableData->GetColCount();
810 0 : nNoOfCols = pTableData->GetAllColCount();
811 0 : nTableWidth = pTableData->GetAlign() != text::HoriOrientation::FULL &&
812 0 : pTableData->GetAlign() != text::HoriOrientation::LEFT_AND_WIDTH?
813 0 : pTableData->GetWidth() : pTableData->GetSpace();
814 :
815 0 : for( sal_uInt16 i = 0; i < nNoOfCols; i++ )
816 : {
817 0 : if( pTableData->GetColumns()[i].nWidth < nMinWidth )
818 0 : nMinWidth = pTableData->GetColumns()[i].nWidth;
819 : }
820 0 : sal_Int64 nMinTwips = m_aFieldArr[0].NormalizePercent( nMinWidth );
821 0 : sal_Int64 nMaxTwips = m_aFieldArr[0].NormalizePercent( nTableWidth );
822 0 : for( sal_uInt16 i = 0; (i < MET_FIELDS) && (i < nNoOfVisibleCols); i++ )
823 : {
824 0 : m_aFieldArr[i].SetPrcntValue( m_aFieldArr[i].NormalizePercent(
825 0 : GetVisibleWidth(i) ), FUNIT_TWIP );
826 0 : m_aFieldArr[i].SetMin( nMinTwips , FUNIT_TWIP );
827 0 : m_aFieldArr[i].SetMax( nMaxTwips , FUNIT_TWIP );
828 0 : m_aFieldArr[i].Enable();
829 0 : m_pTextArr[i]->Enable();
830 : }
831 :
832 0 : if( nNoOfVisibleCols > MET_FIELDS )
833 0 : m_pUpBtn->Enable();
834 :
835 0 : for( sal_uInt16 i = nNoOfVisibleCols; i < MET_FIELDS; ++i )
836 : {
837 0 : m_aFieldArr[i].SetText( OUString() );
838 0 : m_pTextArr[i]->Disable();
839 : }
840 : }
841 0 : ActivatePage(rSet);
842 :
843 0 : }
844 :
845 0 : void SwTableColumnPage::Init(bool bWeb)
846 : {
847 0 : FieldUnit aMetric = ::GetDfltMetric(bWeb);
848 0 : Link<> aLkUp = LINK( this, SwTableColumnPage, UpHdl );
849 0 : Link<> aLkDown = LINK( this, SwTableColumnPage, DownHdl );
850 0 : Link<> aLkLF = LINK( this, SwTableColumnPage, LoseFocusHdl );
851 0 : for( sal_uInt16 i = 0; i < MET_FIELDS; i++ )
852 : {
853 0 : aValueTable[i] = i;
854 0 : m_aFieldArr[i].SetMetric(aMetric);
855 0 : m_aFieldArr[i].SetUpHdl( aLkUp );
856 0 : m_aFieldArr[i].SetDownHdl( aLkDown );
857 0 : m_aFieldArr[i].SetLoseFocusHdl( aLkLF );
858 : }
859 0 : SetMetric(*m_pSpaceED, aMetric);
860 :
861 0 : Link<> aLk = LINK( this, SwTableColumnPage, AutoClickHdl );
862 0 : m_pUpBtn->SetClickHdl( aLk );
863 0 : m_pDownBtn->SetClickHdl( aLk );
864 :
865 0 : aLk = LINK( this, SwTableColumnPage, ModeHdl );
866 0 : m_pModifyTableCB->SetClickHdl( aLk );
867 0 : m_pProportionalCB->SetClickHdl( aLk );
868 0 : }
869 :
870 0 : IMPL_LINK( SwTableColumnPage, AutoClickHdl, void *, pControl )
871 : {
872 : //move display window
873 0 : if(pControl == m_pDownBtn.get())
874 : {
875 0 : if(aValueTable[0] > 0)
876 : {
877 0 : for( sal_uInt16 i=0; i < MET_FIELDS; i++ )
878 0 : aValueTable[i] -= 1;
879 : }
880 : }
881 0 : if (pControl == m_pUpBtn.get())
882 : {
883 0 : if( aValueTable[ MET_FIELDS -1 ] < nNoOfVisibleCols -1 )
884 : {
885 0 : for(sal_uInt16 i=0;i < MET_FIELDS;i++)
886 0 : aValueTable[i] += 1;
887 : }
888 : }
889 0 : for( sal_uInt16 i = 0; (i < nNoOfVisibleCols ) && ( i < MET_FIELDS); i++ )
890 : {
891 0 : OUString sEntry('~');
892 0 : OUString sIndex = OUString::number( aValueTable[i] + 1 );
893 0 : sEntry += sIndex;
894 0 : m_pTextArr[i]->SetText( sEntry );
895 :
896 : //added by menghu for SODC_5143,12/12/2006
897 0 : OUString sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH);
898 0 : sColumnWidth = sColumnWidth.replaceFirst( "%1", sIndex );
899 0 : m_aFieldArr[i].SetAccessibleName( sColumnWidth );
900 0 : }
901 :
902 0 : m_pDownBtn->Enable(aValueTable[0] > 0);
903 0 : m_pUpBtn->Enable(aValueTable[ MET_FIELDS -1 ] < nNoOfVisibleCols -1 );
904 0 : UpdateCols(0);
905 0 : return 0;
906 : }
907 :
908 0 : IMPL_LINK( SwTableColumnPage, UpHdl, MetricField*, pEdit )
909 : {
910 0 : bModified = true;
911 0 : ModifyHdl( pEdit );
912 0 : return 0;
913 : }
914 :
915 0 : IMPL_LINK( SwTableColumnPage, DownHdl, MetricField*, pEdit )
916 : {
917 0 : bModified = true;
918 0 : ModifyHdl( pEdit );
919 0 : return 0;
920 : }
921 :
922 0 : IMPL_LINK( SwTableColumnPage, LoseFocusHdl, MetricField*, pEdit )
923 : {
924 0 : if (pEdit->IsModified())
925 : {
926 0 : bModified = true;
927 0 : ModifyHdl( pEdit );
928 : }
929 0 : return 0;
930 : }
931 :
932 0 : IMPL_LINK( SwTableColumnPage, ModeHdl, CheckBox*, pBox )
933 : {
934 0 : bool bCheck = pBox->IsChecked();
935 0 : if (pBox == m_pProportionalCB)
936 : {
937 0 : if(bCheck)
938 0 : m_pModifyTableCB->Check();
939 0 : m_pModifyTableCB->Enable(!bCheck && bModifyTable);
940 : }
941 0 : return 0;
942 : }
943 :
944 0 : bool SwTableColumnPage::FillItemSet( SfxItemSet* )
945 : {
946 0 : for( sal_uInt16 i = 0; i < MET_FIELDS; i++ )
947 : {
948 0 : if (m_aFieldArr[i].HasFocus())
949 : {
950 0 : LoseFocusHdl(m_aFieldArr[i].get());
951 0 : break;
952 : }
953 : }
954 :
955 0 : if(bModified)
956 : {
957 0 : pTableData->SetColsChanged();
958 : }
959 0 : return bModified;
960 : }
961 :
962 0 : void SwTableColumnPage::ModifyHdl( MetricField* pField )
963 : {
964 0 : PercentField *pEdit = NULL;
965 : sal_uInt16 i;
966 :
967 0 : for( i = 0; i < MET_FIELDS; i++)
968 : {
969 0 : if (pField == m_aFieldArr[i].get())
970 : {
971 0 : pEdit = &m_aFieldArr[i];
972 0 : break;
973 : }
974 : }
975 :
976 0 : if (MET_FIELDS <= i || !pEdit)
977 : {
978 : OSL_ENSURE(false, "cannot happen.");
979 0 : return;
980 : }
981 :
982 0 : SetVisibleWidth(aValueTable[i], static_cast< SwTwips >(pEdit->DenormalizePercent(pEdit->GetValue( FUNIT_TWIP ))) );
983 :
984 0 : UpdateCols( aValueTable[i] );
985 : }
986 :
987 0 : void SwTableColumnPage::UpdateCols( sal_uInt16 nAktPos )
988 : {
989 0 : SwTwips nSum = 0;
990 :
991 0 : for( sal_uInt16 i = 0; i < nNoOfCols; i++ )
992 : {
993 0 : nSum += (pTableData->GetColumns())[i].nWidth;
994 : }
995 0 : SwTwips nDiff = nSum - nTableWidth;
996 :
997 0 : bool bModifyTableChecked = m_pModifyTableCB->IsChecked();
998 0 : bool bProp = m_pProportionalCB->IsChecked();
999 :
1000 0 : if (!bModifyTableChecked && !bProp)
1001 : {
1002 : //The table width is constant, the difference is balanced with the other columns
1003 0 : sal_uInt16 nLoopCount = 0;
1004 0 : while( nDiff )
1005 : {
1006 0 : if( ++nAktPos == nNoOfVisibleCols)
1007 : {
1008 0 : nAktPos = 0;
1009 0 : ++nLoopCount;
1010 : //#i101353# in small tables it might not be possible to balance column width
1011 0 : if( nLoopCount > 1 )
1012 0 : break;
1013 : }
1014 0 : if( nDiff < 0 )
1015 : {
1016 0 : SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
1017 0 : nDiff = 0;
1018 : }
1019 0 : else if( GetVisibleWidth(nAktPos) >= nDiff + nMinWidth )
1020 : {
1021 0 : SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
1022 0 : nDiff = 0;
1023 : }
1024 0 : if( nDiff > 0 && GetVisibleWidth(nAktPos) > nMinWidth )
1025 : {
1026 0 : if( nDiff >= (GetVisibleWidth(nAktPos) - nMinWidth) )
1027 : {
1028 0 : nDiff -= (GetVisibleWidth(nAktPos) - nMinWidth);
1029 0 : SetVisibleWidth(nAktPos, nMinWidth);
1030 : }
1031 : else
1032 : {
1033 0 : nDiff = 0;
1034 0 : SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
1035 : }
1036 : OSL_ENSURE(nDiff >= 0, "nDiff < 0 cannot be here!");
1037 : }
1038 0 : }
1039 : }
1040 0 : else if (bModifyTableChecked && !bProp)
1041 : {
1042 : //Difference is balanced by the width of the table,
1043 : //other columns remain unchanged.
1044 : OSL_ENSURE(nDiff <= pTableData->GetSpace() - nTableWidth, "wrong maximum" );
1045 0 : SwTwips nActSpace = pTableData->GetSpace() - nTableWidth;
1046 0 : if(nDiff > nActSpace)
1047 : {
1048 0 : nTableWidth = pTableData->GetSpace();
1049 0 : SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) - nDiff + nActSpace );
1050 : }
1051 : else
1052 : {
1053 0 : nTableWidth += nDiff;
1054 0 : }
1055 : }
1056 0 : else if (bModifyTableChecked && bProp)
1057 : {
1058 : //All columns will be changed proportionally with,
1059 : //the table width is adjusted accordingly.
1060 : OSL_ENSURE(nDiff * nNoOfVisibleCols <= pTableData->GetSpace() - nTableWidth, "wrong maximum" );
1061 0 : long nAdd = nDiff;
1062 0 : if(nDiff * nNoOfVisibleCols > pTableData->GetSpace() - nTableWidth)
1063 : {
1064 0 : nAdd = (pTableData->GetSpace() - nTableWidth) / nNoOfVisibleCols;
1065 0 : SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) - nDiff + nAdd );
1066 0 : nDiff = nAdd;
1067 : }
1068 0 : if(nAdd)
1069 0 : for( sal_uInt16 i = 0; i < nNoOfVisibleCols; i++ )
1070 : {
1071 0 : if(i == nAktPos)
1072 0 : continue;
1073 : SwTwips nVisWidth;
1074 0 : if((nVisWidth = GetVisibleWidth(i)) + nDiff < MINLAY)
1075 : {
1076 0 : nAdd += nVisWidth - MINLAY;
1077 0 : SetVisibleWidth(i, MINLAY);
1078 : }
1079 : else
1080 : {
1081 0 : SetVisibleWidth(i, nVisWidth + nDiff);
1082 0 : nAdd += nDiff;
1083 : }
1084 :
1085 : }
1086 0 : nTableWidth += nAdd;
1087 : }
1088 :
1089 0 : if(!bPercentMode)
1090 0 : m_pSpaceED->SetValue(m_pSpaceED->Normalize( pTableData->GetSpace() - nTableWidth) , FUNIT_TWIP);
1091 :
1092 0 : for( sal_uInt16 i = 0; ( i < nNoOfVisibleCols ) && ( i < MET_FIELDS ); i++)
1093 : {
1094 0 : m_aFieldArr[i].SetPrcntValue(m_aFieldArr[i].NormalizePercent(
1095 0 : GetVisibleWidth(aValueTable[i]) ), FUNIT_TWIP);
1096 0 : m_aFieldArr[i].ClearModifyFlag();
1097 : }
1098 0 : }
1099 :
1100 0 : void SwTableColumnPage::ActivatePage( const SfxItemSet& )
1101 : {
1102 0 : bPercentMode = pTableData->GetWidthPercent() != 0;
1103 0 : for( sal_uInt16 i = 0; (i < MET_FIELDS) && (i < nNoOfVisibleCols); i++ )
1104 : {
1105 0 : m_aFieldArr[i].SetRefValue(pTableData->GetWidth());
1106 0 : m_aFieldArr[i].ShowPercent( bPercentMode );
1107 : }
1108 :
1109 0 : const sal_uInt16 nTableAlign = pTableData->GetAlign();
1110 0 : if((text::HoriOrientation::FULL != nTableAlign && nTableWidth != pTableData->GetWidth()) ||
1111 0 : (text::HoriOrientation::FULL == nTableAlign && nTableWidth != pTableData->GetSpace()))
1112 : {
1113 : nTableWidth = text::HoriOrientation::FULL == nTableAlign ?
1114 0 : pTableData->GetSpace() :
1115 0 : pTableData->GetWidth();
1116 0 : UpdateCols(0);
1117 : }
1118 0 : bModifyTable = true;
1119 0 : if(pTableData->GetWidthPercent() ||
1120 0 : text::HoriOrientation::FULL == nTableAlign ||
1121 0 : pTableData->IsLineSelected() )
1122 0 : bModifyTable = false;
1123 0 : if(bPercentMode)
1124 : {
1125 0 : m_pModifyTableCB->Check(false);
1126 0 : m_pProportionalCB->Check(false);
1127 : }
1128 0 : else if( !bModifyTable )
1129 : {
1130 0 : m_pProportionalCB->Check(false);
1131 0 : m_pModifyTableCB->Check(false);
1132 : }
1133 0 : m_pSpaceFT->Enable(!bPercentMode);
1134 0 : m_pSpaceED->Enable(!bPercentMode);
1135 0 : m_pModifyTableCB->Enable( !bPercentMode && bModifyTable );
1136 0 : m_pProportionalCB->Enable(!bPercentMode && bModifyTable );
1137 :
1138 0 : m_pSpaceED->SetValue(m_pSpaceED->Normalize(
1139 0 : pTableData->GetSpace() - nTableWidth) , FUNIT_TWIP);
1140 :
1141 0 : }
1142 :
1143 0 : SfxTabPage::sfxpg SwTableColumnPage::DeactivatePage( SfxItemSet* _pSet )
1144 : {
1145 0 : if(_pSet)
1146 : {
1147 0 : FillItemSet(_pSet);
1148 0 : if(text::HoriOrientation::FULL != pTableData->GetAlign() && pTableData->GetWidth() != nTableWidth)
1149 : {
1150 0 : pTableData->SetWidth(nTableWidth);
1151 0 : SwTwips nDiff = pTableData->GetSpace() - pTableData->GetWidth() -
1152 0 : pTableData->GetLeftSpace() - pTableData->GetRightSpace();
1153 0 : switch( pTableData->GetAlign() )
1154 : {
1155 : case text::HoriOrientation::RIGHT:
1156 0 : pTableData->SetLeftSpace(pTableData->GetLeftSpace() + nDiff);
1157 0 : break;
1158 : case text::HoriOrientation::LEFT:
1159 0 : pTableData->SetRightSpace(pTableData->GetRightSpace() + nDiff);
1160 0 : break;
1161 : case text::HoriOrientation::NONE:
1162 : {
1163 0 : SwTwips nDiff2 = nDiff/2;
1164 0 : if( nDiff > 0 ||
1165 0 : (-nDiff2 < pTableData->GetRightSpace() && - nDiff2 < pTableData->GetLeftSpace()))
1166 : {
1167 0 : pTableData->SetRightSpace(pTableData->GetRightSpace() + nDiff2);
1168 0 : pTableData->SetLeftSpace(pTableData->GetLeftSpace() + nDiff2);
1169 : }
1170 : else
1171 : {
1172 0 : if(pTableData->GetRightSpace() > pTableData->GetLeftSpace())
1173 : {
1174 0 : pTableData->SetLeftSpace(0);
1175 0 : pTableData->SetRightSpace(pTableData->GetSpace() - pTableData->GetWidth());
1176 : }
1177 : else
1178 : {
1179 0 : pTableData->SetRightSpace(0);
1180 0 : pTableData->SetLeftSpace(pTableData->GetSpace() - pTableData->GetWidth());
1181 : }
1182 : }
1183 : }
1184 0 : break;
1185 : case text::HoriOrientation::CENTER:
1186 0 : pTableData->SetRightSpace(pTableData->GetRightSpace() + nDiff/2);
1187 0 : pTableData->SetLeftSpace(pTableData->GetLeftSpace() + nDiff/2);
1188 0 : break;
1189 : case text::HoriOrientation::LEFT_AND_WIDTH :
1190 0 : if(nDiff > pTableData->GetRightSpace())
1191 : {
1192 0 : pTableData->SetLeftSpace(pTableData->GetSpace() - pTableData->GetWidth());
1193 : }
1194 : pTableData->SetRightSpace(
1195 0 : pTableData->GetSpace() - pTableData->GetWidth() - pTableData->GetLeftSpace());
1196 0 : break;
1197 : }
1198 0 : pTableData->SetWidthChanged();
1199 : }
1200 0 : _pSet->Put(SwPtrItem( FN_TABLE_REP, pTableData ));
1201 : }
1202 0 : return LEAVE_PAGE;
1203 : }
1204 :
1205 0 : SwTwips SwTableColumnPage::GetVisibleWidth(sal_uInt16 nPos)
1206 : {
1207 0 : sal_uInt16 i=0;
1208 :
1209 0 : while( nPos )
1210 : {
1211 0 : if(pTableData->GetColumns()[i].bVisible && nPos)
1212 0 : nPos--;
1213 0 : i++;
1214 : }
1215 0 : SwTwips nReturn = pTableData->GetColumns()[i].nWidth;
1216 : OSL_ENSURE(i < nNoOfCols, "Array index out of range");
1217 0 : while(!pTableData->GetColumns()[i].bVisible && (i + 1) < nNoOfCols)
1218 0 : nReturn += pTableData->GetColumns()[++i].nWidth;
1219 :
1220 0 : return nReturn;
1221 : }
1222 :
1223 0 : void SwTableColumnPage::SetVisibleWidth(sal_uInt16 nPos, SwTwips nNewWidth)
1224 : {
1225 0 : sal_uInt16 i=0;
1226 0 : while( nPos )
1227 : {
1228 0 : if(pTableData->GetColumns()[i].bVisible && nPos)
1229 0 : nPos--;
1230 0 : i++;
1231 : }
1232 : OSL_ENSURE(i < nNoOfCols, "Array index out of range");
1233 0 : pTableData->GetColumns()[i].nWidth = nNewWidth;
1234 0 : while(!pTableData->GetColumns()[i].bVisible && (i + 1) < nNoOfCols)
1235 0 : pTableData->GetColumns()[++i].nWidth = 0;
1236 :
1237 0 : }
1238 :
1239 0 : SwTableTabDlg::SwTableTabDlg(vcl::Window* pParent, SfxItemPool&,
1240 : const SfxItemSet* pItemSet, SwWrtShell* pSh)
1241 : : SfxTabDialog(0, pParent, "TablePropertiesDialog",
1242 : "modules/swriter/ui/tableproperties.ui", pItemSet)
1243 0 : , pShell(pSh)
1244 : {
1245 0 : SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
1246 : OSL_ENSURE(pFact, "Dialog creation failed!");
1247 0 : AddTabPage("table", &SwFormatTablePage::Create, 0);
1248 0 : m_nTextFlowId = AddTabPage("textflow", &SwTextFlowPage::Create, 0);
1249 0 : AddTabPage("columns", &SwTableColumnPage::Create, 0);
1250 0 : m_nBackgroundId = AddTabPage("background", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_BACKGROUND), 0);
1251 0 : m_nBorderId = AddTabPage("borders", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_BORDER), 0);
1252 0 : }
1253 :
1254 0 : void SwTableTabDlg::PageCreated(sal_uInt16 nId, SfxTabPage& rPage)
1255 : {
1256 0 : SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
1257 0 : if (nId == m_nBackgroundId)
1258 : {
1259 0 : SvxBackgroundTabFlags nFlagType = SvxBackgroundTabFlags::SHOW_TBLCTL | SvxBackgroundTabFlags::SHOW_SELECTOR;
1260 0 : aSet.Put (SfxUInt32Item(SID_FLAG_TYPE, static_cast<sal_uInt32>(nFlagType)));
1261 0 : rPage.PageCreated(aSet);
1262 : }
1263 0 : else if (nId == m_nBorderId)
1264 : {
1265 0 : aSet.Put (SfxUInt16Item(SID_SWMODE_TYPE, static_cast<sal_uInt16>(SwBorderModes::TABLE)));
1266 0 : rPage.PageCreated(aSet);
1267 : }
1268 0 : else if (nId == m_nTextFlowId)
1269 : {
1270 0 : static_cast<SwTextFlowPage&>(rPage).SetShell(pShell);
1271 0 : const FrmTypeFlags eType = pShell->GetFrmType(0,true);
1272 0 : if( !(FrmTypeFlags::BODY & eType) )
1273 0 : static_cast<SwTextFlowPage&>(rPage).DisablePageBreak();
1274 0 : }
1275 0 : }
1276 :
1277 0 : SwTextFlowPage::SwTextFlowPage(vcl::Window* pParent, const SfxItemSet& rSet)
1278 : : SfxTabPage(pParent, "TableTextFlowPage",
1279 : "modules/swriter/ui/tabletextflowpage.ui", &rSet)
1280 : , pShell(0)
1281 : , bPageBreak(true)
1282 0 : , bHtmlMode(false)
1283 : {
1284 0 : get(m_pPgBrkCB, "break");
1285 :
1286 0 : get(m_pPgBrkRB, "page");
1287 0 : get(m_pColBrkRB, "column");
1288 :
1289 0 : get(m_pPgBrkBeforeRB, "before");
1290 0 : get(m_pPgBrkAfterRB, "after");
1291 :
1292 0 : get(m_pPageCollCB, "pagestyle");
1293 0 : get(m_pPageCollLB, "pagestylelb");
1294 0 : get(m_pPageNoFT, "pagenoft");
1295 0 : get(m_pPageNoNF, "pagenonf");
1296 :
1297 0 : get(m_pSplitCB, "split");
1298 0 : get(m_pSplitRowCB, "splitrow");
1299 0 : get(m_pKeepCB, "keep");
1300 0 : get(m_pHeadLineCB, "headline");
1301 :
1302 0 : get(m_pRepeatHeaderCombo, "repeatheader");
1303 0 : get(m_pRepeatHeaderNF, "repeatheadernf");
1304 :
1305 0 : get(m_pTextDirectionLB, "textdirection");
1306 0 : get(m_pVertOrientLB, "vertorient");
1307 :
1308 0 : m_pPgBrkRB->SetAccessibleRelationMemberOf(m_pPgBrkCB);
1309 0 : m_pColBrkRB->SetAccessibleRelationMemberOf(m_pPgBrkCB);
1310 0 : m_pPgBrkBeforeRB->SetAccessibleRelationMemberOf(m_pPgBrkCB);
1311 0 : m_pPgBrkAfterRB->SetAccessibleRelationMemberOf(m_pPgBrkCB);
1312 0 : m_pPageCollLB->SetAccessibleName(m_pPageCollCB->GetText());
1313 :
1314 0 : m_pPgBrkCB->SetClickHdl(LINK(this, SwTextFlowPage, PageBreakHdl_Impl));
1315 0 : m_pPgBrkBeforeRB->SetClickHdl(
1316 0 : LINK( this, SwTextFlowPage, PageBreakPosHdl_Impl ) );
1317 0 : m_pPgBrkAfterRB->SetClickHdl(
1318 0 : LINK( this, SwTextFlowPage, PageBreakPosHdl_Impl ) );
1319 0 : m_pPageCollCB->SetClickHdl(
1320 0 : LINK( this, SwTextFlowPage, ApplyCollClickHdl_Impl ) );
1321 0 : m_pColBrkRB->SetClickHdl(
1322 0 : LINK( this, SwTextFlowPage, PageBreakTypeHdl_Impl ) );
1323 0 : m_pPgBrkRB->SetClickHdl(
1324 0 : LINK( this, SwTextFlowPage, PageBreakTypeHdl_Impl ) );
1325 0 : m_pSplitCB->SetClickHdl(
1326 0 : LINK( this, SwTextFlowPage, SplitHdl_Impl));
1327 0 : m_pSplitRowCB->SetClickHdl(
1328 0 : LINK( this, SwTextFlowPage, SplitRowHdl_Impl));
1329 0 : m_pHeadLineCB->SetClickHdl( LINK( this, SwTextFlowPage, HeadLineCBClickHdl ) );
1330 :
1331 : #ifndef SW_FILEFORMAT_40
1332 : const SfxPoolItem *pItem;
1333 0 : if(SfxItemState::SET == rSet.GetItemState( SID_HTML_MODE, false,&pItem )
1334 0 : && static_cast<const SfxUInt16Item*>(pItem)->GetValue() & HTMLMODE_ON)
1335 : #endif
1336 : {
1337 0 : m_pKeepCB->Hide();
1338 0 : m_pSplitCB->Hide();
1339 0 : m_pSplitRowCB->Hide();
1340 : }
1341 :
1342 0 : HeadLineCBClickHdl();
1343 0 : }
1344 :
1345 0 : SwTextFlowPage::~SwTextFlowPage()
1346 : {
1347 0 : disposeOnce();
1348 0 : }
1349 :
1350 0 : void SwTextFlowPage::dispose()
1351 : {
1352 0 : m_pPgBrkCB.clear();
1353 0 : m_pPgBrkRB.clear();
1354 0 : m_pColBrkRB.clear();
1355 0 : m_pPgBrkBeforeRB.clear();
1356 0 : m_pPgBrkAfterRB.clear();
1357 0 : m_pPageCollCB.clear();
1358 0 : m_pPageCollLB.clear();
1359 0 : m_pPageNoFT.clear();
1360 0 : m_pPageNoNF.clear();
1361 0 : m_pSplitCB.clear();
1362 0 : m_pSplitRowCB.clear();
1363 0 : m_pKeepCB.clear();
1364 0 : m_pHeadLineCB.clear();
1365 0 : m_pRepeatHeaderNF.clear();
1366 0 : m_pRepeatHeaderCombo.clear();
1367 0 : m_pTextDirectionLB.clear();
1368 0 : m_pVertOrientLB.clear();
1369 0 : SfxTabPage::dispose();
1370 0 : }
1371 :
1372 0 : VclPtr<SfxTabPage> SwTextFlowPage::Create( vcl::Window* pParent,
1373 : const SfxItemSet* rAttrSet)
1374 : {
1375 0 : return VclPtr<SwTextFlowPage>::Create(pParent, *rAttrSet);
1376 : }
1377 :
1378 0 : bool SwTextFlowPage::FillItemSet( SfxItemSet* rSet )
1379 : {
1380 0 : bool bModified = false;
1381 :
1382 : //Repeat Heading
1383 0 : if(m_pHeadLineCB->IsValueChangedFromSaved() ||
1384 0 : m_pRepeatHeaderNF->IsValueChangedFromSaved() )
1385 : {
1386 : bModified |= 0 != rSet->Put(
1387 0 : SfxUInt16Item(FN_PARAM_TABLE_HEADLINE, m_pHeadLineCB->IsChecked()? sal_uInt16(m_pRepeatHeaderNF->GetValue()) : 0 ));
1388 : }
1389 0 : if(m_pKeepCB->IsValueChangedFromSaved())
1390 0 : bModified |= 0 != rSet->Put( SvxFormatKeepItem( m_pKeepCB->IsChecked(), RES_KEEP));
1391 :
1392 0 : if(m_pSplitCB->IsValueChangedFromSaved())
1393 0 : bModified |= 0 != rSet->Put( SwFormatLayoutSplit( m_pSplitCB->IsChecked()));
1394 :
1395 0 : if(m_pSplitRowCB->IsValueChangedFromSaved())
1396 0 : bModified |= 0 != rSet->Put( SwFormatRowSplit( m_pSplitRowCB->IsChecked()));
1397 :
1398 0 : const SvxFormatBreakItem* pBreak = static_cast<const SvxFormatBreakItem*>(GetOldItem( *rSet, RES_BREAK ));
1399 0 : const SwFormatPageDesc* pDesc = static_cast<const SwFormatPageDesc*>(GetOldItem( *rSet, RES_PAGEDESC ));
1400 :
1401 0 : bool bState = m_pPageCollCB->IsChecked();
1402 :
1403 : //If we have a page style, then there's no break
1404 0 : bool bPageItemPut = false;
1405 0 : if ( bState != (m_pPageCollCB->GetSavedValue() == 1) ||
1406 0 : ( bState &&
1407 0 : m_pPageCollLB->IsValueChangedFromSaved() )
1408 0 : || (m_pPageNoNF->IsEnabled() && m_pPageNoNF->IsValueModified()) )
1409 : {
1410 0 : OUString sPage;
1411 :
1412 0 : if ( bState )
1413 : {
1414 0 : sPage = m_pPageCollLB->GetSelectEntry();
1415 : }
1416 0 : sal_uInt16 nPgNum = static_cast< sal_uInt16 >(m_pPageNoNF->GetValue());
1417 0 : if ( !pDesc || !pDesc->GetPageDesc() ||
1418 0 : ( pDesc->GetPageDesc() && ((pDesc->GetPageDesc()->GetName() != sPage) ||
1419 0 : !comphelper::string::equals(m_pPageNoNF->GetSavedValue(), nPgNum))))
1420 : {
1421 0 : SwFormatPageDesc aFormat( pShell->FindPageDescByName( sPage, true ) );
1422 0 : aFormat.SetNumOffset(bState ? nPgNum : 0);
1423 0 : bModified |= 0 != rSet->Put( aFormat );
1424 0 : bPageItemPut = bState;
1425 0 : }
1426 : }
1427 0 : bool bIsChecked = m_pPgBrkCB->IsChecked();
1428 0 : if ( !bPageItemPut &&
1429 0 : ( bState != (m_pPageCollCB->GetSavedValue() == 1) ||
1430 0 : bIsChecked != (m_pPgBrkCB->GetSavedValue() ==1) ||
1431 0 : m_pPgBrkBeforeRB->IsValueChangedFromSaved() ||
1432 0 : m_pPgBrkRB->IsValueChangedFromSaved() ))
1433 : {
1434 : SvxFormatBreakItem aBreak(
1435 0 : static_cast<const SvxFormatBreakItem&>(GetItemSet().Get( RES_BREAK )) );
1436 :
1437 0 : if(bIsChecked)
1438 : {
1439 0 : bool bBefore = m_pPgBrkBeforeRB->IsChecked();
1440 :
1441 0 : if ( m_pPgBrkRB->IsChecked() )
1442 : {
1443 0 : if ( bBefore )
1444 0 : aBreak.SetValue( SVX_BREAK_PAGE_BEFORE );
1445 : else
1446 0 : aBreak.SetValue( SVX_BREAK_PAGE_AFTER );
1447 : }
1448 : else
1449 : {
1450 0 : if ( bBefore )
1451 0 : aBreak.SetValue( SVX_BREAK_COLUMN_BEFORE );
1452 : else
1453 0 : aBreak.SetValue( SVX_BREAK_COLUMN_AFTER );
1454 : }
1455 : }
1456 : else
1457 : {
1458 0 : aBreak.SetValue( SVX_BREAK_NONE );
1459 : }
1460 :
1461 0 : if ( !pBreak || !( *pBreak == aBreak ) )
1462 : {
1463 0 : bModified |= 0 != rSet->Put( aBreak );
1464 0 : }
1465 : }
1466 :
1467 0 : if(m_pTextDirectionLB->IsValueChangedFromSaved())
1468 : {
1469 : bModified |= 0 != rSet->Put(
1470 : SvxFrameDirectionItem(
1471 0 : (SvxFrameDirection)reinterpret_cast<sal_uLong>(m_pTextDirectionLB->GetSelectEntryData())
1472 0 : , FN_TABLE_BOX_TEXTORIENTATION));
1473 : }
1474 :
1475 0 : if(m_pVertOrientLB->IsValueChangedFromSaved())
1476 : {
1477 0 : sal_uInt16 nOrient = USHRT_MAX;
1478 0 : switch(m_pVertOrientLB->GetSelectEntryPos())
1479 : {
1480 0 : case 0 : nOrient = text::VertOrientation::NONE; break;
1481 0 : case 1 : nOrient = text::VertOrientation::CENTER; break;
1482 0 : case 2 : nOrient = text::VertOrientation::BOTTOM; break;
1483 : }
1484 0 : if(nOrient != USHRT_MAX)
1485 0 : bModified |= 0 != rSet->Put(SfxUInt16Item(FN_TABLE_SET_VERT_ALIGN, nOrient));
1486 : }
1487 :
1488 0 : return bModified;
1489 :
1490 : }
1491 :
1492 0 : void SwTextFlowPage::Reset( const SfxItemSet* rSet )
1493 : {
1494 : const SfxPoolItem* pItem;
1495 0 : SvxHtmlOptions& rHtmlOpt = SvxHtmlOptions::Get();
1496 0 : bool bFlowAllowed = !bHtmlMode || rHtmlOpt.IsPrintLayoutExtension();
1497 0 : if(bFlowAllowed)
1498 : {
1499 : //Inserting of the existing page templates in the list box
1500 0 : const size_t nCount = pShell->GetPageDescCnt();
1501 :
1502 0 : for( size_t i = 0; i < nCount; ++i)
1503 : {
1504 0 : const SwPageDesc &rPageDesc = pShell->GetPageDesc(i);
1505 0 : m_pPageCollLB->InsertEntry(rPageDesc.GetName());
1506 : }
1507 :
1508 0 : OUString aFormatName;
1509 0 : for(sal_uInt16 i = RES_POOLPAGE_BEGIN; i < RES_POOLPAGE_END; ++i)
1510 0 : if( LISTBOX_ENTRY_NOTFOUND == m_pPageCollLB->GetEntryPos(
1511 0 : aFormatName = SwStyleNameMapper::GetUIName( i, aFormatName ) ))
1512 0 : m_pPageCollLB->InsertEntry( aFormatName );
1513 :
1514 0 : if(SfxItemState::SET == rSet->GetItemState( RES_KEEP, false, &pItem ))
1515 : {
1516 0 : m_pKeepCB->Check( static_cast<const SvxFormatKeepItem*>(pItem)->GetValue() );
1517 0 : m_pKeepCB->SaveValue();
1518 : }
1519 0 : if(SfxItemState::SET == rSet->GetItemState( RES_LAYOUT_SPLIT, false, &pItem ))
1520 : {
1521 0 : m_pSplitCB->Check( static_cast<const SwFormatLayoutSplit*>(pItem)->GetValue() );
1522 : }
1523 : else
1524 0 : m_pSplitCB->Check();
1525 :
1526 0 : m_pSplitCB->SaveValue();
1527 0 : SplitHdl_Impl(m_pSplitCB);
1528 :
1529 0 : if(SfxItemState::SET == rSet->GetItemState( RES_ROW_SPLIT, false, &pItem ))
1530 : {
1531 0 : m_pSplitRowCB->Check( static_cast<const SwFormatRowSplit*>(pItem)->GetValue() );
1532 : }
1533 : else
1534 0 : m_pSplitRowCB->SetState(TRISTATE_INDET);
1535 0 : m_pSplitRowCB->SaveValue();
1536 :
1537 0 : if(bPageBreak)
1538 : {
1539 0 : if(SfxItemState::SET == rSet->GetItemState( RES_PAGEDESC, false, &pItem ))
1540 : {
1541 0 : OUString sPageDesc;
1542 0 : const SwPageDesc* pDesc = static_cast<const SwFormatPageDesc*>(pItem)->GetPageDesc();
1543 :
1544 : //m_pPageNoNF->SetValue(static_cast<const SwFormatPageDesc*>(pItem)->GetNumOffset());
1545 0 : ::boost::optional<sal_uInt16> oNumOffset = static_cast<const SwFormatPageDesc*>(pItem)->GetNumOffset();
1546 0 : if (oNumOffset)
1547 0 : m_pPageNoNF->SetValue(oNumOffset.get());
1548 : else
1549 0 : m_pPageNoNF->Enable(false);
1550 :
1551 0 : if(pDesc)
1552 0 : sPageDesc = pDesc->GetName();
1553 0 : if ( !sPageDesc.isEmpty() &&
1554 0 : m_pPageCollLB->GetEntryPos( sPageDesc ) != LISTBOX_ENTRY_NOTFOUND )
1555 : {
1556 0 : m_pPageCollLB->SelectEntry( sPageDesc );
1557 0 : m_pPageCollCB->Check();
1558 :
1559 0 : m_pPgBrkCB->Enable();
1560 0 : m_pPgBrkRB->Enable();
1561 0 : m_pColBrkRB->Enable();
1562 0 : m_pPgBrkBeforeRB->Enable();
1563 0 : m_pPgBrkAfterRB->Enable();
1564 0 : m_pPageCollCB->Enable();
1565 0 : m_pPgBrkCB->Check();
1566 :
1567 0 : m_pPgBrkCB->Check( true );
1568 0 : m_pColBrkRB->Check( false );
1569 0 : m_pPgBrkBeforeRB->Check( true );
1570 0 : m_pPgBrkAfterRB->Check( false );
1571 : }
1572 : else
1573 : {
1574 0 : m_pPageCollLB->SetNoSelection();
1575 0 : m_pPageCollCB->Check(false);
1576 0 : }
1577 : }
1578 :
1579 0 : if(SfxItemState::SET == rSet->GetItemState( RES_BREAK, false, &pItem ))
1580 : {
1581 0 : const SvxFormatBreakItem* pPageBreak = static_cast<const SvxFormatBreakItem*>(pItem);
1582 0 : SvxBreak eBreak = (SvxBreak)pPageBreak->GetValue();
1583 :
1584 0 : if ( eBreak != SVX_BREAK_NONE )
1585 : {
1586 0 : m_pPgBrkCB->Check();
1587 0 : m_pPageCollCB->Enable(false);
1588 0 : m_pPageCollLB->Enable(false);
1589 0 : m_pPageNoFT->Enable(false);
1590 0 : m_pPageNoNF->Enable(false);
1591 : }
1592 0 : switch ( eBreak )
1593 : {
1594 : case SVX_BREAK_PAGE_BEFORE:
1595 0 : m_pPgBrkRB->Check( true );
1596 0 : m_pColBrkRB->Check( false );
1597 0 : m_pPgBrkBeforeRB->Check( true );
1598 0 : m_pPgBrkAfterRB->Check( false );
1599 0 : break;
1600 : case SVX_BREAK_PAGE_AFTER:
1601 0 : m_pPgBrkRB->Check( true );
1602 0 : m_pColBrkRB->Check( false );
1603 0 : m_pPgBrkBeforeRB->Check( false );
1604 0 : m_pPgBrkAfterRB->Check( true );
1605 0 : break;
1606 : case SVX_BREAK_COLUMN_BEFORE:
1607 0 : m_pPgBrkRB->Check( false );
1608 0 : m_pColBrkRB->Check( true );
1609 0 : m_pPgBrkBeforeRB->Check( true );
1610 0 : m_pPgBrkAfterRB->Check( false );
1611 0 : break;
1612 : case SVX_BREAK_COLUMN_AFTER:
1613 0 : m_pPgBrkRB->Check( false );
1614 0 : m_pColBrkRB->Check( true );
1615 0 : m_pPgBrkBeforeRB->Check( false );
1616 0 : m_pPgBrkAfterRB->Check( true );
1617 0 : break;
1618 : default:; //prevent warning
1619 : }
1620 :
1621 : }
1622 0 : if ( m_pPgBrkBeforeRB->IsChecked() )
1623 0 : PageBreakPosHdl_Impl(m_pPgBrkBeforeRB);
1624 0 : else if ( m_pPgBrkAfterRB->IsChecked() )
1625 0 : PageBreakPosHdl_Impl(m_pPgBrkAfterRB);
1626 0 : PageBreakHdl_Impl( m_pPgBrkCB );
1627 0 : }
1628 : }
1629 : else
1630 : {
1631 0 : m_pPgBrkRB->Enable(false);
1632 0 : m_pColBrkRB->Enable(false);
1633 0 : m_pPgBrkBeforeRB->Enable(false);
1634 0 : m_pPgBrkAfterRB->Enable(false);
1635 0 : m_pKeepCB->Enable(false);
1636 0 : m_pSplitCB->Enable(false);
1637 0 : m_pPgBrkCB->Enable(false);
1638 0 : m_pPageCollCB->Enable(false);
1639 0 : m_pPageCollLB->Enable(false);
1640 : }
1641 :
1642 0 : if(SfxItemState::SET == rSet->GetItemState( FN_PARAM_TABLE_HEADLINE, false, &pItem ))
1643 : {
1644 0 : sal_uInt16 nRep = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
1645 0 : m_pHeadLineCB->Check( nRep > 0 );
1646 0 : m_pHeadLineCB->SaveValue();
1647 0 : m_pRepeatHeaderNF->SetValue( nRep );
1648 0 : m_pRepeatHeaderNF->SetMin( 1 );
1649 0 : m_pRepeatHeaderNF->SaveValue();
1650 : }
1651 0 : if ( rSet->GetItemState(FN_TABLE_BOX_TEXTORIENTATION) > SfxItemState::DEFAULT )
1652 : {
1653 0 : sal_uLong nDirection = static_cast<const SvxFrameDirectionItem&>(rSet->Get(FN_TABLE_BOX_TEXTORIENTATION)).GetValue();
1654 0 : m_pTextDirectionLB->SelectEntryPos(m_pTextDirectionLB->GetEntryPos( reinterpret_cast<void*>(nDirection) ));
1655 : }
1656 :
1657 0 : if ( rSet->GetItemState(FN_TABLE_SET_VERT_ALIGN) > SfxItemState::DEFAULT )
1658 : {
1659 0 : sal_uInt16 nVert = static_cast<const SfxUInt16Item&>(rSet->Get(FN_TABLE_SET_VERT_ALIGN)).GetValue();
1660 0 : sal_uInt16 nPos = 0;
1661 0 : switch(nVert)
1662 : {
1663 0 : case text::VertOrientation::NONE: nPos = 0; break;
1664 0 : case text::VertOrientation::CENTER: nPos = 1; break;
1665 0 : case text::VertOrientation::BOTTOM: nPos = 2; break;
1666 : }
1667 0 : m_pVertOrientLB->SelectEntryPos(nPos);
1668 : }
1669 :
1670 0 : m_pPageCollCB->SaveValue();
1671 0 : m_pPageCollLB->SaveValue();
1672 0 : m_pPgBrkCB->SaveValue();
1673 0 : m_pPgBrkRB->SaveValue();
1674 0 : m_pColBrkRB->SaveValue();
1675 0 : m_pPgBrkBeforeRB->SaveValue();
1676 0 : m_pPgBrkAfterRB->SaveValue();
1677 0 : m_pPageNoNF->SaveValue();
1678 0 : m_pTextDirectionLB->SaveValue();
1679 0 : m_pVertOrientLB->SaveValue();
1680 :
1681 0 : HeadLineCBClickHdl();
1682 0 : }
1683 :
1684 0 : void SwTextFlowPage::SetShell(SwWrtShell* pSh)
1685 : {
1686 0 : pShell = pSh;
1687 0 : bHtmlMode = 0 != (::GetHtmlMode(pShell->GetView().GetDocShell()) & HTMLMODE_ON);
1688 0 : if(bHtmlMode)
1689 : {
1690 0 : m_pPageNoNF->Enable(false);
1691 0 : m_pPageNoFT->Enable(false);
1692 : }
1693 0 : }
1694 :
1695 0 : IMPL_LINK_NOARG(SwTextFlowPage, PageBreakHdl_Impl)
1696 : {
1697 0 : if( m_pPgBrkCB->IsChecked() )
1698 : {
1699 0 : m_pPgBrkRB-> Enable();
1700 0 : m_pColBrkRB-> Enable();
1701 0 : m_pPgBrkBeforeRB-> Enable();
1702 0 : m_pPgBrkAfterRB-> Enable();
1703 :
1704 0 : if ( m_pPgBrkRB->IsChecked() && m_pPgBrkBeforeRB->IsChecked() )
1705 : {
1706 0 : m_pPageCollCB->Enable();
1707 :
1708 0 : bool bEnable = m_pPageCollCB->IsChecked() &&
1709 0 : m_pPageCollLB->GetEntryCount();
1710 0 : m_pPageCollLB->Enable(bEnable);
1711 0 : if(!bHtmlMode)
1712 : {
1713 0 : m_pPageNoFT->Enable(bEnable);
1714 0 : m_pPageNoNF->Enable(bEnable);
1715 : }
1716 : }
1717 : }
1718 : else
1719 : {
1720 0 : m_pPageCollCB->Check( false );
1721 0 : m_pPageCollCB->Enable(false);
1722 0 : m_pPageCollLB->Enable(false);
1723 0 : m_pPageNoFT->Enable(false);
1724 0 : m_pPageNoNF->Enable(false);
1725 0 : m_pPgBrkRB-> Enable(false);
1726 0 : m_pColBrkRB-> Enable(false);
1727 0 : m_pPgBrkBeforeRB-> Enable(false);
1728 0 : m_pPgBrkAfterRB-> Enable(false);
1729 : }
1730 0 : return 0;
1731 : }
1732 :
1733 0 : IMPL_LINK_NOARG(SwTextFlowPage, ApplyCollClickHdl_Impl)
1734 : {
1735 0 : bool bEnable = false;
1736 0 : if ( m_pPageCollCB->IsChecked() &&
1737 0 : m_pPageCollLB->GetEntryCount() )
1738 : {
1739 0 : bEnable = true;
1740 0 : m_pPageCollLB->SelectEntryPos( 0 );
1741 : }
1742 : else
1743 : {
1744 0 : m_pPageCollLB->SetNoSelection();
1745 : }
1746 0 : m_pPageCollLB->Enable(bEnable);
1747 0 : if(!bHtmlMode)
1748 : {
1749 0 : m_pPageNoFT->Enable(bEnable);
1750 0 : m_pPageNoNF->Enable(bEnable);
1751 : }
1752 0 : return 0;
1753 : }
1754 :
1755 0 : IMPL_LINK( SwTextFlowPage, PageBreakPosHdl_Impl, RadioButton*, pBtn )
1756 : {
1757 0 : if ( m_pPgBrkCB->IsChecked() )
1758 : {
1759 0 : if ( pBtn == m_pPgBrkBeforeRB && m_pPgBrkRB->IsChecked() )
1760 : {
1761 0 : m_pPageCollCB->Enable();
1762 :
1763 0 : bool bEnable = m_pPageCollCB->IsChecked() &&
1764 0 : m_pPageCollLB->GetEntryCount();
1765 :
1766 0 : m_pPageCollLB->Enable(bEnable);
1767 0 : if(!bHtmlMode)
1768 : {
1769 0 : m_pPageNoFT->Enable(bEnable);
1770 0 : m_pPageNoNF->Enable(bEnable);
1771 : }
1772 : }
1773 0 : else if (pBtn == m_pPgBrkAfterRB)
1774 : {
1775 0 : m_pPageCollCB->Check( false );
1776 0 : m_pPageCollCB->Enable(false);
1777 0 : m_pPageCollLB->Enable(false);
1778 0 : m_pPageNoFT->Enable(false);
1779 0 : m_pPageNoNF->Enable(false);
1780 : }
1781 : }
1782 0 : return 0;
1783 : }
1784 :
1785 0 : IMPL_LINK( SwTextFlowPage, PageBreakTypeHdl_Impl, RadioButton*, pBtn )
1786 : {
1787 0 : if ( pBtn == m_pColBrkRB || m_pPgBrkAfterRB->IsChecked() )
1788 : {
1789 0 : m_pPageCollCB->Check(false);
1790 0 : m_pPageCollCB->Enable(false);
1791 0 : m_pPageCollLB->Enable(false);
1792 0 : m_pPageNoFT->Enable(false);
1793 0 : m_pPageNoNF->Enable(false);
1794 : }
1795 0 : else if ( m_pPgBrkBeforeRB->IsChecked() )
1796 0 : PageBreakPosHdl_Impl(m_pPgBrkBeforeRB);
1797 0 : return 0;
1798 : }
1799 :
1800 0 : IMPL_LINK( SwTextFlowPage, SplitHdl_Impl, CheckBox*, pBox )
1801 : {
1802 0 : m_pSplitRowCB->Enable(pBox->IsChecked());
1803 0 : return 0;
1804 : }
1805 :
1806 0 : IMPL_STATIC_LINK(
1807 : SwTextFlowPage, SplitRowHdl_Impl, TriStateBox*, pBox )
1808 : {
1809 0 : pBox->EnableTriState(false);
1810 0 : return 0;
1811 : }
1812 :
1813 0 : IMPL_LINK_NOARG(SwTextFlowPage, HeadLineCBClickHdl)
1814 : {
1815 0 : m_pRepeatHeaderCombo->Enable(m_pHeadLineCB->IsChecked());
1816 :
1817 0 : return 0;
1818 : }
1819 :
1820 0 : void SwTextFlowPage::DisablePageBreak()
1821 : {
1822 0 : bPageBreak = false;
1823 0 : m_pPgBrkCB->Disable();
1824 0 : m_pPgBrkRB->Disable();
1825 0 : m_pColBrkRB->Disable();
1826 0 : m_pPgBrkBeforeRB->Disable();
1827 0 : m_pPgBrkAfterRB->Disable();
1828 0 : m_pPageCollCB->Disable();
1829 0 : m_pPageCollLB->Disable();
1830 0 : m_pPageNoFT->Disable();
1831 0 : m_pPageNoNF->Disable();
1832 0 : }
1833 :
1834 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|