Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <hintids.hxx>
21 : #include <vcl/msgbox.hxx>
22 : #include <sfx2/request.hxx>
23 : #include <svl/eitem.hxx>
24 : #include <svl/stritem.hxx>
25 : #include <editeng/numitem.hxx>
26 : #include <editeng/brshitem.hxx>
27 : #include <numrule.hxx>
28 :
29 : #include "cmdid.h"
30 : #include "wrtsh.hxx"
31 : #include "view.hxx"
32 : #include "viewopt.hxx"
33 : #include "wdocsh.hxx"
34 : #include "textsh.hxx"
35 : #include "uiitems.hxx"
36 : #include "swabstdlg.hxx"
37 : #include <globals.hrc>
38 : #include <sfx2/tabdlg.hxx>
39 :
40 0 : void SwTextShell::ExecEnterNum(SfxRequest &rReq)
41 : {
42 : //wg. Aufzeichnung schon vor dem evtl. Shellwechsel
43 0 : switch(rReq.GetSlot())
44 : {
45 : case FN_NUM_NUMBERING_ON:
46 : {
47 0 : SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, FN_PARAM_1 , sal_False );
48 0 : sal_Bool bMode = !GetShell().HasNumber(); // #i29560#
49 0 : if ( pItem )
50 0 : bMode = pItem->GetValue();
51 : else
52 0 : rReq.AppendItem( SfxBoolItem( FN_PARAM_1, bMode ) );
53 :
54 0 : if ( bMode != (GetShell().HasNumber()) ) // #i29560#
55 : {
56 0 : rReq.Done();
57 0 : if( bMode )
58 0 : GetShell().NumOn();
59 : else
60 0 : GetShell().NumOrBulletOff(); // #i29560#
61 : }
62 : }
63 0 : break;
64 : case FN_NUM_BULLET_ON:
65 : {
66 0 : SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, FN_PARAM_1 , sal_False );
67 0 : sal_Bool bMode = !GetShell().HasBullet(); // #i29560#
68 0 : if ( pItem )
69 0 : bMode = pItem->GetValue();
70 : else
71 0 : rReq.AppendItem( SfxBoolItem( FN_PARAM_1, bMode ) );
72 :
73 0 : if ( bMode != (GetShell().HasBullet()) ) // #i29560#
74 : {
75 0 : rReq.Done();
76 0 : if( bMode )
77 0 : GetShell().BulletOn();
78 : else
79 0 : GetShell().NumOrBulletOff(); // #i29560#
80 : }
81 : }
82 0 : break;
83 : case FN_NUMBER_BULLETS:
84 : {
85 0 : SfxItemSet aSet(GetPool(),
86 : SID_HTML_MODE, SID_HTML_MODE,
87 : SID_ATTR_NUMBERING_RULE, SID_PARAM_CUR_NUM_LEVEL,
88 0 : 0 );
89 0 : SwDocShell* pDocSh = GetView().GetDocShell();
90 0 : sal_Bool bHtml = 0 != PTR_CAST(SwWebDocShell, pDocSh);
91 0 : const SwNumRule* pCurRule = GetShell().GetCurNumRule();
92 0 : if( pCurRule )
93 : {
94 0 : SvxNumRule aRule = pCurRule->MakeSvxNumRule();
95 :
96 : //convert type of linked bitmaps from SVX_NUM_BITMAP to (SVX_NUM_BITMAP|LINK_TOKEN)
97 0 : for(sal_uInt16 i = 0; i < aRule.GetLevelCount(); i++)
98 : {
99 0 : SvxNumberFormat aFmt(aRule.GetLevel(i));
100 0 : if(SVX_NUM_BITMAP == aFmt.GetNumberingType())
101 : {
102 0 : const SvxBrushItem* pBrush = aFmt.GetBrush();
103 : const String* pLinkStr;
104 0 : if(pBrush &&
105 : 0 != (pLinkStr = pBrush->GetGraphicLink()) &&
106 0 : pLinkStr->Len())
107 0 : aFmt.SetNumberingType(SvxExtNumType(SVX_NUM_BITMAP|LINK_TOKEN));
108 0 : aRule.SetLevel(i, aFmt, aRule.Get(i) != 0);
109 : }
110 0 : }
111 0 : if(bHtml)
112 0 : aRule.SetFeatureFlag(NUM_ENABLE_EMBEDDED_BMP, sal_False);
113 :
114 0 : aSet.Put(SvxNumBulletItem(aRule));
115 : OSL_ENSURE( GetShell().GetNumLevel() < MAXLEVEL,
116 : "<SwTextShell::ExecEnterNum()> - numbered node without valid list level. Serious defect -> please inform OD." );
117 0 : sal_uInt16 nLevel = GetShell().GetNumLevel();
118 0 : if( nLevel < MAXLEVEL )
119 : {
120 0 : nLevel = 1<<nLevel;
121 0 : aSet.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, nLevel ));
122 0 : }
123 : }
124 : else
125 : {
126 0 : SwNumRule aRule( GetShell().GetUniqueNumRuleName(),
127 : // #i89178#
128 0 : numfunc::GetDefaultPositionAndSpaceMode() );
129 0 : SvxNumRule aSvxRule = aRule.MakeSvxNumRule();
130 0 : const bool bRightToLeft = GetShell().IsInRightToLeftText( 0 );
131 :
132 0 : if( bHtml || bRightToLeft )
133 : {
134 0 : for( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
135 : {
136 0 : SvxNumberFormat aFmt( aSvxRule.GetLevel( n ) );
137 0 : if ( n && bHtml )
138 : {
139 : // 1/2" fuer HTML
140 0 : aFmt.SetLSpace(720);
141 0 : aFmt.SetAbsLSpace(n * 720);
142 : }
143 : // #i38904# Default alignment for
144 : // numbering/bullet should be rtl in rtl paragraph:
145 0 : if ( bRightToLeft )
146 : {
147 0 : aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
148 : }
149 0 : aSvxRule.SetLevel( n, aFmt, sal_False );
150 0 : }
151 0 : aSvxRule.SetFeatureFlag(NUM_ENABLE_EMBEDDED_BMP, sal_False);
152 : }
153 0 : aSet.Put(SvxNumBulletItem(aSvxRule));
154 : }
155 :
156 0 : aSet.Put( SfxBoolItem( SID_PARAM_NUM_PRESET,sal_False ));
157 :
158 : // vor dem Dialog wird der HtmlMode an der DocShell versenkt
159 0 : pDocSh->PutItem(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(pDocSh)));
160 :
161 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
162 : OSL_ENSURE(pFact, "Dialogdiet fail!");
163 : SfxAbstractTabDialog* pDlg = pFact->CreateSwTabDialog( DLG_SVXTEST_NUM_BULLET,
164 0 : GetView().GetWindow(), &aSet, GetShell());
165 : OSL_ENSURE(pDlg, "Dialogdiet fail!");
166 0 : sal_uInt16 nRet = pDlg->Execute();
167 : const SfxPoolItem* pItem;
168 0 : if( RET_OK == nRet )
169 : {
170 0 : if( SFX_ITEM_SET == pDlg->GetOutputItemSet()->GetItemState( SID_ATTR_NUMBERING_RULE, sal_False, &pItem ))
171 : {
172 0 : rReq.AppendItem(*pItem);
173 0 : rReq.Done();
174 0 : SvxNumRule* pSetRule = ((SvxNumBulletItem*)pItem)->GetNumRule();
175 0 : pSetRule->UnLinkGraphics();
176 : SwNumRule aSetRule( pCurRule
177 0 : ? pCurRule->GetName()
178 0 : : GetShell().GetUniqueNumRuleName(),
179 : // #i89178#
180 0 : numfunc::GetDefaultPositionAndSpaceMode() );
181 0 : aSetRule.SetSvxRule( *pSetRule, GetShell().GetDoc());
182 0 : aSetRule.SetAutoRule( sal_True );
183 : // No start of new list, if an existing list style is edited.
184 : // Otherwise start a new list.
185 0 : const bool bCreateList = (pCurRule == 0);
186 0 : GetShell().SetCurNumRule( aSetRule, bCreateList );
187 : }
188 : // wenn der Dialog mit OK verlassen wurde, aber nichts ausgewaehlt
189 : // wurde dann muss die Numerierung zumindest eingeschaltet werden,
190 : // wenn sie das noch nicht ist
191 0 : else if( !pCurRule && SFX_ITEM_SET == aSet.GetItemState( SID_ATTR_NUMBERING_RULE, sal_False, &pItem ))
192 : {
193 0 : rReq.AppendItem( *pItem );
194 0 : rReq.Done();
195 0 : SvxNumRule* pSetRule = ((SvxNumBulletItem*)pItem)->GetNumRule();
196 0 : SwNumRule aSetRule( GetShell().GetUniqueNumRuleName(),
197 : // #i89178#
198 0 : numfunc::GetDefaultPositionAndSpaceMode() );
199 0 : aSetRule.SetSvxRule(*pSetRule, GetShell().GetDoc());
200 0 : aSetRule.SetAutoRule( sal_True );
201 : // start new list
202 0 : GetShell().SetCurNumRule( aSetRule, true );
203 : }
204 : }
205 0 : else if(RET_USER == nRet)
206 0 : GetShell().DelNumRules();
207 :
208 0 : delete pDlg;
209 : }
210 0 : break;
211 : default:
212 : OSL_FAIL("wrong dispatcher");
213 0 : return;
214 : }
215 30 : }
216 :
217 :
218 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|