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 \************************************************************************/
SdCustomShowDlg(Window * pWindow,SdDrawDocument & rDrawDoc)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 \************************************************************************/
~SdCustomShowDlg()101 SdCustomShowDlg::~SdCustomShowDlg()
102 {
103 }
104
105 /*************************************************************************
106 |* CheckState
107 \************************************************************************/
CheckState()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 \************************************************************************/
IMPL_LINK(SdCustomShowDlg,ClickButtonHdl,void *,p)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 \************************************************************************/
IMPL_LINK(SdCustomShowDlg,StartShowHdl,Button *,EMPTYARG)274 IMPL_LINK( SdCustomShowDlg, StartShowHdl, Button *, EMPTYARG )
275 {
276 EndDialog( RET_YES );
277
278 return 0;
279 }
280
281 /*************************************************************************
282 |* CheckState
283 \************************************************************************/
IsCustomShow() const284 sal_Bool SdCustomShowDlg::IsCustomShow() const
285 {
286 return( aCbxUseCustomShow.IsEnabled() && aCbxUseCustomShow.IsChecked() );
287 }
288
289 // SdDefineCustomShowDlg
290
291 /*************************************************************************
292 |* Konstruktor
293 \************************************************************************/
SdDefineCustomShowDlg(Window * pWindow,SdDrawDocument & rDrawDoc,SdCustomShow * & rpCS)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 \************************************************************************/
~SdDefineCustomShowDlg()369 SdDefineCustomShowDlg::~SdDefineCustomShowDlg()
370 {
371 }
372
373 /*************************************************************************
374 |* CheckState
375 \************************************************************************/
CheckState()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 \************************************************************************/
IMPL_LINK(SdDefineCustomShowDlg,ClickButtonHdl,void *,p)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 \************************************************************************/
CheckCustomShow()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 \************************************************************************/
IMPL_LINK(SdDefineCustomShowDlg,OKHdl,Button *,EMPTYARG)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