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