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