xref: /trunk/main/sw/source/ui/shells/listsh.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sw.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir #include "cmdid.h"
33*cdf0e10cSrcweir #include "hintids.hxx"
34*cdf0e10cSrcweir #include <editeng/sizeitem.hxx>
35*cdf0e10cSrcweir #include <editeng/brshitem.hxx>
36*cdf0e10cSrcweir #include <sfx2/app.hxx>
37*cdf0e10cSrcweir #include <sfx2/request.hxx>
38*cdf0e10cSrcweir #include <sfx2/objface.hxx>
39*cdf0e10cSrcweir #include <sfx2/bindings.hxx>
40*cdf0e10cSrcweir #include <svl/stritem.hxx>
41*cdf0e10cSrcweir #include <svl/eitem.hxx>
42*cdf0e10cSrcweir #include <tools/urlobj.hxx>
43*cdf0e10cSrcweir #include <svl/whiter.hxx>
44*cdf0e10cSrcweir #include <svl/intitem.hxx>
45*cdf0e10cSrcweir #include <tools/shl.hxx>
46*cdf0e10cSrcweir #include <svl/srchitem.hxx>
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir // --> FME 2005-01-04 #i35572#
49*cdf0e10cSrcweir #include <numrule.hxx>
50*cdf0e10cSrcweir // <--
51*cdf0e10cSrcweir #include <fmtornt.hxx>
52*cdf0e10cSrcweir #include "wrtsh.hxx"
53*cdf0e10cSrcweir #include "swmodule.hxx"
54*cdf0e10cSrcweir #include "frmatr.hxx"
55*cdf0e10cSrcweir #include "helpid.h"
56*cdf0e10cSrcweir #include "globals.hrc"
57*cdf0e10cSrcweir #include "shells.hrc"
58*cdf0e10cSrcweir #include "uinums.hxx"
59*cdf0e10cSrcweir #include "listsh.hxx"
60*cdf0e10cSrcweir #include "poolfmt.hxx"
61*cdf0e10cSrcweir #include "view.hxx"
62*cdf0e10cSrcweir #include "edtwin.hxx"
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir #define SwListShell
65*cdf0e10cSrcweir #include <sfx2/msg.hxx>
66*cdf0e10cSrcweir #include "swslots.hxx"
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir #include <IDocumentOutlineNodes.hxx>
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir SFX_IMPL_INTERFACE(SwListShell, SwBaseShell, SW_RES(STR_SHELLNAME_LIST))
71*cdf0e10cSrcweir {
72*cdf0e10cSrcweir     SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_NUM_TOOLBOX));
73*cdf0e10cSrcweir }
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir TYPEINIT1(SwListShell,SwBaseShell)
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir // --> FME 2005-01-04 #i35572# Functionality of Numbering/Bullet toolbar
79*cdf0e10cSrcweir // for outline numbered paragraphs should match the functions for outlines
80*cdf0e10cSrcweir // available in the navigator. Therefore the code in the following
81*cdf0e10cSrcweir // function is quite similar the the code in SwContentTree::ExecCommand.
82*cdf0e10cSrcweir void lcl_OutlineUpDownWithSubPoints( SwWrtShell& rSh, bool bMove, bool bUp )
83*cdf0e10cSrcweir {
84*cdf0e10cSrcweir     const sal_uInt16 nActPos = rSh.GetOutlinePos();
85*cdf0e10cSrcweir     if ( nActPos < USHRT_MAX && rSh.IsOutlineMovable( nActPos ) )
86*cdf0e10cSrcweir     {
87*cdf0e10cSrcweir         rSh.Push();
88*cdf0e10cSrcweir         rSh.MakeOutlineSel( nActPos, nActPos, sal_True );
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir         if ( bMove )
91*cdf0e10cSrcweir         {
92*cdf0e10cSrcweir             const IDocumentOutlineNodes* pIDoc( rSh.getIDocumentOutlineNodesAccess() );
93*cdf0e10cSrcweir             const sal_uInt16 nActLevel = static_cast<sal_uInt16>(pIDoc->getOutlineLevel( nActPos ));
94*cdf0e10cSrcweir             sal_uInt16 nActEndPos = nActPos + 1;
95*cdf0e10cSrcweir             sal_Int16 nDir = 0;
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir             if ( !bUp )
98*cdf0e10cSrcweir             {
99*cdf0e10cSrcweir                 // Move down with subpoints:
100*cdf0e10cSrcweir                 while ( nActEndPos < pIDoc->getOutlineNodesCount() &&
101*cdf0e10cSrcweir                         pIDoc->getOutlineLevel( nActEndPos ) > nActLevel )
102*cdf0e10cSrcweir                     ++nActEndPos;
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir                 if ( nActEndPos < pIDoc->getOutlineNodesCount() )
105*cdf0e10cSrcweir                 {
106*cdf0e10cSrcweir                     // The current subpoint which should be moved
107*cdf0e10cSrcweir                     // starts at nActPos and ends at nActEndPos - 1
108*cdf0e10cSrcweir                     --nActEndPos;
109*cdf0e10cSrcweir                     sal_uInt16 nDest = nActEndPos + 2;
110*cdf0e10cSrcweir                     while ( nDest < pIDoc->getOutlineNodesCount() &&
111*cdf0e10cSrcweir                             pIDoc->getOutlineLevel( nDest ) > nActLevel )
112*cdf0e10cSrcweir                         ++nDest;
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir                     nDir = nDest - 1 - nActEndPos;
115*cdf0e10cSrcweir                 }
116*cdf0e10cSrcweir             }
117*cdf0e10cSrcweir             else
118*cdf0e10cSrcweir             {
119*cdf0e10cSrcweir                 // Move up with subpoints:
120*cdf0e10cSrcweir                 if ( nActPos > 0 )
121*cdf0e10cSrcweir                 {
122*cdf0e10cSrcweir                     --nActEndPos;
123*cdf0e10cSrcweir                     sal_uInt16 nDest = nActPos - 1;
124*cdf0e10cSrcweir                     while ( nDest > 0 && pIDoc->getOutlineLevel( nDest ) > nActLevel )
125*cdf0e10cSrcweir                         --nDest;
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir                     nDir = nDest - nActPos;
128*cdf0e10cSrcweir                 }
129*cdf0e10cSrcweir             }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir             if ( nDir )
132*cdf0e10cSrcweir             {
133*cdf0e10cSrcweir                 rSh.MoveOutlinePara( nDir );
134*cdf0e10cSrcweir                 rSh.GotoOutline( nActPos + nDir );
135*cdf0e10cSrcweir             }
136*cdf0e10cSrcweir         }
137*cdf0e10cSrcweir         else
138*cdf0e10cSrcweir         {
139*cdf0e10cSrcweir             // Up/down with subpoints:
140*cdf0e10cSrcweir             rSh.OutlineUpDown( bUp ? -1 : 1 );
141*cdf0e10cSrcweir         }
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir         rSh.ClearMark();
144*cdf0e10cSrcweir         rSh.Pop( sal_False );
145*cdf0e10cSrcweir     }
146*cdf0e10cSrcweir }
147*cdf0e10cSrcweir // <--
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir void SwListShell::Execute(SfxRequest &rReq)
150*cdf0e10cSrcweir {
151*cdf0e10cSrcweir     const SfxItemSet* pArgs = rReq.GetArgs();
152*cdf0e10cSrcweir     sal_uInt16 nSlot = rReq.GetSlot();
153*cdf0e10cSrcweir     SwWrtShell& rSh = GetShell();
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir     // --> FME 2005-01-04 #i35572#
156*cdf0e10cSrcweir     const SwNumRule* pCurRule = rSh.GetCurNumRule();
157*cdf0e10cSrcweir     ASSERT( pCurRule, "SwListShell::Execute without NumRule" )
158*cdf0e10cSrcweir     bool bOutline = pCurRule && pCurRule->IsOutlineRule();
159*cdf0e10cSrcweir     // <--
160*cdf0e10cSrcweir 
161*cdf0e10cSrcweir     switch (nSlot)
162*cdf0e10cSrcweir     {
163*cdf0e10cSrcweir         case FN_NUM_BULLET_DOWN:
164*cdf0e10cSrcweir         case FN_NUM_BULLET_UP:
165*cdf0e10cSrcweir             {
166*cdf0e10cSrcweir                 SfxViewFrame * pFrame = GetView().GetViewFrame();
167*cdf0e10cSrcweir 
168*cdf0e10cSrcweir                 rReq.Done();
169*cdf0e10cSrcweir                 rSh.NumUpDown( ( nSlot == FN_NUM_BULLET_DOWN )
170*cdf0e10cSrcweir                                ? sal_True
171*cdf0e10cSrcweir                                : sal_False );
172*cdf0e10cSrcweir                 pFrame->GetBindings().Invalidate( SID_TABLE_CELL ); // StatusZeile updaten!
173*cdf0e10cSrcweir             }
174*cdf0e10cSrcweir             break;
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir         case FN_NUM_BULLET_NEXT:
177*cdf0e10cSrcweir             rSh.GotoNextNum();
178*cdf0e10cSrcweir             rReq.Done();
179*cdf0e10cSrcweir             break;
180*cdf0e10cSrcweir 
181*cdf0e10cSrcweir         case FN_NUM_BULLET_NONUM:
182*cdf0e10cSrcweir             rSh.NoNum();
183*cdf0e10cSrcweir             rReq.Done();
184*cdf0e10cSrcweir             break;
185*cdf0e10cSrcweir 
186*cdf0e10cSrcweir         case FN_NUM_BULLET_OFF:
187*cdf0e10cSrcweir         {
188*cdf0e10cSrcweir             rReq.Ignore();
189*cdf0e10cSrcweir             SfxRequest aReq( GetView().GetViewFrame(), FN_NUM_BULLET_ON );
190*cdf0e10cSrcweir             aReq.AppendItem( SfxBoolItem( FN_PARAM_1, sal_False ) );
191*cdf0e10cSrcweir             aReq.Done();
192*cdf0e10cSrcweir             rSh.DelNumRules();
193*cdf0e10cSrcweir             break;
194*cdf0e10cSrcweir         }
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir         case FN_NUM_BULLET_OUTLINE_DOWN:
197*cdf0e10cSrcweir             if ( bOutline )
198*cdf0e10cSrcweir                 lcl_OutlineUpDownWithSubPoints( rSh, false, false );
199*cdf0e10cSrcweir             else
200*cdf0e10cSrcweir                 rSh.MoveNumParas(sal_False, sal_False);
201*cdf0e10cSrcweir             rReq.Done();
202*cdf0e10cSrcweir             break;
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir         case FN_NUM_BULLET_OUTLINE_MOVEDOWN:
205*cdf0e10cSrcweir             if ( bOutline )
206*cdf0e10cSrcweir                 lcl_OutlineUpDownWithSubPoints( rSh, true, false );
207*cdf0e10cSrcweir             else
208*cdf0e10cSrcweir                 rSh.MoveNumParas(sal_True, sal_False);
209*cdf0e10cSrcweir             rReq.Done();
210*cdf0e10cSrcweir             break;
211*cdf0e10cSrcweir 
212*cdf0e10cSrcweir         case FN_NUM_BULLET_OUTLINE_MOVEUP:
213*cdf0e10cSrcweir             if ( bOutline )
214*cdf0e10cSrcweir                 lcl_OutlineUpDownWithSubPoints( rSh, true, true );
215*cdf0e10cSrcweir             else
216*cdf0e10cSrcweir                 rSh.MoveNumParas(sal_True, sal_True);
217*cdf0e10cSrcweir             rReq.Done();
218*cdf0e10cSrcweir             break;
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir         case FN_NUM_BULLET_OUTLINE_UP:
221*cdf0e10cSrcweir             if ( bOutline )
222*cdf0e10cSrcweir                 lcl_OutlineUpDownWithSubPoints( rSh, false, true );
223*cdf0e10cSrcweir             else
224*cdf0e10cSrcweir                 rSh.MoveNumParas(sal_False, sal_True);
225*cdf0e10cSrcweir             rReq.Done();
226*cdf0e10cSrcweir             break;
227*cdf0e10cSrcweir 
228*cdf0e10cSrcweir         case FN_NUM_BULLET_PREV:
229*cdf0e10cSrcweir             rSh.GotoPrevNum();
230*cdf0e10cSrcweir             rReq.Done();
231*cdf0e10cSrcweir             break;
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir         case FN_NUM_OR_NONUM:
234*cdf0e10cSrcweir         {
235*cdf0e10cSrcweir             sal_Bool bApi = rReq.IsAPI();
236*cdf0e10cSrcweir             sal_Bool bDelete = !rSh.IsNoNum(!bApi);
237*cdf0e10cSrcweir             if(pArgs )
238*cdf0e10cSrcweir                 bDelete = ((SfxBoolItem &)pArgs->Get(rReq.GetSlot())).GetValue();
239*cdf0e10cSrcweir             rSh.NumOrNoNum( bDelete, !bApi );
240*cdf0e10cSrcweir             rReq.AppendItem( SfxBoolItem( nSlot, bDelete ) );
241*cdf0e10cSrcweir             rReq.Done();
242*cdf0e10cSrcweir         }
243*cdf0e10cSrcweir         break;
244*cdf0e10cSrcweir         default:
245*cdf0e10cSrcweir             ASSERT(!this, falscher Dispatcher);
246*cdf0e10cSrcweir             return;
247*cdf0e10cSrcweir     }
248*cdf0e10cSrcweir }
249*cdf0e10cSrcweir 
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir void SwListShell::GetState(SfxItemSet &rSet)
252*cdf0e10cSrcweir {
253*cdf0e10cSrcweir     SfxWhichIter aIter( rSet );
254*cdf0e10cSrcweir     sal_uInt16 nWhich = aIter.FirstWhich();
255*cdf0e10cSrcweir     SwWrtShell& rSh = GetShell();
256*cdf0e10cSrcweir     sal_uInt8 nCurrentNumLevel = rSh.GetNumLevel();
257*cdf0e10cSrcweir     while ( nWhich )
258*cdf0e10cSrcweir     {
259*cdf0e10cSrcweir         switch( nWhich )
260*cdf0e10cSrcweir         {
261*cdf0e10cSrcweir             case FN_NUM_OR_NONUM:
262*cdf0e10cSrcweir                 rSet.Put(SfxBoolItem(nWhich, GetShell().IsNoNum(sal_False)));
263*cdf0e10cSrcweir             break;
264*cdf0e10cSrcweir             case FN_NUM_BULLET_OUTLINE_UP:
265*cdf0e10cSrcweir             case FN_NUM_BULLET_UP:
266*cdf0e10cSrcweir                 if(!nCurrentNumLevel)
267*cdf0e10cSrcweir                     rSet.DisableItem(nWhich);
268*cdf0e10cSrcweir             break;
269*cdf0e10cSrcweir             case FN_NUM_BULLET_OUTLINE_DOWN :
270*cdf0e10cSrcweir             {
271*cdf0e10cSrcweir                 sal_uInt8 nUpper = 0;
272*cdf0e10cSrcweir                 sal_uInt8 nLower = 0;
273*cdf0e10cSrcweir                 rSh.GetCurrentOutlineLevels( nUpper, nLower );
274*cdf0e10cSrcweir                 if(nLower == (MAXLEVEL - 1))
275*cdf0e10cSrcweir                     rSet.DisableItem(nWhich);
276*cdf0e10cSrcweir             }
277*cdf0e10cSrcweir             break;
278*cdf0e10cSrcweir             case FN_NUM_BULLET_DOWN:
279*cdf0e10cSrcweir                 if(nCurrentNumLevel == (MAXLEVEL - 1))
280*cdf0e10cSrcweir                     rSet.DisableItem(nWhich);
281*cdf0e10cSrcweir             break;
282*cdf0e10cSrcweir         }
283*cdf0e10cSrcweir         nWhich = aIter.NextWhich();
284*cdf0e10cSrcweir     }
285*cdf0e10cSrcweir }
286*cdf0e10cSrcweir 
287*cdf0e10cSrcweir 
288*cdf0e10cSrcweir SwListShell::SwListShell(SwView &_rView) :
289*cdf0e10cSrcweir     SwBaseShell(_rView)
290*cdf0e10cSrcweir {
291*cdf0e10cSrcweir     SetName(String::CreateFromAscii("List"));
292*cdf0e10cSrcweir     SetHelpId(SW_LISTSHELL);
293*cdf0e10cSrcweir }
294*cdf0e10cSrcweir 
295*cdf0e10cSrcweir 
296