xref: /aoo42x/main/sfx2/source/doc/new.cxx (revision cdf0e10c)
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_sfx2.hxx"
30 #include <sfx2/new.hxx>
31 #include <vcl/gdimtf.hxx>
32 #include <vcl/msgbox.hxx>
33 #include <vcl/morebtn.hxx>
34 #include <svtools/svmedit.hxx>
35 #include <svl/itemset.hxx>
36 #include <svl/eitem.hxx>
37 #include <svtools/sfxecode.hxx>
38 #include <svtools/ehdl.hxx>
39 #include <tools/urlobj.hxx>
40 #include <unotools/localfilehelper.hxx>
41 
42 #include "new.hrc"
43 #include "doc.hrc"
44 #include <sfx2/sfx.hrc>
45 #include "helpid.hrc"
46 #include "sfxtypes.hxx"
47 #include <sfx2/app.hxx>
48 #include <sfx2/viewfrm.hxx>
49 #include <sfx2/docfac.hxx>
50 #include <sfx2/objsh.hxx>
51 #include "fltfnc.hxx"
52 #include <sfx2/viewsh.hxx>
53 #include "sfx2/viewfac.hxx"
54 #include "sfx2/sfxresid.hxx"
55 #include <sfx2/docfile.hxx>
56 #include "preview.hxx"
57 #include <sfx2/printer.hxx>
58 #include <vcl/waitobj.hxx>
59 #include <vcl/virdev.hxx>
60 #include <vcl/jobset.hxx>
61 #include <svtools/accessibilityoptions.hxx>
62 
63 // Draw modes
64 #define OUTPUT_DRAWMODE_COLOR		(DRAWMODE_DEFAULT)
65 #define OUTPUT_DRAWMODE_GRAYSCALE   (DRAWMODE_GRAYLINE | DRAWMODE_GRAYFILL | DRAWMODE_BLACKTEXT | DRAWMODE_GRAYBITMAP | DRAWMODE_GRAYGRADIENT)
66 #define OUTPUT_DRAWMODE_BLACKWHITE  (DRAWMODE_BLACKLINE | DRAWMODE_BLACKTEXT | DRAWMODE_WHITEFILL | DRAWMODE_GRAYBITMAP | DRAWMODE_WHITEGRADIENT)
67 #define OUTPUT_DRAWMODE_CONTRAST	(DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT)
68 
69 //========================================================================
70 
71 #define MORE_BTN(x) pMoreBt->x
72 
73 //========================================================================
74 
75 void SfxPreviewBase_Impl::SetObjectShell( SfxObjectShell* pObj )
76 {
77     ::boost::shared_ptr<GDIMetaFile> pFile = pObj
78         ? pObj->GetPreviewMetaFile()
79         : ::boost::shared_ptr<GDIMetaFile>();
80 	pMetaFile = pFile;
81 	Invalidate();
82 }
83 
84 SfxPreviewBase_Impl::SfxPreviewBase_Impl(
85 	Window* pParent, const ResId& rResId )
86 	: Window(pParent, rResId), pMetaFile()
87 {
88 }
89 
90 SfxPreviewBase_Impl::SfxPreviewBase_Impl( Window* pParent )
91 	: Window(pParent, 0 ), pMetaFile()
92 {
93 	Resize();
94 	Show();
95 }
96 
97 SfxPreviewBase_Impl::~SfxPreviewBase_Impl()
98 {
99 }
100 
101 void SfxPreviewBase_Impl::Resize()
102 {
103 	Invalidate();
104 }
105 
106 void SfxPreviewBase_Impl::SetGDIFile( ::boost::shared_ptr<GDIMetaFile> pFile )
107 {
108 	pMetaFile = pFile;
109 	Invalidate();
110 }
111 
112 SfxFrameWindow* SfxPreviewWin_Impl::PreviewFactory(
113 	SfxFrame* pFrame, const String& /*rName*/ )
114 {
115 	return new SfxFrameWindow( new SfxPreviewWin_Impl(
116 		&pFrame->GetCurrentViewFrame()->GetWindow()  ) );
117 }
118 
119 void SfxPreviewWin_Impl::ImpPaint(
120 	const Rectangle&, GDIMetaFile* pFile, Window* pWindow )
121 {
122 	Size aTmpSize = pFile ? pFile->GetPrefSize() : Size(1,1 );
123 	DBG_ASSERT( aTmpSize.Height()*aTmpSize.Width(),
124 				"size of first page is 0, overload GetFirstPageSize or set vis-area!" );
125 #define FRAME 4
126 	long nWidth = pWindow->GetOutputSize().Width() - 2*FRAME;
127 	long nHeight = pWindow->GetOutputSize().Height() - 2*FRAME;
128 	if( nWidth < 0 ) nWidth = 0;
129 	if( nHeight < 0 ) nHeight = 0;
130 
131 	double dRatio=((double)aTmpSize.Width())/aTmpSize.Height();
132 	double dRatioPreV=((double) nWidth ) / nHeight;
133 	Size aSize;
134 	Point aPoint;
135 	if (dRatio>dRatioPreV)
136 	{
137 		aSize=Size(nWidth, (sal_uInt16)(nWidth/dRatio));
138 		aPoint=Point( 0, (sal_uInt16)((nHeight-aSize.Height())/2));
139 	}
140 	else
141 	{
142 		aSize=Size((sal_uInt16)(nHeight*dRatio), nHeight);
143 		aPoint=Point((sal_uInt16)((nWidth-aSize.Width())/2),0);
144 	}
145 	Point bPoint=Point(nWidth,nHeight)-aPoint;
146 
147 
148 	pWindow->SetLineColor();
149 	Color aLightGrayCol( COL_LIGHTGRAY );
150 	pWindow->SetFillColor( aLightGrayCol );
151 	pWindow->DrawRect( Rectangle( Point( 0,0 ), pWindow->GetOutputSize() ) );
152 	if ( pFile )
153 	{
154 		Color aBlackCol( COL_BLACK );
155 		Color aWhiteCol( COL_WHITE );
156 		pWindow->SetLineColor( aBlackCol );
157 		pWindow->SetFillColor( aWhiteCol );
158 		pWindow->DrawRect( Rectangle( aPoint + Point( FRAME, FRAME ), bPoint + Point( FRAME, FRAME ) ) );
159 //!		pFile->Move( Point( FRAME, FRAME ) );
160 //!		pFile->Scale( Fraction( aTmpSize.Width(), aSize.Width() ),
161 //!					  Fraction( aTmpSize.Height(), aSize.Height() ) );
162 		pFile->WindStart();
163 		pFile->Play( pWindow, aPoint + Point( FRAME, FRAME ), aSize  );
164 	}
165 }
166 
167 void SfxPreviewWin_Impl::Paint( const Rectangle& rRect )
168 {
169 	ImpPaint( rRect, pMetaFile.get(), this );
170 }
171 
172 SfxPreviewWin::SfxPreviewWin(
173 	Window* pParent, const ResId& rResId, SfxObjectShellLock &rDocSh )
174 	: Window(pParent, rResId), rDocShell( rDocSh )
175 {
176 	SetHelpId( HID_PREVIEW_FRAME );
177 
178     // adjust contrast mode initially
179     bool bUseContrast = UseHighContrastSetting();
180     SetDrawMode( bUseContrast ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR );
181 
182     // #107818# This preview window is for document previews.  Therefore
183     // right-to-left mode should be off
184     EnableRTL( sal_False );
185 }
186 
187 void SfxPreviewWin::Paint( const Rectangle& rRect )
188 {
189 	SfxViewFrame *pFrame = SfxViewFrame::GetFirst( &rDocShell );
190 	if ( pFrame && pFrame->GetViewShell() &&
191 		 pFrame->GetViewShell()->GetPrinter() &&
192 		 pFrame->GetViewShell()->GetPrinter()->IsPrinting() )
193     {
194         return;
195     }
196 
197     Size            aTmpSize( rDocShell->GetFirstPageSize() );
198     GDIMetaFile     aMtf;
199     VirtualDevice   aDevice;
200 
201     DBG_ASSERT( aTmpSize.Height() * aTmpSize.Width(), "size of first page is 0, overload GetFirstPageSize or set vis-area!" );
202 
203     aMtf.SetPrefSize( aTmpSize );
204     aDevice.EnableOutput( sal_False );
205     aDevice.SetMapMode( rDocShell->GetMapUnit() );
206     aDevice.SetDrawMode( GetDrawMode() );
207     aMtf.Record( &aDevice );
208     rDocShell->DoDraw( &aDevice, Point(0,0), aTmpSize, JobSetup(), ASPECT_THUMBNAIL );
209     aMtf.Stop();
210     aMtf.WindStart();
211     SfxPreviewWin_Impl::ImpPaint( rRect, &aMtf, this );
212 }
213 
214 void SfxPreviewWin::DataChanged( const DataChangedEvent& rDCEvt )
215 {
216 	Window::DataChanged( rDCEvt );
217 
218     if( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
219         (rDCEvt.GetFlags() & SETTINGS_STYLE) )
220     {
221         // adjust contrast mode
222         bool bUseContrast = UseHighContrastSetting();
223         SetDrawMode( bUseContrast ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR );
224     }
225 }
226 
227 bool SfxPreviewWin::UseHighContrastSetting() const
228 {
229     return GetSettings().GetStyleSettings().GetHighContrastMode();
230 }
231 
232 
233 class SfxNewFileDialog_Impl
234 {
235 	FixedText aRegionFt;
236 	ListBox aRegionLb;
237 	FixedText aTemplateFt;
238 	ListBox aTemplateLb;
239 
240 	CheckBox aPreviewBtn;
241 	SfxPreviewWin_Impl aPreviewWin;
242 
243 	FixedText aTitleFt;
244 	Edit aTitleEd;
245 	FixedText aThemaFt;
246 	Edit aThemaEd;
247 	FixedText aKeywordsFt;
248 	Edit aKeywordsEd;
249 	FixedText aDescFt;
250 	MultiLineEdit aDescEd;
251     FixedLine aDocinfoGb;
252 
253     CheckBox aTextStyleCB;
254     CheckBox aFrameStyleCB;
255     CheckBox aPageStyleCB;
256     CheckBox aNumStyleCB;
257     CheckBox aMergeStyleCB;
258     PushButton aLoadFilePB;
259 
260     OKButton aOkBt;
261 	CancelButton aCancelBt;
262 	HelpButton aHelpBt;
263 	MoreButton* pMoreBt;
264 	Timer aPrevTimer;
265 	String aNone;
266     String sLoadTemplate;
267 
268 	sal_uInt16 nFlags;
269 	SfxDocumentTemplates aTemplates;
270 	SfxObjectShellLock xDocShell;
271 	SfxNewFileDialog* pAntiImpl;
272 
273 	void ClearInfo();
274 	DECL_LINK( Update, void * );
275 
276 	DECL_LINK( RegionSelect, ListBox * );
277 	DECL_LINK( TemplateSelect, ListBox * );
278 	DECL_LINK( DoubleClick, ListBox * );
279 	void TogglePreview(CheckBox *);
280 	DECL_LINK( Expand, MoreButton * );
281 	DECL_LINK( PreviewClick, CheckBox * );
282     DECL_LINK( LoadFile, PushButton* );
283 	sal_uInt16  GetSelectedTemplatePos() const;
284 
285 public:
286 
287 	SfxNewFileDialog_Impl( SfxNewFileDialog* pAntiImplP, sal_uInt16 nFlags );
288 	~SfxNewFileDialog_Impl();
289 
290 		// Liefert sal_False, wenn '- Keine -' als Vorlage eingestellt ist
291 		// Nur wenn IsTemplate() sal_True liefert, koennen Vorlagennamen
292 		// erfragt werden
293 	sal_Bool IsTemplate() const;
294 	String GetTemplateRegion() const;
295 	String GetTemplateName() const;
296 	String GetTemplateFileName() const;
297 
298     sal_uInt16  GetTemplateFlags()const;
299     void    SetTemplateFlags(sal_uInt16 nSet);
300 };
301 
302 
303 //-------------------------------------------------------------------------
304 
305 void SfxNewFileDialog_Impl::ClearInfo()
306 {
307 	const String aNo;
308 	aTitleEd.SetText(aNo);
309 	aThemaEd.SetText(aNo);
310 	aKeywordsEd.SetText(aNo);
311 	aDescEd.SetText(aNo);
312 }
313 
314 //-------------------------------------------------------------------------
315 
316 IMPL_LINK( SfxNewFileDialog_Impl, Update, void *, EMPTYARG )
317 {
318 	if ( xDocShell.Is() )
319 	{
320 		if ( xDocShell->GetProgress() )
321 			return sal_False;
322 		xDocShell.Clear();
323 	}
324 
325 	const sal_uInt16 nEntry = GetSelectedTemplatePos();
326 	if(!nEntry)
327 	{
328 		ClearInfo();
329 		aPreviewWin.Invalidate();
330 		aPreviewWin.SetObjectShell( 0);
331 		return 0;
332 	}
333 
334 	if ( aPreviewBtn.IsChecked() && (nFlags & SFXWB_PREVIEW) == SFXWB_PREVIEW)
335 	{
336 
337         String aFileName = aTemplates.GetPath( aRegionLb.GetSelectEntryPos(), nEntry-1);
338         INetURLObject aTestObj( aFileName );
339         if( aTestObj.GetProtocol() == INET_PROT_NOT_VALID )
340         {
341             // temp. fix until Templates are managed by UCB compatible service
342             // does NOT work with locally cached components !
343             String aTemp;
344             utl::LocalFileHelper::ConvertPhysicalNameToURL( aFileName, aTemp );
345             aFileName = aTemp;
346         }
347 
348         INetURLObject aObj( aFileName );
349 		for ( SfxObjectShell* pTmp = SfxObjectShell::GetFirst();
350 			  pTmp;
351 			  pTmp = SfxObjectShell::GetNext(*pTmp) )
352 		{
353 			//! fsys bug op==
354 			if ( pTmp->GetMedium())
355 				// ??? HasName() MM
356                 if( INetURLObject( pTmp->GetMedium()->GetName() ) == aObj )
357 				{
358 					xDocShell = pTmp;
359 					break;
360 				}
361 		}
362 
363 		if ( !xDocShell.Is() )
364 		{
365 			Window *pParent = Application::GetDefDialogParent();
366 			Application::SetDefDialogParent( pAntiImpl );
367 			SfxErrorContext eEC(ERRCTX_SFX_LOADTEMPLATE,pAntiImpl);
368 			SfxApplication *pSfxApp = SFX_APP();
369 			sal_uIntPtr lErr;
370 			SfxItemSet* pSet = new SfxAllItemSet( pSfxApp->GetPool() );
371 			pSet->Put( SfxBoolItem( SID_TEMPLATE, sal_True ) );
372 			pSet->Put( SfxBoolItem( SID_PREVIEW, sal_True ) );
373 			lErr = pSfxApp->LoadTemplate( xDocShell, aFileName, sal_True, pSet );
374 			if( lErr )
375 				ErrorHandler::HandleError(lErr);
376 			Application::SetDefDialogParent( pParent );
377 			if ( !xDocShell.Is() )
378 			{
379 				aPreviewWin.SetObjectShell( 0 );
380 				return sal_False;
381 			}
382 		}
383 
384 		aPreviewWin.SetObjectShell( xDocShell );
385 	}
386 	return sal_True;
387 }
388 
389 //-------------------------------------------------------------------------
390 
391 IMPL_LINK( SfxNewFileDialog_Impl, RegionSelect, ListBox *, pBox )
392 {
393 	if ( xDocShell.Is() && xDocShell->GetProgress() )
394 		return 0;
395 
396 	const sal_uInt16 nRegion = pBox->GetSelectEntryPos();
397 	const sal_uInt16 nCount = aTemplates.GetRegionCount()? aTemplates.GetCount(nRegion): 0;
398 	aTemplateLb.SetUpdateMode(sal_False);
399 	aTemplateLb.Clear();
400 	String aSel=aRegionLb.GetSelectEntry();
401 	sal_uInt16 nc=aSel.Search('(');
402 	if (nc-1&&nc!=STRING_NOTFOUND)
403 		aSel.Erase(nc-1);
404 	if (aSel.CompareIgnoreCaseToAscii( String(SfxResId(STR_STANDARD)) )==COMPARE_EQUAL)
405 		aTemplateLb.InsertEntry(aNone);
406 	for (sal_uInt16 i = 0; i < nCount; ++i)
407 		aTemplateLb.InsertEntry(aTemplates.GetName(nRegion, i));
408 	aTemplateLb.SelectEntryPos(0);
409 	aTemplateLb.SetUpdateMode(sal_True);
410 	aTemplateLb.Invalidate();
411 	aTemplateLb.Update();
412 	return 0;
413 }
414 
415 //-------------------------------------------------------------------------
416 
417 IMPL_LINK_INLINE_START( SfxNewFileDialog_Impl, Expand, MoreButton *, EMPTYARG )
418 {
419 	TemplateSelect(&aTemplateLb);
420 	return 0;
421 }
422 IMPL_LINK_INLINE_END( SfxNewFileDialog_Impl, Expand, MoreButton *, pMoreButton )
423 
424 //-------------------------------------------------------------------------
425 
426 IMPL_LINK( SfxNewFileDialog_Impl, PreviewClick, CheckBox *, pBox )
427 {
428 	if ( xDocShell.Is() && xDocShell->GetProgress() )
429 		return 0;
430 
431 	sal_uInt16 nEntry = GetSelectedTemplatePos();
432 	if ( nEntry && pBox->IsChecked() )
433 	{
434 		if(!Update(0))
435 			aPreviewWin.Invalidate();
436 	}
437 	else
438 	{
439 		if (xDocShell.Is())
440 			xDocShell.Clear();
441 		aPreviewWin.SetObjectShell( 0 );
442 	}
443 	return 0;
444 }
445 
446 //-------------------------------------------------------------------------
447 
448 IMPL_LINK( SfxNewFileDialog_Impl, TemplateSelect, ListBox *, EMPTYARG )
449 {
450 	// noch am Laden
451 	if ( xDocShell && xDocShell->GetProgress() )
452 		return 0;
453 
454 	if ( !MORE_BTN(GetState()) )
455 		// Dialog nicht aufgeklappt
456 		return 0;
457 
458 	aPrevTimer.Start();
459 	return 0;
460 }
461 
462 //-------------------------------------------------------------------------
463 
464 IMPL_LINK_INLINE_START( SfxNewFileDialog_Impl, DoubleClick, ListBox *, pListBox )
465 {
466     (void)pListBox;
467     // noch am Laden
468 	if ( !xDocShell.Is() || !xDocShell->GetProgress() )
469 		pAntiImpl->EndDialog(RET_OK);
470 	return 0;
471 }
472 IMPL_LINK_INLINE_END( SfxNewFileDialog_Impl, DoubleClick, ListBox *, pListBox )
473 
474 //-------------------------------------------------------------------------
475 
476 IMPL_LINK_INLINE_START( SfxNewFileDialog_Impl, LoadFile, PushButton *, EMPTYARG )
477 {
478     pAntiImpl->EndDialog(RET_TEMPLATE_LOAD);
479 	return 0;
480 }
481 IMPL_LINK_INLINE_END( SfxNewFileDialog_Impl, LoadFile, PushButton *, EMPTYARG )
482 //-------------------------------------------------------------------------
483 
484 sal_uInt16  SfxNewFileDialog_Impl::GetSelectedTemplatePos() const
485 {
486 	sal_uInt16 nEntry=aTemplateLb.GetSelectEntryPos();
487 	String aSel=aRegionLb.GetSelectEntry().Copy();
488 	sal_uInt16 nc=aSel.Search('(');
489 	if (nc-1&&nc!=STRING_NOTFOUND)
490 		aSel.Erase(nc-1);
491 	if (aSel.CompareIgnoreCaseToAscii(String(SfxResId(STR_STANDARD)))!=COMPARE_EQUAL)
492 		nEntry++;
493 	if (!aTemplateLb.GetSelectEntryCount())
494 		nEntry=0;
495 	return nEntry;
496 }
497 
498 //-------------------------------------------------------------------------
499 
500 sal_Bool SfxNewFileDialog_Impl::IsTemplate() const
501 {
502 	return GetSelectedTemplatePos()!=0;
503 
504 }
505 
506 //-------------------------------------------------------------------------
507 
508 String SfxNewFileDialog_Impl::GetTemplateFileName() const
509 {
510 	if(!IsTemplate() || !aTemplates.GetRegionCount())
511 		return String();
512 	return aTemplates.GetPath(aRegionLb.GetSelectEntryPos(),
513 							  GetSelectedTemplatePos()-1);
514 }
515 
516 //-------------------------------------------------------------------------
517 
518 String SfxNewFileDialog_Impl::GetTemplateRegion() const
519 {
520 	if(!IsTemplate() || !aTemplates.GetRegionCount())
521 		return String();
522 	return aRegionLb.GetSelectEntry();
523 }
524 
525 //-------------------------------------------------------------------------
526 
527 String SfxNewFileDialog_Impl::GetTemplateName() const
528 {
529 	if(!IsTemplate() || !aTemplates.GetRegionCount())
530 		return String();
531 	return aTemplateLb.GetSelectEntry();
532 }
533 
534 //-------------------------------------------------------------------------
535 
536 void AdjustPosSize_Impl(Window *pWin, short nMoveOffset, short nSizeOffset)
537 {
538 	Point aPos(pWin->GetPosPixel());
539 	Size aSize(pWin->GetSizePixel());
540 	aPos.X() -= nMoveOffset;
541 	aSize.Width() += nSizeOffset;
542 	pWin->SetPosSizePixel(aPos, aSize);
543 }
544 //-------------------------------------------------------------------------
545 sal_uInt16  SfxNewFileDialog_Impl::GetTemplateFlags()const
546 {
547     sal_uInt16 nRet = aTextStyleCB.IsChecked() ? SFX_LOAD_TEXT_STYLES : 0;
548     if(aFrameStyleCB.IsChecked())
549         nRet |= SFX_LOAD_FRAME_STYLES;
550     if(aPageStyleCB.IsChecked())
551         nRet |= SFX_LOAD_PAGE_STYLES;
552     if(aNumStyleCB.IsChecked())
553         nRet |= SFX_LOAD_NUM_STYLES;
554     if(aMergeStyleCB.IsChecked())
555         nRet |= SFX_MERGE_STYLES;
556     return nRet;
557 }
558 //-------------------------------------------------------------------------
559 void    SfxNewFileDialog_Impl::SetTemplateFlags(sal_uInt16 nSet)
560 {
561     aTextStyleCB.Check(  0 != (nSet&SFX_LOAD_TEXT_STYLES ));
562     aFrameStyleCB.Check( 0 != (nSet&SFX_LOAD_FRAME_STYLES));
563     aPageStyleCB.Check(  0 != (nSet&SFX_LOAD_PAGE_STYLES ));
564     aNumStyleCB.Check(   0 != (nSet&SFX_LOAD_NUM_STYLES  ));
565     aMergeStyleCB.Check( 0 != (nSet&SFX_MERGE_STYLES     ));
566 }
567 
568 //-------------------------------------------------------------------------
569 
570 SfxNewFileDialog_Impl::SfxNewFileDialog_Impl(
571 	SfxNewFileDialog* pAntiImplP, sal_uInt16 nFl)
572 	:	aRegionFt( pAntiImplP, SfxResId( FT_REGION ) ),
573 		aRegionLb( pAntiImplP, SfxResId( LB_REGION ) ),
574 		aTemplateFt( pAntiImplP, SfxResId( FT_TEMPLATE ) ),
575 		aTemplateLb( pAntiImplP, SfxResId( LB_TEMPLATE ) ),
576 		aPreviewBtn( pAntiImplP, SfxResId( BTN_PREVIEW ) ),
577 		aPreviewWin( pAntiImplP, SfxResId( WIN_PREVIEW ) ),
578 		aTitleFt( pAntiImplP, SfxResId( FT_TITLE ) ),
579 		aTitleEd( pAntiImplP, SfxResId( ED_TITLE ) ),
580 		aThemaFt( pAntiImplP, SfxResId( FT_THEMA ) ),
581 		aThemaEd( pAntiImplP, SfxResId( ED_THEMA ) ),
582 		aKeywordsFt( pAntiImplP, SfxResId( FT_KEYWORDS ) ),
583 		aKeywordsEd( pAntiImplP, SfxResId( ED_KEYWORDS ) ),
584 		aDescFt( pAntiImplP, SfxResId( FT_DESC ) ),
585 		aDescEd( pAntiImplP, SfxResId( ED_DESC ) ),
586 		aDocinfoGb( pAntiImplP, SfxResId( GB_DOCINFO ) ),
587         aTextStyleCB( pAntiImplP, SfxResId(  CB_TEXT_STYLE )),
588         aFrameStyleCB( pAntiImplP, SfxResId( CB_FRAME_STYLE )),
589         aPageStyleCB( pAntiImplP, SfxResId(  CB_PAGE_STYLE )),
590         aNumStyleCB( pAntiImplP, SfxResId(   CB_NUM_STYLE  )),
591         aMergeStyleCB( pAntiImplP, SfxResId( CB_MERGE_STYLE )),
592         aLoadFilePB( pAntiImplP, SfxResId(   PB_LOAD_FILE )),
593 	    aOkBt( pAntiImplP, SfxResId( BT_OK ) ),
594 		aCancelBt( pAntiImplP, SfxResId( BT_CANCEL ) ),
595 		aHelpBt( pAntiImplP, SfxResId( BT_HELP ) ),
596 		pMoreBt( new MoreButton( pAntiImplP, SfxResId( BT_MORE ) ) ),
597 		aNone( SfxResId(STR_NONE) ),
598         sLoadTemplate( SfxResId(STR_LOAD_TEMPLATE)),
599 		nFlags(nFl),
600 		pAntiImpl( pAntiImplP )
601 {
602 	short nMoveOffset = *(short *)pAntiImplP->GetClassRes();
603 	pAntiImplP->IncrementRes(sizeof(short));
604 	short nExpandSize= *(short *)pAntiImplP->GetClassRes();
605 	pAntiImplP->IncrementRes(sizeof(short));
606 	pAntiImplP->FreeResource();
607 
608 	if (!nFlags)
609 		MORE_BTN(Hide());
610     else if(SFXWB_LOAD_TEMPLATE == nFlags)
611     {
612         aLoadFilePB.SetClickHdl(LINK(this, SfxNewFileDialog_Impl, LoadFile));
613         aLoadFilePB.Show();
614         aTextStyleCB.Show();
615         aFrameStyleCB.Show();
616         aPageStyleCB.Show();
617         aNumStyleCB.Show();
618         aMergeStyleCB.Show();
619         Size aSize(pAntiImplP->GetOutputSizePixel());
620         Size aTmp(pAntiImplP->LogicToPixel(Size(16, 16), MAP_APPFONT));
621         aSize.Height() += aTmp.Height();
622         pAntiImplP->SetOutputSizePixel(aSize);
623         pMoreBt->Hide();
624         aTextStyleCB.Check();
625         pAntiImplP->SetText(sLoadTemplate);
626     }
627     else
628 	{
629 		MORE_BTN(SetClickHdl(LINK(this, SfxNewFileDialog_Impl, Expand)));
630 		if((nFlags & SFXWB_PREVIEW) == SFXWB_PREVIEW)
631 		{
632 			MORE_BTN(AddWindow(&aPreviewBtn));
633 			MORE_BTN(AddWindow(&aPreviewWin));
634 			aPreviewBtn.SetClickHdl(LINK(this, SfxNewFileDialog_Impl, PreviewClick));
635 		}
636 		else
637 		{
638 			aPreviewBtn.Hide();
639 			aPreviewWin.Hide();
640 			nMoveOffset = (short)pAntiImplP->LogicToPixel(
641 				Size(nMoveOffset, nMoveOffset), MAP_APPFONT).Width();
642 			nExpandSize = (short)pAntiImplP->LogicToPixel(
643 				Size(nExpandSize, nExpandSize), MAP_APPFONT).Width();
644 			AdjustPosSize_Impl(&aTitleFt, nMoveOffset, 0);
645 			AdjustPosSize_Impl(&aTitleEd, nMoveOffset, nExpandSize);
646 			AdjustPosSize_Impl(&aThemaFt, nMoveOffset, 0);
647 			AdjustPosSize_Impl(&aThemaEd, nMoveOffset, nExpandSize);
648 			AdjustPosSize_Impl(&aKeywordsFt, nMoveOffset, 0);
649 			AdjustPosSize_Impl(&aKeywordsEd, nMoveOffset, nExpandSize);
650 			AdjustPosSize_Impl(&aDescFt , nMoveOffset, 0);
651 			AdjustPosSize_Impl(&aDescEd , nMoveOffset, nExpandSize);
652 			AdjustPosSize_Impl(&aDocinfoGb, nMoveOffset, nExpandSize);
653 		}
654 	}
655 
656 	String &rExtra = pAntiImplP->GetExtraData();
657 	sal_uInt16 nTokCount = rExtra.GetTokenCount( '|' );
658 	if( nTokCount > 0 && nFlags )
659 		MORE_BTN(SetState( rExtra.GetToken( 0, '|' ) == 'Y' ));
660 	if( nTokCount > 1 && nFlags )
661 		aPreviewBtn.Check( rExtra.GetToken( 1 ,'|' ) == 'Y' );
662 
663 	aTemplateLb.SetDoubleClickHdl(LINK(this, SfxNewFileDialog_Impl, DoubleClick));
664 
665 	// update the template configuration if necessary
666 	{
667 		WaitObject aWaitCursor( pAntiImplP->GetParent() );
668 		aTemplates.Update( sal_True /* be smart */ );
669 	}
670 	// fill the list boxes
671 	const sal_uInt16 nCount = aTemplates.GetRegionCount();
672 	if (nCount)
673 	{
674 		for(sal_uInt16 i = 0; i < nCount; ++i)
675 			aRegionLb.InsertEntry(aTemplates.GetFullRegionName(i));
676 		aRegionLb.SetSelectHdl(LINK(this, SfxNewFileDialog_Impl, RegionSelect));
677 	}
678 
679 	aPrevTimer.SetTimeout( 500 );
680 	aPrevTimer.SetTimeoutHdl( LINK( this, SfxNewFileDialog_Impl, Update));
681 
682 //	 else
683 //		  aRegionLb.InsertEntry(String(SfxResId(STR_STANDARD)));
684 	aRegionLb.SelectEntryPos(0);
685 	RegionSelect(&aRegionLb);
686 }
687 
688 //-------------------------------------------------------------------------
689 
690 SfxNewFileDialog_Impl::~SfxNewFileDialog_Impl()
691 {
692 	String &rExtra = pAntiImpl->GetExtraData();
693 	rExtra = MORE_BTN(GetState()) ? 'Y' : 'N';
694 	rExtra += '|';
695 	rExtra += aPreviewBtn.IsChecked() ? 'Y' : 'N';
696 
697 	delete pMoreBt;
698 }
699 //-------------------------------------------------------------------------
700 SfxNewFileDialog::SfxNewFileDialog(Window *pParent, sal_uInt16 nFlags)
701 	: SfxModalDialog( pParent, SfxResId( DLG_NEW_FILE ) )
702 {
703 	pImpl = new SfxNewFileDialog_Impl( this, nFlags );
704 }
705 //-------------------------------------------------------------------------
706 SfxNewFileDialog::~SfxNewFileDialog()
707 {
708 	delete pImpl;
709 }
710 //-------------------------------------------------------------------------
711 sal_Bool SfxNewFileDialog::IsTemplate() const
712 {
713 	return pImpl->IsTemplate();
714 }
715 //-------------------------------------------------------------------------
716 String SfxNewFileDialog::GetTemplateRegion() const
717 {
718 	return pImpl->GetTemplateRegion();
719 }
720 //-------------------------------------------------------------------------
721 String SfxNewFileDialog::GetTemplateName() const
722 {
723 	return pImpl->GetTemplateName();
724 }
725 //-------------------------------------------------------------------------
726 String SfxNewFileDialog::GetTemplateFileName() const
727 {
728 	return pImpl->GetTemplateFileName();
729 }
730 //-------------------------------------------------------------------------
731 sal_uInt16 SfxNewFileDialog::GetTemplateFlags()const
732 {
733     return pImpl->GetTemplateFlags();
734 
735 }
736 //-------------------------------------------------------------------------
737 void    SfxNewFileDialog::SetTemplateFlags(sal_uInt16 nSet)
738 {
739     pImpl->SetTemplateFlags(nSet);
740 }
741 
742