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