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