xref: /AOO41X/main/sw/source/ui/app/docst.cxx (revision 9dcd2d78ee6377e8ad1e2e01efd517f26f4562c3)
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 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
28 #include <com/sun/star/beans/XPropertySet.hpp>
29 #include <com/sun/star/container/XNameAccess.hpp>
30 
31 #include <hintids.hxx>
32 #include <sfx2/app.hxx>
33 #include <svl/whiter.hxx>
34 #include <sfx2/templdlg.hxx>
35 #include <sfx2/tplpitem.hxx>
36 #include <sfx2/request.hxx>
37 #include <sfx2/dispatch.hxx>
38 #include <sfx2/newstyle.hxx>
39 #include <sfx2/printer.hxx>
40 #include <svl/macitem.hxx>
41 #include <editeng/brshitem.hxx>
42 #include <svl/stritem.hxx>
43 #include <svl/languageoptions.hxx>
44 #include <editeng/eeitem.hxx>
45 #include <svx/htmlmode.hxx>
46 #include <swmodule.hxx>
47 #include <wdocsh.hxx>
48 #include <fmtfsize.hxx>
49 #include <fchrfmt.hxx>
50 #include <svtools/htmlcfg.hxx>
51 #include <SwStyleNameMapper.hxx>
52 #include <SwRewriter.hxx>
53 #include <numrule.hxx>
54 #include <swundo.hxx>
55 
56 #include "view.hxx"
57 #include "wrtsh.hxx"
58 #include "docsh.hxx"
59 #include "uitool.hxx"
60 #include "cmdid.h"
61 #include "globals.hrc"
62 #include "viewopt.hxx"
63 #include <doc.hxx>
64 #include <IDocumentUndoRedo.hxx>
65 #include "swstyle.h"
66 #include "frmfmt.hxx"
67 #include "charfmt.hxx"
68 #include "poolfmt.hxx"
69 #include "pagedesc.hxx"
70 #include "docstyle.hxx"
71 #include "uiitems.hxx"
72 #include "fmtcol.hxx"
73 #include "frmmgr.hxx"       //SwFrmValid
74 #include "swevent.hxx"
75 #include "edtwin.hxx"
76 #include "unochart.hxx"
77 
78 #include "app.hrc"
79 #include <fmtui.hrc>
80 #include "swabstdlg.hxx"
81 // --> OD 2008-03-27 #refactorlists#
82 #include <list.hxx>
83 // <--
84 
85 #include <paratr.hxx>   //#outline level,add by zhaojianwei
86 
87 using namespace ::com::sun::star;
88 
89 /*--------------------------------------------------------------------
90     Beschreibung:
91  --------------------------------------------------------------------*/
92 
93 
94 void  SwDocShell::StateStyleSheet(SfxItemSet& rSet, SwWrtShell* pSh)
95 {
96     SfxWhichIter aIter(rSet);
97     sal_uInt16  nWhich  = aIter.FirstWhich();
98     sal_uInt16 nActualFamily = USHRT_MAX;
99 
100     SwWrtShell* pShell = pSh ? pSh : GetWrtShell();
101     if(!pShell)
102     {
103         while (nWhich)
104         {
105             rSet.DisableItem(nWhich);
106             nWhich = aIter.NextWhich();
107         }
108         return;
109     }
110     else
111     {
112         SfxViewFrame* pFrame = pShell->GetView().GetViewFrame();
113         const ISfxTemplateCommon* pCommon = SFX_APP()->GetCurrentTemplateCommon(pFrame->GetBindings());
114         if( pCommon )
115             nActualFamily = static_cast< sal_uInt16 >(pCommon->GetActualFamily());
116     }
117 
118     while (nWhich)
119     {
120         // aktuelle Vorlage zu jeder Familie ermitteln
121         //
122         String aName;
123         switch (nWhich)
124         {
125             case SID_STYLE_APPLY:
126             {//hier wird die Vorlage und ihre Familie an die StyleBox
127              //uebergeben, damit diese Familie angezeigt wird
128                 if(pShell->IsFrmSelected())
129                 {
130                     SwFrmFmt* pFmt = pShell->GetCurFrmFmt();
131                     if( pFmt )
132                         aName = pFmt->GetName();
133                 }
134                 else
135                 {
136                     SwTxtFmtColl* pColl = pShell->GetCurTxtFmtColl();
137                     if(pColl)
138                         aName = pColl->GetName();
139                 }
140                 rSet.Put(SfxTemplateItem(nWhich, aName));
141             }
142             break;
143             case SID_STYLE_FAMILY1:
144                 if( !pShell->IsFrmSelected() )
145                 {
146                     SwCharFmt* pFmt = pShell->GetCurCharFmt();
147                     if(pFmt)
148                         aName = pFmt->GetName();
149                     else
150                         aName = *SwStyleNameMapper::GetTextUINameArray()[
151                             RES_POOLCOLL_STANDARD - RES_POOLCOLL_TEXT_BEGIN ];
152                     rSet.Put(SfxTemplateItem(nWhich, aName));
153                 }
154                 break;
155 
156             case SID_STYLE_FAMILY2:
157                 if(!pShell->IsFrmSelected())
158                 {
159                     SwTxtFmtColl* pColl = pShell->GetCurTxtFmtColl();
160                     if(pColl)
161                         aName = pColl->GetName();
162 
163                     SfxTemplateItem aItem(nWhich, aName);
164 
165                     sal_uInt16 nMask = 0;
166                     if( pDoc->get(IDocumentSettingAccess::HTML_MODE) )
167                         nMask = SWSTYLEBIT_HTML;
168                     else
169                     {
170                         const int nSelection = pShell->GetFrmType(0,sal_True);
171                         if(pShell->GetCurTOX())
172                             nMask = SWSTYLEBIT_IDX  ;
173                         else if(nSelection & FRMTYPE_HEADER     ||
174                                 nSelection & FRMTYPE_FOOTER     ||
175                                 nSelection & FRMTYPE_TABLE      ||
176                                 nSelection & FRMTYPE_FLY_ANY    ||
177                                 nSelection & FRMTYPE_FOOTNOTE   ||
178                                 nSelection & FRMTYPE_FTNPAGE)
179                             nMask = SWSTYLEBIT_EXTRA;
180                         else
181                             nMask = SWSTYLEBIT_TEXT;
182                     }
183 
184                     aItem.SetValue(nMask);
185                     rSet.Put(aItem);
186                 }
187 
188                 break;
189 
190             case SID_STYLE_FAMILY3:
191 
192                 if( pDoc->get(IDocumentSettingAccess::HTML_MODE) )
193                     rSet.DisableItem( nWhich );
194                 else
195                 {
196                     SwFrmFmt* pFmt = pShell->GetCurFrmFmt();
197                     if(pFmt && pShell->IsFrmSelected())
198                     {
199                         aName = pFmt->GetName();
200                         rSet.Put(SfxTemplateItem(nWhich, aName));
201                     }
202                 }
203                 break;
204 
205             case SID_STYLE_FAMILY4:
206             {
207                 SvxHtmlOptions* pHtmlOpt = SvxHtmlOptions::Get();
208                 if( pDoc->get(IDocumentSettingAccess::HTML_MODE) && !pHtmlOpt->IsPrintLayoutExtension())
209                     rSet.DisableItem( nWhich );
210                 else
211                 {
212                     sal_uInt16 n = pShell->GetCurPageDesc( sal_False );
213                     if( n < pShell->GetPageDescCnt() )
214                         aName = pShell->GetPageDesc( n ).GetName();
215 
216                     rSet.Put(SfxTemplateItem(nWhich, aName));
217                 }
218             }
219             break;
220             case SID_STYLE_FAMILY5:
221                 {
222                     const SwNumRule* pRule = pShell->GetCurNumRule();
223                     if( pRule )
224                         aName = pRule->GetName();
225 
226                     rSet.Put(SfxTemplateItem(nWhich, aName));
227                 }
228                 break;
229 
230             case SID_STYLE_WATERCAN:
231             {
232                 SwEditWin& rEdtWin = pShell->GetView().GetEditWin();
233                 SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
234                 rSet.Put(SfxBoolItem(nWhich, pApply && pApply->eType != 0));
235             }
236             break;
237             case SID_STYLE_UPDATE_BY_EXAMPLE:
238                 if( pShell->IsFrmSelected()
239                         ? SFX_STYLE_FAMILY_FRAME != nActualFamily
240                         : ( SFX_STYLE_FAMILY_FRAME == nActualFamily ||
241                             SFX_STYLE_FAMILY_PAGE == nActualFamily ||
242                             (SFX_STYLE_FAMILY_PSEUDO == nActualFamily && !pShell->GetCurNumRule())) )
243                 {
244                     rSet.DisableItem( nWhich );
245                 }
246                 break;
247 
248             case SID_STYLE_NEW_BY_EXAMPLE:
249                 if( (pShell->IsFrmSelected()
250                         ? SFX_STYLE_FAMILY_FRAME != nActualFamily
251                         : SFX_STYLE_FAMILY_FRAME == nActualFamily) ||
252                     (SFX_STYLE_FAMILY_PSEUDO == nActualFamily && !pShell->GetCurNumRule()) )
253                 {
254                     rSet.DisableItem( nWhich );
255                 }
256                 break;
257 
258             default:
259                 DBG_ERROR( "Invalid SlotId");
260         }
261         nWhich = aIter.NextWhich();
262     }
263 }
264 
265 
266 /*--------------------------------------------------------------------
267     Beschreibung:   StyleSheet-Requeste auswerten
268  --------------------------------------------------------------------*/
269 
270 
271 void SwDocShell::ExecStyleSheet( SfxRequest& rReq )
272 {
273     sal_uInt16  nSlot   = rReq.GetSlot();
274     sal_uInt16  nRet    = 0xffff;
275 
276     const SfxItemSet* pArgs = rReq.GetArgs();
277     const SfxPoolItem* pItem;
278     SwWrtShell* pActShell = 0;
279     sal_Bool bSetReturn = sal_True;
280     switch (nSlot)
281     {
282     case SID_STYLE_NEW:
283         if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_FAMILY,
284             sal_False, &pItem ))
285         {
286             const sal_uInt16 nFamily = ((const SfxUInt16Item*)pItem)->GetValue();
287 
288             String sName;
289             sal_uInt16 nMask = 0;
290             if( SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_NEW,
291                 sal_False, &pItem ))
292                 sName = ((const SfxStringItem*)pItem)->GetValue();
293             if( SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_MASK,
294                 sal_False, &pItem ))
295                 nMask = ((const SfxUInt16Item*)pItem)->GetValue();
296             String sParent;
297             if( SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_REFERENCE,
298                 sal_False, &pItem ))
299                 sParent = ((const SfxStringItem*)pItem)->GetValue();
300 
301             nRet = Edit( sName, sParent, nFamily, nMask, sal_True, 0, 0, rReq.IsAPI() );
302         }
303         break;
304 
305         case SID_STYLE_APPLY:
306             if( !pArgs )
307             {
308                 GetView()->GetViewFrame()->GetDispatcher()->Execute(SID_STYLE_DESIGNER, sal_False);
309                 break;
310             }
311             else
312             {
313                 // convert internal StyleName to DisplayName (slot implementation uses the latter)
314                 SFX_REQUEST_ARG( rReq, pNameItem, SfxStringItem, SID_APPLY_STYLE, sal_False );
315                 SFX_REQUEST_ARG( rReq, pFamilyItem, SfxStringItem, SID_STYLE_FAMILYNAME, sal_False );
316                 if ( pFamilyItem && pNameItem )
317                 {
318                     uno::Reference< style::XStyleFamiliesSupplier > xModel(GetModel(), uno::UNO_QUERY);
319                     try
320                     {
321                         uno::Reference< container::XNameAccess > xStyles;
322                         uno::Reference< container::XNameAccess > xCont = xModel->getStyleFamilies();
323                         xCont->getByName(pFamilyItem->GetValue()) >>= xStyles;
324                         uno::Reference< beans::XPropertySet > xInfo;
325                         xStyles->getByName( pNameItem->GetValue() ) >>= xInfo;
326                         ::rtl::OUString aUIName;
327                         xInfo->getPropertyValue( ::rtl::OUString::createFromAscii("DisplayName") ) >>= aUIName;
328                         if ( aUIName.getLength() )
329                             rReq.AppendItem( SfxStringItem( SID_STYLE_APPLY, aUIName ) );
330                     }
331                     catch( uno::Exception& )
332                     {
333                     }
334                 }
335             }
336 
337             // intentionally no break
338 
339         case SID_STYLE_EDIT:
340         case SID_STYLE_DELETE:
341         case SID_STYLE_WATERCAN:
342         case SID_STYLE_FAMILY:
343         case SID_STYLE_UPDATE_BY_EXAMPLE:
344         case SID_STYLE_NEW_BY_EXAMPLE:
345         {
346             String aParam;
347             sal_uInt16 nFamily = SFX_STYLE_FAMILY_PARA;
348             sal_uInt16 nMask = 0;
349 
350             if( !pArgs )
351             {
352                 nFamily = SFX_STYLE_FAMILY_PARA;
353 
354                 switch (nSlot)
355                 {
356                     case SID_STYLE_NEW_BY_EXAMPLE:
357                     {
358                         SfxNewStyleDlg *pDlg = new SfxNewStyleDlg( 0,
359                                                     *GetStyleSheetPool());
360                         if(RET_OK == pDlg->Execute())
361                         {
362                             aParam = pDlg->GetName();
363                             rReq.AppendItem(SfxStringItem(nSlot, aParam));
364                         }
365 
366                         delete pDlg;
367                     }
368                     break;
369 
370                     case SID_STYLE_UPDATE_BY_EXAMPLE:
371                     case SID_STYLE_EDIT:
372                     {
373                         SwTxtFmtColl* pColl = GetWrtShell()->GetCurTxtFmtColl();
374                         if(pColl)
375                         {
376                             aParam = pColl->GetName();
377                             rReq.AppendItem(SfxStringItem(nSlot, aParam));
378                         }
379                     }
380                     break;
381                 }
382             }
383             else
384             {
385                 ASSERT( pArgs->Count(), "SfxBug ItemSet ist leer");
386 
387                 SwWrtShell* pShell = GetWrtShell();
388                 if( SFX_ITEM_SET == pArgs->GetItemState(nSlot, sal_False, &pItem ))
389                     aParam = ((const SfxStringItem*)pItem)->GetValue();
390 
391                 if( SFX_ITEM_SET == pArgs->GetItemState(SID_STYLE_FAMILY,
392                     sal_False, &pItem ))
393                     nFamily = ((const SfxUInt16Item*)pItem)->GetValue();
394 
395                 if( SFX_ITEM_SET == pArgs->GetItemState(SID_STYLE_FAMILYNAME, sal_False, &pItem ))
396                 {
397                     String aFamily = ((const SfxStringItem*)pItem)->GetValue();
398                     if(aFamily.CompareToAscii("CharacterStyles") == COMPARE_EQUAL)
399                         nFamily = SFX_STYLE_FAMILY_CHAR;
400                     else
401                     if(aFamily.CompareToAscii("ParagraphStyles") == COMPARE_EQUAL)
402                         nFamily = SFX_STYLE_FAMILY_PARA;
403                     else
404                     if(aFamily.CompareToAscii("PageStyles") == COMPARE_EQUAL)
405                         nFamily = SFX_STYLE_FAMILY_PAGE;
406                     else
407                     if(aFamily.CompareToAscii("FrameStyles") == COMPARE_EQUAL)
408                         nFamily = SFX_STYLE_FAMILY_FRAME;
409                     else
410                     if(aFamily.CompareToAscii("NumberingStyles") == COMPARE_EQUAL)
411                         nFamily = SFX_STYLE_FAMILY_PSEUDO;
412                 }
413 
414                 if( SFX_ITEM_SET == pArgs->GetItemState(SID_STYLE_MASK,
415                     sal_False, &pItem ))
416                     nMask = ((const SfxUInt16Item*)pItem)->GetValue();
417                 if( SFX_ITEM_SET == pArgs->GetItemState(FN_PARAM_WRTSHELL,
418                     sal_False, &pItem ))
419                     pActShell = pShell = (SwWrtShell*)((SwPtrItem*)pItem)->GetValue();
420 
421                 if( nSlot == SID_STYLE_UPDATE_BY_EXAMPLE )
422                 {
423                     switch( nFamily )
424                     {
425                         case SFX_STYLE_FAMILY_PARA:
426                         {
427                             SwTxtFmtColl* pColl = pShell->GetCurTxtFmtColl();
428                             if(pColl)
429                                 aParam = pColl->GetName();
430                         }
431                         break;
432                         case SFX_STYLE_FAMILY_FRAME:
433                         {
434                             SwFrmFmt* pFrm = pWrtShell->GetCurFrmFmt();
435                             if( pFrm )
436                                 aParam = pFrm->GetName();
437                         }
438                         break;
439                         case SFX_STYLE_FAMILY_CHAR:
440                         {
441                             SwCharFmt* pChar = pWrtShell->GetCurCharFmt();
442                             if( pChar )
443                                 aParam = pChar->GetName();
444                         }
445                         break;
446                         case SFX_STYLE_FAMILY_PSEUDO:
447                         if(SFX_ITEM_SET == pArgs->GetItemState(SID_STYLE_UPD_BY_EX_NAME, sal_False, &pItem))
448                         {
449                             aParam = ((const SfxStringItem*)pItem)->GetValue();
450                         }
451                         break;
452                     }
453                     rReq.AppendItem(SfxStringItem(nSlot, aParam));
454                 }
455             }
456             if (aParam.Len() || nSlot == SID_STYLE_WATERCAN )
457             {
458                 switch(nSlot)
459                 {
460                     case SID_STYLE_EDIT:
461                         nRet = Edit(aParam, aEmptyStr, nFamily, nMask, sal_False, 0, pActShell );
462                         break;
463                     case SID_STYLE_DELETE:
464                         nRet = Delete(aParam, nFamily);
465                         break;
466                     case SID_STYLE_APPLY:
467                         // Shellwechsel in ApplyStyles
468                         nRet = ApplyStyles(aParam, nFamily, pActShell, rReq.GetModifier() );
469                         break;
470                     case SID_STYLE_WATERCAN:
471                         nRet = DoWaterCan(aParam, nFamily);
472                         break;
473                     case SID_STYLE_UPDATE_BY_EXAMPLE:
474                         nRet = UpdateStyle(aParam, nFamily, pActShell);
475                         break;
476                     case SID_STYLE_NEW_BY_EXAMPLE:
477                     {
478                         nRet = MakeByExample(aParam, nFamily, nMask, pActShell );
479                         SfxTemplateDialog* pDlg = SFX_APP()->GetTemplateDialog();
480 
481                         if(pDlg && pDlg->IsVisible())
482                             pDlg->Update();
483                     }
484                     break;
485 
486                     default:
487                         DBG_ERROR( "Falsche Slot-Id");
488                 }
489 
490                 rReq.Done();
491             }
492 
493             break;
494         }
495     }
496 
497     if(bSetReturn)
498     {
499         if(rReq.IsAPI()) // Basic bekommt nur sal_True oder sal_False
500             rReq.SetReturnValue(SfxUInt16Item(nSlot, nRet !=0));
501         else
502             rReq.SetReturnValue(SfxUInt16Item(nSlot, nRet));
503     }
504 
505 }
506 
507 /*--------------------------------------------------------------------
508     Beschreibung:   Edit
509  --------------------------------------------------------------------*/
510 
511 
512 sal_uInt16 SwDocShell::Edit(
513     const String &rName,
514     const String &rParent,
515     const sal_uInt16 nFamily,
516     sal_uInt16 nMask,
517     const sal_Bool bNew,
518     const sal_uInt16 nSlot,
519     SwWrtShell* pActShell,
520     const sal_Bool bBasic )
521 {
522     ASSERT(GetWrtShell(), "Keine Shell, keine Styles");
523     SfxStyleSheetBase *pStyle = 0;
524 
525     sal_uInt16 nRet = nMask;
526     sal_Bool bModified = pDoc->IsModified();
527 
528     if( bNew )
529     {
530         if( SFXSTYLEBIT_ALL != nMask && SFXSTYLEBIT_USED != nMask )
531             nMask |= SFXSTYLEBIT_USERDEF;
532         else
533             nMask = SFXSTYLEBIT_USERDEF;
534 
535         pStyle = &mxBasePool->Make( rName, (SfxStyleFamily)nFamily, nMask );
536 
537         // die aktuellen als Parent setzen
538         SwDocStyleSheet* pDStyle = (SwDocStyleSheet*)pStyle;
539         switch( nFamily )
540         {
541             case SFX_STYLE_FAMILY_PARA:
542             {
543                 if(rParent.Len())
544                 {
545                     SwTxtFmtColl* pColl = pWrtShell->FindTxtFmtCollByName( rParent );
546                     if(!pColl)
547                     {
548                         sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rParent, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL);
549                         if(USHRT_MAX != nId)
550                             pColl =  pWrtShell->GetTxtCollFromPool( nId );
551                     }
552                     pDStyle->GetCollection()->SetDerivedFrom( pColl );
553                     pDStyle->PresetParent( rParent );
554 
555                     //#outline level,add by zhaojianwei
556                      /*When a new paragraph style is created based on a "to outline style
557                         assigned" paragraph style, the outline level attribute and the list
558                         style attribute of the new paragraph style have to be set to 0
559                         respectively "".*/
560                     if( pColl->IsAssignedToListLevelOfOutlineStyle())
561                     {
562                         SwNumRuleItem aItem(aEmptyStr);
563                         pDStyle->GetCollection()->SetFmtAttr( aItem );
564                         pDStyle->GetCollection()->SetAttrOutlineLevel( 0 );
565                     }
566                     //<-end,zhaojianwei
567 
568                 }
569                 else
570                 {
571                     SwTxtFmtColl* pColl = pWrtShell->GetCurTxtFmtColl();
572                     pDStyle->GetCollection()->SetDerivedFrom( pColl );
573                     if( pColl )
574                         pDStyle->PresetParent( pColl->GetName() );
575                 }
576             }
577             break;
578             case SFX_STYLE_FAMILY_CHAR:
579             {
580                 if(rParent.Len())
581                 {
582                     SwCharFmt* pCFmt = pWrtShell->FindCharFmtByName( rParent );
583                     if(!pCFmt)
584                     {
585                         sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rParent, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT);
586                         if(USHRT_MAX != nId)
587                             pCFmt =  pWrtShell->GetCharFmtFromPool( nId );
588                     }
589 
590                     pDStyle->GetCharFmt()->SetDerivedFrom( pCFmt );
591                     pDStyle->PresetParent( rParent );
592                 }
593                 else
594                 {
595                     SwCharFmt* pCFmt = pWrtShell->GetCurCharFmt();
596                     pDStyle->GetCharFmt()->SetDerivedFrom( pCFmt );
597                         if( pCFmt )
598                             pDStyle->PresetParent( pCFmt->GetName() );
599                 }
600             }
601             break;
602             case SFX_STYLE_FAMILY_FRAME :
603             {
604                 if(rParent.Len())
605                 {
606                     SwFrmFmt* pFFmt = pWrtShell->GetDoc()->FindFrmFmtByName( rParent );
607                     if(!pFFmt)
608                     {
609                         sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rParent, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT);
610                         if(USHRT_MAX != nId)
611                             pFFmt =  pWrtShell->GetFrmFmtFromPool( nId );
612                     }
613                     pDStyle->GetFrmFmt()->SetDerivedFrom( pFFmt );
614                     pDStyle->PresetParent( rParent );
615                 }
616             }
617             break;
618         }
619     }
620     else
621     {
622         pStyle = mxBasePool->Find( rName, (SfxStyleFamily)nFamily );
623         ASSERT(pStyle, "Vorlage nicht gefunden");
624     }
625 
626     if(!pStyle)
627         return sal_False;
628 
629     // Dialoge zusammenstoepseln
630     //
631     rtl::Reference< SwDocStyleSheet > xTmp( new SwDocStyleSheet( *(SwDocStyleSheet*)pStyle ) );
632     if( SFX_STYLE_FAMILY_PARA == nFamily )
633     {
634         SfxItemSet& rSet = xTmp->GetItemSet();
635         ::SwToSfxPageDescAttr( rSet );
636         // erstmal nur eine Null
637         rSet.Put(SwBackgroundDestinationItem(SID_PARA_BACKGRND_DESTINATION, 0));
638         // --> OD 2008-02-13 #newlistlevelattrs#
639         // merge list level indent attributes into the item set if needed
640         xTmp->MergeIndentAttrsOfListStyle( rSet );
641         // <--
642     }
643 /*  else if( SFX_STYLE_FAMILY_FRAME == nFamily )
644     {
645         // Auskommentiert wegen Bug #45776 (per default keine Breite&Groesse in Rahmenvorlagen)
646         SfxItemSet& rSet = aTmp.GetItemSet();
647         if( SFX_ITEM_SET != rSet.GetItemState( RES_FRM_SIZE ))
648         {
649             // dann sollten wir spaetesten hier eines anlegen
650             SwFrmValid aFrmDefValues;
651             rSet.Put( SwFmtFrmSize( ATT_VAR_SIZE, aFrmDefValues.nWidth,
652                                     aFrmDefValues.nHeight ));
653         }
654     }*/
655     else if( SFX_STYLE_FAMILY_CHAR == nFamily )
656     {
657         SfxItemSet& rSet = xTmp->GetItemSet();
658         const SfxPoolItem *pTmpBrush;
659         if( SFX_ITEM_SET == rSet.GetItemState( RES_CHRATR_BACKGROUND,
660             sal_True, &pTmpBrush ) )
661         {
662             SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
663             aTmpBrush.SetWhich( RES_BACKGROUND );
664             rSet.Put( aTmpBrush );
665         }
666     }
667     if (!bBasic)
668     {
669         // vor dem Dialog wird der HtmlMode an der DocShell versenkt
670         sal_uInt16 nHtmlMode = ::GetHtmlMode(this);
671 
672         // In HTML mode, we do not always have a printer. In order to show
673         // the correct page size in the Format - Page dialog, we have to
674         // get one here.
675         SwWrtShell* pCurrShell = ( pActShell ? pActShell : pWrtShell );
676         if( ( HTMLMODE_ON & nHtmlMode ) &&
677             !pCurrShell->getIDocumentDeviceAccess()->getPrinter( false ) )
678             pCurrShell->InitPrt( pCurrShell->getIDocumentDeviceAccess()->getPrinter( true ) );
679 
680         PutItem(SfxUInt16Item(SID_HTML_MODE, nHtmlMode));
681         FieldUnit eMetric = ::GetDfltMetric(0 != (HTMLMODE_ON&nHtmlMode));
682         SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)));
683         SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
684         DBG_ASSERT(pFact, "Dialogdiet fail!");
685         SfxAbstractTabDialog* pDlg = pFact->CreateTemplateDialog( DLG_TEMPLATE_BASE,
686                                                     0, *(xTmp.get()), nFamily, nSlot,
687                                                     pActShell ? pActShell : pWrtShell, bNew);
688         DBG_ASSERT(pDlg, "Dialogdiet fail!");
689         if(RET_OK == pDlg->Execute())
690         {
691             GetWrtShell()->StartAllAction();
692 
693             // nur bei Absatz-Vorlagen die Maske neu setzen
694             if( bNew )
695             {
696                 nRet = SFX_STYLE_FAMILY_PARA == pStyle->GetFamily()
697                         ? xTmp->GetMask()
698                         : SFXSTYLEBIT_USERDEF;
699             }
700             else if( pStyle->GetMask() != xTmp->GetMask() )
701                 nRet = xTmp->GetMask();
702 
703             if( SFX_STYLE_FAMILY_PARA == nFamily )
704             {
705                 SfxItemSet aSet( *pDlg->GetOutputItemSet() );
706                 ::SfxToSwPageDescAttr( *GetWrtShell(), aSet  );
707                 // --> OD 2008-02-12 #newlistlevelattrs#
708                 // reset indent attributes at paragraph style, if a list style
709                 // will be applied and no indent attributes will be applied.
710                 xTmp->SetItemSet( aSet, true );
711                 // <--
712             }
713             else
714             {
715                 if(SFX_STYLE_FAMILY_PAGE == nFamily)
716                 {
717                     static const sal_uInt16 aInval[] = {
718                         SID_IMAGE_ORIENTATION,
719                         SID_ATTR_CHAR_FONT,
720                         FN_INSERT_CTRL, FN_INSERT_OBJ_CTRL, 0};
721                     pView->GetViewFrame()->GetBindings().Invalidate(aInval);
722                 }
723                 SfxItemSet aTmpSet( *pDlg->GetOutputItemSet() );
724                 if( SFX_STYLE_FAMILY_CHAR == nFamily )
725                 {
726                     const SfxPoolItem *pTmpBrush;
727                     if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_BACKGROUND,
728                         sal_False, &pTmpBrush ) )
729                     {
730                         SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
731                         aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
732                         aTmpSet.Put( aTmpBrush );
733                     }
734                     aTmpSet.ClearItem( RES_BACKGROUND );
735                 }
736                 xTmp->SetItemSet( aTmpSet );
737 
738                 if( SFX_STYLE_FAMILY_PAGE == nFamily && SvtLanguageOptions().IsCTLFontEnabled() )
739                 {
740                     const SfxPoolItem *pItem = NULL;
741                     if( aTmpSet.GetItemState( GetPool().GetTrueWhich( SID_ATTR_FRAMEDIRECTION, sal_False ) , sal_True, &pItem ) == SFX_ITEM_SET )
742                         SwChartHelper::DoUpdateAllCharts( pDoc );
743                 }
744             }
745             if(SFX_STYLE_FAMILY_PAGE == nFamily)
746                 pView->InvalidateRulerPos();
747 
748             if( bNew )
749                 mxBasePool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *xTmp.get() ) );
750 
751             // JP 19.09.97:
752             // Dialog vorm EndAction zerstoeren - bei Seitenvorlagen kann
753             // muss der ItemSet zerstoert werden, damit die Cursor aus den
754             // Kopf-/Fusszeilen entfernt werden. Sonst kommts zu GPFs!!!
755             delete pDlg;
756 
757             pDoc->SetModified();
758             if( !bModified )    // Bug 57028
759             {
760                 pDoc->GetIDocumentUndoRedo().SetUndoNoResetModified();
761             }
762 
763             GetWrtShell()->EndAllAction();
764         }
765         else
766         {
767             if( bNew )
768             {
769                 // #116530#
770                 //pBasePool->Erase( &aTmp );
771                 GetWrtShell()->Undo(1);
772                 pDoc->GetIDocumentUndoRedo().ClearRedo();
773             }
774 
775             if( !bModified )
776                 pDoc->ResetModified();
777             delete pDlg;
778         }
779     }
780     else
781     {
782         // vor dem Dialog wird der HtmlMode an der DocShell versenkt
783         PutItem(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(this)));
784 
785         GetWrtShell()->StartAllAction();
786 
787         // nur bei Absatz-Vorlagen die Maske neu setzen
788         if( bNew )
789         {
790             nRet = SFX_STYLE_FAMILY_PARA == pStyle->GetFamily()
791                     ? xTmp->GetMask()
792                     : SFXSTYLEBIT_USERDEF;
793         }
794         else if( pStyle->GetMask() != xTmp->GetMask() )
795             nRet = xTmp->GetMask();
796 
797         if( SFX_STYLE_FAMILY_PARA == nFamily )
798             ::SfxToSwPageDescAttr( *GetWrtShell(), xTmp->GetItemSet() );
799         else
800         {
801             SfxItemSet aTmpSet( xTmp->GetItemSet() );
802             if( SFX_STYLE_FAMILY_CHAR == nFamily )
803             {
804                 const SfxPoolItem *pTmpBrush;
805                 if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_BACKGROUND,
806                     sal_False, &pTmpBrush ) )
807                 {
808                     SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
809                     aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
810                     aTmpSet.Put( aTmpBrush );
811                 }
812                 aTmpSet.ClearItem( RES_BACKGROUND );
813             }
814             xTmp->SetItemSet( aTmpSet );
815         }
816         if(SFX_STYLE_FAMILY_PAGE == nFamily)
817             pView->InvalidateRulerPos();
818 
819         if( bNew )
820             mxBasePool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *xTmp.get() ) );
821 
822         pDoc->SetModified();
823         if( !bModified )        // Bug 57028
824         {
825             pDoc->GetIDocumentUndoRedo().SetUndoNoResetModified();
826         }
827         GetWrtShell()->EndAllAction();
828     }
829 
830     return nRet;
831 }
832 
833 /*--------------------------------------------------------------------
834     Beschreibung:   Delete
835  --------------------------------------------------------------------*/
836 
837 
838 sal_uInt16 SwDocShell::Delete(const String &rName, sal_uInt16 nFamily)
839 {
840     SfxStyleSheetBase *pStyle = mxBasePool->Find(rName, (SfxStyleFamily)nFamily);
841 
842     if(pStyle)
843     {
844         ASSERT(GetWrtShell(), "Keine Shell, keine Styles");
845 
846         GetWrtShell()->StartAllAction();
847         mxBasePool->Remove(pStyle);
848         GetWrtShell()->EndAllAction();
849 
850         return sal_True;
851     }
852     return sal_False;
853 }
854 
855 /*--------------------------------------------------------------------
856     Beschreibung:   Vorlage anwenden
857  --------------------------------------------------------------------*/
858 
859 
860 sal_uInt16 SwDocShell::ApplyStyles(const String &rName, sal_uInt16 nFamily,
861                                SwWrtShell* pShell, sal_uInt16 nMode )
862 {
863     SwDocStyleSheet* pStyle =
864         (SwDocStyleSheet*)mxBasePool->Find(rName, (SfxStyleFamily)nFamily);
865 
866     ASSERT(pStyle, "Wo ist der StyleSheet");
867     if(!pStyle)
868         return sal_False;
869 
870     SwWrtShell *pSh = pShell ? pShell : GetWrtShell();
871 
872     ASSERT( pSh, "Keine Shell, keine Styles");
873 
874     pSh->StartAllAction();
875 
876     switch(nFamily)
877     {
878         case SFX_STYLE_FAMILY_CHAR:
879         {
880             SwFmtCharFmt aFmt(pStyle->GetCharFmt());
881             pSh->SetAttr( aFmt, (nMode & KEY_SHIFT) ?
882                 nsSetAttrMode::SETATTR_DONTREPLACE : nsSetAttrMode::SETATTR_DEFAULT );
883             break;
884         }
885         case SFX_STYLE_FAMILY_PARA:
886         {
887             // --> OD 2007-11-06 #i62675#
888             // clear also list attributes at affected text nodes, if paragraph
889             // style has the list style attribute set.
890             pSh->SetTxtFmtColl( pStyle->GetCollection(), true );
891             // <--
892             break;
893         }
894         case SFX_STYLE_FAMILY_FRAME:
895         {
896             if ( pSh->IsFrmSelected() )
897                 pSh->SetFrmFmt( pStyle->GetFrmFmt() );
898             break;
899         }
900         case SFX_STYLE_FAMILY_PAGE:
901         {
902             pSh->SetPageStyle(pStyle->GetPageDesc()->GetName());
903             break;
904         }
905         case SFX_STYLE_FAMILY_PSEUDO:
906         {
907             // --> OD 2008-02-08 #newlistlevelattrs#
908             // reset indent attribute on applying list style
909             // --> OD 2008-03-17 #refactorlists#
910             // continue list of list style
911             const SwNumRule* pNumRule = pStyle->GetNumRule();
912             const String sListIdForStyle =pNumRule->GetDefaultListId();
913             pSh->SetCurNumRule( *pNumRule, false, sListIdForStyle, true );
914             // <--
915             break;
916         }
917         default:
918             DBG_ERROR("Unbekannte Familie");
919     }
920     pSh->EndAllAction();
921 
922     return nFamily;
923 }
924 
925 /*--------------------------------------------------------------------
926     Beschreibung:   Giesskanne starten
927  --------------------------------------------------------------------*/
928 
929 
930 
931 sal_uInt16 SwDocShell::DoWaterCan(const String &rName, sal_uInt16 nFamily)
932 {
933     ASSERT(GetWrtShell(), "Keine Shell, keine Styles");
934 
935     SwEditWin& rEdtWin = pView->GetEditWin();
936     SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
937     sal_Bool bWaterCan = !(pApply && pApply->eType != 0);
938     if( !rName.Len() )
939         bWaterCan = sal_False;
940     SwApplyTemplate aTemplate;
941     aTemplate.eType = nFamily;
942 
943     if(bWaterCan)
944     {
945         SwDocStyleSheet* pStyle =
946             (SwDocStyleSheet*)mxBasePool->Find(rName, (SfxStyleFamily)nFamily);
947 
948         ASSERT(pStyle, "Wo ist der StyleSheet");
949         if(!pStyle) return nFamily;
950 
951         switch(nFamily)
952         {
953             case SFX_STYLE_FAMILY_CHAR:
954                 aTemplate.aColl.pCharFmt = pStyle->GetCharFmt();
955                 break;
956             case SFX_STYLE_FAMILY_PARA:
957                 aTemplate.aColl.pTxtColl = pStyle->GetCollection();
958                 break;
959             case SFX_STYLE_FAMILY_FRAME:
960                 aTemplate.aColl.pFrmFmt = pStyle->GetFrmFmt();
961                 break;
962             case SFX_STYLE_FAMILY_PAGE:
963                 aTemplate.aColl.pPageDesc = (SwPageDesc*)pStyle->GetPageDesc();
964                 break;
965             case SFX_STYLE_FAMILY_PSEUDO:
966                 aTemplate.aColl.pNumRule = (SwNumRule*)pStyle->GetNumRule();
967                 break;
968 
969             default:
970                 DBG_ERROR( "Unbekannte Familie");
971         }
972     }
973     else
974         aTemplate.eType = 0;
975 
976     // Template anwenden
977     pView->GetEditWin().SetApplyTemplate(aTemplate);
978 
979     return nFamily;
980 }
981 
982 /*--------------------------------------------------------------------
983     Beschreibung:   Vorlage Updaten
984  --------------------------------------------------------------------*/
985 
986 
987 sal_uInt16 SwDocShell::UpdateStyle(const String &rName, sal_uInt16 nFamily, SwWrtShell* pShell)
988 {
989     SwWrtShell* pCurrWrtShell = pShell ? pShell : GetWrtShell();
990     ASSERT(GetWrtShell(), "Keine Shell, keine Styles");
991 
992     SwDocStyleSheet* pStyle =
993         (SwDocStyleSheet*)mxBasePool->Find(rName, (SfxStyleFamily)nFamily);
994 
995     if(!pStyle)
996         return nFamily;
997 
998     switch(nFamily)
999     {
1000         case SFX_STYLE_FAMILY_PARA:
1001         {
1002             SwTxtFmtColl* pColl = pStyle->GetCollection();
1003             if(pColl && !pColl->IsDefault())
1004             {
1005                 GetWrtShell()->StartAllAction();
1006 
1007                 SwRewriter aRewriter;
1008                 aRewriter.AddRule(UNDO_ARG1, pColl->GetName());
1009 
1010                 GetWrtShell()->StartUndo(UNDO_INSFMTATTR, &aRewriter);
1011                 GetWrtShell()->FillByEx(pColl);
1012                     // Vorlage auch anwenden, um harte Attributierung
1013                     // zu entfernen
1014                 GetWrtShell()->SetTxtFmtColl( pColl );
1015                 GetWrtShell()->EndUndo();
1016                 GetWrtShell()->EndAllAction();
1017             }
1018             break;
1019         }
1020         case SFX_STYLE_FAMILY_FRAME:
1021         {
1022             SwFrmFmt* pFrm = pStyle->GetFrmFmt();
1023             if( pCurrWrtShell->IsFrmSelected() && pFrm && !pFrm->IsDefault() )
1024             {
1025                 SfxItemSet aSet( GetPool(), aFrmFmtSetRange );
1026                 pCurrWrtShell->StartAllAction();
1027                 pCurrWrtShell->GetFlyFrmAttr( aSet );
1028 
1029                 // --> OD 2009-12-28 #i105535#
1030                 // no update of anchor attribute
1031                 aSet.ClearItem( RES_ANCHOR );
1032                 // <--
1033 
1034                 pFrm->SetFmtAttr( aSet );
1035 
1036                     // Vorlage auch anwenden, um harte Attributierung
1037                     // zu entfernen
1038                 pCurrWrtShell->SetFrmFmt( pFrm, sal_True );
1039                 pCurrWrtShell->EndAllAction();
1040             }
1041         }
1042         break;
1043         case SFX_STYLE_FAMILY_CHAR:
1044         {
1045             SwCharFmt* pChar = pStyle->GetCharFmt();
1046             if( pChar && !pChar->IsDefault() )
1047             {
1048                 pCurrWrtShell->StartAllAction();
1049                 pCurrWrtShell->FillByEx(pChar);
1050                     // Vorlage auch anwenden, um harte Attributierung
1051                     // zu entfernen
1052                 pCurrWrtShell->EndAllAction();
1053             }
1054 
1055         }
1056         break;
1057         case SFX_STYLE_FAMILY_PSEUDO:
1058         {
1059             const SwNumRule* pCurRule;
1060             if( pStyle->GetNumRule() &&
1061                 0 != ( pCurRule = pCurrWrtShell->GetCurNumRule() ))
1062             {
1063                 SwNumRule aRule( *pCurRule );
1064                 // --> OD 2008-07-08 #i91400#
1065                 aRule.SetName( pStyle->GetNumRule()->GetName(),
1066                                *(pCurrWrtShell->GetDoc()) );
1067                 // <--
1068                 pCurrWrtShell->ChgNumRuleFmts( aRule );
1069             }
1070         }
1071         break;
1072     }
1073     return nFamily;
1074 }
1075 
1076 /*--------------------------------------------------------------------
1077     Beschreibung:   NewByExample
1078  --------------------------------------------------------------------*/
1079 
1080 
1081 sal_uInt16 SwDocShell::MakeByExample( const String &rName, sal_uInt16 nFamily,
1082                                     sal_uInt16 nMask, SwWrtShell* pShell )
1083 {
1084     SwWrtShell* pCurrWrtShell = pShell ? pShell : GetWrtShell();
1085     SwDocStyleSheet* pStyle = (SwDocStyleSheet*)mxBasePool->Find(
1086                                             rName, (SfxStyleFamily)nFamily );
1087     if(!pStyle)
1088     {
1089         // JP 07.07.95: behalte die akt. Maske vom PI bei, dadurch werden
1090         //              neue sofort in den sichtbaren Bereich einsortiert
1091         if( SFXSTYLEBIT_ALL == nMask || SFXSTYLEBIT_USED == nMask )
1092             nMask = SFXSTYLEBIT_USERDEF;
1093         else
1094             nMask |= SFXSTYLEBIT_USERDEF;
1095 
1096         pStyle = (SwDocStyleSheet*)&mxBasePool->Make(rName,
1097                                 (SfxStyleFamily)nFamily, nMask );
1098     }
1099 
1100     switch(nFamily)
1101     {
1102         case  SFX_STYLE_FAMILY_PARA:
1103         {
1104             SwTxtFmtColl* pColl = pStyle->GetCollection();
1105             if(pColl && !pColl->IsDefault())
1106             {
1107                 pCurrWrtShell->StartAllAction();
1108                 pCurrWrtShell->FillByEx(pColl);
1109                     // Vorlage auch anwenden, um harte Attributierung
1110                     // zu entfernen
1111                 pColl->SetDerivedFrom(pCurrWrtShell->GetCurTxtFmtColl());
1112 
1113                     // setze die Maske noch an der Collection:
1114                 sal_uInt16 nId = pColl->GetPoolFmtId() & 0x87ff;
1115                 switch( nMask & 0x0fff )
1116                 {
1117                 case SWSTYLEBIT_TEXT:
1118                     nId |= COLL_TEXT_BITS;
1119                     break;
1120                 case SWSTYLEBIT_CHAPTER:
1121                     nId |= COLL_DOC_BITS;
1122                     break;
1123                 case SWSTYLEBIT_LIST:
1124                     nId |= COLL_LISTS_BITS;
1125                     break;
1126                 case SWSTYLEBIT_IDX:
1127                     nId |= COLL_REGISTER_BITS;
1128                     break;
1129                 case SWSTYLEBIT_EXTRA:
1130                     nId |= COLL_EXTRA_BITS;
1131                     break;
1132                 case SWSTYLEBIT_HTML:
1133                     nId |= COLL_HTML_BITS;
1134                     break;
1135                 }
1136                 pColl->SetPoolFmtId(nId);
1137 
1138                 pCurrWrtShell->SetTxtFmtColl(pColl);
1139                 pCurrWrtShell->EndAllAction();
1140             }
1141         }
1142         break;
1143         case SFX_STYLE_FAMILY_FRAME:
1144         {
1145             SwFrmFmt* pFrm = pStyle->GetFrmFmt();
1146             if(pCurrWrtShell->IsFrmSelected() && pFrm && !pFrm->IsDefault())
1147             {
1148                 pCurrWrtShell->StartAllAction();
1149 
1150                 SfxItemSet aSet(GetPool(), aFrmFmtSetRange );
1151                 pCurrWrtShell->GetFlyFrmAttr( aSet );
1152 
1153                 SwFrmFmt* pFFmt = pCurrWrtShell->GetCurFrmFmt();
1154                 pFrm->SetDerivedFrom( pFFmt );
1155 
1156                 // JP 10.06.98: nur automatische Orientierungen uebernehmen
1157 /*              #61359# jetzt auch wieder alle Orientierungen
1158                 const SfxPoolItem* pItem;
1159                 if( SFX_ITEM_SET == aSet.GetItemState( RES_VERT_ORIENT,
1160                     sal_False, &pItem ) &&
1161                     text::VertOrientation::NONE == ((SwFmtVertOrient*)pItem)->GetVertOrient())
1162                     aSet.ClearItem( RES_VERT_ORIENT );
1163 
1164                 if( SFX_ITEM_SET == aSet.GetItemState( RES_HORI_ORIENT,
1165                     sal_False, &pItem ) &&
1166                     text::HoriOrientation::NONE == ((SwFmtHoriOrient*)pItem)->GetHoriOrient())
1167                     aSet.ClearItem( RES_HORI_ORIENT );
1168  */
1169 
1170                 pFrm->SetFmtAttr( aSet );
1171                     // Vorlage auch anwenden, um harte Attributierung
1172                     // zu entfernen
1173                 pCurrWrtShell->SetFrmFmt( pFrm );
1174                 pCurrWrtShell->EndAllAction();
1175             }
1176         }
1177         break;
1178         case SFX_STYLE_FAMILY_CHAR:
1179         {
1180             SwCharFmt* pChar = pStyle->GetCharFmt();
1181             if(pChar && !pChar->IsDefault())
1182             {
1183                 pCurrWrtShell->StartAllAction();
1184                 pCurrWrtShell->FillByEx( pChar );
1185                 pChar->SetDerivedFrom( pCurrWrtShell->GetCurCharFmt() );
1186                 SwFmtCharFmt aFmt( pChar );
1187                 pCurrWrtShell->SetAttr( aFmt );
1188                 pCurrWrtShell->EndAllAction();
1189             }
1190         }
1191         break;
1192 
1193         case SFX_STYLE_FAMILY_PAGE:
1194         {
1195             pCurrWrtShell->StartAllAction();
1196             sal_uInt16 nPgDsc = pCurrWrtShell->GetCurPageDesc();
1197             SwPageDesc& rSrc = (SwPageDesc&)pCurrWrtShell->GetPageDesc( nPgDsc );
1198             SwPageDesc& rDest = *(SwPageDesc*)pStyle->GetPageDesc();
1199 
1200             sal_uInt16 nPoolId = rDest.GetPoolFmtId();
1201             sal_uInt16 nHId = rDest.GetPoolHelpId();
1202             sal_uInt8 nHFId = rDest.GetPoolHlpFileId();
1203 
1204             pCurrWrtShell->GetDoc()->CopyPageDesc( rSrc, rDest );
1205 
1206             // PoolId darf NIE kopiert werden!
1207             rDest.SetPoolFmtId( nPoolId );
1208             rDest.SetPoolHelpId( nHId );
1209             rDest.SetPoolHlpFileId( nHFId );
1210 
1211             // werden Kopf-/Fusszeilen angelegt, so gibt es kein Undo mehr!
1212             pCurrWrtShell->GetDoc()->GetIDocumentUndoRedo().DelAllUndoObj();
1213 
1214             pCurrWrtShell->EndAllAction();
1215         }
1216         break;
1217 
1218         case SFX_STYLE_FAMILY_PSEUDO:
1219         {
1220             pCurrWrtShell->StartAllAction();
1221 
1222             SwNumRule aRule( *pCurrWrtShell->GetCurNumRule() );
1223             String sOrigRule( aRule.GetName() );
1224             // --> OD 2008-07-08 #i91400#
1225             aRule.SetName( pStyle->GetNumRule()->GetName(),
1226                            *(pCurrWrtShell->GetDoc()) );
1227             // <--
1228             pCurrWrtShell->ChgNumRuleFmts( aRule );
1229 
1230             pCurrWrtShell->ReplaceNumRule( sOrigRule, aRule.GetName() );
1231 
1232 
1233             pCurrWrtShell->EndAllAction();
1234         }
1235         break;
1236     }
1237     return nFamily;
1238 }
1239 
1240 void  SwDocShell::LoadStyles( SfxObjectShell& rSource )
1241 {
1242     _LoadStyles(rSource, sal_False);
1243 }
1244 /* -----------------16.05.2003 15:45-----------------
1245     bPreserveCurrentDocument determines whether SetFixFields() is called
1246     This call modifies the source document. This mustn't happen when the source
1247     is a document the user is working on.
1248     Calls of ::LoadStyles() normally use files especially loaded for the purpose
1249     of importing styles.
1250  --------------------------------------------------*/
1251 void SwDocShell::_LoadStyles( SfxObjectShell& rSource, sal_Bool bPreserveCurrentDocument )
1252 {
1253 /*  [Beschreibung]
1254 
1255     Diese Methode wird vom SFx gerufen, wenn aus einer Dokument-Vorlage
1256     Styles nachgeladen werden sollen. Bestehende Styles soll dabei
1257     "uberschrieben werden. Das Dokument mu"s daher neu formatiert werden.
1258     Daher werden die Applikationen in der Regel diese Methode "uberladen
1259     und in ihrer Implementierung die Implementierung der Basisklasse
1260     rufen.
1261 */
1262     // ist die Source unser Document, dann uebernehmen wir das
1263     // abpruefen selbst (wesentlich schneller und laeuft nicht ueber
1264     // die Kruecke SfxStylePool
1265     if( rSource.ISA( SwDocShell ))
1266     {
1267         //JP 28.05.99: damit die Kopf-/Fusszeilen nicht den fixen Inhalt
1268         //              der Vorlage erhalten, einmal alle FixFelder der
1269         //              Source aktualisieren
1270         if(!bPreserveCurrentDocument)
1271             ((SwDocShell&)rSource).pDoc->SetFixFields(false, NULL);
1272         if( pWrtShell )
1273         {
1274             pWrtShell->StartAllAction();
1275             pDoc->ReplaceStyles( *((SwDocShell&)rSource).pDoc );
1276             pWrtShell->EndAllAction();
1277         }
1278         else
1279         {
1280             sal_Bool bModified = pDoc->IsModified();
1281             pDoc->ReplaceStyles( *((SwDocShell&)rSource).pDoc );
1282             if( !bModified && pDoc->IsModified() && !pView )
1283             {
1284                 // die View wird spaeter angelegt, ueberschreibt aber das
1285                 // Modify-Flag. Per Undo ist sowieso nichts mehr zu machen
1286                 pDoc->GetIDocumentUndoRedo().SetUndoNoResetModified();
1287             }
1288         }
1289     }
1290     else
1291         SfxObjectShell::LoadStyles( rSource );
1292 }
1293 
1294 
1295 void SwDocShell::FormatPage(
1296     const String& rPage,
1297     const sal_uInt16 nSlot,
1298     SwWrtShell& rActShell )
1299 {
1300     Edit( rPage, aEmptyStr, SFX_STYLE_FAMILY_PAGE, 0, sal_False, nSlot, &rActShell);
1301 }
1302 
1303 Bitmap SwDocShell::GetStyleFamilyBitmap( SfxStyleFamily eFamily, BmpColorMode eColorMode )
1304 {
1305     if( SFX_STYLE_FAMILY_PSEUDO == eFamily )
1306     {
1307         if ( eColorMode == BMP_COLOR_NORMAL )
1308             return Bitmap( SW_RES( BMP_STYLES_FAMILY_NUM ));
1309         else
1310             return Bitmap( SW_RES( BMP_STYLES_FAMILY_NUM_HC ));
1311     }
1312 
1313     return SfxObjectShell::GetStyleFamilyBitmap( eFamily, eColorMode );
1314 }
1315 
1316 
1317 
1318