xref: /trunk/main/svtools/source/contnr/templwin.cxx (revision 9807c9de)
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_svtools.hxx"
26 #include "templwin.hxx"
27 #include <svtools/templdlg.hxx>
28 #include <svtools/svtdata.hxx>
29 #include <unotools/pathoptions.hxx>
30 #include <unotools/dynamicmenuoptions.hxx>
31 #include <unotools/extendedsecurityoptions.hxx>
32 #include <svtools/xtextedt.hxx>
33 #include <svl/inettype.hxx>
34 #include <svtools/imagemgr.hxx>
35 #include <svtools/miscopt.hxx>
36 #include <svtools/templatefoldercache.hxx>
37 #include <svtools/imgdef.hxx>
38 #include <svtools/txtattr.hxx>
39 #include <svtools/svtools.hrc>
40 #include "templwin.hrc"
41 #include <svtools/helpid.hrc>
42 #include <unotools/pathoptions.hxx>
43 #include <unotools/viewoptions.hxx>
44 #include <unotools/ucbhelper.hxx>
45 #include "unotools/configmgr.hxx"
46 #include <com/sun/star/awt/XWindow.hpp>
47 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
48 #include <com/sun/star/frame/XFrame.hpp>
49 #include <toolkit/helper/vclunohelper.hxx>
50 #include <com/sun/star/util/URL.hpp>
51 #include <com/sun/star/util/XURLTransformer.hpp>
52 #include <com/sun/star/util/XOfficeInstallationDirectories.hpp>
53 #include <com/sun/star/frame/XDispatchProvider.hpp>
54 #include <com/sun/star/frame/XDocumentTemplates.hpp>
55 #include <com/sun/star/frame/XComponentLoader.hpp>
56 #include <com/sun/star/beans/PropertyValue.hpp>
57 #include <com/sun/star/ucb/XContent.hpp>
58 #include <com/sun/star/ucb/XCommandEnvironment.hpp>
59 #include <com/sun/star/view/XPrintable.hpp>
60 #include <com/sun/star/awt/XWindow.hpp>
61 #include <com/sun/star/document/XDocumentProperties.hpp>
62 #include <com/sun/star/beans/XPropertySet.hpp>
63 #include <com/sun/star/beans/XMultiPropertySet.hpp>
64 #include <com/sun/star/beans/XPropertySetInfo.hpp>
65 #include <com/sun/star/io/IOException.hpp>
66 #include <com/sun/star/util/DateTime.hpp>
67 #include <com/sun/star/script/XTypeConverter.hpp>
68 #include <com/sun/star/system/SystemShellExecute.hpp>
69 #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
70 #include <unotools/localedatawrapper.hxx>
71 #include <com/sun/star/container/XNameContainer.hpp>
72 #include <vcl/waitobj.hxx>
73 #include <comphelper/processfactory.hxx>
74 #include <tools/urlobj.hxx>
75 #include <tools/datetime.hxx>
76 #include <vcl/svapp.hxx>
77 #include <vcl/split.hxx>
78 #include <vcl/msgbox.hxx>
79 #include <svtools/DocumentInfoPreview.hxx>
80 #include <vcl/mnemonic.hxx>
81 
82 #include <ucbhelper/content.hxx>
83 #include <comphelper/string.hxx>
84 
85 
86 using namespace ::com::sun::star;
87 using namespace ::com::sun::star::beans;
88 using namespace ::com::sun::star::container;
89 using namespace ::com::sun::star::frame;
90 using namespace ::com::sun::star::document;
91 using namespace ::com::sun::star::lang;
92 using namespace ::com::sun::star::ucb;
93 using namespace ::com::sun::star::uno;
94 using namespace ::com::sun::star::view;
95 using namespace svtools;
96 
97 extern ::rtl::OUString CreateExactSizeText_Impl( sal_Int64 nSize ); // fileview.cxx
98 
99 #define SPLITSET_ID			0
100 #define COLSET_ID			1
101 #define ICONWIN_ID			2
102 #define FILEWIN_ID			3
103 #define FRAMEWIN_ID			4
104 
105 #define ICON_POS_NEWDOC		0
106 #define ICON_POS_TEMPLATES	1
107 #define ICON_POS_MYDOCS		2
108 #define ICON_POS_SAMPLES	3
109 
110 #define ASCII_STR(s)					::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(s) )
111 #define VIEWSETTING_NEWFROMTEMPLATE		ASCII_STR("NewFromTemplate")
112 #define VIEWSETTING_SELECTEDGROUP		ASCII_STR("SelectedGroup")
113 #define VIEWSETTING_SELECTEDVIEW		ASCII_STR("SelectedView")
114 #define VIEWSETTING_SPLITRATIO			ASCII_STR("SplitRatio")
115 #define VIEWSETTING_LASTFOLDER			ASCII_STR("LastFolder")
116 
117 struct FolderHistory
118 {
119 	String		m_sURL;
120 	sal_uLong		m_nGroup;
121 
122 	FolderHistory( const String& _rURL, sal_Int32 _nGroup ) :
123 		m_sURL( _rURL ), m_nGroup( _nGroup ) {}
124 };
125 
126 DECLARE_LIST( HistoryList_Impl, FolderHistory* )
127 DECLARE_LIST( NewDocList_Impl, ::rtl::OUString* )
128 
129 ODocumentInfoPreview::ODocumentInfoPreview( Window* pParent ,WinBits _nBits) : Window(pParent,WB_DIALOGCONTROL)
130 {
131 	m_pEditWin = new SvtExtendedMultiLineEdit_Impl(this,_nBits);
132 	m_pEditWin->Show();
133 	m_pEditWin->EnableCursor( sal_False );
134 	m_pInfoTable = new SvtDocInfoTable_Impl();
135 	// detect application language
136 	m_aLocale = SvtPathOptions().GetLocale();
137 }
138 // -----------------------------------------------------------------------------
139 ODocumentInfoPreview::~ODocumentInfoPreview()
140 {
141 	delete m_pEditWin;
142 	delete m_pInfoTable;
143 }
144 // -----------------------------------------------------------------------------
145 void ODocumentInfoPreview::Resize()
146 {
147 	Size aOutputSize( GetOutputSize() );
148 	m_pEditWin->SetPosSizePixel( Point(0,0),aOutputSize);
149 }
150 // -----------------------------------------------------------------------------
151 void ODocumentInfoPreview::Clear()
152 {
153 	m_pEditWin->Clear();
154 }
155 // -----------------------------------------------------------------------------
156 
157 void lcl_insertDateTimeEntry(SvtExtendedMultiLineEdit_Impl* i_pEditWin,
158     const ::rtl::OUString & i_rName, const util::DateTime & i_rUDT)
159 {
160     DateTime aToolsDT =
161         DateTime( Date( i_rUDT.Day, i_rUDT.Month, i_rUDT.Year ),
162                 Time( i_rUDT.Hours, i_rUDT.Minutes,
163                       i_rUDT.Seconds, i_rUDT.HundredthSeconds ) );
164     if ( aToolsDT.IsValid() )
165     {
166         LocaleDataWrapper aLocaleWrapper(
167             ::comphelper::getProcessServiceFactory(),
168             Application::GetSettings().GetLocale() );
169         String aDateStr = aLocaleWrapper.getDate( aToolsDT );
170         aDateStr += String( RTL_CONSTASCII_STRINGPARAM(", ") );
171         aDateStr += aLocaleWrapper.getTime( aToolsDT );
172         i_pEditWin->InsertEntry( i_rName, aDateStr );
173     }
174 }
175 
176 void ODocumentInfoPreview::fill(
177     const Reference< XDocumentProperties >& i_xDocProps, const String& i_rURL)
178 {
179     if (!i_xDocProps.is()) throw RuntimeException();
180 
181     ::rtl::OUString aStr;
182     m_pEditWin->SetAutoScroll( sal_False );
183 
184     aStr = i_xDocProps->getTitle();
185     if (aStr.getLength()) {
186         m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_TITLE ), aStr );
187     }
188 
189     aStr = i_xDocProps->getAuthor();
190     if (aStr.getLength()) {
191         m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_FROM ), aStr );
192     }
193 
194     lcl_insertDateTimeEntry(m_pEditWin,
195             m_pInfoTable->GetString( DI_DATE ),
196             i_xDocProps->getCreationDate());
197 
198     aStr = i_xDocProps->getModifiedBy();
199     if (aStr.getLength()) {
200         m_pEditWin->InsertEntry( m_pInfoTable->GetString(DI_MODIFIEDBY), aStr );
201     }
202 
203     lcl_insertDateTimeEntry(m_pEditWin,
204             m_pInfoTable->GetString( DI_MODIFIEDDATE ),
205             i_xDocProps->getModificationDate());
206 
207     aStr = i_xDocProps->getPrintedBy();
208     if (aStr.getLength()) {
209         m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_PRINTBY ), aStr );
210     }
211 
212     lcl_insertDateTimeEntry(m_pEditWin,
213             m_pInfoTable->GetString( DI_PRINTDATE ),
214             i_xDocProps->getPrintDate());
215 
216     aStr = i_xDocProps->getSubject();
217     if (aStr.getLength()) {
218         m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_THEME ), aStr );
219     }
220 
221     aStr =
222         ::comphelper::string::convertCommaSeparated(i_xDocProps->getKeywords());
223     if (aStr.getLength()) {
224         m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_KEYWORDS ), aStr );
225     }
226 
227     aStr = i_xDocProps->getDescription();
228     if (aStr.getLength()) {
229         m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_DESCRIPTION ),
230             aStr );
231     }
232 
233     // size
234     if ( i_rURL.Len() > 0 )
235     {
236         sal_uLong nDocSize = ::utl::UCBContentHelper::GetSize( i_rURL );
237         m_pEditWin->InsertEntry(
238             m_pInfoTable->GetString( DI_SIZE ),
239             CreateExactSizeText_Impl( nDocSize ) );
240     }
241 
242     // MIMEType
243     if ( i_rURL.Len() > 0 )
244     {
245         INetContentType eTypeID =
246             INetContentTypes::GetContentTypeFromURL( i_rURL );
247         if ( eTypeID != CONTENT_TYPE_APP_OCTSTREAM ) {
248             aStr = INetContentTypes::GetPresentation( eTypeID, m_aLocale );
249         } else {
250             aStr = SvFileInformationManager::GetDescription(
251                         INetURLObject(i_rURL) );
252         }
253         if (aStr.getLength()) {
254             m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_MIMETYPE ),
255                 aStr );
256         }
257 	}
258 
259     // user-defined (custom) properties
260     Reference< XPropertySet > xUserDefined(
261         i_xDocProps->getUserDefinedProperties(), UNO_QUERY_THROW );
262     Reference< XPropertySetInfo > xUDInfo = xUserDefined->getPropertySetInfo();
263     Sequence< Property > props = xUDInfo->getProperties();
264     for (sal_Int32 i = 0; i < props.getLength(); ++i) {
265         const ::rtl::OUString name = props[i].Name;
266         uno::Any aAny;
267         try {
268             aAny = xUserDefined->getPropertyValue(name);
269             uno::Reference < script::XTypeConverter > xConverter(
270                 comphelper::getProcessServiceFactory()->createInstance(
271                     ASCII_STR("com.sun.star.script.Converter")),
272                 UNO_QUERY );
273             uno::Any aNew;
274             aNew = xConverter->convertToSimpleType( aAny, TypeClass_STRING );
275             if ((aNew >>= aStr) && aStr.getLength()) {
276                 m_pEditWin->InsertEntry( name, aStr);
277             }
278         } catch (uno::Exception &) {
279             // ignore
280         }
281     }
282 
283     m_pEditWin->SetSelection( Selection( 0, 0 ) );
284     m_pEditWin->SetAutoScroll( sal_True );
285 }
286 
287 // -----------------------------------------------------------------------------
288 void ODocumentInfoPreview::InsertEntry( const String& rTitle, const String& rValue )
289 {
290 	m_pEditWin->InsertEntry( rTitle, rValue);
291 }
292 // -----------------------------------------------------------------------------
293 
294 // class SvtDummyHeaderBar_Impl ------------------------------------------
295 
296 void SvtDummyHeaderBar_Impl::UpdateBackgroundColor()
297 {
298 	SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetWindowColor() ) );
299 }
300 
301 SvtDummyHeaderBar_Impl::SvtDummyHeaderBar_Impl( Window* pPar ) : Window( pPar )
302 {
303 	SetSizePixel( HeaderBar( this, 0 ).CalcWindowSizePixel() );	// HeaderBar used only to calculate size
304 
305 	UpdateBackgroundColor();
306 }
307 
308 SvtDummyHeaderBar_Impl::~SvtDummyHeaderBar_Impl()
309 {
310 }
311 
312 void SvtDummyHeaderBar_Impl::DataChanged( const DataChangedEvent& r )
313 {
314 	Window::DataChanged( r );
315 	if( r.GetType() == DATACHANGED_SETTINGS )
316 		UpdateBackgroundColor();
317 }
318 
319 // class SvtIconWindow_Impl ----------------------------------------------
320 
321 SvtIconWindow_Impl::SvtIconWindow_Impl( Window* pParent ) :
322 
323 	Window( pParent, WB_DIALOGCONTROL | WB_BORDER | WB_3DLOOK ),
324 
325 	aDummyHeaderBar( this ),
326 	aIconCtrl( this, WB_ICON | WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME | /*!WB_NOSELECTION |*/
327 					 WB_NODRAGSELECTION | WB_TABSTOP | WB_CLIPCHILDREN ),
328 	aNewDocumentRootURL( ASCII_STR("private:newdoc") ),
329 	aMyDocumentsRootURL( SvtPathOptions().GetWorkPath() ),
330 	aSamplesFolderRootURL( SvtPathOptions().
331 		SubstituteVariable( String( ASCII_STR("$(insturl)/share/samples/$(vlang)") ) ) ),
332 	nMaxTextLength( 0 )
333 
334 {
335 	aDummyHeaderBar.Show();
336 
337     aIconCtrl.SetAccessibleName( String( RTL_CONSTASCII_USTRINGPARAM("Groups") ) );
338   	aIconCtrl.SetHelpId( HID_TEMPLATEDLG_ICONCTRL );
339 	aIconCtrl.SetChoiceWithCursor( sal_True );
340 	aIconCtrl.SetSelectionMode( SINGLE_SELECTION );
341 	aIconCtrl.Show();
342 
343 	// detect the root URL of templates
344 	Reference< XDocumentTemplates > xTemplates( ::comphelper::getProcessServiceFactory()->
345 		createInstance( ASCII_STR("com.sun.star.frame.DocumentTemplates") ), UNO_QUERY );
346 
347 	if ( xTemplates.is() )
348 	{
349 		Reference < XContent > aRootContent = xTemplates->getContent();
350 		Reference < XCommandEnvironment > aCmdEnv;
351 
352 		if ( aRootContent.is() )
353 			aTemplateRootURL = aRootContent->getIdentifier()->getContentIdentifier();
354 	}
355 
356 	// insert the categories
357 	// "New Document"
358 	sal_Bool bHiContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
359     Image aImage( SvtResId( bHiContrast ? IMG_SVT_NEWDOC_HC : IMG_SVT_NEWDOC ) );
360     nMaxTextLength = aImage.GetSizePixel().Width();
361 	String aEntryStr = String( SvtResId( STR_SVT_NEWDOC ) );
362 	SvxIconChoiceCtrlEntry*	pEntry =
363         aIconCtrl.InsertEntry( aEntryStr, aImage, ICON_POS_NEWDOC );
364 	pEntry->SetUserData( new String( aNewDocumentRootURL ) );
365 	pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_NEWDOC_HELP ) ) );
366     DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" );
367     long nTemp = pEntry->GetBoundRect().GetSize().Width();
368     if (nTemp > nMaxTextLength)
369         nMaxTextLength = nTemp;
370 
371 	// "Templates"
372 	if( aTemplateRootURL.Len() > 0 )
373 	{
374 		aEntryStr = String( SvtResId( STR_SVT_TEMPLATES ) );
375 		pEntry = aIconCtrl.InsertEntry(
376 			aEntryStr, Image( SvtResId( bHiContrast ? IMG_SVT_TEMPLATES_HC : IMG_SVT_TEMPLATES ) ), ICON_POS_TEMPLATES );
377 		pEntry->SetUserData( new String( aTemplateRootURL ) );
378 		pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_TEMPLATES_HELP ) ) );
379         DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" );
380         nTemp = pEntry->GetBoundRect().GetSize().Width();
381         if (nTemp > nMaxTextLength)
382             nMaxTextLength = nTemp;
383 	}
384 
385 	// "My Documents"
386 	aEntryStr = String( SvtResId( STR_SVT_MYDOCS ) );
387 	pEntry = aIconCtrl.InsertEntry(
388 		aEntryStr, Image( SvtResId( bHiContrast ? IMG_SVT_MYDOCS_HC : IMG_SVT_MYDOCS ) ), ICON_POS_MYDOCS );
389 	pEntry->SetUserData( new String( aMyDocumentsRootURL ) );
390 	pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_MYDOCS_HELP ) ) );
391     DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" );
392     nTemp = pEntry->GetBoundRect().GetSize().Width();
393     if( nTemp > nMaxTextLength )
394         nMaxTextLength = nTemp;
395 
396 	// "Samples"
397 	aEntryStr = String( SvtResId( STR_SVT_SAMPLES ) );
398 	pEntry = aIconCtrl.InsertEntry(
399 		aEntryStr, Image( SvtResId( bHiContrast ? IMG_SVT_SAMPLES_HC : IMG_SVT_SAMPLES ) ), ICON_POS_SAMPLES );
400 	pEntry->SetUserData( new String( aSamplesFolderRootURL ) );
401 	pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_SAMPLES_HELP ) ) );
402     DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" );
403     nTemp = pEntry->GetBoundRect().GetSize().Width();
404     if (nTemp > nMaxTextLength)
405         nMaxTextLength = nTemp;
406 
407 	aIconCtrl.CreateAutoMnemonics();
408 }
409 
410 SvtIconWindow_Impl::~SvtIconWindow_Impl()
411 {
412 	for ( sal_uLong i = 0; i < aIconCtrl.GetEntryCount(); ++i )
413 	{
414 		SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetEntry( i );
415 		delete (String*)pEntry->GetUserData();
416 	}
417 }
418 
419 SvxIconChoiceCtrlEntry*	SvtIconWindow_Impl::GetEntry( const String& rURL ) const
420 {
421 	SvxIconChoiceCtrlEntry* pEntry = NULL;
422 	for ( sal_uLong i = 0; i < aIconCtrl.GetEntryCount(); ++i )
423 	{
424 		SvxIconChoiceCtrlEntry* pTemp = aIconCtrl.GetEntry( i );
425 		String aURL( *( (String*)pTemp->GetUserData() ) );
426 		if ( aURL == rURL )
427 		{
428 			pEntry = pTemp;
429 			break;
430 		}
431 	}
432 
433 	return pEntry;
434 }
435 
436 void SvtIconWindow_Impl::Resize()
437 {
438 	Size aWinSize = GetOutputSizePixel();
439 	Size aHeaderSize = aDummyHeaderBar.GetSizePixel();
440 	aHeaderSize.Width() = aWinSize.Width();
441 	aDummyHeaderBar.SetSizePixel( aHeaderSize );
442 	long nHeaderHeight = aHeaderSize.Height();
443 	aWinSize.Height() -= nHeaderHeight;
444 	aIconCtrl.SetPosSizePixel( Point( 0, nHeaderHeight ), aWinSize );
445 	aIconCtrl.ArrangeIcons();
446 }
447 
448 String SvtIconWindow_Impl::GetCursorPosIconURL() const
449 {
450 	String aURL;
451 	SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetCursor( );
452 	if ( pEntry )
453 		aURL = *static_cast<String*>(pEntry->GetUserData());
454 	return aURL;
455 
456 }
457 
458 String SvtIconWindow_Impl::GetSelectedIconURL() const
459 {
460 	sal_uLong nPos;
461 	SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetSelectedEntry( nPos );
462 	String aURL;
463 	if ( pEntry )
464 		aURL = *static_cast<String*>(pEntry->GetUserData());
465 	return aURL;
466 }
467 
468 String SvtIconWindow_Impl::GetSelectedIconText() const
469 {
470 	sal_uLong nPos;
471 	return MnemonicGenerator::EraseAllMnemonicChars( aIconCtrl.GetSelectedEntry( nPos )->GetText() );
472 }
473 
474 String SvtIconWindow_Impl::GetIconText( const String& rURL ) const
475 {
476 	String aText;
477 	SvxIconChoiceCtrlEntry* pEntry = GetEntry( rURL );
478 	if ( pEntry )
479 		aText = MnemonicGenerator::EraseAllMnemonicChars( pEntry->GetText() );
480 	return aText;
481 }
482 
483 void SvtIconWindow_Impl::InvalidateIconControl()
484 {
485 	aIconCtrl.Invalidate();
486 }
487 
488 sal_uLong SvtIconWindow_Impl::GetCursorPos() const
489 {
490 	sal_uLong nPos = ~sal_uLong(0);
491 
492 	SvxIconChoiceCtrlEntry* pCursorEntry = aIconCtrl.GetCursor( );
493 	if ( pCursorEntry )
494 		nPos = aIconCtrl.GetEntryListPos( pCursorEntry );
495 
496 	return nPos;
497 }
498 
499 sal_uLong SvtIconWindow_Impl::GetSelectEntryPos() const
500 {
501 	sal_uLong nPos;
502 	if ( !aIconCtrl.GetSelectedEntry( nPos ) )
503 		nPos = ~sal_uLong(0);
504 	return nPos;
505 }
506 
507 void SvtIconWindow_Impl::SetCursorPos( sal_uLong nPos )
508 {
509 	SvxIconChoiceCtrlEntry*	pEntry = aIconCtrl.GetEntry( nPos );
510 	aIconCtrl.SetCursor( pEntry );
511 	aIconCtrl.Invalidate();
512 	aIconCtrl.Update();
513 }
514 
515 void SvtIconWindow_Impl::SetFocus()
516 {
517 	aIconCtrl.GrabFocus();
518 }
519 
520 long SvtIconWindow_Impl::CalcHeight() const
521 {
522 	// calculate the required height of the IconControl
523 	long nHeight = 0;
524 	sal_uLong nCount = aIconCtrl.GetEntryCount();
525 	if ( nCount > 0 )
526 		// bottom of the last icon
527 		nHeight = aIconCtrl.GetEntry(nCount-1)->GetBoundRect().Bottom();
528 
529 	// + headerbar height
530 	nHeight += aDummyHeaderBar.GetSizePixel().Height();
531 
532 	return nHeight;
533 }
534 
535 sal_Bool SvtIconWindow_Impl::IsRootURL( const String& rURL ) const
536 {
537 	return	rURL == aNewDocumentRootURL ||
538 			rURL == aTemplateRootURL ||
539 			rURL == aMyDocumentsRootURL ||
540 			rURL == aSamplesFolderRootURL;
541 }
542 
543 sal_uLong SvtIconWindow_Impl::GetRootPos( const String& rURL ) const
544 {
545 	sal_uLong nPos = ~sal_uLong(0);
546 	if ( aNewDocumentRootURL.Match( rURL ) == STRING_MATCH )
547 		nPos = 0;
548 	else if ( aTemplateRootURL.Match( rURL ) == STRING_MATCH )
549 		nPos = 1;
550 	else if ( aMyDocumentsRootURL.Match( rURL ) == STRING_MATCH )
551 		nPos = 2;
552 	else if ( aSamplesFolderRootURL.Match( rURL ) == STRING_MATCH )
553 		nPos = 3;
554     else if ( rURL.Match( aMyDocumentsRootURL ) == STRING_MATCH )
555         nPos = 2;
556 	else
557 	{
558         DBG_WARNING( "SvtIconWindow_Impl::GetRootPos(): invalid position" );
559         nPos = 2;
560 	}
561 
562 	return nPos;
563 }
564 
565 void SvtIconWindow_Impl::UpdateIcons( sal_Bool _bHiContrast )
566 {
567 	aIconCtrl.GetEntry( ICON_POS_NEWDOC )->SetImage(
568 		Image( SvtResId( _bHiContrast ? IMG_SVT_NEWDOC_HC : IMG_SVT_NEWDOC ) ) );
569 	aIconCtrl.GetEntry( ICON_POS_TEMPLATES )->SetImage(
570 		Image( SvtResId( _bHiContrast ? IMG_SVT_TEMPLATES_HC : IMG_SVT_TEMPLATES ) ) );
571 	aIconCtrl.GetEntry( ICON_POS_MYDOCS )->SetImage(
572 		Image( SvtResId( _bHiContrast ? IMG_SVT_MYDOCS_HC : IMG_SVT_MYDOCS ) ) );
573 	aIconCtrl.GetEntry( ICON_POS_SAMPLES )->SetImage(
574 		Image( SvtResId( _bHiContrast ? IMG_SVT_SAMPLES_HC : IMG_SVT_SAMPLES ) ) );
575 }
576 /* -----------------27.11.2002 16:58-----------------
577  *
578  * --------------------------------------------------*/
579 void SvtIconWindow_Impl::SelectFolder(sal_Int32 nFolderPosition)
580 {
581     SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetEntry( nFolderPosition );
582     if(pEntry)
583     {
584         aIconCtrl.SetCursor( pEntry );
585         aIconCtrl.GetClickHdl().Call(&aIconCtrl);
586     }
587 }
588 
589 // class SvtFileViewWindow_Impl -----------------------------------------_
590 
591 SvtFileViewWindow_Impl::SvtFileViewWindow_Impl( SvtTemplateWindow* pParent ) :
592 
593 	Window( pParent, WB_DIALOGCONTROL | WB_TABSTOP | WB_BORDER | WB_3DLOOK ),
594 
595 	rParent				( *pParent ),
596 	aFileView			( this, SvtResId( CTRL_FILEVIEW ), FILEVIEW_SHOW_TITLE ),
597 	bIsTemplateFolder	( sal_False )
598 
599 {
600 	aFileView.SetStyle( aFileView.GetStyle() | WB_DIALOGCONTROL | WB_TABSTOP );
601 	aFileView.SetHelpId( HID_TEMPLATEDLG_FILEVIEW );
602 	aFileView.Show();
603 	aFileView.SetPosPixel( Point( 0, 0 ) );
604 	aFileView.EnableAutoResize();
605     aFileView.EnableContextMenu( sal_False );
606     aFileView.EnableDelete( sal_False );
607 }
608 
609 SvtFileViewWindow_Impl::~SvtFileViewWindow_Impl()
610 {
611 }
612 
613 void GetMenuEntry_Impl
614 (
615 	Sequence< PropertyValue >& aDynamicMenuEntry,
616 	::rtl::OUString& rTitle,
617 	::rtl::OUString& rURL,
618     ::rtl::OUString& rFrame,
619 	::rtl::OUString& rImageId
620 )
621 {
622 	for ( int i = 0; i < aDynamicMenuEntry.getLength(); i++ )
623 	{
624 		if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_URL )
625 			aDynamicMenuEntry[i].Value >>= rURL;
626 		else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_TITLE )
627 			aDynamicMenuEntry[i].Value >>= rTitle;
628 		else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_IMAGEIDENTIFIER )
629 			aDynamicMenuEntry[i].Value >>= rImageId;
630 		else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_TARGETNAME )
631 			aDynamicMenuEntry[i].Value >>= rFrame;
632 	}
633 }
634 Sequence< ::rtl::OUString > SvtFileViewWindow_Impl::GetNewDocContents() const
635 {
636 	NewDocList_Impl aNewDocs;
637 	Sequence< Sequence< PropertyValue > > aDynamicMenuEntries;
638 	aDynamicMenuEntries = SvtDynamicMenuOptions().GetMenu( E_NEWMENU );
639 
640 	::rtl::OUString aTitle;
641 	::rtl::OUString aURL;
642 	::rtl::OUString aImageURL;
643 	::rtl::OUString aTargetFrame;
644 
645 	sal_uInt32 i, nCount = aDynamicMenuEntries.getLength();
646 	::rtl::OUString sSeparator( ASCII_STR("private:separator") );
647 	::rtl::OUString sSlotURL( ASCII_STR("slot:5500") );
648 
649 	for ( i = 0; i < nCount; ++i )
650 	{
651 		GetMenuEntry_Impl( aDynamicMenuEntries[i], aTitle, aURL, aTargetFrame, aImageURL );
652 
653         if ( aURL == sSeparator || aURL == sSlotURL )
654 			continue;
655 		else
656 		{
657 			// title
658 			String aRow = MnemonicGenerator::EraseAllMnemonicChars( String( aTitle ) );
659 			aRow += '\t';
660 			// no type
661 			aRow += '\t';
662 			// no size
663 			aRow += '\t';
664 			// no date
665 			aRow += '\t';
666 			// url
667 			aRow += String( aURL );
668 			aRow += '\t';
669 			// folder == false
670 			aRow += '0';
671 			// image url?
672 			if ( aImageURL.getLength() > 0 )
673 			{
674 				aRow += '\t';
675 				aRow += String( aImageURL );
676 			}
677 
678 			::rtl::OUString* pRow = new ::rtl::OUString( aRow );
679 			aNewDocs.Insert( pRow, LIST_APPEND );
680 		}
681 	}
682 
683     nCount = aNewDocs.Count();
684 	Sequence < ::rtl::OUString > aRet( nCount );
685 	::rtl::OUString* pRet = aRet.getArray();
686 	for ( i = 0; i < nCount; ++i )
687 	{
688 		::rtl::OUString* pNewDoc = aNewDocs.GetObject(i);
689 		pRet[i] = *( pNewDoc );
690 		delete pNewDoc;
691 	}
692 
693 	return aRet;
694 }
695 
696 void SvtFileViewWindow_Impl::Resize()
697 {
698 	Size aWinSize = GetOutputSizePixel();
699 
700 	static int	x = 0;
701 	static int	y = 0;
702 
703 	aWinSize.nA += x;
704 	aWinSize.nB += y;
705 	aFileView.SetSizePixel( aWinSize );
706 }
707 
708 String SvtFileViewWindow_Impl::GetSelectedFile() const
709 {
710 	return aFileView.GetCurrentURL();
711 }
712 
713 void SvtFileViewWindow_Impl::OpenFolder( const String& rURL )
714 {
715 	aFolderURL = rURL;
716 
717 	rParent.SetPrevLevelButtonState( rURL );
718 
719     aFileView.SetUrlFilter( &aURLFilter );
720 
721 	INetProtocol eProt = INetURLObject( rURL ).GetProtocol();
722 	bIsTemplateFolder = ( eProt == INET_PROT_VND_SUN_STAR_HIER );
723     bool isNewDocumentFolder = ( eProt == INET_PROT_PRIVATE );
724 
725     aURLFilter.enableFilter( !bIsTemplateFolder && !isNewDocumentFolder );
726 
727     if ( isNewDocumentFolder )
728 	{
729 		aFileView.EnableNameReplacing( sal_False );
730 		aFileView.Initialize( GetNewDocContents() );
731 	}
732 	else
733 	{
734 		xub_StrLen nSampFoldLen = aSamplesFolderURL.Len();
735 		aFileView.EnableNameReplacing(
736 					nSampFoldLen && rURL.CompareTo( aSamplesFolderURL, nSampFoldLen ) == COMPARE_EQUAL );
737 		aFileView.Initialize( rURL, String(), NULL );
738 	}
739 	aNewFolderLink.Call( this );
740 }
741 
742 sal_Bool SvtFileViewWindow_Impl::HasPreviousLevel( String& rURL ) const
743 {
744 	INetURLObject aViewObj( aFileView.GetViewURL() );
745 	INetURLObject aRootObj( aCurrentRootURL );
746 	INetURLObject aMyDocObj( aMyDocumentsURL );
747 
748     return ( ( aViewObj != aRootObj || aRootObj == aMyDocObj ) && aFileView.GetParentURL( rURL ) );
749 }
750 
751 String SvtFileViewWindow_Impl::GetFolderTitle() const
752 {
753 	String aTitle;
754 	::utl::UCBContentHelper::GetTitle( aFolderURL, aTitle );
755 	return aTitle;
756 }
757 
758 void SvtFileViewWindow_Impl::SetFocus()
759 {
760 	aFileView.SetFocus();
761 }
762 
763 // class SvtDocInfoTable_Impl --------------------------------------------
764 
765 SvtDocInfoTable_Impl::SvtDocInfoTable_Impl() :
766 
767 	ResStringArray( SvtResId( STRARY_SVT_DOCINFO ) )
768 
769 {
770 }
771 // -----------------------------------------------------------------------------
772 // class SvtExtendedMultiLineEdit_Impl --------------------------------------------
773 SvtExtendedMultiLineEdit_Impl::SvtExtendedMultiLineEdit_Impl( Window* pParent,WinBits _nBits ) :
774 
775 	ExtMultiLineEdit( pParent, _nBits )
776 
777 {
778 	SetLeftMargin( 10 );
779 }
780 // -----------------------------------------------------------------------------
781 void SvtExtendedMultiLineEdit_Impl::InsertEntry( const String& rTitle, const String& rValue )
782 {
783 	String aText( '\n' );
784 	aText += rTitle;
785 	aText += ':';
786 	InsertText( aText );
787 	sal_uLong nPara = GetParagraphCount() - 1;
788 	SetAttrib( TextAttribFontWeight( WEIGHT_BOLD ), nPara, 0, aText.Len() );
789 
790 	aText = '\n';
791 	aText += rValue;
792 	InsertText( aText );
793 	nPara = GetParagraphCount() - 1;
794 	SetAttrib( TextAttribFontWeight( WEIGHT_NORMAL ), nPara, 0, aText.Len() );
795 
796 	InsertText( String( '\n' ) );
797 }
798 // -----------------------------------------------------------------------------
799 
800 // -----------------------------------------------------------------------
801 
802 const String& SvtDocInfoTable_Impl::GetString( long nId ) const
803 {
804     sal_uInt32 nPos( FindIndex( nId ) );
805 
806 	if ( RESARRAY_INDEX_NOTFOUND != nPos )
807 		return ResStringArray::GetString( nPos );
808 	else
809 		return aEmptyString;
810 }
811 
812 // class SvtFrameWindow_Impl ---------------------------------------------
813 
814 SvtFrameWindow_Impl::SvtFrameWindow_Impl( Window* pParent ) :
815 
816 	Window( pParent )
817 
818 {
819 	// detect application language
820 	aLocale= SvtPathOptions().GetLocale();
821 
822 	// create windows and frame
823 	pEditWin = new ODocumentInfoPreview( this ,WB_LEFT | WB_VSCROLL | WB_READONLY | WB_BORDER | WB_3DLOOK);
824 	pTextWin = new Window( this );
825     xFrame = Reference < XFrame > ( ::comphelper::getProcessServiceFactory()->
826 		createInstance( ASCII_STR("com.sun.star.frame.Frame") ), UNO_QUERY );
827 	xWindow = VCLUnoHelper::GetInterface( pTextWin );
828 	xFrame->initialize( xWindow );
829 
830 	// create docinfo instance
831     m_xDocProps.set( ::comphelper::getProcessServiceFactory()->createInstance(
832             ASCII_STR("com.sun.star.document.DocumentProperties") ),
833         UNO_QUERY );
834 
835 	pEmptyWin = new Window( this, WB_BORDER | WB_3DLOOK );
836 }
837 
838 SvtFrameWindow_Impl::~SvtFrameWindow_Impl()
839 {
840 	delete pEditWin;
841 	delete pEmptyWin;
842 	xFrame->dispose();
843 }
844 
845 void SvtFrameWindow_Impl::ViewEditWin()
846 {
847 	pEmptyWin->Hide();
848 	xWindow->setVisible( sal_False );
849 	pTextWin->Hide();
850 	pEditWin->Show();
851 }
852 
853 void SvtFrameWindow_Impl::ViewTextWin()
854 {
855 	pEmptyWin->Hide();
856 	pEditWin->Hide();
857 	xWindow->setVisible( sal_True );
858 	pTextWin->Show();
859 }
860 
861 void SvtFrameWindow_Impl::ViewEmptyWin()
862 {
863 	xWindow->setVisible( sal_False );
864 	pTextWin->Hide();
865 	pEditWin->Hide();
866 	pEmptyWin->Show();
867 }
868 
869 void SvtFrameWindow_Impl::ViewNonEmptyWin()
870 {
871 	if( bDocInfo )
872 		ViewEditWin();
873 	else
874 		ViewTextWin();
875 }
876 
877 IMPL_STATIC_LINK_NOINSTANCE( SvtFrameWindow_Impl, ExecuteHdl_Impl, SvtExecuteInfo*, pExecuteInfo )
878 {
879     try
880     {
881         pExecuteInfo->xDispatch->dispatch( pExecuteInfo->aTargetURL, Sequence < PropertyValue >() );
882     }
883     catch ( Exception& )
884     {
885     }
886 
887     delete pExecuteInfo;
888     return 0;
889 }
890 
891 void SvtFrameWindow_Impl::ShowDocInfo( const String& rURL )
892 {
893 	try
894 	{
895 		uno::Reference < task::XInteractionHandler > xInteractionHandler( ::comphelper::getProcessServiceFactory()->createInstance(
896 			::rtl::OUString::createFromAscii("com.sun.star.task.InteractionHandler") ), uno::UNO_QUERY );
897 		uno::Sequence < beans::PropertyValue> aProps(1);
898 		aProps[0].Name = ::rtl::OUString::createFromAscii("InteractionHandler");
899 		aProps[0].Value <<= xInteractionHandler;
900 		m_xDocProps->loadFromMedium( rURL, aProps );
901         pEditWin->fill( m_xDocProps, rURL );
902 	}
903 	catch ( UnknownPropertyException& ) {}
904 	catch ( Exception& ) {}
905 }
906 
907 void SvtFrameWindow_Impl::Resize()
908 {
909 	Size aWinSize = GetOutputSizePixel();
910 	pEditWin->SetSizePixel( aWinSize );
911 	pTextWin->SetSizePixel( aWinSize );
912 	pEmptyWin->SetSizePixel( aWinSize );
913 }
914 
915 void SvtFrameWindow_Impl::OpenFile( const String& rURL, sal_Bool bPreview, sal_Bool bIsTemplate, sal_Bool bAsTemplate )
916 {
917 	if ( bPreview )
918 		aCurrentURL = rURL;
919 
920 	ViewNonEmptyWin();
921 	pEditWin->Clear();
922 
923     if ( rURL.Len() > 0 && bPreview && m_xDocProps.is() )
924         ShowDocInfo( rURL );
925 
926 	if ( rURL.Len() == 0 )
927 	{
928 		xFrame->setComponent( Reference < com::sun::star::awt::XWindow >(), Reference < XController >() );
929 		ViewEmptyWin();
930 	}
931 	else if ( !::utl::UCBContentHelper::IsFolder( rURL ) )
932 	{
933 		com::sun::star::util::URL aURL;
934 		aURL.Complete = rURL;
935     	Reference < com::sun::star::util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->
936 			createInstance( ASCII_STR("com.sun.star.util.URLTransformer" ) ), UNO_QUERY );
937     	xTrans->parseStrict( aURL );
938 
939 		String aTarget;
940     	Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY );
941 		if ( bPreview )
942 			aTarget = ASCII_STR("_self");
943 		else
944 		{
945             // can be removed if the database application change its URL
946             String sServiceScheme( RTL_CONSTASCII_STRINGPARAM( "service:" ) );
947             if ( rURL.Match( sServiceScheme ) != sServiceScheme.Len() )
948                 // service URL has no default target
949                 aTarget = ASCII_STR("_default");
950 			xProv = Reference < XDispatchProvider >( ::comphelper::getProcessServiceFactory()->
951 				createInstance( ASCII_STR("com.sun.star.frame.Desktop") ), UNO_QUERY );
952 		}
953 
954     	Reference < XDispatch > xDisp = xProv.is() ?
955 			xProv->queryDispatch( aURL, aTarget, 0 ) : Reference < XDispatch >();
956 
957 		if ( xDisp.is() )
958 		{
959 			if ( bPreview )
960 			{
961 				if ( m_aOpenURL != aURL.Complete )
962 				{
963 					WaitObject aWaitCursor( GetParent() );
964 	                // disabling must be done here, does not work in ctor because
965 	                // execute of the dialog will overwrite it
966 	                // ( own execute method would help )
967 	                pTextWin->EnableInput( sal_False, sal_True );
968 					if ( pTextWin->IsReallyVisible() )
969 					{
970 						sal_Bool	b = sal_True;
971 						Sequence < PropertyValue > aArgs( 4 );
972 	        			aArgs[0].Name = ASCII_STR("Preview");
973 						aArgs[0].Value.setValue( &b, ::getBooleanCppuType() );
974 	        			aArgs[1].Name = ASCII_STR("ReadOnly");
975 						aArgs[1].Value.setValue( &b, ::getBooleanCppuType() );
976 	        			aArgs[2].Name = ASCII_STR("AsTemplate");	// prevents getting an empty URL with getURL()!
977 
978 						uno::Reference < task::XInteractionHandler > xInteractionHandler( ::comphelper::getProcessServiceFactory()->createInstance(
979 							::rtl::OUString::createFromAscii("com.sun.star.task.InteractionHandler") ), uno::UNO_QUERY );
980 						aArgs[3].Name = ::rtl::OUString::createFromAscii("InteractionHandler");
981 						aArgs[3].Value <<= xInteractionHandler;
982 
983 						b = sal_False;
984 	        			aArgs[2].Value.setValue( &b, ::getBooleanCppuType() );
985 	        			xDisp->dispatch( aURL, aArgs );
986 
987 						::rtl::OUString											aDispURL;
988 						Reference< ::com::sun::star::frame::XController >		xCtrl = xFrame->getController();
989 						if( xCtrl.is() )
990 						{
991 							Reference< ::com::sun::star::frame::XModel >		xMdl = xCtrl->getModel();
992 							if( xMdl.is() )
993 								aDispURL = xMdl->getURL();
994 						}
995 
996 						if( aDispURL != aURL.Complete )
997 						{
998 							xFrame->setComponent( Reference < com::sun::star::awt::XWindow >(), Reference < XController >() );
999 							ViewEmptyWin();
1000 							m_aOpenURL = rtl::OUString();
1001 						}
1002 						else
1003 							m_aOpenURL = aDispURL;
1004 					}
1005 				}
1006 			}
1007 			else if ( bIsTemplate )
1008 			{
1009 				Sequence < PropertyValue > aArgs( 1 );
1010         		aArgs[0].Name = ASCII_STR("AsTemplate");
1011         		aArgs[0].Value <<= bAsTemplate;
1012         		xDisp->dispatch( aURL, aArgs );
1013 				m_aOpenURL = rtl::OUString();
1014 			}
1015 			else
1016 			{
1017 			/*
1018                 SvtExecuteInfo* pExecuteInfo = new SvtExecuteInfo;
1019                 pExecuteInfo->xDispatch = xDisp;
1020                 pExecuteInfo->aTargetURL = aURL;
1021                 Application::PostUserEvent(
1022                     STATIC_LINK(0, SvtFrameWindow_Impl, ExecuteHdl_Impl), pExecuteInfo );
1023             */
1024 				Sequence < PropertyValue > aArgs;
1025         		xDisp->dispatch( aURL, aArgs );
1026 				m_aOpenURL = rtl::OUString();
1027 			}
1028 		}
1029 	}
1030 }
1031 
1032 void SvtFrameWindow_Impl::ToggleView( sal_Bool bDI )
1033 {
1034 	bDocInfo = bDI;
1035 
1036 	// view is set properly in OpenFile()
1037 
1038 	OpenFile( aCurrentURL, sal_True, sal_False, sal_False );
1039 }
1040 
1041 // class SvtTemplateWindow -----------------------------------------------
1042 
1043 SvtTemplateWindow::SvtTemplateWindow( Window* pParent ) :
1044 
1045 	Window( pParent, WB_DIALOGCONTROL ),
1046 
1047 	aFileViewTB				( this, SvtResId( TB_SVT_FILEVIEW ) ),
1048 	aFrameWinTB				( this, SvtResId( TB_SVT_FRAMEWIN ) ),
1049 	aSplitWin				( this, WB_DIALOGCONTROL | WB_NOSPLITDRAW ),
1050 	pHistoryList			( NULL )
1051 
1052 {
1053 	// create windows
1054 	pIconWin = new SvtIconWindow_Impl( this );
1055 	pFileWin = new SvtFileViewWindow_Impl( this );
1056 	pFileWin->SetMyDocumentsURL( pIconWin->GetMyDocumentsRootURL() );
1057 	pFileWin->SetSamplesFolderURL( pIconWin->GetSamplesFolderURL() );
1058 	pFrameWin = new SvtFrameWindow_Impl( this );
1059 
1060 	// set handlers
1061 	pIconWin->SetClickHdl( LINK( this, SvtTemplateWindow, IconClickHdl_Impl ) );
1062 	pFileWin->SetSelectHdl( LINK( this, SvtTemplateWindow, FileSelectHdl_Impl ) );
1063 	pFileWin->SetDoubleClickHdl( LINK( this, SvtTemplateWindow, FileDblClickHdl_Impl ) );
1064 	pFileWin->SetNewFolderHdl( LINK( this, SvtTemplateWindow, NewFolderHdl_Impl ) );
1065 
1066 	// create the split items
1067 	aSplitWin.SetAlign( WINDOWALIGN_LEFT );
1068     long nWidth = pIconWin->GetMaxTextLength() * 8 / 7 + 1;	// extra space for border
1069 	aSplitWin.InsertItem( ICONWIN_ID, pIconWin, nWidth, SPLITWINDOW_APPEND, 0, SWIB_FIXED );
1070 	aSplitWin.InsertItem( FILEWIN_ID, pFileWin, 50, SPLITWINDOW_APPEND, 0, SWIB_PERCENTSIZE );
1071 	aSplitWin.InsertItem( FRAMEWIN_ID, pFrameWin, 50, SPLITWINDOW_APPEND, 0, SWIB_PERCENTSIZE );
1072 	aSplitWin.SetSplitHdl( LINK( this, SvtTemplateWindow, ResizeHdl_Impl ) );
1073 
1074 	// show the windows
1075 	pIconWin->Show();
1076 	pFileWin->Show();
1077 	pFrameWin->Show();
1078 	aSplitWin.Show();
1079 
1080 	// initialize the timers
1081 	aSelectTimer.SetTimeout( 200 );
1082 	aSelectTimer.SetTimeoutHdl( LINK( this, SvtTemplateWindow, TimeoutHdl_Impl ) );
1083 
1084 	// initialize the toolboxes and then show them
1085 	InitToolBoxes();
1086 	aFileViewTB.Show();
1087 	aFrameWinTB.Show();
1088 
1089 	ReadViewSettings( );
1090 
1091 	Application::PostUserEvent( LINK( this, SvtTemplateWindow, ResizeHdl_Impl ) );
1092 }
1093 
1094 // ------------------------------------------------------------------------
1095 
1096 SvtTemplateWindow::~SvtTemplateWindow()
1097 {
1098 	WriteViewSettings( );
1099 
1100 	delete pIconWin;
1101 	delete pFileWin;
1102 	delete pFrameWin;
1103 	if ( pHistoryList )
1104 	{
1105 		for ( sal_uInt32 i = 0; i < pHistoryList->Count(); ++i )
1106 			delete pHistoryList->GetObject(i);
1107 		delete pHistoryList;
1108 	}
1109 }
1110 
1111 // ------------------------------------------------------------------------
1112 
1113 IMPL_LINK ( SvtTemplateWindow , IconClickHdl_Impl, SvtIconChoiceCtrl *, EMPTYARG )
1114 {
1115 	String aURL = pIconWin->GetSelectedIconURL();
1116 	if ( !aURL.Len() )
1117 		aURL = pIconWin->GetCursorPosIconURL();
1118 	if ( pFileWin->GetRootURL() != aURL )
1119 	{
1120 		pFileWin->OpenRoot( aURL );
1121 		pIconWin->InvalidateIconControl();
1122 		aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, sal_False );
1123 	}
1124 	return 0;
1125 }
1126 
1127 // ------------------------------------------------------------------------
1128 
1129 IMPL_LINK ( SvtTemplateWindow , FileSelectHdl_Impl, SvtFileView *, EMPTYARG )
1130 {
1131 	aSelectTimer.Start();
1132 	return 0;
1133 }
1134 
1135 // ------------------------------------------------------------------------
1136 
1137 IMPL_LINK ( SvtTemplateWindow , FileDblClickHdl_Impl, SvtFileView *, EMPTYARG )
1138 {
1139 	if ( aSelectTimer.IsActive() )
1140 		aSelectTimer.Stop();
1141 
1142 	String aURL = pFileWin->GetSelectedFile();
1143     if ( aURL.Len() > 0 )
1144     {
1145         if ( ::utl::UCBContentHelper::IsFolder( aURL ) )
1146             pFileWin->OpenFolder( aURL );
1147         else
1148             aDoubleClickHdl.Call( this );
1149     }
1150 
1151     return 0;
1152 }
1153 
1154 // ------------------------------------------------------------------------
1155 
1156 IMPL_LINK ( SvtTemplateWindow , NewFolderHdl_Impl, SvtFileView *, EMPTYARG )
1157 {
1158 	pFrameWin->OpenFile( String(), sal_True, sal_False, sal_False );
1159 	aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, sal_False );
1160 
1161 	String sURL = pFileWin->GetFolderURL();
1162 	sal_uLong nPos = pIconWin->GetRootPos( sURL );
1163 	AppendHistoryURL( sURL, nPos );
1164 
1165 	aNewFolderHdl.Call( this );
1166 	return 0;
1167 }
1168 
1169 // ------------------------------------------------------------------------
1170 
1171 IMPL_LINK ( SvtTemplateWindow , TimeoutHdl_Impl, Timer *, EMPTYARG )
1172 {
1173     aSelectHdl.Call( this );
1174     String sURL = pFileWin->GetSelectedFile();
1175     sal_Bool bIsNewDoc = ( pIconWin->GetSelectEntryPos() == ICON_POS_NEWDOC );
1176     sal_Bool bIsFile = ( sURL.Len() != 0 && !::utl::UCBContentHelper::IsFolder( sURL ) &&
1177                          INetURLObject( sURL ).GetProtocol() != INET_PROT_PRIVATE && !bIsNewDoc );
1178     aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, bIsFile );
1179     aFrameWinTB.EnableItem( TI_DOCTEMPLATE_PREVIEW, !bIsNewDoc );
1180 
1181     if ( bIsFile )
1182         pFrameWin->OpenFile( sURL, sal_True, sal_False, sal_False );
1183     else if ( bIsNewDoc && aFrameWinTB.IsItemChecked( TI_DOCTEMPLATE_PREVIEW ) )
1184     {
1185         aFrameWinTB.CheckItem( TI_DOCTEMPLATE_DOCINFO );
1186         DoAction( TI_DOCTEMPLATE_DOCINFO );
1187     }
1188     return 0;
1189 }
1190 
1191 // ------------------------------------------------------------------------
1192 
1193 IMPL_LINK ( SvtTemplateWindow , ClickHdl_Impl, ToolBox *, pToolBox )
1194 {
1195 	DoAction( pToolBox->GetCurItemId() );
1196 	return 0;
1197 }
1198 
1199 // ------------------------------------------------------------------------
1200 
1201 IMPL_LINK ( SvtTemplateWindow , ResizeHdl_Impl, SplitWindow *, EMPTYARG )
1202 {
1203 	Resize();
1204 	return 0;
1205 }
1206 
1207 // ------------------------------------------------------------------------
1208 
1209 void SvtTemplateWindow::PrintFile( const String& rURL )
1210 {
1211 	// open the file readonly and hidden
1212 	Sequence < PropertyValue > aArgs( 2 );
1213     aArgs[0].Name = ASCII_STR("ReadOnly");
1214     aArgs[0].Value <<= sal_True;
1215 	aArgs[1].Name = ASCII_STR("Hidden");
1216     aArgs[1].Value <<= sal_True;
1217 
1218 	Reference < XComponentLoader > xDesktop( ::comphelper::getProcessServiceFactory()->
1219 		createInstance( ASCII_STR("com.sun.star.frame.Desktop") ), UNO_QUERY );
1220     Reference < XModel > xModel( xDesktop->loadComponentFromURL(
1221 		rURL, ASCII_STR("_blank"), 0, aArgs ), UNO_QUERY );
1222     if ( xModel.is() )
1223 	{
1224 		// print
1225     	Reference < XPrintable > xPrintable( xModel, UNO_QUERY );
1226 		if ( xPrintable.is() )
1227 			xPrintable->print( Sequence < PropertyValue >() );
1228 	}
1229 }
1230 
1231 // ------------------------------------------------------------------------
1232 
1233 void SvtTemplateWindow::AppendHistoryURL( const String& rURL, sal_uLong nGroup )
1234 {
1235 	sal_Bool bInsert = sal_True;
1236 	if ( !pHistoryList )
1237 		pHistoryList = new HistoryList_Impl;
1238 	else if ( pHistoryList->Count() > 0 )
1239 	{
1240 		FolderHistory* pLastEntry = pHistoryList->GetObject( pHistoryList->Count() - 1 );
1241 		bInsert = ( rURL != pLastEntry->m_sURL);
1242 	}
1243 
1244 	if ( bInsert )
1245 	{
1246 		FolderHistory* pEntry = new FolderHistory( rURL, nGroup );
1247 		pHistoryList->Insert( pEntry, LIST_APPEND );
1248 		aFileViewTB.EnableItem( TI_DOCTEMPLATE_BACK, pHistoryList->Count() > 1 );
1249 	}
1250 }
1251 
1252 // ------------------------------------------------------------------------
1253 
1254 void SvtTemplateWindow::OpenHistory()
1255 {
1256 	FolderHistory* pEntry = pHistoryList->Remove( pHistoryList->Count() - 1 );
1257 	pEntry = pHistoryList->Remove( pHistoryList->Count() - 1 );
1258 	aFileViewTB.EnableItem( TI_DOCTEMPLATE_BACK, pHistoryList->Count() > 1 );
1259 	pFileWin->OpenFolder( pEntry->m_sURL );
1260 	pIconWin->SetCursorPos( pEntry->m_nGroup );
1261 	delete pEntry;
1262 }
1263 
1264 // ------------------------------------------------------------------------
1265 
1266 void SvtTemplateWindow::DoAction( sal_uInt16 nAction )
1267 {
1268 	switch( nAction )
1269 	{
1270 		case TI_DOCTEMPLATE_BACK :
1271 		{
1272 			if ( pHistoryList && pHistoryList->Count() > 1 )
1273 				OpenHistory();
1274 			break;
1275 		}
1276 
1277 		case TI_DOCTEMPLATE_PREV :
1278 		{
1279 			String aURL;
1280 			if ( pFileWin->HasPreviousLevel( aURL ) )
1281 				pFileWin->OpenFolder( aURL );
1282 			break;
1283 		}
1284 
1285 		case TI_DOCTEMPLATE_PRINT :
1286 		{
1287 			String sPrintFile( pFileWin->GetSelectedFile() );
1288 			if ( sPrintFile.Len() > 0 )
1289 				PrintFile( sPrintFile );
1290 			break;
1291 		}
1292 
1293 		case TI_DOCTEMPLATE_DOCINFO :
1294 		case TI_DOCTEMPLATE_PREVIEW :
1295 		{
1296 			pFrameWin->ToggleView( TI_DOCTEMPLATE_DOCINFO == nAction );
1297 			break;
1298 		}
1299 	}
1300 }
1301 
1302 // ------------------------------------------------------------------------
1303 
1304 void SvtTemplateWindow::InitToolBoxes()
1305 {
1306 	InitToolBoxImages();
1307 
1308 	Size aSize = aFileViewTB.CalcWindowSizePixel();
1309 	aSize.Height() += 4;
1310 	aFileViewTB.SetPosSizePixel( Point( 0, 2 ), aSize );
1311 	aSize = aFrameWinTB.CalcWindowSizePixel();
1312 	aSize.Height() += 4;
1313 	aFrameWinTB.SetPosSizePixel( Point( pFrameWin->GetPosPixel().X() + 2, 2 ), aSize );
1314 
1315 	sal_Bool bFlat = ( SvtMiscOptions().GetToolboxStyle() == TOOLBOX_STYLE_FLAT );
1316 	if ( bFlat )
1317 	{
1318 		aFileViewTB.SetOutStyle( TOOLBOX_STYLE_FLAT );
1319 		aFrameWinTB.SetOutStyle( TOOLBOX_STYLE_FLAT );
1320 	}
1321 
1322 	aFileViewTB.EnableItem( TI_DOCTEMPLATE_BACK, sal_False );
1323 	aFileViewTB.EnableItem( TI_DOCTEMPLATE_PREV, sal_False );
1324 	aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, sal_False );
1325 
1326 	Link aLink = LINK( this, SvtTemplateWindow, ClickHdl_Impl );
1327 	aFileViewTB.SetClickHdl( aLink );
1328 	aFrameWinTB.SetClickHdl( aLink );
1329 }
1330 
1331 // ------------------------------------------------------------------------
1332 
1333 void SvtTemplateWindow::InitToolBoxImages()
1334 {
1335 	SvtMiscOptions aMiscOpt;
1336 	sal_Bool bLarge = aMiscOpt.AreCurrentSymbolsLarge();
1337 	sal_Bool bHiContrast = aFileViewTB.GetSettings().GetStyleSettings().GetHighContrastMode();
1338 
1339 	aFileViewTB.SetItemImage( TI_DOCTEMPLATE_BACK, Image( SvtResId(
1340 		bLarge ? bHiContrast ? IMG_SVT_DOCTEMPL_HC_BACK_LARGE : IMG_SVT_DOCTEMPLATE_BACK_LARGE
1341 			   : bHiContrast ? IMG_SVT_DOCTEMPL_HC_BACK_SMALL : IMG_SVT_DOCTEMPLATE_BACK_SMALL ) ) );
1342 	aFileViewTB.SetItemImage( TI_DOCTEMPLATE_PREV, Image( SvtResId(
1343 		bLarge ? bHiContrast ? IMG_SVT_DOCTEMPL_HC_PREV_LARGE : IMG_SVT_DOCTEMPLATE_PREV_LARGE
1344 			   : bHiContrast ? IMG_SVT_DOCTEMPL_HC_PREV_SMALL : IMG_SVT_DOCTEMPLATE_PREV_SMALL ) ) );
1345 	aFileViewTB.SetItemImage( TI_DOCTEMPLATE_PRINT, Image( SvtResId(
1346 		bLarge ? bHiContrast ? IMG_SVT_DOCTEMPL_HC_PRINT_LARGE : IMG_SVT_DOCTEMPLATE_PRINT_LARGE
1347 			   : bHiContrast ? IMG_SVT_DOCTEMPL_HC_PRINT_SMALL : IMG_SVT_DOCTEMPLATE_PRINT_SMALL ) ) );
1348 
1349 	aFrameWinTB.SetItemImage( TI_DOCTEMPLATE_DOCINFO, Image( SvtResId(
1350 		bLarge ? bHiContrast ? IMG_SVT_DOCTEMPL_HC_DOCINFO_LARGE : IMG_SVT_DOCTEMPLATE_DOCINFO_LARGE
1351 			   : bHiContrast ? IMG_SVT_DOCTEMPL_HC_DOCINFO_SMALL : IMG_SVT_DOCTEMPLATE_DOCINFO_SMALL ) ) );
1352 	aFrameWinTB.SetItemImage( TI_DOCTEMPLATE_PREVIEW, Image( SvtResId(
1353 		bLarge ? bHiContrast ? IMG_SVT_DOCTEMPL_HC_PREVIEW_LARGE : IMG_SVT_DOCTEMPLATE_PREVIEW_LARGE
1354 			   : bHiContrast ? IMG_SVT_DOCTEMPL_HC_PREVIEW_SMALL : IMG_SVT_DOCTEMPLATE_PREVIEW_SMALL ) ) );
1355 }
1356 
1357 // ------------------------------------------------------------------------
1358 
1359 void SvtTemplateWindow::UpdateIcons()
1360 {
1361 	pIconWin->UpdateIcons( aFileViewTB.GetSettings().GetStyleSettings().GetHighContrastMode() );
1362 }
1363 
1364 // ------------------------------------------------------------------------
1365 
1366 long SvtTemplateWindow::PreNotify( NotifyEvent& rNEvt )
1367 {
1368 	sal_uInt16 nType = rNEvt.GetType();
1369 	long nRet = 0;
1370 
1371 	if ( EVENT_KEYINPUT == nType && rNEvt.GetKeyEvent() )
1372 	{
1373 		const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
1374 		sal_uInt16 nCode = rKeyCode.GetCode();
1375 
1376 		if ( KEY_BACKSPACE == nCode && !rKeyCode.GetModifier() && pFileWin->HasChildPathFocus() )
1377 		{
1378 			DoAction( TI_DOCTEMPLATE_BACK );
1379 			nRet = 1;
1380 		}
1381 		else if ( pIconWin->ProcessKeyEvent( *rNEvt.GetKeyEvent() ) )
1382 		{
1383 			nRet = 1;
1384 		}
1385 	}
1386 
1387 	return nRet ? nRet : Window::PreNotify( rNEvt );
1388 }
1389 
1390 // -----------------------------------------------------------------------------
1391 
1392 void SvtTemplateWindow::DataChanged( const DataChangedEvent& rDCEvt )
1393 {
1394 	Window::DataChanged( rDCEvt );
1395 
1396 	if ( ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS )	||
1397 		   ( rDCEvt.GetType() == DATACHANGED_DISPLAY ) ) &&
1398 		 ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
1399 	{
1400 		// update of the background for the area left of the FileView toolbox
1401 		SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetFaceColor() ) );
1402 		// update of the images of the IconChoiceControl
1403 		UpdateIcons();
1404 		// update of the toolbox images
1405 		InitToolBoxImages();
1406 	}
1407 }
1408 // ------------------------------------------------------------------------
1409 
1410 void SvtTemplateWindow::Resize()
1411 {
1412 	long nItemSize = aSplitWin.GetItemSize( ICONWIN_ID );
1413 	long nSplitterWidth = Splitter( this, 0 ).GetSizePixel().Width();
1414 
1415 	Point aPos = aFileViewTB.GetPosPixel();
1416 	aPos.X() = nItemSize + nSplitterWidth / 2;
1417 	aFileViewTB.SetPosPixel( aPos );
1418 
1419 	Size aWinSize = GetOutputSizePixel();
1420 	long nWidth = aWinSize.Width() - aPos.X();
1421 
1422 	nItemSize = nWidth * aSplitWin.GetItemSize( FILEWIN_ID ) / 100;
1423 	aPos.X() = pFrameWin->GetPosPixel().X() + 2;
1424 	aFrameWinTB.SetPosPixel( aPos );
1425 
1426 	Size aSize = aFileViewTB.GetSizePixel();
1427 	aSize.Width() = nItemSize;
1428 	aFileViewTB.SetSizePixel( aSize );
1429 
1430 	aSize = aFrameWinTB.GetSizePixel();
1431 	aSize.Width() = nWidth - nItemSize;
1432 	aFrameWinTB.SetSizePixel( aSize );
1433 
1434 	long nToolBoxHeight = aSize.Height() + aFrameWinTB.GetPosPixel().Y();
1435 	aSize = aWinSize;
1436 	aSize.Height() -= nToolBoxHeight;
1437 	aSplitWin.SetPosSizePixel( Point( 0, nToolBoxHeight  ), aSize );
1438 }
1439 
1440 // ------------------------------------------------------------------------
1441 
1442 String SvtTemplateWindow::GetSelectedFile() const
1443 {
1444 	return pFileWin->GetSelectedFile();
1445 }
1446 
1447 // ------------------------------------------------------------------------
1448 
1449 sal_Bool SvtTemplateWindow::IsFileSelected() const
1450 {
1451 	String aURL = pFileWin->GetSelectedFile();
1452 	sal_Bool bRet = ( aURL.Len() > 0 && !::utl::UCBContentHelper::IsFolder( aURL ) );
1453 	return bRet;
1454 }
1455 
1456 // ------------------------------------------------------------------------
1457 
1458 void SvtTemplateWindow::OpenFile( sal_Bool bNotAsTemplate )
1459 {
1460 	String aURL = pFileWin->GetSelectedFile();
1461 	if ( aURL.Len() > 0 && !::utl::UCBContentHelper::IsFolder( aURL ) )
1462 		pFrameWin->OpenFile( aURL, sal_False, pFileWin->IsTemplateFolder(), !bNotAsTemplate );
1463 }
1464 
1465 // ------------------------------------------------------------------------
1466 
1467 String SvtTemplateWindow::GetFolderTitle() const
1468 {
1469 	String sTitle;
1470 	String sFolderURL = pFileWin->GetFolderURL();
1471 	if ( pIconWin->IsRootURL( sFolderURL ) )
1472 		sTitle = pIconWin->GetIconText( sFolderURL );
1473 	else
1474 		sTitle = pFileWin->GetFolderTitle();
1475 	return sTitle;
1476 }
1477 
1478 // ------------------------------------------------------------------------
1479 
1480 String SvtTemplateWindow::GetFolderURL() const
1481 {
1482 	return pFileWin->GetFolderURL();
1483 }
1484 
1485 
1486 // ------------------------------------------------------------------------
1487 
1488 void SvtTemplateWindow::SetFocus( sal_Bool bIconWin )
1489 {
1490 	if ( bIconWin )
1491 		pIconWin->SetFocus();
1492 	else
1493 		pFileWin->SetFocus();
1494 }
1495 
1496 // ------------------------------------------------------------------------
1497 
1498 void SvtTemplateWindow::OpenTemplateRoot()
1499 {
1500 	pFileWin->OpenFolder( pIconWin->GetTemplateRootURL() );
1501 }
1502 
1503 // ------------------------------------------------------------------------
1504 
1505 void SvtTemplateWindow::SetPrevLevelButtonState( const String& rURL )
1506 {
1507 	// disable the prev level button on root folder of the icon pane (except My Documents)
1508 	// and on the root of all (file:/// -> count == 0)
1509 	INetURLObject aObj( rURL );
1510 	sal_Int32 nCount = aObj.getSegmentCount();
1511 	sal_Bool bEnable =
1512 		( nCount > 0 &&
1513 			( !pIconWin->IsRootURL( rURL ) || rURL == pIconWin->GetMyDocumentsRootURL() ) );
1514 	aFileViewTB.EnableItem( TI_DOCTEMPLATE_PREV, bEnable );
1515 }
1516 
1517 // ------------------------------------------------------------------------
1518 
1519 void SvtTemplateWindow::ClearHistory()
1520 {
1521 	if( pHistoryList )
1522 		pHistoryList->Clear();
1523 }
1524 
1525 // ------------------------------------------------------------------------
1526 
1527 long SvtTemplateWindow::CalcHeight() const
1528 {
1529 	// toolbox height
1530 	long nHeight = aFileViewTB.GetSizePixel().Height();
1531 	// + iconwin height
1532 	nHeight += pIconWin->CalcHeight();
1533 	// + little offset
1534 	nHeight += 8;
1535 	return nHeight;
1536 }
1537 
1538 // ------------------------------------------------------------------------
1539 
1540 void SvtTemplateWindow::ReadViewSettings()
1541 {
1542 	// defaults
1543 	sal_Int32 nSelectedGroup	=	ICON_POS_TEMPLATES;
1544 	sal_Int32 nSelectedView		=	TI_DOCTEMPLATE_DOCINFO;
1545 	double nSplitRatio			=	0.5;
1546 	::rtl::OUString sLastFolder;
1547 
1548 	SvtViewOptions aViewSettings( E_DIALOG, VIEWSETTING_NEWFROMTEMPLATE );
1549 	if ( aViewSettings.Exists() )
1550 	{
1551 		// read the settings
1552 		Sequence< NamedValue > aSettings = aViewSettings.GetUserData( );
1553 
1554 		aViewSettings.GetUserItem( VIEWSETTING_SELECTEDGROUP ) >>= nSelectedGroup;
1555 		aViewSettings.GetUserItem( VIEWSETTING_SELECTEDVIEW ) >>= nSelectedView;
1556 		aViewSettings.GetUserItem( VIEWSETTING_SPLITRATIO ) >>= nSplitRatio;
1557 		aViewSettings.GetUserItem( VIEWSETTING_LASTFOLDER ) >>= sLastFolder;
1558 	}
1559 	// normalize
1560 	if ( nSelectedGroup < ICON_POS_NEWDOC )		nSelectedGroup = ICON_POS_NEWDOC;
1561 	if ( nSelectedGroup > ICON_POS_SAMPLES )	nSelectedGroup = ICON_POS_SAMPLES;
1562 
1563 	if ( ( TI_DOCTEMPLATE_DOCINFO != nSelectedView ) && ( TI_DOCTEMPLATE_PREVIEW != nSelectedView ) )
1564 		nSelectedView = TI_DOCTEMPLATE_DOCINFO;
1565 
1566 	if ( nSplitRatio < 0.2 ) nSplitRatio = 0.2;
1567 	if ( nSplitRatio > 0.8 ) nSplitRatio = 0.8;
1568 
1569 	// change our view according to the settings
1570 
1571 	// the selected view (details or preview)
1572 	pFrameWin->ToggleView( TI_DOCTEMPLATE_DOCINFO == nSelectedView );
1573 	aFrameWinTB.CheckItem( (sal_uInt16)nSelectedView, sal_True );
1574 
1575 	// the split ratio
1576 	sal_Int32 nSplitFileAndFrameSize = aSplitWin.GetItemSize( FILEWIN_ID ) + aSplitWin.GetItemSize( FRAMEWIN_ID );
1577 	sal_Int32 nSplitFileSize = (sal_Int32)(nSplitFileAndFrameSize * nSplitRatio);
1578 	sal_Int32 nSplitFrameSize = nSplitFileAndFrameSize - nSplitFileSize;
1579 	aSplitWin.SetItemSize( FILEWIN_ID, nSplitFileSize );
1580 	aSplitWin.SetItemSize( FRAMEWIN_ID, nSplitFrameSize );
1581 	Resize();
1582 
1583 	// the selected folder
1584 	pIconWin->SetCursorPos( nSelectedGroup );
1585 
1586 	// open the last folder or the selected group
1587 	if ( sLastFolder.getLength() > 0 )
1588 		pFileWin->OpenFolder( sLastFolder );
1589 	else
1590 		IconClickHdl_Impl( NULL );
1591 }
1592 
1593 // ------------------------------------------------------------------------
1594 
1595 void SvtTemplateWindow::WriteViewSettings()
1596 {
1597 	// collect
1598 	Sequence< NamedValue > aSettings(4);
1599 
1600 	// the selected group
1601 	aSettings[0].Name	=	VIEWSETTING_SELECTEDGROUP;
1602 	pIconWin->SetFocus();
1603 	aSettings[0].Value	<<=	(sal_Int32)pIconWin->GetCursorPos( );
1604 
1605 	// the selected view mode
1606 	aSettings[1].Name	=	VIEWSETTING_SELECTEDVIEW;
1607 	aSettings[1].Value	<<=	sal_Int32( aFrameWinTB.IsItemChecked( TI_DOCTEMPLATE_DOCINFO ) ? TI_DOCTEMPLATE_DOCINFO : TI_DOCTEMPLATE_PREVIEW );
1608 
1609 	// the split ratio
1610 	aSettings[2].Name	=	VIEWSETTING_SPLITRATIO;
1611 	sal_Int32 nSplitFileSize = aSplitWin.GetItemSize( FILEWIN_ID );
1612 	sal_Int32 nSplitFileAndFrameSize = nSplitFileSize + aSplitWin.GetItemSize( FRAMEWIN_ID );
1613 	aSettings[2].Value	<<=	double( 1.0 * nSplitFileSize / nSplitFileAndFrameSize );
1614 
1615 	// last folder
1616 	aSettings[3].Name	=	VIEWSETTING_LASTFOLDER;
1617 	aSettings[3].Value	<<=	::rtl::OUString( pFileWin->GetFolderURL() );
1618 
1619 	// write
1620 	SvtViewOptions aViewSettings( E_DIALOG, VIEWSETTING_NEWFROMTEMPLATE );
1621 	aViewSettings.SetUserData( aSettings );
1622 }
1623 /* -----------------27.11.2002 17:20-----------------
1624  *
1625  * --------------------------------------------------*/
1626 
1627 void SvtTemplateWindow::SelectFolder(sal_Int32 nFolderPosition)
1628 {
1629     pIconWin->SelectFolder(nFolderPosition);
1630 }
1631 // struct SvtTmplDlg_Impl ------------------------------------------------
1632 
1633 struct SvtTmplDlg_Impl
1634 {
1635 	SvtTemplateWindow*	pWin;
1636 	String				aTitle;
1637 	Timer				aUpdateTimer;
1638 	sal_Bool			bSelectNoOpen;
1639 
1640 	uno::Reference< util::XOfficeInstallationDirectories > m_xOfficeInstDirs;
1641 
1642 
1643 	SvtTmplDlg_Impl( Window* pParent ) : pWin( new SvtTemplateWindow( pParent ) ) ,bSelectNoOpen( sal_False ) {}
1644 
1645 	~SvtTmplDlg_Impl() { delete pWin; }
1646 
1647 	uno::Reference< util::XOfficeInstallationDirectories > getOfficeInstDirs();
1648 };
1649 
1650 uno::Reference< util::XOfficeInstallationDirectories > SvtTmplDlg_Impl::getOfficeInstDirs()
1651 {
1652 	if ( !m_xOfficeInstDirs.is() )
1653 	{
1654 		try
1655 		{
1656 			uno::Reference< lang::XMultiServiceFactory > xSMgr = comphelper::getProcessServiceFactory();
1657 
1658 			uno::Reference< beans::XPropertySet > xPropSet( xSMgr, uno::UNO_QUERY );
1659 			if ( xPropSet.is() )
1660 			{
1661 				uno::Reference< uno::XComponentContext > xCtx;
1662 				xPropSet->getPropertyValue(
1663 					rtl::OUString(
1664 						RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) )
1665 				>>= xCtx;
1666 
1667 				if ( xCtx.is() )
1668 				{
1669 					xCtx->getValueByName(
1670 						rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
1671 							"/singletons/com.sun.star.util.theOfficeInstallationDirectories" ) ) )
1672 					>>= m_xOfficeInstDirs;
1673 				}
1674 			}
1675 		}
1676 		catch( uno::Exception& )
1677 		{}
1678 	}
1679 
1680 	return m_xOfficeInstDirs;
1681 }
1682 
1683 // class SvtDocumentTemplateDialog ---------------------------------------
1684 
1685 SvtDocumentTemplateDialog::SvtDocumentTemplateDialog( Window* _pParent, SelectOnly ) :
1686 	ModalDialog( _pParent, SvtResId( DLG_DOCTEMPLATE ) ),
1687 
1688     aMoreTemplatesLink  ( this, SvtResId( FT_DOCTEMPLATE_LINK ) ),
1689     aLine               ( this, SvtResId( FL_DOCTEMPLATE ) ),
1690     aManageBtn          ( this, SvtResId( BTN_DOCTEMPLATE_MANAGE ) ),
1691     aEditBtn            ( this, SvtResId( BTN_DOCTEMPLATE_EDIT ) ),
1692     aOKBtn              ( this, SvtResId( BTN_DOCTEMPLATE_OPEN ) ),
1693     aCancelBtn          ( this, SvtResId( BTN_DOCTEMPLATE_CANCEL ) ),
1694     aHelpBtn            ( this, SvtResId( BTN_DOCTEMPLATE_HELP ) ),
1695     pImpl               ( NULL )
1696 {
1697 	FreeResource();
1698 	InitImpl( );
1699 
1700 	// no editing of templates
1701 	aEditBtn.Hide();
1702 
1703 	pImpl->bSelectNoOpen = sal_True;
1704 }
1705 
1706 // ------------------------------------------------------------------------
1707 
1708 SvtDocumentTemplateDialog::SvtDocumentTemplateDialog( Window* pParent ) :
1709 
1710 	ModalDialog( pParent, SvtResId( DLG_DOCTEMPLATE ) ),
1711 
1712     aMoreTemplatesLink  ( this, SvtResId( FT_DOCTEMPLATE_LINK ) ),
1713     aLine               ( this, SvtResId( FL_DOCTEMPLATE ) ),
1714     aManageBtn          ( this, SvtResId( BTN_DOCTEMPLATE_MANAGE ) ),
1715     aEditBtn            ( this, SvtResId( BTN_DOCTEMPLATE_EDIT ) ),
1716     aOKBtn              ( this, SvtResId( BTN_DOCTEMPLATE_OPEN ) ),
1717     aCancelBtn          ( this, SvtResId( BTN_DOCTEMPLATE_CANCEL ) ),
1718     aHelpBtn            ( this, SvtResId( BTN_DOCTEMPLATE_HELP ) ),
1719     pImpl               ( NULL )
1720 {
1721 	FreeResource();
1722 	InitImpl( );
1723 }
1724 
1725 // ------------------------------------------------------------------------
1726 
1727 void SvtDocumentTemplateDialog::InitImpl( )
1728 {
1729 	pImpl = new SvtTmplDlg_Impl( this );
1730 	pImpl->aTitle = GetText();
1731 
1732 	bool bHideLink = ( SvtExtendedSecurityOptions().GetOpenHyperlinkMode()
1733 					== SvtExtendedSecurityOptions::OPEN_NEVER );
1734 	if ( !bHideLink )
1735      	{
1736     aMoreTemplatesLink.SetURL( String(
1737         RTL_CONSTASCII_STRINGPARAM( "http://templates.services.openoffice.org/?cid=923508" ) ) );
1738     aMoreTemplatesLink.SetClickHdl( LINK( this, SvtDocumentTemplateDialog, OpenLinkHdl_Impl ) );
1739 	}
1740 	else
1741 	   aMoreTemplatesLink.Hide();
1742 
1743     aManageBtn.SetClickHdl( LINK( this, SvtDocumentTemplateDialog, OrganizerHdl_Impl ) );
1744 	Link aLink = LINK( this, SvtDocumentTemplateDialog, OKHdl_Impl );
1745 	aEditBtn.SetClickHdl( aLink );
1746 	aOKBtn.SetClickHdl( aLink );
1747 
1748 	pImpl->pWin->SetSelectHdl( LINK( this, SvtDocumentTemplateDialog, SelectHdl_Impl ) );
1749 	pImpl->pWin->SetDoubleClickHdl( LINK( this, SvtDocumentTemplateDialog, DoubleClickHdl_Impl ) );
1750 	pImpl->pWin->SetNewFolderHdl( LINK( this, SvtDocumentTemplateDialog, NewFolderHdl_Impl ) );
1751 	pImpl->pWin->SetSendFocusHdl( LINK( this, SvtDocumentTemplateDialog, SendFocusHdl_Impl ) );
1752 
1753 	// dynamic height adjustment
1754 	long nHeight = pImpl->pWin->CalcHeight();
1755 
1756 	Size aSize = GetOutputSizePixel();
1757     Point aPos = aMoreTemplatesLink.GetPosPixel();
1758 	Size a6Size = LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
1759     if ( bHideLink )
1760         aPos.Y() += aMoreTemplatesLink.GetSizePixel().Height();
1761     else
1762         aPos.Y() -= a6Size.Height();
1763 	long nDelta = aPos.Y() - nHeight;
1764 	aSize.Height() -= nDelta;
1765 	SetOutputSizePixel( aSize );
1766 
1767 	aSize.Height() = nHeight;
1768     aSize.Width() -= ( a6Size.Width() * 2 );
1769     pImpl->pWin->SetPosSizePixel( Point( a6Size.Width(), 0 ), aSize );
1770 
1771     aPos = aMoreTemplatesLink.GetPosPixel();
1772     aPos.Y() -= nDelta;
1773     aMoreTemplatesLink.SetPosPixel( aPos );
1774     aPos = aLine.GetPosPixel();
1775     aPos.Y() -= nDelta;
1776     aLine.SetPosPixel( aPos );
1777 	aPos = aManageBtn.GetPosPixel();
1778 	aPos.Y() -= nDelta;
1779 	aManageBtn.SetPosPixel( aPos );
1780 	aPos = aEditBtn.GetPosPixel();
1781 	aPos.Y() -= nDelta;
1782 	aEditBtn.SetPosPixel( aPos );
1783 	aPos = aOKBtn.GetPosPixel();
1784 	aPos.Y() -= nDelta;
1785 	aOKBtn.SetPosPixel( aPos );
1786 	aPos = aCancelBtn.GetPosPixel();
1787 	aPos.Y() -= nDelta;
1788 	aCancelBtn.SetPosPixel( aPos );
1789 	aPos = aHelpBtn.GetPosPixel();
1790 	aPos.Y() -= nDelta;
1791 	aHelpBtn.SetPosPixel( aPos );
1792 
1793 	pImpl->pWin->Show();
1794 
1795 	SelectHdl_Impl( NULL );
1796 	NewFolderHdl_Impl( NULL );
1797 
1798 	UpdateHdl_Impl( NULL );
1799 }
1800 
1801 // ------------------------------------------------------------------------
1802 
1803 SvtDocumentTemplateDialog::~SvtDocumentTemplateDialog()
1804 {
1805 	delete pImpl;
1806 }
1807 
1808 // ------------------------------------------------------------------------
1809 
1810 sal_Bool SvtDocumentTemplateDialog::IsFileSelected( ) const
1811 {
1812 	return pImpl->pWin->IsFileSelected();
1813 }
1814 
1815 // ------------------------------------------------------------------------
1816 
1817 String SvtDocumentTemplateDialog::GetSelectedFileURL( ) const
1818 {
1819 	return pImpl->pWin->GetSelectedFile();
1820 }
1821 
1822 // ------------------------------------------------------------------------
1823 
1824 sal_Bool SvtDocumentTemplateDialog::CanEnableEditBtn() const
1825 {
1826 	sal_Bool bEnable = sal_False;
1827 
1828 	::rtl::OUString aFolderURL = pImpl->pWin->GetFolderURL();
1829 	if ( pImpl->pWin->IsFileSelected() && aFolderURL.getLength() )
1830 	{
1831 		::rtl::OUString aFileTargetURL = pImpl->pWin->GetSelectedFile();
1832         bEnable = aFileTargetURL.getLength() > 0;
1833 	}
1834 
1835 	return bEnable;
1836 }
1837 
1838 // ------------------------------------------------------------------------
1839 
1840 IMPL_LINK ( SvtDocumentTemplateDialog , SelectHdl_Impl, SvtTemplateWindow *, EMPTYARG )
1841 {
1842 	aEditBtn.Enable( pImpl->pWin->IsTemplateFolderOpen() && CanEnableEditBtn() );
1843 	aOKBtn.Enable( pImpl->pWin->IsFileSelected() );
1844 	return 0;
1845 }
1846 
1847 // ------------------------------------------------------------------------
1848 
1849 IMPL_LINK ( SvtDocumentTemplateDialog , DoubleClickHdl_Impl, SvtTemplateWindow *, EMPTYARG )
1850 {
1851 	EndDialog( RET_OK );
1852 
1853 	if ( !pImpl->bSelectNoOpen )
1854 		pImpl->pWin->OpenFile( !pImpl->pWin->IsTemplateFolderOpen() );
1855 	return 0;
1856 }
1857 
1858 // ------------------------------------------------------------------------
1859 
1860 IMPL_LINK ( SvtDocumentTemplateDialog , NewFolderHdl_Impl, SvtTemplateWindow *, EMPTYARG )
1861 {
1862 	String aNewTitle( pImpl->aTitle );
1863 	aNewTitle += String( ASCII_STR(" - ") );
1864 	aNewTitle += pImpl->pWin->GetFolderTitle();
1865 	SetText( aNewTitle );
1866 
1867 	SelectHdl_Impl( NULL );
1868 	return 0;
1869 }
1870 
1871 // ------------------------------------------------------------------------
1872 
1873 IMPL_LINK ( SvtDocumentTemplateDialog , SendFocusHdl_Impl, SvtTemplateWindow *, EMPTYARG )
1874 {
1875 	if ( pImpl->pWin->HasIconWinFocus() )
1876 		aHelpBtn.GrabFocus();
1877 	else
1878 	{
1879 		if ( aEditBtn.IsEnabled() )
1880 			aEditBtn.GrabFocus();
1881 		else if ( aOKBtn.IsEnabled() )
1882 			aOKBtn.GrabFocus();
1883 		else
1884 			aCancelBtn.GrabFocus();
1885 	}
1886 
1887 	return 0;
1888 }
1889 
1890 // ------------------------------------------------------------------------
1891 
1892 IMPL_LINK ( SvtDocumentTemplateDialog , OKHdl_Impl, PushButton *, pBtn )
1893 {
1894 	if ( pImpl->pWin->IsFileSelected() )
1895 	{
1896 		EndDialog( RET_OK );
1897 
1898 		if ( !pImpl->bSelectNoOpen )
1899 			pImpl->pWin->OpenFile( &aEditBtn == pBtn );
1900 	}
1901 	return 0;
1902 }
1903 
1904 // ------------------------------------------------------------------------
1905 
1906 IMPL_LINK ( SvtDocumentTemplateDialog , OrganizerHdl_Impl, PushButton *, EMPTYARG )
1907 {
1908 	Window* pOldDefWin = Application::GetDefDialogParent();
1909 	Application::SetDefDialogParent( this );
1910     Reference < XFramesSupplier > xDesktop = Reference < XFramesSupplier >(
1911 		::comphelper::getProcessServiceFactory()->
1912 		createInstance( ASCII_STR("com.sun.star.frame.Desktop") ), UNO_QUERY );
1913     Reference < XFrame > xFrame( xDesktop->getActiveFrame() );
1914     if ( !xFrame.is() )
1915         xFrame = Reference < XFrame >( xDesktop, UNO_QUERY );
1916 
1917     com::sun::star::util::URL aTargetURL;
1918     aTargetURL.Complete = ASCII_STR("slot:5540");
1919     Reference < com::sun::star::util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->
1920 		createInstance( ASCII_STR("com.sun.star.util.URLTransformer") ), UNO_QUERY );
1921     xTrans->parseStrict( aTargetURL );
1922 
1923     Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY );
1924     Reference < XDispatch > xDisp;
1925     xDisp = xProv->queryDispatch( aTargetURL, ::rtl::OUString(), 0 );
1926 
1927 	if ( xDisp.is() )
1928 	{
1929 		Sequence<PropertyValue> aArgs(1);
1930 		PropertyValue* pArg = aArgs.getArray();
1931 		pArg[0].Name = ASCII_STR("Referer");
1932         pArg[0].Value <<= ASCII_STR("private:user");
1933 		xDisp->dispatch( aTargetURL, aArgs );
1934 	}
1935 
1936 	Application::SetDefDialogParent( pOldDefWin );
1937 	return 0;
1938 }
1939 
1940 // ------------------------------------------------------------------------
1941 
1942 IMPL_LINK ( SvtDocumentTemplateDialog, UpdateHdl_Impl, Timer*, _pEventSource )
1943 {
1944 	pImpl->pWin->SetFocus( sal_False );
1945 	Reference< XDocumentTemplates > xTemplates( ::comphelper::getProcessServiceFactory()->
1946 		createInstance( ASCII_STR("com.sun.star.frame.DocumentTemplates") ), UNO_QUERY );
1947 	if ( xTemplates.is() )
1948 	{
1949 		if ( _pEventSource )
1950 		{	// it was no direct call, which means it was triggered by the timer, which means we alread checked the necessity
1951 			WaitObject aWaitCursor( this );
1952 			xTemplates->update();
1953 			if ( pImpl->pWin->IsTemplateFolderOpen() )
1954 			{
1955 				pImpl->pWin->ClearHistory();
1956 				pImpl->pWin->OpenTemplateRoot();
1957 			}
1958 		}
1959 		else
1960 		{
1961 			// check if we really need to do the update
1962 			::svt::TemplateFolderCache aCache;
1963 			if ( aCache.needsUpdate() )
1964 			{	// yes -> do it asynchronous (it will take a noticeable time)
1965 
1966 				// (but first store the current state)
1967 				aCache.storeState();
1968 
1969 				// start the timer for the async update
1970 				pImpl->aUpdateTimer.SetTimeout( 300 );
1971 				pImpl->aUpdateTimer.SetTimeoutHdl( LINK( this, SvtDocumentTemplateDialog, UpdateHdl_Impl ) );
1972 				pImpl->aUpdateTimer.Start();
1973 			}
1974 		}
1975 	}
1976 	return 0;
1977 }
1978 
1979 // ------------------------------------------------------------------------
1980 
1981 IMPL_LINK ( SvtDocumentTemplateDialog, OpenLinkHdl_Impl, svt::FixedHyperlink*, EMPTYARG )
1982 {
1983     ::rtl::OUString sURL( aMoreTemplatesLink.GetURL() );
1984     if ( sURL.getLength() > 0 )
1985     {
1986         try
1987         {
1988             uno::Reference< com::sun::star::system::XSystemShellExecute > xSystemShell(
1989                 com::sun::star::system::SystemShellExecute::create(
1990                     ::comphelper::getProcessComponentContext() ) );
1991             if ( xSystemShell.is() )
1992                 xSystemShell->execute( sURL, ::rtl::OUString(), com::sun::star::system::SystemShellExecuteFlags::DEFAULTS );
1993             EndDialog( RET_CANCEL );
1994         }
1995         catch( const uno::Exception& e )
1996         {
1997              OSL_TRACE( "Caught exception: %s\n thread terminated.\n",
1998                 rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
1999         }
2000     }
2001     return 0;
2002 }
2003 
2004 /* -----------------27.11.2002 16:54-----------------
2005  *
2006  * --------------------------------------------------*/
2007 void SvtDocumentTemplateDialog::SelectTemplateFolder()
2008 {
2009     pImpl->pWin->SelectFolder(ICON_POS_TEMPLATES);
2010 }
2011 
2012