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 0 : ,m_pLbConflictsContainer ( get<SvSimpleTableContainer>("container") )
377 0 : ,m_pLbConflicts ( new SvxRedlinTable(*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, HIB_LEFT | HIB_LEFTIMAGE | HIB_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 : maSelectionTimer.SetTimeout( 100 );
424 0 : maSelectionTimer.SetTimeoutHdl( 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 : }
446 :
447 0 : OUString ScConflictsDlg::GetConflictString( const ScConflictsListEntry& rConflictEntry )
448 : {
449 0 : OUString aString;
450 0 : if ( mpOwnTrack )
451 : {
452 0 : const ScChangeAction* pAction = mpOwnTrack->GetAction( rConflictEntry.maOwnActions[ 0 ] );
453 0 : if ( pAction && mpOwnDoc )
454 : {
455 0 : SCTAB nTab = pAction->GetBigRange().MakeRange().aStart.Tab();
456 0 : mpOwnDoc->GetName( nTab, aString );
457 : }
458 : }
459 0 : return aString;
460 : }
461 :
462 0 : OUString ScConflictsDlg::GetActionString( const ScChangeAction* pAction, ScDocument* pDoc )
463 : {
464 0 : OUString aString;
465 :
466 : OSL_ENSURE( pAction, "ScConflictsDlg::GetActionString(): pAction is null!" );
467 : OSL_ENSURE( pDoc, "ScConflictsDlg::GetActionString(): pDoc is null!" );
468 0 : if ( pAction && pDoc )
469 : {
470 0 : OUString aDesc;
471 0 : pAction->GetDescription(aDesc, pDoc, true, false);
472 0 : aString += aDesc;
473 0 : aString += "\t";
474 :
475 0 : OUString aUser = comphelper::string::strip(pAction->GetUser(), ' ');
476 0 : if ( aUser.isEmpty() )
477 : {
478 0 : aUser = maStrUnknownUser;
479 : }
480 0 : aString += aUser;
481 0 : aString += "\t";
482 :
483 0 : DateTime aDateTime = pAction->GetDateTime();
484 0 : aString += ScGlobal::pLocaleData->getDate( aDateTime );
485 0 : aString += " ";
486 0 : aString += ScGlobal::pLocaleData->getTime( aDateTime, false );
487 0 : aString += "\t";
488 : }
489 :
490 0 : return aString;
491 : }
492 :
493 0 : void ScConflictsDlg::HandleListBoxSelection( bool bSelectHandle )
494 : {
495 0 : SvTreeListEntry* pSelEntry = m_pLbConflicts->GetCurEntry();
496 0 : if ( !pSelEntry )
497 : {
498 0 : pSelEntry = m_pLbConflicts->FirstSelected();
499 : }
500 0 : if ( !pSelEntry )
501 : {
502 0 : return;
503 : }
504 :
505 0 : SvTreeListEntry* pRootEntry = m_pLbConflicts->GetRootLevelParent( pSelEntry );
506 0 : if ( pRootEntry )
507 : {
508 0 : if ( bSelectHandle )
509 : {
510 0 : m_pLbConflicts->SelectAll( false );
511 : }
512 0 : if ( !m_pLbConflicts->IsSelected( pRootEntry ) )
513 : {
514 0 : m_pLbConflicts->Select( pRootEntry );
515 : }
516 0 : SvTreeListEntry* pEntry = m_pLbConflicts->FirstChild( pRootEntry );
517 0 : while ( pEntry )
518 : {
519 0 : if ( !m_pLbConflicts->IsSelected( pEntry ) )
520 : {
521 0 : m_pLbConflicts->Select( pEntry );
522 : }
523 0 : pEntry = m_pLbConflicts->NextSibling( pEntry );
524 : }
525 : }
526 : }
527 :
528 0 : IMPL_LINK_NOARG(ScConflictsDlg, SelectHandle)
529 : {
530 0 : if ( mbInSelectHdl || mbInDeselectHdl )
531 : {
532 0 : return 0;
533 : }
534 :
535 0 : mbInSelectHdl = true;
536 0 : HandleListBoxSelection( true );
537 0 : maSelectionTimer.Start();
538 0 : mbInSelectHdl = false;
539 :
540 0 : return 0;
541 : }
542 :
543 0 : IMPL_LINK_NOARG(ScConflictsDlg, DeselectHandle)
544 : {
545 0 : if ( mbInDeselectHdl || mbInSelectHdl )
546 : {
547 0 : return 0;
548 : }
549 :
550 0 : mbInDeselectHdl = true;
551 0 : HandleListBoxSelection( false );
552 0 : mbInDeselectHdl = false;
553 :
554 0 : return 0;
555 : }
556 :
557 0 : IMPL_LINK_NOARG(ScConflictsDlg, UpdateSelectionHdl)
558 : {
559 0 : if ( !mpViewData || !mpOwnDoc )
560 : {
561 0 : return 0;
562 : }
563 :
564 0 : ScTabView* pTabView = mpViewData->GetView();
565 0 : pTabView->DoneBlockMode();
566 0 : bool bContMark = false;
567 0 : SvTreeListEntry* pEntry = m_pLbConflicts->FirstSelected();
568 0 : while ( pEntry )
569 : {
570 0 : if ( pEntry != m_pLbConflicts->GetRootLevelParent( pEntry ) )
571 : {
572 0 : RedlinData* pUserData = static_cast< RedlinData* >( pEntry->GetUserData() );
573 0 : if ( pUserData )
574 : {
575 0 : ScChangeAction* pAction = static_cast< ScChangeAction* >( pUserData->pData );
576 0 : if ( pAction && ( pAction->GetType() != SC_CAT_DELETE_TABS ) &&
577 0 : ( pAction->IsClickable() || pAction->IsVisible() ) )
578 : {
579 0 : const ScBigRange& rBigRange = ( static_cast< const ScChangeAction* >( pAction ) )->GetBigRange();
580 0 : if ( rBigRange.IsValid( mpOwnDoc ) )
581 : {
582 0 : bool bSetCursor = !m_pLbConflicts->NextSelected( pEntry );
583 0 : pTabView->MarkRange( rBigRange.MakeRange(), bSetCursor, bContMark );
584 0 : bContMark = true;
585 : }
586 : }
587 : }
588 : }
589 0 : pEntry = m_pLbConflicts->NextSelected( pEntry );
590 : }
591 :
592 0 : return 0;
593 : }
594 :
595 0 : void ScConflictsDlg::SetConflictAction( SvTreeListEntry* pRootEntry, ScConflictAction eConflictAction )
596 : {
597 0 : RedlinData* pUserData = static_cast< RedlinData* >( pRootEntry ? pRootEntry->GetUserData() : NULL );
598 0 : ScConflictsListEntry* pConflictEntry = static_cast< ScConflictsListEntry* >( pUserData ? pUserData->pData : NULL );
599 0 : if ( pConflictEntry )
600 : {
601 0 : pConflictEntry->meConflictAction = eConflictAction;
602 : }
603 0 : }
604 :
605 0 : void ScConflictsDlg::KeepHandler( bool bMine )
606 : {
607 0 : SvTreeListEntry* pEntry = m_pLbConflicts->FirstSelected();
608 0 : SvTreeListEntry* pRootEntry = ( pEntry ? m_pLbConflicts->GetRootLevelParent( pEntry ) : NULL );
609 0 : if ( !pRootEntry )
610 : {
611 0 : return;
612 : }
613 0 : SetPointer( Pointer( POINTER_WAIT ) );
614 0 : ScConflictAction eConflictAction = ( bMine ? SC_CONFLICT_ACTION_KEEP_MINE : SC_CONFLICT_ACTION_KEEP_OTHER );
615 0 : SetConflictAction( pRootEntry, eConflictAction );
616 0 : m_pLbConflicts->RemoveEntry( pRootEntry );
617 0 : SetPointer( Pointer( POINTER_ARROW ) );
618 0 : if ( m_pLbConflicts->GetEntryCount() == 0 )
619 : {
620 0 : EndDialog( RET_OK );
621 : }
622 : }
623 :
624 0 : void ScConflictsDlg::KeepAllHandler( bool bMine )
625 : {
626 0 : SvTreeListEntry* pEntry = m_pLbConflicts->First();
627 0 : SvTreeListEntry* pRootEntry = ( pEntry ? m_pLbConflicts->GetRootLevelParent( pEntry ) : NULL );
628 0 : if ( !pRootEntry )
629 : {
630 0 : return;
631 : }
632 0 : SetPointer( Pointer( POINTER_WAIT ) );
633 0 : ScConflictAction eConflictAction = ( bMine ? SC_CONFLICT_ACTION_KEEP_MINE : SC_CONFLICT_ACTION_KEEP_OTHER );
634 0 : while ( pRootEntry )
635 : {
636 0 : SetConflictAction( pRootEntry, eConflictAction );
637 0 : pRootEntry = m_pLbConflicts->NextSibling( pRootEntry );
638 : }
639 0 : m_pLbConflicts->SetUpdateMode( false );
640 0 : m_pLbConflicts->Clear();
641 0 : m_pLbConflicts->SetUpdateMode( true );
642 0 : SetPointer( Pointer( POINTER_ARROW ) );
643 0 : EndDialog( RET_OK );
644 : }
645 :
646 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepMineHandle)
647 : {
648 0 : KeepHandler( true );
649 :
650 0 : return 0;
651 : }
652 :
653 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepOtherHandle)
654 : {
655 0 : KeepHandler( false );
656 :
657 0 : return 0;
658 : }
659 :
660 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepAllMineHandle)
661 : {
662 0 : KeepAllHandler( true );
663 :
664 0 : return 0;
665 : }
666 :
667 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepAllOthersHandle)
668 : {
669 0 : KeepAllHandler( false );
670 :
671 0 : return 0;
672 : }
673 :
674 0 : void ScConflictsDlg::UpdateView()
675 : {
676 0 : ScConflictsList::iterator aEndItr = mrConflictsList.end();
677 0 : for ( ScConflictsList::iterator aItr = mrConflictsList.begin(); aItr != aEndItr; ++aItr )
678 : {
679 0 : ScConflictsListEntry* pConflictEntry = &(*aItr);
680 0 : if ( pConflictEntry && pConflictEntry->meConflictAction == SC_CONFLICT_ACTION_NONE )
681 : {
682 0 : RedlinData* pRootUserData = new RedlinData();
683 0 : pRootUserData->pData = static_cast< void* >( pConflictEntry );
684 0 : SvTreeListEntry* pRootEntry = m_pLbConflicts->InsertEntry( GetConflictString( *aItr ), pRootUserData );
685 :
686 0 : ScChangeActionList::const_iterator aEndShared = aItr->maSharedActions.end();
687 0 : for ( ScChangeActionList::const_iterator aItrShared = aItr->maSharedActions.begin(); aItrShared != aEndShared; ++aItrShared )
688 : {
689 0 : ScChangeAction* pAction = mpSharedTrack ? mpSharedTrack->GetAction(*aItrShared) : NULL;
690 0 : if ( pAction )
691 : {
692 : // only display shared top content entries
693 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
694 : {
695 0 : ScChangeActionContent* pNextContent = (dynamic_cast<ScChangeActionContent&>(*pAction)).GetNextContent();
696 0 : if ( pNextContent && aItr->HasSharedAction( pNextContent->GetActionNumber() ) )
697 : {
698 0 : continue;
699 : }
700 : }
701 :
702 0 : OUString aString( GetActionString( pAction, mpSharedDoc ) );
703 0 : m_pLbConflicts->InsertEntry( aString, static_cast< RedlinData* >( NULL ), pRootEntry );
704 : }
705 : }
706 :
707 0 : ScChangeActionList::const_iterator aEndOwn = aItr->maOwnActions.end();
708 0 : for ( ScChangeActionList::const_iterator aItrOwn = aItr->maOwnActions.begin(); aItrOwn != aEndOwn; ++aItrOwn )
709 : {
710 0 : ScChangeAction* pAction = mpOwnTrack ? mpOwnTrack->GetAction(*aItrOwn) : NULL;
711 0 : if ( pAction )
712 : {
713 : // only display own top content entries
714 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
715 : {
716 0 : ScChangeActionContent* pNextContent = ( dynamic_cast<ScChangeActionContent&>(*pAction) ).GetNextContent();
717 0 : if ( pNextContent && aItr->HasOwnAction( pNextContent->GetActionNumber() ) )
718 : {
719 0 : continue;
720 : }
721 : }
722 :
723 0 : OUString aString( GetActionString( pAction, mpOwnDoc ) );
724 0 : RedlinData* pUserData = new RedlinData();
725 0 : pUserData->pData = static_cast< void* >( pAction );
726 0 : m_pLbConflicts->InsertEntry( aString, pUserData, pRootEntry );
727 : }
728 : }
729 :
730 0 : m_pLbConflicts->Expand( pRootEntry );
731 : }
732 : }
733 228 : }
734 :
735 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|