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 // MARKER(update_precomp.py): autogen include statement, do not remove 23 #include "precompiled_sd.hxx" 24 25 #ifdef SD_DLLIMPLEMENTATION 26 #undef SD_DLLIMPLEMENTATION 27 #endif 28 29 #include "custsdlg.hxx" 30 #include "custsdlg.hrc" 31 32 #include "strings.hrc" 33 #include "sdresid.hxx" 34 35 #include "drawdoc.hxx" 36 #include "sdpage.hxx" 37 #include "cusshow.hxx" 38 #include "app.hxx" 39 #include <vcl/msgbox.hxx> 40 41 // SdCustomShowDlg 42 43 /************************************************************************* 44 |* Konstruktor 45 \************************************************************************/ 46 SdCustomShowDlg::SdCustomShowDlg( Window* pWindow, 47 SdDrawDocument& rDrawDoc ) : 48 ModalDialog ( pWindow, SdResId( DLG_CUSTOMSHOW ) ), 49 50 aLbCustomShows ( this, SdResId( LB_CUSTOMSHOWS ) ), 51 aCbxUseCustomShow( this, SdResId( CBX_USE_CUSTOMSHOW ) ), 52 aBtnNew ( this, SdResId( BTN_NEW ) ), 53 aBtnEdit ( this, SdResId( BTN_EDIT ) ), 54 aBtnRemove ( this, SdResId( BTN_REMOVE ) ), 55 aBtnCopy ( this, SdResId( BTN_COPY ) ), 56 aBtnHelp ( this, SdResId( BTN_HELP ) ), 57 aBtnStartShow ( this, SdResId( BTN_STARTSHOW ) ), 58 aBtnOK ( this, SdResId( BTN_OK ) ), 59 60 rDoc ( rDrawDoc ), 61 pCustomShowList ( NULL ), 62 pCustomShow ( NULL ), 63 bModified ( sal_False ) 64 { 65 FreeResource(); 66 67 Link aLink( LINK( this, SdCustomShowDlg, ClickButtonHdl ) ); 68 aBtnNew.SetClickHdl( aLink ); 69 aBtnEdit.SetClickHdl( aLink ); 70 aBtnRemove.SetClickHdl( aLink ); 71 aBtnCopy.SetClickHdl( aLink ); 72 aCbxUseCustomShow.SetClickHdl( aLink ); 73 aLbCustomShows.SetSelectHdl( aLink ); 74 75 aBtnStartShow.SetClickHdl( LINK( this, SdCustomShowDlg, StartShowHdl ) ); // Testweise 76 77 // CustomShow-Liste des Docs abrufen 78 pCustomShowList = rDoc.GetCustomShowList(); 79 if( pCustomShowList ) 80 { 81 long nPosToSelect = pCustomShowList->GetCurPos(); 82 // ListBox mit CustomShows fuellen 83 for( pCustomShow = (SdCustomShow*) pCustomShowList->First(); 84 pCustomShow != NULL; 85 pCustomShow = (SdCustomShow*) pCustomShowList->Next() ) 86 { 87 aLbCustomShows.InsertEntry( pCustomShow->GetName() ); 88 } 89 aLbCustomShows.SelectEntryPos( (sal_uInt16)nPosToSelect ); 90 pCustomShowList->Seek( nPosToSelect ); 91 } 92 93 aCbxUseCustomShow.Check( pCustomShowList && rDoc.getPresentationSettings().mbCustomShow ); 94 95 CheckState(); 96 } 97 98 /************************************************************************* 99 |* Dtor 100 \************************************************************************/ 101 SdCustomShowDlg::~SdCustomShowDlg() 102 { 103 } 104 105 /************************************************************************* 106 |* CheckState 107 \************************************************************************/ 108 void SdCustomShowDlg::CheckState() 109 { 110 sal_uInt16 nPos = aLbCustomShows.GetSelectEntryPos(); 111 112 sal_Bool bEnable = nPos != LISTBOX_ENTRY_NOTFOUND; 113 aBtnEdit.Enable( bEnable ); 114 aBtnRemove.Enable( bEnable ); 115 aBtnCopy.Enable( bEnable ); 116 aCbxUseCustomShow.Enable( bEnable ); 117 aBtnStartShow.Enable( true ); 118 119 if( bEnable ) 120 pCustomShowList->Seek( nPos ); 121 } 122 123 /************************************************************************* 124 |* ButtonHdl() 125 \************************************************************************/ 126 IMPL_LINK( SdCustomShowDlg, ClickButtonHdl, void *, p ) 127 { 128 // Neue CustomShow 129 if( p == &aBtnNew ) 130 { 131 pCustomShow = NULL; 132 SdDefineCustomShowDlg aDlg( this, rDoc, pCustomShow ); 133 if( aDlg.Execute() == RET_OK ) 134 { 135 if( pCustomShow ) 136 { 137 if( !pCustomShowList ) 138 pCustomShowList = rDoc.GetCustomShowList( sal_True ); 139 140 pCustomShowList->Insert( pCustomShow, LIST_APPEND ); 141 pCustomShowList->Last(); 142 aLbCustomShows.InsertEntry( pCustomShow->GetName() ); 143 aLbCustomShows.SelectEntry( pCustomShow->GetName() ); 144 } 145 146 if( aDlg.IsModified() ) 147 bModified = sal_True; 148 } 149 else if( pCustomShow ) 150 DELETEZ( pCustomShow ); 151 } 152 // CustomShow bearbeiten 153 else if( p == &aBtnEdit ) 154 { 155 sal_uInt16 nPos = aLbCustomShows.GetSelectEntryPos(); 156 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 157 { 158 DBG_ASSERT( pCustomShowList, "pCustomShowList existiert nicht" ); 159 pCustomShow = (SdCustomShow*) pCustomShowList->GetObject( nPos ); 160 SdDefineCustomShowDlg aDlg( this, rDoc, pCustomShow ); 161 162 if( aDlg.Execute() == RET_OK ) 163 { 164 if( pCustomShow ) 165 { 166 pCustomShowList->Replace( pCustomShow, nPos ); 167 pCustomShowList->Seek( nPos ); 168 aLbCustomShows.RemoveEntry( nPos ); 169 aLbCustomShows.InsertEntry( pCustomShow->GetName(), nPos ); 170 aLbCustomShows.SelectEntryPos( nPos ); 171 } 172 if( aDlg.IsModified() ) 173 bModified = sal_True; 174 } 175 } 176 } 177 // CustomShow löschen 178 else if( p == &aBtnRemove ) 179 { 180 sal_uInt16 nPos = aLbCustomShows.GetSelectEntryPos(); 181 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 182 { 183 delete (SdCustomShow*) pCustomShowList->Remove( nPos ); 184 aLbCustomShows.RemoveEntry( nPos ); 185 aLbCustomShows.SelectEntryPos( nPos == 0 ? nPos : nPos - 1 ); 186 bModified = sal_True; 187 } 188 } 189 // CustomShow kopieren 190 else if( p == &aBtnCopy ) 191 { 192 sal_uInt16 nPos = aLbCustomShows.GetSelectEntryPos(); 193 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 194 { 195 SdCustomShow* pShow = new SdCustomShow( *(SdCustomShow*) pCustomShowList->GetObject( nPos ) ); 196 String aStr( pShow->GetName() ); 197 String aStrCopy( SdResId( STR_COPY_CUSTOMSHOW ) ); 198 199 sal_uInt16 nStrPos = aStr.Search( aStrCopy ); 200 sal_uInt16 nNum = 1; 201 if( nStrPos == STRING_NOTFOUND ) 202 { 203 aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " (" ) ); 204 aStr.Append( aStrCopy ); 205 aStr.Append( UniString::CreateFromInt32( nNum ) ); 206 aStr.Append( sal_Unicode(')') ); 207 nStrPos = aStr.Search( aStrCopy ); 208 } 209 nStrPos = nStrPos + (sal_uInt16)aStrCopy.Len(); 210 // Um nicht ins Nirvana zu greifen (--> Endlosschleife) 211 if( nStrPos >= aStr.Len() ) 212 { 213 aStr.Append( sal_Unicode(' ') ); 214 aStr.Append( UniString::CreateFromInt32( nNum ) ); 215 } 216 217 // Name überprüfen... 218 sal_Bool bDifferent = sal_False; 219 //long nPosToSelect = pCustomShowList->GetCurPos(); 220 while( !bDifferent ) 221 { 222 bDifferent = sal_True; 223 for( pCustomShow = (SdCustomShow*) pCustomShowList->First(); 224 pCustomShow != NULL && bDifferent; 225 pCustomShow = (SdCustomShow*) pCustomShowList->Next() ) 226 { 227 if( aStr == pCustomShow->GetName() ) 228 bDifferent = sal_False; 229 } 230 if( !bDifferent ) 231 { 232 // Nummer entfernen und durch um 1 erhöhte ersetzen 233 234 const CharClass* pCharClass = rDoc.GetCharClass(); 235 while( pCharClass->isDigit( aStr, nStrPos ) ) 236 aStr.Erase( nStrPos, 1 ); 237 aStr.Insert( UniString::CreateFromInt32( ++nNum ), nStrPos); 238 } 239 240 } 241 //pCustomShowList->Seek( nPosToSelect ); 242 pShow->SetName( aStr ); 243 244 pCustomShowList->Insert( pShow, LIST_APPEND ); 245 pCustomShowList->Last(); 246 aLbCustomShows.InsertEntry( pShow->GetName() ); 247 aLbCustomShows.SelectEntry( pShow->GetName() ); 248 249 250 bModified = sal_True; 251 } 252 } 253 else if( p == &aLbCustomShows ) 254 { 255 sal_uInt16 nPos = aLbCustomShows.GetSelectEntryPos(); 256 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 257 pCustomShowList->Seek( nPos ); 258 259 bModified = sal_True; 260 } 261 else if( p == &aCbxUseCustomShow ) 262 { 263 bModified = sal_True; 264 } 265 266 CheckState(); 267 268 return( 0L ); 269 } 270 271 /************************************************************************* 272 |* StartShow-Hdl 273 \************************************************************************/ 274 IMPL_LINK( SdCustomShowDlg, StartShowHdl, Button *, EMPTYARG ) 275 { 276 EndDialog( RET_YES ); 277 278 return 0; 279 } 280 281 /************************************************************************* 282 |* CheckState 283 \************************************************************************/ 284 sal_Bool SdCustomShowDlg::IsCustomShow() const 285 { 286 return( aCbxUseCustomShow.IsEnabled() && aCbxUseCustomShow.IsChecked() ); 287 } 288 289 // SdDefineCustomShowDlg 290 291 /************************************************************************* 292 |* Konstruktor 293 \************************************************************************/ 294 SdDefineCustomShowDlg::SdDefineCustomShowDlg( Window* pWindow, 295 SdDrawDocument& rDrawDoc, SdCustomShow*& rpCS ) : 296 ModalDialog ( pWindow, SdResId( DLG_DEFINE_CUSTOMSHOW ) ), 297 298 aFtName ( this, SdResId( FT_NAME ) ), 299 aEdtName ( this, SdResId( EDT_NAME ) ), 300 aFtPages ( this, SdResId( FT_PAGES ) ), 301 aLbPages ( this, SdResId( LB_PAGES ) ), 302 aBtnAdd ( this, SdResId( BTN_ADD ) ), 303 aBtnRemove ( this, SdResId( BTN_REMOVE ) ), 304 aFtCustomPages ( this, SdResId( FT_CUSTOM_PAGES ) ), 305 aLbCustomPages ( this, SdResId( LB_CUSTOM_PAGES ) ), 306 aBtnOK ( this, SdResId( BTN_OK ) ), 307 aBtnCancel ( this, SdResId( BTN_CANCEL ) ), 308 aBtnHelp ( this, SdResId( BTN_HELP ) ), 309 310 rDoc ( rDrawDoc ), 311 rpCustomShow ( rpCS ), 312 bModified ( sal_False ) 313 { 314 FreeResource(); 315 316 Link aLink = LINK( this, SdDefineCustomShowDlg, ClickButtonHdl ); 317 aBtnAdd.SetClickHdl( aLink ); 318 aBtnRemove.SetClickHdl( aLink ); 319 aEdtName.SetModifyHdl( aLink ); 320 aLbPages.SetSelectHdl( aLink ); // wegen Status 321 aLbCustomPages.SetSelectHdl( aLink ); // wegen Status 322 323 aBtnOK.SetClickHdl( LINK( this, SdDefineCustomShowDlg, OKHdl ) ); 324 325 SdPage* pPage; 326 // Listbox mit Seitennamen des Docs füllen 327 for( long nPage = 0L; 328 nPage < rDoc.GetSdPageCount( PK_STANDARD ); 329 nPage++ ) 330 { 331 pPage = rDoc.GetSdPage( (sal_uInt16) nPage, PK_STANDARD ); 332 String aStr( pPage->GetName() ); 333 aLbPages.InsertEntry( aStr ); 334 } 335 //aLbPages.SelectEntryPos( 0 ); 336 337 if( rpCustomShow ) 338 { 339 aOldName = rpCustomShow->GetName(); 340 aEdtName.SetText( aOldName ); 341 342 // ListBox mit CustomShow-Seiten füllen 343 for( pPage = (SdPage*) rpCustomShow->First(); 344 pPage != NULL; 345 pPage = (SdPage*) rpCustomShow->Next() ) 346 { 347 SvLBoxEntry* pEntry = aLbCustomPages.InsertEntry( pPage->GetName() ); 348 pEntry->SetUserData( pPage ); 349 } 350 } 351 else 352 { 353 rpCustomShow = new SdCustomShow( &rDoc ); 354 aEdtName.SetText( String( SdResId( STR_NEW_CUSTOMSHOW ) ) ); 355 aEdtName.SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) ); 356 rpCustomShow->SetName( aEdtName.GetText() ); 357 } 358 359 aLbCustomPages.SetDragDropMode( SV_DRAGDROP_CTRL_MOVE ); 360 aLbCustomPages.SetHighlightRange(); 361 362 aBtnOK.Enable( sal_False ); 363 CheckState(); 364 } 365 366 /************************************************************************* 367 |* Dtor 368 \************************************************************************/ 369 SdDefineCustomShowDlg::~SdDefineCustomShowDlg() 370 { 371 } 372 373 /************************************************************************* 374 |* CheckState 375 \************************************************************************/ 376 void SdDefineCustomShowDlg::CheckState() 377 { 378 sal_Bool bPages = aLbPages.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND; 379 //sal_Bool bCSPages = aLbCustomPages.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND; 380 sal_Bool bCSPages = aLbCustomPages.FirstSelected() != NULL; 381 sal_Bool bCount = aLbCustomPages.GetEntryCount() > 0; 382 383 aBtnOK.Enable( bCount ); 384 aBtnAdd.Enable( bPages ); 385 aBtnRemove.Enable( bCSPages ); 386 } 387 388 /************************************************************************* 389 |* ButtonHdl() 390 \************************************************************************/ 391 IMPL_LINK( SdDefineCustomShowDlg, ClickButtonHdl, void *, p ) 392 { 393 if( p == &aBtnAdd ) 394 { 395 sal_uInt16 nCount = aLbPages.GetSelectEntryCount(); 396 if( nCount > 0 ) 397 { 398 sal_uLong nPosCP = LIST_APPEND; 399 SvLBoxEntry* pEntry = aLbCustomPages.FirstSelected(); 400 if( pEntry ) 401 nPosCP = aLbCustomPages.GetModel()->GetAbsPos( pEntry ) + 1L; 402 403 for( sal_uInt16 i = 0; i < nCount; i++ ) 404 { 405 String aStr = aLbPages.GetSelectEntry( i ); 406 pEntry = aLbCustomPages.InsertEntry( aStr, 407 0, sal_False, nPosCP ); 408 409 aLbCustomPages.Select( pEntry ); 410 SdPage* pPage = rDoc.GetSdPage( (sal_uInt16) aLbPages. 411 GetSelectEntryPos( i ), PK_STANDARD ); 412 pEntry->SetUserData( pPage ); 413 414 if( nPosCP != LIST_APPEND ) 415 nPosCP++; 416 } 417 bModified = sal_True; 418 } 419 } 420 else if( p == &aBtnRemove ) 421 { 422 //sal_uInt16 nPos = aLbCustomPages.GetSelectEntryPos(); 423 SvLBoxEntry* pEntry = aLbCustomPages.FirstSelected(); 424 if( pEntry ) 425 { 426 sal_uLong nPos = aLbCustomPages.GetModel()->GetAbsPos( pEntry ); 427 //rpCustomShow->Remove( nPos ); 428 //aLbCustomPages.RemoveEntry( nPos ); 429 aLbCustomPages.GetModel()->Remove( aLbCustomPages.GetModel()->GetEntryAtAbsPos( nPos ) ); 430 431 bModified = sal_True; 432 } 433 } 434 else if( p == &aEdtName ) 435 { 436 //rpCustomShow->SetName( aEdtName.GetText() ); 437 438 bModified = sal_True; 439 } 440 441 CheckState(); 442 443 return( 0L ); 444 } 445 446 /************************************************************************* 447 |* CheckCustomShow(): 448 |* Überprüft die Page-Pointer der Show, da die Einträge über die 449 |* TreeLB verschoben und kopiert werden können 450 \************************************************************************/ 451 void SdDefineCustomShowDlg::CheckCustomShow() 452 { 453 sal_Bool bDifferent = sal_False; 454 SdPage* pPage = NULL; 455 SvLBoxEntry* pEntry = NULL; 456 457 // Anzahl vergleichen 458 if( rpCustomShow->Count() != aLbCustomPages.GetEntryCount() ) 459 { 460 rpCustomShow->Clear(); 461 bDifferent = sal_True; 462 } 463 464 // Seiten-Pointer vergleichen 465 if( !bDifferent ) 466 { 467 for( pPage = (SdPage*) rpCustomShow->First(), pEntry = aLbCustomPages.First(); 468 pPage != NULL && pEntry != NULL && !bDifferent; 469 pPage = (SdPage*) rpCustomShow->Next(), pEntry = aLbCustomPages.Next( pEntry ) ) 470 { 471 if( pPage != pEntry->GetUserData() ) 472 { 473 rpCustomShow->Clear(); 474 bDifferent = sal_True; 475 } 476 } 477 } 478 479 // Seiten-Pointer neu setzen 480 if( bDifferent ) 481 { 482 for( pEntry = aLbCustomPages.First(); 483 pEntry != NULL; 484 pEntry = aLbCustomPages.Next( pEntry ) ) 485 { 486 pPage = (SdPage*) pEntry->GetUserData(); 487 rpCustomShow->Insert( pPage, LIST_APPEND ); 488 } 489 bModified = sal_True; 490 } 491 492 // Name vergleichen und ggfs. setzen 493 String aStr( aEdtName.GetText() ); 494 if( rpCustomShow->GetName() != aStr ) 495 { 496 rpCustomShow->SetName( aStr ); 497 bModified = sal_True; 498 } 499 } 500 501 /************************************************************************* 502 |* OK-Hdl 503 \************************************************************************/ 504 IMPL_LINK( SdDefineCustomShowDlg, OKHdl, Button *, EMPTYARG ) 505 { 506 // Name ueberpruefen... 507 sal_Bool bDifferent = sal_True; 508 List* pCustomShowList = rDoc.GetCustomShowList(); 509 if( pCustomShowList ) 510 { 511 String aName( aEdtName.GetText() ); 512 SdCustomShow* pCustomShow; 513 514 long nPosToSelect = pCustomShowList->GetCurPos(); 515 for( pCustomShow = (SdCustomShow*) pCustomShowList->First(); 516 pCustomShow != NULL; 517 pCustomShow = (SdCustomShow*) pCustomShowList->Next() ) 518 { 519 if( aName == pCustomShow->GetName() && aName != aOldName ) 520 bDifferent = sal_False; 521 } 522 pCustomShowList->Seek( nPosToSelect ); 523 } 524 525 if( bDifferent ) 526 { 527 CheckCustomShow(); 528 529 EndDialog( RET_OK ); 530 } 531 else 532 { 533 WarningBox( this, WinBits( WB_OK ), 534 String( SdResId( STR_WARN_NAME_DUPLICATE ) ) ).Execute(); 535 536 aEdtName.GrabFocus(); 537 } 538 539 return 0; 540 } 541 542 /* vim: set noet sw=4 ts=4: */ 543