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