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 "conflictsdlg.hrc"
25 : #include "scresid.hxx"
26 : #include "viewdata.hxx"
27 : #include "dbfunc.hxx"
28 :
29 : // struct ScConflictsListEntry
30 :
31 :
32 0 : bool ScConflictsListEntry::HasSharedAction( sal_uLong nSharedAction ) const
33 : {
34 0 : ScChangeActionList::const_iterator aEnd = maSharedActions.end();
35 0 : for ( ScChangeActionList::const_iterator aItr = maSharedActions.begin(); aItr != aEnd; ++aItr )
36 : {
37 0 : if ( *aItr == nSharedAction )
38 : {
39 0 : return true;
40 : }
41 : }
42 :
43 0 : return false;
44 : }
45 :
46 0 : bool ScConflictsListEntry::HasOwnAction( sal_uLong nOwnAction ) const
47 : {
48 0 : ScChangeActionList::const_iterator aEnd = maOwnActions.end();
49 0 : for ( ScChangeActionList::const_iterator aItr = maOwnActions.begin(); aItr != aEnd; ++aItr )
50 : {
51 0 : if ( *aItr == nOwnAction )
52 : {
53 0 : return true;
54 : }
55 : }
56 :
57 0 : return false;
58 : }
59 :
60 : // class ScConflictsListHelper
61 :
62 :
63 0 : bool ScConflictsListHelper::HasOwnAction( ScConflictsList& rConflictsList, sal_uLong nOwnAction )
64 : {
65 0 : ScConflictsList::const_iterator aEnd = rConflictsList.end();
66 0 : for ( ScConflictsList::const_iterator aItr = rConflictsList.begin(); aItr != aEnd; ++aItr )
67 : {
68 0 : if ( aItr->HasOwnAction( nOwnAction ) )
69 : {
70 0 : return true;
71 : }
72 : }
73 :
74 0 : return false;
75 : }
76 :
77 0 : ScConflictsListEntry* ScConflictsListHelper::GetSharedActionEntry( ScConflictsList& rConflictsList, sal_uLong nSharedAction )
78 : {
79 0 : ScConflictsList::iterator aEnd = rConflictsList.end();
80 0 : for ( ScConflictsList::iterator aItr = rConflictsList.begin(); aItr != aEnd; ++aItr )
81 : {
82 0 : if ( aItr->HasSharedAction( nSharedAction ) )
83 : {
84 0 : return &(*aItr);
85 : }
86 : }
87 :
88 0 : return NULL;
89 : }
90 :
91 0 : ScConflictsListEntry* ScConflictsListHelper::GetOwnActionEntry( ScConflictsList& rConflictsList, sal_uLong nOwnAction )
92 : {
93 0 : ScConflictsList::iterator aEnd = rConflictsList.end();
94 0 : for ( ScConflictsList::iterator aItr = rConflictsList.begin(); aItr != aEnd; ++aItr )
95 : {
96 0 : if ( aItr->HasOwnAction( nOwnAction ) )
97 : {
98 0 : return &(*aItr);
99 : }
100 : }
101 :
102 0 : return NULL;
103 : }
104 :
105 0 : void ScConflictsListHelper::Transform_Impl( ScChangeActionList& rActionList, ScChangeActionMergeMap* pMergeMap )
106 : {
107 0 : if ( !pMergeMap )
108 : {
109 0 : return;
110 : }
111 :
112 0 : for ( ScChangeActionList::iterator aItr = rActionList.begin(); aItr != rActionList.end(); )
113 : {
114 0 : ScChangeActionMergeMap::iterator aItrMap = pMergeMap->find( *aItr );
115 0 : if ( aItrMap != pMergeMap->end() )
116 : {
117 0 : *aItr = aItrMap->second;
118 0 : ++aItr;
119 : }
120 : else
121 : {
122 0 : aItr = rActionList.erase( aItr );
123 : OSL_FAIL( "ScConflictsListHelper::Transform_Impl: erased action from conflicts list!" );
124 : }
125 : }
126 : }
127 :
128 0 : void ScConflictsListHelper::TransformConflictsList( ScConflictsList& rConflictsList,
129 : ScChangeActionMergeMap* pSharedMap, ScChangeActionMergeMap* pOwnMap )
130 : {
131 0 : ScConflictsList::iterator aEnd = rConflictsList.end();
132 0 : for ( ScConflictsList::iterator aItr = rConflictsList.begin(); aItr != aEnd; ++aItr )
133 : {
134 0 : if ( pSharedMap )
135 : {
136 0 : ScConflictsListHelper::Transform_Impl( aItr->maSharedActions, pSharedMap );
137 : }
138 :
139 0 : if ( pOwnMap )
140 : {
141 0 : ScConflictsListHelper::Transform_Impl( aItr->maOwnActions, pOwnMap );
142 : }
143 : }
144 0 : }
145 :
146 : // class ScConflictsFinder
147 :
148 :
149 0 : ScConflictsFinder::ScConflictsFinder( ScChangeTrack* pTrack, sal_uLong nStartShared, sal_uLong nEndShared,
150 : sal_uLong nStartOwn, sal_uLong nEndOwn, ScConflictsList& rConflictsList )
151 : :mpTrack( pTrack )
152 : ,mnStartShared( nStartShared )
153 : ,mnEndShared( nEndShared )
154 : ,mnStartOwn( nStartOwn )
155 : ,mnEndOwn( nEndOwn )
156 0 : ,mrConflictsList( rConflictsList )
157 : {
158 0 : }
159 :
160 0 : ScConflictsFinder::~ScConflictsFinder()
161 : {
162 0 : }
163 :
164 0 : bool ScConflictsFinder::DoActionsIntersect( const ScChangeAction* pAction1, const ScChangeAction* pAction2 )
165 : {
166 0 : if ( pAction1 && pAction2 && pAction1->GetBigRange().Intersects( pAction2->GetBigRange() ) )
167 : {
168 0 : return true;
169 : }
170 0 : return false;
171 : }
172 :
173 0 : ScConflictsListEntry* ScConflictsFinder::GetIntersectingEntry( const ScChangeAction* pAction ) const
174 : {
175 0 : ScConflictsList::iterator aEnd = mrConflictsList.end();
176 0 : for ( ScConflictsList::iterator aItr = mrConflictsList.begin(); aItr != aEnd; ++aItr )
177 : {
178 0 : ScChangeActionList::const_iterator aEndShared = aItr->maSharedActions.end();
179 0 : for ( ScChangeActionList::const_iterator aItrShared = aItr->maSharedActions.begin(); aItrShared != aEndShared; ++aItrShared )
180 : {
181 0 : if ( DoActionsIntersect( mpTrack->GetAction( *aItrShared ), pAction ) )
182 : {
183 0 : return &(*aItr);
184 : }
185 : }
186 :
187 0 : ScChangeActionList::const_iterator aEndOwn = aItr->maOwnActions.end();
188 0 : for ( ScChangeActionList::const_iterator aItrOwn = aItr->maOwnActions.begin(); aItrOwn != aEndOwn; ++aItrOwn )
189 : {
190 0 : if ( DoActionsIntersect( mpTrack->GetAction( *aItrOwn ), pAction ) )
191 : {
192 0 : return &(*aItr);
193 : }
194 : }
195 : }
196 :
197 0 : return NULL;
198 : }
199 :
200 0 : ScConflictsListEntry* ScConflictsFinder::GetEntry( sal_uLong nSharedAction, const ScChangeActionList& rOwnActions )
201 : {
202 : // try to get a list entry which already contains the shared action
203 0 : ScConflictsListEntry* pEntry = ScConflictsListHelper::GetSharedActionEntry( mrConflictsList, nSharedAction );
204 0 : if ( pEntry )
205 : {
206 0 : return pEntry;
207 : }
208 :
209 : // try to get a list entry for which the shared action intersects with any
210 : // other action of this entry
211 0 : pEntry = GetIntersectingEntry( mpTrack->GetAction( nSharedAction ) );
212 0 : if ( pEntry )
213 : {
214 0 : pEntry->maSharedActions.push_back( nSharedAction );
215 0 : return pEntry;
216 : }
217 :
218 : // try to get a list entry for which any of the own actions intersects with
219 : // any other action of this entry
220 0 : ScChangeActionList::const_iterator aEnd = rOwnActions.end();
221 0 : for ( ScChangeActionList::const_iterator aItr = rOwnActions.begin(); aItr != aEnd; ++aItr )
222 : {
223 0 : pEntry = GetIntersectingEntry( mpTrack->GetAction( *aItr ) );
224 0 : if ( pEntry )
225 : {
226 0 : pEntry->maSharedActions.push_back( nSharedAction );
227 0 : return pEntry;
228 : }
229 : }
230 :
231 : // if no entry was found, create a new one
232 0 : ScConflictsListEntry aEntry;
233 0 : aEntry.meConflictAction = SC_CONFLICT_ACTION_NONE;
234 0 : aEntry.maSharedActions.push_back( nSharedAction );
235 0 : mrConflictsList.push_back( aEntry );
236 0 : return &(mrConflictsList.back());
237 : }
238 :
239 0 : bool ScConflictsFinder::Find()
240 : {
241 0 : if ( !mpTrack )
242 : {
243 0 : return false;
244 : }
245 :
246 0 : bool bReturn = false;
247 0 : ScChangeAction* pSharedAction = mpTrack->GetAction( mnStartShared );
248 0 : while ( pSharedAction && pSharedAction->GetActionNumber() <= mnEndShared )
249 : {
250 0 : ScChangeActionList aOwnActions;
251 0 : ScChangeAction* pOwnAction = mpTrack->GetAction( mnStartOwn );
252 0 : while ( pOwnAction && pOwnAction->GetActionNumber() <= mnEndOwn )
253 : {
254 0 : if ( DoActionsIntersect( pSharedAction, pOwnAction ) )
255 : {
256 0 : aOwnActions.push_back( pOwnAction->GetActionNumber() );
257 : }
258 0 : pOwnAction = pOwnAction->GetNext();
259 : }
260 :
261 0 : if ( aOwnActions.size() )
262 : {
263 0 : ScConflictsListEntry* pEntry = GetEntry( pSharedAction->GetActionNumber(), aOwnActions );
264 0 : ScChangeActionList::iterator aEnd = aOwnActions.end();
265 0 : for ( ScChangeActionList::iterator aItr = aOwnActions.begin(); aItr != aEnd; ++aItr )
266 : {
267 0 : if ( pEntry && !ScConflictsListHelper::HasOwnAction( mrConflictsList, *aItr ) )
268 : {
269 0 : pEntry->maOwnActions.push_back( *aItr );
270 : }
271 : }
272 0 : bReturn = true;
273 : }
274 :
275 0 : pSharedAction = pSharedAction->GetNext();
276 0 : }
277 :
278 0 : return bReturn;
279 : }
280 :
281 :
282 : // class ScConflictsResolver
283 :
284 :
285 0 : ScConflictsResolver::ScConflictsResolver( ScChangeTrack* pTrack, ScConflictsList& rConflictsList )
286 : :mpTrack ( pTrack )
287 0 : ,mrConflictsList ( rConflictsList )
288 : {
289 : OSL_ENSURE( mpTrack, "ScConflictsResolver CTOR: mpTrack is null!" );
290 0 : }
291 :
292 0 : ScConflictsResolver::~ScConflictsResolver()
293 : {
294 0 : }
295 :
296 0 : void ScConflictsResolver::HandleAction( ScChangeAction* pAction, bool bIsSharedAction,
297 : bool bHandleContentAction, bool bHandleNonContentAction )
298 : {
299 0 : if ( !mpTrack || !pAction )
300 : {
301 0 : return;
302 : }
303 :
304 0 : if ( bIsSharedAction )
305 : {
306 : ScConflictsListEntry* pConflictEntry = ScConflictsListHelper::GetSharedActionEntry(
307 0 : mrConflictsList, pAction->GetActionNumber() );
308 0 : if ( pConflictEntry )
309 : {
310 0 : ScConflictAction eConflictAction = pConflictEntry->meConflictAction;
311 0 : if ( eConflictAction == SC_CONFLICT_ACTION_KEEP_MINE )
312 : {
313 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
314 : {
315 0 : if ( bHandleContentAction )
316 : {
317 0 : mpTrack->Reject( pAction );
318 : }
319 : }
320 : else
321 : {
322 0 : if ( bHandleNonContentAction )
323 : {
324 0 : mpTrack->Reject( pAction );
325 : }
326 : }
327 : }
328 : }
329 : }
330 : else
331 : {
332 : ScConflictsListEntry* pConflictEntry = ScConflictsListHelper::GetOwnActionEntry(
333 0 : mrConflictsList, pAction->GetActionNumber() );
334 0 : if ( pConflictEntry )
335 : {
336 0 : ScConflictAction eConflictAction = pConflictEntry->meConflictAction;
337 0 : if ( eConflictAction == SC_CONFLICT_ACTION_KEEP_MINE )
338 : {
339 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
340 : {
341 : if ( bHandleContentAction )
342 : {
343 : // do nothing
344 : //mpTrack->SelectContent( pAction );
345 : }
346 : }
347 : else
348 : {
349 : if ( bHandleNonContentAction )
350 : {
351 : // do nothing
352 : //mpTrack->Accept( pAction );
353 : }
354 : }
355 : }
356 0 : else if ( eConflictAction == SC_CONFLICT_ACTION_KEEP_OTHER )
357 : {
358 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
359 : {
360 0 : if ( bHandleContentAction )
361 : {
362 0 : mpTrack->Reject( pAction );
363 : }
364 : }
365 : else
366 : {
367 0 : if ( bHandleNonContentAction )
368 : {
369 0 : mpTrack->Reject( pAction );
370 : }
371 : }
372 : }
373 : }
374 : }
375 : }
376 :
377 :
378 : // class ScConflictsDlg
379 :
380 :
381 0 : ScConflictsDlg::ScConflictsDlg( Window* pParent, ScViewData* pViewData, ScDocument* pSharedDoc, ScConflictsList& rConflictsList )
382 : :ModalDialog( pParent, ScResId( RID_SCDLG_CONFLICTS ) )
383 : ,maFtConflicts ( this, ScResId( FT_CONFLICTS ) )
384 : ,m_aLbConflictsContainer(this, ScResId( LB_CONFLICTS))
385 : ,maLbConflicts(m_aLbConflictsContainer)
386 : ,maBtnKeepMine ( this, ScResId( BTN_KEEPMINE ) )
387 : ,maBtnKeepOther ( this, ScResId( BTN_KEEPOTHER ) )
388 : ,maFlConflicts ( this, ScResId( FL_CONFLICTS ) )
389 : ,maBtnKeepAllMine ( this, ScResId( BTN_KEEPALLMINE ) )
390 : ,maBtnKeepAllOthers ( this, ScResId( BTN_KEEPALLOTHERS ) )
391 : ,maBtnCancel ( this, ScResId( BTN_CANCEL ) )
392 : ,maBtnHelp ( this, ScResId( BTN_HELP ) )
393 : ,maStrTitleConflict ( ScResId( STR_TITLE_CONFLICT ) )
394 : ,maStrTitleAuthor ( ScResId( STR_TITLE_AUTHOR ) )
395 : ,maStrTitleDate ( ScResId( STR_TITLE_DATE ) )
396 : ,maStrUnknownUser ( ScResId( STR_UNKNOWN_USER ) )
397 : ,mpViewData ( pViewData )
398 : ,mpOwnDoc ( NULL )
399 : ,mpOwnTrack ( NULL )
400 : ,mpSharedDoc ( pSharedDoc )
401 : ,mpSharedTrack ( NULL )
402 : ,mrConflictsList ( rConflictsList )
403 0 : ,maDialogSize ( GetSizePixel() )
404 : ,mbInSelectHdl ( false )
405 0 : ,mbInDeselectHdl ( false )
406 : {
407 : OSL_ENSURE( mpViewData, "ScConflictsDlg CTOR: mpViewData is null!" );
408 0 : mpOwnDoc = ( mpViewData ? mpViewData->GetDocument() : NULL );
409 : OSL_ENSURE( mpOwnDoc, "ScConflictsDlg CTOR: mpOwnDoc is null!" );
410 0 : mpOwnTrack = ( mpOwnDoc ? mpOwnDoc->GetChangeTrack() : NULL );
411 : OSL_ENSURE( mpOwnTrack, "ScConflictsDlg CTOR: mpOwnTrack is null!" );
412 : OSL_ENSURE( mpSharedDoc, "ScConflictsDlg CTOR: mpSharedDoc is null!" );
413 0 : mpSharedTrack = ( mpSharedDoc ? mpSharedDoc->GetChangeTrack() : NULL );
414 : OSL_ENSURE( mpSharedTrack, "ScConflictsDlg CTOR: mpSharedTrack is null!" );
415 :
416 0 : FreeResource();
417 :
418 0 : SetMinOutputSizePixel( maDialogSize );
419 :
420 0 : long nTabs[] = { 3, 10, 216, 266 };
421 0 : maLbConflicts.SetTabs( nTabs );
422 :
423 0 : OUString aTab('\t');
424 0 : OUString aHeader( maStrTitleConflict );
425 0 : aHeader += aTab;
426 0 : aHeader += maStrTitleAuthor;
427 0 : aHeader += aTab;
428 0 : aHeader += maStrTitleDate;
429 0 : maLbConflicts.InsertHeaderEntry( aHeader, HEADERBAR_APPEND, HIB_LEFT | HIB_LEFTIMAGE | HIB_VCENTER );
430 :
431 0 : maLbConflicts.SetStyle( maLbConflicts.GetStyle() | WB_HASLINES | WB_CLIPCHILDREN | WB_HASBUTTONS | WB_HASBUTTONSATROOT | WB_HSCROLL );
432 0 : maLbConflicts.SetSelectionMode( MULTIPLE_SELECTION );
433 0 : maLbConflicts.SetHighlightRange();
434 :
435 0 : maSelectionTimer.SetTimeout( 100 );
436 0 : maSelectionTimer.SetTimeoutHdl( LINK( this, ScConflictsDlg, UpdateSelectionHdl ) );
437 :
438 0 : maLbConflicts.SetSelectHdl( LINK( this, ScConflictsDlg, SelectHandle ) );
439 0 : maLbConflicts.SetDeselectHdl( LINK( this, ScConflictsDlg, DeselectHandle ) );
440 :
441 0 : maBtnKeepMine.SetClickHdl( LINK( this, ScConflictsDlg, KeepMineHandle ) );
442 0 : maBtnKeepOther.SetClickHdl( LINK( this, ScConflictsDlg, KeepOtherHandle ) );
443 0 : maBtnKeepAllMine.SetClickHdl( LINK( this, ScConflictsDlg, KeepAllMineHandle ) );
444 0 : maBtnKeepAllOthers.SetClickHdl( LINK( this, ScConflictsDlg, KeepAllOthersHandle ) );
445 :
446 0 : UpdateView();
447 :
448 0 : SvTreeListEntry* pEntry = maLbConflicts.First();
449 0 : if ( pEntry != NULL )
450 : {
451 0 : maLbConflicts.Select( pEntry );
452 0 : }
453 0 : }
454 :
455 0 : ScConflictsDlg::~ScConflictsDlg()
456 : {
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 = maLbConflicts.GetCurEntry();
508 0 : if ( !pSelEntry )
509 : {
510 0 : pSelEntry = maLbConflicts.FirstSelected();
511 : }
512 0 : if ( !pSelEntry )
513 : {
514 0 : return;
515 : }
516 :
517 0 : SvTreeListEntry* pRootEntry = maLbConflicts.GetRootLevelParent( pSelEntry );
518 0 : if ( pRootEntry )
519 : {
520 0 : if ( bSelectHandle )
521 : {
522 0 : maLbConflicts.SelectAll( false );
523 : }
524 0 : if ( !maLbConflicts.IsSelected( pRootEntry ) )
525 : {
526 0 : maLbConflicts.Select( pRootEntry );
527 : }
528 0 : SvTreeListEntry* pEntry = maLbConflicts.FirstChild( pRootEntry );
529 0 : while ( pEntry )
530 : {
531 0 : if ( !maLbConflicts.IsSelected( pEntry ) )
532 : {
533 0 : maLbConflicts.Select( pEntry );
534 : }
535 0 : pEntry = maLbConflicts.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 : maSelectionTimer.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(ScConflictsDlg, UpdateSelectionHdl)
570 : {
571 0 : if ( !mpViewData || !mpOwnDoc )
572 : {
573 0 : return 0;
574 : }
575 :
576 0 : ScTabView* pTabView = mpViewData->GetView();
577 0 : pTabView->DoneBlockMode();
578 0 : sal_Bool bContMark = false;
579 0 : SvTreeListEntry* pEntry = maLbConflicts.FirstSelected();
580 0 : while ( pEntry )
581 : {
582 0 : if ( pEntry != maLbConflicts.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 : sal_Bool bSetCursor = !maLbConflicts.NextSelected( pEntry );
595 0 : pTabView->MarkRange( rBigRange.MakeRange(), bSetCursor, bContMark );
596 0 : bContMark = sal_True;
597 : }
598 : }
599 : }
600 : }
601 0 : pEntry = maLbConflicts.NextSelected( pEntry );
602 : }
603 :
604 0 : return 0;
605 : }
606 :
607 0 : void ScConflictsDlg::SetConflictAction( SvTreeListEntry* pRootEntry, ScConflictAction eConflictAction )
608 : {
609 0 : RedlinData* pUserData = static_cast< RedlinData* >( pRootEntry ? pRootEntry->GetUserData() : NULL );
610 0 : ScConflictsListEntry* pConflictEntry = static_cast< ScConflictsListEntry* >( pUserData ? pUserData->pData : NULL );
611 0 : if ( pConflictEntry )
612 : {
613 0 : pConflictEntry->meConflictAction = eConflictAction;
614 : }
615 0 : }
616 :
617 0 : void ScConflictsDlg::KeepHandler( bool bMine )
618 : {
619 0 : SvTreeListEntry* pEntry = maLbConflicts.FirstSelected();
620 0 : SvTreeListEntry* pRootEntry = ( pEntry ? maLbConflicts.GetRootLevelParent( pEntry ) : NULL );
621 0 : if ( !pRootEntry )
622 : {
623 0 : return;
624 : }
625 0 : SetPointer( Pointer( POINTER_WAIT ) );
626 0 : ScConflictAction eConflictAction = ( bMine ? SC_CONFLICT_ACTION_KEEP_MINE : SC_CONFLICT_ACTION_KEEP_OTHER );
627 0 : SetConflictAction( pRootEntry, eConflictAction );
628 0 : maLbConflicts.RemoveEntry( pRootEntry );
629 0 : SetPointer( Pointer( POINTER_ARROW ) );
630 0 : if ( maLbConflicts.GetEntryCount() == 0 )
631 : {
632 0 : EndDialog( RET_OK );
633 : }
634 : }
635 :
636 0 : void ScConflictsDlg::KeepAllHandler( bool bMine )
637 : {
638 0 : SvTreeListEntry* pEntry = maLbConflicts.First();
639 0 : SvTreeListEntry* pRootEntry = ( pEntry ? maLbConflicts.GetRootLevelParent( pEntry ) : NULL );
640 0 : if ( !pRootEntry )
641 : {
642 0 : return;
643 : }
644 0 : SetPointer( Pointer( POINTER_WAIT ) );
645 0 : ScConflictAction eConflictAction = ( bMine ? SC_CONFLICT_ACTION_KEEP_MINE : SC_CONFLICT_ACTION_KEEP_OTHER );
646 0 : while ( pRootEntry )
647 : {
648 0 : SetConflictAction( pRootEntry, eConflictAction );
649 0 : pRootEntry = maLbConflicts.NextSibling( pRootEntry );
650 : }
651 0 : maLbConflicts.SetUpdateMode( false );
652 0 : maLbConflicts.Clear();
653 0 : maLbConflicts.SetUpdateMode( true );
654 0 : SetPointer( Pointer( POINTER_ARROW ) );
655 0 : EndDialog( RET_OK );
656 : }
657 :
658 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepMineHandle)
659 : {
660 0 : KeepHandler( true );
661 :
662 0 : return 0;
663 : }
664 :
665 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepOtherHandle)
666 : {
667 0 : KeepHandler( false );
668 :
669 0 : return 0;
670 : }
671 :
672 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepAllMineHandle)
673 : {
674 0 : KeepAllHandler( true );
675 :
676 0 : return 0;
677 : }
678 :
679 0 : IMPL_LINK_NOARG(ScConflictsDlg, KeepAllOthersHandle)
680 : {
681 0 : KeepAllHandler( false );
682 :
683 0 : return 0;
684 : }
685 :
686 0 : static void lcl_MoveControlX( Window& rWindow, long nDelta )
687 : {
688 0 : Point aPos( rWindow.GetPosPixel() );
689 0 : aPos.X() += nDelta;
690 0 : rWindow.SetPosPixel( aPos );
691 0 : }
692 :
693 0 : static void lcl_MoveControlY( Window& rWindow, long nDelta )
694 : {
695 0 : Point aPos( rWindow.GetPosPixel() );
696 0 : aPos.Y() += nDelta;
697 0 : rWindow.SetPosPixel( aPos );
698 0 : }
699 :
700 0 : static void lcl_ChangeControlWidth( Window& rWindow, long nDelta )
701 : {
702 0 : Size aSize( rWindow.GetSizePixel() );
703 0 : aSize.Width() += nDelta;
704 0 : rWindow.SetSizePixel( aSize );
705 0 : }
706 :
707 0 : static void lcl_ChangeControlHeight( Window& rWindow, long nDelta )
708 : {
709 0 : Size aSize( rWindow.GetSizePixel() );
710 0 : aSize.Height() += nDelta;
711 0 : rWindow.SetSizePixel( aSize );
712 0 : }
713 :
714 0 : void ScConflictsDlg::Resize()
715 : {
716 0 : Size aSize( GetSizePixel() );
717 0 : long nDeltaWidth = aSize.Width() - maDialogSize.Width();
718 0 : long nDeltaHeight = aSize.Height() - maDialogSize.Height();
719 0 : maDialogSize = aSize;
720 :
721 0 : lcl_ChangeControlWidth( maFtConflicts, nDeltaWidth );
722 :
723 0 : lcl_ChangeControlWidth( m_aLbConflictsContainer, nDeltaWidth );
724 0 : lcl_ChangeControlHeight( m_aLbConflictsContainer, nDeltaHeight );
725 :
726 0 : lcl_MoveControlX( maBtnKeepMine, nDeltaWidth / 2 );
727 0 : lcl_MoveControlY( maBtnKeepMine, nDeltaHeight );
728 :
729 0 : lcl_MoveControlX( maBtnKeepOther, nDeltaWidth / 2 );
730 0 : lcl_MoveControlY( maBtnKeepOther, nDeltaHeight );
731 :
732 0 : lcl_MoveControlY( maFlConflicts, nDeltaHeight );
733 0 : lcl_ChangeControlWidth( maFlConflicts, nDeltaWidth );
734 :
735 0 : lcl_MoveControlX( maBtnKeepAllMine, nDeltaWidth );
736 0 : lcl_MoveControlY( maBtnKeepAllMine, nDeltaHeight );
737 :
738 0 : lcl_MoveControlX( maBtnKeepAllOthers, nDeltaWidth );
739 0 : lcl_MoveControlY( maBtnKeepAllOthers, nDeltaHeight );
740 :
741 0 : lcl_MoveControlX( maBtnCancel, nDeltaWidth );
742 0 : lcl_MoveControlY( maBtnCancel, nDeltaHeight );
743 :
744 0 : lcl_MoveControlX( maBtnHelp, nDeltaWidth );
745 0 : lcl_MoveControlY( maBtnHelp, nDeltaHeight );
746 0 : }
747 :
748 0 : void ScConflictsDlg::UpdateView()
749 : {
750 0 : ScConflictsList::iterator aEndItr = mrConflictsList.end();
751 0 : for ( ScConflictsList::iterator aItr = mrConflictsList.begin(); aItr != aEndItr; ++aItr )
752 : {
753 0 : ScConflictsListEntry* pConflictEntry = &(*aItr);
754 0 : if ( pConflictEntry && pConflictEntry->meConflictAction == SC_CONFLICT_ACTION_NONE )
755 : {
756 0 : RedlinData* pRootUserData = new RedlinData();
757 0 : pRootUserData->pData = static_cast< void* >( pConflictEntry );
758 0 : SvTreeListEntry* pRootEntry = maLbConflicts.InsertEntry( GetConflictString( *aItr ), pRootUserData );
759 :
760 0 : ScChangeActionList::const_iterator aEndShared = aItr->maSharedActions.end();
761 0 : for ( ScChangeActionList::const_iterator aItrShared = aItr->maSharedActions.begin(); aItrShared != aEndShared; ++aItrShared )
762 : {
763 0 : ScChangeAction* pAction = mpSharedTrack->GetAction( *aItrShared );
764 0 : if ( pAction )
765 : {
766 : // only display shared top content entries
767 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
768 : {
769 0 : ScChangeActionContent* pNextContent = ( dynamic_cast< ScChangeActionContent* >( pAction ) )->GetNextContent();
770 0 : if ( pNextContent && aItr->HasSharedAction( pNextContent->GetActionNumber() ) )
771 : {
772 0 : continue;
773 : }
774 : }
775 :
776 0 : OUString aString( GetActionString( pAction, mpSharedDoc ) );
777 0 : maLbConflicts.InsertEntry( aString, static_cast< RedlinData* >( NULL ), pRootEntry );
778 : }
779 : }
780 :
781 0 : ScChangeActionList::const_iterator aEndOwn = aItr->maOwnActions.end();
782 0 : for ( ScChangeActionList::const_iterator aItrOwn = aItr->maOwnActions.begin(); aItrOwn != aEndOwn; ++aItrOwn )
783 : {
784 0 : ScChangeAction* pAction = mpOwnTrack->GetAction( *aItrOwn );
785 0 : if ( pAction )
786 : {
787 : // only display own top content entries
788 0 : if ( pAction->GetType() == SC_CAT_CONTENT )
789 : {
790 0 : ScChangeActionContent* pNextContent = ( dynamic_cast< ScChangeActionContent* >( pAction ) )->GetNextContent();
791 0 : if ( pNextContent && aItr->HasOwnAction( pNextContent->GetActionNumber() ) )
792 : {
793 0 : continue;
794 : }
795 : }
796 :
797 0 : OUString aString( GetActionString( pAction, mpOwnDoc ) );
798 0 : RedlinData* pUserData = new RedlinData();
799 0 : pUserData->pData = static_cast< void* >( pAction );
800 0 : maLbConflicts.InsertEntry( aString, pUserData, pRootEntry );
801 : }
802 : }
803 :
804 0 : maLbConflicts.Expand( pRootEntry );
805 : }
806 : }
807 0 : }
808 :
809 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|