xref: /AOO41X/main/sw/source/ui/app/docst.cxx (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
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             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, sal_False, 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, sal_False, 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( const String &rName, const String &rParent, sal_uInt16 nFamily, sal_uInt16 nMask,
513                          sal_Bool bNew, sal_Bool bColumn, SwWrtShell* pActShell,
514                          sal_Bool bBasic )
515 {
516     ASSERT(GetWrtShell(), "Keine Shell, keine Styles");
517     SfxStyleSheetBase *pStyle = 0;
518 
519     sal_uInt16 nRet = nMask;
520     sal_Bool bModified = pDoc->IsModified();
521 
522     if( bNew )
523     {
524         if( SFXSTYLEBIT_ALL != nMask && SFXSTYLEBIT_USED != nMask )
525             nMask |= SFXSTYLEBIT_USERDEF;
526         else
527             nMask = SFXSTYLEBIT_USERDEF;
528 
529         pStyle = &mxBasePool->Make( rName, (SfxStyleFamily)nFamily, nMask );
530 
531         // die aktuellen als Parent setzen
532         SwDocStyleSheet* pDStyle = (SwDocStyleSheet*)pStyle;
533         switch( nFamily )
534         {
535             case SFX_STYLE_FAMILY_PARA:
536             {
537                 if(rParent.Len())
538                 {
539                     SwTxtFmtColl* pColl = pWrtShell->FindTxtFmtCollByName( rParent );
540                     if(!pColl)
541                     {
542                         sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rParent, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL);
543                         if(USHRT_MAX != nId)
544                             pColl =  pWrtShell->GetTxtCollFromPool( nId );
545                     }
546                     pDStyle->GetCollection()->SetDerivedFrom( pColl );
547                     pDStyle->PresetParent( rParent );
548 
549                     //#outline level,add by zhaojianwei
550                      /*When a new paragraph style is created based on a "to outline style
551                         assigned" paragraph style, the outline level attribute and the list
552                         style attribute of the new paragraph style have to be set to 0
553                         respectively "".*/
554                     if( pColl->IsAssignedToListLevelOfOutlineStyle())
555                     {
556                         SwNumRuleItem aItem(aEmptyStr);
557                         pDStyle->GetCollection()->SetFmtAttr( aItem );
558                         pDStyle->GetCollection()->SetAttrOutlineLevel( 0 );
559                     }
560                     //<-end,zhaojianwei
561 
562                 }
563                 else
564                 {
565                     SwTxtFmtColl* pColl = pWrtShell->GetCurTxtFmtColl();
566                     pDStyle->GetCollection()->SetDerivedFrom( pColl );
567                     if( pColl )
568                         pDStyle->PresetParent( pColl->GetName() );
569                 }
570             }
571             break;
572             case SFX_STYLE_FAMILY_CHAR:
573             {
574                 if(rParent.Len())
575                 {
576                     SwCharFmt* pCFmt = pWrtShell->FindCharFmtByName( rParent );
577                     if(!pCFmt)
578                     {
579                         sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rParent, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT);
580                         if(USHRT_MAX != nId)
581                             pCFmt =  pWrtShell->GetCharFmtFromPool( nId );
582                     }
583 
584                     pDStyle->GetCharFmt()->SetDerivedFrom( pCFmt );
585                     pDStyle->PresetParent( rParent );
586                 }
587                 else
588                 {
589                     SwCharFmt* pCFmt = pWrtShell->GetCurCharFmt();
590                     pDStyle->GetCharFmt()->SetDerivedFrom( pCFmt );
591                         if( pCFmt )
592                             pDStyle->PresetParent( pCFmt->GetName() );
593                 }
594             }
595             break;
596             case SFX_STYLE_FAMILY_FRAME :
597             {
598                 if(rParent.Len())
599                 {
600                     SwFrmFmt* pFFmt = pWrtShell->GetDoc()->FindFrmFmtByName( rParent );
601                     if(!pFFmt)
602                     {
603                         sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rParent, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT);
604                         if(USHRT_MAX != nId)
605                             pFFmt =  pWrtShell->GetFrmFmtFromPool( nId );
606                     }
607                     pDStyle->GetFrmFmt()->SetDerivedFrom( pFFmt );
608                     pDStyle->PresetParent( rParent );
609                 }
610             }
611             break;
612         }
613     }
614     else
615     {
616         pStyle = mxBasePool->Find( rName, (SfxStyleFamily)nFamily );
617         ASSERT(pStyle, "Vorlage nicht gefunden");
618     }
619 
620     if(!pStyle)
621         return sal_False;
622 
623     // Dialoge zusammenstoepseln
624     //
625     rtl::Reference< SwDocStyleSheet > xTmp( new SwDocStyleSheet( *(SwDocStyleSheet*)pStyle ) );
626     if( SFX_STYLE_FAMILY_PARA == nFamily )
627     {
628         SfxItemSet& rSet = xTmp->GetItemSet();
629         ::SwToSfxPageDescAttr( rSet );
630         // erstmal nur eine Null
631         rSet.Put(SwBackgroundDestinationItem(SID_PARA_BACKGRND_DESTINATION, 0));
632         // --> OD 2008-02-13 #newlistlevelattrs#
633         // merge list level indent attributes into the item set if needed
634         xTmp->MergeIndentAttrsOfListStyle( rSet );
635         // <--
636     }
637 /*  else if( SFX_STYLE_FAMILY_FRAME == nFamily )
638     {
639         // Auskommentiert wegen Bug #45776 (per default keine Breite&Groesse in Rahmenvorlagen)
640         SfxItemSet& rSet = aTmp.GetItemSet();
641         if( SFX_ITEM_SET != rSet.GetItemState( RES_FRM_SIZE ))
642         {
643             // dann sollten wir spaetesten hier eines anlegen
644             SwFrmValid aFrmDefValues;
645             rSet.Put( SwFmtFrmSize( ATT_VAR_SIZE, aFrmDefValues.nWidth,
646                                     aFrmDefValues.nHeight ));
647         }
648     }*/
649     else if( SFX_STYLE_FAMILY_CHAR == nFamily )
650     {
651         SfxItemSet& rSet = xTmp->GetItemSet();
652         const SfxPoolItem *pTmpBrush;
653         if( SFX_ITEM_SET == rSet.GetItemState( RES_CHRATR_BACKGROUND,
654             sal_True, &pTmpBrush ) )
655         {
656             SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
657             aTmpBrush.SetWhich( RES_BACKGROUND );
658             rSet.Put( aTmpBrush );
659         }
660     }
661     if (!bBasic)
662     {
663         // vor dem Dialog wird der HtmlMode an der DocShell versenkt
664         sal_uInt16 nHtmlMode = ::GetHtmlMode(this);
665 
666         // In HTML mode, we do not always have a printer. In order to show
667         // the correct page size in the Format - Page dialog, we have to
668         // get one here.
669         SwWrtShell* pCurrShell = ( pActShell ? pActShell : pWrtShell );
670         if( ( HTMLMODE_ON & nHtmlMode ) &&
671             !pCurrShell->getIDocumentDeviceAccess()->getPrinter( false ) )
672             pCurrShell->InitPrt( pCurrShell->getIDocumentDeviceAccess()->getPrinter( true ) );
673 
674         PutItem(SfxUInt16Item(SID_HTML_MODE, nHtmlMode));
675         FieldUnit eMetric = ::GetDfltMetric(0 != (HTMLMODE_ON&nHtmlMode));
676         SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)));
677         SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
678         DBG_ASSERT(pFact, "Dialogdiet fail!");
679         SfxAbstractTabDialog* pDlg = pFact->CreateTemplateDialog( DLG_TEMPLATE_BASE,
680                                                     0, *(xTmp.get()), nFamily, bColumn,
681                                                     pActShell ? pActShell : pWrtShell, bNew);
682         DBG_ASSERT(pDlg, "Dialogdiet fail!");
683         if(RET_OK == pDlg->Execute())
684         {
685             GetWrtShell()->StartAllAction();
686 
687             // nur bei Absatz-Vorlagen die Maske neu setzen
688             if( bNew )
689             {
690                 nRet = SFX_STYLE_FAMILY_PARA == pStyle->GetFamily()
691                         ? xTmp->GetMask()
692                         : SFXSTYLEBIT_USERDEF;
693             }
694             else if( pStyle->GetMask() != xTmp->GetMask() )
695                 nRet = xTmp->GetMask();
696 
697             if( SFX_STYLE_FAMILY_PARA == nFamily )
698             {
699                 SfxItemSet aSet( *pDlg->GetOutputItemSet() );
700                 ::SfxToSwPageDescAttr( *GetWrtShell(), aSet  );
701                 // --> OD 2008-02-12 #newlistlevelattrs#
702                 // reset indent attributes at paragraph style, if a list style
703                 // will be applied and no indent attributes will be applied.
704                 xTmp->SetItemSet( aSet, true );
705                 // <--
706             }
707             else
708             {
709                 if(SFX_STYLE_FAMILY_PAGE == nFamily)
710                 {
711                     static const sal_uInt16 aInval[] = {
712                         SID_IMAGE_ORIENTATION,
713                         SID_ATTR_CHAR_FONT,
714                         FN_INSERT_CTRL, FN_INSERT_OBJ_CTRL, 0};
715                     pView->GetViewFrame()->GetBindings().Invalidate(aInval);
716                 }
717                 SfxItemSet aTmpSet( *pDlg->GetOutputItemSet() );
718                 if( SFX_STYLE_FAMILY_CHAR == nFamily )
719                 {
720                     const SfxPoolItem *pTmpBrush;
721                     if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_BACKGROUND,
722                         sal_False, &pTmpBrush ) )
723                     {
724                         SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
725                         aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
726                         aTmpSet.Put( aTmpBrush );
727                     }
728                     aTmpSet.ClearItem( RES_BACKGROUND );
729                 }
730                 xTmp->SetItemSet( aTmpSet );
731 
732                 if( SFX_STYLE_FAMILY_PAGE == nFamily && SvtLanguageOptions().IsCTLFontEnabled() )
733                 {
734                     const SfxPoolItem *pItem = NULL;
735                     if( aTmpSet.GetItemState( GetPool().GetTrueWhich( SID_ATTR_FRAMEDIRECTION, sal_False ) , sal_True, &pItem ) == SFX_ITEM_SET )
736                         SwChartHelper::DoUpdateAllCharts( pDoc );
737                 }
738             }
739             if(SFX_STYLE_FAMILY_PAGE == nFamily)
740                 pView->InvalidateRulerPos();
741 
742             if( bNew )
743                 mxBasePool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *xTmp.get() ) );
744 
745             // JP 19.09.97:
746             // Dialog vorm EndAction zerstoeren - bei Seitenvorlagen kann
747             // muss der ItemSet zerstoert werden, damit die Cursor aus den
748             // Kopf-/Fusszeilen entfernt werden. Sonst kommts zu GPFs!!!
749             delete pDlg;
750 
751             pDoc->SetModified();
752             if( !bModified )    // Bug 57028
753             {
754                 pDoc->GetIDocumentUndoRedo().SetUndoNoResetModified();
755             }
756 
757             GetWrtShell()->EndAllAction();
758         }
759         else
760         {
761             if( bNew )
762             {
763                 // #116530#
764                 //pBasePool->Erase( &aTmp );
765                 GetWrtShell()->Undo(1);
766                 pDoc->GetIDocumentUndoRedo().ClearRedo();
767             }
768 
769             if( !bModified )
770                 pDoc->ResetModified();
771             delete pDlg;
772         }
773     }
774     else
775     {
776         // vor dem Dialog wird der HtmlMode an der DocShell versenkt
777         PutItem(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(this)));
778 
779         GetWrtShell()->StartAllAction();
780 
781         // nur bei Absatz-Vorlagen die Maske neu setzen
782         if( bNew )
783         {
784             nRet = SFX_STYLE_FAMILY_PARA == pStyle->GetFamily()
785                     ? xTmp->GetMask()
786                     : SFXSTYLEBIT_USERDEF;
787         }
788         else if( pStyle->GetMask() != xTmp->GetMask() )
789             nRet = xTmp->GetMask();
790 
791         if( SFX_STYLE_FAMILY_PARA == nFamily )
792             ::SfxToSwPageDescAttr( *GetWrtShell(), xTmp->GetItemSet() );
793         else
794         {
795             SfxItemSet aTmpSet( xTmp->GetItemSet() );
796             if( SFX_STYLE_FAMILY_CHAR == nFamily )
797             {
798                 const SfxPoolItem *pTmpBrush;
799                 if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_BACKGROUND,
800                     sal_False, &pTmpBrush ) )
801                 {
802                     SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
803                     aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
804                     aTmpSet.Put( aTmpBrush );
805                 }
806                 aTmpSet.ClearItem( RES_BACKGROUND );
807             }
808             xTmp->SetItemSet( aTmpSet );
809         }
810         if(SFX_STYLE_FAMILY_PAGE == nFamily)
811             pView->InvalidateRulerPos();
812 
813         if( bNew )
814             mxBasePool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *xTmp.get() ) );
815 
816         pDoc->SetModified();
817         if( !bModified )        // Bug 57028
818         {
819             pDoc->GetIDocumentUndoRedo().SetUndoNoResetModified();
820         }
821         GetWrtShell()->EndAllAction();
822     }
823 
824     return nRet;
825 }
826 
827 /*--------------------------------------------------------------------
828     Beschreibung:   Delete
829  --------------------------------------------------------------------*/
830 
831 
832 sal_uInt16 SwDocShell::Delete(const String &rName, sal_uInt16 nFamily)
833 {
834     SfxStyleSheetBase *pStyle = mxBasePool->Find(rName, (SfxStyleFamily)nFamily);
835 
836     if(pStyle)
837     {
838         ASSERT(GetWrtShell(), "Keine Shell, keine Styles");
839 
840         GetWrtShell()->StartAllAction();
841         mxBasePool->Remove(pStyle);
842         GetWrtShell()->EndAllAction();
843 
844         return sal_True;
845     }
846     return sal_False;
847 }
848 
849 /*--------------------------------------------------------------------
850     Beschreibung:   Vorlage anwenden
851  --------------------------------------------------------------------*/
852 
853 
854 sal_uInt16 SwDocShell::ApplyStyles(const String &rName, sal_uInt16 nFamily,
855                                SwWrtShell* pShell, sal_uInt16 nMode )
856 {
857     SwDocStyleSheet* pStyle =
858         (SwDocStyleSheet*)mxBasePool->Find(rName, (SfxStyleFamily)nFamily);
859 
860     ASSERT(pStyle, "Wo ist der StyleSheet");
861     if(!pStyle)
862         return sal_False;
863 
864     SwWrtShell *pSh = pShell ? pShell : GetWrtShell();
865 
866     ASSERT( pSh, "Keine Shell, keine Styles");
867 
868     pSh->StartAllAction();
869 
870     switch(nFamily)
871     {
872         case SFX_STYLE_FAMILY_CHAR:
873         {
874             SwFmtCharFmt aFmt(pStyle->GetCharFmt());
875             pSh->SetAttr( aFmt, (nMode & KEY_SHIFT) ?
876                 nsSetAttrMode::SETATTR_DONTREPLACE : nsSetAttrMode::SETATTR_DEFAULT );
877             break;
878         }
879         case SFX_STYLE_FAMILY_PARA:
880         {
881             // --> OD 2007-11-06 #i62675#
882             // clear also list attributes at affected text nodes, if paragraph
883             // style has the list style attribute set.
884             pSh->SetTxtFmtColl( pStyle->GetCollection(), true );
885             // <--
886             break;
887         }
888         case SFX_STYLE_FAMILY_FRAME:
889         {
890             if ( pSh->IsFrmSelected() )
891                 pSh->SetFrmFmt( pStyle->GetFrmFmt() );
892             break;
893         }
894         case SFX_STYLE_FAMILY_PAGE:
895         {
896             pSh->SetPageStyle(pStyle->GetPageDesc()->GetName());
897             break;
898         }
899         case SFX_STYLE_FAMILY_PSEUDO:
900         {
901             // --> OD 2008-02-08 #newlistlevelattrs#
902             // reset indent attribute on applying list style
903             // --> OD 2008-03-17 #refactorlists#
904             // continue list of list style
905             const SwNumRule* pNumRule = pStyle->GetNumRule();
906             const String sListIdForStyle =pNumRule->GetDefaultListId();
907             pSh->SetCurNumRule( *pNumRule, false, sListIdForStyle, true );
908             // <--
909             break;
910         }
911         default:
912             DBG_ERROR("Unbekannte Familie");
913     }
914     pSh->EndAllAction();
915 
916     return nFamily;
917 }
918 
919 /*--------------------------------------------------------------------
920     Beschreibung:   Giesskanne starten
921  --------------------------------------------------------------------*/
922 
923 
924 
925 sal_uInt16 SwDocShell::DoWaterCan(const String &rName, sal_uInt16 nFamily)
926 {
927     ASSERT(GetWrtShell(), "Keine Shell, keine Styles");
928 
929     SwEditWin& rEdtWin = pView->GetEditWin();
930     SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
931     sal_Bool bWaterCan = !(pApply && pApply->eType != 0);
932     if( !rName.Len() )
933         bWaterCan = sal_False;
934     SwApplyTemplate aTemplate;
935     aTemplate.eType = nFamily;
936 
937     if(bWaterCan)
938     {
939         SwDocStyleSheet* pStyle =
940             (SwDocStyleSheet*)mxBasePool->Find(rName, (SfxStyleFamily)nFamily);
941 
942         ASSERT(pStyle, "Wo ist der StyleSheet");
943         if(!pStyle) return nFamily;
944 
945         switch(nFamily)
946         {
947             case SFX_STYLE_FAMILY_CHAR:
948                 aTemplate.aColl.pCharFmt = pStyle->GetCharFmt();
949                 break;
950             case SFX_STYLE_FAMILY_PARA:
951                 aTemplate.aColl.pTxtColl = pStyle->GetCollection();
952                 break;
953             case SFX_STYLE_FAMILY_FRAME:
954                 aTemplate.aColl.pFrmFmt = pStyle->GetFrmFmt();
955                 break;
956             case SFX_STYLE_FAMILY_PAGE:
957                 aTemplate.aColl.pPageDesc = (SwPageDesc*)pStyle->GetPageDesc();
958                 break;
959             case SFX_STYLE_FAMILY_PSEUDO:
960                 aTemplate.aColl.pNumRule = (SwNumRule*)pStyle->GetNumRule();
961                 break;
962 
963             default:
964                 DBG_ERROR( "Unbekannte Familie");
965         }
966     }
967     else
968         aTemplate.eType = 0;
969 
970     // Template anwenden
971     pView->GetEditWin().SetApplyTemplate(aTemplate);
972 
973     return nFamily;
974 }
975 
976 /*--------------------------------------------------------------------
977     Beschreibung:   Vorlage Updaten
978  --------------------------------------------------------------------*/
979 
980 
981 sal_uInt16 SwDocShell::UpdateStyle(const String &rName, sal_uInt16 nFamily, SwWrtShell* pShell)
982 {
983     SwWrtShell* pCurrWrtShell = pShell ? pShell : GetWrtShell();
984     ASSERT(GetWrtShell(), "Keine Shell, keine Styles");
985 
986     SwDocStyleSheet* pStyle =
987         (SwDocStyleSheet*)mxBasePool->Find(rName, (SfxStyleFamily)nFamily);
988 
989     if(!pStyle)
990         return nFamily;
991 
992     switch(nFamily)
993     {
994         case SFX_STYLE_FAMILY_PARA:
995         {
996             SwTxtFmtColl* pColl = pStyle->GetCollection();
997             if(pColl && !pColl->IsDefault())
998             {
999                 GetWrtShell()->StartAllAction();
1000 
1001                 SwRewriter aRewriter;
1002                 aRewriter.AddRule(UNDO_ARG1, pColl->GetName());
1003 
1004                 GetWrtShell()->StartUndo(UNDO_INSFMTATTR, &aRewriter);
1005                 GetWrtShell()->FillByEx(pColl);
1006                     // Vorlage auch anwenden, um harte Attributierung
1007                     // zu entfernen
1008                 GetWrtShell()->SetTxtFmtColl( pColl );
1009                 GetWrtShell()->EndUndo();
1010                 GetWrtShell()->EndAllAction();
1011             }
1012             break;
1013         }
1014         case SFX_STYLE_FAMILY_FRAME:
1015         {
1016             SwFrmFmt* pFrm = pStyle->GetFrmFmt();
1017             if( pCurrWrtShell->IsFrmSelected() && pFrm && !pFrm->IsDefault() )
1018             {
1019                 SfxItemSet aSet( GetPool(), aFrmFmtSetRange );
1020                 pCurrWrtShell->StartAllAction();
1021                 pCurrWrtShell->GetFlyFrmAttr( aSet );
1022 
1023                 // --> OD 2009-12-28 #i105535#
1024                 // no update of anchor attribute
1025                 aSet.ClearItem( RES_ANCHOR );
1026                 // <--
1027 
1028                 pFrm->SetFmtAttr( aSet );
1029 
1030                     // Vorlage auch anwenden, um harte Attributierung
1031                     // zu entfernen
1032                 pCurrWrtShell->SetFrmFmt( pFrm, sal_True );
1033                 pCurrWrtShell->EndAllAction();
1034             }
1035         }
1036         break;
1037         case SFX_STYLE_FAMILY_CHAR:
1038         {
1039             SwCharFmt* pChar = pStyle->GetCharFmt();
1040             if( pChar && !pChar->IsDefault() )
1041             {
1042                 pCurrWrtShell->StartAllAction();
1043                 pCurrWrtShell->FillByEx(pChar);
1044                     // Vorlage auch anwenden, um harte Attributierung
1045                     // zu entfernen
1046                 pCurrWrtShell->EndAllAction();
1047             }
1048 
1049         }
1050         break;
1051         case SFX_STYLE_FAMILY_PSEUDO:
1052         {
1053             const SwNumRule* pCurRule;
1054             if( pStyle->GetNumRule() &&
1055                 0 != ( pCurRule = pCurrWrtShell->GetCurNumRule() ))
1056             {
1057                 SwNumRule aRule( *pCurRule );
1058                 // --> OD 2008-07-08 #i91400#
1059                 aRule.SetName( pStyle->GetNumRule()->GetName(),
1060                                *(pCurrWrtShell->GetDoc()) );
1061                 // <--
1062                 pCurrWrtShell->ChgNumRuleFmts( aRule );
1063             }
1064         }
1065         break;
1066     }
1067     return nFamily;
1068 }
1069 
1070 /*--------------------------------------------------------------------
1071     Beschreibung:   NewByExample
1072  --------------------------------------------------------------------*/
1073 
1074 
1075 sal_uInt16 SwDocShell::MakeByExample( const String &rName, sal_uInt16 nFamily,
1076                                     sal_uInt16 nMask, SwWrtShell* pShell )
1077 {
1078     SwWrtShell* pCurrWrtShell = pShell ? pShell : GetWrtShell();
1079     SwDocStyleSheet* pStyle = (SwDocStyleSheet*)mxBasePool->Find(
1080                                             rName, (SfxStyleFamily)nFamily );
1081     if(!pStyle)
1082     {
1083         // JP 07.07.95: behalte die akt. Maske vom PI bei, dadurch werden
1084         //              neue sofort in den sichtbaren Bereich einsortiert
1085         if( SFXSTYLEBIT_ALL == nMask || SFXSTYLEBIT_USED == nMask )
1086             nMask = SFXSTYLEBIT_USERDEF;
1087         else
1088             nMask |= SFXSTYLEBIT_USERDEF;
1089 
1090         pStyle = (SwDocStyleSheet*)&mxBasePool->Make(rName,
1091                                 (SfxStyleFamily)nFamily, nMask );
1092     }
1093 
1094     switch(nFamily)
1095     {
1096         case  SFX_STYLE_FAMILY_PARA:
1097         {
1098             SwTxtFmtColl* pColl = pStyle->GetCollection();
1099             if(pColl && !pColl->IsDefault())
1100             {
1101                 pCurrWrtShell->StartAllAction();
1102                 pCurrWrtShell->FillByEx(pColl);
1103                     // Vorlage auch anwenden, um harte Attributierung
1104                     // zu entfernen
1105                 pColl->SetDerivedFrom(pCurrWrtShell->GetCurTxtFmtColl());
1106 
1107                     // setze die Maske noch an der Collection:
1108                 sal_uInt16 nId = pColl->GetPoolFmtId() & 0x87ff;
1109                 switch( nMask & 0x0fff )
1110                 {
1111                 case SWSTYLEBIT_TEXT:
1112                     nId |= COLL_TEXT_BITS;
1113                     break;
1114                 case SWSTYLEBIT_CHAPTER:
1115                     nId |= COLL_DOC_BITS;
1116                     break;
1117                 case SWSTYLEBIT_LIST:
1118                     nId |= COLL_LISTS_BITS;
1119                     break;
1120                 case SWSTYLEBIT_IDX:
1121                     nId |= COLL_REGISTER_BITS;
1122                     break;
1123                 case SWSTYLEBIT_EXTRA:
1124                     nId |= COLL_EXTRA_BITS;
1125                     break;
1126                 case SWSTYLEBIT_HTML:
1127                     nId |= COLL_HTML_BITS;
1128                     break;
1129                 }
1130                 pColl->SetPoolFmtId(nId);
1131 
1132                 pCurrWrtShell->SetTxtFmtColl(pColl);
1133                 pCurrWrtShell->EndAllAction();
1134             }
1135         }
1136         break;
1137         case SFX_STYLE_FAMILY_FRAME:
1138         {
1139             SwFrmFmt* pFrm = pStyle->GetFrmFmt();
1140             if(pCurrWrtShell->IsFrmSelected() && pFrm && !pFrm->IsDefault())
1141             {
1142                 pCurrWrtShell->StartAllAction();
1143 
1144                 SfxItemSet aSet(GetPool(), aFrmFmtSetRange );
1145                 pCurrWrtShell->GetFlyFrmAttr( aSet );
1146 
1147                 SwFrmFmt* pFFmt = pCurrWrtShell->GetCurFrmFmt();
1148                 pFrm->SetDerivedFrom( pFFmt );
1149 
1150                 // JP 10.06.98: nur automatische Orientierungen uebernehmen
1151 /*              #61359# jetzt auch wieder alle Orientierungen
1152                 const SfxPoolItem* pItem;
1153                 if( SFX_ITEM_SET == aSet.GetItemState( RES_VERT_ORIENT,
1154                     sal_False, &pItem ) &&
1155                     text::VertOrientation::NONE == ((SwFmtVertOrient*)pItem)->GetVertOrient())
1156                     aSet.ClearItem( RES_VERT_ORIENT );
1157 
1158                 if( SFX_ITEM_SET == aSet.GetItemState( RES_HORI_ORIENT,
1159                     sal_False, &pItem ) &&
1160                     text::HoriOrientation::NONE == ((SwFmtHoriOrient*)pItem)->GetHoriOrient())
1161                     aSet.ClearItem( RES_HORI_ORIENT );
1162  */
1163 
1164                 pFrm->SetFmtAttr( aSet );
1165                     // Vorlage auch anwenden, um harte Attributierung
1166                     // zu entfernen
1167                 pCurrWrtShell->SetFrmFmt( pFrm );
1168                 pCurrWrtShell->EndAllAction();
1169             }
1170         }
1171         break;
1172         case SFX_STYLE_FAMILY_CHAR:
1173         {
1174             SwCharFmt* pChar = pStyle->GetCharFmt();
1175             if(pChar && !pChar->IsDefault())
1176             {
1177                 pCurrWrtShell->StartAllAction();
1178                 pCurrWrtShell->FillByEx( pChar );
1179                 pChar->SetDerivedFrom( pCurrWrtShell->GetCurCharFmt() );
1180                 SwFmtCharFmt aFmt( pChar );
1181                 pCurrWrtShell->SetAttr( aFmt );
1182                 pCurrWrtShell->EndAllAction();
1183             }
1184         }
1185         break;
1186 
1187         case SFX_STYLE_FAMILY_PAGE:
1188         {
1189             pCurrWrtShell->StartAllAction();
1190             sal_uInt16 nPgDsc = pCurrWrtShell->GetCurPageDesc();
1191             SwPageDesc& rSrc = (SwPageDesc&)pCurrWrtShell->GetPageDesc( nPgDsc );
1192             SwPageDesc& rDest = *(SwPageDesc*)pStyle->GetPageDesc();
1193 
1194             sal_uInt16 nPoolId = rDest.GetPoolFmtId();
1195             sal_uInt16 nHId = rDest.GetPoolHelpId();
1196             sal_uInt8 nHFId = rDest.GetPoolHlpFileId();
1197 
1198             pCurrWrtShell->GetDoc()->CopyPageDesc( rSrc, rDest );
1199 
1200             // PoolId darf NIE kopiert werden!
1201             rDest.SetPoolFmtId( nPoolId );
1202             rDest.SetPoolHelpId( nHId );
1203             rDest.SetPoolHlpFileId( nHFId );
1204 
1205             // werden Kopf-/Fusszeilen angelegt, so gibt es kein Undo mehr!
1206             pCurrWrtShell->GetDoc()->GetIDocumentUndoRedo().DelAllUndoObj();
1207 
1208             pCurrWrtShell->EndAllAction();
1209         }
1210         break;
1211 
1212         case SFX_STYLE_FAMILY_PSEUDO:
1213         {
1214             pCurrWrtShell->StartAllAction();
1215 
1216             SwNumRule aRule( *pCurrWrtShell->GetCurNumRule() );
1217             String sOrigRule( aRule.GetName() );
1218             // --> OD 2008-07-08 #i91400#
1219             aRule.SetName( pStyle->GetNumRule()->GetName(),
1220                            *(pCurrWrtShell->GetDoc()) );
1221             // <--
1222             pCurrWrtShell->ChgNumRuleFmts( aRule );
1223 
1224             pCurrWrtShell->ReplaceNumRule( sOrigRule, aRule.GetName() );
1225 
1226 
1227             pCurrWrtShell->EndAllAction();
1228         }
1229         break;
1230     }
1231     return nFamily;
1232 }
1233 
1234 void  SwDocShell::LoadStyles( SfxObjectShell& rSource )
1235 {
1236     _LoadStyles(rSource, sal_False);
1237 }
1238 /* -----------------16.05.2003 15:45-----------------
1239     bPreserveCurrentDocument determines whether SetFixFields() is called
1240     This call modifies the source document. This mustn't happen when the source
1241     is a document the user is working on.
1242     Calls of ::LoadStyles() normally use files especially loaded for the purpose
1243     of importing styles.
1244  --------------------------------------------------*/
1245 void SwDocShell::_LoadStyles( SfxObjectShell& rSource, sal_Bool bPreserveCurrentDocument )
1246 {
1247 /*  [Beschreibung]
1248 
1249     Diese Methode wird vom SFx gerufen, wenn aus einer Dokument-Vorlage
1250     Styles nachgeladen werden sollen. Bestehende Styles soll dabei
1251     "uberschrieben werden. Das Dokument mu"s daher neu formatiert werden.
1252     Daher werden die Applikationen in der Regel diese Methode "uberladen
1253     und in ihrer Implementierung die Implementierung der Basisklasse
1254     rufen.
1255 */
1256     // ist die Source unser Document, dann uebernehmen wir das
1257     // abpruefen selbst (wesentlich schneller und laeuft nicht ueber
1258     // die Kruecke SfxStylePool
1259     if( rSource.ISA( SwDocShell ))
1260     {
1261         //JP 28.05.99: damit die Kopf-/Fusszeilen nicht den fixen Inhalt
1262         //              der Vorlage erhalten, einmal alle FixFelder der
1263         //              Source aktualisieren
1264         if(!bPreserveCurrentDocument)
1265             ((SwDocShell&)rSource).pDoc->SetFixFields(false, NULL);
1266         if( pWrtShell )
1267         {
1268             pWrtShell->StartAllAction();
1269             pDoc->ReplaceStyles( *((SwDocShell&)rSource).pDoc );
1270             pWrtShell->EndAllAction();
1271         }
1272         else
1273         {
1274             sal_Bool bModified = pDoc->IsModified();
1275             pDoc->ReplaceStyles( *((SwDocShell&)rSource).pDoc );
1276             if( !bModified && pDoc->IsModified() && !pView )
1277             {
1278                 // die View wird spaeter angelegt, ueberschreibt aber das
1279                 // Modify-Flag. Per Undo ist sowieso nichts mehr zu machen
1280                 pDoc->GetIDocumentUndoRedo().SetUndoNoResetModified();
1281             }
1282         }
1283     }
1284     else
1285         SfxObjectShell::LoadStyles( rSource );
1286 }
1287 
1288 
1289 void SwDocShell::FormatPage( const String& rPage, sal_Bool bColumn, SwWrtShell*     pActShell )
1290 {
1291     Edit( rPage, aEmptyStr, SFX_STYLE_FAMILY_PAGE, 0, sal_False, bColumn, pActShell);
1292 }
1293 
1294 Bitmap SwDocShell::GetStyleFamilyBitmap( SfxStyleFamily eFamily, BmpColorMode eColorMode )
1295 {
1296     if( SFX_STYLE_FAMILY_PSEUDO == eFamily )
1297     {
1298         if ( eColorMode == BMP_COLOR_NORMAL )
1299             return Bitmap( SW_RES( BMP_STYLES_FAMILY_NUM ));
1300         else
1301             return Bitmap( SW_RES( BMP_STYLES_FAMILY_NUM_HC ));
1302     }
1303 
1304     return SfxObjectShell::GetStyleFamilyBitmap( eFamily, eColorMode );
1305 }
1306 
1307 
1308 
1309