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 <vcl/msgbox.hxx>
22 :
23 : #include "conflictsdlg.hxx"
24 : #include "sc.hrc"
25 : #include "scresid.hxx"
26 : #include "viewdata.hxx"
27 : #include "dbfunc.hxx"
28 :
29 : // struct ScConflictsListEntry
30 :
31 0 : bool ScConflictsListEntry::HasSharedAction( sal_uLong nSharedAction ) const
32 : {
33 0 : ScChangeActionList::const_iterator aEnd = maSharedActions.end();
34 0 : for ( ScChangeActionList::const_iterator aItr = maSharedActions.begin(); aItr != aEnd; ++aItr )
35 : {
36 0 : if ( *aItr == nSharedAction )
37 : {
38 0 : return true;
39 : }
40 : }
41 :
42 0 : return false;
43 : }
44 :
45 0 : bool ScConflictsListEntry::HasOwnAction( sal_uLong nOwnAction ) const
46 : {
47 0 : ScChangeActionList::const_iterator aEnd = maOwnActions.end();
48 0 : for ( ScChangeActionList::const_iterator aItr = maOwnActions.begin(); aItr != aEnd; ++aItr )
49 : {
50 0 : if ( *aItr == nOwnAction )
51 : {
52 0 : return true;
53 : }
54 : }
55 :
56 0 : return false;
57 : }
58 :
59 : // class ScConflictsListHelper
60 :
61 0 : bool ScConflictsListHelper::HasOwnAction( ScConflictsList& rConflictsList, sal_uLong nOwnAction )
62 : {
63 0 : ScConflictsList::const_iterator aEnd = rConflictsList.end();
64 0 : for ( ScConflictsList::const_iterator aItr = rConflictsList.begin(); aItr != aEnd; ++aItr )
65 : {
66 0 : if ( aItr->HasOwnAction( nOwnAction ) )
67 : {
68 0 : return true;
69 : }
70 : }
71 :
72 0 : return false;
73 : }
74 :
75 0 : ScConflictsListEntry* ScConflictsListHelper::GetSharedActionEntry( ScConflictsList& rConflictsList, sal_uLong nSharedAction )
76 : {
77 0 : ScConflictsList::iterator aEnd = rConflictsList.end();
78 0 : for ( ScConflictsList::iterator aItr = rConflictsList.begin(); aItr != aEnd; ++aItr )
79 : {
80 0 : if ( aItr->HasSharedAction( nSharedAction ) )
81 : {
82 0 : return &(*aItr);
83 : }
84 : }
85 :
86 0 : return NULL;
87 : }
88 :
89 0 : ScConflictsListEntry* ScConflictsListHelper::GetOwnActionEntry( ScConflictsList& rConflictsList, sal_uLong nOwnAction )
90 : {
91 0 : ScConflictsList::iterator aEnd = rConflictsList.end();
92 0 : for ( ScConflictsList::iterator aItr = rConflictsList.begin(); aItr != aEnd; ++aItr )
93 : {
94 0 : if ( aItr->HasOwnAction( nOwnAction ) )
95 : {
96 0 : return &(*aItr);
97 : }
98 : }
99 :
100 0 : return NULL;
101 : }
102 :
103 0 : void ScConflictsListHelper::Transform_Impl( ScChangeActionList& rActionList, ScChangeActionMergeMap* pMergeMap )
104 : {
105 0 : if ( !pMergeMap )
106 : {
107 0 : return;
108 : }
109 :
110 0 : for ( ScChangeActionList::iterator aItr = rActionList.begin(); aItr != rActionList.end(); )
111 : {
112 0 : ScChangeActionMergeMap::iterator aItrMap = pMergeMap->find( *aItr );
113 0 : if ( aItrMap != pMergeMap->end() )
114 : {
115 0 : *aItr = aItrMap->second;
116 0 : ++aItr;
117 : }
118 : else
119 : {
120 0 : aItr = rActionList.erase( aItr );
121 : OSL_FAIL( "ScConflictsListHelper::Transform_Impl: erased action from conflicts list!" );
122 : }
123 : }
124 : }
125 :
126 0 : void ScConflictsListHelper::TransformConflictsList( ScConflictsList& rConflictsList,
127 : ScChangeActionMergeMap* pSharedMap, ScChangeActionMergeMap* pOwnMap )
128 : {
129 0 : ScConflictsList::iterator aEnd = rConflictsList.end();
130 0 : for ( ScConflictsList::iterator aItr = rConflictsList.begin(); aItr != aEnd; ++aItr )
131 : {
132 0 : if ( pSharedMap )
133 : {
134 0 : ScConflictsListHelper::Transform_Impl( aItr->maSharedActions, pSharedMap );
135 : }
136 :
137 0 : if ( pOwnMap )
138 : {
139 0 : ScConflictsListHelper::Transform_Impl( aItr->maOwnActions, pOwnMap );
140 : }
141 : }
142 0 : }
143 :
144 : // class ScConflictsFinder
145 :
146 0 : ScConflictsFinder::ScConflictsFinder( ScChangeTrack* pTrack, sal_uLong nStartShared, sal_uLong nEndShared,
147 : sal_uLong nStartOwn, sal_uLong nEndOwn, ScConflictsList& rConflictsList )
148 : :mpTrack( pTrack )
149 : ,mnStartShared( nStartShared )
150 : ,mnEndShared( nEndShared )
151 : ,mnStartOwn( nStartOwn )
152 : ,mnEndOwn( nEndOwn )
153 0 : ,mrConflictsList( rConflictsList )
154 : {
155 0 : }
156 :
157 0 : ScConflictsFinder::~ScConflictsFinder()
158 : {
159 0 : }
160 :
161 0 : bool ScConflictsFinder::DoActionsIntersect( const ScChangeAction* pAction1, const ScChangeAction* pAction2 )
162 : {
163 0 : if ( pAction1 && pAction2 && pAction1->GetBigRange().Intersects( pAction2->GetBigRange() ) )
164 : {
165 0 : return true;
166 : }
167 0 : return false;
168 : }
169 :
170 0 : ScConflictsListEntry* ScConflictsFinder::GetIntersectingEntry( const ScChangeAction* pAction ) const
171 : {
172 0 : ScConflictsList::iterator aEnd = mrConflictsList.end();
173 0 : for ( ScConflictsList::iterator aItr = mrConflictsList.begin(); aItr != aEnd; ++aItr )
174 : {
175 0 : ScChangeActionList::const_iterator aEndShared = aItr->maSharedActions.end();
176 0 : for ( ScChangeActionList::const_iterator aItrShared = aItr->maSharedActions.begin(); aItrShared != aEndShared; ++aItrShared )
177 : {
178 0 : if ( DoActionsIntersect( mpTrack->GetAction( *aItrShared ), pAction ) )
179 : {
180 0 : return &(*aItr);
181 : }
182 : }
183 :
184 0 : ScChangeActionList::const_iterator aEndOwn = aItr->maOwnActions.end();
185 0 : for ( ScChangeActionList::const_iterator aItrOwn = aItr->maOwnActions.begin(); aItrOwn != aEndOwn; ++aItrOwn )
186 : {
187 0 : if ( DoActionsIntersect( mpTrack->GetAction( *aItrOwn ), pAction ) )
188 : {
189 0 : return &(*aItr);
190 : }
191 : }
192 : }
193 :
194 0 : return NULL;
195 : }
196 :
197 0 : ScConflictsListEntry* ScConflictsFinder::GetEntry( sal_uLong nSharedAction, const ScChangeActionList& rOwnActions )
198 : {
199 : // try to get a list entry which already contains the shared action
200 0 : ScConflictsListEntry* pEntry = ScConflictsListHelper::GetSharedActionEntry( mrConflictsList, nSharedAction );
201 0 : if ( pEntry )
202 : {
203 0 : return pEntry;
204 : }
205 :
206 : // try to get a list entry for which the shared action intersects with any
207 : // other action of this entry
208 0 : pEntry = GetIntersectingEntry( mpTrack->GetAction( nSharedAction ) );
209 0 : if ( pEntry )
210 : {
211 0 : pEntry->maSharedActions.push_back( nSharedAction );
212 0 : return pEntry;
213 : }
214 :
215 : // try to get a list entry for which any of the own actions intersects with
216 : // any other action of this entry
217 0 : ScChangeActionList::const_iterator aEnd = rOwnActions.end();
218 0 : for ( ScChangeActionList::const_iterator aItr = rOwnActions.begin(); aItr != aEnd; ++aItr )
219 : {
220 0 : pEntry = GetIntersectingEntry( mpTrack->GetAction( *aItr ) );
221 0 : if ( pEntry )
222 : {
223 0 : pEntry->maSharedActions.push_back( nSharedAction );
224 0 : return pEntry;
225 : }
226 : }
227 :
228 : // if no entry was found, create a new one
229 0 : ScConflictsListEntry aEntry;
230 0 : aEntry.meConflictAction = SC_CONFLICT_ACTION_NONE;
231 0 : aEntry.maSharedActions.push_back( nSharedAction );
232 0 : mrConflictsList.push_back( aEntry );
233 0 : return &(mrConflictsList.back());
234 : }
235 :
236 0 : bool ScConflictsFinder::Find()
237 : {
238 0 : if ( !mpTrack )
239 : {
240 0 : return false;
241 : }
242 :
243 0 : bool bReturn = false;
244 0 : ScChangeAction* pSharedAction = mpTrack->GetAction( mnStartShared );
245 0 : while ( pSharedAction && pSharedAction->GetActionNumber() <= mnEndShared )
246 : {
247 0 : ScChangeActionList aOwnActions;
248 0 : ScChangeAction* pOwnAction = mpTrack->GetAction( mnStartOwn );
249 0 : while ( pOwnAction && pOwnAction->GetActionNumber() <= mnEndOwn )
250 : {
251 0 : if ( DoActionsIntersect( pSharedAction, pOwnAction ) )
252 : {
253 0 : aOwnActions.push_back( pOwnAction->GetActionNumber() );
254 : }
255 0 : pOwnAction = pOwnAction->GetNext();
256 : }
257 :
258 0 : if ( aOwnActions.size() )
259 : {
260 0 : ScConflictsListEntry* pEntry = GetEntry( pSharedAction->GetActionNumber(), aOwnActions );
261 0 : ScChangeActionList::iterator aEnd = aOwnActions.end();
262 0 : for ( ScChangeActionList::iterator aItr = aOwnActions.begin(); aItr != aEnd; ++aItr )
263 : {
264 0 : if ( pEntry && !ScConflictsListHelper::HasOwnAction( mrConflictsList, *aItr ) )
265 : {
266 0 : pEntry->maOwnActions.push_back( *aItr );
267 : }
268 : }
269 0 : bReturn = true;
270 : }
271 :
272 0 : pSharedAction = pSharedAction->GetNext();
273 0 : }
274 :
275 0 : return bReturn;
276 : }
277 :
278 : // class ScConflictsResolver
279 :
280 0 : ScConflictsResolver::ScConflictsResolver( ScChangeTrack* pTrack, ScConflictsList& rConflictsList )
281 : :mpTrack ( pTrack )
282 0 : ,mrConflictsList ( rConflictsList )
283 : {
284 : OSL_ENSURE( mpTrack, "ScConflictsResolver CTOR: mpTrack is null!" );
285 0 : }
286 :
287 0 : ScConflictsResolver::~ScConflictsResolver()
288 : {
289 0 : }
290 :
291 0 : void ScConflictsResolver::HandleAction( ScChangeAction* pAction, bool bIsSharedAction,
292 : bool bHandleContentAction, bool bHandleNonContentAction )
293 : {
294 0 : if ( !mpTrack || !pAction )
295 : {
296 0 : return;
297 : }
298 :
299 0 : if ( bIsSharedAction )
300 : {
301 : ScConflictsListEntry* pConflictEntry = ScConflictsListHelper::GetSharedActionEntry(
302 0 : mrConflictsList, pAction->GetActionNumber() );
303 0 : if ( pConflictEntry )
304 : {
305 0 : ScConflictAction eConflictAction = pConflictEntry->meConflictAction;
306 0 : if ( eConflictAction == SC_CONFLICT_ACTION_KEEP_MINE )
307 : {
308 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
309 : {
310 0 : if ( bHandleContentAction )
311 : {
312 0 : mpTrack->Reject( pAction );
313 : }
314 : }
315 : else
316 : {
317 0 : if ( bHandleNonContentAction )
318 : {
319 0 : mpTrack->Reject( pAction );
320 : }
321 : }
322 : }
323 : }
324 : }
325 : else
326 : {
327 : ScConflictsListEntry* pConflictEntry = ScConflictsListHelper::GetOwnActionEntry(
328 0 : mrConflictsList, pAction->GetActionNumber() );
329 0 : if ( pConflictEntry )
330 : {
331 0 : ScConflictAction eConflictAction = pConflictEntry->meConflictAction;
332 0 : if ( eConflictAction == SC_CONFLICT_ACTION_KEEP_MINE )
333 : {
334 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
335 : {
336 : if ( bHandleContentAction )
337 : {
338 : // do nothing
339 : //mpTrack->SelectContent( pAction );
340 : }
341 : }
342 : else
343 : {
344 : if ( bHandleNonContentAction )
345 : {
346 : // do nothing
347 : //mpTrack->Accept( pAction );
348 : }
349 : }
350 : }
351 0 : else if ( eConflictAction == SC_CONFLICT_ACTION_KEEP_OTHER )
352 : {
353 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
354 : {
355 0 : if ( bHandleContentAction )
356 : {
357 0 : mpTrack->Reject( pAction );
358 : }
359 : }
360 : else
361 : {
362 0 : if ( bHandleNonContentAction )
363 : {
364 0 : mpTrack->Reject( pAction );
365 : }
366 : }
367 : }
368 : }
369 : }
370 : }
371 :
372 : // class ScConflictsDlg
373 :
374 0 : ScConflictsDlg::ScConflictsDlg( vcl::Window* pParent, ScViewData* pViewData, ScDocument* pSharedDoc, ScConflictsList& rConflictsList )
375 : :ModalDialog( pParent, "ConflictsDialog", "modules/scalc/ui/conflictsdialog.ui" )
376 : ,m_pLbConflictsContainer ( get<SvSimpleTableContainer>("container") )
377 0 : ,m_pLbConflicts ( VclPtr<SvxRedlinTable>::Create(*m_pLbConflictsContainer) )
378 : ,maStrTitleConflict ( ScResId( STR_TITLE_CONFLICT ) )
379 : ,maStrTitleAuthor ( ScResId( STR_TITLE_AUTHOR ) )
380 : ,maStrTitleDate ( ScResId( STR_TITLE_DATE ) )
381 : ,maStrUnknownUser ( ScResId( STR_UNKNOWN_USER_CONFLICT ) )
382 : ,mpViewData ( pViewData )
383 : ,mpOwnDoc ( NULL )
384 : ,mpOwnTrack ( NULL )
385 : ,mpSharedDoc ( pSharedDoc )
386 : ,mpSharedTrack ( NULL )
387 : ,mrConflictsList ( rConflictsList )
388 0 : ,maDialogSize ( GetSizePixel() )
389 : ,mbInSelectHdl ( false )
390 0 : ,mbInDeselectHdl ( false )
391 : {
392 0 : get(m_pBtnKeepMine, "keepmine");
393 0 : get(m_pBtnKeepOther, "keepother");
394 0 : get(m_pBtnKeepAllMine, "keepallmine");
395 0 : get(m_pBtnKeepAllOthers, "keepallothers");
396 :
397 : OSL_ENSURE( mpViewData, "ScConflictsDlg CTOR: mpViewData is null!" );
398 0 : mpOwnDoc = ( mpViewData ? mpViewData->GetDocument() : NULL );
399 : OSL_ENSURE( mpOwnDoc, "ScConflictsDlg CTOR: mpOwnDoc is null!" );
400 0 : mpOwnTrack = ( mpOwnDoc ? mpOwnDoc->GetChangeTrack() : NULL );
401 : OSL_ENSURE( mpOwnTrack, "ScConflictsDlg CTOR: mpOwnTrack is null!" );
402 : OSL_ENSURE( mpSharedDoc, "ScConflictsDlg CTOR: mpSharedDoc is null!" );
403 0 : mpSharedTrack = ( mpSharedDoc ? mpSharedDoc->GetChangeTrack() : NULL );
404 : OSL_ENSURE( mpSharedTrack, "ScConflictsDlg CTOR: mpSharedTrack is null!" );
405 :
406 0 : SetMinOutputSizePixel( maDialogSize );
407 :
408 0 : long nTabs[] = { 3, 10, 216, 266 };
409 0 : m_pLbConflicts->SetTabs( nTabs );
410 :
411 0 : OUString aTab('\t');
412 0 : OUString aHeader( maStrTitleConflict );
413 0 : aHeader += aTab;
414 0 : aHeader += maStrTitleAuthor;
415 0 : aHeader += aTab;
416 0 : aHeader += maStrTitleDate;
417 0 : m_pLbConflicts->InsertHeaderEntry( aHeader, HEADERBAR_APPEND, HeaderBarItemBits::LEFT | HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::VCENTER );
418 :
419 0 : m_pLbConflicts->SetStyle( m_pLbConflicts->GetStyle() | WB_HASLINES | WB_CLIPCHILDREN | WB_HASBUTTONS | WB_HASBUTTONSATROOT | WB_HSCROLL );
420 0 : m_pLbConflicts->SetSelectionMode( MULTIPLE_SELECTION );
421 0 : m_pLbConflicts->SetHighlightRange();
422 :
423 0 : maSelectionIdle.SetPriority( SchedulerPriority::LOW );
424 0 : maSelectionIdle.SetIdleHdl( LINK( this, ScConflictsDlg, UpdateSelectionHdl ) );
425 :
426 0 : m_pLbConflicts->SetSelectHdl( LINK( this, ScConflictsDlg, SelectHandle ) );
427 0 : m_pLbConflicts->SetDeselectHdl( LINK( this, ScConflictsDlg, DeselectHandle ) );
428 :
429 0 : m_pBtnKeepMine->SetClickHdl( LINK( this, ScConflictsDlg, KeepMineHandle ) );
430 0 : m_pBtnKeepOther->SetClickHdl( LINK( this, ScConflictsDlg, KeepOtherHandle ) );
431 0 : m_pBtnKeepAllMine->SetClickHdl( LINK( this, ScConflictsDlg, KeepAllMineHandle ) );
432 0 : m_pBtnKeepAllOthers->SetClickHdl( LINK( this, ScConflictsDlg, KeepAllOthersHandle ) );
433 :
434 0 : UpdateView();
435 :
436 0 : SvTreeListEntry* pEntry = m_pLbConflicts->First();
437 0 : if ( pEntry != NULL )
438 : {
439 0 : m_pLbConflicts->Select( pEntry );
440 0 : }
441 0 : }
442 :
443 0 : ScConflictsDlg::~ScConflictsDlg()
444 : {
445 0 : disposeOnce();
446 0 : }
447 :
448 0 : void ScConflictsDlg::dispose()
449 : {
450 0 : m_pLbConflictsContainer.clear();
451 0 : m_pLbConflicts.disposeAndClear();
452 0 : m_pBtnKeepMine.clear();
453 0 : m_pBtnKeepOther.clear();
454 0 : m_pBtnKeepAllMine.clear();
455 0 : m_pBtnKeepAllOthers.clear();
456 0 : ModalDialog::dispose();
457 0 : }
458 :
459 0 : OUString ScConflictsDlg::GetConflictString( const ScConflictsListEntry& rConflictEntry )
460 : {
461 0 : OUString aString;
462 0 : if ( mpOwnTrack )
463 : {
464 0 : const ScChangeAction* pAction = mpOwnTrack->GetAction( rConflictEntry.maOwnActions[ 0 ] );
465 0 : if ( pAction && mpOwnDoc )
466 : {
467 0 : SCTAB nTab = pAction->GetBigRange().MakeRange().aStart.Tab();
468 0 : mpOwnDoc->GetName( nTab, aString );
469 : }
470 : }
471 0 : return aString;
472 : }
473 :
474 0 : OUString ScConflictsDlg::GetActionString( const ScChangeAction* pAction, ScDocument* pDoc )
475 : {
476 0 : OUString aString;
477 :
478 : OSL_ENSURE( pAction, "ScConflictsDlg::GetActionString(): pAction is null!" );
479 : OSL_ENSURE( pDoc, "ScConflictsDlg::GetActionString(): pDoc is null!" );
480 0 : if ( pAction && pDoc )
481 : {
482 0 : OUString aDesc;
483 0 : pAction->GetDescription(aDesc, pDoc, true, false);
484 0 : aString += aDesc;
485 0 : aString += "\t";
486 :
487 0 : OUString aUser = comphelper::string::strip(pAction->GetUser(), ' ');
488 0 : if ( aUser.isEmpty() )
489 : {
490 0 : aUser = maStrUnknownUser;
491 : }
492 0 : aString += aUser;
493 0 : aString += "\t";
494 :
495 0 : DateTime aDateTime = pAction->GetDateTime();
496 0 : aString += ScGlobal::pLocaleData->getDate( aDateTime );
497 0 : aString += " ";
498 0 : aString += ScGlobal::pLocaleData->getTime( aDateTime, false );
499 0 : aString += "\t";
500 : }
501 :
502 0 : return aString;
503 : }
504 :
505 0 : void ScConflictsDlg::HandleListBoxSelection( bool bSelectHandle )
506 : {
507 0 : SvTreeListEntry* pSelEntry = m_pLbConflicts->GetCurEntry();
508 0 : if ( !pSelEntry )
509 : {
510 0 : pSelEntry = m_pLbConflicts->FirstSelected();
511 : }
512 0 : if ( !pSelEntry )
513 : {
514 0 : return;
515 : }
516 :
517 0 : SvTreeListEntry* pRootEntry = m_pLbConflicts->GetRootLevelParent( pSelEntry );
518 0 : if ( pRootEntry )
519 : {
520 0 : if ( bSelectHandle )
521 : {
522 0 : m_pLbConflicts->SelectAll( false );
523 : }
524 0 : if ( !m_pLbConflicts->IsSelected( pRootEntry ) )
525 : {
526 0 : m_pLbConflicts->Select( pRootEntry );
527 : }
528 0 : SvTreeListEntry* pEntry = m_pLbConflicts->FirstChild( pRootEntry );
529 0 : while ( pEntry )
530 : {
531 0 : if ( !m_pLbConflicts->IsSelected( pEntry ) )
532 : {
533 0 : m_pLbConflicts->Select( pEntry );
534 : }
535 0 : pEntry = SvTreeListBox::NextSibling( pEntry );
536 : }
537 : }
538 : }
539 :
540 0 : IMPL_LINK_NOARG(ScConflictsDlg, SelectHandle)
541 : {
542 0 : if ( mbInSelectHdl || mbInDeselectHdl )
543 : {
544 0 : return 0;
545 : }
546 :
547 0 : mbInSelectHdl = true;
548 0 : HandleListBoxSelection( true );
549 0 : maSelectionIdle.Start();
550 0 : mbInSelectHdl = false;
551 :
552 0 : return 0;
553 : }
554 :
555 0 : IMPL_LINK_NOARG(ScConflictsDlg, DeselectHandle)
556 : {
557 0 : if ( mbInDeselectHdl || mbInSelectHdl )
558 : {
559 0 : return 0;
560 : }
561 :
562 0 : mbInDeselectHdl = true;
563 0 : HandleListBoxSelection( false );
564 0 : mbInDeselectHdl = false;
565 :
566 0 : return 0;
567 : }
568 :
569 0 : IMPL_LINK_NOARG_TYPED(ScConflictsDlg, UpdateSelectionHdl, Idle *, void)
570 : {
571 0 : if ( !mpViewData || !mpOwnDoc )
572 : {
573 0 : return;
574 : }
575 :
576 0 : ScTabView* pTabView = mpViewData->GetView();
577 0 : pTabView->DoneBlockMode();
578 0 : bool bContMark = false;
579 0 : SvTreeListEntry* pEntry = m_pLbConflicts->FirstSelected();
580 0 : while ( pEntry )
581 : {
582 0 : if ( pEntry != m_pLbConflicts->GetRootLevelParent( pEntry ) )
583 : {
584 0 : RedlinData* pUserData = static_cast< RedlinData* >( pEntry->GetUserData() );
585 0 : if ( pUserData )
586 : {
587 0 : ScChangeAction* pAction = static_cast< ScChangeAction* >( pUserData->pData );
588 0 : if ( pAction && ( pAction->GetType() != SC_CAT_DELETE_TABS ) &&
589 0 : ( pAction->IsClickable() || pAction->IsVisible() ) )
590 : {
591 0 : const ScBigRange& rBigRange = ( static_cast< const ScChangeAction* >( pAction ) )->GetBigRange();
592 0 : if ( rBigRange.IsValid( mpOwnDoc ) )
593 : {
594 0 : bool bSetCursor = !m_pLbConflicts->NextSelected( pEntry );
595 0 : pTabView->MarkRange( rBigRange.MakeRange(), bSetCursor, bContMark );
596 0 : bContMark = true;
597 : }
598 : }
599 : }
600 : }
601 0 : pEntry = m_pLbConflicts->NextSelected( pEntry );
602 : }
603 : }
604 :
605 0 : void ScConflictsDlg::SetConflictAction( SvTreeListEntry* pRootEntry, ScConflictAction eConflictAction )
606 : {
607 0 : RedlinData* pUserData = static_cast< RedlinData* >( pRootEntry ? pRootEntry->GetUserData() : NULL );
608 0 : ScConflictsListEntry* pConflictEntry = static_cast< ScConflictsListEntry* >( pUserData ? pUserData->pData : NULL );
609 0 : if ( pConflictEntry )
610 : {
611 0 : pConflictEntry->meConflictAction = eConflictAction;
612 : }
613 0 : }
614 :
615 0 : void ScConflictsDlg::KeepHandler( bool bMine )
616 : {
617 0 : SvTreeListEntry* pEntry = m_pLbConflicts->FirstSelected();
618 0 : SvTreeListEntry* pRootEntry = ( pEntry ? m_pLbConflicts->GetRootLevelParent( pEntry ) : NULL );
619 0 : if ( !pRootEntry )
620 : {
621 0 : return;
622 : }
623 0 : SetPointer( Pointer( PointerStyle::Wait ) );
624 0 : ScConflictAction eConflictAction = ( bMine ? SC_CONFLICT_ACTION_KEEP_MINE : SC_CONFLICT_ACTION_KEEP_OTHER );
625 0 : SetConflictAction( pRootEntry, eConflictAction );
626 0 : m_pLbConflicts->RemoveEntry( pRootEntry );
627 0 : SetPointer( Pointer( PointerStyle::Arrow ) );
628 0 : if ( m_pLbConflicts->GetEntryCount() == 0 )
629 : {
630 0 : EndDialog( RET_OK );
631 : }
632 : }
633 :
634 0 : void ScConflictsDlg::KeepAllHandler( bool bMine )
635 : {
636 0 : SvTreeListEntry* pEntry = m_pLbConflicts->First();
637 0 : SvTreeListEntry* pRootEntry = ( pEntry ? m_pLbConflicts->GetRootLevelParent( pEntry ) : NULL );
638 0 : if ( !pRootEntry )
639 : {
640 0 : return;
641 : }
642 0 : SetPointer( Pointer( PointerStyle::Wait ) );
643 0 : ScConflictAction eConflictAction = ( bMine ? SC_CONFLICT_ACTION_KEEP_MINE : SC_CONFLICT_ACTION_KEEP_OTHER );
644 0 : while ( pRootEntry )
645 : {
646 0 : SetConflictAction( pRootEntry, eConflictAction );
647 0 : pRootEntry = SvTreeListBox::NextSibling( pRootEntry );
648 : }
649 0 : m_pLbConflicts->SetUpdateMode( false );
650 0 : m_pLbConflicts->Clear();
651 0 : m_pLbConflicts->SetUpdateMode( true );
652 0 : SetPointer( Pointer( PointerStyle::Arrow ) );
653 0 : EndDialog( RET_OK );
654 : }
655 :
656 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepMineHandle)
657 : {
658 0 : KeepHandler( true );
659 :
660 0 : return 0;
661 : }
662 :
663 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepOtherHandle)
664 : {
665 0 : KeepHandler( false );
666 :
667 0 : return 0;
668 : }
669 :
670 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepAllMineHandle)
671 : {
672 0 : KeepAllHandler( true );
673 :
674 0 : return 0;
675 : }
676 :
677 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepAllOthersHandle)
678 : {
679 0 : KeepAllHandler( false );
680 :
681 0 : return 0;
682 : }
683 :
684 0 : void ScConflictsDlg::UpdateView()
685 : {
686 0 : ScConflictsList::iterator aEndItr = mrConflictsList.end();
687 0 : for ( ScConflictsList::iterator aItr = mrConflictsList.begin(); aItr != aEndItr; ++aItr )
688 : {
689 0 : ScConflictsListEntry* pConflictEntry = &(*aItr);
690 0 : if ( pConflictEntry && pConflictEntry->meConflictAction == SC_CONFLICT_ACTION_NONE )
691 : {
692 0 : RedlinData* pRootUserData = new RedlinData();
693 0 : pRootUserData->pData = static_cast< void* >( pConflictEntry );
694 0 : SvTreeListEntry* pRootEntry = m_pLbConflicts->InsertEntry( GetConflictString( *aItr ), pRootUserData );
695 :
696 0 : ScChangeActionList::const_iterator aEndShared = aItr->maSharedActions.end();
697 0 : for ( ScChangeActionList::const_iterator aItrShared = aItr->maSharedActions.begin(); aItrShared != aEndShared; ++aItrShared )
698 : {
699 0 : ScChangeAction* pAction = mpSharedTrack ? mpSharedTrack->GetAction(*aItrShared) : NULL;
700 0 : if ( pAction )
701 : {
702 : // only display shared top content entries
703 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
704 : {
705 0 : ScChangeActionContent* pNextContent = (dynamic_cast<ScChangeActionContent&>(*pAction)).GetNextContent();
706 0 : if ( pNextContent && aItr->HasSharedAction( pNextContent->GetActionNumber() ) )
707 : {
708 0 : continue;
709 : }
710 : }
711 :
712 0 : OUString aString( GetActionString( pAction, mpSharedDoc ) );
713 0 : m_pLbConflicts->InsertEntry( aString, static_cast< RedlinData* >( NULL ), pRootEntry );
714 : }
715 : }
716 :
717 0 : ScChangeActionList::const_iterator aEndOwn = aItr->maOwnActions.end();
718 0 : for ( ScChangeActionList::const_iterator aItrOwn = aItr->maOwnActions.begin(); aItrOwn != aEndOwn; ++aItrOwn )
719 : {
720 0 : ScChangeAction* pAction = mpOwnTrack ? mpOwnTrack->GetAction(*aItrOwn) : NULL;
721 0 : if ( pAction )
722 : {
723 : // only display own top content entries
724 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
725 : {
726 0 : ScChangeActionContent* pNextContent = ( dynamic_cast<ScChangeActionContent&>(*pAction) ).GetNextContent();
727 0 : if ( pNextContent && aItr->HasOwnAction( pNextContent->GetActionNumber() ) )
728 : {
729 0 : continue;
730 : }
731 : }
732 :
733 0 : OUString aString( GetActionString( pAction, mpOwnDoc ) );
734 0 : RedlinData* pUserData = new RedlinData();
735 0 : pUserData->pData = static_cast< void* >( pAction );
736 0 : m_pLbConflicts->InsertEntry( aString, pUserData, pRootEntry );
737 : }
738 : }
739 :
740 0 : m_pLbConflicts->Expand( pRootEntry );
741 : }
742 : }
743 156 : }
744 :
745 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|