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