xref: /trunk/main/sd/source/ui/dlg/dlgass.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sd.hxx"
30 
31 #ifdef SD_DLLIMPLEMENTATION
32 #undef SD_DLLIMPLEMENTATION
33 #endif
34 #include <com/sun/star/presentation/ClickAction.hpp>
35 #include <vcl/svapp.hxx>
36 #include <vos/mutex.hxx>
37 #include <vcl/msgbox.hxx>
38 #include <vcl/lstbox.hxx>
39 #include <vcl/combobox.hxx>
40 #include <sfx2/doctempl.hxx>
41 #include <svl/lstner.hxx>
42 #include <sfx2/objsh.hxx>
43 #include <svtools/ehdl.hxx>
44 #include <svtools/sfxecode.hxx>
45 #include <tools/urlobj.hxx>
46 #include <com/sun/star/presentation/FadeEffect.hpp>
47 #include <fadedef.h>
48 #include <sfx2/sfxsids.hrc>
49 #include <svl/undo.hxx>
50 #include "DrawDocShell.hxx"
51 #include <vcl/gdimtf.hxx>
52 #include <tools/wintypes.hxx>
53 #include "docprev.hxx"
54 #include <sfx2/app.hxx>
55 #include <sfx2/docfile.hxx>
56 #include <sfx2/dispatch.hxx>
57 #include <sfx2/request.hxx>
58 #include <com/sun/star/sdbc/XResultSet.hpp>
59 #include <com/sun/star/lang/XComponent.hpp>
60 #include <com/sun/star/util/XCloseable.hpp>
61 #include <com/sun/star/uno/RuntimeException.hpp>
62 #include <com/sun/star/frame/XModuleManager.hpp>
63 #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
64 #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp>
65 #include <com/sun/star/ui/XImageManager.hpp>
66 #include <unotools/historyoptions.hxx>
67 #include <tools/urlobj.hxx>
68 #include <osl/file.hxx>
69 #include <sfx2/filedlghelper.hxx>
70 
71 #include "sdpage.hxx"
72 #include "helpids.h"
73 #include "assclass.hxx"
74 #include "dlgass.hrc"
75 #include "dlgass.hxx"
76 #include "dlgctrls.hxx"
77 #ifndef _SD_CFGID_HXX
78 #include "strings.hrc"
79 #endif
80 #ifndef _DATETIMEITEM_HXX
81 #include "dlgassim.hxx"
82 #endif
83 #include "TemplateScanner.hxx"
84 #include "WindowUpdater.hxx"
85 
86 #include <comphelper/processfactory.hxx>
87 
88 using namespace ::com::sun::star;
89 using namespace ::com::sun::star::uno;
90 using namespace ::sd;
91 
92 
93 void InterpolateFixedBitmap( FixedBitmap * pBitmap )
94 {
95     Bitmap aBmp( pBitmap->GetBitmap() );
96     Size aSize = pBitmap->GetSizePixel();
97     aBmp.Scale( aSize, BMP_SCALE_INTERPOLATE );
98     pBitmap->SetBitmap( aBmp );
99 }
100 
101 
102 // ====================================================================
103 // ====================================================================
104 
105 const char* PageHelpIds[] =
106 {
107     HID_SD_AUTOPILOT_PAGE1,
108     HID_SD_AUTOPILOT_PAGE2,
109     HID_SD_AUTOPILOT_PAGE3,
110     HID_SD_AUTOPILOT_PAGE4,
111     HID_SD_AUTOPILOT_PAGE5
112 };
113 
114 // ====================================================================
115 
116 class PasswordEntry
117 {
118 public:
119     String maPassword;
120     String maPath;
121 };
122 
123 DECLARE_LIST( PasswordEntryList, PasswordEntry * )
124 
125 // ====================================================================
126 
127 /** A simple wrapper that looks like a PushButton and is used to force the
128     broadcasting of focus events primarly for accessibility tools.
129     Forcing focus events is achieved by using two identical PushButtons
130     which, when the focus event is requested, are exchanged and play focus
131     ping-pong by moving the focus from one to the other.
132 */
133 class NextButton
134 {
135 public:
136     NextButton (::Window* pParent, const ResId& rResId);
137 
138     void ForceFocusEventBroadcast (void);
139     void SetClickHdl (const Link& rLink);
140     bool IsEnabled (void);
141     void Enable (bool bEnable);
142 
143 private:
144     PushButton maNextButton1;
145     PushButton maNextButton2;
146     bool mbIsFirstButtonActive;
147 };
148 
149 
150 
151 // ====================================================================
152 
153 class AssistentDlgImpl : public SfxListener
154 {
155 public:
156     AssistentDlgImpl( ::Window* pWindow, const Link& rFinishLink, sal_Bool bAutoPilot  );
157     ~AssistentDlgImpl();
158 
159     /// Local mutex used to serialize concurrent method calls.
160     ::osl::Mutex maMutex;
161 
162     SfxObjectShellLock GetDocument();
163 
164     /** closes the current preview docshell */
165     void CloseDocShell();
166 
167     /** Extract form the history list of recently used files the impress
168         files and insert them into a listbox.
169     */
170     void    ScanDocmenu         (void);
171     /** Flag that is set to sal_True after the recently used files have been
172         scanned.
173     */
174     sal_Bool mbRecentDocumentsReady;
175 
176     /** When the list of templates has not been scanned already this is done
177         when this method is called.  That includes requesting the whole list
178         of templates from UCB and extracting from that list the impress
179         templates and layouts and storing them for later use in
180         <member>maPresentList</member>.  Note that the first call to this
181         method after installing a new Office may take some time.
182     */
183     void ProvideTemplates (void);
184 
185     /** This method transfers the template folders from the template scanner
186         to the internal structures of this class.  On termination it sets
187         the flag <member>mbTemplatesReady</member> to <TRUE/> to indicate
188         that the templates are available.
189         @param rTemplateFolders
190             This is a list of template folders.  This method takes ownership
191             of the supplied entries by removing them from the list and
192             transferring them to an internal structure.
193     */
194     void TemplateScanDone (std::vector<TemplateDir*>& rTemplateFolders);
195 
196     /** Flag that is set to sal_True after the impress templates have been
197         scanned.
198     */
199     sal_Bool mbTemplatesReady;
200 
201     /** Flag used to prevent nested or concurrent calls to the
202         <member>UpdatePreview</memember> method.  A <TRUE/> value indicates
203         that a preview update is currently active.
204     */
205     sal_Bool mbPreviewUpdating;
206 
207     ::Window* mpWindow;
208 
209     void SavePassword( SfxObjectShellLock xDoc, const String& rPath );
210     void RestorePassword( SfxItemSet* pSet, const String& rPath );
211     String GetPassword( const String rPath );
212     void DeletePassords();
213 
214     PasswordEntryList maPasswordList;
215 
216     String maDocFile;
217     String maLayoutFile;
218 
219     String GetDocFileName();
220     String GetLayoutFileName();
221 
222     /// List of URLs of recently used impress files.
223     std::vector<String*> maOpenFilesList;
224 
225     /// List of folders containing data about impress templates.
226     std::vector<TemplateDir*> maPresentList;
227 
228     /// Currently selected template folder.
229     TemplateDir* mpTemplateRegion;
230 
231     /// Currently selected layout folder.
232     TemplateDir* mpLayoutRegion;
233 
234     // preview
235     sal_Bool mbUserDataDirty;
236     Timer maPrevTimer;
237     Timer maEffectPrevTimer;
238     Timer maUpdatePageListTimer;
239     Timer maStartScanTimer;
240 
241     SfxObjectShellLock xDocShell;
242 
243     ::std::auto_ptr<WindowUpdater> mpWindowUpdater;
244 
245     sal_Bool mbPreview;
246     sal_uInt16 mnShowPage;
247     sal_Bool mbDocPreview;
248 
249     sal_uLong mnTemplate;
250 
251     String maPageListFile;
252 
253     void UpdatePreview( sal_Bool bDocPreview );
254     void UpdatePageList();
255     void UpdateUserData();
256 
257     sal_Bool IsOwnFormat( const String& rPath );
258 
259     // dlg status
260     void EndDialog( long nResult = 0 );
261 
262     void SetStartType( StartType eType );
263     StartType GetStartType();
264 
265     void SelectTemplateRegion( const String& rRegion );
266     void SelectLayoutRegion( const String& rRegion );
267 
268     void UpdatePage();
269     void ChangePage();
270     void LeavePage();
271 
272     String GetUiTextForCommand (const ::rtl::OUString& aCommandURL);
273     Image GetUiIconForCommand (const ::rtl::OUString& aCommandURL);
274 
275     DECL_LINK( StartScanHdl, void * );
276     DECL_LINK( SelectFileHdl, ListBox * );
277     DECL_LINK( SelectRegionHdl, ListBox * );
278     DECL_LINK( UpdatePreviewHdl, void * );
279     DECL_LINK( UpdatePageListHdl, void * );
280     DECL_LINK( StartTypeHdl, RadioButton * );
281     DECL_LINK( SelectTemplateHdl, ListBox * );
282     DECL_LINK( NextPageHdl, PushButton * );
283     DECL_LINK( LastPageHdl, PushButton * );
284     DECL_LINK( PreviewFlagHdl, CheckBox * );
285     DECL_LINK( EffectPreviewHdl, Button * );
286     DECL_LINK( SelectLayoutHdl, ListBox * );
287     DECL_LINK( PageSelectHdl, Control * );
288     DECL_LINK( PresTypeHdl, RadioButton * );
289     DECL_LINK( UpdateUserDataHdl, Edit* );
290     DECL_LINK( SelectEffectHdl, void* );
291     DECL_LINK( OpenButtonHdl, Button * );
292 
293     // Common
294     Assistent           maAssistentFunc;
295     CheckBox            maPreviewFlag;
296     CheckBox            maStartWithFlag;
297     HelpButton          maHelpButton;
298     CancelButton        maCancelButton;
299     PushButton          maLastPageButton;
300     NextButton          maNextPageButton;
301     OKButton            maFinishButton;
302     SdDocPreviewWin     maPreview;
303 
304     String              maCreateStr;
305     String              maOpenStr;
306 
307     // Seite 1
308     FixedBitmap*        mpPage1FB;
309     FixedLine*          mpPage1ArtFL;
310     RadioButton*        mpPage1EmptyRB;
311     RadioButton*        mpPage1TemplateRB;
312     ListBox*            mpPage1RegionLB;
313     ListBox*            mpPage1TemplateLB;
314     RadioButton*        mpPage1OpenRB;
315     ListBox*            mpPage1OpenLB;
316     PushButton*         mpPage1OpenPB;
317 
318     // Seite 2
319     FixedBitmap*        mpPage2FB;
320     FixedLine*          mpPage2LayoutFL;
321     ListBox*            mpPage2RegionLB;
322     ListBox*            mpPage2LayoutLB;
323     FixedLine*          mpPage2OutTypesFL;
324     RadioButton*        mpPage2Medium1RB;
325     RadioButton*        mpPage2Medium2RB;
326     RadioButton*        mpPage2Medium3RB;
327     RadioButton*        mpPage2Medium4RB;
328     RadioButton*        mpPage2Medium5RB;
329 
330     // Seite 3
331     FixedBitmap*        mpPage3FB;
332     FixedLine*          mpPage3EffectFL;
333     FixedText*          mpPage3EffectFT;
334     FadeEffectLB*       mpPage3EffectLB;
335     FixedText*          mpPage3SpeedFT;
336     ListBox*            mpPage3SpeedLB;
337     FixedLine*          mpPage3PresTypeFL;
338     RadioButton*        mpPage3PresTypeLiveRB;
339     RadioButton*        mpPage3PresTypeKioskRB;
340     FixedText*          mpPage3PresTimeFT;
341     TimeField*          mpPage3PresTimeTMF;
342     FixedText*          mpPage3BreakFT;
343     TimeField*          mpPage3BreakTMF;
344     CheckBox*           mpPage3LogoCB;
345 
346     // Seite 4
347     FixedBitmap*        mpPage4FB;
348     FixedLine*          mpPage4PersonalFL;
349     FixedText*          mpPage4AskNameFT;
350     Edit*               mpPage4AskNameEDT;
351     FixedText*          mpPage4AskTopicFT;
352     Edit*               mpPage4AskTopicEDT;
353     FixedText*          mpPage4AskInfoFT;
354     MultiLineEdit*      mpPage4AskInfoEDT;
355 
356     // Seite 5
357     FixedBitmap*        mpPage5FB;
358     FixedText*          mpPage5PageListFT;
359     SdPageListControl*  mpPage5PageListCT;
360     CheckBox*           mpPage5SummaryCB;
361 
362 };
363 
364 
365 
366 // ====================================================================
367 
368 AssistentDlgImpl::AssistentDlgImpl( ::Window* pWindow, const Link& rFinishLink, sal_Bool bAutoPilot ) :
369     mpTemplateRegion(NULL),
370     mpLayoutRegion(NULL),
371     mbUserDataDirty(sal_False),
372     xDocShell (NULL),
373     mpWindowUpdater (new WindowUpdater()),
374     mbPreview(sal_True),
375     mnShowPage(0),
376     mbDocPreview(sal_False),
377     maAssistentFunc(5),
378     maPreviewFlag(pWindow,SdResId(CB_PREVIEW)),
379     maStartWithFlag(pWindow,SdResId(CB_STARTWITH)),
380     maHelpButton(pWindow,SdResId(BUT_HELP)),
381     maCancelButton(pWindow,SdResId(BUT_CANCEL)),
382     maLastPageButton(pWindow,SdResId(BUT_LAST)),
383     maNextPageButton(pWindow,SdResId(BUT_NEXT)),
384     maFinishButton(pWindow,SdResId(BUT_FINISH)),
385     maPreview(pWindow,SdResId(CT_PREVIEW)),
386     maCreateStr(SdResId(STR_CREATE)),
387     maOpenStr(SdResId(STR_OPEN))
388 {
389     maPageListFile += sal_Unicode('?'),
390     mbRecentDocumentsReady = sal_False;
391     mbTemplatesReady = sal_False;
392     mbPreviewUpdating = sal_False;
393 
394     mpWindow = pWindow;
395 
396     if(bAutoPilot)
397         maStartWithFlag.Hide();
398     else
399         maAssistentFunc.InsertControl(1, &maStartWithFlag );
400 
401     //page1 wird initialisiert und an die Assistentenfunktionalitaet
402     //uebergeben
403     maAssistentFunc.InsertControl(1, &maPreview );
404     maAssistentFunc.InsertControl(1, &maPreviewFlag );
405     maAssistentFunc.InsertControl(1,
406         mpPage1FB = new FixedBitmap(pWindow,SdResId(FB_PAGE1)));
407     maAssistentFunc.InsertControl(1,
408         mpPage1ArtFL = new FixedLine(pWindow,SdResId(FL_PAGE1_ARTGROUP)));
409     maAssistentFunc.InsertControl(1,
410         mpPage1EmptyRB=new RadioButton(pWindow,SdResId(RB_PAGE1_EMPTY)));
411     maAssistentFunc.InsertControl(1,
412         mpPage1TemplateRB=new RadioButton(pWindow,SdResId(RB_PAGE1_TEMPLATE)));
413     maAssistentFunc.InsertControl(1,
414         mpPage1OpenRB=new RadioButton(pWindow,SdResId(RB_PAGE1_OPEN)));
415     maAssistentFunc.InsertControl(1,
416         mpPage1RegionLB = new ListBox(pWindow,SdResId(LB_PAGE1_REGION)));
417     maAssistentFunc.InsertControl(1,
418         mpPage1TemplateLB=new ListBox(pWindow,SdResId(LB_PAGE1_TEMPLATES)));
419     maAssistentFunc.InsertControl(1,
420         mpPage1OpenPB=new PushButton(pWindow,SdResId(PB_PAGE1_OPEN)));
421     maAssistentFunc.InsertControl(1,
422         mpPage1OpenLB=new ListBox(pWindow,SdResId(LB_PAGE1_OPEN)));
423 
424     // Align the button and list box displayed for the "open existing file"
425     // radio button with the text of that radio button.
426     {
427         RadioButton aEmptyRB (mpWindow);
428         sal_Int32 nIndent (aEmptyRB.CalcMinimumSize(0).Width());
429         sal_Int32 nLeft (mpPage1OpenRB->GetPosPixel().X() + nIndent);
430         sal_Int32 nWidth (mpPage1OpenRB->GetSizePixel().Width() - nIndent);
431         mpPage1OpenPB->SetPosSizePixel(
432             Point(nLeft, mpPage1OpenPB->GetPosPixel().Y()),
433             Size(mpPage1OpenPB->GetSizePixel()));
434         mpPage1OpenLB->SetPosSizePixel(
435             Point(nLeft, mpPage1OpenLB->GetPosPixel().Y()),
436             Size(nWidth, mpPage1OpenLB->GetSizePixel().Height()));
437     }
438 
439     // Set text and icon of the 'Open...' button.
440     {
441         String sText (GetUiTextForCommand(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:Open"))));
442         // Remove the mnemonic and add a leading space so that icon and text
443         // are not too close together.
444         sText.SearchAndReplaceAll(String(RTL_CONSTASCII_STRINGPARAM("~")),String());
445         sText.Insert(String(RTL_CONSTASCII_STRINGPARAM(" ")),0);
446         mpPage1OpenPB->SetText(sText);
447         // Place icon left of text and both centered in the button.
448         mpPage1OpenPB->SetModeImage(
449             GetUiIconForCommand(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:Open"))),
450             BMP_COLOR_NORMAL);
451         mpPage1OpenPB->EnableImageDisplay(sal_True);
452         mpPage1OpenPB->EnableTextDisplay(sal_True);
453         mpPage1OpenPB->SetImageAlign(IMAGEALIGN_LEFT);
454         mpPage1OpenPB->SetStyle(mpPage1OpenPB->GetStyle() | WB_CENTER);
455     }
456 
457     // links&handler
458     mpPage1RegionLB->SetSelectHdl(LINK(this,AssistentDlgImpl,SelectRegionHdl));
459     mpPage1RegionLB->SetDropDownLineCount( 6 );
460     mpPage1TemplateLB->SetSelectHdl(LINK(this,AssistentDlgImpl,SelectTemplateHdl));
461     mpPage1TemplateLB->InsertEntry(String(SdResId(STR_ISLOADING)));
462 
463     mpPage1EmptyRB->SetClickHdl(LINK(this,AssistentDlgImpl,StartTypeHdl));
464     mpPage1TemplateRB->SetClickHdl(LINK(this,AssistentDlgImpl,StartTypeHdl));
465     mpPage1OpenRB->SetClickHdl(LINK(this,AssistentDlgImpl,StartTypeHdl));
466     mpPage1OpenLB->SetSelectHdl(LINK(this,AssistentDlgImpl,SelectFileHdl));
467     mpPage1OpenLB->SetDoubleClickHdl(rFinishLink);
468     mpPage1OpenPB->SetClickHdl(LINK(this,AssistentDlgImpl,OpenButtonHdl));
469     //  mpPage1OpenLB->InsertEntry(String(SdResId(STR_WIZARD_POSITION)));
470 
471     // Seite 2
472     maAssistentFunc.InsertControl(2, &maPreview );
473     maAssistentFunc.InsertControl(2, &maPreviewFlag );
474     maAssistentFunc.InsertControl(2,
475         mpPage2FB = new FixedBitmap(pWindow,SdResId(FB_PAGE2)));
476     maAssistentFunc.InsertControl(2,
477         mpPage2LayoutFL = new FixedLine( pWindow, SdResId(FL_PAGE2_LAYOUT) ));
478     maAssistentFunc.InsertControl(2,
479         mpPage2RegionLB = new ListBox(pWindow,SdResId(LB_PAGE2_REGION) ));
480     maAssistentFunc.InsertControl(2,
481         mpPage2LayoutLB = new ListBox(pWindow,SdResId(LB_PAGE2_LAYOUT) ));
482 
483     maAssistentFunc.InsertControl(2,
484         mpPage2OutTypesFL = new FixedLine( pWindow, SdResId(FL_PAGE2_OUTPUTTYPES) ));
485     maAssistentFunc.InsertControl(2,
486         mpPage2Medium5RB = new RadioButton( pWindow, SdResId(RB_PAGE2_MEDIUM5) ));
487     maAssistentFunc.InsertControl(2,
488         mpPage2Medium3RB = new RadioButton( pWindow, SdResId(RB_PAGE2_MEDIUM3) ));
489     maAssistentFunc.InsertControl(2,
490         mpPage2Medium4RB = new RadioButton( pWindow, SdResId(RB_PAGE2_MEDIUM4) ));
491     maAssistentFunc.InsertControl(2,
492         mpPage2Medium1RB = new RadioButton( pWindow, SdResId(RB_PAGE2_MEDIUM1) ));
493     maAssistentFunc.InsertControl(2,
494         mpPage2Medium2RB = new RadioButton( pWindow, SdResId(RB_PAGE2_MEDIUM2) ));
495     mpPage2Medium5RB->Check();
496 
497     mpPage2RegionLB->SetSelectHdl(LINK(this,AssistentDlgImpl,SelectRegionHdl));
498     mpPage2RegionLB->SetDropDownLineCount( 6 );
499     mpPage2LayoutLB->SetSelectHdl(LINK(this,AssistentDlgImpl,SelectLayoutHdl));
500     mpPage2LayoutLB->InsertEntry(String(SdResId(STR_ISLOADING)));
501 
502     // Seite 3
503     maAssistentFunc.InsertControl(3, &maPreview );
504     maAssistentFunc.InsertControl(3, &maPreviewFlag );
505     maAssistentFunc.InsertControl(3,
506         mpPage3FB = new FixedBitmap(pWindow,SdResId(FB_PAGE3)));
507     maAssistentFunc.InsertControl(3,
508         mpPage3EffectFL = new FixedLine( pWindow, SdResId(FL_PAGE3_EFFECT) ));
509     maAssistentFunc.InsertControl(3,
510         mpPage3EffectFT = new FixedText( pWindow, SdResId(FT_PAGE3_EFFECT) ));
511     maAssistentFunc.InsertControl(3,
512         mpPage3EffectLB = new FadeEffectLB( pWindow, SdResId(LB_PAGE3_EFFECT) ));
513     maAssistentFunc.InsertControl(3,
514         mpPage3SpeedFT = new FixedText( pWindow, SdResId(FT_PAGE3_SPEED) ));
515     maAssistentFunc.InsertControl(3,
516         mpPage3SpeedLB = new FadeEffectLB( pWindow, SdResId(LB_PAGE3_SPEED) ));
517     maAssistentFunc.InsertControl(3,
518         mpPage3PresTypeFL = new FixedLine( pWindow, SdResId(FL_PAGE3_PRESTYPE) ));
519     maAssistentFunc.InsertControl(3,
520         mpPage3PresTypeLiveRB = new RadioButton( pWindow, SdResId(RB_PAGE3_LIVE) ));
521     maAssistentFunc.InsertControl(3,
522         mpPage3PresTypeKioskRB = new RadioButton( pWindow, SdResId(RB_PAGE3_KIOSK) ));
523     maAssistentFunc.InsertControl(3,
524         mpPage3PresTimeFT = new FixedText( pWindow, SdResId( FT_PAGE3_TIME) ));
525     maAssistentFunc.InsertControl(3,
526         mpPage3PresTimeTMF = new TimeField( pWindow, SdResId( TMF_PAGE3_TIME) ));
527     maAssistentFunc.InsertControl(3,
528         mpPage3BreakFT = new FixedText( pWindow, SdResId( FT_PAGE3_BREAK) ));
529     maAssistentFunc.InsertControl(3,
530         mpPage3BreakTMF = new TimeField( pWindow, SdResId( TMF_PAGE3_BREAK) ));
531     maAssistentFunc.InsertControl(3,
532         mpPage3LogoCB = new CheckBox( pWindow, SdResId( CB_PAGE3_LOGO) ));
533 
534     mpPage3EffectLB->Fill();
535 //  mpPage3EffectLB->SelectEffect( presentation::FadeEffect_NONE );
536     mpPage3EffectLB->SetSelectHdl( LINK(this,AssistentDlgImpl,SelectEffectHdl ));
537     mpPage3EffectLB->SetDropDownLineCount( 12 );
538 
539     mpPage3SpeedLB->InsertEntry( String( SdResId(STR_SLOW) ));
540     mpPage3SpeedLB->InsertEntry( String( SdResId(STR_MEDIUM) ));
541     mpPage3SpeedLB->InsertEntry( String( SdResId(STR_FAST) ));
542     mpPage3SpeedLB->SetDropDownLineCount( 3 );
543     mpPage3SpeedLB->SetSelectHdl( LINK(this,AssistentDlgImpl,SelectEffectHdl ));
544     mpPage3SpeedLB->SelectEntryPos( 1 );
545 
546     mpPage3PresTypeLiveRB->Check();
547     mpPage3PresTypeLiveRB->SetClickHdl( LINK(this,AssistentDlgImpl, PresTypeHdl ));
548     mpPage3PresTypeKioskRB->SetClickHdl( LINK(this,AssistentDlgImpl, PresTypeHdl ));
549     mpPage3PresTimeTMF->SetFormat( TIMEF_SEC );
550     mpPage3PresTimeTMF->SetTime( Time( 0, 0, 10 ) );
551     mpPage3BreakTMF->SetFormat( TIMEF_SEC );
552     mpPage3BreakTMF->SetTime( Time( 0, 0, 10 ) );
553     mpPage3LogoCB->Check();
554 
555     // set cursor in timefield
556     Edit *pEditPage3PresTimeTMF = mpPage3PresTimeTMF->GetField();
557     Edit *pEditPage3BreakTMF = mpPage3BreakTMF->GetField();
558     Selection aSel1( pEditPage3PresTimeTMF->GetMaxTextLen(), pEditPage3PresTimeTMF->GetMaxTextLen() );
559     Selection aSel2( pEditPage3BreakTMF->GetMaxTextLen(), pEditPage3BreakTMF->GetMaxTextLen() );
560     pEditPage3PresTimeTMF->SetSelection( aSel1 );
561     pEditPage3BreakTMF->SetSelection( aSel2 );
562 
563     // Seite 4
564     maAssistentFunc.InsertControl(4,
565         mpPage4FB = new FixedBitmap(pWindow,SdResId(FB_PAGE4)));
566     maAssistentFunc.InsertControl(4,
567         mpPage4PersonalFL = new FixedLine( pWindow, SdResId(FL_PAGE4_PERSONAL) ));
568     maAssistentFunc.InsertControl(4,
569         mpPage4AskNameFT   = new FixedText( pWindow, SdResId(FT_PAGE4_ASKNAME) ));
570     maAssistentFunc.InsertControl(4,
571         mpPage4AskNameEDT  = new Edit( pWindow, SdResId(EDT_PAGE4_ASKNAME) ));
572     maAssistentFunc.InsertControl(4,
573         mpPage4AskTopicFT= new FixedText( pWindow, SdResId(FT_PAGE4_ASKTOPIC) ));
574     maAssistentFunc.InsertControl(4,
575         mpPage4AskTopicEDT = new Edit( pWindow, SdResId(EDT_PAGE4_ASKTOPIC) ));
576     maAssistentFunc.InsertControl(4,
577         mpPage4AskInfoFT   = new FixedText( pWindow, SdResId(FT_PAGE4_ASKINFORMATION) ));
578     maAssistentFunc.InsertControl(4,
579         mpPage4AskInfoEDT  = new MultiLineEdit( pWindow, SdResId(EDT_PAGE4_ASKINFORMATION) ));
580 
581     mpPage4AskNameEDT->SetModifyHdl(LINK(this,AssistentDlgImpl,UpdateUserDataHdl));
582     mpPage4AskTopicEDT->SetModifyHdl(LINK(this,AssistentDlgImpl,UpdateUserDataHdl));
583     mpPage4AskInfoEDT->SetModifyHdl(LINK(this,AssistentDlgImpl,UpdateUserDataHdl));
584 
585     // page 5
586     maAssistentFunc.InsertControl(5, &maPreview );
587     maAssistentFunc.InsertControl(5, &maPreviewFlag );
588     maAssistentFunc.InsertControl(5,
589         mpPage5FB = new FixedBitmap(pWindow,SdResId(FB_PAGE5)));
590     maAssistentFunc.InsertControl(5,
591         mpPage5PageListFT = new FixedText( pWindow, SdResId( FT_PAGE5_PAGELIST ) ));
592     maAssistentFunc.InsertControl(5,
593         mpPage5PageListCT = new SdPageListControl( pWindow, SdResId( CT_PAGE5_PAGELIST ) ));
594     maAssistentFunc.InsertControl(5,
595         mpPage5SummaryCB  = new CheckBox( pWindow, SdResId( CB_PAGE5_SUMMARY ) ));
596 
597     mpPage5PageListCT->SetSelectHdl(LINK(this,AssistentDlgImpl, PageSelectHdl));
598 
599 
600     // generell
601     InterpolateFixedBitmap( mpPage1FB );
602     InterpolateFixedBitmap( mpPage2FB );
603     InterpolateFixedBitmap( mpPage3FB );
604     InterpolateFixedBitmap( mpPage4FB );
605     InterpolateFixedBitmap( mpPage5FB );
606 
607     maLastPageButton.SetClickHdl(LINK(this,AssistentDlgImpl, LastPageHdl ));
608     maNextPageButton.SetClickHdl(LINK(this,AssistentDlgImpl, NextPageHdl ));
609 
610     maPreviewFlag.Check( mbPreview );
611     maPreviewFlag.SetClickHdl(LINK(this, AssistentDlgImpl, PreviewFlagHdl ));
612     maPreview.SetClickHdl(LINK(this,AssistentDlgImpl, EffectPreviewHdl ));
613 
614     //setzt die Ausgangsseite
615     maAssistentFunc.GotoPage(1);
616     maLastPageButton.Disable();
617 
618     maPrevTimer.SetTimeout( 200 );
619     maPrevTimer.SetTimeoutHdl( LINK( this, AssistentDlgImpl, UpdatePreviewHdl));
620 
621     maEffectPrevTimer.SetTimeout( 50 );
622     maEffectPrevTimer.SetTimeoutHdl( LINK( this, AssistentDlgImpl, EffectPreviewHdl ));
623 
624     maUpdatePageListTimer.SetTimeout( 50 );
625     maUpdatePageListTimer.SetTimeoutHdl( LINK( this, AssistentDlgImpl, UpdatePageListHdl));
626 
627     SetStartType( ST_EMPTY );
628 
629     ChangePage();
630 
631     mpWindowUpdater->RegisterWindow (&maPreview);
632 
633     UpdatePreview( sal_True );
634 
635     //check wether we should start with a template document initialy and preselect it
636     const ::rtl::OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.PresentationDocument" ) );
637     String aStandardTemplate( SfxObjectFactory::GetStandardTemplate( aServiceName ) );
638     if( aStandardTemplate.Len() )
639     {
640         ProvideTemplates();
641 
642         //find aStandardTemplate in maPresentList
643         TemplateDir*   pStandardTemplateDir = 0;
644         TemplateEntry* pStandardTemplateEntry = 0;
645 
646         std::vector<TemplateDir*>::iterator I;
647         for (I=maPresentList.begin(); I!=maPresentList.end(); I++)
648         {
649             TemplateDir* pDir = *I;
650             std::vector<TemplateEntry*>::iterator   J;
651             for (J=pDir->maEntries.begin(); J!=pDir->maEntries.end(); J++)
652             {
653                 TemplateEntry* pEntry = *J;
654                 if(pEntry->msPath == aStandardTemplate)
655                 {
656                     pStandardTemplateDir = pDir;
657                     pStandardTemplateEntry = pEntry;
658                     break;
659                 }
660             }
661             if(pStandardTemplateDir)
662                 break;
663         }
664 
665         //preselect template
666         if( pStandardTemplateDir && pStandardTemplateEntry )
667         {
668             mpPage1RegionLB->SelectEntry( pStandardTemplateDir->msRegion );
669             SelectTemplateRegion( pStandardTemplateDir->msRegion );
670             mpPage1TemplateLB->SelectEntry( pStandardTemplateEntry->msTitle );
671             SelectTemplateHdl(mpPage1TemplateLB);
672         }
673     }
674 }
675 
676 
677 
678 
679 AssistentDlgImpl::~AssistentDlgImpl()
680 {
681     CloseDocShell();
682 
683     DeletePassords();
684 
685     //  Delete the template file infos.
686     std::vector<TemplateDir*>::iterator I;
687     std::vector<TemplateEntry*>::iterator   J;
688     for (I=maPresentList.begin(); I!=maPresentList.end(); I++)
689     {
690         for (J=(*I)->maEntries.begin(); J!=(*I)->maEntries.end(); J++)
691             delete (*J);
692         delete (*I);
693     }
694 
695     // Seite 1
696     delete mpPage1FB;
697     delete mpPage1ArtFL;
698     delete mpPage1EmptyRB;
699     delete mpPage1TemplateRB;
700     delete mpPage1TemplateLB;
701     delete mpPage1RegionLB;
702     delete mpPage1OpenRB;
703     delete mpPage1OpenLB;
704     delete mpPage1OpenPB;
705 
706     // Seite 2
707     delete mpPage2FB;
708     delete mpPage2LayoutFL;
709     delete mpPage2RegionLB;
710     delete mpPage2LayoutLB;
711     delete mpPage2OutTypesFL;
712     delete mpPage2Medium1RB;
713     delete mpPage2Medium2RB;
714     delete mpPage2Medium3RB;
715     delete mpPage2Medium4RB;
716     delete mpPage2Medium5RB;
717 
718     // Seite 3
719     delete mpPage3FB;
720     delete mpPage3EffectFL;
721     delete mpPage3EffectFT;
722     delete mpPage3EffectLB;
723     delete mpPage3SpeedFT;
724     delete mpPage3SpeedLB;
725     delete mpPage3PresTypeFL;
726     delete mpPage3PresTypeLiveRB;
727     delete mpPage3PresTypeKioskRB;
728     delete mpPage3PresTimeFT;
729     delete mpPage3PresTimeTMF;
730     delete mpPage3BreakFT;
731     delete mpPage3BreakTMF;
732     delete mpPage3LogoCB;
733 
734     // Seite 4
735     delete mpPage4FB;
736     delete mpPage4PersonalFL;
737     delete mpPage4AskNameFT;
738     delete mpPage4AskNameEDT;
739     delete mpPage4AskTopicFT;
740     delete mpPage4AskTopicEDT;
741     delete mpPage4AskInfoFT;
742     delete mpPage4AskInfoEDT;
743 
744     // Seite 5
745     delete mpPage5FB;
746     delete mpPage5PageListFT;
747     delete mpPage5PageListCT;
748     delete mpPage5SummaryCB;
749 
750     //  Delete the file history list.
751     std::vector<String*>::iterator  I2;
752     for (I2=maOpenFilesList.begin(); I2!=maOpenFilesList.end(); I2++)
753         delete *I2;
754 }
755 
756 void AssistentDlgImpl::CloseDocShell()
757 {
758     if(xDocShell.Is())
759     {
760         //uno::Reference< lang::XComponent > xModel( xDocShell->GetModel(), uno::UNO_QUERY );
761         uno::Reference< util::XCloseable > xCloseable( xDocShell->GetModel(), uno::UNO_QUERY );
762         //if( xModel.is() )
763         if( xCloseable.is() )
764         {
765             xCloseable->close( sal_True );
766             xDocShell = NULL;
767             //xModel->dispose();
768         }
769         else
770         {
771             xDocShell->DoClose();
772             xDocShell = NULL;
773         }
774     }
775 }
776 
777 void AssistentDlgImpl::EndDialog( long )
778 {
779     mpWindow = NULL;
780 }
781 
782 
783 
784 
785 void    AssistentDlgImpl::ScanDocmenu   (void)
786 {
787     if( mbRecentDocumentsReady )
788         return;
789 
790     uno::Sequence<uno::Sequence<beans::PropertyValue> > aHistory =
791         SvtHistoryOptions().GetList (ePICKLIST);
792 
793     uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
794     uno::Reference< container::XNameAccess > xFilterFactory( xFactory->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.FilterFactory" ) ) ), uno::UNO_QUERY );
795 
796     Reference< ::com::sun::star::ucb::XSimpleFileAccess > xFileAccess(
797         xFactory->createInstance(
798             ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ucb.SimpleFileAccess"))),
799         UNO_QUERY_THROW);
800 
801     sal_uInt32 nCount = aHistory.getLength();
802     for (sal_uInt32 nItem=0; nItem<nCount; ++nItem)
803     {
804         //  Get the current history item's properties.
805         uno::Sequence<beans::PropertyValue> aPropertySet = aHistory[nItem];
806         rtl::OUString   sURL;
807         rtl::OUString   sFilter;
808         rtl::OUString   sTitle;
809         rtl::OUString   sPassword;
810         sal_uInt32 nPropertyCount = aPropertySet.getLength();
811         for (sal_uInt32 nProperty=0; nProperty<nPropertyCount; ++nProperty)
812             if (aPropertySet[nProperty].Name == HISTORY_PROPERTYNAME_URL)
813                 aPropertySet[nProperty].Value >>= sURL;
814             else if (aPropertySet[nProperty].Name == HISTORY_PROPERTYNAME_FILTER)
815                 aPropertySet[nProperty].Value >>= sFilter;
816             else if (aPropertySet[nProperty].Name == HISTORY_PROPERTYNAME_TITLE)
817                 aPropertySet[nProperty].Value >>= sTitle;
818             else if (aPropertySet[nProperty].Name == HISTORY_PROPERTYNAME_PASSWORD)
819                 aPropertySet[nProperty].Value >>= sPassword;
820 
821         //  If the entry is an impress file then insert it into the
822         //  history list and the list box.
823         uno::Sequence< beans::PropertyValue > lProps;
824         if (xFilterFactory->hasByName(sFilter))
825         {
826             uno::Any aFilterPropSet = xFilterFactory->getByName( sFilter );
827             aFilterPropSet >>= lProps;
828         }
829 
830         sal_Int32 nPropCount = lProps.getLength();
831         rtl::OUString sFactoryName;
832         for( sal_Int32 i=0; i<nPropCount; ++i )
833         {
834             if( lProps[i].Name.compareToAscii( "DocumentService" ) == 0 &&
835                 (lProps[i].Value >>= sFactoryName) &&
836                 sFactoryName.compareToAscii( "com.sun.star.presentation.PresentationDocument" ) == 0 )
837             {
838                 // yes, it's an impress document
839                 INetURLObject aURL;
840 
841                 // Do not include the file if it does not exist.
842                 if (xFileAccess.is() && ! xFileAccess->exists(sURL))
843                     continue;
844 
845                 aURL.SetSmartURL (sURL);
846                 // The password is set only when it is not empty.
847                 if (sPassword.getLength() > 0)
848                     aURL.SetPass (sPassword);
849                 maOpenFilesList.push_back (new String (aURL.GetMainURL( INetURLObject::NO_DECODE )));
850                 mpPage1OpenLB->InsertEntry (sTitle);
851                 break;
852             }
853         }
854     }
855     mbRecentDocumentsReady = sal_True;
856     try
857     {
858         UpdatePreview(sal_True);
859     }
860     catch (uno::RuntimeException& )
861     {
862         // Ignore all exceptions.
863     }
864 }
865 
866 
867 
868 void AssistentDlgImpl::ProvideTemplates (void)
869 {
870     if ( ! mbTemplatesReady)
871     {
872         TemplateScanner aScanner;
873         aScanner.Scan ();
874         TemplateScanDone (aScanner.GetFolderList());
875 
876         try
877         {
878             UpdatePreview(sal_True);
879         }
880         catch (uno::RuntimeException& e)
881         {
882             // Ignore all exceptions.
883             (void) e;
884         }
885     }
886 }
887 
888 void AssistentDlgImpl::TemplateScanDone (
889     std::vector<TemplateDir*>& rTemplateFolder)
890 {
891     //  This method is called from a thread.  Therefore we get the solar mutex.
892     ::vos::OGuard aGuard (Application::GetSolarMutex());
893 
894     // Copy the contents of the given template folders to a local list.
895     maPresentList.swap (rTemplateFolder);
896 
897     //  Fill in the list box on the first page.
898     int nFirstEntry = 0;
899     mpPage1RegionLB->Clear();
900     std::vector<TemplateDir*>::iterator I;
901     int i;
902     for (i=0,I=maPresentList.begin(); I!=maPresentList.end(); I++,i++)
903     {
904         TemplateDir* pDir = *I;
905         if (pDir == NULL)
906             continue;
907 
908         // HACK! presnt directory is always initially selected.
909         // We have to look at the first entry to get a URL.
910         if (!pDir->maEntries.empty() )
911         {
912             TemplateEntry* pEntry = pDir->maEntries.front();
913             if (pEntry != NULL)
914                 if (pEntry->msPath.SearchAscii("presnt") != STRING_NOTFOUND)
915                     nFirstEntry = i;
916         }
917 
918         mpPage1RegionLB->InsertEntry (pDir->msRegion);
919     }
920     mpPage1RegionLB->SelectEntryPos ((sal_uInt16)nFirstEntry);
921     mpPage1RegionLB->Update();
922     SelectTemplateRegion (mpPage1RegionLB->GetSelectEntry());
923 
924     //  Fill in the list box on the second page.
925     nFirstEntry = 0;
926     mpPage2RegionLB->Clear();
927     for (i=0,I=maPresentList.begin(); I!=maPresentList.end(); I++,i++)
928     {
929         TemplateDir* pDir = *I;
930         if (pDir == NULL)
931             continue;
932 
933         // HACK! layout directory is always initially selected.
934         // We have to look at the first entry to get a URL.
935         if (!pDir->maEntries.empty() )
936         {
937             TemplateEntry* pEntry = pDir->maEntries.front();
938             if (pEntry != NULL)
939                 if (pEntry->msPath.SearchAscii("layout") != STRING_NOTFOUND)
940                     nFirstEntry = i;
941         }
942 
943         mpPage2RegionLB->InsertEntry (pDir->msRegion);
944     }
945     mpPage2RegionLB->SelectEntryPos ((sal_uInt16)nFirstEntry);
946     mpPage2RegionLB->Update();
947     SelectLayoutRegion (mpPage2RegionLB->GetSelectEntry());
948 
949     //  Make the changes visible.
950     mbTemplatesReady = sal_True;
951     if (mpWindow)
952         UpdatePage();
953 }
954 
955 
956 
957 
958 // ********************************************************************
959 // Status Methoden
960 // ********************************************************************
961 
962 void AssistentDlgImpl::SetStartType( StartType eType )
963 {
964     mpPage1EmptyRB->SetState( eType == ST_EMPTY );
965     mpPage1TemplateRB->SetState( eType == ST_TEMPLATE );
966     mpPage1OpenRB->SetState( eType == ST_OPEN );
967     maNextPageButton.Enable( eType != ST_OPEN );
968 
969     mpPage1RegionLB->Show(eType == ST_TEMPLATE);
970     mpPage1TemplateLB->Show(eType == ST_TEMPLATE);
971     mpPage1OpenLB->Show(eType == ST_OPEN);
972     mpPage1OpenPB->Show(eType == ST_OPEN);
973 
974     if (eType == ST_OPEN)
975         maFinishButton.SetText(maOpenStr);
976     else
977         maFinishButton.SetText(maCreateStr);
978 }
979 
980 StartType AssistentDlgImpl::GetStartType()
981 {
982     if( mpPage1EmptyRB->IsChecked() )
983         return ST_EMPTY;
984     else if( mpPage1TemplateRB->IsChecked() )
985         return ST_TEMPLATE;
986     else
987         return ST_OPEN;
988 }
989 
990 String AssistentDlgImpl::GetDocFileName()
991 {
992     String aTitle;
993     if(mpWindow)
994     {
995         aTitle = mpWindow->GetText();
996         sal_uInt16 nPos = aTitle.Search(sal_Unicode('('));
997         if(nPos != STRING_NOTFOUND)
998             aTitle.Erase( nPos-1 );
999     }
1000 
1001     String aDocFile;
1002     if( GetStartType() == ST_TEMPLATE )
1003     {
1004         const sal_uInt16 nEntry = mpPage1TemplateLB->GetSelectEntryPos();
1005         TemplateEntry* pEntry = NULL;
1006         if(nEntry != (sal_uInt16)-1)
1007             pEntry = mpTemplateRegion->maEntries[nEntry];
1008 
1009         if(pEntry)
1010         {
1011             aDocFile = pEntry->msPath;
1012 
1013             aTitle.AppendAscii( RTL_CONSTASCII_STRINGPARAM(  " (" ) );
1014             aTitle.Append( pEntry->msTitle );
1015             aTitle.Append( sal_Unicode(')') );
1016         }
1017     }
1018     else if( GetStartType() == ST_OPEN )
1019     {
1020         const sal_uInt16 nEntry = mpPage1OpenLB->GetSelectEntryPos();
1021         if(nEntry != (sal_uInt16)-1 )
1022             aDocFile = *maOpenFilesList[nEntry];
1023     }
1024 
1025     if(mpWindow)
1026         mpWindow->SetText(aTitle);
1027 
1028     return aDocFile;
1029 }
1030 
1031 String AssistentDlgImpl::GetLayoutFileName()
1032 {
1033     String aFile;
1034     const sal_uInt16 nEntry = mpPage2LayoutLB->GetSelectEntryPos();
1035     TemplateEntry* pEntry = NULL;
1036     if(nEntry != (sal_uInt16)-1 && nEntry > 0)
1037         pEntry = mpLayoutRegion->maEntries[nEntry-1];
1038 
1039     if(pEntry)
1040         aFile = pEntry->msPath;
1041 
1042     return aFile;
1043 }
1044 
1045 SfxObjectShellLock AssistentDlgImpl::GetDocument()
1046 {
1047 //  mbPreview = sal_False;      // Document nicht anzeigen
1048     UpdatePreview(sal_False);   // aber komplett laden
1049     UpdatePageList();
1050 
1051     SfxObjectShell* pShell = xDocShell;
1052     ::sd::DrawDocShell* pDocShell = PTR_CAST(::sd::DrawDocShell,pShell);
1053     SdDrawDocument* pDoc = pDocShell?pDocShell->GetDoc():NULL;
1054 
1055     if(pDoc)
1056     {
1057         const sal_uInt16 nPageCount = pDoc->GetSdPageCount(PK_STANDARD);
1058         sal_Bool bKiosk = mpPage3PresTypeKioskRB->IsChecked();
1059         sal_uInt32 nNewTime = (sal_uInt32)mpPage3PresTimeTMF->GetTime().GetMSFromTime() / 1000;
1060         if(bKiosk)
1061         {
1062             PresentationSettings& rSettings = pDoc->getPresentationSettings();
1063             rSettings.mbEndless = bKiosk;
1064             rSettings.mnPauseTimeout = (sal_Int32)mpPage3BreakTMF->GetTime().GetMSFromTime() / 1000;
1065             rSettings.mbShowPauseLogo = mpPage3LogoCB->IsChecked();
1066         }
1067 
1068         sal_uInt16 nPgAbsNum = 0;
1069         sal_uInt16 nPgRelNum = 0;
1070         while( nPgAbsNum < nPageCount )
1071         {
1072             SdPage* pPage = pDoc->GetSdPage( nPgRelNum, PK_STANDARD );
1073             if( mpPage5PageListCT->IsPageChecked(nPgAbsNum) )
1074             {
1075                 mpPage3EffectLB->applySelected(pPage);
1076                 const sal_uInt16 nPos = mpPage3SpeedLB->GetSelectEntryPos();
1077                 pPage->setTransitionDuration( (nPos == 0) ? 3.0 : (nPos == 1) ? 2.0 : 1.0 );
1078                 if(bKiosk)
1079                 {
1080                     pPage->SetPresChange( PRESCHANGE_AUTO );
1081                     pPage->SetTime(nNewTime);
1082                 }
1083                 nPgRelNum++;
1084             }
1085             else
1086             {
1087                 // diese Seite loeschen
1088                 pDoc->DeletePage( (nPgRelNum << 1) + 2 ); // Notizseite loeschen
1089                 pDoc->DeletePage( (nPgRelNum << 1) + 1 );   // Seite loeschen
1090             }
1091 
1092             nPgAbsNum++;
1093         }
1094     }
1095     else
1096     {
1097         DBG_ERROR("sd::AssistentDlgImpl::GetDocument(), no template?");
1098     }
1099 
1100     SfxObjectShellLock xRet = xDocShell;
1101     xDocShell = NULL;
1102 
1103     return xRet;
1104 }
1105 
1106 void AssistentDlgImpl::LeavePage()
1107 {
1108     int nPage = maAssistentFunc.GetCurrentPage();
1109 
1110     if( nPage == 4 && mbUserDataDirty )
1111         maPrevTimer.Start();
1112 }
1113 
1114 void AssistentDlgImpl::ChangePage()
1115 {
1116     maNextPageButton.Enable(!maAssistentFunc.IsLastPage());
1117     maLastPageButton.Enable(!maAssistentFunc.IsFirstPage());
1118 
1119     sal_uInt16 nPage = (sal_uInt16)maAssistentFunc.GetCurrentPage();
1120 
1121     if( mpWindow )
1122     {
1123         mpWindow->SetHelpId( PageHelpIds[nPage-1]);
1124     }
1125 
1126     UpdatePage();
1127 
1128     if( maNextPageButton.IsEnabled() )
1129     {
1130       maNextPageButton.ForceFocusEventBroadcast();
1131     }
1132     else
1133         maFinishButton.GrabFocus();
1134 }
1135 
1136 void AssistentDlgImpl::UpdatePage()
1137 {
1138     sal_uInt16 nPage = (sal_uInt16)maAssistentFunc.GetCurrentPage();
1139 
1140     switch(nPage)
1141     {
1142     case 1:
1143         {
1144             // Elemente auf der ersten Seite abhaengig vom Starttype Zeigen
1145             SetStartType( GetStartType() );
1146             mpPage1TemplateRB->Enable(sal_True /*mbTemplatesReady*/);
1147             break;
1148         }
1149 
1150     case 2:
1151         {
1152             mpPage2RegionLB->Enable(mbTemplatesReady);
1153             mpPage2LayoutLB->Enable(mbTemplatesReady);
1154 
1155             if( GetStartType() != ST_EMPTY )
1156             {
1157                 mpPage2Medium5RB->Enable( sal_True );
1158             }
1159             else
1160             {
1161                 mpPage2Medium5RB->Enable( sal_False );
1162                 if(mpPage2Medium5RB->IsChecked())
1163                     mpPage2Medium1RB->Check();
1164             }
1165 
1166             break;
1167         }
1168     case 5:
1169         {
1170             if(mbDocPreview || maPageListFile != maDocFile)
1171                 mpPage5PageListCT->Clear();
1172 
1173             maUpdatePageListTimer.Start();
1174             break;
1175         }
1176 
1177     case 3:
1178         {
1179             if(GetStartType() != ST_TEMPLATE)
1180                 maNextPageButton.Enable(false);
1181 
1182             sal_Bool bKiosk = mpPage3PresTypeKioskRB->IsChecked();
1183             mpPage3PresTimeFT->Enable(bKiosk);
1184             mpPage3BreakFT->Enable(bKiosk);
1185             mpPage3PresTimeTMF->Enable(bKiosk);
1186             mpPage3BreakTMF->Enable(bKiosk);
1187             mpPage3LogoCB->Enable(bKiosk);
1188             break;
1189         }
1190     }
1191 }
1192 
1193 // ********************************************************************
1194 // UI-Handler
1195 // ********************************************************************
1196 
1197 IMPL_LINK( AssistentDlgImpl, SelectRegionHdl, ListBox *, pLB )
1198 {
1199     if( pLB == mpPage1RegionLB )
1200     {
1201         SelectTemplateRegion( pLB->GetSelectEntry() );
1202         SetStartType( ST_TEMPLATE );
1203         mpPage2Medium5RB->Check();
1204     }
1205     else
1206     {
1207         SelectLayoutRegion( pLB->GetSelectEntry() );
1208     }
1209 
1210     return 0;
1211 }
1212 
1213 IMPL_LINK( AssistentDlgImpl, SelectEffectHdl, void*, EMPTYARG )
1214 {
1215     maEffectPrevTimer.Start();
1216     return 0;
1217 }
1218 
1219 IMPL_LINK( AssistentDlgImpl, OpenButtonHdl, Button*, pButton )
1220 {
1221     // Clear the selection and forward the call.
1222     mpPage1OpenLB->SetNoSelection();
1223     return mpPage1OpenLB->GetDoubleClickHdl().Call(pButton);
1224 }
1225 
1226 IMPL_LINK( AssistentDlgImpl, EffectPreviewHdl, Button *, EMPTYARG )
1227 {
1228     if(mbPreview && xDocShell.Is() )
1229     {
1230         SfxObjectShell* pShell = xDocShell;
1231         DrawDocShell* pDocShell = dynamic_cast< DrawDocShell * >(pShell);
1232         if( pDocShell )
1233         {
1234             SdDrawDocument* pDoc = pDocShell->GetDoc();
1235             if( pDoc )
1236             {
1237                 SdPage* pPage = pDoc->GetSdPage( mnShowPage, PK_STANDARD );
1238                 if( pPage )
1239                     mpPage3EffectLB->applySelected(pPage);
1240             }
1241         }
1242         maPreview.startPreview();
1243     }
1244     return 0;
1245 }
1246 
1247 IMPL_LINK( AssistentDlgImpl, PreviewFlagHdl, CheckBox *, EMPTYARG )
1248 
1249 {
1250     if( maPreviewFlag.IsChecked() != mbPreview )
1251     {
1252         mbPreview = maPreviewFlag.IsChecked();
1253         UpdatePreview(sal_True);
1254     }
1255     return 0;
1256 }
1257 
1258 IMPL_LINK( AssistentDlgImpl, SelectTemplateHdl, ListBox *, EMPTYARG )
1259 {
1260     SetStartType( ST_TEMPLATE );
1261     mpPage2Medium5RB->Check();
1262     mpPage2LayoutLB->SelectEntryPos(0);
1263     maPrevTimer.Start();
1264     return 0;
1265 }
1266 
1267 IMPL_LINK( AssistentDlgImpl, SelectLayoutHdl, ListBox *, EMPTYARG )
1268 {
1269     maPrevTimer.Start();
1270     return 0;
1271 }
1272 
1273 IMPL_LINK( AssistentDlgImpl, SelectFileHdl, ListBox *, EMPTYARG )
1274 {
1275     SetStartType( ST_OPEN );
1276     maPrevTimer.Start();
1277     return 0;
1278 }
1279 
1280 IMPL_LINK( AssistentDlgImpl, PageSelectHdl, Control *, EMPTYARG )
1281 {
1282     sal_uInt16 nPage = mpPage5PageListCT->GetSelectedPage();
1283     if( mnShowPage != nPage )
1284     {
1285         mnShowPage = nPage;
1286         UpdatePreview(sal_False);
1287     }
1288 
1289     return 0;
1290 }
1291 
1292 IMPL_LINK( AssistentDlgImpl, UpdatePageListHdl, void *, EMPTYARG )
1293 {
1294     UpdatePageList();
1295     return 0;
1296 }
1297 
1298 IMPL_LINK( AssistentDlgImpl, UpdatePreviewHdl, void *, EMPTYARG )
1299 {
1300     UpdatePreview( sal_True );
1301     return 0;
1302 }
1303 
1304 IMPL_LINK( AssistentDlgImpl, StartTypeHdl, RadioButton *, pButton )
1305 {
1306     StartType eType = pButton == mpPage1EmptyRB?ST_EMPTY:pButton == mpPage1TemplateRB?ST_TEMPLATE:ST_OPEN;
1307 
1308     if(eType == ST_TEMPLATE)
1309         ProvideTemplates();
1310     else if(eType == ST_OPEN)
1311         ScanDocmenu();
1312 
1313     SetStartType( eType );
1314 
1315     if(eType == ST_TEMPLATE)
1316     {
1317         mpPage1TemplateLB->SelectEntryPos(0);
1318         mpPage2Medium5RB->Check();
1319     }
1320     else if(eType == ST_OPEN)
1321         mpPage1OpenLB->SelectEntryPos(0);
1322 
1323     maPrevTimer.Start();
1324     return 0;
1325 }
1326 
1327 
1328 IMPL_LINK( AssistentDlgImpl, NextPageHdl, PushButton *, EMPTYARG )
1329 {
1330     // When changing from the first to the second page make sure that the
1331     // templates are present.
1332     if (maAssistentFunc.GetCurrentPage() == 1)
1333         ProvideTemplates();
1334 
1335     // Change to the next page.
1336     LeavePage();
1337     maAssistentFunc.NextPage();
1338     ChangePage();
1339     return 0;
1340 }
1341 
1342 IMPL_LINK( AssistentDlgImpl, LastPageHdl, PushButton *, EMPTYARG )
1343 {
1344     LeavePage();
1345     maAssistentFunc.PreviousPage();
1346     ChangePage();
1347     return 0;
1348 }
1349 
1350 IMPL_LINK( AssistentDlgImpl, PresTypeHdl, RadioButton*, EMPTYARG )
1351 {
1352     if(maDocFile.Len() == 0)
1353       {
1354         maNextPageButton.Enable(false);
1355       }
1356 
1357     sal_Bool bKiosk = mpPage3PresTypeKioskRB->IsChecked();
1358     mpPage3PresTimeFT->Enable(bKiosk);
1359     mpPage3BreakFT->Enable(bKiosk);
1360     mpPage3PresTimeTMF->Enable(bKiosk);
1361     mpPage3BreakTMF->Enable(bKiosk);
1362     mpPage3LogoCB->Enable(bKiosk);
1363     return 0;
1364 }
1365 
1366 IMPL_LINK( AssistentDlgImpl, UpdateUserDataHdl, Edit*, EMPTYARG )
1367 {
1368     mbUserDataDirty = sal_True;
1369     String aTopic = mpPage4AskTopicEDT->GetText();
1370     String aName  = mpPage4AskNameEDT->GetText();
1371     String aInfo  = mpPage4AskInfoEDT->GetText();
1372 
1373     if(aTopic.Len() == 0 && aName.Len() == 0 && aInfo.Len() == 0)
1374         maDocFile.Erase();
1375 
1376     return 0;
1377 }
1378 
1379 // ********************************************************************
1380 // ********************************************************************
1381 
1382 void AssistentDlgImpl::SelectTemplateRegion( const String& rRegion )
1383 {
1384     mpPage1TemplateLB->Clear();
1385     std::vector<TemplateDir*>::iterator I;
1386     for (I=maPresentList.begin(); I!=maPresentList.end(); I++)
1387     {
1388         TemplateDir * pDir = *I;
1389         mpTemplateRegion = *I;
1390         if (pDir->msRegion.Equals( rRegion ) )
1391         {
1392             std::vector<TemplateEntry*>::iterator   J;
1393             for (J=pDir->maEntries.begin(); J!=pDir->maEntries.end(); J++)
1394                 mpPage1TemplateLB->InsertEntry ((*J)->msTitle);
1395             mpPage1TemplateLB->Update();
1396             if(GetStartType() == ST_TEMPLATE)
1397             {
1398                 mpPage1TemplateLB->SelectEntryPos( 0 );
1399                 SelectTemplateHdl(NULL);
1400             }
1401             break;
1402         }
1403     }
1404 }
1405 
1406 void AssistentDlgImpl::SelectLayoutRegion( const String& rRegion )
1407 {
1408     mpPage2LayoutLB->Clear();
1409     mpPage2LayoutLB->InsertEntry(String(SdResId(STR_WIZARD_ORIGINAL)));
1410     std::vector<TemplateDir*>::iterator I;
1411     for (I=maPresentList.begin(); I!=maPresentList.end(); I++)
1412     {
1413         TemplateDir * pDir = *I;
1414         mpLayoutRegion = *I;
1415 
1416         if (pDir->msRegion.Equals (rRegion))
1417         {
1418             std::vector<TemplateEntry*>::iterator   J;
1419             for (J=pDir->maEntries.begin(); J!=pDir->maEntries.end(); J++)
1420                 mpPage2LayoutLB->InsertEntry ((*J)->msTitle);
1421             mpPage2LayoutLB->Update();
1422             break;
1423         }
1424     }
1425 }
1426 
1427 void AssistentDlgImpl::UpdateUserData()
1428 {
1429     String aTopic = mpPage4AskTopicEDT->GetText();
1430     String aName  = mpPage4AskNameEDT->GetText();
1431     String aInfo  = mpPage4AskInfoEDT->GetText();
1432 
1433     SfxObjectShell* pShell = xDocShell;
1434     DrawDocShell* pDocShell = PTR_CAST(DrawDocShell,pShell);
1435     SdDrawDocument* pDoc = pDocShell?pDocShell->GetDoc():NULL;
1436     SdPage* pPage = pDoc?pDoc->GetSdPage(0, PK_STANDARD):NULL;
1437 
1438     if(pPage && ( aTopic.Len() != 0 || aName.Len() != 0 || aInfo.Len() != 0 ) )
1439     {
1440         if( pPage->GetAutoLayout() == AUTOLAYOUT_NONE )
1441             pPage->SetAutoLayout(AUTOLAYOUT_TITLE, sal_True);
1442 
1443         SdrTextObj* pObj;
1444         String aEmptyString;
1445 
1446         if( aTopic.Len() )
1447         {
1448             pObj  = dynamic_cast<SdrTextObj*>( pPage->GetPresObj( PRESOBJ_TITLE ) );
1449             if( pObj )
1450             {
1451                 pPage->SetObjText( pObj, NULL, PRESOBJ_TITLE, aTopic );
1452                 pObj->NbcSetStyleSheet( pPage->GetStyleSheetForPresObj( PRESOBJ_TITLE ), sal_True );
1453                 pObj->SetEmptyPresObj(sal_False);
1454             }
1455 
1456         }
1457 
1458         if ( aName.Len() || aInfo.Len() )
1459         {
1460             String aStrTmp( aName );
1461             if( aName.Len() )
1462                 aStrTmp.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "\n\n" ) );
1463             aStrTmp.Append( aInfo );
1464 
1465             pObj = dynamic_cast<SdrTextObj*>( pPage->GetPresObj( PRESOBJ_OUTLINE ) );
1466             if( pObj )
1467             {
1468                 pPage->SetObjText( pObj, NULL, PRESOBJ_OUTLINE, aStrTmp );
1469                 pObj->NbcSetStyleSheet( pPage->GetStyleSheetForPresObj( PRESOBJ_OUTLINE ), sal_True );
1470                 pObj->SetEmptyPresObj(sal_False);
1471             }
1472             else
1473             {
1474                 pObj = dynamic_cast<SdrTextObj*>( pPage->GetPresObj( PRESOBJ_TEXT ) );
1475                 if( pObj )
1476                 {
1477                     pPage->SetObjText( pObj, NULL, PRESOBJ_TEXT, aStrTmp );
1478                     pObj->NbcSetStyleSheet( pPage->GetStyleSheetForPresObj( PRESOBJ_TEXT ), sal_True );
1479                     pObj->SetEmptyPresObj(sal_False);
1480                 }
1481             }
1482         }
1483     }
1484 
1485     mbUserDataDirty = sal_False;
1486 }
1487 
1488 void AssistentDlgImpl::UpdatePageList()
1489 {
1490     if(mbDocPreview || !mbPreview)
1491         UpdatePreview(sal_False);
1492     else if(maPageListFile == maDocFile)
1493         return;
1494 
1495     maPageListFile = maDocFile;
1496 
1497     SfxObjectShell* pShell = xDocShell;
1498     DrawDocShell* pDocShell = PTR_CAST(DrawDocShell,pShell);
1499     SdDrawDocument* pDoc = pDocShell?pDocShell->GetDoc():NULL;
1500 
1501     mpPage5PageListCT->Clear();
1502 
1503     if(pDoc)
1504         mpPage5PageListCT->Fill(pDoc);
1505 }
1506 
1507 void AssistentDlgImpl::UpdatePreview( sal_Bool bDocPreview )
1508 {
1509     // Guard against multiple concurrent execution to this method caused either
1510     // by calls from different threads or recursion.
1511     ::osl::MutexGuard aGuard (maMutex);
1512     if (mbPreviewUpdating)
1513         return;
1514     mbPreviewUpdating = sal_True;
1515 
1516     if(!mbPreview && bDocPreview)
1517     {
1518         maPreview.Invalidate();
1519         maPreview.SetObjectShell(0);
1520         mbPreviewUpdating = sal_False;
1521         return;
1522     }
1523 
1524     String aDocFile = GetDocFileName();
1525     String aLayoutFile = GetLayoutFileName();
1526     String aEmptyStr;
1527 
1528     SfxApplication *pSfxApp = SFX_APP();
1529     sal_uLong lErr;
1530     sal_Bool bChangeMaster = aLayoutFile.Len() != 0;
1531 
1532     if( aDocFile.Len() == 0 )
1533     {
1534         if( !xDocShell.Is() || maDocFile.Len() != 0 ||
1535             (maDocFile.Len() == 0 && maLayoutFile.Len() != 0 && aLayoutFile.Len() == 0 ))
1536         {
1537             CloseDocShell();
1538 
1539             DrawDocShell* pNewDocSh;
1540             xDocShell = pNewDocSh = new DrawDocShell(SFX_CREATE_MODE_STANDARD, sal_False);
1541             pNewDocSh->DoInitNew(NULL);
1542             SdDrawDocument* pDoc = pNewDocSh->GetDoc();
1543             pDoc->CreateFirstPages();
1544             pDoc->StopWorkStartupDelay();
1545             mbDocPreview = sal_False;
1546 
1547             maDocFile = aDocFile;
1548             mbUserDataDirty = sal_True;
1549         }
1550         else
1551             bChangeMaster = (aLayoutFile.Len() != 0) && (maLayoutFile != aLayoutFile);
1552     }
1553     else if( aDocFile == maDocFile && ( mbDocPreview == bDocPreview || bDocPreview ) )
1554     {
1555         if( aLayoutFile != maLayoutFile )
1556         {
1557             SfxObjectShell* pShell = xDocShell;
1558             DrawDocShell* pDocShell = PTR_CAST(DrawDocShell,pShell);
1559             ::svl::IUndoManager* pUndoMgr = pDocShell?pDocShell->GetUndoManager():NULL;
1560             if(pUndoMgr)
1561                 pUndoMgr->Undo();
1562             mbUserDataDirty = sal_True;
1563         }
1564         else
1565             bChangeMaster = sal_False;
1566     }
1567     else
1568     {
1569         CloseDocShell();
1570 
1571         ::Window *pParent = Application::GetDefDialogParent();
1572         Application::SetDefDialogParent( mpWindow );
1573 
1574         SfxErrorContext eEC(ERRCTX_SFX_LOADTEMPLATE,mpWindow);
1575 
1576         SfxItemSet* pSet = new SfxAllItemSet( pSfxApp->GetPool() );
1577         if(IsOwnFormat(aDocFile))
1578         {
1579             pSet->Put( SfxBoolItem( SID_TEMPLATE, sal_True ) );
1580             if(bDocPreview)
1581                 pSet->Put( SfxBoolItem( SID_PREVIEW, sal_True ) );
1582             RestorePassword( pSet, aDocFile );
1583             if( (lErr = pSfxApp->LoadTemplate( xDocShell, aDocFile, sal_True, pSet )) != 0 )
1584                 ErrorHandler::HandleError(lErr);
1585             else
1586                 SavePassword( xDocShell, aDocFile );
1587         }
1588         else
1589         {
1590             const String aTargetStr( RTL_CONSTASCII_USTRINGPARAM("_default") );
1591 
1592             SfxRequest aReq( SID_OPENDOC, SFX_CALLMODE_SYNCHRON, SFX_APP()->GetPool() );
1593             aReq.AppendItem( SfxStringItem( SID_FILE_NAME, aDocFile ));
1594             aReq.AppendItem( SfxStringItem( SID_REFERER, aEmptyStr ) );
1595             aReq.AppendItem( SfxStringItem( SID_TARGETNAME, aTargetStr ) );
1596             aReq.AppendItem( SfxBoolItem( SID_HIDDEN, sal_True ) );
1597             aReq.AppendItem( SfxBoolItem( SID_PREVIEW, bDocPreview ) );
1598 
1599             const SfxViewFrameItem* pRet = PTR_CAST( SfxViewFrameItem, SFX_APP()->ExecuteSlot( aReq ) );
1600 
1601             if ( pRet && pRet->GetFrame() && pRet->GetFrame()->GetObjectShell() )
1602                 xDocShell = pRet->GetFrame()->GetObjectShell();
1603         }
1604 
1605 
1606         Application::SetDefDialogParent( pParent );
1607 
1608         mnShowPage = 0;
1609         mbDocPreview = bDocPreview;
1610         maDocFile = aDocFile;
1611         mbUserDataDirty = sal_True;
1612     }
1613 
1614     if(bChangeMaster && (aLayoutFile != maDocFile))
1615     {
1616         // Layoutvorlage laden
1617         SfxObjectShellLock xLayoutDocShell;
1618         SfxErrorContext eEC(ERRCTX_SFX_LOADTEMPLATE,mpWindow);
1619         SfxItemSet* pSet = new SfxAllItemSet( pSfxApp->GetPool() );
1620 
1621         ::Window *pParent = Application::GetDefDialogParent();
1622         Application::SetDefDialogParent( mpWindow );
1623 
1624         if(IsOwnFormat(aLayoutFile))
1625         {
1626             pSet->Put( SfxBoolItem( SID_TEMPLATE, sal_True ) );
1627             pSet->Put( SfxBoolItem( SID_PREVIEW, sal_True ) );
1628 
1629             RestorePassword( pSet, aLayoutFile );
1630             if( (lErr = pSfxApp->LoadTemplate( xLayoutDocShell, aLayoutFile, sal_True, pSet )) != 0 )
1631                 ErrorHandler::HandleError(lErr);
1632             SavePassword( xLayoutDocShell, aLayoutFile );
1633         }
1634 
1635         Application::SetDefDialogParent( pParent );
1636 
1637         // die Implementierung ermitteln
1638         SfxObjectShell* pShell = xDocShell;
1639         DrawDocShell* pDocShell = PTR_CAST(DrawDocShell,pShell);
1640         SdDrawDocument* pDoc = pDocShell?pDocShell->GetDoc():NULL;
1641 
1642         pShell = xLayoutDocShell;
1643         pDocShell = PTR_CAST(DrawDocShell,pShell);
1644         SdDrawDocument* pLayoutDoc = pDocShell?pDocShell->GetDoc():NULL;
1645 
1646         if( pDoc && pLayoutDoc )
1647         {
1648             pDoc->SetMasterPage(0, aEmptyStr, pLayoutDoc, sal_True,  sal_False );
1649         }
1650         else
1651         {
1652             DBG_ERROR("sd::AssistentDlgImpl::UpdatePreview(), no document for preview?");
1653         }
1654 
1655         mbUserDataDirty = sal_True;
1656     }
1657     maLayoutFile = aLayoutFile;
1658 
1659     if(mbUserDataDirty)
1660         UpdateUserData();
1661 
1662     if ( !xDocShell.Is() || !mbPreview )
1663         maPreview.SetObjectShell( 0 );
1664     else
1665     {
1666         maPreview.SetObjectShell( xDocShell, mnShowPage );
1667     }
1668 
1669     mbPreviewUpdating = sal_False;
1670 }
1671 
1672 void AssistentDlgImpl::SavePassword( SfxObjectShellLock xDoc, const String& rPath )
1673 {
1674     if(xDoc.Is())
1675     {
1676         SfxMedium * pMedium = xDoc->GetMedium();
1677         if(pMedium && pMedium->IsStorage())
1678         {
1679             SfxItemSet * pSet = pMedium->GetItemSet();
1680           const SfxPoolItem *pItem = 0;
1681           if( pSet->GetItemState(SID_PASSWORD, sal_True, &pItem) == SFX_ITEM_SET )
1682           {
1683             //TODO/MBA: testing
1684             String aPass( ((const SfxStringItem*)pItem)->GetValue());
1685             if(aPass.Len() == 0)
1686                 return;
1687 
1688             PasswordEntry* pEntry = maPasswordList.First();
1689             while(pEntry)
1690             {
1691                 if(pEntry->maPath == rPath)
1692                     break;
1693 
1694                 pEntry = maPasswordList.Next();
1695 
1696             }
1697 
1698             if(pEntry == NULL)
1699             {
1700                 pEntry = new PasswordEntry();
1701                 pEntry->maPath = rPath;
1702                 maPasswordList.Insert( pEntry );
1703             }
1704 
1705             if(pEntry)
1706                 pEntry->maPassword = aPass;
1707           }
1708         }
1709     }
1710 }
1711 
1712 void AssistentDlgImpl::RestorePassword( SfxItemSet* pSet, const String& rPath )
1713 {
1714     String aPassword( GetPassword( rPath ) );
1715 
1716     if(aPassword.Len())
1717         pSet->Put( SfxStringItem( SID_PASSWORD, aPassword ) );
1718 }
1719 
1720 String AssistentDlgImpl::GetPassword( const String rPath )
1721 {
1722     PasswordEntry* pEntry = maPasswordList.First();
1723     while(pEntry)
1724     {
1725         if(pEntry->maPath == rPath)
1726             return pEntry->maPassword;
1727 
1728         pEntry = maPasswordList.Next();
1729     }
1730 
1731     return String();
1732 }
1733 
1734 void AssistentDlgImpl::DeletePassords()
1735 {
1736     PasswordEntry* pEntry = maPasswordList.First();
1737     while(pEntry)
1738     {
1739         delete pEntry;
1740         pEntry = maPasswordList.Next();
1741     }
1742 }
1743 
1744 sal_Bool AssistentDlgImpl::IsOwnFormat( const String& rPath )
1745 {
1746     INetURLObject   aURL( rPath );
1747     String          aExt( aURL.GetFileExtension() );
1748 
1749     DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
1750 
1751     return !aExt.EqualsIgnoreCaseAscii( "ppt" );
1752 }
1753 
1754 
1755 
1756 
1757 String AssistentDlgImpl::GetUiTextForCommand (const ::rtl::OUString& sCommandURL)
1758 {
1759     String sLabel;
1760     Reference<container::XNameAccess> xUICommandLabels;
1761 
1762     try
1763     {
1764         do
1765         {
1766             if (sCommandURL.getLength() ==  0)
1767                 break;
1768 
1769             // Retrieve popup menu labels
1770             Reference<lang::XMultiServiceFactory> xFactory (
1771                 ::comphelper::getProcessServiceFactory ());
1772             if ( ! xFactory.is())
1773                 break;
1774 
1775             ::rtl::OUString sModuleIdentifier (
1776                 RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.PresentationDocument"));
1777             Reference<container::XNameAccess> xNameAccess (
1778                 xFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
1779                     "com.sun.star.frame.UICommandDescription"))),
1780                 UNO_QUERY);
1781             if ( ! xNameAccess.is())
1782                 break;
1783             Any a = xNameAccess->getByName(sModuleIdentifier);
1784             a >>= xUICommandLabels;
1785             if ( ! xUICommandLabels.is())
1786                 break;
1787 
1788             ::rtl::OUString sString;
1789             Sequence<beans::PropertyValue> aProperties;
1790             Any aAny (xUICommandLabels->getByName(sCommandURL));
1791             if (aAny >>= aProperties)
1792             {
1793                 sal_Int32 nCount (aProperties.getLength());
1794                 for (sal_Int32 i=0; i<nCount; i++)
1795                 {
1796                     ::rtl::OUString sPropertyName (aProperties[i].Name);
1797                     if (sPropertyName.equalsAscii("Label"))
1798                     {
1799                         aProperties[i].Value >>= sString;
1800                         break;
1801                     }
1802                 }
1803             }
1804             sLabel = sString;
1805         }
1806         while(false);
1807     }
1808     catch (com::sun::star::uno::Exception& rException)
1809     {
1810         (void)rException;
1811     }
1812 
1813     return sLabel;
1814 }
1815 
1816 
1817 
1818 
1819 Image AssistentDlgImpl::GetUiIconForCommand (const ::rtl::OUString& sCommandURL)
1820 {
1821     Image aIcon;
1822     Reference<container::XNameAccess> xUICommandLabels;
1823 
1824     try
1825     {
1826         do
1827         {
1828             if (sCommandURL.getLength() ==  0)
1829                 break;
1830 
1831             // Retrieve popup menu labels
1832             Reference<lang::XMultiServiceFactory> xFactory (
1833                 ::comphelper::getProcessServiceFactory ());
1834             if ( ! xFactory.is())
1835                 break;
1836 
1837             ::rtl::OUString sModuleIdentifier (
1838                 RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.PresentationDocument"));
1839 
1840             Reference<com::sun::star::ui::XModuleUIConfigurationManagerSupplier> xSupplier (
1841                 xFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
1842                     "com.sun.star.ui.ModuleUIConfigurationManagerSupplier"))),
1843                 UNO_QUERY_THROW);
1844 
1845             Reference<com::sun::star::ui::XUIConfigurationManager> xManager (
1846                 xSupplier->getUIConfigurationManager(sModuleIdentifier));
1847             if ( ! xManager.is())
1848                 break;
1849 
1850             Reference<com::sun::star::ui::XImageManager> xImageManager (
1851                 xManager->getImageManager(),
1852                 UNO_QUERY_THROW);
1853 
1854             Sequence<rtl::OUString> aCommandList(1);
1855             aCommandList[0] = sCommandURL;
1856             Sequence<Reference<graphic::XGraphic> > xIconList (
1857                 xImageManager->getImages(0,aCommandList));
1858             if ( ! xIconList.hasElements())
1859                 break;
1860 
1861             aIcon = Graphic(xIconList[0]).GetBitmapEx();
1862         }
1863         while(false);
1864     }
1865     catch (com::sun::star::uno::Exception& rException)
1866     {
1867         (void)rException;
1868     }
1869 
1870     return aIcon;
1871 }
1872 
1873 
1874 //////////////////////////////////////////////
1875 
1876 AssistentDlg::AssistentDlg(Window* pParent, sal_Bool bAutoPilot) :
1877     ModalDialog(pParent,SdResId(DLG_ASS))
1878 {
1879     Link aFinishLink = LINK(this,AssistentDlg, FinishHdl);
1880     mpImpl = new AssistentDlgImpl( this, aFinishLink, bAutoPilot );
1881 
1882     //Buttonbelegung
1883     mpImpl->maFinishButton.SetClickHdl(LINK(this,AssistentDlg,FinishHdl));
1884 
1885     FreeResource();
1886 }
1887 
1888 IMPL_LINK( AssistentDlg, FinishHdl, OKButton *, EMPTYARG )
1889 {
1890     if( GetStartType() == ST_OPEN )
1891     {
1892         //if we do not have a file here asked for one before ending the dialog
1893         String aFileToOpen = GetDocPath();
1894         if(aFileToOpen.Len() == 0)
1895         {
1896             sfx2::FileDialogHelper aFileDlg( WB_OPEN, ::String::CreateFromAscii("simpress") );
1897 
1898             if ( aFileDlg.Execute() == ERRCODE_NONE )
1899                 aFileToOpen = aFileDlg.GetPath();
1900             if( aFileToOpen.Len() == 0)
1901                 return 1;
1902             else
1903             {
1904                 //add the selected file to the recent-file-listbox and select the new entry
1905                 //this is necessary for 'GetDocPath()' returning the selected file after end of dialog
1906 
1907                 INetURLObject aURL;
1908                 aURL.SetSmartURL(aFileToOpen);
1909                 mpImpl->maOpenFilesList.push_back (new String (aURL.GetMainURL( INetURLObject::NO_DECODE )));
1910                 sal_uInt16 nNewPos = mpImpl->mpPage1OpenLB->InsertEntry(aURL.getName());
1911                 mpImpl->mpPage1OpenLB->SelectEntryPos(nNewPos);
1912             }
1913         }
1914     }
1915 
1916     //Ende
1917     mpImpl->EndDialog(RET_OK);
1918     EndDialog(RET_OK);
1919     return 0;
1920 }
1921 
1922 AssistentDlg::~AssistentDlg()
1923 {
1924     delete mpImpl;
1925 }
1926 
1927 
1928 SfxObjectShellLock AssistentDlg::GetDocument()
1929 {
1930     return mpImpl->GetDocument();
1931 }
1932 
1933 OutputType AssistentDlg::GetOutputMedium() const
1934 {
1935     if(mpImpl->mpPage2Medium1RB->IsChecked())
1936         return OUTPUT_PRESENTATION;
1937     else if(mpImpl->mpPage2Medium2RB->IsChecked())
1938         return OUTPUT_SLIDE;
1939     else if(mpImpl->mpPage2Medium3RB->IsChecked())
1940         return OUTPUT_OVERHEAD;
1941     else if(mpImpl->mpPage2Medium4RB->IsChecked())
1942         return OUTPUT_PAGE;
1943     else
1944         return OUTPUT_ORIGINAL;
1945 }
1946 
1947 sal_Bool AssistentDlg::IsSummary() const
1948 {
1949     return mpImpl->mpPage5SummaryCB->IsChecked();
1950 }
1951 
1952 StartType AssistentDlg::GetStartType() const
1953 {
1954     return mpImpl->GetStartType();
1955 }
1956 
1957 String AssistentDlg::GetDocPath() const
1958 {
1959     return mpImpl->GetDocFileName();
1960 }
1961 
1962 sal_Bool AssistentDlg::GetStartWithFlag() const
1963 {
1964     return !mpImpl->maStartWithFlag.IsChecked();
1965 }
1966 
1967 sal_Bool AssistentDlg::IsDocEmpty() const
1968 {
1969     return mpImpl->GetDocFileName().Len() == 0 &&
1970            mpImpl->GetLayoutFileName().Len() == 0;
1971 }
1972 
1973 String AssistentDlg::GetPassword()
1974 {
1975     return mpImpl->GetPassword( mpImpl->maDocFile );
1976 }
1977 
1978 
1979 
1980 
1981 //===== NextButton ============================================================
1982 
1983 NextButton::NextButton (::Window* pParent, const ResId& rResId)
1984     : maNextButton1(pParent, rResId),
1985       maNextButton2(pParent, rResId),
1986       mbIsFirstButtonActive(true)
1987 {
1988     // Hide the unused button.
1989     maNextButton2.Hide();
1990 }
1991 
1992 
1993 
1994 
1995 void NextButton::ForceFocusEventBroadcast (void)
1996 {
1997     // Hide the currently visible button and show and focus the other one.
1998     if (mbIsFirstButtonActive)
1999     {
2000         mbIsFirstButtonActive = false;
2001         maNextButton2.Show();
2002         maNextButton2.GrabFocus();
2003         maNextButton1.Hide();
2004     }
2005     else
2006     {
2007         mbIsFirstButtonActive = true;
2008         maNextButton1.Show();
2009         maNextButton1.GrabFocus();
2010         maNextButton2.Hide();
2011     }
2012 }
2013 
2014 
2015 
2016 
2017 void NextButton::SetClickHdl (const Link& rLink)
2018 {
2019     // Forward the setting of the click handler to the two buttons
2020     // regardless of which one is currently visible.
2021     maNextButton1.SetClickHdl(rLink);
2022     maNextButton2.SetClickHdl(rLink);
2023 }
2024 
2025 
2026 
2027 
2028 bool NextButton::IsEnabled (void)
2029 {
2030     // Because the buttons are both either enabled or disabled, it is
2031     // sufficient to ask one to determine the state.
2032     return maNextButton1.IsEnabled();
2033 }
2034 
2035 
2036 
2037 
2038 void NextButton::Enable (bool bEnable)
2039 {
2040     // Enable or disable both buttons but do not change visibility or focus.
2041     maNextButton1.Enable(bEnable);
2042     maNextButton2.Enable(bEnable);
2043 }
2044