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