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