xref: /AOO41X/main/sw/source/ui/shells/txtnum.cxx (revision ffad8df045fe8db79e3e50f731c1fa6ab6501c83)
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 
28 #include <hintids.hxx>
29 #ifndef _MSGBOX_HXX //autogen
30 #include <vcl/msgbox.hxx>
31 #endif
32 #include <sfx2/request.hxx>
33 #include <svl/eitem.hxx>
34 #include <svl/stritem.hxx>
35 #include <editeng/numitem.hxx>
36 #include <editeng/brshitem.hxx>
37 #include <numrule.hxx>
38 
39 #include "cmdid.h"
40 #include "wrtsh.hxx"
41 #include "view.hxx"
42 #include "viewopt.hxx"
43 #include "wdocsh.hxx"
44 #include "textsh.hxx"
45 #include "uiitems.hxx"
46 #include "swabstdlg.hxx"
47 #include <globals.hrc>
48 #include <sfx2/tabdlg.hxx>
49 #include <svx/nbdtmg.hxx>
50 #include <svx/nbdtmgfact.hxx>
51 #include <sfx2/viewfrm.hxx>
52 #include <sfx2/bindings.hxx>
53 using namespace svx::sidebar;
54 
ExecEnterNum(SfxRequest & rReq)55 void SwTextShell::ExecEnterNum(SfxRequest &rReq)
56 {
57     //wg. Aufzeichnung schon vor dem evtl. Shellwechsel
58     switch(rReq.GetSlot())
59     {
60     case FN_NUM_NUMBERING_ON:
61     {
62         GetShell().StartAllAction();
63         SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, FN_PARAM_1 , sal_False );
64         sal_Bool bMode = !GetShell().SelectionHasNumber(); // #i29560#
65         if ( pItem )
66             bMode = pItem->GetValue();
67         else
68             rReq.AppendItem( SfxBoolItem( FN_PARAM_1, bMode ) );
69 
70         if ( bMode != (GetShell().SelectionHasNumber()) ) // #i29560#
71         {
72             rReq.Done();
73             if( bMode )
74                 GetShell().NumOn();
75             else
76                 GetShell().NumOrBulletOff(); // #i29560#
77         }
78         sal_Bool bNewResult = GetShell().SelectionHasNumber();
79         if (bNewResult!=bMode) {
80             SfxBindings& rBindings = GetView().GetViewFrame()->GetBindings();
81             SfxBoolItem aItem(FN_NUM_NUMBERING_ON,!bNewResult);
82             rBindings.SetState(aItem);
83             SfxBoolItem aNewItem(FN_NUM_NUMBERING_ON,bNewResult);
84             rBindings.SetState(aNewItem);
85         }
86         GetShell().EndAllAction();
87     }
88     break;
89     case FN_NUM_BULLET_ON:
90     {
91         GetShell().StartAllAction();
92         SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, FN_PARAM_1 , sal_False );
93         sal_Bool bMode = !GetShell().SelectionHasBullet(); // #i29560#
94         if ( pItem )
95             bMode = pItem->GetValue();
96         else
97             rReq.AppendItem( SfxBoolItem( FN_PARAM_1, bMode ) );
98 
99         if ( bMode != (GetShell().SelectionHasBullet()) ) // #i29560#
100         {
101             rReq.Done();
102             if( bMode )
103                 GetShell().BulletOn();
104             else
105                 GetShell().NumOrBulletOff(); // #i29560#
106         }
107         sal_Bool bNewResult = GetShell().SelectionHasBullet();
108         if (bNewResult!=bMode) {
109             SfxBindings& rBindings = GetView().GetViewFrame()->GetBindings();
110             SfxBoolItem aItem(FN_NUM_BULLET_ON,!bNewResult);
111             rBindings.SetState(aItem);
112             SfxBoolItem aNewItem(FN_NUM_BULLET_ON,bNewResult);
113             rBindings.SetState(aNewItem);
114         }
115         GetShell().EndAllAction();
116     }
117     break;
118     case FN_NUMBER_BULLETS:
119     case SID_OUTLINE_BULLET:
120     {
121         // --> OD 2008-02-29 #refactorlists#
122 //        // per default sal_True, damit die Schleife im Dialog richtig arbeitet!
123 //        sal_Bool bHasChild = sal_True;
124         // <--
125         SfxItemSet aSet(GetPool(),
126                 SID_HTML_MODE, SID_HTML_MODE,
127                 SID_ATTR_NUMBERING_RULE, SID_PARAM_CUR_NUM_LEVEL,
128                 0 );
129         SwDocShell* pDocSh = GetView().GetDocShell();
130         sal_Bool bHtml = 0 != PTR_CAST(SwWebDocShell, pDocSh);
131         const SwNumRule* pCurRule = GetShell().GetCurNumRule();
132         if( pCurRule )
133         {
134             SvxNumRule aRule = pCurRule->MakeSvxNumRule();
135 
136             //convert type of linked bitmaps from SVX_NUM_BITMAP to (SVX_NUM_BITMAP|LINK_TOKEN)
137             for(sal_uInt16 i = 0; i < aRule.GetLevelCount(); i++)
138             {
139                 SvxNumberFormat aFmt(aRule.GetLevel(i));
140                 if(SVX_NUM_BITMAP == aFmt.GetNumberingType())
141                 {
142                     const SvxBrushItem* pBrush = aFmt.GetBrush();
143                     const String* pLinkStr;
144                     if(pBrush &&
145                         0 != (pLinkStr = pBrush->GetGraphicLink()) &&
146                             pLinkStr->Len())
147                         aFmt.SetNumberingType(SvxExtNumType(SVX_NUM_BITMAP|LINK_TOKEN));
148                     aRule.SetLevel(i, aFmt, aRule.Get(i) != 0);
149                 }
150             }
151             if(bHtml)
152                 aRule.SetFeatureFlag(NUM_ENABLE_EMBEDDED_BMP, sal_False);
153 
154             aSet.Put(SvxNumBulletItem(aRule));
155             // --> OD 2008-02-29 #refactorlists# - removed <bHasChild>
156             ASSERT( GetShell().GetNumLevel() < MAXLEVEL,
157                     "<SwTextShell::ExecEnterNum()> - numbered node without valid list level. Serious defect -> please inform OD." );
158             sal_uInt16 nLevel = GetShell().GetNumLevel();
159             // <--
160             if( nLevel < MAXLEVEL )
161             {
162                 nLevel = 1<<nLevel;
163                 aSet.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, nLevel ));
164             }
165         }
166         else
167         {
168             // --> OD 2008-02-11 #newlistlevelattrs#
169             SwNumRule aRule( GetShell().GetUniqueNumRuleName(),
170                              // --> OD 2008-06-06 #i89178#
171                              numfunc::GetDefaultPositionAndSpaceMode() );
172                              // <--
173             // <--
174             SvxNumRule aSvxRule = aRule.MakeSvxNumRule();
175             const bool bRightToLeft = GetShell().IsInRightToLeftText( 0 );
176 
177             if( bHtml || bRightToLeft )
178             {
179                 for( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
180                 {
181                     SvxNumberFormat aFmt( aSvxRule.GetLevel( n ) );
182                     if ( n && bHtml )
183                     {
184                         // 1/2" fuer HTML
185                         aFmt.SetLSpace(720);
186                         aFmt.SetAbsLSpace(n * 720);
187                     }
188                     // --> FME 2005-01-21 #i38904#  Default alignment for
189                     // numbering/bullet should be rtl in rtl paragraph:
190                     if ( bRightToLeft )
191                     {
192                         aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
193                     }
194                     // <--
195                     aSvxRule.SetLevel( n, aFmt, sal_False );
196                 }
197                 aSvxRule.SetFeatureFlag(NUM_ENABLE_EMBEDDED_BMP, sal_False);
198             }
199             aSet.Put(SvxNumBulletItem(aSvxRule));
200         }
201 
202         aSet.Put( SfxBoolItem( SID_PARAM_NUM_PRESET,sal_False ));
203 
204         // vor dem Dialog wird der HtmlMode an der DocShell versenkt
205         pDocSh->PutItem(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(pDocSh)));
206 
207         SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
208         DBG_ASSERT(pFact, "Dialogdiet fail!");
209         SfxAbstractTabDialog* pDlg = pFact->CreateSwTabDialog( DLG_SVXTEST_NUM_BULLET,
210                                                         GetView().GetWindow(), &aSet, GetShell());
211         DBG_ASSERT(pDlg, "Dialogdiet fail!");
212         sal_uInt16 nRet = pDlg->Execute();
213         const SfxPoolItem* pItem;
214         if( RET_OK == nRet )
215         {
216             if( SFX_ITEM_SET == pDlg->GetOutputItemSet()->GetItemState( SID_ATTR_NUMBERING_RULE, sal_False, &pItem ))
217             {
218                 rReq.AppendItem(*pItem);
219                 rReq.Done();
220                 SvxNumRule* pSetRule = ((SvxNumBulletItem*)pItem)->GetNumRule();
221                 pSetRule->UnLinkGraphics();
222                 // --> OD 2008-02-11 #newlistlevelattrs#
223                 SwNumRule aSetRule( pCurRule
224                                         ? pCurRule->GetName()
225                                         : GetShell().GetUniqueNumRuleName(),
226                                     // --> OD 2008-06-06 #i89178#
227                                     numfunc::GetDefaultPositionAndSpaceMode() );
228                                     // <--
229                 // <--
230                 aSetRule.SetSvxRule( *pSetRule, GetShell().GetDoc());
231                 aSetRule.SetAutoRule( sal_True );
232                 // --> OD 2008-03-17 #refactorlists#
233                 // No start of new list, if an existing list style is edited.
234                 // Otherwise start a new list.
235                 const bool bCreateList = (pCurRule == 0);
236                 GetShell().SetCurNumRule( aSetRule, bCreateList );
237                 // <--
238             }
239             // wenn der Dialog mit OK verlassen wurde, aber nichts ausgewaehlt
240             // wurde dann muss die Numerierung zumindest eingeschaltet werden,
241             // wenn sie das noch nicht ist
242             else if( !pCurRule && SFX_ITEM_SET == aSet.GetItemState( SID_ATTR_NUMBERING_RULE, sal_False, &pItem ))
243             {
244                 rReq.AppendItem( *pItem );
245                 rReq.Done();
246                 SvxNumRule* pSetRule = ((SvxNumBulletItem*)pItem)->GetNumRule();
247                 // --> OD 2008-02-11 #newlistlevelattrs#
248                 SwNumRule aSetRule( GetShell().GetUniqueNumRuleName(),
249                                     // --> OD 2008-06-06 #i89178#
250                                     numfunc::GetDefaultPositionAndSpaceMode() );
251                                     // <--
252                 // <--
253                 aSetRule.SetSvxRule(*pSetRule, GetShell().GetDoc());
254                 aSetRule.SetAutoRule( sal_True );
255                 // --> OD 2008-03-17 #refactorlists#
256                 // start new list
257                 GetShell().SetCurNumRule( aSetRule, true );
258                 // <--
259             }
260         }
261         else if(RET_USER == nRet)
262             GetShell().DelNumRules();
263 
264         delete pDlg;
265     }
266     break;
267     default:
268         ASSERT(sal_False,  falscher Dispatcher);
269         return;
270     }
271 }
272 
ExecSetNumber(SfxRequest & rReq)273 void SwTextShell::ExecSetNumber(SfxRequest &rReq)
274 {
275     SwNumRule aRule( GetShell().GetUniqueNumRuleName(),
276                          // --> OD 2008-06-06 #i89178#
277                          numfunc::GetDefaultPositionAndSpaceMode() );
278                          // <--
279 
280     SvxNumRule aSvxRule = aRule.MakeSvxNumRule();
281     const bool bRightToLeft = GetShell().IsInRightToLeftText( 0 );
282 
283     if( bRightToLeft )
284     {
285         for( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
286         {
287             SvxNumberFormat aFmt( aSvxRule.GetLevel( n ) );
288            /* if ( n && bHtml )
289             {
290                 // 1/2" fuer HTML
291                 aFmt.SetLSpace(720);
292                 aFmt.SetAbsLSpace(n * 720);
293             }*/
294             // --> FME 2005-01-21 #i38904#  Default alignment for
295             // numbering/bullet should be rtl in rtl paragraph:
296             if ( bRightToLeft )
297             {
298                 aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
299             }
300             // <--
301             aSvxRule.SetLevel( n, aFmt, sal_False );
302         }
303         aSvxRule.SetFeatureFlag(NUM_ENABLE_EMBEDDED_BMP, sal_False);
304     }
305 
306     const SwNumRule* pCurRule = GetShell().GetCurNumRule();
307     sal_uInt16      nActNumLvl = (sal_uInt16)0xFFFF;
308     if( pCurRule )
309     {
310         sal_uInt16 nLevel = GetShell().GetNumLevel();
311         if( nLevel < MAXLEVEL )
312         {
313             nActNumLvl = 1<<nLevel;
314         }
315 
316         aSvxRule = pCurRule->MakeSvxNumRule();
317 
318         //convert type of linked bitmaps from SVX_NUM_BITMAP to (SVX_NUM_BITMAP|LINK_TOKEN)
319         for(sal_uInt16 i = 0; i < aSvxRule.GetLevelCount(); i++)
320         {
321             SvxNumberFormat aFmt(aSvxRule.GetLevel(i));
322             if(SVX_NUM_BITMAP == aFmt.GetNumberingType())
323             {
324                 const SvxBrushItem* pBrush = aFmt.GetBrush();
325                 const String* pLinkStr;
326                 if(pBrush &&
327                     0 != (pLinkStr = pBrush->GetGraphicLink()) &&
328                         pLinkStr->Len())
329                     aFmt.SetNumberingType(SvxExtNumType(SVX_NUM_BITMAP|LINK_TOKEN));
330                 aSvxRule.SetLevel(i, aFmt, aSvxRule.Get(i) != 0);
331             }
332         }
333     }
334 
335 
336     switch(rReq.GetSlot())
337     {
338     case FN_SVX_SET_NUMBER:
339         {
340             SFX_REQUEST_ARG( rReq, pItem, SfxUInt16Item, FN_SVX_SET_NUMBER , sal_False );
341             if (pItem)
342             {
343                 sal_uInt16 nIdx = pItem->GetValue();
344                 if (nIdx==DEFAULT_NONE) {
345                     GetShell().DelNumRules();
346                     break;
347                 }
348                 --nIdx;
349 
350                 NBOTypeMgrBase* pNumbering = NBOutlineTypeMgrFact::CreateInstance(eNBOType::NUMBERING);
351                 if ( pNumbering )
352                 {
353                     SwNumRule aTmpRule( GetShell().GetUniqueNumRuleName(),
354                          numfunc::GetDefaultPositionAndSpaceMode() );
355 
356                     SvxNumRule aTempRule = aTmpRule.MakeSvxNumRule();
357                     // set unit attribute to NB Manager
358                     SfxItemSet aSet(GetPool(),
359                             SID_ATTR_NUMBERING_RULE, SID_PARAM_CUR_NUM_LEVEL,
360                             0 );
361                     aSet.Put(SvxNumBulletItem(aTempRule));
362                     pNumbering->SetItems(&aSet);
363                     pNumbering->ApplyNumRule(aTempRule,nIdx,nActNumLvl);
364 
365                     sal_uInt16 nMask = 1;
366                     for(sal_uInt16 i = 0; i < aSvxRule.GetLevelCount(); i++)
367                     {
368                         if(nActNumLvl & nMask)
369                         {
370                             SvxNumberFormat aFmt(aTempRule.GetLevel(i));
371                             aSvxRule.SetLevel(i, aFmt);
372                         }
373                         nMask <<= 1 ;
374                     }
375 
376                     aSvxRule.UnLinkGraphics();
377                     SwNumRule aSetRule( pCurRule
378                                             ? pCurRule->GetName()
379                                             : GetShell().GetUniqueNumRuleName(),
380                                         numfunc::GetDefaultPositionAndSpaceMode() );
381                     aSetRule.SetSvxRule( aSvxRule, GetShell().GetDoc());
382 
383                     aSetRule.SetAutoRule( sal_True );
384                     const bool bCreateList = (pCurRule == 0);
385                     GetShell().SetCurNumRule( aSetRule, bCreateList );
386                 }
387                 //End
388             }
389             break;
390         }
391     case FN_SVX_SET_BULLET:
392         {
393             SFX_REQUEST_ARG( rReq, pItem, SfxUInt16Item, FN_SVX_SET_BULLET , sal_False );
394             if (pItem)
395             {
396                 sal_uInt16 nIdx = pItem->GetValue();
397                 if (nIdx==DEFAULT_NONE) {
398                     GetShell().DelNumRules();
399                     break;
400                 }
401                 nIdx--;
402 
403                 NBOTypeMgrBase* pBullets = NBOutlineTypeMgrFact::CreateInstance(eNBOType::MIXBULLETS);
404                 if ( pBullets )
405                 {
406                     SwNumRule aTmpRule( GetShell().GetUniqueNumRuleName(),
407                          numfunc::GetDefaultPositionAndSpaceMode() );
408 
409                     SvxNumRule aTempRule = aTmpRule.MakeSvxNumRule();
410                     // set unit attribute to NB Manager
411                     SfxItemSet aSet(GetPool(),
412                             SID_ATTR_NUMBERING_RULE, SID_PARAM_CUR_NUM_LEVEL,
413                             0 );
414                     aSet.Put(SvxNumBulletItem(aTempRule));
415                     pBullets->SetItems(&aSet);
416 
417                     //SvxNumRule aTempRule( 0, 10, false );
418                     pBullets->ApplyNumRule(aTempRule,nIdx,nActNumLvl);
419                     sal_uInt16 nMask = 1;
420                     for(sal_uInt16 i = 0; i < aSvxRule.GetLevelCount(); i++)
421                     {
422                         if(nActNumLvl & nMask)
423                         {
424                             SvxNumberFormat aFmt(aTempRule.GetLevel(i));
425                             aSvxRule.SetLevel(i, aFmt);
426                         }
427                         nMask <<= 1;
428                     }
429                     aSvxRule.UnLinkGraphics();
430 
431                     SwNumRule aSetRule( pCurRule
432                                             ? pCurRule->GetName()
433                                             : GetShell().GetUniqueNumRuleName(),
434                                         numfunc::GetDefaultPositionAndSpaceMode() );
435 
436                     aSetRule.SetSvxRule( aSvxRule, GetShell().GetDoc());
437 
438                     aSetRule.SetAutoRule( sal_True );
439                     const bool bCreateList = (pCurRule == 0);
440                     GetShell().SetCurNumRule( aSetRule, bCreateList );
441                 }
442                 //End
443             }
444 
445         }
446         break;
447     }
448 }
449