xref: /AOO41X/main/svtools/source/contnr/templwin.cxx (revision 96c859818fb8eeeaba8481e542767a5a41a12dec)
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 
FolderHistoryFolderHistory122     FolderHistory( const String& _rURL, sal_Int32 _nGroup ) :
123         m_sURL( _rURL ), m_nGroup( _nGroup ) {}
124 };
125 
DECLARE_LIST(HistoryList_Impl,FolderHistory *)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 // -----------------------------------------------------------------------------
~ODocumentInfoPreview()139 ODocumentInfoPreview::~ODocumentInfoPreview()
140 {
141     delete m_pEditWin;
142     delete m_pInfoTable;
143 }
144 // -----------------------------------------------------------------------------
Resize()145 void ODocumentInfoPreview::Resize()
146 {
147     Size aOutputSize( GetOutputSize() );
148     m_pEditWin->SetPosSizePixel( Point(0,0),aOutputSize);
149 }
150 // -----------------------------------------------------------------------------
Clear()151 void ODocumentInfoPreview::Clear()
152 {
153     m_pEditWin->Clear();
154 }
155 // -----------------------------------------------------------------------------
156 
lcl_insertDateTimeEntry(SvtExtendedMultiLineEdit_Impl * i_pEditWin,const::rtl::OUString & i_rName,const util::DateTime & i_rUDT)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 
fill(const Reference<XDocumentProperties> & i_xDocProps,const String & i_rURL)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 // -----------------------------------------------------------------------------
InsertEntry(const String & rTitle,const String & rValue)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 
UpdateBackgroundColor()296 void SvtDummyHeaderBar_Impl::UpdateBackgroundColor()
297 {
298     SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetWindowColor() ) );
299 }
300 
SvtDummyHeaderBar_Impl(Window * pPar)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 
~SvtDummyHeaderBar_Impl()308 SvtDummyHeaderBar_Impl::~SvtDummyHeaderBar_Impl()
309 {
310 }
311 
DataChanged(const DataChangedEvent & r)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 
SvtIconWindow_Impl(Window * pParent)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 
~SvtIconWindow_Impl()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 
GetEntry(const String & rURL) const419 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 
Resize()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 
GetCursorPosIconURL() const448 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 
GetSelectedIconURL() const458 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 
GetSelectedIconText() const468 String SvtIconWindow_Impl::GetSelectedIconText() const
469 {
470     sal_uLong nPos;
471     return MnemonicGenerator::EraseAllMnemonicChars( aIconCtrl.GetSelectedEntry( nPos )->GetText() );
472 }
473 
GetIconText(const String & rURL) const474 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 
InvalidateIconControl()483 void SvtIconWindow_Impl::InvalidateIconControl()
484 {
485     aIconCtrl.Invalidate();
486 }
487 
GetCursorPos() const488 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 
GetSelectEntryPos() const499 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 
SetCursorPos(sal_uLong nPos)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 
SetFocus()515 void SvtIconWindow_Impl::SetFocus()
516 {
517     aIconCtrl.GrabFocus();
518 }
519 
CalcHeight() const520 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 
IsRootURL(const String & rURL) const535 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 
GetRootPos(const String & rURL) const543 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 
UpdateIcons(sal_Bool _bHiContrast)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  * --------------------------------------------------*/
SelectFolder(sal_Int32 nFolderPosition)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 
SvtFileViewWindow_Impl(SvtTemplateWindow * pParent)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 
~SvtFileViewWindow_Impl()609 SvtFileViewWindow_Impl::~SvtFileViewWindow_Impl()
610 {
611 }
612 
GetMenuEntry_Impl(Sequence<PropertyValue> & aDynamicMenuEntry,::rtl::OUString & rTitle,::rtl::OUString & rURL,::rtl::OUString & rFrame,::rtl::OUString & rImageId)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 }
GetNewDocContents() const634 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 
Resize()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 
GetSelectedFile() const708 String SvtFileViewWindow_Impl::GetSelectedFile() const
709 {
710     return aFileView.GetCurrentURL();
711 }
712 
OpenFolder(const String & rURL)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 
HasPreviousLevel(String & rURL) const742 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 
GetFolderTitle() const751 String SvtFileViewWindow_Impl::GetFolderTitle() const
752 {
753     String aTitle;
754     ::utl::UCBContentHelper::GetTitle( aFolderURL, aTitle );
755     return aTitle;
756 }
757 
SetFocus()758 void SvtFileViewWindow_Impl::SetFocus()
759 {
760     aFileView.SetFocus();
761 }
762 
763 // class SvtDocInfoTable_Impl --------------------------------------------
764 
SvtDocInfoTable_Impl()765 SvtDocInfoTable_Impl::SvtDocInfoTable_Impl() :
766 
767     ResStringArray( SvtResId( STRARY_SVT_DOCINFO ) )
768 
769 {
770 }
771 // -----------------------------------------------------------------------------
772 // class SvtExtendedMultiLineEdit_Impl --------------------------------------------
SvtExtendedMultiLineEdit_Impl(Window * pParent,WinBits _nBits)773 SvtExtendedMultiLineEdit_Impl::SvtExtendedMultiLineEdit_Impl( Window* pParent,WinBits _nBits ) :
774 
775     ExtMultiLineEdit( pParent, _nBits )
776 
777 {
778     SetLeftMargin( 10 );
779 }
780 // -----------------------------------------------------------------------------
InsertEntry(const String & rTitle,const String & rValue)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 
GetString(long nId) const802 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 
SvtFrameWindow_Impl(Window * pParent)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 
~SvtFrameWindow_Impl()838 SvtFrameWindow_Impl::~SvtFrameWindow_Impl()
839 {
840     delete pEditWin;
841     delete pEmptyWin;
842     xFrame->dispose();
843 }
844 
ViewEditWin()845 void SvtFrameWindow_Impl::ViewEditWin()
846 {
847     pEmptyWin->Hide();
848     xWindow->setVisible( sal_False );
849     pTextWin->Hide();
850     pEditWin->Show();
851 }
852 
ViewTextWin()853 void SvtFrameWindow_Impl::ViewTextWin()
854 {
855     pEmptyWin->Hide();
856     pEditWin->Hide();
857     xWindow->setVisible( sal_True );
858     pTextWin->Show();
859 }
860 
ViewEmptyWin()861 void SvtFrameWindow_Impl::ViewEmptyWin()
862 {
863     xWindow->setVisible( sal_False );
864     pTextWin->Hide();
865     pEditWin->Hide();
866     pEmptyWin->Show();
867 }
868 
ViewNonEmptyWin()869 void SvtFrameWindow_Impl::ViewNonEmptyWin()
870 {
871     if( bDocInfo )
872         ViewEditWin();
873     else
874         ViewTextWin();
875 }
876 
IMPL_STATIC_LINK_NOINSTANCE(SvtFrameWindow_Impl,ExecuteHdl_Impl,SvtExecuteInfo *,pExecuteInfo)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 
ShowDocInfo(const String & rURL)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 
Resize()907 void SvtFrameWindow_Impl::Resize()
908 {
909     Size aWinSize = GetOutputSizePixel();
910     pEditWin->SetSizePixel( aWinSize );
911     pTextWin->SetSizePixel( aWinSize );
912     pEmptyWin->SetSizePixel( aWinSize );
913 }
914 
OpenFile(const String & rURL,sal_Bool bPreview,sal_Bool bIsTemplate,sal_Bool bAsTemplate)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 
ToggleView(sal_Bool bDI)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 
SvtTemplateWindow(Window * pParent)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 
~SvtTemplateWindow()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 
IMPL_LINK(SvtTemplateWindow,IconClickHdl_Impl,SvtIconChoiceCtrl *,EMPTYARG)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 
IMPL_LINK(SvtTemplateWindow,FileSelectHdl_Impl,SvtFileView *,EMPTYARG)1129 IMPL_LINK ( SvtTemplateWindow , FileSelectHdl_Impl, SvtFileView *, EMPTYARG )
1130 {
1131     aSelectTimer.Start();
1132     return 0;
1133 }
1134 
1135 // ------------------------------------------------------------------------
1136 
IMPL_LINK(SvtTemplateWindow,FileDblClickHdl_Impl,SvtFileView *,EMPTYARG)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 
IMPL_LINK(SvtTemplateWindow,NewFolderHdl_Impl,SvtFileView *,EMPTYARG)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 
IMPL_LINK(SvtTemplateWindow,TimeoutHdl_Impl,Timer *,EMPTYARG)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 
IMPL_LINK(SvtTemplateWindow,ClickHdl_Impl,ToolBox *,pToolBox)1193 IMPL_LINK ( SvtTemplateWindow , ClickHdl_Impl, ToolBox *, pToolBox )
1194 {
1195     DoAction( pToolBox->GetCurItemId() );
1196     return 0;
1197 }
1198 
1199 // ------------------------------------------------------------------------
1200 
IMPL_LINK(SvtTemplateWindow,ResizeHdl_Impl,SplitWindow *,EMPTYARG)1201 IMPL_LINK ( SvtTemplateWindow , ResizeHdl_Impl, SplitWindow *, EMPTYARG )
1202 {
1203     Resize();
1204     return 0;
1205 }
1206 
1207 // ------------------------------------------------------------------------
1208 
PrintFile(const String & rURL)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 
AppendHistoryURL(const String & rURL,sal_uLong nGroup)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 
OpenHistory()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 
DoAction(sal_uInt16 nAction)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 
InitToolBoxes()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 
InitToolBoxImages()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 
UpdateIcons()1359 void SvtTemplateWindow::UpdateIcons()
1360 {
1361     pIconWin->UpdateIcons( aFileViewTB.GetSettings().GetStyleSettings().GetHighContrastMode() );
1362 }
1363 
1364 // ------------------------------------------------------------------------
1365 
PreNotify(NotifyEvent & rNEvt)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 
DataChanged(const DataChangedEvent & rDCEvt)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 
Resize()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 
GetSelectedFile() const1442 String SvtTemplateWindow::GetSelectedFile() const
1443 {
1444     return pFileWin->GetSelectedFile();
1445 }
1446 
1447 // ------------------------------------------------------------------------
1448 
IsFileSelected() const1449 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 
OpenFile(sal_Bool bNotAsTemplate)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 
GetFolderTitle() const1467 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 
GetFolderURL() const1480 String SvtTemplateWindow::GetFolderURL() const
1481 {
1482     return pFileWin->GetFolderURL();
1483 }
1484 
1485 
1486 // ------------------------------------------------------------------------
1487 
SetFocus(sal_Bool bIconWin)1488 void SvtTemplateWindow::SetFocus( sal_Bool bIconWin )
1489 {
1490     if ( bIconWin )
1491         pIconWin->SetFocus();
1492     else
1493         pFileWin->SetFocus();
1494 }
1495 
1496 // ------------------------------------------------------------------------
1497 
OpenTemplateRoot()1498 void SvtTemplateWindow::OpenTemplateRoot()
1499 {
1500     pFileWin->OpenFolder( pIconWin->GetTemplateRootURL() );
1501 }
1502 
1503 // ------------------------------------------------------------------------
1504 
SetPrevLevelButtonState(const String & rURL)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 
ClearHistory()1519 void SvtTemplateWindow::ClearHistory()
1520 {
1521     if( pHistoryList )
1522         pHistoryList->Clear();
1523 }
1524 
1525 // ------------------------------------------------------------------------
1526 
CalcHeight() const1527 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 
ReadViewSettings()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 
WriteViewSettings()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 
SelectFolder(sal_Int32 nFolderPosition)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 
SvtTmplDlg_ImplSvtTmplDlg_Impl1643     SvtTmplDlg_Impl( Window* pParent ) : pWin( new SvtTemplateWindow( pParent ) ) ,bSelectNoOpen( sal_False ) {}
1644 
~SvtTmplDlg_ImplSvtTmplDlg_Impl1645     ~SvtTmplDlg_Impl() { delete pWin; }
1646 
1647     uno::Reference< util::XOfficeInstallationDirectories > getOfficeInstDirs();
1648 };
1649 
getOfficeInstDirs()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 
SvtDocumentTemplateDialog(Window * _pParent,SelectOnly)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 
SvtDocumentTemplateDialog(Window * pParent)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 
InitImpl()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( "https://templates.openoffice.org" ) ) );
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 
~SvtDocumentTemplateDialog()1803 SvtDocumentTemplateDialog::~SvtDocumentTemplateDialog()
1804 {
1805     delete pImpl;
1806 }
1807 
1808 // ------------------------------------------------------------------------
1809 
IsFileSelected() const1810 sal_Bool SvtDocumentTemplateDialog::IsFileSelected( ) const
1811 {
1812     return pImpl->pWin->IsFileSelected();
1813 }
1814 
1815 // ------------------------------------------------------------------------
1816 
GetSelectedFileURL() const1817 String SvtDocumentTemplateDialog::GetSelectedFileURL( ) const
1818 {
1819     return pImpl->pWin->GetSelectedFile();
1820 }
1821 
1822 // ------------------------------------------------------------------------
1823 
CanEnableEditBtn() const1824 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 
IMPL_LINK(SvtDocumentTemplateDialog,SelectHdl_Impl,SvtTemplateWindow *,EMPTYARG)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 
IMPL_LINK(SvtDocumentTemplateDialog,DoubleClickHdl_Impl,SvtTemplateWindow *,EMPTYARG)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 
IMPL_LINK(SvtDocumentTemplateDialog,NewFolderHdl_Impl,SvtTemplateWindow *,EMPTYARG)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 
IMPL_LINK(SvtDocumentTemplateDialog,SendFocusHdl_Impl,SvtTemplateWindow *,EMPTYARG)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 
IMPL_LINK(SvtDocumentTemplateDialog,OKHdl_Impl,PushButton *,pBtn)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 
IMPL_LINK(SvtDocumentTemplateDialog,OrganizerHdl_Impl,PushButton *,EMPTYARG)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 
IMPL_LINK(SvtDocumentTemplateDialog,UpdateHdl_Impl,Timer *,_pEventSource)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 
IMPL_LINK(SvtDocumentTemplateDialog,OpenLinkHdl_Impl,svt::FixedHyperlink *,EMPTYARG)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  * --------------------------------------------------*/
SelectTemplateFolder()2007 void SvtDocumentTemplateDialog::SelectTemplateFolder()
2008 {
2009     pImpl->pWin->SelectFolder(ICON_POS_TEMPLATES);
2010 }
2011 
2012