xref: /trunk/main/sd/source/ui/dlg/custsdlg.cxx (revision 9204bf8294f34a46abdfeceee27c48e7b7b2ef12)
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