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