xref: /trunk/main/sw/source/ui/misc/outline.cxx (revision efeef26f)
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 #ifdef SW_DLLIMPLEMENTATION
27 #undef SW_DLLIMPLEMENTATION
28 #endif
29 #include <hintids.hxx>
30 #include <tools/shl.hxx>
31 #ifndef _MENU_HXX //autogen
32 #include <vcl/menu.hxx>
33 #endif
34 #ifndef _MSGBOX_HXX //autogen
35 #include <vcl/msgbox.hxx>
36 #endif
37 #include <sfx2/tabdlg.hxx>
38 #include <editeng/brshitem.hxx>
39 #include <unotools/configmgr.hxx>
40 #include <SwStyleNameMapper.hxx>
41 
42 #ifndef _NUM_HXX //autogen
43 #define USE_NUMTABPAGES
44 #include <num.hxx>
45 #endif
46 #ifndef _VIEW_HXX
47 #include <view.hxx>
48 #endif
49 #ifndef _DOCSH_HXX
50 #include <docsh.hxx>
51 #endif
52 #include <uitool.hxx>
53 #include <errhdl.hxx>
54 #include <wrtsh.hxx>
55 #include <swmodule.hxx>
56 #include <fmtcol.hxx>
57 #include <outline.hxx>
58 #include <uinums.hxx>
59 #include <poolfmt.hxx>
60 #include <shellres.hxx>
61 #include <svl/style.hxx>
62 #include <charfmt.hxx>
63 #include <docstyle.hxx>
64 #include <viewopt.hxx>
65 #include <svtools/ctrlbox.hxx>
66 #ifndef _HELPID_H
67 #include <helpid.h>
68 #endif
69 #ifndef _GLOBALS_HRC
70 #include <globals.hrc>		// fuer Vorlagenname 'keins'
71 #endif
72 #ifndef _MISC_HRC
73 #include <misc.hrc>
74 #endif
75 #ifndef _OUTLINE_HRC
76 #include <outline.hrc>
77 #endif
78 #include <paratr.hxx>
79 
80 #include <unomid.h>
81 
82 #include <IDocumentOutlineNodes.hxx>
83 // --> OD 2008-04-14 #outlinelevel#
84 #include <app.hrc>
85 // <--
86 
87 #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_
88 #include <com/sun/star/accessibility/AccessibleRole.hpp>
89 #endif
90 
91 using namespace ::com::sun::star;
92 
93 /* -----------------------------31.01.01 10:23--------------------------------
94 
95  ---------------------------------------------------------------------------*/
96 
97 DBG_NAME(outlinehdl)
98 
99 /*---------------------------------------------------------------------
100 
101 ---------------------------------------------------------------------*/
102 
103 class SwNumNamesDlg: public ModalDialog
104 {
105     FixedLine    aFormFL;
106 	Edit         aFormEdit;
107 	ListBox      aFormBox;
108 	OKButton     aOKBtn;
109 	CancelButton aCancelBtn;
110 	HelpButton   aHelpBtn;
111 
112 	DECL_LINK( ModifyHdl, Edit * );
113 	DECL_LINK( SelectHdl, ListBox * );
114 	DECL_LINK( DoubleClickHdl, ListBox * );
115 
116 public:
117 	SwNumNamesDlg(Window *pParent);
118 	~SwNumNamesDlg();
119 	void SetUserNames(const String *pList[]);
GetName() const120 	String GetName() const { return aFormEdit.GetText(); }
GetCurEntryPos() const121 	sal_uInt16 GetCurEntryPos() const { return aFormBox.GetSelectEntryPos(); }
122 };
123 
124 /*------------------------------------------------------------------------
125  Beschreibung:  selektierten Eintrag merken
126 ------------------------------------------------------------------------*/
127 
128 
IMPL_LINK_INLINE_START(SwNumNamesDlg,SelectHdl,ListBox *,pBox)129 IMPL_LINK_INLINE_START( SwNumNamesDlg, SelectHdl, ListBox *, pBox )
130 {
131 	aFormEdit.SetText(pBox->GetSelectEntry());
132 	aFormEdit.SetSelection(Selection(0, SELECTION_MAX));
133 	return 0;
134 }
IMPL_LINK_INLINE_END(SwNumNamesDlg,SelectHdl,ListBox *,pBox)135 IMPL_LINK_INLINE_END( SwNumNamesDlg, SelectHdl, ListBox *, pBox )
136 
137 /*------------------------------------------------------------------------
138  Beschreibung:  Setzen der vom Benutzer vergebenen Namen
139  Parameter:     Liste der vom Benutzer vergebenen Namen;
140 				nicht vom Benutzer benannte Positionen sind 0.
141 ------------------------------------------------------------------------*/
142 
143 
144 void SwNumNamesDlg::SetUserNames(const String *pList[])
145 {
146 	sal_uInt16 nSelect = 0;
147 	for(sal_uInt16 i = 0; i < SwBaseNumRules::nMaxRules; ++i)
148 	{
149 		if(pList[i])
150 		{
151 			aFormBox.RemoveEntry(i);
152 			aFormBox.InsertEntry(*pList[i], i);
153 			if(i == nSelect && nSelect < SwBaseNumRules::nMaxRules)
154 				nSelect++;
155 		}
156 	}
157 	aFormBox.SelectEntryPos(nSelect);
158 	SelectHdl(&aFormBox);
159 }
160 /*------------------------------------------------------------------------
161  Beschreibung:  OK-Button freischalten, wenn Text im Edit steht.
162 ------------------------------------------------------------------------*/
163 
164 
IMPL_LINK_INLINE_START(SwNumNamesDlg,ModifyHdl,Edit *,pBox)165 IMPL_LINK_INLINE_START( SwNumNamesDlg, ModifyHdl, Edit *, pBox )
166 {
167 	aOKBtn.Enable(0 != pBox->GetText().Len());
168 	return 0;
169 }
IMPL_LINK_INLINE_END(SwNumNamesDlg,ModifyHdl,Edit *,pBox)170 IMPL_LINK_INLINE_END( SwNumNamesDlg, ModifyHdl, Edit *, pBox )
171 /*------------------------------------------------------------------------
172  Beschreibung:  DoubleClickHdl
173 ------------------------------------------------------------------------*/
174 
175 
176 IMPL_LINK_INLINE_START( SwNumNamesDlg, DoubleClickHdl, ListBox *, EMPTYARG )
177 {
178 	EndDialog(RET_OK);
179 	return 0;
180 }
IMPL_LINK_INLINE_END(SwNumNamesDlg,DoubleClickHdl,ListBox *,EMPTYARG)181 IMPL_LINK_INLINE_END( SwNumNamesDlg, DoubleClickHdl, ListBox *, EMPTYARG )
182 
183 /*--------------------------------------------------
184 
185 --------------------------------------------------*/
186 
187 SwNumNamesDlg::SwNumNamesDlg(Window *pParent)
188 	: ModalDialog(pParent, SW_RES(DLG_NUM_NAMES)),
189 	aFormFL(this, SW_RES(FL_FORM)),
190     aFormEdit(this, SW_RES(ED_FORM)),
191 	aFormBox(this, SW_RES(LB_FORM)),
192 	aOKBtn(this, SW_RES(BT_OK)),
193 	aCancelBtn(this, SW_RES(BT_CANCEL)),
194 	aHelpBtn(this, SW_RES(BT_HELP))
195 {
196 	FreeResource();
197 	aFormEdit.SetModifyHdl(LINK(this, SwNumNamesDlg, ModifyHdl));
198 	aFormBox.SetSelectHdl(LINK(this, SwNumNamesDlg, SelectHdl));
199 	aFormBox.SetDoubleClickHdl(LINK(this, SwNumNamesDlg, DoubleClickHdl));
200 	SelectHdl(&aFormBox);
201 }
202 
203 /*--------------------------------------------------
204 
205 --------------------------------------------------*/
206 
~SwNumNamesDlg()207 __EXPORT SwNumNamesDlg::~SwNumNamesDlg() {}
208 
209 
210 /* -----------------08.07.98 08:46-------------------
211  *
212  * --------------------------------------------------*/
lcl_BitToLevel(sal_uInt16 nActLevel)213 sal_uInt16 lcl_BitToLevel(sal_uInt16 nActLevel)
214 {
215 	sal_uInt16 nTmp = nActLevel;
216 	sal_uInt16 nTmpLevel = 0;
217 	while( 0 != (nTmp >>= 1) )
218 		nTmpLevel++;
219 	return nTmpLevel;
220 }
221 
222 /* -----------------07.07.98 14:13-------------------
223  *
224  * --------------------------------------------------*/
225 sal_uInt16 SwOutlineTabDialog::nNumLevel = 1;
SwOutlineTabDialog(Window * pParent,const SfxItemSet * pSwItemSet,SwWrtShell & rSh)226 SwOutlineTabDialog::SwOutlineTabDialog(Window* pParent,
227 					const SfxItemSet* pSwItemSet,
228 					SwWrtShell &rSh) :
229 									//der UserString wird danach richtig gesetzt
230 		SfxTabDialog(pParent, SW_RES(DLG_TAB_OUTLINE), pSwItemSet, sal_False, &aEmptyStr),
231         aNullStr(C2S("____")),
232 		aFormMenu(SW_RES(MN_FORM)),
233         rWrtSh(rSh),
234 		pChapterNumRules(SW_MOD()->GetChapterNumRules()),
235         bModified(rWrtSh.IsModified())
236 {
237     // --> OD 2008-04-14 #outlinelevel#
238     SetText( SW_RES( STR_OUTLINE_NUMBERING ) );
239     // <--
240     PushButton* pUserButton = GetUserButton();
241     pUserButton->SetText(SW_RES(ST_FORM));
242     pUserButton->SetHelpId(HID_OUTLINE_FORM);
243     pUserButton->SetClickHdl(LINK(this, SwOutlineTabDialog, FormHdl));
244 	pUserButton->SetAccessibleRole( com::sun::star::accessibility::AccessibleRole::BUTTON_MENU );
245 
246 	FreeResource();
247 	pNumRule = new SwNumRule( *rSh.GetOutlineNumRule() );
248 	GetCancelButton().SetClickHdl(LINK(this, SwOutlineTabDialog, CancelHdl));
249 
250 	AddTabPage(TP_NUM_POSITION	 , &SwNumPositionTabPage::Create, 0);
251 	AddTabPage(TP_OUTLINE_NUM	 , &SwOutlineSettingsTabPage::Create, 0);
252 
253 	String sHeadline;
254 	sal_uInt16 i;
255 
256 	for( i = 0; i < MAXLEVEL; ++i )
257 	{
258 		// wurde die Vorlage noch nicht angelegt, dann ist sie noch an dieserPosition
259 		if( !rWrtSh.GetParaStyle( sHeadline =
260             SwStyleNameMapper::GetUIName( static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i),
261                                           sHeadline )) )
262 			aCollNames[i] = sHeadline;
263 	}
264 
265 	// Erfragen der Gliederungsebenen der Textvorlagen
266 	const sal_uInt16 nCount = rWrtSh.GetTxtFmtCollCount();
267 	for(i = 0; i < nCount; ++i )
268 	{
269 		SwTxtFmtColl &rTxtColl = rWrtSh.GetTxtFmtColl(i);
270 		if(!rTxtColl.IsDefault())
271 		{
272 			//sal_uInt8 nOutLevel = rTxtColl.GetOutlineLevel();	//<-#outline level, removed out by zhaojianwei
273 			//if(nOutLevel != NO_NUMBERING)
274 			//->added by zhaojianwei
275 			if(rTxtColl.IsAssignedToListLevelOfOutlineStyle())
276 			{
277 				int nOutLevel = rTxtColl.GetAssignedOutlineStyleLevel();
278 				aCollNames[ nOutLevel ] = rTxtColl.GetName();
279 			}
280 			//<-end
281 		}
282 	}
283 }
284 
285 /* -----------------07.07.98 14:13-------------------
286  *
287  * --------------------------------------------------*/
~SwOutlineTabDialog()288 SwOutlineTabDialog::~SwOutlineTabDialog()
289 {
290 	delete pNumRule;
291 }
292 
293 /* -----------------07.07.98 14:13-------------------
294  *
295  * --------------------------------------------------*/
PageCreated(sal_uInt16 nPageId,SfxTabPage & rPage)296 void 	SwOutlineTabDialog::PageCreated(sal_uInt16 nPageId, SfxTabPage& rPage)
297 {
298 	switch ( nPageId )
299 	{
300 		case TP_NUM_POSITION:
301                 ((SwNumPositionTabPage&)rPage).SetWrtShell(&rWrtSh);
302                 ((SwNumPositionTabPage&)rPage).SetOutlineTabDialog(this);
303 		break;
304 		case TP_OUTLINE_NUM:
305 				((SwOutlineSettingsTabPage&)rPage).SetWrtShell(&rWrtSh);
306 		break;
307 	}
308 }
309 /* -----------------07.07.98 14:19-------------------
310  *
311  * --------------------------------------------------*/
IMPL_LINK(SwOutlineTabDialog,CancelHdl,Button *,EMPTYARG)312 IMPL_LINK( SwOutlineTabDialog, CancelHdl, Button *, EMPTYARG )
313 {
314 	if (!bModified)
315 		rWrtSh.ResetModified();
316 	EndDialog(RET_CANCEL);
317 	return 0;
318 }
319 /* -----------------08.07.98 12:14-------------------
320  *
321  * --------------------------------------------------*/
IMPL_LINK(SwOutlineTabDialog,FormHdl,Button *,pBtn)322 IMPL_LINK( SwOutlineTabDialog, FormHdl, Button *, pBtn )
323 {
324 	//PopupMenu auffuellen
325 	for( sal_uInt16 i = 0; i < SwChapterNumRules::nMaxRules; ++i )
326 	{
327 		const SwNumRulesWithName *pRules = pChapterNumRules->GetRules(i);
328 		if( pRules )
329 			aFormMenu.SetItemText(i + MN_FORMBASE, pRules->GetName());
330 	}
331 	aFormMenu.SetSelectHdl(LINK(this, SwOutlineTabDialog, MenuSelectHdl));
332 	aFormMenu.Execute(pBtn, Rectangle(Point(0,0), pBtn->GetSizePixel()), POPUPMENU_EXECUTE_DOWN);
333 	return 0;
334 }
335 
336 /* -----------------08.07.98 12:14-------------------
337  *
338  * --------------------------------------------------*/
IMPL_LINK(SwOutlineTabDialog,MenuSelectHdl,Menu *,pMenu)339 IMPL_LINK( SwOutlineTabDialog, MenuSelectHdl, Menu *, pMenu )
340 {
341 	sal_uInt8 nLevelNo = 0;
342 	switch(pMenu->GetCurItemId())
343 	{
344 		case MN_FORM1: nLevelNo = 1;	break;
345 		case MN_FORM2: nLevelNo = 2;	break;
346 		case MN_FORM3: nLevelNo = 3;	break;
347 		case MN_FORM4: nLevelNo = 4;	break;
348 		case MN_FORM5: nLevelNo = 5;	break;
349 		case MN_FORM6: nLevelNo = 6;	break;
350 		case MN_FORM7: nLevelNo = 7;	break;
351 		case MN_FORM8: nLevelNo = 8;	break;
352 		case MN_FORM9: nLevelNo = 9;	break;
353 
354 		case MN_SAVE:
355 		{
356 			SwNumNamesDlg *pDlg = new SwNumNamesDlg(this);
357 			const String *aStrArr[SwChapterNumRules::nMaxRules];
358 			for(sal_uInt16 i = 0; i < SwChapterNumRules::nMaxRules; ++i)
359 			{
360 				const SwNumRulesWithName *pRules = pChapterNumRules->GetRules(i);
361 				if(pRules)
362 					aStrArr[i] = &pRules->GetName();
363 				else
364 					aStrArr[i] = 0;
365 			}
366 			pDlg->SetUserNames(aStrArr);
367 			if(RET_OK == pDlg->Execute())
368 			{
369 				const String aName(pDlg->GetName());
370 				pChapterNumRules->ApplyNumRules( SwNumRulesWithName(
371 						*pNumRule, aName ), pDlg->GetCurEntryPos() );
372 				pMenu->SetItemText(
373 						pDlg->GetCurEntryPos() + MN_FORMBASE, aName);
374 			}
375 			delete pDlg;
376 			return 0;
377 
378 		}
379 
380 	}
381 	if( nLevelNo-- )
382 	{
383 		const SwNumRulesWithName *pRules = pChapterNumRules->GetRules( nLevelNo );
384 		if( pRules )
385 		{
386 			pRules->MakeNumRule( rWrtSh, *pNumRule );
387 			pNumRule->SetRuleType( OUTLINE_RULE );
388 		}
389 		else
390 			*pNumRule = *rWrtSh.GetOutlineNumRule();
391 	}
392 
393 	sal_uInt16	nPageId = GetCurPageId();
394 	SfxTabPage*	pPage = GetTabPage( nPageId );
395 	pPage->Reset(*GetOutputItemSet());
396 
397 	return 0;
398 }
399 /* -----------------07.07.98 14:19-------------------
400  *
401  * --------------------------------------------------*/
GetLevel(const String & rFmtName) const402 sal_uInt16 	SwOutlineTabDialog::GetLevel(const String &rFmtName) const
403 {
404 	for(sal_uInt16 i = 0; i < MAXLEVEL; ++i)
405 	{
406 		if(aCollNames[i] == rFmtName)
407 			return i;
408 	}
409 	return MAXLEVEL;//NO_NUMBERING;	//#outline level,zhaojianwei
410 
411 }
412 /* -----------------07.07.98 16:30-------------------
413  *
414  * --------------------------------------------------*/
Ok()415 short SwOutlineTabDialog::Ok()
416 {
417     SfxTabDialog::Ok();
418 	// bei allen erzeugten Vorlagen die Ebenen setzen, muss
419 	// geschehen, um evtl. aufgehobene Zuordnungen
420 	// auch wieder zu loeschen
421 
422     // --> OD 2006-12-11 #130443#
423     // encapsulate changes into a action to avoid effects on the current cursor
424     // position during the changes.
425     rWrtSh.StartAction();
426     // <--
427 
428     const SwNumRule * pOutlineRule = rWrtSh.GetOutlineNumRule();
429 
430 	sal_uInt16 i, nCount = rWrtSh.GetTxtFmtCollCount();
431 	for( i = 0; i < nCount; ++i )
432 	{
433 		SwTxtFmtColl &rTxtColl = rWrtSh.GetTxtFmtColl(i);
434 		if( !rTxtColl.IsDefault() )
435         {
436 			//rTxtColl.SetOutlineLevel( (sal_uInt8)GetLevel(rTxtColl.GetName()));//#outline level,removed by zhaojianwei
437 
438             const SfxPoolItem & rItem =
439                 rTxtColl.GetFmtAttr(RES_PARATR_NUMRULE, sal_False);
440 
441 			//if ((sal_uInt8)GetLevel(rTxtColl.GetName()) == NO_NUMBERING)	//#outline level,removed by zhaojianwei
442 			//{
443 			//	if (static_cast<const SwNumRuleItem &>(rItem).GetValue() ==
444 			//		pOutlineRule->GetName())
445 			//	{
446 			//		rTxtColl.ResetFmtAttr(RES_PARATR_NUMRULE);
447 			//	}
448 			//}
449 			//else
450 			//{
451 			//	if (static_cast<const SwNumRuleItem &>(rItem).GetValue() !=
452 			//		pOutlineRule->GetName())
453 			//	{
454 			//		SwNumRuleItem aItem(pOutlineRule->GetName());
455 			//		rTxtColl.SetFmtAttr(aItem);
456 			//	}
457 			//}
458            if ((sal_uInt8)GetLevel(rTxtColl.GetName()) == MAXLEVEL) //add by zhaojianwei
459             {
460 			    if(rTxtColl.IsAssignedToListLevelOfOutlineStyle())
461 				{
462 					rTxtColl.DeleteAssignmentToListLevelOfOutlineStyle();
463 				}
464 				if (static_cast<const SwNumRuleItem &>(rItem).GetValue() ==
465                     pOutlineRule->GetName())
466                 {
467                     rTxtColl.ResetFmtAttr(RES_PARATR_NUMRULE);
468                 }
469             }
470             else
471             {
472 				rTxtColl.AssignToListLevelOfOutlineStyle(GetLevel(rTxtColl.GetName()));
473 
474 				if (static_cast<const SwNumRuleItem &>(rItem).GetValue() !=
475                     pOutlineRule->GetName())
476                 {
477                     SwNumRuleItem aItem(pOutlineRule->GetName());
478                     rTxtColl.SetFmtAttr(aItem);
479                 }
480             }							//<-end,zhaojianwei
481         }
482 	}
483 
484     for(i = 0; i < MAXLEVEL; ++i )
485     {
486         String sHeadline;
487         ::SwStyleNameMapper::FillUIName( static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i),
488                                          sHeadline );
489         SwTxtFmtColl* pColl = rWrtSh.FindTxtFmtCollByName( sHeadline );
490         if( !pColl )
491         {
492 			//if( !aCollNames[i].Len() )			//#outline level,removed by zhaojianwei
493 			//{
494 			//	SwTxtFmtColl* pTxtColl = rWrtSh.GetTxtCollFromPool(
495 			//		static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i) );
496 			//	pTxtColl->SetOutlineLevel( NO_NUMBERING );
497 			//	pTxtColl->ResetFmtAttr(RES_PARATR_NUMRULE);
498 			//}
499 			//else if(aCollNames[i] != sHeadline)
500 			//{
501 			//	SwTxtFmtColl* pTxtColl = rWrtSh.GetParaStyle(
502 			//		aCollNames[i], SwWrtShell::GETSTYLE_CREATESOME);
503 			//	if(pTxtColl)
504 			//	{
505 			//		pTxtColl->SetOutlineLevel( static_cast< sal_uInt8 >(i) );
506 
507 			//		SwNumRuleItem aItem(pOutlineRule->GetName());
508 			//		pTxtColl->SetFmtAttr(aItem);
509 			//	}
510 			//}
511             if(aCollNames[i] != sHeadline)//->added by zhaojianwei
512             {
513 				SwTxtFmtColl* pTxtColl = rWrtSh.GetTxtCollFromPool(
514 					static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i) );
515 				pTxtColl->DeleteAssignmentToListLevelOfOutlineStyle();
516 				pTxtColl->ResetFmtAttr(RES_PARATR_NUMRULE);
517 
518 				if( aCollNames[i].Len() )
519 				{
520 					pTxtColl = rWrtSh.GetParaStyle(
521                                 aCollNames[i], SwWrtShell::GETSTYLE_CREATESOME);
522 					if(pTxtColl)
523 					{
524 						pTxtColl->AssignToListLevelOfOutlineStyle(i);
525 						SwNumRuleItem aItem(pOutlineRule->GetName());
526 						pTxtColl->SetFmtAttr(aItem);
527 					}
528                 }
529             }//<--end,zhaojianwei
530         }
531     }
532 
533 	rWrtSh.SetOutlineNumRule( *pNumRule);
534 
535     // --> OD 2006-12-11 #130443#
536     rWrtSh.EndAction();
537     // <--
538 
539 	return RET_OK;
540 }
541 
542 /* -----------------07.07.98 14:19-------------------
543  *
544  * --------------------------------------------------*/
SwOutlineSettingsTabPage(Window * pParent,const SfxItemSet & rSet)545 SwOutlineSettingsTabPage::SwOutlineSettingsTabPage(Window* pParent, const SfxItemSet& rSet) :
546 	SfxTabPage(pParent, SW_RES(TP_OUTLINE_NUM), rSet),
547     aLevelFL(       this, SW_RES(FL_LEVEL    )),
548     aLevelLB(       this, SW_RES(LB_LEVEL   )),
549 	aNumberFL(this, SW_RES(FL_NUMBER)),
550     aCollLbl(this, SW_RES(FT_COLL)),
551 	aCollBox(this, SW_RES(LB_COLL)),
552     aNumberLbl(this, SW_RES(FT_NUMBER)),
553     aNumberBox(this, SW_RES(LB_NUMBER), INSERT_NUM_TYPE_NO_NUMBERING|INSERT_NUM_EXTENDED_TYPES),
554 	aCharFmtFT(this, SW_RES(FT_CHARFMT)),
555 	aCharFmtLB(this, SW_RES(LB_CHARFMT)),
556 	aAllLevelFT(	this, SW_RES(FT_ALL_LEVEL)),
557 	aAllLevelNF(	this, SW_RES(NF_ALL_LEVEL)),
558 	aDelim(this, SW_RES(FT_DELIM)),
559 	aPrefixFT(this, SW_RES(FT_PREFIX)),
560 	aPrefixED(this, SW_RES(ED_PREFIX)),
561 	aSuffixFT(this, SW_RES(FT_SUFFIX)),
562 	aSuffixED(this, SW_RES(ED_SUFFIX)),
563 	aStartLbl(this, SW_RES(FT_START)),
564 	aStartEdit(this, SW_RES(ED_START)),
565     aPreviewWIN(    this, SW_RES(WIN_PREVIEW )),
566 
567     aNoFmtName(SW_RES(ST_NO_COLL)),
568     pSh(0),
569     pCollNames(0),
570     nActLevel(1)
571 {
572 	FreeResource();
573 	SetExchangeSupport();
574 
575 	aCollBox.InsertEntry(aNoFmtName);
576 	aLevelLB.SetSelectHdl(LINK(this, 	SwOutlineSettingsTabPage, LevelHdl));
577 	aAllLevelNF.SetModifyHdl(LINK(this, SwOutlineSettingsTabPage, ToggleComplete));
578 	aCollBox.SetSelectHdl(LINK(this, 	SwOutlineSettingsTabPage, CollSelect));
579 	aCollBox.SetGetFocusHdl(LINK(this, 	SwOutlineSettingsTabPage, CollSelectGetFocus));
580 	aNumberBox.SetSelectHdl(LINK(this, 	SwOutlineSettingsTabPage, NumberSelect));
581 	aPrefixED.SetModifyHdl(LINK(this, 	SwOutlineSettingsTabPage, DelimModify));
582 	aSuffixED.SetModifyHdl(LINK(this, 	SwOutlineSettingsTabPage, DelimModify));
583 	aStartEdit.SetModifyHdl(LINK(this, 	SwOutlineSettingsTabPage, StartModified));
584 	aCharFmtLB.SetSelectHdl(LINK(this, 	SwOutlineSettingsTabPage, CharFmtHdl));
585 
586 }
587 /* -----------------07.07.98 14:19-------------------
588  *
589  * --------------------------------------------------*/
Update()590 void   	SwOutlineSettingsTabPage::Update()
591 {
592 		// falls eine Vorlage fuer diese Ebene bereits selektiert wurde,
593 		// diese in der ListBox auswaehlean
594 	aCollBox.Enable(USHRT_MAX != nActLevel);
595 	if(USHRT_MAX == nActLevel)
596 	{
597 		sal_Bool bSamePrefix = sal_True;
598 		sal_Bool bSameSuffix = sal_True;
599 		sal_Bool bSameType = sal_True;
600 		sal_Bool bSameComplete = sal_True;
601 		sal_Bool bSameStart = sal_True;
602 		sal_Bool bSameCharFmt = sal_True;
603 
604 		const SwNumFmt* aNumFmtArr[MAXLEVEL];
605 		const SwCharFmt* pFirstFmt = 0;
606 
607 		for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
608 		{
609 
610 			aNumFmtArr[ i ] = &pNumRule->Get(i);
611 			if(i == 0)
612 				pFirstFmt = aNumFmtArr[i]->GetCharFmt();
613 			else
614 			{
615 				bSameType 	&= aNumFmtArr[i]->GetNumberingType() == aNumFmtArr[0]->GetNumberingType();
616 				bSameStart	&= aNumFmtArr[i]->GetStart() == aNumFmtArr[0]->GetStart();
617 				bSamePrefix &= aNumFmtArr[i]->GetPrefix() == aNumFmtArr[0]->GetPrefix();
618 				bSameSuffix &= aNumFmtArr[i]->GetSuffix() == aNumFmtArr[0]->GetSuffix();
619 				bSameComplete &= aNumFmtArr[i]->GetIncludeUpperLevels() == aNumFmtArr[0]->GetIncludeUpperLevels();
620 				const SwCharFmt* pFmt = aNumFmtArr[i]->GetCharFmt();
621 				bSameCharFmt &= 	(!pFirstFmt && !pFmt)
622 									|| (pFirstFmt && pFmt && pFmt->GetName() == pFirstFmt->GetName());
623 			}
624 		}
625         CheckForStartValue_Impl(aNumFmtArr[0]->GetNumberingType());
626         if(bSameType)
627 			aNumberBox.SelectNumberingType( aNumFmtArr[0]->GetNumberingType() );
628 		else
629 			aNumberBox.SetNoSelection();
630 		if(bSameStart)
631 			aStartEdit.SetValue(aNumFmtArr[0]->GetStart());
632 		else
633 			aStartEdit.SetText(aEmptyStr);
634 		if(bSamePrefix)
635 			aPrefixED.SetText(aNumFmtArr[0]->GetPrefix());
636 		else
637 			aPrefixED.SetText(aEmptyStr);
638 		if(bSameSuffix)
639 			aSuffixED.SetText(aNumFmtArr[0]->GetSuffix());
640 		else
641 			aSuffixED.SetText(aEmptyStr);
642 
643 		if(bSameCharFmt)
644 		{
645 			if(pFirstFmt)
646 				aCharFmtLB.SelectEntry(pFirstFmt->GetName());
647 			else
648 				aCharFmtLB.SelectEntry( ViewShell::GetShellRes()->aStrNone );
649 		}
650 		else
651 			aCharFmtLB.SetNoSelection();
652 
653 		aAllLevelFT.Enable(sal_True);
654 		aAllLevelNF.Enable(sal_True);
655 		aAllLevelNF.SetMax(MAXLEVEL);
656 		if(bSameComplete)
657 		{
658 			aAllLevelNF.SetValue(aNumFmtArr[0]->GetIncludeUpperLevels());
659 		}
660 		else
661 		{
662 			aAllLevelNF.SetText(aEmptyStr);
663 		}
664 	}
665 	else
666 	{
667 		sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel);
668 		String aColl(pCollNames[nTmpLevel]);
669 		if(aColl.Len())
670 			aCollBox.SelectEntry(aColl);
671 		else
672 			aCollBox.SelectEntry(aNoFmtName);
673 		const SwNumFmt &rFmt = pNumRule->Get(nTmpLevel);
674 
675 		aNumberBox.SelectNumberingType( rFmt.GetNumberingType() );
676 		aPrefixED.SetText(rFmt.GetPrefix());
677 		aSuffixED.SetText(rFmt.GetSuffix());
678 		const SwCharFmt* pFmt = rFmt.GetCharFmt();
679 		if(pFmt)
680 			aCharFmtLB.SelectEntry(pFmt->GetName());
681 		else
682 			aCharFmtLB.SelectEntry( ViewShell::GetShellRes()->aStrNone );
683 
684 		if(nTmpLevel)
685 		{
686 			aAllLevelFT.Enable(sal_True);
687 			aAllLevelNF.Enable(sal_True);
688 			aAllLevelNF.SetMax(nTmpLevel + 1);
689 			aAllLevelNF.SetValue(rFmt.GetIncludeUpperLevels());
690 		}
691 		else
692 		{
693 			aAllLevelNF.SetText(aEmptyStr);
694 			aAllLevelNF.Enable(sal_False);
695 			aAllLevelFT.Enable(sal_False);
696 		}
697         CheckForStartValue_Impl(rFmt.GetNumberingType());
698 		aStartEdit.SetValue( rFmt.GetStart() );
699 	}
700 	SetModified();
701 }
702 
703 /* -----------------07.07.98 14:19-------------------
704  *
705  * --------------------------------------------------*/
IMPL_LINK(SwOutlineSettingsTabPage,LevelHdl,ListBox *,pBox)706 IMPL_LINK( SwOutlineSettingsTabPage, LevelHdl, ListBox *, pBox )
707 {
708 	nActLevel = 0;
709 	if(pBox->IsEntryPosSelected( MAXLEVEL ))
710 	{
711 		nActLevel = 0xFFFF;
712 	}
713 	else
714 	{
715 		sal_uInt16 nMask = 1;
716 		for( sal_uInt16 i = 0; i < MAXLEVEL; i++ )
717 		{
718 			if(pBox->IsEntryPosSelected( i ))
719 				nActLevel |= nMask;
720 			nMask <<= 1;
721 		}
722 	}
723 	Update();
724 	return 0;
725 }
726 /* -----------------07.07.98 14:19-------------------
727  *
728  * --------------------------------------------------*/
IMPL_LINK(SwOutlineSettingsTabPage,ToggleComplete,NumericField *,pFld)729 IMPL_LINK( SwOutlineSettingsTabPage, ToggleComplete, NumericField *, pFld )
730 {
731 	sal_uInt16 nMask = 1;
732 	for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
733 	{
734 		if(nActLevel & nMask)
735 		{
736 			SwNumFmt aNumFmt(pNumRule->Get(i));
737 			aNumFmt.SetIncludeUpperLevels( Min( (sal_uInt8)pFld->GetValue(),
738 												(sal_uInt8)(i + 1)) );
739 			pNumRule->Set(i, aNumFmt);
740 		}
741 		nMask <<= 1;
742 	}
743 	SetModified();
744 	return 0;
745 }
746 /* -----------------07.07.98 14:19-------------------
747  *
748  * --------------------------------------------------*/
IMPL_LINK(SwOutlineSettingsTabPage,CollSelect,ListBox *,pBox)749 IMPL_LINK( SwOutlineSettingsTabPage, CollSelect, ListBox *, pBox )
750 {
751 	sal_uInt8 i;
752 
753 	const String aCollName(pBox->GetSelectEntry());
754 	//0xFFFF darf hier nicht sein (disable)
755 	sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel);
756 	String sOldName( pCollNames[nTmpLevel] );
757 
758 	for( i = 0; i < MAXLEVEL; ++i)
759 		pCollNames[i] = aSaveCollNames[i];
760 
761 	if(aCollName == aNoFmtName)
762 		pCollNames[nTmpLevel] = aEmptyStr;
763 	else
764 	{
765 		pCollNames[nTmpLevel] = aCollName;
766 				// wird die Vorlage bereits verwendet ?
767 		for( i = 0; i < MAXLEVEL; ++i)
768 			if(i != nTmpLevel && pCollNames[i] == aCollName )
769 				pCollNames[i] = aEmptyStr;
770 	}
771 
772 	// search the oldname and put it into the current entries
773 	if( sOldName.Len() )
774 		for( i = 0; i < MAXLEVEL; ++i)
775 			if( aSaveCollNames[ i ] == sOldName && i != nTmpLevel &&
776 				!pCollNames[ i ].Len() )
777 			{
778 				sal_uInt8 n;
779 				for( n = 0; n < MAXLEVEL; ++n )
780 					if( pCollNames[ n ] == sOldName )
781 						break;
782 
783 				if( MAXLEVEL == n )
784 					// it was a outline leveld name and the current entries is zero.
785 					pCollNames[ i ] = sOldName;
786 			}
787 
788 	SetModified();
789 	return 0;
790 }
791 
IMPL_LINK(SwOutlineSettingsTabPage,CollSelectGetFocus,ListBox *,EMPTYARG)792 IMPL_LINK( SwOutlineSettingsTabPage, CollSelectGetFocus, ListBox *, EMPTYARG )
793 {
794 	for( sal_uInt8 i = 0; i < MAXLEVEL; ++i)
795 		aSaveCollNames[i] =  pCollNames[i];
796 	return 0;
797 }
798 
799 /* -----------------07.07.98 14:19-------------------
800  *
801  * --------------------------------------------------*/
IMPL_LINK(SwOutlineSettingsTabPage,NumberSelect,SwNumberingTypeListBox *,pBox)802 IMPL_LINK( SwOutlineSettingsTabPage, NumberSelect, SwNumberingTypeListBox *, pBox )
803 {
804 	sal_uInt16 nMask = 1;
805 	sal_Int16 nNumberType = pBox->GetSelectedNumberingType();//(sal_Int16)(sal_uLong)pBox->GetEntryData(pBox->GetSelectEntryPos());
806 	for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
807 	{
808 		if(nActLevel & nMask)
809 		{
810 			SwNumFmt aNumFmt(pNumRule->Get(i));
811 			aNumFmt.SetNumberingType(nNumberType);
812 			pNumRule->Set(i, aNumFmt);
813             CheckForStartValue_Impl(nNumberType);
814         }
815 		nMask <<= 1;
816 	}
817 	SetModified();
818 	return 0;
819 }
820 /* -----------------07.07.98 14:19-------------------
821  *
822  * --------------------------------------------------*/
IMPL_LINK(SwOutlineSettingsTabPage,DelimModify,Edit *,EMPTYARG)823 IMPL_LINK( SwOutlineSettingsTabPage, DelimModify, Edit *, EMPTYARG )
824 {
825 	sal_uInt16 nMask = 1;
826 	for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
827 	{
828 		if(nActLevel & nMask)
829 		{
830 			SwNumFmt aNumFmt(pNumRule->Get(i));
831 			aNumFmt.SetPrefix( aPrefixED.GetText() );
832 			aNumFmt.SetSuffix( aSuffixED.GetText() );
833 			pNumRule->Set(i, aNumFmt);
834 		}
835 		nMask <<= 1;
836 	}
837 	SetModified();
838 	return 0;
839 }
840 /* -----------------07.07.98 14:19-------------------
841  *
842  * --------------------------------------------------*/
IMPL_LINK(SwOutlineSettingsTabPage,StartModified,NumericField *,pFld)843 IMPL_LINK( SwOutlineSettingsTabPage, StartModified, NumericField *, pFld )
844 {
845 	sal_uInt16 nMask = 1;
846 	for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
847 	{
848 		if(nActLevel & nMask)
849 		{
850 			SwNumFmt aNumFmt(pNumRule->Get(i));
851 			aNumFmt.SetStart( (sal_uInt16)pFld->GetValue() );
852 			pNumRule->Set(i, aNumFmt);
853 		}
854 		nMask <<= 1;
855 	}
856     SetModified();
857 	return 0;
858 }
859 /* -----------------21.09.98 12:21-------------------
860  *
861  * --------------------------------------------------*/
IMPL_LINK(SwOutlineSettingsTabPage,CharFmtHdl,ListBox *,EMPTYARG)862 IMPL_LINK( SwOutlineSettingsTabPage, CharFmtHdl, ListBox *, EMPTYARG )
863 {
864 //	bAutomaticCharStyles = sal_False;
865 	String sEntry = aCharFmtLB.GetSelectEntry();
866 	sal_uInt16 nMask = 1;
867 	sal_Bool bFormatNone = sEntry == ViewShell::GetShellRes()->aStrNone;
868 	SwCharFmt* pFmt = 0;
869 	if(!bFormatNone)
870 	{
871 		sal_uInt16 nChCount = pSh->GetCharFmtCount();
872 		for(sal_uInt16 i = 0; i < nChCount; i++)
873 		{
874 			SwCharFmt& rChFmt = pSh->GetCharFmt(i);
875 			if(rChFmt.GetName() == sEntry)
876 			{
877 				pFmt = &rChFmt;
878 				break;
879 			}
880 		}
881 		if(!pFmt)
882 		{
883 			SfxStyleSheetBasePool* pPool = pSh->GetView().GetDocShell()->GetStyleSheetPool();
884 			SfxStyleSheetBase* pBase;
885 			pBase = pPool->Find(sEntry, SFX_STYLE_FAMILY_CHAR);
886 			if(!pBase)
887 				pBase = &pPool->Make(sEntry, SFX_STYLE_FAMILY_PAGE);
888 			pFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt();
889 
890 		}
891 	}
892 
893 	for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
894 	{
895 		if(nActLevel & nMask)
896 		{
897 			SwNumFmt aNumFmt(pNumRule->Get(i));
898 			if(bFormatNone)
899 				aNumFmt.SetCharFmt(0);
900 			else
901 				aNumFmt.SetCharFmt(pFmt);
902 			pNumRule->Set(i, aNumFmt);
903 		}
904 		nMask <<= 1;
905 	}
906 	return RET_OK;
907 }
908 /* -----------------07.07.98 14:19-------------------
909  *
910  * --------------------------------------------------*/
~SwOutlineSettingsTabPage()911 SwOutlineSettingsTabPage::~SwOutlineSettingsTabPage()
912 {
913 }
914 /* -----------------07.07.98 16:27-------------------
915  *
916  * --------------------------------------------------*/
SetWrtShell(SwWrtShell * pShell)917 void SwOutlineSettingsTabPage::SetWrtShell(SwWrtShell* pShell)
918 {
919 	pSh = pShell;
920 	// Erfragen der NumRules dieses Dokumentes
921 	pNumRule = ((SwOutlineTabDialog*)GetTabDialog())->GetNumRule();
922 	pCollNames = ((SwOutlineTabDialog*)GetTabDialog())->GetCollNames();
923 
924 	//pNumRule = new SwNumRule( *rSh.GetOutlineNumRule() );
925 
926 	aPreviewWIN.SetNumRule(pNumRule);
927 	aPreviewWIN.SetOutlineNames(pCollNames);
928 	// Startwert setzen - nActLevel muss hier 1 sein
929 	sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel);
930 	const SwNumFmt& rNumFmt = pNumRule->Get( nTmpLevel );
931 	aStartEdit.SetValue( rNumFmt.GetStart() );
932 
933 	// Poolformate fuer Ueberschriften anlegen
934 	String sStr;
935 	sal_uInt16 i;
936 	for( i = 0; i < MAXLEVEL; ++i )
937 	{
938 		aCollBox.InsertEntry( SwStyleNameMapper::GetUIName(
939                                     static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i), aEmptyStr ));
940 		aLevelLB.InsertEntry( String::CreateFromInt32(i + 1) );
941 	}
942 	sStr.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "1 - " ));
943 	sStr += String::CreateFromInt32(MAXLEVEL);
944 	aLevelLB.InsertEntry( sStr );
945 
946 	// Erfragen der Gliederungsebenen der Textvorlagen
947 	const sal_uInt16 nCount = pSh->GetTxtFmtCollCount();
948 	for( i = 0; i < nCount; ++i )
949 	{
950 		SwTxtFmtColl &rTxtColl = pSh->GetTxtFmtColl(i);
951 		if(!rTxtColl.IsDefault())
952 		{
953 			sStr = rTxtColl.GetName();
954 			if(LISTBOX_ENTRY_NOTFOUND == aCollBox.GetEntryPos( sStr ))
955 				aCollBox.InsertEntry( sStr );
956 		}
957 	}
958 
959 	aNumberBox.SelectNumberingType(rNumFmt.GetNumberingType());
960 	sal_uInt16 nOutlinePos = pSh->GetOutlinePos(MAXLEVEL);
961 	sal_uInt16 nTmp = 0;
962 	if(nOutlinePos != USHRT_MAX)
963 	{
964         nTmp = static_cast<sal_uInt16>(pSh->getIDocumentOutlineNodesAccess()->getOutlineLevel(nOutlinePos));
965 	}
966 	aLevelLB.SelectEntryPos(nTmp-1);//nTmp);//#outline level,zhaojianwei
967 
968 	// Zeichenvorlagen sammeln
969 	aCharFmtLB.Clear();
970 	aCharFmtLB.InsertEntry( ViewShell::GetShellRes()->aStrNone );
971 
972 	// Zeichenvorlagen
973 	::FillCharStyleListBox(aCharFmtLB,
974 						pSh->GetView().GetDocShell());
975 	Update();
976 }
977 /* -----------------07.07.98 14:19-------------------
978  *
979  * --------------------------------------------------*/
ActivatePage(const SfxItemSet &)980 void    SwOutlineSettingsTabPage::ActivatePage(const SfxItemSet& )
981 {
982     nActLevel = SwOutlineTabDialog::GetActNumLevel();
983 	if(nActLevel != USHRT_MAX)
984 		aLevelLB.SelectEntryPos(lcl_BitToLevel(nActLevel));
985 	else
986 		aLevelLB.SelectEntryPos(MAXLEVEL);
987 	LevelHdl(&aLevelLB);
988 }
989 /* -----------------07.07.98 14:19-------------------
990  *
991  * --------------------------------------------------*/
DeactivatePage(SfxItemSet *)992 int     SwOutlineSettingsTabPage::DeactivatePage(SfxItemSet*)
993 {
994     SwOutlineTabDialog::SetActNumLevel(nActLevel);
995 	return LEAVE_PAGE;
996 }
997 /* -----------------07.07.98 14:19-------------------
998  *
999  * --------------------------------------------------*/
FillItemSet(SfxItemSet &)1000 sal_Bool    SwOutlineSettingsTabPage::FillItemSet( SfxItemSet&  )
1001 {
1002 	return sal_True;
1003 }
1004 /* -----------------07.07.98 14:19-------------------
1005  *
1006  * --------------------------------------------------*/
Reset(const SfxItemSet & rSet)1007 void 	SwOutlineSettingsTabPage::Reset( const SfxItemSet& rSet )
1008 {
1009 	ActivatePage(rSet);
1010 }
1011 /* -----------------07.07.98 14:19-------------------
1012  *
1013  * --------------------------------------------------*/
Create(Window * pParent,const SfxItemSet & rAttrSet)1014 SfxTabPage*	SwOutlineSettingsTabPage::Create( Window* pParent,
1015 								const SfxItemSet& rAttrSet)
1016 {
1017 	return new SwOutlineSettingsTabPage(pParent, rAttrSet);
1018 }
1019 /* -----------------07.11.2002 15:13-----------------
1020  *
1021  * --------------------------------------------------*/
CheckForStartValue_Impl(sal_uInt16 nNumberingType)1022 void SwOutlineSettingsTabPage::CheckForStartValue_Impl(sal_uInt16 nNumberingType)
1023 {
1024     sal_Bool bIsNull = aStartEdit.GetValue() == 0;
1025     sal_Bool bNoZeroAllowed = nNumberingType < SVX_NUM_ARABIC ||
1026                         SVX_NUM_CHARS_UPPER_LETTER_N == nNumberingType ||
1027                         SVX_NUM_CHARS_LOWER_LETTER_N == nNumberingType;
1028     aStartEdit.SetMin(bNoZeroAllowed ? 1 : 0);
1029     if(bIsNull && bNoZeroAllowed)
1030         aStartEdit.GetModifyHdl().Call(&aStartEdit);
1031 }
1032 /*-----------------09.12.97 11:54-------------------
1033 
1034 --------------------------------------------------*/
lcl_DrawBullet(VirtualDevice * pVDev,const SwNumFmt & rFmt,sal_uInt16 nXStart,sal_uInt16 nYStart,const Size & rSize)1035 sal_uInt16 lcl_DrawBullet(VirtualDevice* pVDev,
1036 			const SwNumFmt& rFmt, sal_uInt16 nXStart,
1037 			sal_uInt16 nYStart, const Size& rSize)
1038 {
1039 	Font aTmpFont(pVDev->GetFont());
1040 
1041 	Font aFont(*rFmt.GetBulletFont());
1042 	aFont.SetSize(rSize);
1043 	aFont.SetTransparent(sal_True);
1044 	pVDev->SetFont( aFont );
1045 	String aText(rFmt.GetBulletChar());
1046 	pVDev->DrawText( Point(nXStart, nYStart), aText );
1047 	sal_uInt16 nRet = (sal_uInt16)pVDev->GetTextWidth(aText);
1048 
1049 	pVDev->SetFont(aTmpFont);
1050 	return nRet;
1051 }
1052 /*-----------------09.12.97 11:49-------------------
1053 
1054 --------------------------------------------------*/
lcl_DrawGraphic(VirtualDevice * pVDev,const SwNumFmt & rFmt,sal_uInt16 nXStart,sal_uInt16 nYStart,sal_uInt16 nDivision)1055 sal_uInt16 lcl_DrawGraphic(VirtualDevice* pVDev, const SwNumFmt &rFmt, sal_uInt16 nXStart,
1056 						sal_uInt16 nYStart, sal_uInt16 nDivision)
1057 {
1058 	const SvxBrushItem* pBrushItem = rFmt.GetBrush();
1059 	sal_uInt16 nRet = 0;
1060 	if(pBrushItem)
1061 	{
1062 		const Graphic* pGrf = pBrushItem->GetGraphic();
1063 		if(pGrf)
1064 		{
1065 			Size aGSize( rFmt.GetGraphicSize());
1066 			aGSize.Width() /= nDivision;
1067 			nRet = (sal_uInt16)aGSize.Width();
1068 			aGSize.Height() /= nDivision;
1069 			pGrf->Draw( pVDev, Point(nXStart,nYStart),
1070 					pVDev->PixelToLogic( aGSize ) );
1071 		}
1072 	}
1073 	return nRet;
1074 
1075 }
1076 /*-----------------02.12.97 10:34-------------------
1077 	Vorschau der Numerierung painten
1078 --------------------------------------------------*/
Paint(const Rectangle &)1079 void    NumberingPreview::Paint( const Rectangle& /*rRect*/ )
1080 {
1081 	Size aSize(PixelToLogic(GetOutputSizePixel()));
1082 	Rectangle aRect(Point(0,0), aSize);
1083 
1084 	VirtualDevice* pVDev = new VirtualDevice(*this);
1085 	pVDev->SetMapMode(GetMapMode());
1086 	pVDev->SetOutputSize( aSize );
1087 
1088 	// #101524# OJ
1089 	pVDev->SetFillColor( GetSettings().GetStyleSettings().GetWindowColor() );
1090 	pVDev->SetLineColor( GetSettings().GetStyleSettings().GetButtonTextColor() );
1091 	pVDev->DrawRect(aRect);
1092 
1093 	if(pActNum)
1094 	{
1095 		sal_uInt16 nWidthRelation;
1096 		if(nPageWidth)
1097 		{
1098 			nWidthRelation = sal_uInt16 (nPageWidth / aSize.Width());
1099 			if(bPosition)
1100 				nWidthRelation = nWidthRelation * 2 / 3;
1101 			else
1102 				nWidthRelation = nWidthRelation / 4;
1103 		}
1104 		else
1105 			nWidthRelation = 30; // Kapiteldialog
1106 
1107 		//Hoehe pro Ebene
1108         sal_uInt16 nXStep = sal_uInt16(aSize.Width() / (3 * MAXLEVEL));
1109 		if(MAXLEVEL < 10)
1110 			nXStep /= 2;
1111 		sal_uInt16 nYStart = 4;
1112         sal_uInt16 nYStep = sal_uInt16((aSize.Height() - 6)/ MAXLEVEL);
1113         aStdFont = OutputDevice::GetDefaultFont(
1114                                     DEFAULTFONT_UI_SANS, (LanguageType)GetAppLanguage(),
1115 									DEFAULTFONT_FLAGS_ONLYONE, this );
1116 		// #101524# OJ
1117         aStdFont.SetColor( SwViewOption::GetFontColor() );
1118 
1119 		//
1120 		sal_uInt16 nFontHeight = nYStep * 6 / 10;
1121 		if(bPosition)
1122 			nFontHeight = nYStep * 15 / 10;
1123 		aStdFont.SetSize(Size( 0, nFontHeight ));
1124 
1125 		sal_uInt16 nPreNum = pActNum->Get(0).GetStart();
1126 
1127 		if(bPosition)
1128 		{
1129 			sal_uInt16 nLineHeight = nFontHeight * 8 / 7;
1130 			sal_uInt8 nStart = 0;
1131 			while( !(nActLevel & (1<<nStart)) )
1132 			{
1133 				nStart++;
1134 			}
1135 			if(nStart) // damit moeglichs Vorgaenger und Nachfolger gezeigt werden
1136 				nStart--;
1137 
1138             SwNumberTree::tNumberVector aNumVector;
1139 			sal_uInt8 nEnd = Min( (sal_uInt8)(nStart + 3), MAXLEVEL );
1140 			for( sal_uInt8 nLevel = nStart; nLevel < nEnd; ++nLevel )
1141 			{
1142 				const SwNumFmt &rFmt = pActNum->Get(nLevel);
1143 				aNumVector.push_back(rFmt.GetStart());
1144 
1145                 // --> OD 2008-02-01 #newlistlevelattrs#
1146                 sal_uInt16 nXStart( 0 );
1147                 short nTextOffset( 0 );
1148                 sal_uInt16 nNumberXPos( 0 );
1149                 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
1150                 {
1151                     nXStart = rFmt.GetAbsLSpace() / nWidthRelation;
1152                     nTextOffset = rFmt.GetCharTextDistance() / nWidthRelation;
1153                     nNumberXPos = nXStart;
1154                     sal_uInt16 nFirstLineOffset = (-rFmt.GetFirstLineOffset()) / nWidthRelation;
1155 
1156                     if(nFirstLineOffset <= nNumberXPos)
1157                         nNumberXPos = nNumberXPos - nFirstLineOffset;
1158                     else
1159                         nNumberXPos = 0;
1160                 }
1161                 else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
1162                 {
1163                     const long nTmpNumberXPos( ( rFmt.GetIndentAt() +
1164                                                  rFmt.GetFirstLineIndent() ) /
1165                                                nWidthRelation );
1166                     if ( nTmpNumberXPos < 0 )
1167                     {
1168                         nNumberXPos = 0;
1169                     }
1170                     else
1171                     {
1172                         nNumberXPos = static_cast<sal_uInt16>(nTmpNumberXPos);
1173                     }
1174                 }
1175                 // <--
1176 
1177 				sal_uInt16 nBulletWidth = 0;
1178 				if( SVX_NUM_BITMAP == rFmt.GetNumberingType() )
1179 				{
1180 					nBulletWidth = lcl_DrawGraphic(pVDev, rFmt,
1181 										nNumberXPos,
1182 											nYStart, nWidthRelation);
1183 				}
1184 				else if( SVX_NUM_CHAR_SPECIAL == rFmt.GetNumberingType() )
1185 				{
1186 					nBulletWidth =  lcl_DrawBullet(pVDev, rFmt, nNumberXPos, nYStart, aStdFont.GetSize());
1187 				}
1188 				else
1189 				{
1190 					pVDev->SetFont(aStdFont);
1191 					if(pActNum->IsContinusNum())
1192 						aNumVector[nLevel] = nPreNum;
1193                     // --> OD 2005-11-17 #128041#
1194                     String aText(pActNum->MakeNumString( aNumVector ));
1195                     // <--
1196 					pVDev->DrawText( Point(nNumberXPos, nYStart), aText );
1197 					nBulletWidth = (sal_uInt16)pVDev->GetTextWidth(aText);
1198 					nPreNum++;
1199 				}
1200                 // --> OD 2008-02-01 #newlistlevelattrs#
1201                 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT &&
1202                      rFmt.GetLabelFollowedBy() == SvxNumberFormat::SPACE )
1203                 {
1204                     pVDev->SetFont(aStdFont);
1205                     String aText(' ');
1206                     pVDev->DrawText( Point(nNumberXPos, nYStart), aText );
1207                     nBulletWidth = nBulletWidth + (sal_uInt16)pVDev->GetTextWidth(aText);
1208                 }
1209                 // <--
1210 
1211                 // --> OD 2008-02-01 #newlistlevelattrs#
1212                 sal_uInt16 nTextXPos( 0 );
1213                 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
1214                 {
1215                     nTextXPos = nXStart;
1216                     if(nTextOffset < 0)
1217                          nTextXPos = nTextXPos + nTextOffset;
1218                     if(nNumberXPos + nBulletWidth + nTextOffset > nTextXPos )
1219                         nTextXPos = nNumberXPos + nBulletWidth + nTextOffset;
1220                 }
1221                 else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
1222                 {
1223                     switch ( rFmt.GetLabelFollowedBy() )
1224                     {
1225                         case SvxNumberFormat::LISTTAB:
1226                         {
1227                             nTextXPos = static_cast<sal_uInt16>(
1228                                             rFmt.GetListtabPos() / nWidthRelation );
1229                             if ( nTextXPos < nNumberXPos + nBulletWidth )
1230                             {
1231                                 nTextXPos = nNumberXPos + nBulletWidth;
1232                             }
1233                         }
1234                         break;
1235                         case SvxNumberFormat::SPACE:
1236                         case SvxNumberFormat::NOTHING:
1237                         {
1238                             nTextXPos = nNumberXPos + nBulletWidth;
1239                         }
1240                         break;
1241                     }
1242 
1243                     nXStart = static_cast<sal_uInt16>( rFmt.GetIndentAt() / nWidthRelation );
1244                 }
1245                 // <--
1246 
1247 
1248                 Rectangle aRect1(Point(nTextXPos, nYStart + nFontHeight / 2), Size(aSize.Width() / 2, 2));
1249 				pVDev->SetFillColor( GetSettings().GetStyleSettings().GetWindowColor() ); // Color( COL_BLACK ) );
1250 				pVDev->DrawRect( aRect1 );
1251 
1252 				Rectangle aRect2(Point(nXStart, nYStart + nLineHeight + nFontHeight / 2 ), Size(aSize.Width() / 2, 2));
1253 				pVDev->DrawRect( aRect2 );
1254 				nYStart += 2 * nLineHeight;
1255 			}
1256 		}
1257 		else
1258 		{
1259             SwNumberTree::tNumberVector aNumVector;
1260 			sal_uInt16 nLineHeight = nFontHeight * 3 / 2;
1261 			for( sal_uInt8 nLevel = 0; nLevel < MAXLEVEL;
1262                             ++nLevel, nYStart = nYStart + nYStep )
1263 			{
1264 				const SwNumFmt &rFmt = pActNum->Get(nLevel);
1265 				aNumVector.push_back(rFmt.GetStart());
1266                 // --> OD 2008-02-01 #newlistlevelattrs#
1267                 sal_uInt16 nXStart( 0 );
1268                 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
1269                 {
1270                     nXStart = rFmt.GetAbsLSpace() / nWidthRelation;
1271                 }
1272                 else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
1273                 {
1274                     const long nTmpXStart( ( rFmt.GetIndentAt() +
1275                                              rFmt.GetFirstLineIndent() ) /
1276                                            nWidthRelation );
1277                     if ( nTmpXStart < 0 )
1278                     {
1279                         nXStart = 0;
1280                     }
1281                     else
1282                     {
1283                         nXStart = static_cast<sal_uInt16>(nTmpXStart);
1284                     }
1285                 }
1286                 nXStart /= 2;
1287                 nXStart += 2;
1288                 // <--
1289 				sal_uInt16 nTextOffset = 2 * nXStep;
1290 				if( SVX_NUM_BITMAP == rFmt.GetNumberingType() )
1291 				{
1292 					lcl_DrawGraphic(pVDev, rFmt, nXStart, nYStart, nWidthRelation);
1293 					nTextOffset = nLineHeight + nXStep;
1294 				}
1295 				else if( SVX_NUM_CHAR_SPECIAL == rFmt.GetNumberingType() )
1296 				{
1297 					nTextOffset =  lcl_DrawBullet(pVDev, rFmt, nXStart, nYStart, aStdFont.GetSize());
1298                     nTextOffset = nTextOffset + nXStep;
1299 				}
1300 				else
1301 				{
1302 					pVDev->SetFont(aStdFont);
1303 					if(pActNum->IsContinusNum())
1304 						aNumVector[nLevel] = nPreNum;
1305                     // --> OD 2005-11-17 #128041#
1306                     String aText(pActNum->MakeNumString( aNumVector ));
1307                     // <--
1308 					pVDev->DrawText( Point(nXStart, nYStart), aText );
1309 					nTextOffset = (sal_uInt16)pVDev->GetTextWidth(aText);
1310                     nTextOffset = nTextOffset + nXStep;
1311 					nPreNum++;
1312 				}
1313 				pVDev->SetFont(aStdFont);
1314 
1315 				// Changed as per BugID 79541 Branding/Configuration
1316                 uno::Any MyAny = ::utl::ConfigManager::GetConfigManager()->
1317                         GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTNAME );
1318                 ::rtl::OUString aProductName;
1319 
1320 				MyAny >>= aProductName;
1321 				String sMsg(C2S("%PRODUCTNAME"));
1322 				sMsg.SearchAndReplaceAscii( "%PRODUCTNAME" , aProductName );
1323 
1324 				if(pOutlineNames)
1325 					sMsg = pOutlineNames[nLevel];
1326 				pVDev->DrawText( Point(nXStart + nTextOffset, nYStart), sMsg );
1327 			}
1328 		}
1329 	}
1330 	DrawOutDev(	Point(0,0), aSize,
1331 				Point(0,0), aSize,
1332 						*pVDev );
1333 	delete pVDev;
1334 
1335 }
1336 
1337 /*-----------------02.12.97 10:34-------------------
1338 
1339 --------------------------------------------------*/
~NumberingPreview()1340 NumberingPreview::~NumberingPreview()
1341 {
1342 }
1343 
1344 
1345