xref: /trunk/main/sc/source/ui/miscdlgs/acredlin.cxx (revision b3f79822)
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_sc.hxx"
26 
27 // System - Includes ---------------------------------------------------------
28 
29 
30 
31 #include <svl/undo.hxx>
32 #include <unotools/textsearch.hxx>
33 #include <unotools/localedatawrapper.hxx>
34 #include <unotools/collatorwrapper.hxx>
35 #include <vcl/msgbox.hxx>
36 #include <sfx2/app.hxx>
37 #include <sfx2/viewfrm.hxx>
38 
39 // INCLUDE -------------------------------------------------------------------
40 
41 #include "acredlin.hxx"
42 #include "global.hxx"
43 #include "reffact.hxx"
44 #include "document.hxx"
45 #include "docsh.hxx"
46 #include "scresid.hxx"
47 #include "globstr.hrc"
48 #include "acredlin.hrc"
49 #include "simpref.hxx"
50 #include "scmod.hxx"
51 #include "popmenu.hxx"
52 #include "tabvwsh.hxx"
53 
54 // defines -------------------------------------------------------------------
55 
56 #define ABS_SREF		  SCA_VALID \
57 						| SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE
58 #define ABS_DREF		  ABS_SREF \
59 						| SCA_COL2_ABSOLUTE | SCA_ROW2_ABSOLUTE | SCA_TAB2_ABSOLUTE
60 #define ABS_SREF3D		ABS_SREF | SCA_TAB_3D
61 #define ABS_DREF3D		ABS_DREF | SCA_TAB_3D
62 
63 
64 
65 #define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute();
66 
EnableDisable(Window & rWin,sal_Bool bEnable)67 inline void EnableDisable( Window& rWin, sal_Bool bEnable )
68 {
69 	if (bEnable)
70 		rWin.Enable();
71 	else
72 		rWin.Disable();
73 }
74 
75 #define	RD_SPECIAL_NONE			0
76 #define	RD_SPECIAL_CONTENT		1
77 #define	RD_SPECIAL_VISCONTENT	2
78 
79 //============================================================================
80 //	class ScRedlinData
81 //----------------------------------------------------------------------------
82 
ScRedlinData()83 ScRedlinData::ScRedlinData()
84 	:RedlinData()
85 {
86 	nInfo=RD_SPECIAL_NONE;
87 	nActionNo=0;
88 	pData=NULL;
89 	bDisabled=sal_False;
90 	bIsRejectable=sal_False;
91 	bIsAcceptable=sal_False;
92 	nTable=SCTAB_MAX;
93 	nCol=SCCOL_MAX;
94 	nRow=SCROW_MAX;
95 }
96 
~ScRedlinData()97 ScRedlinData::~ScRedlinData()
98 {
99 	nInfo=RD_SPECIAL_NONE;
100 	nActionNo=0;
101 	pData=NULL;
102 	bDisabled=sal_False;
103 	bIsRejectable=sal_False;
104 	bIsAcceptable=sal_False;
105 }
106 
107 
108 //============================================================================
109 //	class ScAcceptChgDlg
110 //----------------------------------------------------------------------------
ScAcceptChgDlg(SfxBindings * pB,SfxChildWindow * pCW,Window * pParent,ScViewData * ptrViewData)111 ScAcceptChgDlg::ScAcceptChgDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
112 					  ScViewData*		ptrViewData)
113 
114 	:	SfxModelessDialog( pB, pCW, pParent, ScResId(RID_SCDLG_CHANGES) ),
115 		//
116 		aAcceptChgCtr			( this, ScResId( CTR_REDLINING ) ),
117 		//
118 		pViewData		( ptrViewData ),
119 		pDoc			( ptrViewData->GetDocument() ),
120 		aLocalRangeName ( *(pDoc->GetRangeName()) ),
121 		//
122 		aStrInsertCols			( ScResId( STR_INSERT_COLS)),
123 		aStrInsertRows			( ScResId( STR_INSERT_ROWS)),
124 		aStrInsertTabs			( ScResId( STR_INSERT_TABS)),
125 		aStrDeleteCols			( ScResId( STR_DELETE_COLS)),
126 		aStrDeleteRows			( ScResId( STR_DELETE_ROWS)),
127 		aStrDeleteTabs			( ScResId( STR_DELETE_TABS)),
128 		aStrMove				( ScResId( STR_MOVE	    )),
129 		aStrContent				( ScResId( STR_CONTENT	)),
130 		aStrReject				( ScResId( STR_REJECT	    )),
131 		aStrAllAccepted			( ScResId( STR_ACCEPTED	)),
132 		aStrAllRejected			( ScResId( STR_REJECTED	)),
133 		aStrNoEntry				( ScResId( STR_NO_ENTRY   )),
134 		aStrContentWithChild	( ScResId( STR_CONTENT_WITH_CHILD)),
135 		aStrChildContent		( ScResId( STR_CHILD_CONTENT)),
136 		aStrChildOrgContent		( ScResId( STR_CHILD_ORGCONTENT)),
137 		aStrEmpty				( ScResId( STR_EMPTY		))
138 {
139 	FreeResource();
140 //	bScAcceptChgDlgIsDead=sal_False;
141 	bNoSelection=sal_False;
142 	bNeedsUpdate=sal_False;
143 	bIgnoreMsg=sal_False;
144 	nAcceptCount=0;
145 	nRejectCount=0;
146 	bAcceptEnableFlag=sal_True;
147 	bRejectEnableFlag=sal_True;
148 	bHasFilterEntry=sal_False;
149 	bUseColor=sal_False;
150 	aReOpenTimer.SetTimeout(50);
151 	aReOpenTimer.SetTimeoutHdl(LINK( this, ScAcceptChgDlg, ReOpenTimerHdl ));
152 
153 	//	dialog is now only hidden, not deleted, on switching views,
154 	//	so there's no need to restore settings when reopening
155 
156 	MinSize=aAcceptChgCtr.GetMinSizePixel();
157 	MinSize.Height()+=2;
158 	MinSize.Width()+=2;
159 	SetMinOutputSizePixel(MinSize);
160 	aUnknown.AssignAscii(RTL_CONSTASCII_STRINGPARAM("Unknown"));
161 
162 	pTPFilter=aAcceptChgCtr.GetFilterPage();
163 	pTPView=aAcceptChgCtr.GetViewPage();
164 	pTheView=pTPView->GetTableControl();
165 	aSelectionTimer.SetTimeout(100);
166 	aSelectionTimer.SetTimeoutHdl(LINK( this, ScAcceptChgDlg, UpdateSelectionHdl ));
167 
168 	pTPFilter->SetReadyHdl(LINK( this, ScAcceptChgDlg, FilterHandle ));
169 	pTPFilter->SetRefHdl(LINK( this, ScAcceptChgDlg, RefHandle ));
170 	pTPFilter->SetModifyHdl(LINK( this, ScAcceptChgDlg, FilterModified));
171 	pTPFilter->HideRange(sal_False);
172 	pTPView->InsertCalcHeader();
173 	pTPView->SetRejectClickHdl( LINK( this, ScAcceptChgDlg,RejectHandle));
174 	pTPView->SetAcceptClickHdl( LINK(this, ScAcceptChgDlg, AcceptHandle));
175 	pTPView->SetRejectAllClickHdl( LINK( this, ScAcceptChgDlg,RejectAllHandle));
176 	pTPView->SetAcceptAllClickHdl( LINK(this, ScAcceptChgDlg, AcceptAllHandle));
177 	pTheView->SetCalcView();
178 	pTheView->SetStyle(pTheView->GetStyle()|WB_HASLINES|WB_CLIPCHILDREN|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL);
179 	pTheView->SetExpandingHdl( LINK(this, ScAcceptChgDlg, ExpandingHandle));
180 	pTheView->SetSelectHdl( LINK(this, ScAcceptChgDlg, SelectHandle));
181 	pTheView->SetDeselectHdl( LINK(this, ScAcceptChgDlg, SelectHandle));
182 	pTheView->SetCommandHdl( LINK(this, ScAcceptChgDlg, CommandHdl));
183 	pTheView->SetColCompareHdl( LINK(this, ScAcceptChgDlg,ColCompareHdl));
184 	pTheView->SetSelectionMode(MULTIPLE_SELECTION);
185 	pTheView->SetHighlightRange(1);
186 
187 	Init();
188 
189 	aAcceptChgCtr.SetMinSizeHdl( LINK( this, ScAcceptChgDlg, MinSizeHandle ));
190 
191 	UpdateView();
192 	SvLBoxEntry* pEntry=pTheView->First();
193 	if(pEntry!=NULL)
194 	{
195 		pTheView->Select(pEntry);
196 	}
197 }
~ScAcceptChgDlg()198 ScAcceptChgDlg::~ScAcceptChgDlg()
199 {
200 //	bScAcceptChgDlgIsDead=sal_True;
201 	ClearView();
202 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
203 
204 	if(pChanges!=NULL)
205 	{
206 		Link aLink;
207 		pChanges->SetModifiedLink(aLink);
208 	}
209 }
210 
ReInit(ScViewData * ptrViewData)211 void ScAcceptChgDlg::ReInit(ScViewData* ptrViewData)
212 {
213 	pViewData=ptrViewData;
214 	if(pViewData!=NULL)
215 	{
216 		pDoc=ptrViewData->GetDocument();
217 	}
218 	else
219 	{
220 		pDoc=NULL;
221 	}
222 
223 	bNoSelection=sal_False;
224 	bNeedsUpdate=sal_False;
225 	bIgnoreMsg=sal_False;
226 	nAcceptCount=0;
227 	nRejectCount=0;
228 	bAcceptEnableFlag=sal_True;
229 	bRejectEnableFlag=sal_True;
230 
231 	//	#91781# don't call Init here (switching between views), just set link below
232 	//	(dialog is just hidden, not deleted anymore, when switching views)
233 	ClearView();
234 	UpdateView();
235 
236 	if ( pDoc )
237 	{
238 		ScChangeTrack* pChanges = pDoc->GetChangeTrack();
239 		if ( pChanges )
240 			pChanges->SetModifiedLink( LINK( this, ScAcceptChgDlg, ChgTrackModHdl ) );
241 	}
242 }
243 
Init()244 void __EXPORT ScAcceptChgDlg::Init()
245 {
246 	String	aAreaStr;
247 	ScRange aRange;
248 
249 	DBG_ASSERT( pViewData && pDoc, "ViewData oder Document nicht gefunden!" );
250 
251 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
252 
253 	if(pChanges!=NULL)
254 	{
255 		pChanges->SetModifiedLink( LINK( this, ScAcceptChgDlg,ChgTrackModHdl));
256 		aChangeViewSet.SetTheAuthorToShow(pChanges->GetUser());
257 		pTPFilter->ClearAuthors();
258 		ScStrCollection aUserColl=pChanges->GetUserCollection();
259 		for(sal_uInt16	i=0;i<aUserColl.GetCount();i++)
260 			pTPFilter->InsertAuthor(aUserColl[i]->GetString());
261 	}
262 
263 	ScChangeViewSettings* pViewSettings=pDoc->GetChangeViewSettings();
264 	if ( pViewSettings!=NULL )
265 		aChangeViewSet = *pViewSettings;
266     // adjust TimeField for filter tabpage
267     aChangeViewSet.AdjustDateMode( *pDoc );
268 
269 	pTPFilter->CheckDate(aChangeViewSet.HasDate());
270 	pTPFilter->SetFirstDate(aChangeViewSet.GetTheFirstDateTime());
271 	pTPFilter->SetFirstTime(aChangeViewSet.GetTheFirstDateTime());
272 	pTPFilter->SetLastDate(aChangeViewSet.GetTheLastDateTime());
273 	pTPFilter->SetLastTime(aChangeViewSet.GetTheLastDateTime());
274 	pTPFilter->SetDateMode((sal_uInt16)aChangeViewSet.GetTheDateMode());
275 	pTPFilter->CheckComment(aChangeViewSet.HasComment());
276 	pTPFilter->SetComment(aChangeViewSet.GetTheComment());
277 
278 	pTPFilter->CheckAuthor(aChangeViewSet.HasAuthor());
279 	String aString=aChangeViewSet.GetTheAuthorToShow();
280 	if(aString.Len()!=0)
281 	{
282 		pTPFilter->SelectAuthor(aString);
283 		if(pTPFilter->GetSelectedAuthor()!=aString)
284 		{
285 			pTPFilter->InsertAuthor(aString);
286 			pTPFilter->SelectAuthor(aString);
287 		}
288 	}
289 	else
290 	{
291 		pTPFilter->SelectedAuthorPos(0);
292 	}
293 
294 	pTPFilter->CheckRange(aChangeViewSet.HasRange());
295 
296 	ScRange* pRangeEntry=aChangeViewSet.GetTheRangeList().GetObject(0);
297 	aRangeList=aChangeViewSet.GetTheRangeList();
298 
299 	if(pRangeEntry!=NULL)
300 	{
301 		String aRefStr;
302 		pRangeEntry->Format( aRefStr, ABS_DREF3D, pDoc );
303 		pTPFilter->SetRange(aRefStr);
304 	}
305 
306 	Point aPoint(1,1);
307 	aAcceptChgCtr.SetPosPixel(aPoint);
308 	InitFilter();
309 }
310 
311 
312 
ClearView()313 void ScAcceptChgDlg::ClearView()
314 {
315 	nAcceptCount=0;
316 	nRejectCount=0;
317 	pTheView->SetUpdateMode(sal_False);
318 
319 	pTheView->Clear();
320 	pTheView->SetUpdateMode(sal_True);
321 }
322 
MakeTypeString(ScChangeActionType eType)323 String* ScAcceptChgDlg::MakeTypeString(ScChangeActionType eType)
324 {
325 	String* pStr;
326 
327 	switch(eType)
328 	{
329 
330 		case SC_CAT_INSERT_COLS:	pStr=&aStrInsertCols;break;
331 
332 		case SC_CAT_INSERT_ROWS:	pStr=&aStrInsertRows;break;
333 
334 		case SC_CAT_INSERT_TABS:	pStr=&aStrInsertTabs;break;
335 
336 		case SC_CAT_DELETE_COLS:	pStr=&aStrDeleteCols;break;
337 
338 		case SC_CAT_DELETE_ROWS:	pStr=&aStrDeleteRows;break;
339 
340 		case SC_CAT_DELETE_TABS:	pStr=&aStrDeleteTabs;break;
341 
342 		case SC_CAT_MOVE:			pStr=&aStrMove;break;
343 
344 		case SC_CAT_CONTENT:		pStr=&aStrContent;break;
345 
346 		case SC_CAT_REJECT:			pStr=&aStrReject;break;
347 
348 		default:					pStr=&aUnknown;break;
349 	}
350 	return pStr;
351 }
352 
353 
IsValidAction(const ScChangeAction * pScChangeAction)354 sal_Bool ScAcceptChgDlg::IsValidAction(const ScChangeAction* pScChangeAction)
355 {
356 	if(pScChangeAction==NULL) return sal_False;
357 
358 	sal_Bool bFlag=sal_False;
359 
360 	ScRange aRef=pScChangeAction->GetBigRange().MakeRange();
361 	String aUser=pScChangeAction->GetUser();
362 	DateTime aDateTime=pScChangeAction->GetDateTime();
363 
364 	ScChangeActionType eType=pScChangeAction->GetType();
365 	String aString;
366 	String aDesc;
367 
368 	String aComment=pScChangeAction->GetComment();
369 	aComment.EraseAllChars('\n');
370 
371 	if(eType==SC_CAT_CONTENT)
372 	{
373 		if(!pScChangeAction->IsDialogParent())
374 		{
375 			pScChangeAction->GetDescription( aDesc, pDoc, sal_True);
376 		}
377 	}
378 	else
379 	{
380 		pScChangeAction->GetDescription( aDesc, pDoc,!pScChangeAction->IsMasterDelete());
381 	}
382 
383 	if(aDesc.Len()>0)
384 	{
385 		aComment.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " (" ));
386 		aComment+=aDesc;
387 		aComment+=')';
388 	}
389 
390 	if(pTheView->IsValidEntry(&aUser,&aDateTime,&aComment))
391 	{
392 		if(pTPFilter->IsRange())
393 		{
394 			ScRange* pRangeEntry=aRangeList.First();
395 
396 			while(pRangeEntry!=NULL)
397 			{
398 				if(pRangeEntry->Intersects(aRef)) break;
399 				pRangeEntry=aRangeList.Next();
400 			}
401 
402 			if(pRangeEntry!=NULL)
403 			{
404 				bFlag=sal_True;
405 			}
406 		}
407 		else
408 		{
409 			bFlag=sal_True;
410 		}
411 	}
412 
413 	return bFlag;
414 }
415 
InsertChangeAction(const ScChangeAction * pScChangeAction,ScChangeActionState,SvLBoxEntry * pParent,sal_Bool bDelMaster,sal_Bool bDisabled,sal_uLong nPos)416 SvLBoxEntry* ScAcceptChgDlg::InsertChangeAction(const ScChangeAction* pScChangeAction,
417                                                    ScChangeActionState /* eState */, SvLBoxEntry* pParent,
418 												   sal_Bool bDelMaster,sal_Bool bDisabled,sal_uLong nPos)
419 {
420 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
421 
422 	if(pScChangeAction==NULL || pChanges==NULL) return NULL;
423 
424 	SvLBoxEntry* pEntry=NULL;
425 
426 	sal_Bool bFlag=sal_False;
427 
428 	ScRange aRef=pScChangeAction->GetBigRange().MakeRange();
429 	String aUser=pScChangeAction->GetUser();
430 	DateTime aDateTime=pScChangeAction->GetDateTime();
431 
432 	String aRefStr;
433 	ScChangeActionType eType=pScChangeAction->GetType();
434 	String aString;
435 	String aDesc;
436 
437 	ScRedlinData* pNewData=new ScRedlinData;
438 	pNewData->pData=(void *)pScChangeAction;
439 	pNewData->nActionNo=pScChangeAction->GetActionNumber();
440 	pNewData->bIsAcceptable=pScChangeAction->IsClickable();
441 	pNewData->bIsRejectable=pScChangeAction->IsRejectable();
442 	pNewData->bDisabled=!pNewData->bIsAcceptable | bDisabled;
443 	pNewData->aDateTime=aDateTime;
444 	pNewData->nRow	= aRef.aStart.Row();
445 	pNewData->nCol	= aRef.aStart.Col();
446 	pNewData->nTable= aRef.aStart.Tab();
447 
448 	if(eType==SC_CAT_CONTENT)
449 	{
450 		if(pScChangeAction->IsDialogParent())
451 		{
452 			aString=aStrContentWithChild;
453 			pNewData->nInfo=RD_SPECIAL_VISCONTENT;
454 			pNewData->bIsRejectable=sal_False;
455 			pNewData->bIsAcceptable=sal_False;
456 		}
457 		else
458 		{
459 			aString=*MakeTypeString(eType);
460 			pScChangeAction->GetDescription( aDesc, pDoc, sal_True);
461 		}
462 	}
463 	else
464 	{
465 		aString=*MakeTypeString(eType);
466 
467 		if(bDelMaster)
468 		{
469 			pScChangeAction->GetDescription( aDesc, pDoc,sal_True);
470 			pNewData->bDisabled=sal_True;
471 			pNewData->bIsRejectable=sal_False;
472 		}
473 		else
474 			pScChangeAction->GetDescription( aDesc, pDoc,!pScChangeAction->IsMasterDelete());
475 
476 	}
477 
478 	aString+='\t';
479 	pScChangeAction->GetRefString(aRefStr, pDoc, sal_True);
480 	aString+=aRefStr;
481 	aString+='\t';
482 
483 	sal_Bool bIsGenerated;
484 
485 	if(!pChanges->IsGenerated(pScChangeAction->GetActionNumber()))
486 	{
487 		aString+=aUser;
488 		aString+='\t';
489 
490         aString+=ScGlobal::pLocaleData->getDate(aDateTime);
491 		aString+=' ';
492         aString+=ScGlobal::pLocaleData->getTime(aDateTime);
493 		aString+='\t';
494 		bIsGenerated=sal_False;
495 	}
496 	else
497 	{
498 		aString+='\t';
499 		aString+='\t';
500 		bIsGenerated=sal_True;
501 	}
502 
503 	String aComment=pScChangeAction->GetComment();
504 	aComment.EraseAllChars('\n');
505 	if(aDesc.Len()>0)
506 	{
507 		aComment.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " (" ));
508 		aComment+=aDesc;
509 		aComment+=')';
510 	}
511 
512 	aString+=aComment;
513 
514 	if(pTheView->IsValidEntry(&aUser,&aDateTime)|| bIsGenerated)
515 	{
516 		if(pTheView->IsValidComment(&aComment))
517 		{
518 			if(pTPFilter->IsRange())
519 			{
520 				ScRange* pRangeEntry=aRangeList.First();
521 
522 				while(pRangeEntry!=NULL)
523 				{
524 					if(pRangeEntry->Intersects(aRef)) break;
525 					pRangeEntry=aRangeList.Next();
526 				}
527 				//SC_CAS_VIRGIN,SC_CAS_ACCEPTED,SC_CAS_REJECTED
528 				if(pRangeEntry!=NULL)
529 				{
530 					bHasFilterEntry=sal_True;
531 					bFlag=sal_True;
532 				}
533 			}
534 			else if(!bIsGenerated)
535 			{
536 				bHasFilterEntry=sal_True;
537 				bFlag=sal_True;
538 			}
539 		}
540 	}
541 
542 	if(!bFlag&& bUseColor&& pParent==NULL)
543 	{
544 		pEntry=pTheView->InsertEntry(aString,pNewData,Color(COL_LIGHTBLUE),pParent,nPos);
545 	}
546 	else if(bFlag&& bUseColor&& pParent!=NULL)
547 	{
548 		pEntry=pTheView->InsertEntry(aString,pNewData,Color(COL_GREEN),pParent,nPos);
549 		SvLBoxEntry* pExpEntry=pParent;
550 
551 		while(pExpEntry!=NULL && !pTheView->IsExpanded(pExpEntry))
552 		{
553 			SvLBoxEntry* pTmpEntry=pTheView->GetParent(pExpEntry);
554 
555 			if(pTmpEntry!=NULL) pTheView->Expand(pExpEntry);
556 
557 			pExpEntry=pTmpEntry;
558 		}
559 	}
560 	else
561 	{
562 		pEntry=pTheView->InsertEntry(aString,pNewData,pParent,nPos);
563 	}
564 	return pEntry;
565 }
566 
InsertFilteredAction(const ScChangeAction * pScChangeAction,ScChangeActionState eState,SvLBoxEntry * pParent,sal_Bool bDelMaster,sal_Bool bDisabled,sal_uLong nPos)567 SvLBoxEntry* ScAcceptChgDlg::InsertFilteredAction(const ScChangeAction* pScChangeAction,
568 												   ScChangeActionState eState,SvLBoxEntry* pParent,
569 												   sal_Bool bDelMaster,sal_Bool bDisabled,sal_uLong nPos)
570 {
571 
572 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
573 
574 	if(pScChangeAction==NULL || pChanges==NULL) return NULL;
575 
576 	sal_Bool bIsGenerated=pChanges->IsGenerated(pScChangeAction->GetActionNumber());
577 
578 	SvLBoxEntry* pEntry=NULL;
579 
580 	int bFlag=sal_False;
581 
582 	ScRange aRef=pScChangeAction->GetBigRange().MakeRange();
583 	String aUser=pScChangeAction->GetUser();
584 	DateTime aDateTime=pScChangeAction->GetDateTime();
585 
586 	if(pTheView->IsValidEntry(&aUser,&aDateTime)||bIsGenerated)
587 	{
588 		if(pTPFilter->IsRange())
589 		{
590 			ScRange* pRangeEntry=aRangeList.First();
591 
592 			while(pRangeEntry!=NULL)
593 			{
594 				if(pRangeEntry->Intersects(aRef)) break;
595 				pRangeEntry=aRangeList.Next();
596 			}
597 			//SC_CAS_VIRGIN,SC_CAS_ACCEPTED,SC_CAS_REJECTED
598 			if(pRangeEntry!=NULL &&
599 				pScChangeAction->GetState()==eState)
600 			{
601 				bFlag=sal_True;
602 			}
603 		}
604 		else if(pScChangeAction->GetState()==eState && !bIsGenerated)
605 		{
606 			bFlag=sal_True;
607 		}
608 	}
609 
610 	if(bFlag)
611 	{
612 
613 		String aRefStr;
614 		ScChangeActionType eType=pScChangeAction->GetType();
615 		String aString;
616 		String aDesc;
617 
618 
619 		ScRedlinData* pNewData=new ScRedlinData;
620 		pNewData->pData=(void *)pScChangeAction;
621 		pNewData->nActionNo=pScChangeAction->GetActionNumber();
622 		pNewData->bIsAcceptable=pScChangeAction->IsClickable();
623 		pNewData->bIsRejectable=pScChangeAction->IsRejectable();
624 		pNewData->bDisabled=!pNewData->bIsAcceptable | bDisabled;
625 		pNewData->aDateTime=aDateTime;
626 		pNewData->nRow	= aRef.aStart.Row();
627 		pNewData->nCol	= aRef.aStart.Col();
628 		pNewData->nTable= aRef.aStart.Tab();
629 
630 		if(eType==SC_CAT_CONTENT)
631 		{
632 			if(pScChangeAction->IsDialogParent())
633 			{
634 				aString=aStrContentWithChild;
635 				pNewData->nInfo=RD_SPECIAL_VISCONTENT;
636 				pNewData->bIsRejectable=sal_False;
637 				pNewData->bIsAcceptable=sal_False;
638 			}
639 			else
640 			{
641 				aString=*MakeTypeString(eType);
642 				pScChangeAction->GetDescription( aDesc, pDoc, sal_True);
643 			}
644 		}
645 		else
646 		{
647 			aString=*MakeTypeString(eType);
648 
649 			if(bDelMaster)
650 			{
651 				pScChangeAction->GetDescription( aDesc, pDoc,sal_True);
652 				pNewData->bDisabled=sal_True;
653 				pNewData->bIsRejectable=sal_False;
654 			}
655 			else
656 				pScChangeAction->GetDescription( aDesc, pDoc,!pScChangeAction->IsMasterDelete());
657 
658 		}
659 
660 		aString+='\t';
661 		pScChangeAction->GetRefString(aRefStr, pDoc, sal_True);
662 		aString+=aRefStr;
663 		aString+='\t';
664 
665 		if(!bIsGenerated)
666 		{
667 			aString+=aUser;
668 			aString+='\t';
669             aString+=ScGlobal::pLocaleData->getDate(aDateTime);
670 			aString+=' ';
671             aString+=ScGlobal::pLocaleData->getTime(aDateTime);
672 			aString+='\t';
673 		}
674 		else
675 		{
676 			aString+='\t';
677 			aString+='\t';
678 		}
679 
680 		String aComment=pScChangeAction->GetComment();
681 		aComment.EraseAllChars('\n');
682 		if(aDesc.Len()>0)
683 		{
684 			aComment.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " (" ));
685 			aComment+=aDesc;
686 			aComment+=')';
687 		}
688 		if(pTheView->IsValidComment(&aComment))
689 		{
690 			aString+=aComment;
691 			pEntry=pTheView->InsertEntry(aString,pNewData,pParent,nPos);
692 		}
693 		else
694 			delete pNewData;
695 	}
696 	return pEntry;
697 }
698 
InsertChangeActionContent(const ScChangeActionContent * pScChangeAction,SvLBoxEntry * pParent,sal_uLong nSpecial)699 SvLBoxEntry* ScAcceptChgDlg::InsertChangeActionContent(const ScChangeActionContent* pScChangeAction,
700 														  SvLBoxEntry* pParent, sal_uLong nSpecial)
701 {
702 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
703 	SvLBoxEntry* pEntry=NULL;
704 
705 	if(pScChangeAction==NULL || pChanges==NULL) return NULL;
706 
707 	sal_Bool bIsGenerated=pChanges->IsGenerated(pScChangeAction->GetActionNumber());
708 
709 	sal_Bool bFlag=sal_False;
710 
711 	ScRange aRef=pScChangeAction->GetBigRange().MakeRange();
712 	String aUser=pScChangeAction->GetUser();
713 	DateTime aDateTime=pScChangeAction->GetDateTime();
714 
715 	if(pTheView->IsValidEntry(&aUser,&aDateTime)||bIsGenerated)
716 	{
717 		if(pTPFilter->IsRange())
718 		{
719 			ScRange* pRangeEntry=aRangeList.First();
720 
721 			while(pRangeEntry!=NULL)
722 			{
723 				if(pRangeEntry->Intersects(aRef)) break;
724 				pRangeEntry=aRangeList.Next();
725 			}
726 			//SC_CAS_VIRGIN,SC_CAS_ACCEPTED,SC_CAS_REJECTED
727 			if(pRangeEntry!=NULL)
728 			{
729 				bFlag=sal_True;
730 			}
731 		}
732 		else if(!bIsGenerated)
733 			bFlag=sal_True;
734 	}
735 
736 	String aRefStr;
737 	String aString;
738 	String a2String;
739 	String aDesc;
740 
741 	if(nSpecial==RD_SPECIAL_CONTENT)
742 	{
743 		pScChangeAction->GetOldString(a2String);
744 		if(a2String.Len()==0) a2String=aStrEmpty;
745 
746 		//aString+="\'";
747 		aString+=a2String;
748 		//aString+="\'";
749 
750 		aDesc=aStrChildOrgContent;
751 		aDesc.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ": " ));
752 	}
753 	else
754 	{
755 		pScChangeAction->GetNewString(a2String);
756 		if(a2String.Len()==0)
757 		{
758 			a2String=aStrEmpty;
759 			aString+=a2String;
760 		}
761 		else
762 		{
763 			aString+='\'';
764 			aString+=a2String;
765 			aString+='\'';
766 			a2String=aString;
767 		}
768 		aDesc=aStrChildContent;
769 
770 	}
771 
772 	aDesc+=a2String;
773 	aString+='\t';
774 	pScChangeAction->GetRefString(aRefStr, pDoc, sal_True);
775 	aString+=aRefStr;
776 	aString+='\t';
777 
778 	if(!bIsGenerated)
779 	{
780 		aString+=aUser;
781 		aString+='\t';
782 
783         aString+=ScGlobal::pLocaleData->getDate(aDateTime);
784 		aString+=' ';
785         aString+=ScGlobal::pLocaleData->getTime(aDateTime);
786 		aString+='\t';
787 	}
788 	else
789 	{
790 		aString+='\t';
791 		aString+='\t';
792 	}
793 	String aComment=pScChangeAction->GetComment();
794 	aComment.EraseAllChars('\n');
795 
796 	if(aDesc.Len()>0)
797 	{
798 		aComment.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " (" ));
799 		aComment+=aDesc;
800 		aComment+=')';
801 	}
802 
803 	aString+=aComment;
804 
805 	ScRedlinData* pNewData=new ScRedlinData;
806 	pNewData->nInfo=nSpecial;
807 	pNewData->pData=(void *)pScChangeAction;
808 	pNewData->nActionNo=pScChangeAction->GetActionNumber();
809 	pNewData->bIsAcceptable=pScChangeAction->IsClickable();
810 	pNewData->bIsRejectable=sal_False;
811 	pNewData->bDisabled=!pNewData->bIsAcceptable;
812 	pNewData->aDateTime=aDateTime;
813 	pNewData->nRow	= aRef.aStart.Row();
814 	pNewData->nCol	= aRef.aStart.Col();
815 	pNewData->nTable= aRef.aStart.Tab();
816 
817 	if(pTheView->IsValidComment(&aComment) && bFlag)
818 	{
819 		bHasFilterEntry=sal_True;
820 		pEntry=pTheView->InsertEntry(aString,pNewData,pParent);
821 	}
822 	else
823 		pEntry=pTheView->InsertEntry(aString,pNewData,Color(COL_LIGHTBLUE),pParent);
824 	return pEntry;
825 }
826 
PreNotify(NotifyEvent & rNEvt)827 long ScAcceptChgDlg::PreNotify( NotifyEvent& rNEvt )
828 {
829 	if(rNEvt.GetType()==EVENT_GETFOCUS && bNeedsUpdate)
830 	{
831 		ClearView();
832 		UpdateView();
833 		bNoSelection=sal_False;
834 	}
835 
836 	return SfxModelessDialog::PreNotify(rNEvt);
837 }
838 
839 
UpdateView()840 void ScAcceptChgDlg::UpdateView()
841 {
842 	bNeedsUpdate=sal_False;
843 	DateTime aDateTime;
844 	SvLBoxEntry* pParent=NULL;
845 	ScChangeTrack* pChanges=NULL;
846 	const ScChangeAction* pScChangeAction=NULL;
847 	bAcceptEnableFlag=sal_True;
848 	bRejectEnableFlag=sal_True;
849 	SetPointer(Pointer(POINTER_WAIT));
850 	pTheView->SetUpdateMode(sal_False);
851 	sal_Bool bFilterFlag=pTPFilter->IsDate()||pTPFilter->IsRange()||
852 					 pTPFilter->IsAuthor()||pTPFilter->IsComment();
853 
854 	bUseColor=bFilterFlag;
855 
856 	if(pDoc!=NULL)
857 	{
858 		pChanges=pDoc->GetChangeTrack();
859 		if(pChanges!=NULL)
860 		{
861 			pScChangeAction=pChanges->GetFirst();
862 		}
863 	}
864 	ScChangeActionTable ActionTable;
865 	sal_Bool bTheFlag=sal_False;
866 
867 	while(pScChangeAction!=NULL)
868 	{
869 		bHasFilterEntry=sal_False;
870 		switch(pScChangeAction->GetState())
871 		{
872 			case SC_CAS_VIRGIN:
873 
874 				if(pScChangeAction->IsDialogRoot())
875 				{
876 					if(pScChangeAction->IsDialogParent())
877 						pParent=InsertChangeAction(pScChangeAction,SC_CAS_VIRGIN);
878 					else
879 						pParent=InsertFilteredAction(pScChangeAction,SC_CAS_VIRGIN);
880 				}
881 				else
882 					pParent=NULL;
883 
884 				bTheFlag=sal_True;
885 				break;
886 
887 			case SC_CAS_ACCEPTED:
888 				pParent=NULL;
889 				nAcceptCount++;
890 				break;
891 
892 			case SC_CAS_REJECTED:
893 				pParent=NULL;
894 				nRejectCount++;
895 				break;
896 		}
897 
898 		if(pParent!=NULL && pScChangeAction->IsDialogParent())
899 		{
900 			if(!bFilterFlag)
901 			{
902 				pParent->EnableChildsOnDemand(sal_True);
903 			}
904 			else
905 			{
906 				sal_Bool bTestFlag=bHasFilterEntry;
907 				bHasFilterEntry=sal_False;
908 				if(Expand(pChanges,pScChangeAction,pParent,!bTestFlag)&&!bTestFlag)
909                     pTheView->RemoveEntry(pParent);
910 			}
911 		}
912 
913 		pScChangeAction=pScChangeAction->GetNext();
914 	}
915 
916     if( bTheFlag && (!pDoc->IsDocEditable() || pChanges->IsProtected()) )
917 		bTheFlag=sal_False;
918 
919 	pTPView->EnableAccept(bTheFlag);
920 	pTPView->EnableAcceptAll(bTheFlag);
921 	pTPView->EnableReject(bTheFlag);
922 	pTPView->EnableRejectAll(bTheFlag);
923 
924 	if(nAcceptCount>0)
925 	{
926 		pParent=pTheView->InsertEntry(
927             aStrAllAccepted, static_cast< RedlinData * >(NULL),
928             static_cast< SvLBoxEntry * >(NULL));
929 		pParent->EnableChildsOnDemand(sal_True);
930 	}
931 	if(nRejectCount>0)
932 	{
933 		pParent=pTheView->InsertEntry(
934             aStrAllRejected, static_cast< RedlinData * >(NULL),
935             static_cast< SvLBoxEntry * >(NULL));
936 		pParent->EnableChildsOnDemand(sal_True);
937 	}
938 	pTheView->SetUpdateMode(sal_True);
939 	SetPointer(Pointer(POINTER_ARROW));
940 	SvLBoxEntry* pEntry=pTheView->First();
941 	if(pEntry!=NULL)
942 	{
943 		pTheView->Select(pEntry);
944 	}
945 }
946 
947 //----------------------------------------------------------------------------
Close()948 sal_Bool ScAcceptChgDlg::Close()
949 {
950 	return SfxModelessDialog::Close();
951 }
952 
Resize()953 void ScAcceptChgDlg::Resize()
954 {
955 	SfxModelessDialog::Resize();
956     Size aOutSize=GetOutputSizePixel();
957     aAcceptChgCtr.SetSizePixel(aOutSize);
958 }
959 
IMPL_LINK(ScAcceptChgDlg,MinSizeHandle,SvxAcceptChgCtr *,pCtr)960 IMPL_LINK( ScAcceptChgDlg, MinSizeHandle, SvxAcceptChgCtr*, pCtr )
961 {
962 	if(pCtr==&aAcceptChgCtr)
963 	{
964 		if(!IsRollUp())
965 			SetOutputSizePixel(MinSize);
966 	}
967 	return 0;
968 }
969 
IMPL_LINK(ScAcceptChgDlg,RefHandle,SvxTPFilter *,EMPTYARG)970 IMPL_LINK( ScAcceptChgDlg, RefHandle, SvxTPFilter*, EMPTYARG )
971 {
972 	sal_uInt16 nId  =ScSimpleRefDlgWrapper::GetChildWindowId();
973 
974 	ScSimpleRefDlgWrapper::SetDefaultPosSize(GetPosPixel(),GetSizePixel(),sal_True);
975 
976 	SC_MOD()->SetRefDialog( nId, sal_True );
977 
978 	SfxViewFrame* pViewFrm = pViewData->GetViewShell()->GetViewFrame();
979 	ScSimpleRefDlgWrapper* pWnd =(ScSimpleRefDlgWrapper*)pViewFrm->GetChildWindow( nId );
980 
981 	if(pWnd!=NULL)
982 	{
983 //		bSimpleRefDlgStarted=sal_True;
984 		sal_uInt16 nAcceptId=ScAcceptChgDlgWrapper::GetChildWindowId();
985 		pViewFrm->ShowChildWindow(nAcceptId,sal_False);
986 		pWnd->SetCloseHdl(LINK( this, ScAcceptChgDlg,RefInfoHandle));
987 		pWnd->SetRefString(pTPFilter->GetRange());
988 		pWnd->SetAutoReOpen(sal_False);
989 		Window* pWin=pWnd->GetWindow();
990 		pWin->SetPosSizePixel(GetPosPixel(),GetSizePixel());
991 		Hide();
992 		pWin->SetText(GetText());
993 		pWnd->StartRefInput();
994 	}
995 	return 0;
996 }
997 
IMPL_LINK(ScAcceptChgDlg,RefInfoHandle,String *,pResult)998 IMPL_LINK( ScAcceptChgDlg, RefInfoHandle, String*, pResult)
999 {
1000 	sal_uInt16 nId;
1001 
1002 //	bSimpleRefDlgStarted=sal_False;
1003 	ScSimpleRefDlgWrapper::SetAutoReOpen(sal_True);
1004 
1005 	SfxViewFrame* pViewFrm = pViewData->GetViewShell()->GetViewFrame();
1006 	if(pResult!=NULL)
1007 	{
1008 		pTPFilter->SetRange(*pResult);
1009 		FilterHandle(pTPFilter);
1010 
1011 		nId = ScSimpleRefDlgWrapper::GetChildWindowId();
1012 		ScSimpleRefDlgWrapper* pWnd = (ScSimpleRefDlgWrapper*)pViewFrm->GetChildWindow( nId );
1013 
1014 		if(pWnd!=NULL)
1015 		{
1016 			Window* pWin=pWnd->GetWindow();
1017             Size aWinSize=pWin->GetSizePixel();
1018             aWinSize.Width()=GetSizePixel().Width();
1019             SetPosSizePixel(pWin->GetPosPixel(),aWinSize);
1020 			Invalidate();
1021 		}
1022 		nId = ScAcceptChgDlgWrapper::GetChildWindowId();
1023 		pViewFrm->ShowChildWindow( nId, sal_True );
1024 	}
1025 	else
1026 	{
1027 		nId = ScAcceptChgDlgWrapper::GetChildWindowId();
1028 		pViewFrm->SetChildWindow( nId, sal_False );
1029 	}
1030 	return 0;
1031 }
1032 
IMPL_LINK(ScAcceptChgDlg,FilterHandle,SvxTPFilter *,pRef)1033 IMPL_LINK( ScAcceptChgDlg, FilterHandle, SvxTPFilter*, pRef )
1034 {
1035 	if(pRef!=NULL)
1036 	{
1037 		ClearView();
1038 		aRangeList.Clear();
1039 		aRangeList.Parse(pTPFilter->GetRange(),pDoc);
1040 		UpdateView();
1041 	}
1042 	return 0;
1043 }
1044 
IMPL_LINK(ScAcceptChgDlg,RejectHandle,SvxTPView *,pRef)1045 IMPL_LINK( ScAcceptChgDlg, RejectHandle, SvxTPView*, pRef )
1046 {
1047 	SetPointer(Pointer(POINTER_WAIT));
1048 
1049 	bIgnoreMsg=sal_True;
1050 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
1051 
1052 	if(pRef!=NULL)
1053 	{
1054 		SvLBoxEntry* pEntry=pTheView->FirstSelected();
1055 		while(pEntry!=NULL)
1056 		{
1057 			ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
1058 			if(pEntryData!=NULL)
1059 			{
1060 				ScChangeAction* pScChangeAction=
1061 						(ScChangeAction*) pEntryData->pData;
1062 
1063 				if(pScChangeAction->GetType()==SC_CAT_INSERT_TABS)
1064 				{
1065 					pViewData->SetTabNo(0);
1066 				}
1067 				pChanges->Reject(pScChangeAction);
1068 			}
1069 			pEntry = pTheView->NextSelected(pEntry);
1070 		}
1071 		ScDocShell* pDocSh=pViewData->GetDocShell();
1072 		pDocSh->PostPaintExtras();
1073 		pDocSh->PostPaintGridAll();
1074 		pDocSh->GetUndoManager()->Clear();
1075 		pDocSh->SetDocumentModified();
1076 		ClearView();
1077 		UpdateView();
1078 	}
1079 	SetPointer(Pointer(POINTER_ARROW));
1080 
1081 	bIgnoreMsg=sal_False;
1082 	return 0;
1083 }
IMPL_LINK(ScAcceptChgDlg,AcceptHandle,SvxTPView *,pRef)1084 IMPL_LINK( ScAcceptChgDlg, AcceptHandle, SvxTPView*, pRef )
1085 {
1086 	SetPointer(Pointer(POINTER_WAIT));
1087 
1088 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
1089 	bIgnoreMsg=sal_True;
1090 	if(pRef!=NULL)
1091 	{
1092 		SvLBoxEntry* pEntry=pTheView->FirstSelected();
1093 		while(pEntry!=NULL)
1094 		{
1095 			ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
1096 			if(pEntryData!=NULL)
1097 			{
1098 				ScChangeAction* pScChangeAction=
1099 						(ScChangeAction*) pEntryData->pData;
1100 				if(pScChangeAction->GetType()==SC_CAT_CONTENT)
1101 				{
1102 					if(pEntryData->nInfo==RD_SPECIAL_CONTENT)
1103 					{
1104 						pChanges->SelectContent(pScChangeAction,sal_True);
1105 					}
1106 					else
1107 					{
1108 						pChanges->SelectContent(pScChangeAction);
1109 					}
1110 				}
1111 				else
1112 					pChanges->Accept(pScChangeAction);
1113 			}
1114 			pEntry = pTheView->NextSelected(pEntry);
1115 		}
1116 		ScDocShell* pDocSh=pViewData->GetDocShell();
1117 		pDocSh->PostPaintExtras();
1118 		pDocSh->PostPaintGridAll();
1119 		pDocSh->SetDocumentModified();
1120 		ClearView();
1121 		UpdateView();
1122 	}
1123 	bIgnoreMsg=sal_False;
1124 
1125 	return 0;
1126 }
1127 
RejectFiltered()1128 void ScAcceptChgDlg::RejectFiltered()
1129 {
1130 	if(pDoc==NULL) return;
1131 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
1132 	const ScChangeAction* pScChangeAction=NULL;
1133 
1134 	if(pChanges!=NULL)
1135 	{
1136 		pScChangeAction=pChanges->GetLast();
1137 	}
1138 
1139 	while(pScChangeAction!=NULL)
1140 	{
1141 		if(pScChangeAction->IsDialogRoot())
1142 		{
1143 			if(IsValidAction(pScChangeAction))
1144 			{
1145 				pChanges->Reject((ScChangeAction*)pScChangeAction);
1146 			}
1147 		}
1148 		pScChangeAction=pScChangeAction->GetPrev();
1149 	}
1150 }
AcceptFiltered()1151 void ScAcceptChgDlg::AcceptFiltered()
1152 {
1153 	if(pDoc==NULL) return;
1154 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
1155 	const ScChangeAction* pScChangeAction=NULL;
1156 
1157 	if(pChanges!=NULL)
1158 	{
1159 		pScChangeAction=pChanges->GetLast();
1160 	}
1161 
1162 	while(pScChangeAction!=NULL)
1163 	{
1164 		if(pScChangeAction->IsDialogRoot())
1165 		{
1166 			if(IsValidAction(pScChangeAction))
1167 			{
1168 				pChanges->Accept((ScChangeAction*)pScChangeAction);
1169 			}
1170 		}
1171 		pScChangeAction=pScChangeAction->GetPrev();
1172 	}
1173 }
1174 
IMPL_LINK(ScAcceptChgDlg,RejectAllHandle,SvxTPView *,EMPTYARG)1175 IMPL_LINK( ScAcceptChgDlg, RejectAllHandle, SvxTPView*, EMPTYARG )
1176 {
1177 	SetPointer(Pointer(POINTER_WAIT));
1178 	bIgnoreMsg=sal_True;
1179 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
1180 	if(pChanges!=NULL)
1181 	{
1182 		if(pTPFilter->IsDate()||pTPFilter->IsAuthor()||pTPFilter->IsRange()||pTPFilter->IsComment())
1183 		{
1184 			RejectFiltered();
1185 		}
1186 		else
1187 		{
1188 			pChanges->RejectAll();
1189 		}
1190 		pViewData->SetTabNo(0);
1191 
1192 		ScDocShell* pDocSh=pViewData->GetDocShell();
1193 		pDocSh->PostPaintExtras();
1194 		pDocSh->PostPaintGridAll();
1195 		pDocSh->GetUndoManager()->Clear();
1196 		pDocSh->SetDocumentModified();
1197 		ClearView();
1198 		UpdateView();
1199 	}
1200 	SetPointer(Pointer(POINTER_ARROW));
1201 
1202 	bIgnoreMsg=sal_False;
1203 
1204 	return 0;
1205 }
1206 
IMPL_LINK(ScAcceptChgDlg,AcceptAllHandle,SvxTPView *,EMPTYARG)1207 IMPL_LINK( ScAcceptChgDlg, AcceptAllHandle, SvxTPView*, EMPTYARG )
1208 {
1209 	SetPointer(Pointer(POINTER_WAIT));
1210 
1211 	bIgnoreMsg=sal_True;
1212 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
1213 	if(pChanges!=NULL)
1214 	{
1215 		if(pTPFilter->IsDate()||pTPFilter->IsAuthor()||pTPFilter->IsRange()||pTPFilter->IsComment())
1216 		{
1217 			AcceptFiltered();
1218 		}
1219 		else
1220 		{
1221 			pChanges->AcceptAll();
1222 		}
1223 		ScDocShell* pDocSh=pViewData->GetDocShell();
1224 		pDocSh->PostPaintExtras();
1225 		pDocSh->PostPaintGridAll();
1226 		pDocSh->SetDocumentModified();
1227 		ClearView();
1228 		UpdateView();
1229 	}
1230 	bIgnoreMsg=sal_False;
1231 	SetPointer(Pointer(POINTER_ARROW));
1232 
1233 	return 0;
1234 }
1235 
IMPL_LINK(ScAcceptChgDlg,SelectHandle,SvxRedlinTable *,EMPTYARG)1236 IMPL_LINK( ScAcceptChgDlg, SelectHandle, SvxRedlinTable*, EMPTYARG )
1237 {
1238 	if(!bNoSelection)
1239 	{
1240 		aSelectionTimer.Start();
1241 	}
1242 	bNoSelection=sal_False;
1243 	return 0;
1244 }
1245 
GetDependents(const ScChangeAction * pScChangeAction,ScChangeActionTable & aActionTable,SvLBoxEntry * pEntry)1246 void ScAcceptChgDlg::GetDependents(  const ScChangeAction* pScChangeAction,
1247 									ScChangeActionTable& aActionTable,
1248 									SvLBoxEntry* pEntry)
1249 {
1250 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
1251 
1252 	SvLBoxEntry* pParent=pTheView->GetParent(pEntry);
1253 	if(pParent!=NULL)
1254 	{
1255 		ScRedlinData *pParentData=(ScRedlinData *)(pParent->GetUserData());
1256 		ScChangeAction* pParentAction=(ScChangeAction*) pParentData->pData;
1257 		if(pParentAction!=pScChangeAction)
1258 		{
1259 			pChanges->GetDependents((ScChangeAction*) pScChangeAction,
1260 						aActionTable,pScChangeAction->IsMasterDelete());
1261 		}
1262 		else
1263 		{
1264 			pChanges->GetDependents((ScChangeAction*) pScChangeAction,
1265 						aActionTable);
1266 		}
1267 	}
1268 	else
1269 	{
1270 		pChanges->GetDependents((ScChangeAction*) pScChangeAction,
1271 					aActionTable,pScChangeAction->IsMasterDelete());
1272 	}
1273 }
1274 
InsertContentChilds(ScChangeActionTable * pActionTable,SvLBoxEntry * pParent)1275 sal_Bool ScAcceptChgDlg::InsertContentChilds(ScChangeActionTable* pActionTable,SvLBoxEntry* pParent)
1276 {
1277 	sal_Bool bTheTestFlag=sal_True;
1278 	ScRedlinData *pEntryData=(ScRedlinData *)(pParent->GetUserData());
1279 	const ScChangeAction* pScChangeAction = (ScChangeAction*) pEntryData->pData;
1280 	sal_Bool bParentInserted = sal_False;
1281 	// If the parent is a MatrixOrigin then place it in the right order before
1282 	// the MatrixReferences. Also if it is the first content change at this
1283 	// position don't insert the first dependent MatrixReference as the special
1284 	// content (original value) but insert the predecessor of the MatrixOrigin
1285 	// itself instead.
1286 	if ( pScChangeAction->GetType() == SC_CAT_CONTENT &&
1287 			((const ScChangeActionContent*)pScChangeAction)->IsMatrixOrigin() )
1288 	{
1289 		pActionTable->Insert( pScChangeAction->GetActionNumber(),
1290 			(ScChangeAction*) pScChangeAction );
1291 		bParentInserted = sal_True;
1292 	}
1293 	SvLBoxEntry* pEntry=NULL;
1294 
1295 	const ScChangeActionContent* pCChild=(const ScChangeActionContent*)pActionTable->First();
1296 	while(pCChild!=NULL)
1297 	{
1298 		if( pCChild->GetState()==SC_CAS_VIRGIN )
1299 			break;
1300 		pCChild=(const ScChangeActionContent*)pActionTable->Next();
1301 	}
1302 
1303 	if(pCChild==NULL) return sal_True;
1304 
1305 	SvLBoxEntry* pOriginal=InsertChangeActionContent(pCChild,pParent,RD_SPECIAL_CONTENT);
1306 	if(pOriginal!=NULL)
1307 	{
1308 		bTheTestFlag=sal_False;
1309 		ScRedlinData *pParentData=(ScRedlinData *)(pOriginal->GetUserData());
1310 		pParentData->pData=(void *)pScChangeAction;
1311 		pParentData->nActionNo=pScChangeAction->GetActionNumber();
1312 		pParentData->bIsAcceptable=pScChangeAction->IsRejectable();	// select old value
1313 		pParentData->bIsRejectable=sal_False;
1314 		pParentData->bDisabled=sal_False;
1315 	}
1316 	while(pCChild!=NULL)
1317 	{
1318 		if(pCChild->GetState()==SC_CAS_VIRGIN)
1319 		{
1320 			pEntry=InsertChangeActionContent(pCChild,pParent,RD_SPECIAL_NONE);
1321 
1322 			if(pEntry!=NULL)
1323 				bTheTestFlag=sal_False;
1324 		}
1325 		pCChild=(const ScChangeActionContent*)pActionTable->Next();
1326 	}
1327 
1328 	if ( !bParentInserted )
1329 	{
1330 		pEntry=InsertChangeActionContent((const ScChangeActionContent*)
1331 								pScChangeAction,pParent,RD_SPECIAL_NONE);
1332 
1333 		if(pEntry!=NULL)
1334 		{
1335 			bTheTestFlag=sal_False;
1336 			ScRedlinData *pParentData=(ScRedlinData *)(pEntry->GetUserData());
1337 			pParentData->pData=(void *)pScChangeAction;
1338 			pParentData->nActionNo=pScChangeAction->GetActionNumber();
1339 			pParentData->bIsAcceptable=pScChangeAction->IsClickable();
1340 			pParentData->bIsRejectable=sal_False;
1341 			pParentData->bDisabled=sal_False;
1342 		}
1343 	}
1344 
1345 	return bTheTestFlag;
1346 
1347 }
1348 
InsertAcceptedORejected(SvLBoxEntry * pParent)1349 sal_Bool ScAcceptChgDlg::InsertAcceptedORejected(SvLBoxEntry* pParent)
1350 {
1351 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
1352 	sal_Bool bTheTestFlag=sal_True;
1353 
1354 	ScChangeActionState eState = SC_CAS_VIRGIN;
1355 	String aString=pTheView->GetEntryText( pParent);
1356 	String a2String=aString.Copy(0,aStrAllAccepted.Len());
1357 	if(a2String==aStrAllAccepted)
1358 	{
1359 		eState=SC_CAS_ACCEPTED;
1360 	}
1361 	else
1362 	{
1363 		a2String=aString.Copy(0,aStrAllRejected.Len());
1364 		if(a2String==aStrAllRejected)
1365 		{
1366 			eState=SC_CAS_REJECTED;
1367 		}
1368 	}
1369 
1370 	ScChangeAction* pScChangeAction=pChanges->GetFirst();
1371 	while(pScChangeAction!=NULL)
1372 	{
1373 		if(pScChangeAction->GetState()==eState &&
1374 			InsertFilteredAction(pScChangeAction,eState,pParent)!=NULL)
1375 			bTheTestFlag=sal_False;
1376 		pScChangeAction=pScChangeAction->GetNext();
1377 	}
1378 	return bTheTestFlag;
1379 }
1380 
InsertChilds(ScChangeActionTable * pActionTable,SvLBoxEntry * pParent)1381 sal_Bool ScAcceptChgDlg::InsertChilds(ScChangeActionTable* pActionTable,SvLBoxEntry* pParent)
1382 {
1383 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
1384 	sal_Bool bTheTestFlag=sal_True;
1385 	SvLBoxEntry* pEntry=NULL;
1386 	const ScChangeAction* pChild=(const ScChangeAction*)pActionTable->First();
1387 	while(pChild!=NULL)
1388 	{
1389 		pEntry=InsertChangeAction(pChild,SC_CAS_VIRGIN,pParent,sal_False,sal_True);
1390 
1391 		if(pEntry!=NULL)
1392 		{
1393 			bTheTestFlag=sal_False;
1394 
1395 			ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
1396 			pEntryData->bIsRejectable=sal_False;
1397 			pEntryData->bIsAcceptable=sal_False;
1398 			pEntryData->bDisabled=sal_True;
1399 
1400 			if(pChild->IsDialogParent())
1401 			{
1402 
1403 				//pEntry->EnableChildsOnDemand(sal_True);
1404 				Expand(pChanges,pChild,pEntry);
1405 			}
1406 		}
1407 		pChild=pActionTable->Next();
1408 	}
1409 	return bTheTestFlag;
1410 }
InsertDeletedChilds(const ScChangeAction * pScChangeAction,ScChangeActionTable * pActionTable,SvLBoxEntry * pParent)1411 sal_Bool ScAcceptChgDlg::InsertDeletedChilds(const ScChangeAction* pScChangeAction,
1412 										 ScChangeActionTable* pActionTable,SvLBoxEntry* pParent)
1413 {
1414 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
1415 	sal_Bool bTheTestFlag=sal_True;
1416 	SvLBoxEntry* pEntry=NULL;
1417 	ScChangeActionTable aDelActionTable;
1418 	const ScChangeAction* pChild=(const ScChangeAction*)pActionTable->First();
1419 
1420 	while(pChild!=NULL)
1421 	{
1422 
1423 		if(pScChangeAction!=pChild)
1424 			pEntry=InsertChangeAction(pChild,SC_CAS_VIRGIN,pParent,sal_False,sal_True);
1425 		else
1426 			pEntry=InsertChangeAction(pChild,SC_CAS_VIRGIN,pParent,sal_True,sal_True);
1427 
1428 		if(pEntry!=NULL)
1429 		{
1430 			ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
1431 			pEntryData->bIsRejectable=sal_False;
1432 			pEntryData->bIsAcceptable=sal_False;
1433 			pEntryData->bDisabled=sal_True;
1434 
1435 			bTheTestFlag=sal_False;
1436 			if ( pChild->IsDialogParent() )
1437 			{
1438 				Expand(pChanges,pChild,pEntry);
1439 				/*
1440 				pChanges->GetDependents((ScChangeAction*) pChild,aDelActionTable);
1441 				if(aDelActionTable.First()!=NULL)
1442 				{
1443 					pEntry->EnableChildsOnDemand(sal_True);
1444 				}
1445 				aDelActionTable.Clear();
1446 				*/
1447 			}
1448 		}
1449 		pChild=pActionTable->Next();
1450 	}
1451 	return bTheTestFlag;
1452 }
1453 
Expand(ScChangeTrack * pChanges,const ScChangeAction * pScChangeAction,SvLBoxEntry * pEntry,sal_Bool bFilter)1454 sal_Bool ScAcceptChgDlg::Expand(ScChangeTrack* pChanges,const ScChangeAction* pScChangeAction,
1455 							SvLBoxEntry* pEntry,sal_Bool bFilter)
1456 {
1457 	sal_Bool bTheTestFlag=sal_True;
1458 
1459 	if(pChanges!=NULL &&pEntry!=NULL &&pScChangeAction!=NULL)
1460 	{
1461 		ScChangeActionTable aActionTable;
1462 
1463 		GetDependents( pScChangeAction,aActionTable,pEntry);
1464 
1465 		switch(pScChangeAction->GetType())
1466 		{
1467 			case SC_CAT_CONTENT:
1468 			{
1469 				InsertContentChilds(&aActionTable,pEntry);
1470 				bTheTestFlag=!bHasFilterEntry;
1471 				break;
1472 			}
1473 			case SC_CAT_DELETE_COLS:
1474 			case SC_CAT_DELETE_ROWS:
1475 			case SC_CAT_DELETE_TABS:
1476 			{
1477 				InsertDeletedChilds(pScChangeAction,&aActionTable,pEntry);
1478 				bTheTestFlag=!bHasFilterEntry;
1479 				break;
1480 			}
1481 			default:
1482 			{
1483 				if(!bFilter)
1484 					bTheTestFlag=InsertChilds(&aActionTable,pEntry);
1485 				break;
1486 			}
1487 		}
1488 		aActionTable.Clear();
1489 	}
1490 	return bTheTestFlag;
1491 }
1492 
IMPL_LINK(ScAcceptChgDlg,ExpandingHandle,SvxRedlinTable *,pTable)1493 IMPL_LINK( ScAcceptChgDlg, ExpandingHandle, SvxRedlinTable*, pTable )
1494 {
1495 	ScChangeTrack* pChanges=pDoc->GetChangeTrack();
1496 	ScChangeAction* pScChangeAction=NULL;
1497 	SetPointer(Pointer(POINTER_WAIT));
1498 	if(pTable!=NULL && pChanges!=NULL)
1499 	{
1500 		ScChangeActionTable aActionTable;
1501 		SvLBoxEntry* pEntry=pTheView->GetHdlEntry();
1502 		if(pEntry!=NULL)
1503 		{
1504 			ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
1505 			if(pEntryData!=NULL)
1506 			{
1507 				pScChangeAction=(ScChangeAction*) pEntryData->pData;
1508 			}
1509 
1510 			if(pEntry->HasChildsOnDemand())
1511 			{
1512 				sal_Bool bTheTestFlag=sal_True;
1513 				pEntry->EnableChildsOnDemand(sal_False);
1514                 pTheView->RemoveEntry(pTheView->FirstChild(pEntry));
1515 
1516 				if(pEntryData!=NULL)
1517 				{
1518 					pScChangeAction=(ScChangeAction*) pEntryData->pData;
1519 
1520 					GetDependents( pScChangeAction,aActionTable,pEntry);
1521 
1522 					switch(pScChangeAction->GetType())
1523 					{
1524 						case SC_CAT_CONTENT:
1525 						{
1526 							bTheTestFlag=InsertContentChilds(&aActionTable,pEntry);
1527 							break;
1528 						}
1529 						case SC_CAT_DELETE_COLS:
1530 						case SC_CAT_DELETE_ROWS:
1531 						case SC_CAT_DELETE_TABS:
1532 						{
1533 							bTheTestFlag=InsertDeletedChilds(pScChangeAction,&aActionTable,pEntry);
1534 							break;
1535 						}
1536 						default:
1537 						{
1538 							bTheTestFlag=InsertChilds(&aActionTable,pEntry);
1539 							break;
1540 						}
1541 					}
1542 					aActionTable.Clear();
1543 
1544 				}
1545 				else
1546 				{
1547 					bTheTestFlag=InsertAcceptedORejected(pEntry);
1548 				}
1549 				if(bTheTestFlag) pTheView->InsertEntry(aStrNoEntry,NULL,Color(COL_GRAY),pEntry);
1550 			}
1551 
1552 		}
1553 	}
1554 	SetPointer(Pointer(POINTER_ARROW));
1555 	return (sal_uLong) sal_True;
1556 }
1557 
1558 
AppendChanges(ScChangeTrack * pChanges,sal_uLong nStartAction,sal_uLong nEndAction,sal_uLong)1559 void ScAcceptChgDlg::AppendChanges(ScChangeTrack* pChanges,sal_uLong nStartAction,
1560                                    sal_uLong nEndAction, sal_uLong /* nPos */)
1561 {
1562 	if(pChanges!=NULL)
1563 	{
1564 		DateTime aDateTime;
1565 		SvLBoxEntry* pParent=NULL;
1566 		const ScChangeAction* pScChangeAction=NULL;
1567 		bAcceptEnableFlag=sal_True;
1568 		bRejectEnableFlag=sal_True;
1569 		SetPointer(Pointer(POINTER_WAIT));
1570 		pTheView->SetUpdateMode(sal_False);
1571 
1572 		ScChangeActionTable ActionTable;
1573 		sal_Bool bTheFlag=sal_False;
1574 
1575 		sal_Bool bFilterFlag=pTPFilter->IsDate()||pTPFilter->IsRange()||
1576 					 pTPFilter->IsAuthor()||pTPFilter->IsComment();
1577 
1578 		bUseColor=bFilterFlag;
1579 
1580 		for(sal_uLong i=nStartAction;i<=nEndAction;i++)
1581 		{
1582 			pScChangeAction=pChanges->GetAction(i);
1583 			if(pScChangeAction==NULL) continue;
1584 
1585 
1586 			switch(pScChangeAction->GetState())
1587 			{
1588 				case SC_CAS_VIRGIN:
1589 
1590 					if(pScChangeAction->IsDialogRoot())
1591 					{
1592 						if(pScChangeAction->IsDialogParent())
1593 							pParent=InsertChangeAction(pScChangeAction,SC_CAS_VIRGIN);
1594 						else
1595 							pParent=InsertFilteredAction(pScChangeAction,SC_CAS_VIRGIN);
1596 					}
1597 					else
1598 						pParent=NULL;
1599 
1600 					bTheFlag=sal_True;
1601 					break;
1602 
1603 				case SC_CAS_ACCEPTED:
1604 					pParent=NULL;
1605 					nAcceptCount++;
1606 					break;
1607 
1608 				case SC_CAS_REJECTED:
1609 					pParent=NULL;
1610 					nRejectCount++;
1611 					break;
1612 			}
1613 
1614 			if(pParent!=NULL && pScChangeAction->IsDialogParent())
1615 			{
1616 				if(!bFilterFlag)
1617 				{
1618 					pParent->EnableChildsOnDemand(sal_True);
1619 				}
1620 				else
1621 				{
1622 					sal_Bool bTestFlag=bHasFilterEntry;
1623 					bHasFilterEntry=sal_False;
1624 					if(Expand(pChanges,pScChangeAction,pParent,!bTestFlag)&&!bTestFlag)
1625                         pTheView->RemoveEntry(pParent);
1626 				}
1627 			}
1628 
1629 			pScChangeAction=pScChangeAction->GetNext();
1630 		}
1631 
1632         if( bTheFlag && (!pDoc->IsDocEditable() || pChanges->IsProtected()) )
1633 			bTheFlag=sal_False;
1634 
1635 		pTPView->EnableAccept(bTheFlag);
1636 		pTPView->EnableAcceptAll(bTheFlag);
1637 		pTPView->EnableReject(bTheFlag);
1638 		pTPView->EnableRejectAll(bTheFlag);
1639 
1640 		pTheView->SetUpdateMode(sal_True);
1641 		SetPointer(Pointer(POINTER_ARROW));
1642 	}
1643 }
1644 
RemoveEntrys(sal_uLong nStartAction,sal_uLong nEndAction)1645 void ScAcceptChgDlg::RemoveEntrys(sal_uLong nStartAction,sal_uLong nEndAction)
1646 {
1647 
1648 	pTheView->SetUpdateMode(sal_False);
1649 
1650 	SvLBoxEntry* pEntry=pTheView->GetCurEntry();
1651 
1652 	ScRedlinData *pEntryData=NULL;
1653 
1654 	if(pEntry!=NULL)
1655 		pEntryData=(ScRedlinData *)(pEntry->GetUserData());
1656 
1657 	sal_uLong nAction=0;
1658 	if(pEntryData!=NULL)
1659 	{
1660 		nAction=pEntryData->nActionNo;
1661 	}
1662 
1663 	if(nAction>=nStartAction && nAction<=nEndAction)
1664 	{
1665 		pTheView->SetCurEntry(pTheView->GetModel()->GetEntry(0));
1666 	}
1667 
1668 	sal_Bool bRemove=sal_False;
1669 
1670 	// MUST do it backwards, don't delete parents before children and GPF
1671 	pEntry=pTheView->Last();
1672 	while(pEntry!=NULL)
1673 	{
1674 		bRemove=sal_False;
1675 		pEntryData=(ScRedlinData *)(pEntry->GetUserData());
1676 		if(pEntryData!=NULL)
1677 		{
1678 			nAction=pEntryData->nActionNo;
1679 
1680 			if(nStartAction<=nAction && nAction<=nEndAction) bRemove=sal_True;
1681 
1682 
1683 		}
1684 		SvLBoxEntry* pPrevEntry = pTheView->Prev(pEntry);
1685 
1686 		if(bRemove)
1687 		{
1688 			//delete pEntryData;
1689             pTheView->RemoveEntry(pEntry);
1690 		}
1691 		pEntry=pPrevEntry;
1692 	}
1693 	pTheView->SetUpdateMode(sal_True);
1694 
1695 }
1696 
UpdateEntrys(ScChangeTrack * pChgTrack,sal_uLong nStartAction,sal_uLong nEndAction)1697 void ScAcceptChgDlg::UpdateEntrys(ScChangeTrack* pChgTrack, sal_uLong nStartAction,sal_uLong nEndAction)
1698 {
1699 	pTheView->SetUpdateMode(sal_False);
1700 
1701 	sal_uLong nPos=LIST_APPEND;
1702 
1703 	sal_Bool bRemove=sal_False;
1704 
1705 	SvLBoxEntry* pEntry=pTheView->First();
1706 	SvLBoxEntry* pNextEntry = (pEntry ? pTheView->NextSibling(pEntry) : NULL);
1707 	SvLBoxEntry* pLastEntry=NULL;
1708 	while(pEntry!=NULL)
1709 	{
1710 		bRemove=sal_False;
1711 		ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
1712 		if(pEntryData!=NULL)
1713 		{
1714 			ScChangeAction* pScChangeAction=
1715 					(ScChangeAction*) pEntryData->pData;
1716 
1717 			sal_uLong nAction=pScChangeAction->GetActionNumber();
1718 
1719 			if(nStartAction<=nAction && nAction<=nEndAction) bRemove=sal_True;
1720 		}
1721 
1722 		if(bRemove)
1723 		{
1724 			nPos=pEntry->GetChildListPos();
1725             pTheView->RemoveEntry(pEntry);
1726 
1727 			if(pLastEntry==NULL) pLastEntry=pTheView->First();
1728 			if(pLastEntry!=NULL)
1729 			{
1730 				pNextEntry=pTheView->Next(pLastEntry);
1731 
1732 				if(pNextEntry==NULL)
1733 				{
1734 					pNextEntry=pLastEntry;
1735 					pLastEntry=NULL;
1736 				}
1737 			}
1738 			else
1739 				pNextEntry=NULL;
1740 
1741 		}
1742 		else
1743 		{
1744 			pLastEntry = pEntry;
1745 			pNextEntry = pTheView->Next(pEntry);
1746 		}
1747 		pEntry=pNextEntry;
1748 	}
1749 
1750 	if(nStartAction==nEndAction)
1751 		AppendChanges(pChgTrack,nStartAction,nEndAction,nPos);
1752 	else
1753 		AppendChanges(pChgTrack,nStartAction,nEndAction);
1754 
1755 	pTheView->SetUpdateMode(sal_True);
1756 
1757 }
1758 
IMPL_LINK(ScAcceptChgDlg,ChgTrackModHdl,ScChangeTrack *,pChgTrack)1759 IMPL_LINK( ScAcceptChgDlg, ChgTrackModHdl, ScChangeTrack*, pChgTrack)
1760 {
1761 //	if(bScAcceptChgDlgIsDead) return 0;
1762 
1763 	ScChangeTrackMsgQueue& aMsgQueue= pChgTrack->GetMsgQueue();
1764 
1765 	ScChangeTrackMsgInfo* pTrackInfo=aMsgQueue.Get();
1766 	sal_uLong	nStartAction;
1767 	sal_uLong	nEndAction;
1768 
1769 	while(pTrackInfo!=NULL)
1770 	{
1771 		nStartAction=pTrackInfo->nStartAction;
1772 		nEndAction=pTrackInfo->nEndAction;
1773 
1774 		if(!bIgnoreMsg)
1775 		{
1776 			bNoSelection=sal_True;
1777 
1778 			switch(pTrackInfo->eMsgType)
1779 			{
1780 				case SC_CTM_APPEND: AppendChanges(pChgTrack,nStartAction,nEndAction);
1781 									break;
1782 				case SC_CTM_REMOVE: RemoveEntrys(nStartAction,nEndAction);
1783 									break;
1784 				case SC_CTM_PARENT:
1785 				case SC_CTM_CHANGE: //bNeedsUpdate=sal_True;
1786 									UpdateEntrys(pChgTrack,nStartAction,nEndAction);
1787 									break;
1788                 default:
1789                 {
1790                     // added to avoid warnings
1791                 }
1792 			}
1793 		}
1794 		delete pTrackInfo;
1795 		pTrackInfo=aMsgQueue.Get();
1796 	}
1797 
1798 	return 0;
1799 }
IMPL_LINK(ScAcceptChgDlg,ReOpenTimerHdl,Timer *,EMPTYARG)1800 IMPL_LINK( ScAcceptChgDlg, ReOpenTimerHdl, Timer*, EMPTYARG )
1801 {
1802 	ScSimpleRefDlgWrapper::SetAutoReOpen(sal_True);
1803 	aAcceptChgCtr.ShowFilterPage();
1804 	RefHandle(NULL);
1805 
1806 	return 0;
1807 }
1808 
IMPL_LINK(ScAcceptChgDlg,UpdateSelectionHdl,Timer *,EMPTYARG)1809 IMPL_LINK( ScAcceptChgDlg, UpdateSelectionHdl, Timer*, EMPTYARG )
1810 {
1811     ScTabView* pTabView = pViewData->GetView();
1812 
1813     sal_Bool bAcceptFlag = sal_True;
1814     sal_Bool bRejectFlag = sal_True;
1815     sal_Bool bContMark = sal_False;
1816 
1817     pTabView->DoneBlockMode();  // clears old marking
1818     SvLBoxEntry* pEntry = pTheView->FirstSelected();
1819     while( pEntry )
1820 	{
1821         ScRedlinData* pEntryData = (ScRedlinData*) pEntry->GetUserData();
1822         if( pEntryData )
1823 		{
1824             bRejectFlag &= pEntryData->bIsRejectable;
1825             bAcceptFlag &= pEntryData->bIsAcceptable;
1826 
1827             const ScChangeAction* pScChangeAction = (ScChangeAction*) pEntryData->pData;
1828             if( pScChangeAction && (pScChangeAction->GetType() != SC_CAT_DELETE_TABS) &&
1829                     (!pEntryData->bDisabled || pScChangeAction->IsVisible()) )
1830             {
1831                 const ScBigRange& rBigRange = pScChangeAction->GetBigRange();
1832                 if( rBigRange.IsValid( pDoc ) && IsActive() )
1833                 {
1834                     sal_Bool bSetCursor = !pTheView->NextSelected( pEntry );
1835                     pTabView->MarkRange( rBigRange.MakeRange(), bSetCursor, bContMark );
1836                     bContMark = sal_True;
1837                 }
1838             }
1839 		}
1840 		else
1841 		{
1842             bAcceptFlag = sal_False;
1843             bRejectFlag = sal_False;
1844 		}
1845         bAcceptEnableFlag = bAcceptFlag;
1846         bRejectEnableFlag = bRejectFlag;
1847 
1848         pEntry = pTheView->NextSelected( pEntry );
1849 	}
1850 
1851     ScChangeTrack* pChanges = pDoc->GetChangeTrack();
1852     sal_Bool bEnable = pDoc->IsDocEditable() && pChanges && !pChanges->IsProtected();
1853     pTPView->EnableAccept( bAcceptFlag && bEnable );
1854     pTPView->EnableReject( bRejectFlag && bEnable );
1855 
1856 	return 0;
1857 }
1858 
IMPL_LINK(ScAcceptChgDlg,CommandHdl,Control *,EMPTYARG)1859 IMPL_LINK( ScAcceptChgDlg, CommandHdl, Control*, EMPTYARG )
1860 {
1861 
1862 	const CommandEvent aCEvt(pTheView->GetCommandEvent());
1863 
1864 	if(aCEvt.GetCommand()==COMMAND_CONTEXTMENU)
1865 	{
1866 		ScPopupMenu aPopup(ScResId(RID_POPUP_CHANGES));
1867 
1868 		aPopup.SetMenuFlags(MENU_FLAG_HIDEDISABLEDENTRIES);
1869 
1870 		SvLBoxEntry* pEntry=pTheView->GetCurEntry();
1871 		if(pEntry!=NULL)
1872 		{
1873 			pTheView->Select(pEntry);
1874 		}
1875 		else
1876 		{
1877 			aPopup.Deactivate();
1878 		}
1879 
1880 		sal_uInt16 nSortedCol= pTheView->GetSortedCol();
1881 
1882 		if(nSortedCol!=0xFFFF)
1883 		{
1884 			sal_uInt16 nItemId=nSortedCol+SC_SUB_SORT+1;
1885 
1886 			aPopup.CheckItem(nItemId);
1887 
1888 			PopupMenu *pSubMenu = aPopup.GetPopupMenu(SC_SUB_SORT);
1889 			if (pSubMenu)
1890 			{
1891 				pSubMenu->CheckItem(nItemId);
1892 			}
1893 		}
1894 
1895 		aPopup.EnableItem(SC_CHANGES_COMMENT,sal_False);
1896 
1897 		if(pDoc->IsDocEditable() && pEntry!=NULL)
1898 		{
1899 			ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
1900 			if(pEntryData!=NULL)
1901 			{
1902 				ScChangeAction* pScChangeAction=
1903 						(ScChangeAction*) pEntryData->pData;
1904 				if(pScChangeAction!=NULL && !pTheView->GetParent(pEntry))
1905 					aPopup.EnableItem(SC_CHANGES_COMMENT);
1906 			}
1907 		}
1908 
1909 		sal_uInt16 nCommand=aPopup.Execute( this, GetPointerPosPixel() );
1910 
1911 
1912 		if(nCommand)
1913 		{
1914 			if(nCommand==SC_CHANGES_COMMENT)
1915 			{
1916 				if(pEntry!=NULL)
1917 				{
1918 					ScRedlinData *pEntryData=(ScRedlinData *)(pEntry->GetUserData());
1919 					if(pEntryData!=NULL)
1920 					{
1921 						ScChangeAction* pScChangeAction=
1922 								(ScChangeAction*) pEntryData->pData;
1923 
1924 						pViewData->GetDocShell()->ExecuteChangeCommentDialog( pScChangeAction, this,sal_False);
1925 					}
1926 				}
1927 			}
1928 			else
1929 			{
1930 				sal_Bool bSortDir=pTheView->GetSortDirection();
1931 				sal_uInt16 nDialogCol=nCommand-SC_SUB_SORT-1;
1932 				if(nSortedCol==nDialogCol) bSortDir=!bSortDir;
1933 				pTheView->SortByCol(nDialogCol,bSortDir);
1934 				/*
1935 				SC_SUB_SORT
1936 				SC_SORT_ACTION
1937 				SC_SORT_POSITION
1938 				SC_SORT_AUTHOR
1939 				SC_SORT_DATE
1940 				SC_SORT_COMMENT
1941 				*/
1942 			}
1943 		}
1944 	}
1945 	return 0;
1946 }
1947 
Initialize(SfxChildWinInfo * pInfo)1948 void ScAcceptChgDlg::Initialize(SfxChildWinInfo *pInfo)
1949 {
1950 	String aStr;
1951 	if(pInfo!=NULL)
1952 	{
1953 		if ( pInfo->aExtraString.Len() )
1954 		{
1955 			xub_StrLen nPos = pInfo->aExtraString.Search(
1956 				String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("AcceptChgDat:")));
1957 
1958 			// Versuche, den Alignment-String "ALIGN:(...)" einzulesen; wenn
1959 			// er nicht vorhanden ist, liegt eine "altere Version vor
1960 			if ( nPos != STRING_NOTFOUND )
1961 			{
1962 				xub_StrLen n1 = pInfo->aExtraString.Search('(', nPos);
1963 				if ( n1 != STRING_NOTFOUND )
1964 				{
1965 					xub_StrLen n2 = pInfo->aExtraString.Search(')', n1);
1966 					if ( n2 != STRING_NOTFOUND )
1967 					{
1968 						// Alignment-String herausschneiden
1969 						aStr = pInfo->aExtraString.Copy(nPos, n2 - nPos + 1);
1970 						pInfo->aExtraString.Erase(nPos, n2 - nPos + 1);
1971 						aStr.Erase(0, n1-nPos+1);
1972 					}
1973 				}
1974 			}
1975 		}
1976 	}
1977 	SfxModelessDialog::Initialize(pInfo);
1978 
1979 	if ( aStr.Len())
1980 	{
1981 		sal_uInt16 nCount=(sal_uInt16)aStr.ToInt32();
1982 
1983 		for(sal_uInt16 i=0;i<nCount;i++)
1984 		{
1985 			xub_StrLen n1 = aStr.Search(';');
1986 			aStr.Erase(0, n1+1);
1987 			pTheView->SetTab(i,(sal_uInt16)aStr.ToInt32(),MAP_PIXEL);
1988 		}
1989 	}
1990 }
1991 
1992 //-------------------------------------------------------------------------
1993 
FillInfo(SfxChildWinInfo & rInfo) const1994 void ScAcceptChgDlg::FillInfo(SfxChildWinInfo& rInfo) const
1995 {
1996 	SfxModelessDialog::FillInfo(rInfo);
1997 	rInfo.aExtraString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "AcceptChgDat:(" ));
1998 
1999 	sal_uInt16	nCount=pTheView->TabCount();
2000 
2001 	rInfo.aExtraString += String::CreateFromInt32(nCount);
2002 	rInfo.aExtraString += ';';
2003 	for(sal_uInt16 i=0;i<nCount;i++)
2004 	{
2005 		rInfo.aExtraString += String::CreateFromInt32(pTheView->GetTab(i));
2006 		rInfo.aExtraString += ';';
2007 	}
2008 	rInfo.aExtraString += ')';
2009 }
2010 
InitFilter()2011 void ScAcceptChgDlg::InitFilter()
2012 {
2013 	if(pTPFilter->IsDate()||pTPFilter->IsRange()||
2014 		pTPFilter->IsAuthor()||pTPFilter->IsComment())
2015 	{
2016 		pTheView->SetFilterDate(pTPFilter->IsDate());
2017 		pTheView->SetDateTimeMode(pTPFilter->GetDateMode());
2018 		pTheView->SetFirstDate(pTPFilter->GetFirstDate());
2019 		pTheView->SetLastDate(pTPFilter->GetLastDate());
2020 		pTheView->SetFirstTime(pTPFilter->GetFirstTime());
2021 		pTheView->SetLastTime(pTPFilter->GetLastTime());
2022 		pTheView->SetFilterAuthor(pTPFilter->IsAuthor());
2023 		pTheView->SetAuthor(pTPFilter->GetSelectedAuthor());
2024 
2025 		pTheView->SetFilterComment(pTPFilter->IsComment());
2026 
2027 		utl::SearchParam aSearchParam( pTPFilter->GetComment(),
2028 				utl::SearchParam::SRCH_REGEXP,sal_False,sal_False,sal_False );
2029 
2030 		pTheView->SetCommentParams(&aSearchParam);
2031 
2032 		pTheView->UpdateFilterTest();
2033 	}
2034 }
2035 
2036 //UNUSED2008-05  void ScAcceptChgDlg::SetMyStaticData()
2037 //UNUSED2008-05  {
2038 //UNUSED2008-05  }
2039 
IMPL_LINK(ScAcceptChgDlg,FilterModified,SvxTPFilter *,EMPTYARG)2040 IMPL_LINK( ScAcceptChgDlg, FilterModified, SvxTPFilter*, EMPTYARG )
2041 {
2042 	return 0;
2043 }
2044 
2045 #define CALC_DATE		3
2046 #define CALC_POS		1
2047 
IMPL_LINK(ScAcceptChgDlg,ColCompareHdl,SvSortData *,pSortData)2048 IMPL_LINK( ScAcceptChgDlg, ColCompareHdl, SvSortData*, pSortData )
2049 {
2050 	StringCompare eCompare=COMPARE_EQUAL;
2051 	SCCOL nSortCol= static_cast<SCCOL>(pTheView->GetSortedCol());
2052 
2053 	if(pSortData)
2054 	{
2055 		SvLBoxEntry* pLeft = (SvLBoxEntry*)(pSortData->pLeft );
2056 		SvLBoxEntry* pRight = (SvLBoxEntry*)(pSortData->pRight );
2057 
2058 		if(CALC_DATE==nSortCol)
2059 		{
2060 			RedlinData *pLeftData=(RedlinData *)(pLeft->GetUserData());
2061 			RedlinData *pRightData=(RedlinData *)(pRight->GetUserData());
2062 
2063 			if(pLeftData!=NULL && pRightData!=NULL)
2064 			{
2065 				if(pLeftData->aDateTime < pRightData->aDateTime)
2066 				{
2067 					eCompare=COMPARE_LESS;
2068 				}
2069 				else if(pLeftData->aDateTime > pRightData->aDateTime)
2070 				{
2071 					eCompare=COMPARE_GREATER;
2072 				}
2073 				return eCompare;
2074 			}
2075 		}
2076 		else if(CALC_POS==nSortCol)
2077 		{
2078 			ScRedlinData *pLeftData=(ScRedlinData *)(pLeft->GetUserData());
2079 			ScRedlinData *pRightData=(ScRedlinData *)(pRight->GetUserData());
2080 
2081 			if(pLeftData!=NULL && pRightData!=NULL)
2082 			{
2083 				eCompare=COMPARE_GREATER;
2084 
2085 				if(pLeftData->nTable < pRightData->nTable)
2086 				{
2087 					eCompare=COMPARE_LESS;
2088 				}
2089 				else if(pLeftData->nTable == pRightData->nTable)
2090 				{
2091 					if(pLeftData->nRow < pRightData->nRow)
2092 					{
2093 						eCompare=COMPARE_LESS;
2094 					}
2095 					else if(pLeftData->nRow == pRightData->nRow)
2096 					{
2097 						if(pLeftData->nCol < pRightData->nCol)
2098 						{
2099 							eCompare=COMPARE_LESS;
2100 						}
2101 						else if(pLeftData->nCol == pRightData->nCol)
2102 						{
2103 							eCompare=COMPARE_EQUAL;
2104 						}
2105 					}
2106 				}
2107 
2108 				return eCompare;
2109 			}
2110 		}
2111 
2112 		SvLBoxItem* pLeftItem = pTheView->GetEntryAtPos( pLeft, static_cast<sal_uInt16>(nSortCol));
2113 		SvLBoxItem* pRightItem = pTheView->GetEntryAtPos( pRight, static_cast<sal_uInt16>(nSortCol));
2114 
2115 		if(pLeftItem != NULL && pRightItem != NULL)
2116 		{
2117 			sal_uInt16 nLeftKind=pLeftItem->IsA();
2118 			sal_uInt16 nRightKind=pRightItem->IsA();
2119 
2120 			if(nRightKind == SV_ITEM_ID_LBOXSTRING &&
2121 				nLeftKind == SV_ITEM_ID_LBOXSTRING )
2122 			{
2123 				eCompare= (StringCompare) ScGlobal::GetCaseCollator()->compareString(
2124 										((SvLBoxString*)pLeftItem)->GetText(),
2125 										((SvLBoxString*)pRightItem)->GetText());
2126 
2127 				if(eCompare==COMPARE_EQUAL) eCompare=COMPARE_LESS;
2128 			}
2129 		}
2130 
2131 
2132 	}
2133 	return eCompare;
2134 }
2135 
2136