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