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