xref: /aoo4110/main/sw/source/ui/app/docst.cxx (revision b1cdbd2c)
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