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 :
22 : #include <osl/diagnose.h>
23 : #include <tools/datetime.hxx>
24 : #include <vcl/svapp.hxx>
25 : #include <unotools/collatorwrapper.hxx>
26 : #include <svl/urihelper.hxx>
27 : #include <svl/stritem.hxx>
28 : #include <unotools/syslocale.hxx>
29 : #include <sfx2/app.hxx>
30 : #include <IDocumentStylePoolAccess.hxx>
31 : #include <sfx2/docfile.hxx>
32 : #include <sfx2/docfilt.hxx>
33 : #include <editeng/pmdlitem.hxx>
34 : #include <editeng/tstpitem.hxx>
35 : #include <editeng/boxitem.hxx>
36 : #include <editeng/shaditem.hxx>
37 : #include <editeng/sizeitem.hxx>
38 : #include <editeng/brushitem.hxx>
39 : #include <svx/pageitem.hxx>
40 : #include <editeng/lrspitem.hxx>
41 : #include <svl/style.hxx>
42 : #include <vcl/lstbox.hxx>
43 : #include <unotools/localedatawrapper.hxx>
44 : #include <com/sun/star/frame/XDispatch.hpp>
45 : #include <com/sun/star/frame/XDispatchProvider.hpp>
46 : #include <com/sun/star/util/URLTransformer.hpp>
47 : #include <com/sun/star/util/XURLTransformer.hpp>
48 : #include <comphelper/processfactory.hxx>
49 : #include <sfx2/viewfrm.hxx>
50 : #include <fmtornt.hxx>
51 : #include <tabcol.hxx>
52 : #include <edtwin.hxx>
53 : #include <fmtfsize.hxx>
54 : #include <fmthdft.hxx>
55 : #include <fmtpdsc.hxx>
56 : #include <wview.hxx>
57 : #include <uiitems.hxx>
58 : #include <docsh.hxx>
59 : #include <wrtsh.hxx>
60 : #include <swmodule.hxx>
61 : #include <view.hxx>
62 : #include <uitool.hxx>
63 : #include <frmatr.hxx>
64 : #include <paratr.hxx>
65 : #include <fmtcol.hxx>
66 : #include <poolfmt.hxx>
67 : #include "usrpref.hxx"
68 :
69 : #include <cmdid.h>
70 : #include <globals.hrc>
71 : #include <utlui.hrc>
72 : #include <doc.hxx>
73 : #include <docary.hxx>
74 : #include <charfmt.hxx>
75 : #include <SwStyleNameMapper.hxx>
76 : // 50 cm 28350
77 :
78 : #define MAXHEIGHT 28350
79 : #define MAXWIDTH 28350
80 :
81 : using namespace ::com::sun::star;
82 :
83 : // General list of string pointer
84 :
85 : // Switch metric
86 :
87 0 : void SetMetric(MetricFormatter& rCtrl, FieldUnit eUnit)
88 : {
89 0 : SwTwips nMin = static_cast< SwTwips >(rCtrl.GetMin(FUNIT_TWIP));
90 0 : SwTwips nMax = static_cast< SwTwips >(rCtrl.GetMax(FUNIT_TWIP));
91 :
92 0 : rCtrl.SetUnit(eUnit);
93 :
94 0 : rCtrl.SetMin(nMin, FUNIT_TWIP);
95 0 : rCtrl.SetMax(nMax, FUNIT_TWIP);
96 0 : }
97 :
98 : // Set boxinfo attribute
99 :
100 0 : void PrepareBoxInfo(SfxItemSet& rSet, const SwWrtShell& rSh)
101 : {
102 0 : SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
103 : const SfxPoolItem *pBoxInfo;
104 0 : if ( SfxItemState::SET == rSet.GetItemState( SID_ATTR_BORDER_INNER,
105 0 : true, &pBoxInfo))
106 0 : aBoxInfo = *(SvxBoxInfoItem*)pBoxInfo;
107 :
108 : // Table variant: If more than one table cells are selected
109 0 : rSh.GetCrsr(); //So that GetCrsrCnt() returns the right thing
110 0 : aBoxInfo.SetTable (rSh.IsTableMode() && rSh.GetCrsrCnt() > 1);
111 : // Always show the distance field
112 0 : aBoxInfo.SetDist (true);
113 : // Set minimal size in tables and paragraphs
114 0 : aBoxInfo.SetMinDist (rSh.IsTableMode() || rSh.GetSelectionType() & (nsSelectionType::SEL_TXT | nsSelectionType::SEL_TBL));
115 : // Set always the default distance
116 0 : aBoxInfo.SetDefDist (MIN_BORDER_DIST);
117 : // Single lines can have only in tables DontCare-Status
118 0 : aBoxInfo.SetValid(VALID_DISABLE, !rSh.IsTableMode());
119 :
120 0 : rSet.Put(aBoxInfo);
121 0 : }
122 :
123 0 : void ConvertAttrCharToGen(SfxItemSet& rSet, const sal_uInt8 nMode)
124 : {
125 : // Background
126 : {
127 : const SfxPoolItem *pTmpBrush;
128 0 : if( SfxItemState::SET == rSet.GetItemState( RES_CHRATR_BACKGROUND, true, &pTmpBrush ) )
129 : {
130 0 : SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
131 0 : aTmpBrush.SetWhich( RES_BACKGROUND );
132 0 : rSet.Put( aTmpBrush );
133 : }
134 : else
135 0 : rSet.ClearItem(RES_BACKGROUND);
136 : }
137 :
138 0 : if( nMode == CONV_ATTR_STD )
139 : {
140 : // Border
141 : const SfxPoolItem *pTmpItem;
142 0 : if( SfxItemState::SET == rSet.GetItemState( RES_CHRATR_BOX, true, &pTmpItem ) )
143 : {
144 0 : SvxBoxItem aTmpBox( *((SvxBoxItem*)pTmpItem) );
145 0 : aTmpBox.SetWhich( RES_BOX );
146 0 : rSet.Put( aTmpBox );
147 : }
148 : else
149 0 : rSet.ClearItem(RES_BOX);
150 :
151 : // Border shadow
152 0 : if( SfxItemState::SET == rSet.GetItemState( RES_CHRATR_SHADOW, false, &pTmpItem ) )
153 : {
154 0 : SvxShadowItem aTmpShadow( *((SvxShadowItem*)pTmpItem) );
155 0 : aTmpShadow.SetWhich( RES_SHADOW );
156 0 : rSet.Put( aTmpShadow );
157 : }
158 : else
159 0 : rSet.ClearItem( RES_SHADOW );
160 : }
161 0 : }
162 :
163 0 : void ConvertAttrGenToChar(SfxItemSet& rSet, const sal_uInt8 nMode)
164 : {
165 : // Background
166 : {
167 : const SfxPoolItem *pTmpBrush;
168 0 : if( SfxItemState::SET == rSet.GetItemState( RES_BACKGROUND, false, &pTmpBrush ) )
169 : {
170 0 : SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
171 0 : aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
172 0 : rSet.Put( aTmpBrush );
173 : }
174 0 : rSet.ClearItem( RES_BACKGROUND );
175 : }
176 :
177 0 : if( nMode == CONV_ATTR_STD )
178 : {
179 : // Border
180 : const SfxPoolItem *pTmpItem;
181 0 : if( SfxItemState::SET == rSet.GetItemState( RES_BOX, false, &pTmpItem ) )
182 : {
183 0 : SvxBoxItem aTmpBox( *((SvxBoxItem*)pTmpItem) );
184 0 : aTmpBox.SetWhich( RES_CHRATR_BOX );
185 0 : rSet.Put( aTmpBox );
186 : }
187 0 : rSet.ClearItem( RES_BOX );
188 :
189 : // Border shadow
190 0 : if( SfxItemState::SET == rSet.GetItemState( RES_SHADOW, false, &pTmpItem ) )
191 : {
192 0 : SvxShadowItem aTmpShadow( *((SvxShadowItem*)pTmpItem) );
193 0 : aTmpShadow.SetWhich( RES_CHRATR_SHADOW );
194 0 : rSet.Put( aTmpShadow );
195 : }
196 0 : rSet.ClearItem( RES_SHADOW );
197 : }
198 0 : }
199 :
200 : // Fill header footer
201 :
202 7616 : void FillHdFt(SwFrmFmt* pFmt, const SfxItemSet& rSet)
203 : {
204 7616 : SwAttrSet aSet(pFmt->GetAttrSet());
205 7616 : aSet.Put(rSet);
206 :
207 7616 : const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get(SID_ATTR_PAGE_SIZE);
208 7616 : const SfxBoolItem& rDynamic = (const SfxBoolItem&)rSet.Get(SID_ATTR_PAGE_DYNAMIC);
209 :
210 : // Convert size
211 7616 : SwFmtFrmSize aFrmSize(rDynamic.GetValue() ? ATT_MIN_SIZE : ATT_FIX_SIZE,
212 7616 : rSize.GetSize().Width(),
213 30464 : rSize.GetSize().Height());
214 7616 : aSet.Put(aFrmSize);
215 15232 : pFmt->SetFmtAttr(aSet);
216 7616 : }
217 :
218 : /// Convert from UseOnPage to SvxPageUsage.
219 26300 : UseOnPage lcl_convertUseToSvx(UseOnPage nUse)
220 : {
221 26300 : UseOnPage nRet = nsUseOnPage::PD_NONE;
222 26300 : if ((nUse & nsUseOnPage::PD_LEFT) == nsUseOnPage::PD_LEFT)
223 26284 : nRet |= SVX_PAGE_LEFT;
224 26300 : if ((nUse & nsUseOnPage::PD_RIGHT) == nsUseOnPage::PD_RIGHT)
225 26284 : nRet |= SVX_PAGE_RIGHT;
226 26300 : if ((nUse & nsUseOnPage::PD_ALL) == nsUseOnPage::PD_ALL)
227 26268 : nRet |= SVX_PAGE_ALL;
228 26300 : if ((nUse & nsUseOnPage::PD_MIRROR) == nsUseOnPage::PD_MIRROR)
229 248 : nRet |= SVX_PAGE_MIRROR;
230 26300 : return nRet;
231 : }
232 :
233 : /// Convert from SvxPageUsage to UseOnPage.
234 10518 : UseOnPage lcl_convertUseFromSvx(UseOnPage nUse)
235 : {
236 10518 : UseOnPage nRet = nsUseOnPage::PD_NONE;
237 10518 : if ((nUse & SVX_PAGE_LEFT) == SVX_PAGE_LEFT)
238 10498 : nRet |= nsUseOnPage::PD_LEFT;
239 10518 : if ((nUse & SVX_PAGE_RIGHT) == SVX_PAGE_RIGHT)
240 10500 : nRet |= nsUseOnPage::PD_RIGHT;
241 10518 : if ((nUse & SVX_PAGE_ALL) == SVX_PAGE_ALL)
242 10480 : nRet |= nsUseOnPage::PD_ALL;
243 10518 : if ((nUse & SVX_PAGE_MIRROR) == SVX_PAGE_MIRROR)
244 126 : nRet |= nsUseOnPage::PD_MIRROR;
245 10518 : return nRet;
246 : }
247 :
248 : // PageDesc <-> convert into sets and back
249 :
250 10518 : void ItemSetToPageDesc( const SfxItemSet& rSet, SwPageDesc& rPageDesc )
251 : {
252 10518 : SwFrmFmt& rMaster = rPageDesc.GetMaster();
253 10518 : int nFirstShare = -1;
254 :
255 : // Transfer all general frame attributes
256 10518 : rMaster.SetFmtAttr(rSet);
257 :
258 : // PageData
259 10518 : if(rSet.GetItemState(SID_ATTR_PAGE) == SfxItemState::SET)
260 : {
261 10518 : const SvxPageItem& rPageItem = (const SvxPageItem&)rSet.Get(SID_ATTR_PAGE);
262 :
263 10518 : const sal_uInt16 nUse = rPageItem.GetPageUsage();
264 10518 : if(nUse)
265 10518 : rPageDesc.SetUseOn( lcl_convertUseFromSvx((UseOnPage) nUse) );
266 10518 : rPageDesc.SetLandscape(rPageItem.IsLandscape());
267 10518 : SvxNumberType aNumType;
268 10518 : aNumType.SetNumberingType( static_cast< sal_Int16 >(rPageItem.GetNumType()) );
269 10518 : rPageDesc.SetNumType(aNumType);
270 : }
271 : // Size
272 10518 : if(rSet.GetItemState(SID_ATTR_PAGE_SIZE) == SfxItemState::SET)
273 : {
274 10518 : const SvxSizeItem& rSizeItem = (const SvxSizeItem&)rSet.Get(SID_ATTR_PAGE_SIZE);
275 10518 : SwFmtFrmSize aSize(ATT_FIX_SIZE);
276 10518 : aSize.SetSize(rSizeItem.GetSize());
277 10518 : rMaster.SetFmtAttr(aSize);
278 : }
279 : // Evaluate header attributes
280 : const SfxPoolItem* pItem;
281 10518 : if( SfxItemState::SET == rSet.GetItemState( SID_ATTR_PAGE_HEADERSET,
282 10518 : false, &pItem ) )
283 : {
284 4580 : const SfxItemSet& rHeaderSet = ((SvxSetItem*)pItem)->GetItemSet();
285 4580 : const SfxBoolItem& rHeaderOn = (const SfxBoolItem&)rHeaderSet.Get(SID_ATTR_PAGE_ON);
286 :
287 4580 : if(rHeaderOn.GetValue())
288 : {
289 : // Take over values
290 4570 : if(!rMaster.GetHeader().IsActive())
291 1162 : rMaster.SetFmtAttr(SwFmtHeader(true));
292 :
293 : // Pick out everything and adapt the header format
294 4570 : SwFmtHeader aHeaderFmt(rMaster.GetHeader());
295 4570 : SwFrmFmt *pHeaderFmt = aHeaderFmt.GetHeaderFmt();
296 : OSL_ENSURE(pHeaderFmt != 0, "no header format");
297 :
298 4570 : ::FillHdFt(pHeaderFmt, rHeaderSet);
299 :
300 : rPageDesc.ChgHeaderShare(((const SfxBoolItem&)
301 4570 : rHeaderSet.Get(SID_ATTR_PAGE_SHARED)).GetValue());
302 4570 : if (nFirstShare < 0)
303 : {
304 : rPageDesc.ChgFirstShare(((const SfxBoolItem&)
305 4570 : rHeaderSet.Get(SID_ATTR_PAGE_SHARED_FIRST)).GetValue());
306 4570 : nFirstShare = rPageDesc.IsFirstShared() ? 1 : 0;
307 4570 : }
308 : }
309 : else
310 : {
311 : // Disable header
312 10 : if(rMaster.GetHeader().IsActive())
313 : {
314 10 : rMaster.SetFmtAttr(SwFmtHeader(false));
315 10 : rPageDesc.ChgHeaderShare(false);
316 : }
317 : }
318 : }
319 :
320 : // Evaluate footer attributes
321 10518 : if( SfxItemState::SET == rSet.GetItemState( SID_ATTR_PAGE_FOOTERSET,
322 10518 : false, &pItem ) )
323 : {
324 3050 : const SfxItemSet& rFooterSet = ((SvxSetItem*)pItem)->GetItemSet();
325 3050 : const SfxBoolItem& rFooterOn = (const SfxBoolItem&)rFooterSet.Get(SID_ATTR_PAGE_ON);
326 :
327 3050 : if(rFooterOn.GetValue())
328 : {
329 : // Take over values
330 3046 : if(!rMaster.GetFooter().IsActive())
331 1168 : rMaster.SetFmtAttr(SwFmtFooter(true));
332 :
333 : // Pick out everything and adapt the footer format
334 3046 : SwFmtFooter aFooterFmt(rMaster.GetFooter());
335 3046 : SwFrmFmt *pFooterFmt = aFooterFmt.GetFooterFmt();
336 : OSL_ENSURE(pFooterFmt != 0, "no footer format");
337 :
338 3046 : ::FillHdFt(pFooterFmt, rFooterSet);
339 :
340 : rPageDesc.ChgFooterShare(((const SfxBoolItem&)
341 3046 : rFooterSet.Get(SID_ATTR_PAGE_SHARED)).GetValue());
342 3046 : if (nFirstShare < 0)
343 : {
344 : rPageDesc.ChgFirstShare(((const SfxBoolItem&)
345 536 : rFooterSet.Get(SID_ATTR_PAGE_SHARED_FIRST)).GetValue());
346 536 : nFirstShare = rPageDesc.IsFirstShared() ? 1 : 0;
347 3046 : }
348 : }
349 : else
350 : {
351 : // Disable footer
352 4 : if(rMaster.GetFooter().IsActive())
353 : {
354 4 : rMaster.SetFmtAttr(SwFmtFooter(false));
355 4 : rPageDesc.ChgFooterShare(false);
356 : }
357 : }
358 : }
359 :
360 : // Footnotes
361 :
362 10518 : if( SfxItemState::SET == rSet.GetItemState( FN_PARAM_FTN_INFO,
363 10518 : false, &pItem ) )
364 10518 : rPageDesc.SetFtnInfo( ((SwPageFtnInfoItem*)pItem)->GetPageFtnInfo() );
365 :
366 : // Columns
367 :
368 : // Register compliant
369 :
370 10518 : if(SfxItemState::SET == rSet.GetItemState(
371 10518 : SID_SWREGISTER_MODE, false, &pItem))
372 : {
373 10518 : bool bSet = ((const SfxBoolItem*)pItem)->GetValue();
374 10518 : if(!bSet)
375 10518 : rPageDesc.SetRegisterFmtColl(0);
376 0 : else if(SfxItemState::SET == rSet.GetItemState(
377 0 : SID_SWREGISTER_COLLECTION, false, &pItem))
378 : {
379 0 : const OUString& rColl = ((const SfxStringItem*)pItem)->GetValue();
380 0 : SwDoc& rDoc = *rMaster.GetDoc();
381 0 : SwTxtFmtColl* pColl = rDoc.FindTxtFmtCollByName( rColl );
382 0 : if( !pColl )
383 : {
384 : const sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(
385 0 : rColl, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
386 0 : if( USHRT_MAX != nId )
387 0 : pColl = rDoc.getIDocumentStylePoolAccess().GetTxtCollFromPool( nId );
388 : else
389 : pColl = rDoc.MakeTxtFmtColl( rColl,
390 0 : (SwTxtFmtColl*)rDoc.GetDfltTxtFmtColl() );
391 : }
392 0 : if( pColl )
393 0 : pColl->SetFmtAttr( SwRegisterItem ( true ));
394 0 : rPageDesc.SetRegisterFmtColl( pColl );
395 : }
396 : }
397 10518 : }
398 :
399 26300 : void PageDescToItemSet( const SwPageDesc& rPageDesc, SfxItemSet& rSet)
400 : {
401 26300 : const SwFrmFmt& rMaster = rPageDesc.GetMaster();
402 :
403 : // Page data
404 26300 : SvxPageItem aPageItem(SID_ATTR_PAGE);
405 26300 : aPageItem.SetDescName(rPageDesc.GetName());
406 26300 : aPageItem.SetPageUsage(lcl_convertUseToSvx(rPageDesc.GetUseOn()));
407 26300 : aPageItem.SetLandscape(rPageDesc.GetLandscape());
408 26300 : aPageItem.SetNumType((SvxNumType)rPageDesc.GetNumType().GetNumberingType());
409 26300 : rSet.Put(aPageItem);
410 :
411 : // Size
412 52600 : SvxSizeItem aSizeItem(SID_ATTR_PAGE_SIZE, rMaster.GetFrmSize().GetSize());
413 26300 : rSet.Put(aSizeItem);
414 :
415 : // Maximum size
416 52600 : SvxSizeItem aMaxSizeItem(SID_ATTR_PAGE_MAXSIZE, Size(MAXWIDTH, MAXHEIGHT));
417 26300 : rSet.Put(aMaxSizeItem);
418 :
419 : // Margins, border and the other stuff.
420 26300 : rSet.Put(rMaster.GetAttrSet());
421 :
422 52600 : SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
423 : const SfxPoolItem *pBoxInfo;
424 26300 : if ( SfxItemState::SET == rSet.GetItemState( SID_ATTR_BORDER_INNER,
425 26300 : true, &pBoxInfo) )
426 678 : aBoxInfo = *(SvxBoxInfoItem*)pBoxInfo;
427 :
428 26300 : aBoxInfo.SetTable( false );
429 : // Show always the distance field
430 26300 : aBoxInfo.SetDist( true);
431 : // Set minimal size in tables and paragraphs
432 26300 : aBoxInfo.SetMinDist( false );
433 : // Set always the default distance
434 26300 : aBoxInfo.SetDefDist( MIN_BORDER_DIST );
435 : // Single lines can have only in tables DontCare-Status
436 26300 : aBoxInfo.SetValid( VALID_DISABLE );
437 26300 : rSet.Put( aBoxInfo );
438 :
439 52600 : SfxStringItem aFollow(SID_ATTR_PAGE_EXT1, OUString());
440 26300 : if(rPageDesc.GetFollow())
441 26300 : aFollow.SetValue(rPageDesc.GetFollow()->GetName());
442 26300 : rSet.Put(aFollow);
443 :
444 : // Header
445 26300 : if(rMaster.GetHeader().IsActive())
446 : {
447 7306 : const SwFmtHeader &rHeaderFmt = rMaster.GetHeader();
448 7306 : const SwFrmFmt *pHeaderFmt = rHeaderFmt.GetHeaderFmt();
449 : OSL_ENSURE(pHeaderFmt != 0, "no header format");
450 :
451 : // HeaderInfo, margins, background, border
452 7306 : SfxItemSet aHeaderSet(*rSet.GetPool(),
453 : RES_FRMATR_BEGIN,RES_FRMATR_END - 1, // [82
454 :
455 : //UUUU FillAttribute support
456 : XATTR_FILL_FIRST, XATTR_FILL_LAST, // [1014
457 :
458 : SID_ATTR_BORDER_INNER,SID_ATTR_BORDER_INNER, // [10023
459 : SID_ATTR_PAGE_SIZE,SID_ATTR_PAGE_SIZE, // [10051
460 : SID_ATTR_PAGE_ON,SID_ATTR_PAGE_SHARED, // [10060
461 : SID_ATTR_PAGE_SHARED_FIRST,SID_ATTR_PAGE_SHARED_FIRST,
462 7306 : 0, 0);
463 :
464 : //UUUU set correct parent to get the XFILL_NONE FillStyle as needed
465 7306 : aHeaderSet.SetParent(&rMaster.GetDoc()->GetDfltFrmFmt()->GetAttrSet());
466 :
467 : // Dynamic or fixed height
468 14612 : SfxBoolItem aOn(SID_ATTR_PAGE_ON, true);
469 7306 : aHeaderSet.Put(aOn);
470 :
471 7306 : const SwFmtFrmSize &rFrmSize = pHeaderFmt->GetFrmSize();
472 7306 : const SwFrmSize eSizeType = rFrmSize.GetHeightSizeType();
473 14612 : SfxBoolItem aDynamic(SID_ATTR_PAGE_DYNAMIC, eSizeType != ATT_FIX_SIZE);
474 7306 : aHeaderSet.Put(aDynamic);
475 :
476 : // Left equal right
477 14612 : SfxBoolItem aShared(SID_ATTR_PAGE_SHARED, rPageDesc.IsHeaderShared());
478 7306 : aHeaderSet.Put(aShared);
479 14612 : SfxBoolItem aFirstShared(SID_ATTR_PAGE_SHARED_FIRST, rPageDesc.IsFirstShared());
480 7306 : aHeaderSet.Put(aFirstShared);
481 :
482 : // Size
483 14612 : SvxSizeItem aSize(SID_ATTR_PAGE_SIZE, Size(rFrmSize.GetSize()));
484 7306 : aHeaderSet.Put(aSize);
485 :
486 : // Shifting frame attributes
487 7306 : aHeaderSet.Put(pHeaderFmt->GetAttrSet());
488 7306 : aHeaderSet.Put( aBoxInfo );
489 :
490 : // Create SetItem
491 14612 : SvxSetItem aSetItem(SID_ATTR_PAGE_HEADERSET, aHeaderSet);
492 14612 : rSet.Put(aSetItem);
493 : }
494 :
495 : // Footer
496 26300 : if(rMaster.GetFooter().IsActive())
497 : {
498 4930 : const SwFmtFooter &rFooterFmt = rMaster.GetFooter();
499 4930 : const SwFrmFmt *pFooterFmt = rFooterFmt.GetFooterFmt();
500 : OSL_ENSURE(pFooterFmt != 0, "no footer format");
501 :
502 : // FooterInfo, margins, background, border
503 4930 : SfxItemSet aFooterSet(*rSet.GetPool(),
504 : RES_FRMATR_BEGIN,RES_FRMATR_END - 1, // [82
505 :
506 : //UUUU FillAttribute support
507 : XATTR_FILL_FIRST, XATTR_FILL_LAST, // [1014
508 :
509 : SID_ATTR_BORDER_INNER,SID_ATTR_BORDER_INNER, // [10023
510 : SID_ATTR_PAGE_SIZE,SID_ATTR_PAGE_SIZE, // [10051
511 : SID_ATTR_PAGE_ON,SID_ATTR_PAGE_SHARED, // [10060
512 : SID_ATTR_PAGE_SHARED_FIRST,SID_ATTR_PAGE_SHARED_FIRST,
513 4930 : 0, 0);
514 :
515 : //UUUU set correct parent to get the XFILL_NONE FillStyle as needed
516 4930 : aFooterSet.SetParent(&rMaster.GetDoc()->GetDfltFrmFmt()->GetAttrSet());
517 :
518 : // Dynamic or fixed height
519 9860 : SfxBoolItem aOn(SID_ATTR_PAGE_ON, true);
520 4930 : aFooterSet.Put(aOn);
521 :
522 4930 : const SwFmtFrmSize &rFrmSize = pFooterFmt->GetFrmSize();
523 4930 : const SwFrmSize eSizeType = rFrmSize.GetHeightSizeType();
524 9860 : SfxBoolItem aDynamic(SID_ATTR_PAGE_DYNAMIC, eSizeType != ATT_FIX_SIZE);
525 4930 : aFooterSet.Put(aDynamic);
526 :
527 : // Left equal right
528 9860 : SfxBoolItem aShared(SID_ATTR_PAGE_SHARED, rPageDesc.IsFooterShared());
529 4930 : aFooterSet.Put(aShared);
530 9860 : SfxBoolItem aFirstShared(SID_ATTR_PAGE_SHARED_FIRST, rPageDesc.IsFirstShared());
531 4930 : aFooterSet.Put(aFirstShared);
532 :
533 : // Size
534 9860 : SvxSizeItem aSize(SID_ATTR_PAGE_SIZE, Size(rFrmSize.GetSize()));
535 4930 : aFooterSet.Put(aSize);
536 :
537 : // Shifting Frame attributes
538 4930 : aFooterSet.Put(pFooterFmt->GetAttrSet());
539 4930 : aFooterSet.Put( aBoxInfo );
540 :
541 : // Create SetItem
542 9860 : SvxSetItem aSetItem(SID_ATTR_PAGE_FOOTERSET, aFooterSet);
543 9860 : rSet.Put(aSetItem);
544 : }
545 :
546 : // Integrate footnotes
547 26300 : SwPageFtnInfo& rInfo = (SwPageFtnInfo&)rPageDesc.GetFtnInfo();
548 52600 : SwPageFtnInfoItem aFtnItem(FN_PARAM_FTN_INFO, rInfo);
549 26300 : rSet.Put(aFtnItem);
550 :
551 : // Register compliant
552 26300 : const SwTxtFmtColl* pCol = rPageDesc.GetRegisterFmtColl();
553 52600 : SwRegisterItem aReg(pCol != 0);
554 26300 : aReg.SetWhich(SID_SWREGISTER_MODE);
555 26300 : rSet.Put(aReg);
556 26300 : if(pCol)
557 26300 : rSet.Put(SfxStringItem(SID_SWREGISTER_COLLECTION, pCol->GetName()));
558 :
559 26300 : }
560 :
561 : // Set DefaultTabs
562 :
563 0 : void MakeDefTabs(SwTwips nDefDist, SvxTabStopItem& rTabs)
564 : {
565 0 : if( rTabs.Count() )
566 0 : return;
567 : {
568 0 : SvxTabStop aSwTabStop( nDefDist, SVX_TAB_ADJUST_DEFAULT );
569 0 : rTabs.Insert( aSwTabStop );
570 : }
571 : }
572 :
573 : // Distance between two tabs
574 :
575 195 : SwTwips GetTabDist(const SvxTabStopItem& rTabs)
576 : {
577 195 : return rTabs.Count() ? rTabs[0].GetTabPos() : 1134; // 1134 = 2 cm
578 : }
579 :
580 : // Inquire if in the set is a Sfx-PageDesc combination present and return it.
581 0 : void SfxToSwPageDescAttr( const SwWrtShell& rShell, SfxItemSet& rSet )
582 : {
583 : const SfxPoolItem* pItem;
584 0 : SwFmtPageDesc aPgDesc;
585 :
586 0 : bool bChanged = false;
587 : // Page number
588 0 : if(SfxItemState::SET == rSet.GetItemState(SID_ATTR_PARA_PAGENUM, false, &pItem))
589 : {
590 0 : aPgDesc.SetNumOffset(((SfxUInt16Item*)pItem)->GetValue());
591 0 : bChanged = true;
592 : }
593 0 : if( SfxItemState::SET == rSet.GetItemState( SID_ATTR_PARA_MODEL, false, &pItem ))
594 : {
595 0 : const OUString& rDescName = ((SvxPageModelItem*)pItem)->GetValue();
596 0 : if( !rDescName.isEmpty() ) // No name -> disable PageDesc!
597 : {
598 : // Delete only, if PageDesc will be enabled!
599 0 : rSet.ClearItem( RES_BREAK );
600 : SwPageDesc* pDesc = ((SwWrtShell&)rShell).FindPageDescByName(
601 0 : rDescName, true );
602 0 : if( pDesc )
603 0 : aPgDesc.RegisterToPageDesc( *pDesc );
604 : }
605 0 : rSet.ClearItem( SID_ATTR_PARA_MODEL );
606 0 : bChanged = true;
607 : }
608 : else
609 : {
610 0 : SfxItemSet aCoreSet(rShell.GetView().GetPool(), RES_PAGEDESC, RES_PAGEDESC );
611 0 : rShell.GetCurAttr( aCoreSet );
612 0 : if(SfxItemState::SET == aCoreSet.GetItemState( RES_PAGEDESC, true, &pItem ) )
613 : {
614 0 : if( ((SwFmtPageDesc*)pItem)->GetPageDesc() )
615 : {
616 0 : aPgDesc.RegisterToPageDesc( *((SwFmtPageDesc*)pItem)->GetPageDesc() );
617 : }
618 0 : }
619 : }
620 :
621 0 : if(bChanged)
622 0 : rSet.Put( aPgDesc );
623 0 : }
624 :
625 : // Inquire if in the set is a Sfx-PageDesc combination present and return it.
626 0 : void SwToSfxPageDescAttr( SfxItemSet& rCoreSet )
627 : {
628 0 : const SfxPoolItem* pItem = 0;
629 0 : OUString aName;
630 0 : ::boost::optional<sal_uInt16> oNumOffset;
631 0 : bool bPut = true;
632 0 : switch( rCoreSet.GetItemState( RES_PAGEDESC, true, &pItem ) )
633 : {
634 : case SfxItemState::SET:
635 : {
636 0 : if( ((SwFmtPageDesc*)pItem)->GetPageDesc() )
637 : {
638 0 : aName = ((SwFmtPageDesc*)pItem)->GetPageDesc()->GetName();
639 0 : oNumOffset = ((SwFmtPageDesc*)pItem)->GetNumOffset();
640 : }
641 0 : rCoreSet.ClearItem( RES_PAGEDESC );
642 : // Page number
643 : }
644 0 : break;
645 :
646 : case SfxItemState::DEFAULT:
647 0 : break;
648 :
649 : default:
650 0 : bPut = false;
651 : }
652 :
653 : // TODO for now always pass a page number to cui, it can't make a
654 : // difference between 0 and no page number at the moment.
655 : {
656 0 : SfxUInt16Item aPageNum( SID_ATTR_PARA_PAGENUM, oNumOffset ? oNumOffset.get() : 0 );
657 0 : rCoreSet.Put( aPageNum );
658 : }
659 :
660 0 : if(bPut)
661 0 : rCoreSet.Put( SvxPageModelItem( aName, true, SID_ATTR_PARA_MODEL ) );
662 0 : }
663 :
664 : // Determine metric
665 :
666 175 : FieldUnit GetDfltMetric(bool bWeb)
667 : {
668 175 : return SW_MOD()->GetUsrPref(bWeb)->GetMetric();
669 : }
670 :
671 : // Determine metric
672 :
673 0 : void SetDfltMetric( FieldUnit eMetric, bool bWeb )
674 : {
675 0 : SW_MOD()->ApplyUserMetric(eMetric, bWeb);
676 0 : }
677 :
678 0 : sal_Int32 InsertStringSorted(const OUString& rEntry, ListBox& rToFill, sal_Int32 nOffset )
679 : {
680 0 : CollatorWrapper& rCaseColl = ::GetAppCaseCollator();
681 0 : const sal_Int32 nCount = rToFill.GetEntryCount();
682 0 : while (nOffset < nCount)
683 : {
684 0 : if( 0 < rCaseColl.compareString( rToFill.GetEntry(nOffset), rEntry ))
685 0 : break;
686 0 : ++nOffset;
687 : }
688 0 : return rToFill.InsertEntry(rEntry, nOffset);
689 : }
690 :
691 0 : void FillCharStyleListBox(ListBox& rToFill, SwDocShell* pDocSh, bool bSorted, bool bWithDefault)
692 : {
693 0 : const sal_Int32 nOffset = rToFill.GetEntryCount() > 0 ? 1 : 0;
694 0 : SfxStyleSheetBasePool* pPool = pDocSh->GetStyleSheetPool();
695 0 : pPool->SetSearchMask(SFX_STYLE_FAMILY_CHAR, SFXSTYLEBIT_ALL);
696 0 : SwDoc* pDoc = pDocSh->GetDoc();
697 0 : const SfxStyleSheetBase* pBase = pPool->First();
698 0 : OUString sStandard;
699 0 : SwStyleNameMapper::FillUIName( RES_POOLCOLL_STANDARD, sStandard );
700 0 : while(pBase)
701 : {
702 0 : if(bWithDefault || pBase->GetName() != sStandard)
703 : {
704 : const sal_Int32 nPos = bSorted
705 0 : ? InsertStringSorted(pBase->GetName(), rToFill, nOffset )
706 0 : : rToFill.InsertEntry(pBase->GetName());
707 0 : sal_IntPtr nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( pBase->GetName(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
708 0 : rToFill.SetEntryData( nPos, (void*) (nPoolId));
709 : }
710 0 : pBase = pPool->Next();
711 : }
712 : // non-pool styles
713 0 : const SwCharFmts* pFmts = pDoc->GetCharFmts();
714 0 : for(size_t i = 0; i < pFmts->size(); ++i)
715 : {
716 0 : const SwCharFmt* pFmt = (*pFmts)[i];
717 0 : if(pFmt->IsDefault())
718 0 : continue;
719 0 : const OUString& rName = pFmt->GetName();
720 0 : if(rToFill.GetEntryPos(rName) == LISTBOX_ENTRY_NOTFOUND)
721 : {
722 : const sal_Int32 nPos = bSorted
723 : ? InsertStringSorted(rName, rToFill, nOffset )
724 0 : : rToFill.InsertEntry(rName);
725 0 : sal_IntPtr nPoolId = USHRT_MAX;
726 0 : rToFill.SetEntryData( nPos, (void*) (nPoolId));
727 : }
728 0 : }
729 0 : };
730 :
731 0 : SwTwips GetTableWidth( SwFrmFmt* pFmt, SwTabCols& rCols, sal_uInt16 *pPercent,
732 : SwWrtShell* pSh )
733 : {
734 : // To get the width is slightly more complicated.
735 0 : SwTwips nWidth = 0;
736 0 : const sal_Int16 eOri = pFmt->GetHoriOrient().GetHoriOrient();
737 0 : switch(eOri)
738 : {
739 0 : case text::HoriOrientation::FULL: nWidth = rCols.GetRight(); break;
740 : case text::HoriOrientation::LEFT_AND_WIDTH:
741 : case text::HoriOrientation::LEFT:
742 : case text::HoriOrientation::RIGHT:
743 : case text::HoriOrientation::CENTER:
744 0 : nWidth = pFmt->GetFrmSize().GetWidth();
745 0 : break;
746 : default:
747 : {
748 0 : if(pSh)
749 : {
750 0 : if ( 0 == pSh->GetFlyFrmFmt() )
751 : {
752 0 : nWidth = pSh->GetAnyCurRect(RECT_PAGE_PRT).Width();
753 : }
754 : else
755 : {
756 0 : nWidth = pSh->GetAnyCurRect(RECT_FLY_PRT_EMBEDDED).Width();
757 : }
758 : }
759 : else
760 : {
761 : OSL_FAIL("where to get the actual width from?");
762 : }
763 0 : const SvxLRSpaceItem& rLRSpace = pFmt->GetLRSpace();
764 0 : nWidth -= (rLRSpace.GetRight() + rLRSpace.GetLeft());
765 : }
766 : }
767 0 : if (pPercent)
768 0 : *pPercent = pFmt->GetFrmSize().GetWidthPercent();
769 0 : return nWidth;
770 : }
771 :
772 0 : OUString GetAppLangDateTimeString( const DateTime& rDT )
773 : {
774 0 : const SvtSysLocale aSysLocale;
775 0 : const LocaleDataWrapper& rAppLclData = aSysLocale.GetLocaleData();
776 0 : OUString sRet = rAppLclData.getDate( rDT ) + " " + rAppLclData.getTime( rDT, false, false );
777 0 : return sRet;
778 : }
779 :
780 : // Add a new function which can get and set the current "SID_ATTR_APPLYCHARUNIT" value
781 :
782 0 : bool HasCharUnit( bool bWeb)
783 : {
784 0 : return SW_MOD()->GetUsrPref(bWeb)->IsApplyCharUnit();
785 : }
786 :
787 0 : void SetApplyCharUnit(bool bApplyChar, bool bWeb)
788 : {
789 0 : SW_MOD()->ApplyUserCharUnit(bApplyChar, bWeb);
790 0 : }
791 :
792 0 : bool ExecuteMenuCommand( PopupMenu& rMenu, SfxViewFrame& rViewFrame, sal_uInt16 nId )
793 : {
794 0 : bool bRet = false;
795 0 : const sal_uInt16 nItemCount = rMenu.GetItemCount();
796 0 : OUString sCommand;
797 0 : for( sal_uInt16 nItem = 0; nItem < nItemCount; ++nItem)
798 : {
799 0 : PopupMenu* pPopup = rMenu.GetPopupMenu( rMenu.GetItemId( nItem ) );
800 0 : if(pPopup)
801 : {
802 0 : sCommand = pPopup->GetItemCommand(nId);
803 0 : if(!sCommand.isEmpty())
804 0 : break;
805 : }
806 : }
807 0 : if(!sCommand.isEmpty())
808 : {
809 0 : uno::Reference< frame::XFrame > xFrame = rViewFrame.GetFrame().GetFrameInterface();
810 0 : uno::Reference < frame::XDispatchProvider > xProv( xFrame, uno::UNO_QUERY );
811 0 : util::URL aURL;
812 0 : aURL.Complete = sCommand;
813 0 : uno::Reference < util::XURLTransformer > xTrans( util::URLTransformer::create(::comphelper::getProcessComponentContext() ) );
814 0 : xTrans->parseStrict( aURL );
815 0 : uno::Reference< frame::XDispatch > xDisp = xProv->queryDispatch( aURL, OUString(), 0 );
816 0 : if( xDisp.is() )
817 : {
818 0 : uno::Sequence< beans::PropertyValue > aSeq;
819 0 : xDisp->dispatch( aURL, aSeq );
820 0 : bRet = true;
821 0 : }
822 : }
823 0 : return bRet;
824 270 : }
825 :
826 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|