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