xref: /trunk/main/sw/source/ui/shells/txtnum.cxx (revision 34760e49)
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 #include <vcl/msgbox.hxx>
30 #include <sfx2/request.hxx>
31 #include <svl/eitem.hxx>
32 #include <svl/stritem.hxx>
33 #include <editeng/numitem.hxx>
34 #include <editeng/brshitem.hxx>
35 #include <numrule.hxx>
36 
37 #include "cmdid.h"
38 #include "wrtsh.hxx"
39 #include "view.hxx"
40 #include "viewopt.hxx"
41 #include "wdocsh.hxx"
42 #include "textsh.hxx"
43 #include "uiitems.hxx"
44 #include "swabstdlg.hxx"
45 #include <globals.hrc>
46 #include <sfx2/tabdlg.hxx>
47 #include <svx/nbdtmg.hxx>
48 #include <svx/nbdtmgfact.hxx>
49 #include <sfx2/viewfrm.hxx>
50 #include <sfx2/bindings.hxx>
51 
ExecEnterNum(SfxRequest & rReq)52 void SwTextShell::ExecEnterNum(SfxRequest &rReq)
53 {
54 	//wg. Aufzeichnung schon vor dem evtl. Shellwechsel
55 	switch(rReq.GetSlot())
56 	{
57 	case FN_NUM_NUMBERING_ON:
58 	{
59 		GetShell().StartAllAction();
60 		SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, FN_PARAM_1 , sal_False );
61 		sal_Bool bMode = !GetShell().SelectionHasNumber(); // #i29560#
62 		if ( pItem )
63 			bMode = pItem->GetValue();
64 		else
65 			rReq.AppendItem( SfxBoolItem( FN_PARAM_1, bMode ) );
66 
67 		if ( bMode != (GetShell().SelectionHasNumber()) ) // #i29560#
68 		{
69 			rReq.Done();
70 			if( bMode )
71 				GetShell().NumOn();
72 			else
73 				GetShell().NumOrBulletOff(); // #i29560#
74 		}
75 		sal_Bool bNewResult = GetShell().SelectionHasNumber();
76 		if (bNewResult!=bMode) {
77 			SfxBindings& rBindings = GetView().GetViewFrame()->GetBindings();
78 			SfxBoolItem aItem(FN_NUM_NUMBERING_ON,!bNewResult);
79 			rBindings.SetState(aItem);
80 			SfxBoolItem aNewItem(FN_NUM_NUMBERING_ON,bNewResult);
81 			rBindings.SetState(aNewItem);
82 		}
83 		GetShell().EndAllAction();
84 	}
85 	break;
86 	case FN_NUM_BULLET_ON:
87 	{
88 		GetShell().StartAllAction();
89 		SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, FN_PARAM_1 , sal_False );
90 		sal_Bool bMode = !GetShell().SelectionHasBullet(); // #i29560#
91 		if ( pItem )
92 			bMode = pItem->GetValue();
93 		else
94 			rReq.AppendItem( SfxBoolItem( FN_PARAM_1, bMode ) );
95 
96 		if ( bMode != (GetShell().SelectionHasBullet()) ) // #i29560#
97 		{
98 			rReq.Done();
99 			if( bMode )
100 				GetShell().BulletOn();
101 			else
102 				GetShell().NumOrBulletOff(); // #i29560#
103 		}
104 		sal_Bool bNewResult = GetShell().SelectionHasBullet();
105 		if (bNewResult!=bMode) {
106 			SfxBindings& rBindings = GetView().GetViewFrame()->GetBindings();
107 			SfxBoolItem aItem(FN_NUM_BULLET_ON,!bNewResult);
108 			rBindings.SetState(aItem);
109 			SfxBoolItem aNewItem(FN_NUM_BULLET_ON,bNewResult);
110 			rBindings.SetState(aNewItem);
111 		}
112 		GetShell().EndAllAction();
113 	}
114 	break;
115 
116     case FN_NUMBER_BULLETS:
117     case SID_OUTLINE_BULLET:
118     {
119         SfxItemSet aSet( GetPool(),
120                          SID_HTML_MODE, SID_HTML_MODE,
121                          SID_ATTR_NUMBERING_RULE, SID_PARAM_CUR_NUM_LEVEL,
122                          0 );
123         SwDocShell* pDocSh = GetView().GetDocShell();
124         const bool bHtml = 0 != PTR_CAST( SwWebDocShell, pDocSh );
125         const SwNumRule* pNumRuleAtCurrentSelection = GetShell().GetNumRuleAtCurrentSelection();
126         if ( pNumRuleAtCurrentSelection != NULL )
127         {
128             SvxNumRule aRule = pNumRuleAtCurrentSelection->MakeSvxNumRule();
129 
130             //convert type of linked bitmaps from SVX_NUM_BITMAP to (SVX_NUM_BITMAP|LINK_TOKEN)
131             for ( sal_uInt16 i = 0; i < aRule.GetLevelCount(); i++ )
132             {
133                 SvxNumberFormat aFmt( aRule.GetLevel( i ) );
134                 if ( SVX_NUM_BITMAP == aFmt.GetNumberingType() )
135                 {
136                     const SvxBrushItem* pBrush = aFmt.GetBrush();
137                     const String* pLinkStr = pBrush != NULL
138                                              ? pBrush->GetGraphicLink()
139                                              : NULL;
140                     if ( pLinkStr != NULL && pLinkStr->Len() > 0 )
141                     {
142                         aFmt.SetNumberingType( SvxExtNumType( SVX_NUM_BITMAP | LINK_TOKEN ) );
143                     }
144                     aRule.SetLevel( i, aFmt, aRule.Get( i ) != 0 );
145                 }
146             }
147             if ( bHtml )
148                 aRule.SetFeatureFlag( NUM_ENABLE_EMBEDDED_BMP, sal_False );
149 
150             aSet.Put( SvxNumBulletItem( aRule ) );
151             ASSERT( GetShell().GetNumLevel() < MAXLEVEL,
152                     "<SwTextShell::ExecEnterNum()> - numbered node without valid list level. Serious defect -> please inform OD." );
153             sal_uInt16 nLevel = GetShell().GetNumLevel();
154             if ( nLevel < MAXLEVEL )
155             {
156                 nLevel = 1 << nLevel;
157                 aSet.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, nLevel ) );
158             }
159         }
160         else
161         {
162             SwNumRule aRule( GetShell().GetUniqueNumRuleName(),
163                              numfunc::GetDefaultPositionAndSpaceMode() );
164             SvxNumRule aSvxRule = aRule.MakeSvxNumRule();
165             const bool bRightToLeft = GetShell().IsInRightToLeftText( 0 );
166 
167             if ( bHtml || bRightToLeft )
168             {
169                 for ( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
170                 {
171                     SvxNumberFormat aFmt( aSvxRule.GetLevel( n ) );
172                     if ( n && bHtml )
173                     {
174                         // 1/2" fuer HTML
175                         aFmt.SetLSpace( 720 );
176                         aFmt.SetAbsLSpace( n * 720 );
177                     }
178                     // Default alignment for numbering/bullet should be rtl in rtl paragraph:
179                     if ( bRightToLeft )
180                     {
181                         aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
182                     }
183                     aSvxRule.SetLevel( n, aFmt, sal_False );
184                 }
185                 aSvxRule.SetFeatureFlag( NUM_ENABLE_EMBEDDED_BMP, sal_False );
186             }
187             aSet.Put( SvxNumBulletItem( aSvxRule ) );
188         }
189 
190         aSet.Put( SfxBoolItem( SID_PARAM_NUM_PRESET, sal_False ) );
191 
192         // vor dem Dialog wird der HtmlMode an der DocShell versenkt
193         pDocSh->PutItem( SfxUInt16Item( SID_HTML_MODE, ::GetHtmlMode( pDocSh ) ) );
194 
195         SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
196         DBG_ASSERT( pFact, "Dialogdiet fail!" );
197         SfxAbstractTabDialog* pDlg =
198             pFact->CreateSwTabDialog( DLG_SVXTEST_NUM_BULLET, GetView().GetWindow(), &aSet, GetShell() );
199         DBG_ASSERT(pDlg, "Dialogdiet fail!");
200         const sal_uInt16 nRet = pDlg->Execute();
201         const SfxPoolItem* pItem;
202         if ( RET_OK == nRet )
203         {
204             if ( SFX_ITEM_SET == pDlg->GetOutputItemSet()->GetItemState( SID_ATTR_NUMBERING_RULE, sal_False, &pItem ) )
205             {
206                 rReq.AppendItem( *pItem );
207                 rReq.Done();
208                 SvxNumRule* pSetRule = ( (SvxNumBulletItem*) pItem )->GetNumRule();
209                 pSetRule->UnLinkGraphics();
210                 SwNumRule aSetRule( pNumRuleAtCurrentSelection != NULL
211                                     ? pNumRuleAtCurrentSelection->GetName()
212                                     : GetShell().GetUniqueNumRuleName(),
213                     numfunc::GetDefaultPositionAndSpaceMode() );
214                 aSetRule.SetSvxRule( *pSetRule, GetShell().GetDoc() );
215                 aSetRule.SetAutoRule( sal_True );
216                 // No start of new list, if an existing list style is edited.
217                 // Otherwise start a new list.
218                 const bool bCreateList = ( pNumRuleAtCurrentSelection == NULL );
219                 GetShell().SetCurNumRule( aSetRule, bCreateList );
220             }
221             // wenn der Dialog mit OK verlassen wurde, aber nichts ausgewaehlt
222             // wurde dann muss die Numerierung zumindest eingeschaltet werden,
223             // wenn sie das noch nicht ist
224             else if ( pNumRuleAtCurrentSelection == NULL
225                       && SFX_ITEM_SET == aSet.GetItemState( SID_ATTR_NUMBERING_RULE, sal_False, &pItem ) )
226             {
227                 rReq.AppendItem( *pItem );
228                 rReq.Done();
229                 SvxNumRule* pSetRule = ( (SvxNumBulletItem*) pItem )->GetNumRule();
230                 SwNumRule aSetRule(
231                     GetShell().GetUniqueNumRuleName(),
232                     numfunc::GetDefaultPositionAndSpaceMode() );
233                 aSetRule.SetSvxRule( *pSetRule, GetShell().GetDoc() );
234                 aSetRule.SetAutoRule( sal_True );
235                 // start new list
236                 GetShell().SetCurNumRule( aSetRule, true );
237             }
238         }
239         else if ( RET_USER == nRet )
240             GetShell().DelNumRules();
241 
242         delete pDlg;
243     }
244         break;
245 
246     default:
247         ASSERT( sal_False, "wrong Dispatcher" );
248         return;
249     }
250 }
251 
252 
ExecSetNumber(SfxRequest & rReq)253 void SwTextShell::ExecSetNumber(SfxRequest &rReq)
254 {
255     const sal_uInt16 nSlot = rReq.GetSlot();
256     switch ( nSlot )
257     {
258     case FN_SVX_SET_NUMBER:
259     case FN_SVX_SET_BULLET:
260         {
261             SFX_REQUEST_ARG( rReq, pItem, SfxUInt16Item, nSlot, sal_False );
262             if ( pItem != NULL )
263             {
264                 const sal_uInt16 nChoosenItemIdx = pItem->GetValue();
265                 if ( nChoosenItemIdx == DEFAULT_NONE )
266                 {
267                     GetShell().DelNumRules();
268                 }
269                 else
270                 {
271                     svx::sidebar::NBOTypeMgrBase* pNBOTypeMgr =
272                         nSlot == FN_SVX_SET_NUMBER
273                             ? svx::sidebar::NBOutlineTypeMgrFact::CreateInstance( svx::sidebar::eNBOType::NUMBERING )
274                             : svx::sidebar::NBOutlineTypeMgrFact::CreateInstance( svx::sidebar::eNBOType::MIXBULLETS );
275                     if ( pNBOTypeMgr != NULL )
276                     {
277                         const SwNumRule* pNumRuleAtCurrentSelection = GetShell().GetNumRuleAtCurrentSelection();
278                         sal_uInt16 nActNumLvl = (sal_uInt16) 0xFFFF;
279                         if ( pNumRuleAtCurrentSelection != NULL )
280                         {
281                             sal_uInt16 nLevel = GetShell().GetNumLevel();
282                             if ( nLevel < MAXLEVEL )
283                             {
284                                 nActNumLvl = 1 << nLevel;
285                             }
286                         }
287                         SwNumRule aNewNumRule(
288                             pNumRuleAtCurrentSelection != NULL ? pNumRuleAtCurrentSelection->GetName() : GetShell().GetUniqueNumRuleName(),
289                             numfunc::GetDefaultPositionAndSpaceMode() );
290                         SvxNumRule aNewSvxNumRule = pNumRuleAtCurrentSelection != NULL
291                                                         ? pNumRuleAtCurrentSelection->MakeSvxNumRule()
292                                                         : aNewNumRule.MakeSvxNumRule();
293                         // set unit attribute to NB Manager
294                         SfxItemSet aSet( GetPool(), SID_ATTR_NUMBERING_RULE, SID_PARAM_CUR_NUM_LEVEL, 0 );
295                         aSet.Put( SvxNumBulletItem( aNewSvxNumRule ) );
296                         pNBOTypeMgr->SetItems( &aSet );
297                         pNBOTypeMgr->ApplyNumRule( aNewSvxNumRule, nChoosenItemIdx - 1, nActNumLvl );
298 
299                         aNewNumRule.SetSvxRule( aNewSvxNumRule, GetShell().GetDoc() );
300                         aNewNumRule.SetAutoRule( sal_True );
301                         const bool bCreateNewList = ( pNumRuleAtCurrentSelection == NULL );
302                         GetShell().SetCurNumRule( aNewNumRule, bCreateNewList );
303                     }
304                 }
305             }
306         }
307         break;
308 
309     default:
310         ASSERT( sal_False, "wrong Dispatcher" );
311         return;
312     }
313 }
314