xref: /AOO41X/main/sw/source/ui/shells/beziersh.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 <svx/svdview.hxx>
34*cdf0e10cSrcweir #include <svl/srchitem.hxx>
35*cdf0e10cSrcweir #include <svl/eitem.hxx>
36*cdf0e10cSrcweir #include <svl/whiter.hxx>
37*cdf0e10cSrcweir #include <svx/svdopath.hxx>
38*cdf0e10cSrcweir #include <sfx2/request.hxx>
39*cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
40*cdf0e10cSrcweir #include <sfx2/objface.hxx>
41*cdf0e10cSrcweir 
42*cdf0e10cSrcweir #include "wrtsh.hxx"
43*cdf0e10cSrcweir #include "view.hxx"
44*cdf0e10cSrcweir #include "edtwin.hxx"
45*cdf0e10cSrcweir #include "helpid.h"
46*cdf0e10cSrcweir #include "globals.hrc"
47*cdf0e10cSrcweir #include "drawbase.hxx"
48*cdf0e10cSrcweir #include "beziersh.hxx"
49*cdf0e10cSrcweir #include "popup.hrc"
50*cdf0e10cSrcweir #include "shells.hrc"
51*cdf0e10cSrcweir #define SwBezierShell
52*cdf0e10cSrcweir #include <sfx2/msg.hxx>
53*cdf0e10cSrcweir #include "swslots.hxx"
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir #include <unomid.h>
56*cdf0e10cSrcweir 
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir SFX_IMPL_INTERFACE(SwBezierShell, SwBaseShell, SW_RES(STR_SHELLNAME_BEZIER))
59*cdf0e10cSrcweir {
60*cdf0e10cSrcweir 	SFX_POPUPMENU_REGISTRATION(SW_RES(MN_DRAW_POPUPMENU));
61*cdf0e10cSrcweir 	SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_BEZIER_TOOLBOX));
62*cdf0e10cSrcweir }
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir TYPEINIT1(SwBezierShell,SwBaseShell)
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir /*--------------------------------------------------------------------
67*cdf0e10cSrcweir 	Beschreibung:
68*cdf0e10cSrcweir  --------------------------------------------------------------------*/
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir SwBezierShell::SwBezierShell(SwView &_rView):
72*cdf0e10cSrcweir     SwBaseShell( _rView )
73*cdf0e10cSrcweir {
74*cdf0e10cSrcweir 	SetName(C2S("Bezier"));
75*cdf0e10cSrcweir 	SetHelpId(SW_BEZIERSHELL);
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir 	SwWrtShell *pSh = &GetShell();
78*cdf0e10cSrcweir 	SdrView*	pSdrView = pSh->GetDrawView();
79*cdf0e10cSrcweir 	pSdrView->SetEliminatePolyPointLimitAngle(1500L);
80*cdf0e10cSrcweir }
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir /*--------------------------------------------------------------------
83*cdf0e10cSrcweir 	Beschreibung:
84*cdf0e10cSrcweir  --------------------------------------------------------------------*/
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir void SwBezierShell::Execute(SfxRequest &rReq)
88*cdf0e10cSrcweir {
89*cdf0e10cSrcweir 	SwWrtShell *pSh = &GetShell();
90*cdf0e10cSrcweir 	SdrView*	pSdrView = pSh->GetDrawView();
91*cdf0e10cSrcweir 	const SfxItemSet *pArgs = rReq.GetArgs();
92*cdf0e10cSrcweir 	sal_uInt16		nSlotId = rReq.GetSlot();
93*cdf0e10cSrcweir 	sal_Bool		bChanged = pSdrView->GetModel()->IsChanged();
94*cdf0e10cSrcweir 	pSdrView->GetModel()->SetChanged(sal_False);
95*cdf0e10cSrcweir 	const SfxPoolItem* pItem;
96*cdf0e10cSrcweir 	if(pArgs)
97*cdf0e10cSrcweir 		pArgs->GetItemState(nSlotId, sal_False, &pItem);
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir 	switch (nSlotId)
100*cdf0e10cSrcweir 	{
101*cdf0e10cSrcweir 		case SID_DELETE:
102*cdf0e10cSrcweir 		case FN_BACKSPACE:
103*cdf0e10cSrcweir 			if (pSh->IsObjSelected())
104*cdf0e10cSrcweir 			{
105*cdf0e10cSrcweir 				if (pSdrView->HasMarkedPoints())
106*cdf0e10cSrcweir 					pSh->GetView().GetViewFrame()->GetDispatcher()->Execute(SID_BEZIER_DELETE, sal_False);
107*cdf0e10cSrcweir 				else
108*cdf0e10cSrcweir 				{
109*cdf0e10cSrcweir 					pSh->DelSelectedObj();
110*cdf0e10cSrcweir 					if (pSh->IsSelFrmMode())
111*cdf0e10cSrcweir 					{
112*cdf0e10cSrcweir 						pSh->LeaveSelFrmMode();
113*cdf0e10cSrcweir 						pSh->NoEdit();
114*cdf0e10cSrcweir 					}
115*cdf0e10cSrcweir 					GetView().AttrChangedNotify(pSh); // ggf Shellwechsel...
116*cdf0e10cSrcweir 				}
117*cdf0e10cSrcweir 			}
118*cdf0e10cSrcweir 			break;
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir 		case FN_ESCAPE:
121*cdf0e10cSrcweir 			if (pSdrView->HasMarkedPoints())
122*cdf0e10cSrcweir 				pSdrView->UnmarkAllPoints();
123*cdf0e10cSrcweir 			else
124*cdf0e10cSrcweir 			{
125*cdf0e10cSrcweir 				if ( pSh->IsDrawCreate() )
126*cdf0e10cSrcweir 				{
127*cdf0e10cSrcweir 					GetView().GetDrawFuncPtr()->BreakCreate();
128*cdf0e10cSrcweir 					GetView().AttrChangedNotify(pSh); // ggf Shellwechsel...
129*cdf0e10cSrcweir 				}
130*cdf0e10cSrcweir 				else if ( pSh->HasSelection() || GetView().IsDrawMode() )
131*cdf0e10cSrcweir 				{
132*cdf0e10cSrcweir 					GetView().LeaveDrawCreate();
133*cdf0e10cSrcweir 					pSh->EnterStdMode();
134*cdf0e10cSrcweir 					GetView().AttrChangedNotify(pSh); // ggf Shellwechsel...
135*cdf0e10cSrcweir 				}
136*cdf0e10cSrcweir 			}
137*cdf0e10cSrcweir 			break;
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir 		case SID_BEZIER_MOVE:
140*cdf0e10cSrcweir 		case SID_BEZIER_INSERT:
141*cdf0e10cSrcweir 			{
142*cdf0e10cSrcweir 				GetView().GetEditWin().SetBezierMode(nSlotId);
143*cdf0e10cSrcweir 				static sal_uInt16 __READONLY_DATA aInva[] =
144*cdf0e10cSrcweir 								{
145*cdf0e10cSrcweir 									SID_BEZIER_INSERT,
146*cdf0e10cSrcweir 									SID_BEZIER_MOVE,
147*cdf0e10cSrcweir 									0
148*cdf0e10cSrcweir 								};
149*cdf0e10cSrcweir 				GetView().GetViewFrame()->GetBindings().Invalidate(aInva);
150*cdf0e10cSrcweir 			}
151*cdf0e10cSrcweir 			break;
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir 		case SID_BEZIER_DELETE:
154*cdf0e10cSrcweir 		case SID_BEZIER_CUTLINE:
155*cdf0e10cSrcweir 		case SID_BEZIER_CONVERT:
156*cdf0e10cSrcweir 		case SID_BEZIER_EDGE:
157*cdf0e10cSrcweir 		case SID_BEZIER_SMOOTH:
158*cdf0e10cSrcweir 		case SID_BEZIER_SYMMTR:
159*cdf0e10cSrcweir 		case SID_BEZIER_CLOSE:
160*cdf0e10cSrcweir 		case SID_BEZIER_ELIMINATE_POINTS:
161*cdf0e10cSrcweir 		{
162*cdf0e10cSrcweir 			const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList();
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir 			if (rMarkList.GetMark(0) && !pSdrView->IsAction())
165*cdf0e10cSrcweir 			{
166*cdf0e10cSrcweir 				switch (nSlotId)
167*cdf0e10cSrcweir 				{
168*cdf0e10cSrcweir 					case SID_BEZIER_DELETE:
169*cdf0e10cSrcweir 						pSdrView->DeleteMarkedPoints();
170*cdf0e10cSrcweir 						break;
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir 					case SID_BEZIER_CUTLINE:
173*cdf0e10cSrcweir 						{
174*cdf0e10cSrcweir 							pSdrView->RipUpAtMarkedPoints();
175*cdf0e10cSrcweir 							pSh->CheckUnboundObjects();
176*cdf0e10cSrcweir 						}
177*cdf0e10cSrcweir 						break;
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir 					case SID_BEZIER_CONVERT:
180*cdf0e10cSrcweir 					{
181*cdf0e10cSrcweir 						pSdrView->SetMarkedSegmentsKind(SDRPATHSEGMENT_TOGGLE);
182*cdf0e10cSrcweir 						break;
183*cdf0e10cSrcweir 					}
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir 					case SID_BEZIER_EDGE:
186*cdf0e10cSrcweir 					case SID_BEZIER_SMOOTH:
187*cdf0e10cSrcweir 					case SID_BEZIER_SYMMTR:
188*cdf0e10cSrcweir 					{
189*cdf0e10cSrcweir                         SdrPathSmoothKind eKind = SDRPATHSMOOTH_ASYMMETRIC;
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir 						switch (nSlotId)
192*cdf0e10cSrcweir 						{
193*cdf0e10cSrcweir 							case SID_BEZIER_EDGE:   eKind = SDRPATHSMOOTH_ANGULAR; break;
194*cdf0e10cSrcweir 							case SID_BEZIER_SMOOTH: eKind = SDRPATHSMOOTH_ASYMMETRIC; break;
195*cdf0e10cSrcweir 							case SID_BEZIER_SYMMTR: eKind = SDRPATHSMOOTH_SYMMETRIC; break;
196*cdf0e10cSrcweir 						}
197*cdf0e10cSrcweir 
198*cdf0e10cSrcweir 						SdrPathSmoothKind eSmooth = pSdrView->GetMarkedPointsSmooth();
199*cdf0e10cSrcweir 						if (eKind != eSmooth)
200*cdf0e10cSrcweir 						{
201*cdf0e10cSrcweir 							pSdrView->SetMarkedPointsSmooth(eKind);
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir 							static sal_uInt16 __READONLY_DATA aInva[] =
204*cdf0e10cSrcweir 											{
205*cdf0e10cSrcweir 												SID_BEZIER_SMOOTH,
206*cdf0e10cSrcweir 												SID_BEZIER_EDGE,
207*cdf0e10cSrcweir 												SID_BEZIER_SYMMTR,
208*cdf0e10cSrcweir 												0
209*cdf0e10cSrcweir 											};
210*cdf0e10cSrcweir 							GetView().GetViewFrame()->GetBindings().Invalidate(aInva);
211*cdf0e10cSrcweir 						}
212*cdf0e10cSrcweir 						break;
213*cdf0e10cSrcweir 					}
214*cdf0e10cSrcweir 
215*cdf0e10cSrcweir 					case SID_BEZIER_CLOSE:
216*cdf0e10cSrcweir 					{
217*cdf0e10cSrcweir 						SdrPathObj* pPathObj = (SdrPathObj*) rMarkList.GetMark(0)->GetMarkedSdrObj();
218*cdf0e10cSrcweir 						pSdrView->UnmarkAllPoints();
219*cdf0e10cSrcweir 						// Size aDist(GetView().GetEditWin().PixelToLogic(Size(8,8)));
220*cdf0e10cSrcweir 						pPathObj->ToggleClosed(); // aDist.Width());
221*cdf0e10cSrcweir 						break;
222*cdf0e10cSrcweir 					}
223*cdf0e10cSrcweir 
224*cdf0e10cSrcweir 					case SID_BEZIER_ELIMINATE_POINTS:
225*cdf0e10cSrcweir 						pSdrView->SetEliminatePolyPoints(!pSdrView->IsEliminatePolyPoints());
226*cdf0e10cSrcweir 						break;
227*cdf0e10cSrcweir 				}
228*cdf0e10cSrcweir 			}
229*cdf0e10cSrcweir 		}
230*cdf0e10cSrcweir 		break;
231*cdf0e10cSrcweir 
232*cdf0e10cSrcweir 		default:
233*cdf0e10cSrcweir 			break;
234*cdf0e10cSrcweir 	}
235*cdf0e10cSrcweir 
236*cdf0e10cSrcweir 	if (pSdrView->GetModel()->IsChanged())
237*cdf0e10cSrcweir 		GetShell().SetModified();
238*cdf0e10cSrcweir 	else if (bChanged)
239*cdf0e10cSrcweir 		pSdrView->GetModel()->SetChanged(sal_True);
240*cdf0e10cSrcweir }
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir /*--------------------------------------------------------------------
243*cdf0e10cSrcweir 	Beschreibung:
244*cdf0e10cSrcweir  --------------------------------------------------------------------*/
245*cdf0e10cSrcweir 
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir void SwBezierShell::GetState(SfxItemSet &rSet)
248*cdf0e10cSrcweir {
249*cdf0e10cSrcweir 	SdrView* pSdrView = GetShell().GetDrawView();
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir 	SfxWhichIter aIter( rSet );
252*cdf0e10cSrcweir 	sal_uInt16 nWhich = aIter.FirstWhich();
253*cdf0e10cSrcweir 
254*cdf0e10cSrcweir 	while( nWhich )
255*cdf0e10cSrcweir 	{
256*cdf0e10cSrcweir 		switch( nWhich )
257*cdf0e10cSrcweir 		{
258*cdf0e10cSrcweir 			case SID_BEZIER_MOVE:
259*cdf0e10cSrcweir 			case SID_BEZIER_INSERT:
260*cdf0e10cSrcweir 			{
261*cdf0e10cSrcweir 				sal_uInt16 nEditMode = GetView().GetEditWin().GetBezierMode();
262*cdf0e10cSrcweir 
263*cdf0e10cSrcweir 				rSet.Put(SfxBoolItem(nWhich, nEditMode == nWhich));
264*cdf0e10cSrcweir 			}
265*cdf0e10cSrcweir 			break;
266*cdf0e10cSrcweir 
267*cdf0e10cSrcweir 			case SID_BEZIER_CUTLINE:
268*cdf0e10cSrcweir 				if (!pSdrView->IsRipUpAtMarkedPointsPossible())
269*cdf0e10cSrcweir 				{
270*cdf0e10cSrcweir 					rSet.DisableItem(SID_BEZIER_CUTLINE);
271*cdf0e10cSrcweir 				}
272*cdf0e10cSrcweir 				break;
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir 			case SID_BEZIER_DELETE:
275*cdf0e10cSrcweir 				if (!pSdrView->IsDeleteMarkedPointsPossible())
276*cdf0e10cSrcweir 				{
277*cdf0e10cSrcweir 					rSet.DisableItem(SID_BEZIER_DELETE);
278*cdf0e10cSrcweir 				}
279*cdf0e10cSrcweir 				break;
280*cdf0e10cSrcweir 
281*cdf0e10cSrcweir 			case SID_BEZIER_CONVERT:
282*cdf0e10cSrcweir 				if (!pSdrView->IsSetMarkedSegmentsKindPossible())
283*cdf0e10cSrcweir 				{
284*cdf0e10cSrcweir 					rSet.DisableItem(SID_BEZIER_CONVERT);
285*cdf0e10cSrcweir 				}
286*cdf0e10cSrcweir 				else
287*cdf0e10cSrcweir 				{
288*cdf0e10cSrcweir 					SdrPathSegmentKind eSegm = pSdrView->GetMarkedSegmentsKind();
289*cdf0e10cSrcweir 					switch (eSegm)
290*cdf0e10cSrcweir 					{
291*cdf0e10cSrcweir 						case SDRPATHSEGMENT_DONTCARE: rSet.InvalidateItem(SID_BEZIER_CONVERT); break;
292*cdf0e10cSrcweir 						case SDRPATHSEGMENT_LINE    : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,sal_False)); break; // Button reingedrueckt = Kurve
293*cdf0e10cSrcweir 						case SDRPATHSEGMENT_CURVE   : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,sal_True));  break;
294*cdf0e10cSrcweir                         default:; //prevent warning
295*cdf0e10cSrcweir 					}
296*cdf0e10cSrcweir 				}
297*cdf0e10cSrcweir 				break;
298*cdf0e10cSrcweir 
299*cdf0e10cSrcweir 			case SID_BEZIER_EDGE:
300*cdf0e10cSrcweir 			case SID_BEZIER_SMOOTH:
301*cdf0e10cSrcweir 			case SID_BEZIER_SYMMTR:
302*cdf0e10cSrcweir 				if (!pSdrView->IsSetMarkedPointsSmoothPossible())
303*cdf0e10cSrcweir 					rSet.DisableItem(nWhich);
304*cdf0e10cSrcweir 				else
305*cdf0e10cSrcweir 				{
306*cdf0e10cSrcweir 					SdrPathSmoothKind eSmooth = pSdrView->GetMarkedPointsSmooth();
307*cdf0e10cSrcweir 					sal_Bool bEnable = sal_False;
308*cdf0e10cSrcweir 					switch (eSmooth)
309*cdf0e10cSrcweir 					{
310*cdf0e10cSrcweir 						case SDRPATHSMOOTH_DONTCARE  :
311*cdf0e10cSrcweir 							break;
312*cdf0e10cSrcweir 						case SDRPATHSMOOTH_ANGULAR   :
313*cdf0e10cSrcweir 							bEnable = nWhich == SID_BEZIER_EDGE;
314*cdf0e10cSrcweir 							break;
315*cdf0e10cSrcweir 						case SDRPATHSMOOTH_ASYMMETRIC:
316*cdf0e10cSrcweir 							bEnable = nWhich == SID_BEZIER_SMOOTH;
317*cdf0e10cSrcweir 							break;
318*cdf0e10cSrcweir 						case SDRPATHSMOOTH_SYMMETRIC :
319*cdf0e10cSrcweir 							bEnable = nWhich == SID_BEZIER_SYMMTR;
320*cdf0e10cSrcweir 							break;
321*cdf0e10cSrcweir 					}
322*cdf0e10cSrcweir 					rSet.Put(SfxBoolItem(nWhich, bEnable));
323*cdf0e10cSrcweir 				}
324*cdf0e10cSrcweir 				break;
325*cdf0e10cSrcweir 
326*cdf0e10cSrcweir 			case SID_BEZIER_CLOSE:
327*cdf0e10cSrcweir 				if (!pSdrView->IsOpenCloseMarkedObjectsPossible())
328*cdf0e10cSrcweir 				{
329*cdf0e10cSrcweir 					rSet.DisableItem(SID_BEZIER_CLOSE);
330*cdf0e10cSrcweir 				}
331*cdf0e10cSrcweir 				else
332*cdf0e10cSrcweir 				{
333*cdf0e10cSrcweir 					SdrObjClosedKind eClose = pSdrView->GetMarkedObjectsClosedState();
334*cdf0e10cSrcweir 					switch (eClose)
335*cdf0e10cSrcweir 					{
336*cdf0e10cSrcweir 						case SDROBJCLOSED_DONTCARE: rSet.InvalidateItem(SID_BEZIER_CLOSE); break;
337*cdf0e10cSrcweir 						case SDROBJCLOSED_OPEN    : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,sal_False)); break;
338*cdf0e10cSrcweir 						case SDROBJCLOSED_CLOSED  : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,sal_True)); break;
339*cdf0e10cSrcweir                         default:; //prevent warning
340*cdf0e10cSrcweir 					}
341*cdf0e10cSrcweir 				}
342*cdf0e10cSrcweir 				break;
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir 			case SID_BEZIER_ELIMINATE_POINTS:
345*cdf0e10cSrcweir 				rSet.Put(SfxBoolItem(SID_BEZIER_ELIMINATE_POINTS, pSdrView->IsEliminatePolyPoints()));
346*cdf0e10cSrcweir 				break;
347*cdf0e10cSrcweir 
348*cdf0e10cSrcweir 			default:
349*cdf0e10cSrcweir 				break;
350*cdf0e10cSrcweir 		}
351*cdf0e10cSrcweir 		nWhich = aIter.NextWhich();
352*cdf0e10cSrcweir 	}
353*cdf0e10cSrcweir }
354*cdf0e10cSrcweir 
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir 
357