xref: /trunk/main/sw/source/ui/utlui/uitool.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 
28 #include <hintids.hxx>
29 
30 #include <tools/datetime.hxx>
31 #include <vcl/svapp.hxx>
32 #include <unotools/collatorwrapper.hxx>
33 #include <svl/urihelper.hxx>
34 #include <svl/stritem.hxx>
35 #include <unotools/syslocale.hxx>
36 #include <sfx2/app.hxx>
37 #include <sfx2/docfile.hxx>
38 #include <sfx2/docfilt.hxx>
39 #include <editeng/pmdlitem.hxx>
40 #ifndef _SVX_TSTPITEM_HXX //autogen
41 #include <editeng/tstpitem.hxx>
42 #endif
43 #include <editeng/boxitem.hxx>
44 #include <editeng/sizeitem.hxx>
45 #include <svx/pageitem.hxx>
46 #include <editeng/lrspitem.hxx>
47 #include <svl/style.hxx>
48 #ifndef _VCL_LSTBOX_HXX //autogen
49 #include <vcl/lstbox.hxx>
50 #endif
51 #include <unotools/localedatawrapper.hxx>
52 #include <com/sun/star/frame/XDispatch.hpp>
53 #include <com/sun/star/frame/XDispatchProvider.hpp>
54 #include <com/sun/star/util/XURLTransformer.hpp>
55 #include <comphelper/processfactory.hxx>
56 #include <sfx2/viewfrm.hxx>
57 #include <fmtornt.hxx>
58 #include <tabcol.hxx>
59 #include <edtwin.hxx>
60 #include <fmtfsize.hxx>
61 #include <fmthdft.hxx>
62 #include <fmtpdsc.hxx>
63 #include <wview.hxx>
64 #include <uiitems.hxx>
65 #ifndef _DOCSH_HXX
66 #include <docsh.hxx>
67 #endif
68 #include <wrtsh.hxx>
69 #include <swmodule.hxx>
70 #ifndef _VIEW_HXX
71 #include <view.hxx>
72 #endif
73 #include <uitool.hxx>
74 #include <frmatr.hxx>
75 #include <paratr.hxx>
76 #include <fmtcol.hxx>
77 #include <poolfmt.hxx>
78 #include "usrpref.hxx"
79 
80 #ifndef _ERROR_H
81 #include <error.h>
82 #endif
83 #ifndef _CMDID_H
84 #include <cmdid.h>
85 #endif
86 #ifndef _GLOBALS_HRC
87 #include <globals.hrc>
88 #endif
89 #ifndef _UTLUI_HRC
90 #include <utlui.hrc>
91 #endif
92 #include <doc.hxx>
93 #include <docary.hxx>
94 #include <charfmt.hxx>
95 #include <SwStyleNameMapper.hxx>
96 // 50 cm 28350
97 //
98 #define MAXHEIGHT 28350
99 #define MAXWIDTH  28350
100 
101 using namespace ::com::sun::star;
102 /*--------------------------------------------------------------------
103     Beschreibung: Allgemeine List von StringPointern
104  --------------------------------------------------------------------*/
105 
106 
107 /*--------------------------------------------------------------------
108     Beschreibung: Metric umschalten
109  --------------------------------------------------------------------*/
110 
111 
SetMetric(MetricFormatter & rCtrl,FieldUnit eUnit)112 void SetMetric(MetricFormatter& rCtrl, FieldUnit eUnit)
113 {
114     SwTwips nMin = static_cast< SwTwips >(rCtrl.GetMin(FUNIT_TWIP));
115     SwTwips nMax = static_cast< SwTwips >(rCtrl.GetMax(FUNIT_TWIP));
116 
117     rCtrl.SetUnit(eUnit);
118 
119     rCtrl.SetMin(nMin, FUNIT_TWIP);
120     rCtrl.SetMax(nMax, FUNIT_TWIP);
121 }
122 
123 /*--------------------------------------------------------------------
124     Beschreibung:   Boxinfo-Attribut setzen
125  --------------------------------------------------------------------*/
126 
127 
PrepareBoxInfo(SfxItemSet & rSet,const SwWrtShell & rSh)128 void PrepareBoxInfo(SfxItemSet& rSet, const SwWrtShell& rSh)
129 {
130     SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
131     const SfxPoolItem *pBoxInfo;
132     if ( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BORDER_INNER,
133                                         sal_True, &pBoxInfo))
134         aBoxInfo = *(SvxBoxInfoItem*)pBoxInfo;
135 
136         // Tabellenvariante, wenn mehrere Tabellenzellen selektiert
137     rSh.GetCrsr();                  //Damit GetCrsrCnt() auch das Richtige liefert
138     aBoxInfo.SetTable          (rSh.IsTableMode() && rSh.GetCrsrCnt() > 1);
139         // Abstandsfeld immer anzeigen
140     aBoxInfo.SetDist           ((sal_Bool) sal_True);
141         // Minimalgroesse in Tabellen und Absaetzen setzen
142     aBoxInfo.SetMinDist        (rSh.IsTableMode() || rSh.GetSelectionType() & (nsSelectionType::SEL_TXT | nsSelectionType::SEL_TBL));
143         // Default-Abstand immer setzen
144     aBoxInfo.SetDefDist        (MIN_BORDER_DIST);
145         // Einzelne Linien koennen nur in Tabellen DontCare-Status haben
146     aBoxInfo.SetValid(VALID_DISABLE, !rSh.IsTableMode());
147 
148     rSet.Put(aBoxInfo);
149 }
150 
151 /*--------------------------------------------------------------------
152     Beschreibung:   Header Footer fuellen
153  --------------------------------------------------------------------*/
154 
155 
FillHdFt(SwFrmFmt * pFmt,const SfxItemSet & rSet)156 void FillHdFt(SwFrmFmt* pFmt, const  SfxItemSet& rSet)
157 {
158     SwAttrSet aSet(pFmt->GetAttrSet());
159     aSet.Put(rSet);
160 
161     const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get(SID_ATTR_PAGE_SIZE);
162     const SfxBoolItem& rDynamic = (const SfxBoolItem&)rSet.Get(SID_ATTR_PAGE_DYNAMIC);
163 
164     // Groesse umsetzen
165     //
166     SwFmtFrmSize aFrmSize(rDynamic.GetValue() ? ATT_MIN_SIZE : ATT_FIX_SIZE,
167                             rSize.GetSize().Width(),
168                             rSize.GetSize().Height());
169     aSet.Put(aFrmSize);
170     pFmt->SetFmtAttr(aSet);
171 }
172 
173 /*--------------------------------------------------------------------
174     Beschreibung:   PageDesc <-> in Sets wandeln und zurueck
175  --------------------------------------------------------------------*/
176 
177 
ItemSetToPageDesc(const SfxItemSet & rSet,SwPageDesc & rPageDesc)178 void ItemSetToPageDesc( const SfxItemSet& rSet, SwPageDesc& rPageDesc )
179 {
180     SwFrmFmt& rMaster = rPageDesc.GetMaster();
181 
182     // alle allgemeinen Rahmen-Attribute uebertragen
183     //
184     rMaster.SetFmtAttr(rSet);
185 
186     // PageData
187     //
188     if(rSet.GetItemState(SID_ATTR_PAGE) == SFX_ITEM_SET)
189     {
190         const SvxPageItem& rPageItem = (const SvxPageItem&)rSet.Get(SID_ATTR_PAGE);
191 
192         sal_uInt16 nUse = (sal_uInt16)rPageItem.GetPageUsage();
193         if(nUse & 0x04)
194             nUse |= 0x03;
195         if(nUse)
196             rPageDesc.SetUseOn( (UseOnPage) nUse );
197         rPageDesc.SetLandscape(rPageItem.IsLandscape());
198         SvxNumberType aNumType;
199         aNumType.SetNumberingType( static_cast< sal_Int16 >(rPageItem.GetNumType()) );
200         rPageDesc.SetNumType(aNumType);
201     }
202     // Groesse
203     //
204     if(rSet.GetItemState(SID_ATTR_PAGE_SIZE) == SFX_ITEM_SET)
205     {
206         const SvxSizeItem& rSizeItem = (const SvxSizeItem&)rSet.Get(SID_ATTR_PAGE_SIZE);
207         SwFmtFrmSize aSize(ATT_FIX_SIZE);
208         aSize.SetSize(rSizeItem.GetSize());
209         rMaster.SetFmtAttr(aSize);
210     }
211     // Kopzeilen-Attribute auswerten
212     //
213     const SfxPoolItem* pItem;
214     if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_PAGE_HEADERSET,
215             sal_False, &pItem ) )
216     {
217         const SfxItemSet& rHeaderSet = ((SvxSetItem*)pItem)->GetItemSet();
218         const SfxBoolItem& rHeaderOn = (const SfxBoolItem&)rHeaderSet.Get(SID_ATTR_PAGE_ON);
219 
220         if(rHeaderOn.GetValue())
221         {
222             // Werte uebernehmen
223             if(!rMaster.GetHeader().IsActive())
224                 rMaster.SetFmtAttr(SwFmtHeader(sal_True));
225 
226             // Das Headerformat rausholen und anpassen
227             //
228             SwFmtHeader aHeaderFmt(rMaster.GetHeader());
229             SwFrmFmt *pHeaderFmt = aHeaderFmt.GetHeaderFmt();
230             ASSERT(pHeaderFmt != 0, "kein HeaderFormat");
231 
232             ::FillHdFt(pHeaderFmt, rHeaderSet);
233 
234             rPageDesc.ChgHeaderShare(((const SfxBoolItem&)
235                         rHeaderSet.Get(SID_ATTR_PAGE_SHARED)).GetValue());
236         }
237         else
238         {   // Header ausschalten
239             //
240             if(rMaster.GetHeader().IsActive())
241             {
242                 rMaster.SetFmtAttr(SwFmtHeader(sal_Bool(sal_False)));
243                 rPageDesc.ChgHeaderShare(sal_False);
244             }
245         }
246     }
247 
248     // Fusszeilen-Attribute auswerten
249     //
250     if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_PAGE_FOOTERSET,
251             sal_False, &pItem ) )
252     {
253         const SfxItemSet& rFooterSet = ((SvxSetItem*)pItem)->GetItemSet();
254         const SfxBoolItem& rFooterOn = (const SfxBoolItem&)rFooterSet.Get(SID_ATTR_PAGE_ON);
255 
256         if(rFooterOn.GetValue())
257         {
258             // Werte uebernehmen
259             if(!rMaster.GetFooter().IsActive())
260                 rMaster.SetFmtAttr(SwFmtFooter(sal_True));
261 
262             // Das Footerformat rausholen und anpassen
263             //
264             SwFmtFooter aFooterFmt(rMaster.GetFooter());
265             SwFrmFmt *pFooterFmt = aFooterFmt.GetFooterFmt();
266             ASSERT(pFooterFmt != 0, "kein FooterFormat");
267 
268             ::FillHdFt(pFooterFmt, rFooterSet);
269 
270             rPageDesc.ChgFooterShare(((const SfxBoolItem&)
271                         rFooterSet.Get(SID_ATTR_PAGE_SHARED)).GetValue());
272         }
273         else
274         {   // Footer ausschalten
275             //
276             if(rMaster.GetFooter().IsActive())
277             {
278                 rMaster.SetFmtAttr(SwFmtFooter(sal_Bool(sal_False)));
279                 rPageDesc.ChgFooterShare(sal_False);
280             }
281         }
282     }
283 
284     // Fussnoten
285     //
286     if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_FTN_INFO,
287             sal_False, &pItem ) )
288         rPageDesc.SetFtnInfo( ((SwPageFtnInfoItem*)pItem)->GetPageFtnInfo() );
289 
290 
291     //
292     // Columns
293     //
294 
295     // Registerhaltigkeit
296 
297     if(SFX_ITEM_SET == rSet.GetItemState(
298                             SID_SWREGISTER_MODE, sal_False, &pItem))
299     {
300         sal_Bool bSet = ((const SfxBoolItem*)pItem)->GetValue();
301         if(!bSet)
302             rPageDesc.SetRegisterFmtColl(0);
303         else if(SFX_ITEM_SET == rSet.GetItemState(
304                                 SID_SWREGISTER_COLLECTION, sal_False, &pItem))
305         {
306             const String& rColl = ((const SfxStringItem*)pItem)->GetValue();
307             SwDoc& rDoc = *rMaster.GetDoc();
308             SwTxtFmtColl* pColl = rDoc.FindTxtFmtCollByName( rColl );
309             if( !pColl )
310             {
311                 sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( rColl, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
312                 if( USHRT_MAX != nId )
313                     pColl = rDoc.GetTxtCollFromPool( nId );
314                 else
315                     pColl = rDoc.MakeTxtFmtColl( rColl,
316                                 (SwTxtFmtColl*)rDoc.GetDfltTxtFmtColl() );
317             }
318             if( pColl )
319                 pColl->SetFmtAttr( SwRegisterItem ( sal_True ));
320             rPageDesc.SetRegisterFmtColl( pColl );
321         }
322     }
323 }
324 
325 /*--------------------------------------------------------------------
326     Beschreibung:
327  --------------------------------------------------------------------*/
328 
329 
PageDescToItemSet(const SwPageDesc & rPageDesc,SfxItemSet & rSet)330 void PageDescToItemSet( const SwPageDesc& rPageDesc, SfxItemSet& rSet)
331 {
332     const SwFrmFmt& rMaster = rPageDesc.GetMaster();
333 
334     // Seitendaten
335     //
336     SvxPageItem aPageItem(SID_ATTR_PAGE);
337     aPageItem.SetDescName(rPageDesc.GetName());
338     aPageItem.SetPageUsage(rPageDesc.GetUseOn());
339     aPageItem.SetLandscape(rPageDesc.GetLandscape());
340     aPageItem.SetNumType((SvxNumType)rPageDesc.GetNumType().GetNumberingType());
341     rSet.Put(aPageItem);
342 
343     // Groesse
344     SvxSizeItem aSizeItem(SID_ATTR_PAGE_SIZE, rMaster.GetFrmSize().GetSize());
345     rSet.Put(aSizeItem);
346 
347     // Maximale Groesse
348     SvxSizeItem aMaxSizeItem(SID_ATTR_PAGE_MAXSIZE, Size(MAXWIDTH, MAXHEIGHT));
349     rSet.Put(aMaxSizeItem);
350 
351     // Raender, Umrandung und das andere Zeug
352     //
353     rSet.Put(rMaster.GetAttrSet());
354 
355     SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
356     const SfxPoolItem *pBoxInfo;
357     if ( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BORDER_INNER,
358                                             sal_True, &pBoxInfo) )
359         aBoxInfo = *(SvxBoxInfoItem*)pBoxInfo;
360 
361     aBoxInfo.SetTable( sal_False );
362         // Abstandsfeld immer anzeigen
363     aBoxInfo.SetDist( sal_True);
364         // Minimalgroesse in Tabellen und Absaetzen setzen
365     aBoxInfo.SetMinDist( sal_False );
366     // Default-Abstand immer setzen
367     aBoxInfo.SetDefDist( MIN_BORDER_DIST );
368         // Einzelne Linien koennen nur in Tabellen DontCare-Status haben
369     aBoxInfo.SetValid( VALID_DISABLE );
370     rSet.Put( aBoxInfo );
371 
372 
373     SfxStringItem aFollow(SID_ATTR_PAGE_EXT1, aEmptyStr);
374     if(rPageDesc.GetFollow())
375         aFollow.SetValue(rPageDesc.GetFollow()->GetName());
376     rSet.Put(aFollow);
377 
378     // Header
379     //
380     if(rMaster.GetHeader().IsActive())
381     {
382         const SwFmtHeader &rHeaderFmt = rMaster.GetHeader();
383         const SwFrmFmt *pHeaderFmt = rHeaderFmt.GetHeaderFmt();
384         ASSERT(pHeaderFmt != 0, kein HeaderFormat.);
385 
386         // HeaderInfo, Raender, Hintergrund, Umrandung
387         //
388         SfxItemSet aHeaderSet(*rSet.GetPool(),
389             RES_FRMATR_BEGIN,RES_FRMATR_END - 1,            // [82
390 
391             //UUUU FillAttribute support
392             XATTR_FILL_FIRST, XATTR_FILL_LAST,              // [1014
393 
394             SID_ATTR_BORDER_INNER,SID_ATTR_BORDER_INNER,    // [10023
395             SID_ATTR_PAGE_SIZE,SID_ATTR_PAGE_SIZE,          // [10051
396             SID_ATTR_PAGE_ON,SID_ATTR_PAGE_SHARED,          // [10060
397             0, 0);
398 
399         //UUUU set correct parent to get the XFILL_NONE FillStyle as needed
400         aHeaderSet.SetParent(&rMaster.GetDoc()->GetDfltFrmFmt()->GetAttrSet());
401 
402         // dynamische oder feste Hoehe
403         //
404         SfxBoolItem aOn(SID_ATTR_PAGE_ON, sal_True);
405         aHeaderSet.Put(aOn);
406 
407         const SwFmtFrmSize &rFrmSize = pHeaderFmt->GetFrmSize();
408         const SwFrmSize eSizeType = rFrmSize.GetHeightSizeType();
409         SfxBoolItem aDynamic(SID_ATTR_PAGE_DYNAMIC, eSizeType != ATT_FIX_SIZE);
410         aHeaderSet.Put(aDynamic);
411 
412         // Links gleich rechts
413         //
414         SfxBoolItem aShared(SID_ATTR_PAGE_SHARED, rPageDesc.IsHeaderShared());
415         aHeaderSet.Put(aShared);
416 
417         // Groesse
418         SvxSizeItem aSize(SID_ATTR_PAGE_SIZE, Size(rFrmSize.GetSize()));
419         aHeaderSet.Put(aSize);
420 
421         // Rahmen-Attribute umschaufeln
422         //
423         aHeaderSet.Put(pHeaderFmt->GetAttrSet());
424         aHeaderSet.Put( aBoxInfo );
425 
426         // SetItem erzeugen
427         //
428         SvxSetItem aSetItem(SID_ATTR_PAGE_HEADERSET, aHeaderSet);
429         rSet.Put(aSetItem);
430     }
431 
432     // Footer
433     if(rMaster.GetFooter().IsActive())
434     {
435         const SwFmtFooter &rFooterFmt = rMaster.GetFooter();
436         const SwFrmFmt *pFooterFmt = rFooterFmt.GetFooterFmt();
437         ASSERT(pFooterFmt != 0, kein FooterFormat.);
438 
439         // FooterInfo, Raender, Hintergrund, Umrandung
440         //
441         SfxItemSet aFooterSet(*rSet.GetPool(),
442             RES_FRMATR_BEGIN,RES_FRMATR_END - 1,            // [82
443 
444             //UUUU FillAttribute support
445             XATTR_FILL_FIRST, XATTR_FILL_LAST,              // [1014
446 
447             SID_ATTR_BORDER_INNER,SID_ATTR_BORDER_INNER,    // [10023
448             SID_ATTR_PAGE_SIZE,SID_ATTR_PAGE_SIZE,          // [10051
449             SID_ATTR_PAGE_ON,SID_ATTR_PAGE_SHARED,          // [10060
450             0, 0);
451 
452         //UUUU set correct parent to get the XFILL_NONE FillStyle as needed
453         aFooterSet.SetParent(&rMaster.GetDoc()->GetDfltFrmFmt()->GetAttrSet());
454 
455         // dynamische oder feste Hoehe
456         //
457         SfxBoolItem aOn(SID_ATTR_PAGE_ON, sal_True);
458         aFooterSet.Put(aOn);
459 
460         const SwFmtFrmSize &rFrmSize = pFooterFmt->GetFrmSize();
461         const SwFrmSize eSizeType = rFrmSize.GetHeightSizeType();
462         SfxBoolItem aDynamic(SID_ATTR_PAGE_DYNAMIC, eSizeType != ATT_FIX_SIZE);
463         aFooterSet.Put(aDynamic);
464 
465         // Links gleich rechts
466         //
467         SfxBoolItem aShared(SID_ATTR_PAGE_SHARED, rPageDesc.IsFooterShared());
468         aFooterSet.Put(aShared);
469 
470         // Groesse
471         SvxSizeItem aSize(SID_ATTR_PAGE_SIZE, Size(rFrmSize.GetSize()));
472         aFooterSet.Put(aSize);
473 
474         // Rahmen-Attribute umschaufeln
475         //
476         aFooterSet.Put(pFooterFmt->GetAttrSet());
477         aFooterSet.Put( aBoxInfo );
478 
479         // SetItem erzeugen
480         //
481         SvxSetItem aSetItem(SID_ATTR_PAGE_FOOTERSET, aFooterSet);
482         rSet.Put(aSetItem);
483     }
484 
485     // Fussnoten einbauen
486     //
487     SwPageFtnInfo& rInfo = (SwPageFtnInfo&)rPageDesc.GetFtnInfo();
488     SwPageFtnInfoItem aFtnItem(FN_PARAM_FTN_INFO, rInfo);
489     rSet.Put(aFtnItem);
490 
491     // Registerhaltigkeit
492 
493     const SwTxtFmtColl* pCol = rPageDesc.GetRegisterFmtColl();
494     SwRegisterItem aReg(pCol != 0);
495     aReg.SetWhich(SID_SWREGISTER_MODE);
496     rSet.Put(aReg);
497     if(pCol)
498         rSet.Put(SfxStringItem(SID_SWREGISTER_COLLECTION, pCol->GetName()));
499 
500 }
501 
502 
503 /*--------------------------------------------------------------------
504     Beschreibung:   DefaultTabs setzen
505  --------------------------------------------------------------------*/
506 
507 
MakeDefTabs(SwTwips nDefDist,SvxTabStopItem & rTabs)508 void MakeDefTabs(SwTwips nDefDist, SvxTabStopItem& rTabs)
509 {
510     if( rTabs.Count() )
511         return;
512     {
513         SvxTabStop aSwTabStop( nDefDist, SVX_TAB_ADJUST_DEFAULT );
514         rTabs.Insert( aSwTabStop );
515     }
516 }
517 
518 /*--------------------------------------------------------------------
519     Beschreibung:   Abstand zwischen zwei Tabs
520  --------------------------------------------------------------------*/
521 
522 
GetTabDist(const SvxTabStopItem & rTabs)523 sal_uInt16 GetTabDist(const SvxTabStopItem& rTabs)
524 {
525     sal_uInt16 nDefDist;
526     if( rTabs.Count() )
527         nDefDist = (sal_uInt16)( rTabs[0].GetTabPos() );
528     else
529         nDefDist = 1134;     // 2cm
530     return nDefDist;
531 }
532 
533 
534 // erfrage ob im Set eine Sfx-PageDesc-Kombination vorliegt und returne diese
SfxToSwPageDescAttr(const SwWrtShell & rShell,SfxItemSet & rSet)535 void SfxToSwPageDescAttr( const SwWrtShell& rShell, SfxItemSet& rSet )
536 {
537     const SfxPoolItem* pItem;
538     SwFmtPageDesc aPgDesc;
539 
540     sal_Bool bChanged = sal_False;
541     // Seitennummer
542     if(SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_PARA_PAGENUM, sal_False, &pItem))
543     {
544         aPgDesc.SetNumOffset(((SfxUInt16Item*)pItem)->GetValue());
545         bChanged = sal_True;
546     }
547     if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_PARA_MODEL, sal_False, &pItem ))
548     {
549         const String& rDescName = ((SvxPageModelItem*)pItem)->GetValue();
550         if( rDescName.Len() )   // kein Name -> PageDesc ausschalten!
551         {
552             // nur loeschen, wenn PageDesc eingschaltet wird!
553             rSet.ClearItem( RES_BREAK );
554             SwPageDesc* pDesc = ((SwWrtShell&)rShell).FindPageDescByName(
555                                                     rDescName, sal_True );
556             if( pDesc )
557                 aPgDesc.RegisterToPageDesc( *pDesc );
558         }
559         rSet.ClearItem( SID_ATTR_PARA_MODEL );
560         bChanged = sal_True;
561     }
562     else
563     {
564         SfxItemSet aCoreSet(rShell.GetView().GetPool(), RES_PAGEDESC, RES_PAGEDESC );
565         rShell.GetCurAttr( aCoreSet );
566         if(SFX_ITEM_SET == aCoreSet.GetItemState( RES_PAGEDESC, sal_True, &pItem ) )
567         {
568             if( ((SwFmtPageDesc*)pItem)->GetPageDesc() )
569             {
570                 aPgDesc.RegisterToPageDesc( *((SwFmtPageDesc*)pItem)->GetPageDesc() );
571             }
572         }
573     }
574 
575 
576     if(bChanged)
577         rSet.Put( aPgDesc );
578 }
579 
580 
581 // erfrage ob im Set eine Sfx-PageDesc-Kombination vorliegt und returne diese
SwToSfxPageDescAttr(SfxItemSet & rCoreSet)582 void SwToSfxPageDescAttr( SfxItemSet& rCoreSet )
583 {
584     const SfxPoolItem* pItem = 0;
585     String aName;
586     sal_uInt16 nPageNum = 0;
587     sal_Bool bPut = sal_True;
588     switch( rCoreSet.GetItemState( RES_PAGEDESC, sal_True, &pItem ) )
589     {
590     case SFX_ITEM_SET:
591         {
592             if( ((SwFmtPageDesc*)pItem)->GetPageDesc() )
593             {
594                 aName = ((SwFmtPageDesc*)pItem)->GetPageDesc()->GetName();
595                 nPageNum = ((SwFmtPageDesc*)pItem)->GetNumOffset();
596             }
597             rCoreSet.ClearItem( RES_PAGEDESC );
598             // Seitennummer
599         }
600         break;
601 
602     case SFX_ITEM_AVAILABLE:
603         break;
604 
605     default:
606         bPut = sal_False;
607     }
608     SfxUInt16Item aPageNum( SID_ATTR_PARA_PAGENUM, nPageNum );
609     rCoreSet.Put( aPageNum );
610 
611     if(bPut)
612         rCoreSet.Put( SvxPageModelItem( aName, sal_True, SID_ATTR_PARA_MODEL ) );
613 }
614 
615 /*--------------------------------------------------------------------
616     Beschreibung:   Metric ermitteln
617  --------------------------------------------------------------------*/
618 
619 
GetDfltMetric(sal_Bool bWeb)620 FieldUnit   GetDfltMetric(sal_Bool bWeb)
621 {
622     return SW_MOD()->GetUsrPref(bWeb)->GetMetric();
623 }
624 
625 /*--------------------------------------------------------------------
626     Beschreibung:   Metric ermitteln
627  --------------------------------------------------------------------*/
628 
629 
SetDfltMetric(FieldUnit eMetric,sal_Bool bWeb)630 void    SetDfltMetric( FieldUnit eMetric, sal_Bool bWeb )
631 {
632     SW_MOD()->ApplyUserMetric(eMetric, bWeb);
633 }
634 
635 /*-----------------09.04.98 16:58-------------------
636 
637 --------------------------------------------------*/
InsertStringSorted(const String & rEntry,ListBox & rToFill,sal_uInt16 nOffset)638 sal_uInt16 InsertStringSorted(const String& rEntry, ListBox& rToFill, sal_uInt16 nOffset )
639 {
640     sal_uInt16 i = nOffset;
641     CollatorWrapper& rCaseColl = ::GetAppCaseCollator();
642 
643     for( ; i < rToFill.GetEntryCount(); i++ )
644     {
645         if( 0 < rCaseColl.compareString( rToFill.GetEntry(i), rEntry ))
646             break;
647     }
648     return rToFill.InsertEntry(rEntry, i);
649 }
FillCharStyleListBox(ListBox & rToFill,SwDocShell * pDocSh,sal_Bool bSorted,sal_Bool bWithDefault)650 void FillCharStyleListBox(ListBox& rToFill, SwDocShell* pDocSh, sal_Bool bSorted, sal_Bool bWithDefault)
651 {
652     sal_Bool bHasOffset = rToFill.GetEntryCount() > 0;
653     SfxStyleSheetBasePool* pPool = pDocSh->GetStyleSheetPool();
654     pPool->SetSearchMask(SFX_STYLE_FAMILY_CHAR, SFXSTYLEBIT_ALL);
655     SwDoc* pDoc = pDocSh->GetDoc();
656     const SfxStyleSheetBase* pBase = pPool->First();
657     String sStandard;
658     SwStyleNameMapper::FillUIName( RES_POOLCOLL_STANDARD, sStandard );
659     while(pBase)
660     {
661         if(bWithDefault || pBase->GetName() !=  sStandard)
662         {
663             sal_uInt16 nPos;
664             if(bSorted)
665                 nPos = InsertStringSorted(pBase->GetName(), rToFill, bHasOffset );
666             else
667                 nPos = rToFill.InsertEntry(pBase->GetName());
668             long nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( pBase->GetName(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
669             rToFill.SetEntryData( nPos, (void*) (nPoolId));
670         }
671         pBase = pPool->Next();
672     }
673     // non-pool styles
674     const SwCharFmts* pFmts = pDoc->GetCharFmts();
675     for(sal_uInt16 i = 0; i < pFmts->Count(); i++)
676     {
677         const SwCharFmt* pFmt = (*pFmts)[i];
678         if(pFmt->IsDefault())
679             continue;
680         const String& rName = pFmt->GetName();
681         if(rToFill.GetEntryPos(rName) == LISTBOX_ENTRY_NOTFOUND)
682         {
683             sal_uInt16 nPos;
684             if(bSorted)
685                 nPos = InsertStringSorted(rName, rToFill, bHasOffset );
686             else
687                 nPos = rToFill.InsertEntry(rName);
688             long nPoolId = USHRT_MAX;
689             rToFill.SetEntryData( nPos, (void*) (nPoolId));
690         }
691     }
692 };
693 
694 /* -----------------27.04.98 08:26-------------------
695  *
696  * --------------------------------------------------*/
GetTableWidth(SwFrmFmt * pFmt,SwTabCols & rCols,sal_uInt16 * pPercent,SwWrtShell * pSh)697 SwTwips GetTableWidth( SwFrmFmt* pFmt, SwTabCols& rCols, sal_uInt16 *pPercent,
698             SwWrtShell* pSh )
699 {
700     //Die Breite zu besorgen ist etwas komplizierter.
701     SwTwips nWidth = 0;
702     const sal_Int16 eOri = pFmt->GetHoriOrient().GetHoriOrient();
703     switch(eOri)
704     {
705         case text::HoriOrientation::FULL: nWidth = rCols.GetRight(); break;
706         case text::HoriOrientation::LEFT_AND_WIDTH:
707         case text::HoriOrientation::LEFT:
708         case text::HoriOrientation::RIGHT:
709         case text::HoriOrientation::CENTER:
710             nWidth = pFmt->GetFrmSize().GetWidth();
711         break;
712         default:
713         {
714             if(pSh)
715             {
716                 const SwFrmFmt *pFlyFmt;
717                 if ( 0 == (pFlyFmt = pSh->GetFlyFrmFmt()) )
718                 {
719                     nWidth = pSh->GetAnyCurRect(RECT_PAGE_PRT).Width();
720                 }
721                 else
722                 {
723                     nWidth = pSh->GetAnyCurRect(RECT_FLY_PRT_EMBEDDED).Width();
724                 }
725             }
726             else
727             {
728                 DBG_ERROR("wo soll die Breite denn herkommen?");
729             }
730             const SvxLRSpaceItem& rLRSpace = pFmt->GetLRSpace();
731             nWidth -= (rLRSpace.GetRight() + rLRSpace.GetLeft());
732         }
733     }
734     if (pPercent)
735         *pPercent = pFmt->GetFrmSize().GetWidthPercent();
736     return nWidth;
737 }
738 
739 /*------------------------------------------------------------------------*/
740 
GetAppLangDateTimeString(const DateTime & rDT)741 String GetAppLangDateTimeString( const DateTime& rDT )
742 {
743     const SvtSysLocale aSysLocale;
744     const LocaleDataWrapper& rAppLclData = aSysLocale.GetLocaleData();
745     String sRet( rAppLclData.getDate( rDT ));
746     ( sRet += ' ' ) += rAppLclData.getTime( rDT, sal_False, sal_False );
747     return sRet;
748 }
749 
750 /*-- 26.01.2006 08:06:33---------------------------------------------------
751 
752   -----------------------------------------------------------------------*/
ExecuteMenuCommand(PopupMenu & rMenu,SfxViewFrame & rViewFrame,sal_uInt16 nId)753 bool ExecuteMenuCommand( PopupMenu& rMenu, SfxViewFrame& rViewFrame, sal_uInt16 nId )
754 {
755     bool bRet = false;
756     sal_uInt16 nItemCount = rMenu.GetItemCount();
757     String sCommand;
758     for( sal_uInt16 nItem = 0; nItem < nItemCount; ++nItem)
759     {
760         PopupMenu* pPopup = rMenu.GetPopupMenu( rMenu.GetItemId( nItem ) );
761         if(pPopup)
762         {
763             sCommand = pPopup->GetItemCommand(nId);
764             if(sCommand.Len())
765                 break;
766         }
767     }
768     if(sCommand.Len())
769     {
770         uno::Reference< frame::XFrame >  xFrame = rViewFrame.GetFrame().GetFrameInterface();
771         uno::Reference < frame::XDispatchProvider > xProv( xFrame, uno::UNO_QUERY );
772         util::URL aURL;
773         aURL.Complete = sCommand;
774         uno::Reference < util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance( rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" )), uno::UNO_QUERY );
775         xTrans->parseStrict( aURL );
776         uno::Reference< frame::XDispatch >  xDisp = xProv->queryDispatch( aURL, ::rtl::OUString(), 0 );
777         if( xDisp.is() )
778         {
779             uno::Sequence< beans::PropertyValue > aSeq;
780             xDisp->dispatch( aURL, aSeq );
781             bRet = true;
782         }
783     }
784     return bRet;
785 }
786