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