summaryrefslogtreecommitdiff
path: root/svtools/source/contnr/templwin.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svtools/source/contnr/templwin.cxx')
-rw-r--r--svtools/source/contnr/templwin.cxx2013
1 files changed, 2013 insertions, 0 deletions
diff --git a/svtools/source/contnr/templwin.cxx b/svtools/source/contnr/templwin.cxx
new file mode 100644
index 000000000000..544c36c18951
--- /dev/null
+++ b/svtools/source/contnr/templwin.cxx
@@ -0,0 +1,2013 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_svtools.hxx"
+#include "templwin.hxx"
+#include "templdlg.hxx"
+#include <svtools/svtdata.hxx>
+#include <svtools/langhelp.hxx>
+#include <unotools/pathoptions.hxx>
+#include <unotools/dynamicmenuoptions.hxx>
+#include <unotools/extendedsecurityoptions.hxx>
+#include <svtools/xtextedt.hxx>
+#include <svl/inettype.hxx>
+#include "imagemgr.hxx"
+#include <svtools/miscopt.hxx>
+#include "templatefoldercache.hxx"
+#include "imgdef.hxx"
+#include "txtattr.hxx"
+#include <svtools/svtools.hrc>
+#include "templwin.hrc"
+#include <svtools/helpid.hrc>
+#include <unotools/pathoptions.hxx>
+#include <unotools/viewoptions.hxx>
+#include <unotools/ucbhelper.hxx>
+
+#include "unotools/configmgr.hxx"
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/frame/XFrame.hpp>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <com/sun/star/util/URL.hpp>
+#include <com/sun/star/util/XURLTransformer.hpp>
+#include <com/sun/star/util/XOfficeInstallationDirectories.hpp>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/frame/XDocumentTemplates.hpp>
+#include <com/sun/star/frame/XComponentLoader.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/ucb/XContent.hpp>
+#include <com/sun/star/ucb/XCommandEnvironment.hpp>
+#include <com/sun/star/view/XPrintable.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/document/XDocumentProperties.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XMultiPropertySet.hpp>
+#include <com/sun/star/beans/XPropertySetInfo.hpp>
+#include <com/sun/star/io/IOException.hpp>
+#include <com/sun/star/util/DateTime.hpp>
+#include <com/sun/star/script/XTypeConverter.hpp>
+#include <com/sun/star/system/XSystemShellExecute.hpp>
+#include <com/sun/star/system/SystemShellExecuteFlags.hpp>
+#include <unotools/localedatawrapper.hxx>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <vcl/waitobj.hxx>
+#include <comphelper/processfactory.hxx>
+#include <tools/urlobj.hxx>
+#include <tools/datetime.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/split.hxx>
+#include <vcl/msgbox.hxx>
+#include "DocumentInfoPreview.hxx"
+#include <vcl/mnemonic.hxx>
+
+#include <ucbhelper/content.hxx>
+#include <comphelper/string.hxx>
+
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::document;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::ucb;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::view;
+using namespace svtools;
+
+extern ::rtl::OUString CreateExactSizeText_Impl( sal_Int64 nSize ); // fileview.cxx
+
+#define SPLITSET_ID 0
+#define COLSET_ID 1
+#define ICONWIN_ID 2
+#define FILEWIN_ID 3
+#define FRAMEWIN_ID 4
+
+#define ICON_POS_NEWDOC 0
+#define ICON_POS_TEMPLATES 1
+#define ICON_POS_MYDOCS 2
+#define ICON_POS_SAMPLES 3
+
+#define ASCII_STR(s) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(s) )
+#define VIEWSETTING_NEWFROMTEMPLATE ASCII_STR("NewFromTemplate")
+#define VIEWSETTING_SELECTEDGROUP ASCII_STR("SelectedGroup")
+#define VIEWSETTING_SELECTEDVIEW ASCII_STR("SelectedView")
+#define VIEWSETTING_SPLITRATIO ASCII_STR("SplitRatio")
+#define VIEWSETTING_LASTFOLDER ASCII_STR("LastFolder")
+
+struct FolderHistory
+{
+ String m_sURL;
+ ULONG m_nGroup;
+
+ FolderHistory( const String& _rURL, sal_Int32 _nGroup ) :
+ m_sURL( _rURL ), m_nGroup( _nGroup ) {}
+};
+
+DECLARE_LIST( HistoryList_Impl, FolderHistory* )
+DECLARE_LIST( NewDocList_Impl, ::rtl::OUString* )
+
+ODocumentInfoPreview::ODocumentInfoPreview( Window* pParent ,WinBits _nBits) : Window(pParent,WB_DIALOGCONTROL)
+{
+ m_pEditWin = new SvtExtendedMultiLineEdit_Impl(this,_nBits);
+ m_pEditWin->Show();
+ m_pEditWin->EnableCursor( FALSE );
+ m_pInfoTable = new SvtDocInfoTable_Impl();
+ // detect application language
+ m_aLocale = SvtPathOptions().GetLocale();
+}
+// -----------------------------------------------------------------------------
+ODocumentInfoPreview::~ODocumentInfoPreview()
+{
+ delete m_pEditWin;
+ delete m_pInfoTable;
+}
+// -----------------------------------------------------------------------------
+void ODocumentInfoPreview::Resize()
+{
+ Size aOutputSize( GetOutputSize() );
+ m_pEditWin->SetPosSizePixel( Point(0,0),aOutputSize);
+}
+// -----------------------------------------------------------------------------
+void ODocumentInfoPreview::Clear()
+{
+ m_pEditWin->Clear();
+}
+// -----------------------------------------------------------------------------
+
+void lcl_insertDateTimeEntry(SvtExtendedMultiLineEdit_Impl* i_pEditWin,
+ const ::rtl::OUString & i_rName, const util::DateTime & i_rUDT)
+{
+ DateTime aToolsDT =
+ DateTime( Date( i_rUDT.Day, i_rUDT.Month, i_rUDT.Year ),
+ Time( i_rUDT.Hours, i_rUDT.Minutes,
+ i_rUDT.Seconds, i_rUDT.HundredthSeconds ) );
+ if ( aToolsDT.IsValid() )
+ {
+ LocaleDataWrapper aLocaleWrapper(
+ ::comphelper::getProcessServiceFactory(),
+ Application::GetSettings().GetLocale() );
+ String aDateStr = aLocaleWrapper.getDate( aToolsDT );
+ aDateStr += String( RTL_CONSTASCII_USTRINGPARAM(", ") );
+ aDateStr += aLocaleWrapper.getTime( aToolsDT );
+ i_pEditWin->InsertEntry( i_rName, aDateStr );
+ }
+}
+
+void ODocumentInfoPreview::fill(
+ const Reference< XDocumentProperties >& i_xDocProps, const String& i_rURL)
+{
+ if (!i_xDocProps.is()) throw RuntimeException();
+
+ ::rtl::OUString aStr;
+ m_pEditWin->SetAutoScroll( FALSE );
+
+ aStr = i_xDocProps->getTitle();
+ if (aStr.getLength()) {
+ m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_TITLE ), aStr );
+ }
+
+ aStr = i_xDocProps->getAuthor();
+ if (aStr.getLength()) {
+ m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_FROM ), aStr );
+ }
+
+ lcl_insertDateTimeEntry(m_pEditWin,
+ m_pInfoTable->GetString( DI_DATE ),
+ i_xDocProps->getCreationDate());
+
+ aStr = i_xDocProps->getModifiedBy();
+ if (aStr.getLength()) {
+ m_pEditWin->InsertEntry( m_pInfoTable->GetString(DI_MODIFIEDBY), aStr );
+ }
+
+ lcl_insertDateTimeEntry(m_pEditWin,
+ m_pInfoTable->GetString( DI_MODIFIEDDATE ),
+ i_xDocProps->getModificationDate());
+
+ aStr = i_xDocProps->getPrintedBy();
+ if (aStr.getLength()) {
+ m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_PRINTBY ), aStr );
+ }
+
+ lcl_insertDateTimeEntry(m_pEditWin,
+ m_pInfoTable->GetString( DI_PRINTDATE ),
+ i_xDocProps->getPrintDate());
+
+ aStr = i_xDocProps->getSubject();
+ if (aStr.getLength()) {
+ m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_THEME ), aStr );
+ }
+
+ aStr =
+ ::comphelper::string::convertCommaSeparated(i_xDocProps->getKeywords());
+ if (aStr.getLength()) {
+ m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_KEYWORDS ), aStr );
+ }
+
+ aStr = i_xDocProps->getDescription();
+ if (aStr.getLength()) {
+ m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_DESCRIPTION ),
+ aStr );
+ }
+
+ // size
+ if ( i_rURL.Len() > 0 )
+ {
+ ULONG nDocSize = ::utl::UCBContentHelper::GetSize( i_rURL );
+ m_pEditWin->InsertEntry(
+ m_pInfoTable->GetString( DI_SIZE ),
+ CreateExactSizeText_Impl( nDocSize ) );
+ }
+
+ // MIMEType
+ if ( i_rURL.Len() > 0 )
+ {
+ INetContentType eTypeID =
+ INetContentTypes::GetContentTypeFromURL( i_rURL );
+ if ( eTypeID != CONTENT_TYPE_APP_OCTSTREAM ) {
+ aStr = INetContentTypes::GetPresentation( eTypeID, m_aLocale );
+ } else {
+ aStr = SvFileInformationManager::GetDescription(
+ INetURLObject(i_rURL) );
+ }
+ if (aStr.getLength()) {
+ m_pEditWin->InsertEntry( m_pInfoTable->GetString( DI_MIMETYPE ),
+ aStr );
+ }
+ }
+
+ // user-defined (custom) properties
+ Reference< XPropertySet > xUserDefined(
+ i_xDocProps->getUserDefinedProperties(), UNO_QUERY_THROW );
+ Reference< XPropertySetInfo > xUDInfo = xUserDefined->getPropertySetInfo();
+ Sequence< Property > props = xUDInfo->getProperties();
+ for (sal_Int32 i = 0; i < props.getLength(); ++i) {
+ const ::rtl::OUString name = props[i].Name;
+ uno::Any aAny;
+ try {
+ aAny = xUserDefined->getPropertyValue(name);
+ uno::Reference < script::XTypeConverter > xConverter(
+ comphelper::getProcessServiceFactory()->createInstance(
+ ASCII_STR("com.sun.star.script.Converter")),
+ UNO_QUERY );
+ uno::Any aNew;
+ aNew = xConverter->convertToSimpleType( aAny, TypeClass_STRING );
+ if ((aNew >>= aStr) && aStr.getLength()) {
+ m_pEditWin->InsertEntry( name, aStr);
+ }
+ } catch (uno::Exception &) {
+ // ignore
+ }
+ }
+
+ m_pEditWin->SetSelection( Selection( 0, 0 ) );
+ m_pEditWin->SetAutoScroll( TRUE );
+}
+
+// -----------------------------------------------------------------------------
+void ODocumentInfoPreview::InsertEntry( const String& rTitle, const String& rValue )
+{
+ m_pEditWin->InsertEntry( rTitle, rValue);
+}
+// -----------------------------------------------------------------------------
+
+// class SvtDummyHeaderBar_Impl ------------------------------------------
+
+void SvtDummyHeaderBar_Impl::UpdateBackgroundColor()
+{
+ SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetWindowColor() ) );
+}
+
+SvtDummyHeaderBar_Impl::SvtDummyHeaderBar_Impl( Window* pPar ) : Window( pPar )
+{
+ SetSizePixel( HeaderBar( this, 0 ).CalcWindowSizePixel() ); // HeaderBar used only to calculate size
+
+ UpdateBackgroundColor();
+}
+
+SvtDummyHeaderBar_Impl::~SvtDummyHeaderBar_Impl()
+{
+}
+
+void SvtDummyHeaderBar_Impl::DataChanged( const DataChangedEvent& r )
+{
+ Window::DataChanged( r );
+ if( r.GetType() == DATACHANGED_SETTINGS )
+ UpdateBackgroundColor();
+}
+
+// class SvtIconWindow_Impl ----------------------------------------------
+
+SvtIconWindow_Impl::SvtIconWindow_Impl( Window* pParent ) :
+
+ Window( pParent, WB_DIALOGCONTROL | WB_BORDER | WB_3DLOOK ),
+
+ aDummyHeaderBar( this ),
+ aIconCtrl( this, WB_ICON | WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME | /*!WB_NOSELECTION |*/
+ WB_NODRAGSELECTION | WB_TABSTOP | WB_CLIPCHILDREN ),
+ aNewDocumentRootURL( ASCII_STR("private:newdoc") ),
+ aMyDocumentsRootURL( SvtPathOptions().GetWorkPath() ),
+ aSamplesFolderRootURL( SvtPathOptions().
+ SubstituteVariable( String( ASCII_STR("$(insturl)/share/samples/$(vlang)") ) ) ),
+ nMaxTextLength( 0 )
+
+{
+ aDummyHeaderBar.Show();
+
+ aIconCtrl.SetAccessibleName( String( RTL_CONSTASCII_USTRINGPARAM("Groups") ) );
+ aIconCtrl.SetHelpId( HID_TEMPLATEDLG_ICONCTRL );
+ aIconCtrl.SetChoiceWithCursor( TRUE );
+ aIconCtrl.SetSelectionMode( SINGLE_SELECTION );
+ aIconCtrl.Show();
+
+ // detect the root URL of templates
+ Reference< XDocumentTemplates > xTemplates( ::comphelper::getProcessServiceFactory()->
+ createInstance( ASCII_STR("com.sun.star.frame.DocumentTemplates") ), UNO_QUERY );
+
+ if ( xTemplates.is() )
+ {
+ Reference < XContent > aRootContent = xTemplates->getContent();
+ Reference < XCommandEnvironment > aCmdEnv;
+
+ if ( aRootContent.is() )
+ aTemplateRootURL = aRootContent->getIdentifier()->getContentIdentifier();
+ }
+
+ // insert the categories
+ // "New Document"
+ Image aImage( SvtResId( IMG_SVT_NEWDOC ) );
+ nMaxTextLength = aImage.GetSizePixel().Width();
+ String aEntryStr = String( SvtResId( STR_SVT_NEWDOC ) );
+ SvxIconChoiceCtrlEntry* pEntry =
+ aIconCtrl.InsertEntry( aEntryStr, aImage, ICON_POS_NEWDOC );
+ pEntry->SetUserData( new String( aNewDocumentRootURL ) );
+ pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_NEWDOC_HELP ) ) );
+ DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" );
+ long nTemp = pEntry->GetBoundRect().GetSize().Width();
+ if (nTemp > nMaxTextLength)
+ nMaxTextLength = nTemp;
+
+ // "Templates"
+ if( aTemplateRootURL.Len() > 0 )
+ {
+ aEntryStr = String( SvtResId( STR_SVT_TEMPLATES ) );
+ pEntry = aIconCtrl.InsertEntry(
+ aEntryStr, Image( SvtResId( IMG_SVT_TEMPLATES ) ), ICON_POS_TEMPLATES );
+ pEntry->SetUserData( new String( aTemplateRootURL ) );
+ pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_TEMPLATES_HELP ) ) );
+ DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" );
+ nTemp = pEntry->GetBoundRect().GetSize().Width();
+ if (nTemp > nMaxTextLength)
+ nMaxTextLength = nTemp;
+ }
+
+ // "My Documents"
+ aEntryStr = String( SvtResId( STR_SVT_MYDOCS ) );
+ pEntry = aIconCtrl.InsertEntry(
+ aEntryStr, Image( SvtResId( IMG_SVT_MYDOCS ) ), ICON_POS_MYDOCS );
+ pEntry->SetUserData( new String( aMyDocumentsRootURL ) );
+ pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_MYDOCS_HELP ) ) );
+ DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" );
+ nTemp = pEntry->GetBoundRect().GetSize().Width();
+ if( nTemp > nMaxTextLength )
+ nMaxTextLength = nTemp;
+
+ // "Samples"
+ aEntryStr = String( SvtResId( STR_SVT_SAMPLES ) );
+ pEntry = aIconCtrl.InsertEntry(
+ aEntryStr, Image( SvtResId( IMG_SVT_SAMPLES ) ), ICON_POS_SAMPLES );
+ pEntry->SetUserData( new String( aSamplesFolderRootURL ) );
+ pEntry->SetQuickHelpText( String( SvtResId( STR_SVT_SAMPLES_HELP ) ) );
+ DBG_ASSERT( !pEntry->GetBoundRect().IsEmpty(), "empty rectangle" );
+ nTemp = pEntry->GetBoundRect().GetSize().Width();
+ if (nTemp > nMaxTextLength)
+ nMaxTextLength = nTemp;
+
+ aIconCtrl.CreateAutoMnemonics();
+}
+
+SvtIconWindow_Impl::~SvtIconWindow_Impl()
+{
+ for ( ULONG i = 0; i < aIconCtrl.GetEntryCount(); ++i )
+ {
+ SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetEntry( i );
+ delete (String*)pEntry->GetUserData();
+ }
+}
+
+SvxIconChoiceCtrlEntry* SvtIconWindow_Impl::GetEntry( const String& rURL ) const
+{
+ SvxIconChoiceCtrlEntry* pEntry = NULL;
+ for ( ULONG i = 0; i < aIconCtrl.GetEntryCount(); ++i )
+ {
+ SvxIconChoiceCtrlEntry* pTemp = aIconCtrl.GetEntry( i );
+ String aURL( *( (String*)pTemp->GetUserData() ) );
+ if ( aURL == rURL )
+ {
+ pEntry = pTemp;
+ break;
+ }
+ }
+
+ return pEntry;
+}
+
+void SvtIconWindow_Impl::Resize()
+{
+ Size aWinSize = GetOutputSizePixel();
+ Size aHeaderSize = aDummyHeaderBar.GetSizePixel();
+ aHeaderSize.Width() = aWinSize.Width();
+ aDummyHeaderBar.SetSizePixel( aHeaderSize );
+ long nHeaderHeight = aHeaderSize.Height();
+ aWinSize.Height() -= nHeaderHeight;
+ aIconCtrl.SetPosSizePixel( Point( 0, nHeaderHeight ), aWinSize );
+ aIconCtrl.ArrangeIcons();
+}
+
+String SvtIconWindow_Impl::GetCursorPosIconURL() const
+{
+ String aURL;
+ SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetCursor( );
+ if ( pEntry )
+ aURL = *static_cast<String*>(pEntry->GetUserData());
+ return aURL;
+
+}
+
+String SvtIconWindow_Impl::GetSelectedIconURL() const
+{
+ ULONG nPos;
+ SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetSelectedEntry( nPos );
+ String aURL;
+ if ( pEntry )
+ aURL = *static_cast<String*>(pEntry->GetUserData());
+ return aURL;
+}
+
+String SvtIconWindow_Impl::GetSelectedIconText() const
+{
+ ULONG nPos;
+ return MnemonicGenerator::EraseAllMnemonicChars( aIconCtrl.GetSelectedEntry( nPos )->GetText() );
+}
+
+String SvtIconWindow_Impl::GetIconText( const String& rURL ) const
+{
+ String aText;
+ SvxIconChoiceCtrlEntry* pEntry = GetEntry( rURL );
+ if ( pEntry )
+ aText = MnemonicGenerator::EraseAllMnemonicChars( pEntry->GetText() );
+ return aText;
+}
+
+void SvtIconWindow_Impl::InvalidateIconControl()
+{
+ aIconCtrl.Invalidate();
+}
+
+ULONG SvtIconWindow_Impl::GetCursorPos() const
+{
+ ULONG nPos = ~ULONG(0);
+
+ SvxIconChoiceCtrlEntry* pCursorEntry = aIconCtrl.GetCursor( );
+ if ( pCursorEntry )
+ nPos = aIconCtrl.GetEntryListPos( pCursorEntry );
+
+ return nPos;
+}
+
+ULONG SvtIconWindow_Impl::GetSelectEntryPos() const
+{
+ ULONG nPos;
+ if ( !aIconCtrl.GetSelectedEntry( nPos ) )
+ nPos = ~ULONG(0);
+ return nPos;
+}
+
+void SvtIconWindow_Impl::SetCursorPos( ULONG nPos )
+{
+ SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetEntry( nPos );
+ aIconCtrl.SetCursor( pEntry );
+ aIconCtrl.Invalidate();
+ aIconCtrl.Update();
+}
+
+void SvtIconWindow_Impl::SetFocus()
+{
+ aIconCtrl.GrabFocus();
+}
+
+long SvtIconWindow_Impl::CalcHeight() const
+{
+ // calculate the required height of the IconControl
+ long nHeight = 0;
+ ULONG nCount = aIconCtrl.GetEntryCount();
+ if ( nCount > 0 )
+ // bottom of the last icon
+ nHeight = aIconCtrl.GetEntry(nCount-1)->GetBoundRect().Bottom();
+
+ // + headerbar height
+ nHeight += aDummyHeaderBar.GetSizePixel().Height();
+
+ return nHeight;
+}
+
+sal_Bool SvtIconWindow_Impl::IsRootURL( const String& rURL ) const
+{
+ return rURL == aNewDocumentRootURL ||
+ rURL == aTemplateRootURL ||
+ rURL == aMyDocumentsRootURL ||
+ rURL == aSamplesFolderRootURL;
+}
+
+ULONG SvtIconWindow_Impl::GetRootPos( const String& rURL ) const
+{
+ ULONG nPos = ~ULONG(0);
+ if ( aNewDocumentRootURL.Match( rURL ) == STRING_MATCH )
+ nPos = 0;
+ else if ( aTemplateRootURL.Match( rURL ) == STRING_MATCH )
+ nPos = 1;
+ else if ( aMyDocumentsRootURL.Match( rURL ) == STRING_MATCH )
+ nPos = 2;
+ else if ( aSamplesFolderRootURL.Match( rURL ) == STRING_MATCH )
+ nPos = 3;
+ else if ( rURL.Match( aMyDocumentsRootURL ) == STRING_MATCH )
+ nPos = 2;
+ else
+ {
+ DBG_WARNING( "SvtIconWindow_Impl::GetRootPos(): invalid position" );
+ nPos = 2;
+ }
+
+ return nPos;
+}
+
+void SvtIconWindow_Impl::UpdateIcons()
+{
+ aIconCtrl.GetEntry( ICON_POS_NEWDOC )->SetImage(
+ Image( SvtResId( IMG_SVT_NEWDOC ) ) );
+ aIconCtrl.GetEntry( ICON_POS_TEMPLATES )->SetImage(
+ Image( SvtResId( IMG_SVT_TEMPLATES ) ) );
+ aIconCtrl.GetEntry( ICON_POS_MYDOCS )->SetImage(
+ Image( SvtResId( IMG_SVT_MYDOCS ) ) );
+ aIconCtrl.GetEntry( ICON_POS_SAMPLES )->SetImage(
+ Image( SvtResId( IMG_SVT_SAMPLES ) ) );
+}
+
+void SvtIconWindow_Impl::SelectFolder(sal_Int32 nFolderPosition)
+{
+ SvxIconChoiceCtrlEntry* pEntry = aIconCtrl.GetEntry( nFolderPosition );
+ if(pEntry)
+ {
+ aIconCtrl.SetCursor( pEntry );
+ aIconCtrl.GetClickHdl().Call(&aIconCtrl);
+ }
+}
+
+// class SvtFileViewWindow_Impl -----------------------------------------_
+
+SvtFileViewWindow_Impl::SvtFileViewWindow_Impl( SvtTemplateWindow* pParent ) :
+
+ Window( pParent, WB_DIALOGCONTROL | WB_TABSTOP | WB_BORDER | WB_3DLOOK ),
+
+ rParent ( *pParent ),
+ aFileView ( this, SvtResId( CTRL_FILEVIEW ), FILEVIEW_SHOW_TITLE ),
+ bIsTemplateFolder ( sal_False )
+
+{
+ aFileView.SetStyle( aFileView.GetStyle() | WB_DIALOGCONTROL | WB_TABSTOP );
+ aFileView.SetHelpId( HID_TEMPLATEDLG_FILEVIEW );
+ aFileView.Show();
+ aFileView.SetPosPixel( Point( 0, 0 ) );
+ aFileView.EnableAutoResize();
+ aFileView.EnableContextMenu( sal_False );
+ aFileView.EnableDelete( sal_False );
+}
+
+SvtFileViewWindow_Impl::~SvtFileViewWindow_Impl()
+{
+}
+
+void GetMenuEntry_Impl
+(
+ Sequence< PropertyValue >& aDynamicMenuEntry,
+ ::rtl::OUString& rTitle,
+ ::rtl::OUString& rURL,
+ ::rtl::OUString& rFrame,
+ ::rtl::OUString& rImageId
+)
+{
+ for ( int i = 0; i < aDynamicMenuEntry.getLength(); i++ )
+ {
+ if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_URL )
+ aDynamicMenuEntry[i].Value >>= rURL;
+ else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_TITLE )
+ aDynamicMenuEntry[i].Value >>= rTitle;
+ else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_IMAGEIDENTIFIER )
+ aDynamicMenuEntry[i].Value >>= rImageId;
+ else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_TARGETNAME )
+ aDynamicMenuEntry[i].Value >>= rFrame;
+ }
+}
+Sequence< ::rtl::OUString > SvtFileViewWindow_Impl::GetNewDocContents() const
+{
+ NewDocList_Impl aNewDocs;
+ Sequence< Sequence< PropertyValue > > aDynamicMenuEntries;
+ aDynamicMenuEntries = SvtDynamicMenuOptions().GetMenu( E_NEWMENU );
+
+ ::rtl::OUString aTitle;
+ ::rtl::OUString aURL;
+ ::rtl::OUString aImageURL;
+ ::rtl::OUString aTargetFrame;
+
+ UINT32 i, nCount = aDynamicMenuEntries.getLength();
+ ::rtl::OUString sSeparator( ASCII_STR("private:separator") );
+ ::rtl::OUString sSlotURL( ASCII_STR("slot:5500") );
+
+ for ( i = 0; i < nCount; ++i )
+ {
+ GetMenuEntry_Impl( aDynamicMenuEntries[i], aTitle, aURL, aTargetFrame, aImageURL );
+
+ if ( aURL == sSeparator || aURL == sSlotURL )
+ continue;
+ else
+ {
+ // title
+ String aRow = MnemonicGenerator::EraseAllMnemonicChars( String( aTitle ) );
+ aRow += '\t';
+ // no type
+ aRow += '\t';
+ // no size
+ aRow += '\t';
+ // no date
+ aRow += '\t';
+ // url
+ aRow += String( aURL );
+ aRow += '\t';
+ // folder == false
+ aRow += '0';
+ // image url?
+ if ( aImageURL.getLength() > 0 )
+ {
+ aRow += '\t';
+ aRow += String( aImageURL );
+ }
+
+ ::rtl::OUString* pRow = new ::rtl::OUString( aRow );
+ aNewDocs.Insert( pRow, LIST_APPEND );
+ }
+ }
+
+ nCount = aNewDocs.Count();
+ Sequence < ::rtl::OUString > aRet( nCount );
+ ::rtl::OUString* pRet = aRet.getArray();
+ for ( i = 0; i < nCount; ++i )
+ {
+ ::rtl::OUString* pNewDoc = aNewDocs.GetObject(i);
+ pRet[i] = *( pNewDoc );
+ delete pNewDoc;
+ }
+
+ return aRet;
+}
+
+void SvtFileViewWindow_Impl::Resize()
+{
+ Size aWinSize = GetOutputSizePixel();
+
+ static int x = 0;
+ static int y = 0;
+
+ aWinSize.nA += x;
+ aWinSize.nB += y;
+ aFileView.SetSizePixel( aWinSize );
+}
+
+String SvtFileViewWindow_Impl::GetSelectedFile() const
+{
+ return aFileView.GetCurrentURL();
+}
+
+void SvtFileViewWindow_Impl::OpenFolder( const String& rURL )
+{
+ aFolderURL = rURL;
+
+ rParent.SetPrevLevelButtonState( rURL );
+
+ aFileView.SetUrlFilter( &aURLFilter );
+
+ INetProtocol eProt = INetURLObject( rURL ).GetProtocol();
+ bIsTemplateFolder = ( eProt == INET_PROT_VND_SUN_STAR_HIER );
+ bool isNewDocumentFolder = ( eProt == INET_PROT_PRIVATE );
+
+ aURLFilter.enableFilter( !bIsTemplateFolder && !isNewDocumentFolder );
+
+ if ( isNewDocumentFolder )
+ {
+ aFileView.EnableNameReplacing( sal_False );
+ aFileView.Initialize( GetNewDocContents() );
+ }
+ else
+ {
+ xub_StrLen nSampFoldLen = aSamplesFolderURL.Len();
+ aFileView.EnableNameReplacing(
+ nSampFoldLen && rURL.CompareTo( aSamplesFolderURL, nSampFoldLen ) == COMPARE_EQUAL );
+ aFileView.Initialize( rURL, String(), NULL );
+ }
+ aNewFolderLink.Call( this );
+}
+
+sal_Bool SvtFileViewWindow_Impl::HasPreviousLevel( String& rURL ) const
+{
+ INetURLObject aViewObj( aFileView.GetViewURL() );
+ INetURLObject aRootObj( aCurrentRootURL );
+ INetURLObject aMyDocObj( aMyDocumentsURL );
+
+ return ( ( aViewObj != aRootObj || aRootObj == aMyDocObj ) && aFileView.GetParentURL( rURL ) );
+}
+
+String SvtFileViewWindow_Impl::GetFolderTitle() const
+{
+ String aTitle;
+ ::utl::UCBContentHelper::GetTitle( aFolderURL, aTitle );
+ return aTitle;
+}
+
+void SvtFileViewWindow_Impl::SetFocus()
+{
+ aFileView.SetFocus();
+}
+
+// class SvtDocInfoTable_Impl --------------------------------------------
+
+SvtDocInfoTable_Impl::SvtDocInfoTable_Impl() :
+
+ ResStringArray( SvtResId( STRARY_SVT_DOCINFO ) )
+
+{
+}
+// -----------------------------------------------------------------------------
+// class SvtExtendedMultiLineEdit_Impl --------------------------------------------
+SvtExtendedMultiLineEdit_Impl::SvtExtendedMultiLineEdit_Impl( Window* pParent,WinBits _nBits ) :
+
+ ExtMultiLineEdit( pParent, _nBits )
+
+{
+ SetLeftMargin( 10 );
+}
+// -----------------------------------------------------------------------------
+void SvtExtendedMultiLineEdit_Impl::InsertEntry( const String& rTitle, const String& rValue )
+{
+ String aText( '\n' );
+ aText += rTitle;
+ aText += ':';
+ InsertText( aText );
+ ULONG nPara = GetParagraphCount() - 1;
+ SetAttrib( TextAttribFontWeight( WEIGHT_BOLD ), nPara, 0, aText.Len() );
+
+ aText = '\n';
+ aText += rValue;
+ InsertText( aText );
+ nPara = GetParagraphCount() - 1;
+ SetAttrib( TextAttribFontWeight( WEIGHT_NORMAL ), nPara, 0, aText.Len() );
+
+ InsertText( String( '\n' ) );
+}
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------
+
+const String& SvtDocInfoTable_Impl::GetString( long nId ) const
+{
+ sal_uInt32 nPos( FindIndex( nId ) );
+
+ if ( RESARRAY_INDEX_NOTFOUND != nPos )
+ return ResStringArray::GetString( nPos );
+ else
+ return aEmptyString;
+}
+
+// class SvtFrameWindow_Impl ---------------------------------------------
+
+SvtFrameWindow_Impl::SvtFrameWindow_Impl( Window* pParent ) :
+
+ Window( pParent )
+
+{
+ // detect application language
+ aLocale= SvtPathOptions().GetLocale();
+
+ // create windows and frame
+ pEditWin = new ODocumentInfoPreview( this ,WB_LEFT | WB_VSCROLL | WB_READONLY | WB_BORDER | WB_3DLOOK);
+ pTextWin = new Window( this );
+ xFrame = Reference < XFrame > ( ::comphelper::getProcessServiceFactory()->
+ createInstance( ASCII_STR("com.sun.star.frame.Frame") ), UNO_QUERY );
+ xWindow = VCLUnoHelper::GetInterface( pTextWin );
+ xFrame->initialize( xWindow );
+
+ // create docinfo instance
+ m_xDocProps.set( ::comphelper::getProcessServiceFactory()->createInstance(
+ ASCII_STR("com.sun.star.document.DocumentProperties") ),
+ UNO_QUERY );
+
+ pEmptyWin = new Window( this, WB_BORDER | WB_3DLOOK );
+}
+
+SvtFrameWindow_Impl::~SvtFrameWindow_Impl()
+{
+ delete pEditWin;
+ delete pEmptyWin;
+ xFrame->dispose();
+}
+
+void SvtFrameWindow_Impl::ViewEditWin()
+{
+ pEmptyWin->Hide();
+ xWindow->setVisible( sal_False );
+ pTextWin->Hide();
+ pEditWin->Show();
+}
+
+void SvtFrameWindow_Impl::ViewTextWin()
+{
+ pEmptyWin->Hide();
+ pEditWin->Hide();
+ xWindow->setVisible( sal_True );
+ pTextWin->Show();
+}
+
+void SvtFrameWindow_Impl::ViewEmptyWin()
+{
+ xWindow->setVisible( sal_False );
+ pTextWin->Hide();
+ pEditWin->Hide();
+ pEmptyWin->Show();
+}
+
+void SvtFrameWindow_Impl::ViewNonEmptyWin()
+{
+ if( bDocInfo )
+ ViewEditWin();
+ else
+ ViewTextWin();
+}
+
+IMPL_STATIC_LINK_NOINSTANCE( SvtFrameWindow_Impl, ExecuteHdl_Impl, SvtExecuteInfo*, pExecuteInfo )
+{
+ try
+ {
+ pExecuteInfo->xDispatch->dispatch( pExecuteInfo->aTargetURL, Sequence < PropertyValue >() );
+ }
+ catch ( Exception& )
+ {
+ }
+
+ delete pExecuteInfo;
+ return 0;
+}
+
+void SvtFrameWindow_Impl::ShowDocInfo( const String& rURL )
+{
+ try
+ {
+ uno::Reference < task::XInteractionHandler > xInteractionHandler( ::comphelper::getProcessServiceFactory()->createInstance(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.task.InteractionHandler" )) ), uno::UNO_QUERY );
+ uno::Sequence < beans::PropertyValue> aProps(1);
+ aProps[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "InteractionHandler" ));
+ aProps[0].Value <<= xInteractionHandler;
+ m_xDocProps->loadFromMedium( rURL, aProps );
+ pEditWin->fill( m_xDocProps, rURL );
+ }
+ catch ( UnknownPropertyException& ) {}
+ catch ( Exception& ) {}
+}
+
+void SvtFrameWindow_Impl::Resize()
+{
+ Size aWinSize = GetOutputSizePixel();
+ pEditWin->SetSizePixel( aWinSize );
+ pTextWin->SetSizePixel( aWinSize );
+ pEmptyWin->SetSizePixel( aWinSize );
+}
+
+void SvtFrameWindow_Impl::OpenFile( const String& rURL, sal_Bool bPreview, sal_Bool bIsTemplate, sal_Bool bAsTemplate )
+{
+ if ( bPreview )
+ aCurrentURL = rURL;
+
+ ViewNonEmptyWin();
+ pEditWin->Clear();
+
+ if ( rURL.Len() > 0 && bPreview && m_xDocProps.is() )
+ ShowDocInfo( rURL );
+
+ if ( rURL.Len() == 0 )
+ {
+ xFrame->setComponent( Reference < com::sun::star::awt::XWindow >(), Reference < XController >() );
+ ViewEmptyWin();
+ }
+ else if ( !::utl::UCBContentHelper::IsFolder( rURL ) )
+ {
+ com::sun::star::util::URL aURL;
+ aURL.Complete = rURL;
+ Reference < com::sun::star::util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->
+ createInstance( ASCII_STR("com.sun.star.util.URLTransformer" ) ), UNO_QUERY );
+ xTrans->parseStrict( aURL );
+
+ String aTarget;
+ Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY );
+ if ( bPreview )
+ aTarget = ASCII_STR("_self");
+ else
+ {
+ // can be removed if the database application change its URL
+ String sServiceScheme( RTL_CONSTASCII_USTRINGPARAM( "service:" ) );
+ if ( rURL.Match( sServiceScheme ) != sServiceScheme.Len() )
+ // service URL has no default target
+ aTarget = ASCII_STR("_default");
+ xProv = Reference < XDispatchProvider >( ::comphelper::getProcessServiceFactory()->
+ createInstance( ASCII_STR("com.sun.star.frame.Desktop") ), UNO_QUERY );
+ }
+
+ Reference < XDispatch > xDisp = xProv.is() ?
+ xProv->queryDispatch( aURL, aTarget, 0 ) : Reference < XDispatch >();
+
+ if ( xDisp.is() )
+ {
+ if ( bPreview )
+ {
+ if ( m_aOpenURL != aURL.Complete )
+ {
+ WaitObject aWaitCursor( GetParent() );
+ // disabling must be done here, does not work in ctor because
+ // execute of the dialog will overwrite it
+ // ( own execute method would help )
+ pTextWin->EnableInput( FALSE, TRUE );
+ if ( pTextWin->IsReallyVisible() )
+ {
+ sal_Bool b = sal_True;
+ Sequence < PropertyValue > aArgs( 4 );
+ aArgs[0].Name = ASCII_STR("Preview");
+ aArgs[0].Value.setValue( &b, ::getBooleanCppuType() );
+ aArgs[1].Name = ASCII_STR("ReadOnly");
+ aArgs[1].Value.setValue( &b, ::getBooleanCppuType() );
+ aArgs[2].Name = ASCII_STR("AsTemplate"); // prevents getting an empty URL with getURL()!
+
+ uno::Reference < task::XInteractionHandler > xInteractionHandler( ::comphelper::getProcessServiceFactory()->createInstance(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.task.InteractionHandler" )) ), uno::UNO_QUERY );
+ aArgs[3].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "InteractionHandler" ));
+ aArgs[3].Value <<= xInteractionHandler;
+
+ b = sal_False;
+ aArgs[2].Value.setValue( &b, ::getBooleanCppuType() );
+ xDisp->dispatch( aURL, aArgs );
+
+ ::rtl::OUString aDispURL;
+ Reference< ::com::sun::star::frame::XController > xCtrl = xFrame->getController();
+ if( xCtrl.is() )
+ {
+ Reference< ::com::sun::star::frame::XModel > xMdl = xCtrl->getModel();
+ if( xMdl.is() )
+ aDispURL = xMdl->getURL();
+ }
+
+ if( aDispURL != aURL.Complete )
+ {
+ xFrame->setComponent( Reference < com::sun::star::awt::XWindow >(), Reference < XController >() );
+ ViewEmptyWin();
+ m_aOpenURL = rtl::OUString();
+ }
+ else
+ m_aOpenURL = aDispURL;
+ }
+ }
+ }
+ else if ( bIsTemplate )
+ {
+ Sequence < PropertyValue > aArgs( 1 );
+ aArgs[0].Name = ASCII_STR("AsTemplate");
+ aArgs[0].Value <<= bAsTemplate;
+ xDisp->dispatch( aURL, aArgs );
+ m_aOpenURL = rtl::OUString();
+ }
+ else
+ {
+ /*
+ SvtExecuteInfo* pExecuteInfo = new SvtExecuteInfo;
+ pExecuteInfo->xDispatch = xDisp;
+ pExecuteInfo->aTargetURL = aURL;
+ Application::PostUserEvent(
+ STATIC_LINK(0, SvtFrameWindow_Impl, ExecuteHdl_Impl), pExecuteInfo );
+ */
+ Sequence < PropertyValue > aArgs;
+ xDisp->dispatch( aURL, aArgs );
+ m_aOpenURL = rtl::OUString();
+ }
+ }
+ }
+}
+
+void SvtFrameWindow_Impl::ToggleView( sal_Bool bDI )
+{
+ bDocInfo = bDI;
+
+ // view is set properly in OpenFile()
+
+ OpenFile( aCurrentURL, sal_True, sal_False, sal_False );
+}
+
+// class SvtTemplateWindow -----------------------------------------------
+
+SvtTemplateWindow::SvtTemplateWindow( Window* pParent ) :
+
+ Window( pParent, WB_DIALOGCONTROL ),
+
+ aFileViewTB ( this, SvtResId( TB_SVT_FILEVIEW ) ),
+ aFrameWinTB ( this, SvtResId( TB_SVT_FRAMEWIN ) ),
+ aSplitWin ( this, WB_DIALOGCONTROL | WB_NOSPLITDRAW ),
+ pHistoryList ( NULL )
+
+{
+ // create windows
+ pIconWin = new SvtIconWindow_Impl( this );
+ pFileWin = new SvtFileViewWindow_Impl( this );
+ pFileWin->SetMyDocumentsURL( pIconWin->GetMyDocumentsRootURL() );
+ pFileWin->SetSamplesFolderURL( pIconWin->GetSamplesFolderURL() );
+ pFrameWin = new SvtFrameWindow_Impl( this );
+
+ // set handlers
+ pIconWin->SetClickHdl( LINK( this, SvtTemplateWindow, IconClickHdl_Impl ) );
+ pFileWin->SetSelectHdl( LINK( this, SvtTemplateWindow, FileSelectHdl_Impl ) );
+ pFileWin->SetDoubleClickHdl( LINK( this, SvtTemplateWindow, FileDblClickHdl_Impl ) );
+ pFileWin->SetNewFolderHdl( LINK( this, SvtTemplateWindow, NewFolderHdl_Impl ) );
+
+ // create the split items
+ aSplitWin.SetAlign( WINDOWALIGN_LEFT );
+ long nWidth = pIconWin->GetMaxTextLength() * 8 / 7 + 1; // extra space for border
+ aSplitWin.InsertItem( ICONWIN_ID, pIconWin, nWidth, SPLITWINDOW_APPEND, 0, SWIB_FIXED );
+ aSplitWin.InsertItem( FILEWIN_ID, pFileWin, 50, SPLITWINDOW_APPEND, 0, SWIB_PERCENTSIZE );
+ aSplitWin.InsertItem( FRAMEWIN_ID, pFrameWin, 50, SPLITWINDOW_APPEND, 0, SWIB_PERCENTSIZE );
+ aSplitWin.SetSplitHdl( LINK( this, SvtTemplateWindow, ResizeHdl_Impl ) );
+
+ // show the windows
+ pIconWin->Show();
+ pFileWin->Show();
+ pFrameWin->Show();
+ aSplitWin.Show();
+
+ // initialize the timers
+ aSelectTimer.SetTimeout( 200 );
+ aSelectTimer.SetTimeoutHdl( LINK( this, SvtTemplateWindow, TimeoutHdl_Impl ) );
+
+ // initialize the toolboxes and then show them
+ InitToolBoxes();
+ aFileViewTB.Show();
+ aFrameWinTB.Show();
+
+ ReadViewSettings( );
+
+ Application::PostUserEvent( LINK( this, SvtTemplateWindow, ResizeHdl_Impl ) );
+}
+
+// ------------------------------------------------------------------------
+
+SvtTemplateWindow::~SvtTemplateWindow()
+{
+ WriteViewSettings( );
+
+ delete pIconWin;
+ delete pFileWin;
+ delete pFrameWin;
+ if ( pHistoryList )
+ {
+ for ( UINT32 i = 0; i < pHistoryList->Count(); ++i )
+ delete pHistoryList->GetObject(i);
+ delete pHistoryList;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtTemplateWindow , IconClickHdl_Impl, SvtIconChoiceCtrl *, EMPTYARG )
+{
+ String aURL = pIconWin->GetSelectedIconURL();
+ if ( !aURL.Len() )
+ aURL = pIconWin->GetCursorPosIconURL();
+ if ( pFileWin->GetRootURL() != aURL )
+ {
+ pFileWin->OpenRoot( aURL );
+ pIconWin->InvalidateIconControl();
+ aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, FALSE );
+ }
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtTemplateWindow , FileSelectHdl_Impl, SvtFileView *, EMPTYARG )
+{
+ aSelectTimer.Start();
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtTemplateWindow , FileDblClickHdl_Impl, SvtFileView *, EMPTYARG )
+{
+ if ( aSelectTimer.IsActive() )
+ aSelectTimer.Stop();
+
+ String aURL = pFileWin->GetSelectedFile();
+ if ( aURL.Len() > 0 )
+ {
+ if ( ::utl::UCBContentHelper::IsFolder( aURL ) )
+ pFileWin->OpenFolder( aURL );
+ else
+ aDoubleClickHdl.Call( this );
+ }
+
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtTemplateWindow , NewFolderHdl_Impl, SvtFileView *, EMPTYARG )
+{
+ pFrameWin->OpenFile( String(), sal_True, sal_False, sal_False );
+ aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, FALSE );
+
+ String sURL = pFileWin->GetFolderURL();
+ ULONG nPos = pIconWin->GetRootPos( sURL );
+ AppendHistoryURL( sURL, nPos );
+
+ aNewFolderHdl.Call( this );
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtTemplateWindow , TimeoutHdl_Impl, Timer *, EMPTYARG )
+{
+ aSelectHdl.Call( this );
+ String sURL = pFileWin->GetSelectedFile();
+ sal_Bool bIsNewDoc = ( pIconWin->GetSelectEntryPos() == ICON_POS_NEWDOC );
+ sal_Bool bIsFile = ( sURL.Len() != 0 && !::utl::UCBContentHelper::IsFolder( sURL ) &&
+ INetURLObject( sURL ).GetProtocol() != INET_PROT_PRIVATE && !bIsNewDoc );
+ aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, bIsFile );
+ aFrameWinTB.EnableItem( TI_DOCTEMPLATE_PREVIEW, !bIsNewDoc );
+
+ if ( bIsFile )
+ pFrameWin->OpenFile( sURL, sal_True, sal_False, sal_False );
+ else if ( bIsNewDoc && aFrameWinTB.IsItemChecked( TI_DOCTEMPLATE_PREVIEW ) )
+ {
+ aFrameWinTB.CheckItem( TI_DOCTEMPLATE_DOCINFO );
+ DoAction( TI_DOCTEMPLATE_DOCINFO );
+ }
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtTemplateWindow , ClickHdl_Impl, ToolBox *, pToolBox )
+{
+ DoAction( pToolBox->GetCurItemId() );
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtTemplateWindow , ResizeHdl_Impl, SplitWindow *, EMPTYARG )
+{
+ Resize();
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::PrintFile( const String& rURL )
+{
+ // open the file readonly and hidden
+ Sequence < PropertyValue > aArgs( 2 );
+ aArgs[0].Name = ASCII_STR("ReadOnly");
+ aArgs[0].Value <<= sal_True;
+ aArgs[1].Name = ASCII_STR("Hidden");
+ aArgs[1].Value <<= sal_True;
+
+ Reference < XComponentLoader > xDesktop( ::comphelper::getProcessServiceFactory()->
+ createInstance( ASCII_STR("com.sun.star.frame.Desktop") ), UNO_QUERY );
+ Reference < XModel > xModel( xDesktop->loadComponentFromURL(
+ rURL, ASCII_STR("_blank"), 0, aArgs ), UNO_QUERY );
+ if ( xModel.is() )
+ {
+ // print
+ Reference < XPrintable > xPrintable( xModel, UNO_QUERY );
+ if ( xPrintable.is() )
+ xPrintable->print( Sequence < PropertyValue >() );
+ }
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::AppendHistoryURL( const String& rURL, ULONG nGroup )
+{
+ sal_Bool bInsert = sal_True;
+ if ( !pHistoryList )
+ pHistoryList = new HistoryList_Impl;
+ else if ( pHistoryList->Count() > 0 )
+ {
+ FolderHistory* pLastEntry = pHistoryList->GetObject( pHistoryList->Count() - 1 );
+ bInsert = ( rURL != pLastEntry->m_sURL);
+ }
+
+ if ( bInsert )
+ {
+ FolderHistory* pEntry = new FolderHistory( rURL, nGroup );
+ pHistoryList->Insert( pEntry, LIST_APPEND );
+ aFileViewTB.EnableItem( TI_DOCTEMPLATE_BACK, pHistoryList->Count() > 1 );
+ }
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::OpenHistory()
+{
+ FolderHistory* pEntry = pHistoryList->Remove( pHistoryList->Count() - 1 );
+ pEntry = pHistoryList->Remove( pHistoryList->Count() - 1 );
+ aFileViewTB.EnableItem( TI_DOCTEMPLATE_BACK, pHistoryList->Count() > 1 );
+ pFileWin->OpenFolder( pEntry->m_sURL );
+ pIconWin->SetCursorPos( pEntry->m_nGroup );
+ delete pEntry;
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::DoAction( USHORT nAction )
+{
+ switch( nAction )
+ {
+ case TI_DOCTEMPLATE_BACK :
+ {
+ if ( pHistoryList && pHistoryList->Count() > 1 )
+ OpenHistory();
+ break;
+ }
+
+ case TI_DOCTEMPLATE_PREV :
+ {
+ String aURL;
+ if ( pFileWin->HasPreviousLevel( aURL ) )
+ pFileWin->OpenFolder( aURL );
+ break;
+ }
+
+ case TI_DOCTEMPLATE_PRINT :
+ {
+ String sPrintFile( pFileWin->GetSelectedFile() );
+ if ( sPrintFile.Len() > 0 )
+ PrintFile( sPrintFile );
+ break;
+ }
+
+ case TI_DOCTEMPLATE_DOCINFO :
+ case TI_DOCTEMPLATE_PREVIEW :
+ {
+ pFrameWin->ToggleView( TI_DOCTEMPLATE_DOCINFO == nAction );
+ break;
+ }
+ }
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::InitToolBoxes()
+{
+ InitToolBoxImages();
+
+ Size aSize = aFileViewTB.CalcWindowSizePixel();
+ aSize.Height() += 4;
+ aFileViewTB.SetPosSizePixel( Point( 0, 2 ), aSize );
+ aSize = aFrameWinTB.CalcWindowSizePixel();
+ aSize.Height() += 4;
+ aFrameWinTB.SetPosSizePixel( Point( pFrameWin->GetPosPixel().X() + 2, 2 ), aSize );
+
+ BOOL bFlat = ( SvtMiscOptions().GetToolboxStyle() == TOOLBOX_STYLE_FLAT );
+ if ( bFlat )
+ {
+ aFileViewTB.SetOutStyle( TOOLBOX_STYLE_FLAT );
+ aFrameWinTB.SetOutStyle( TOOLBOX_STYLE_FLAT );
+ }
+
+ aFileViewTB.EnableItem( TI_DOCTEMPLATE_BACK, FALSE );
+ aFileViewTB.EnableItem( TI_DOCTEMPLATE_PREV, FALSE );
+ aFileViewTB.EnableItem( TI_DOCTEMPLATE_PRINT, FALSE );
+
+ Link aLink = LINK( this, SvtTemplateWindow, ClickHdl_Impl );
+ aFileViewTB.SetClickHdl( aLink );
+ aFrameWinTB.SetClickHdl( aLink );
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::InitToolBoxImages()
+{
+ SvtMiscOptions aMiscOpt;
+ BOOL bLarge = aMiscOpt.AreCurrentSymbolsLarge();
+
+ aFileViewTB.SetItemImage( TI_DOCTEMPLATE_BACK, Image( SvtResId(
+ bLarge ? IMG_SVT_DOCTEMPLATE_BACK_LARGE
+ : IMG_SVT_DOCTEMPLATE_BACK_SMALL ) ) );
+ aFileViewTB.SetItemImage( TI_DOCTEMPLATE_PREV, Image( SvtResId(
+ bLarge ? IMG_SVT_DOCTEMPLATE_PREV_LARGE
+ : IMG_SVT_DOCTEMPLATE_PREV_SMALL ) ) );
+ aFileViewTB.SetItemImage( TI_DOCTEMPLATE_PRINT, Image( SvtResId(
+ bLarge ? IMG_SVT_DOCTEMPLATE_PRINT_LARGE
+ : IMG_SVT_DOCTEMPLATE_PRINT_SMALL ) ) );
+
+ aFrameWinTB.SetItemImage( TI_DOCTEMPLATE_DOCINFO, Image( SvtResId(
+ bLarge ? IMG_SVT_DOCTEMPLATE_DOCINFO_LARGE
+ : IMG_SVT_DOCTEMPLATE_DOCINFO_SMALL ) ) );
+ aFrameWinTB.SetItemImage( TI_DOCTEMPLATE_PREVIEW, Image( SvtResId(
+ bLarge ? IMG_SVT_DOCTEMPLATE_PREVIEW_LARGE
+ : IMG_SVT_DOCTEMPLATE_PREVIEW_SMALL ) ) );
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::UpdateIcons()
+{
+ pIconWin->UpdateIcons();
+}
+
+// ------------------------------------------------------------------------
+
+long SvtTemplateWindow::PreNotify( NotifyEvent& rNEvt )
+{
+ USHORT nType = rNEvt.GetType();
+ long nRet = 0;
+
+ if ( EVENT_KEYINPUT == nType && rNEvt.GetKeyEvent() )
+ {
+ const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
+ USHORT nCode = rKeyCode.GetCode();
+
+ if ( KEY_BACKSPACE == nCode && !rKeyCode.GetModifier() && pFileWin->HasChildPathFocus() )
+ {
+ DoAction( TI_DOCTEMPLATE_BACK );
+ nRet = 1;
+ }
+ else if ( pIconWin->ProcessKeyEvent( *rNEvt.GetKeyEvent() ) )
+ {
+ nRet = 1;
+ }
+ }
+
+ return nRet ? nRet : Window::PreNotify( rNEvt );
+}
+
+// -----------------------------------------------------------------------------
+
+void SvtTemplateWindow::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ Window::DataChanged( rDCEvt );
+
+ if ( ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) ||
+ ( rDCEvt.GetType() == DATACHANGED_DISPLAY ) ) &&
+ ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
+ {
+ // update of the background for the area left of the FileView toolbox
+ SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetFaceColor() ) );
+ // update of the images of the IconChoiceControl
+ UpdateIcons();
+ // update of the toolbox images
+ InitToolBoxImages();
+ }
+}
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::Resize()
+{
+ long nItemSize = aSplitWin.GetItemSize( ICONWIN_ID );
+ long nSplitterWidth = Splitter( this, 0 ).GetSizePixel().Width();
+
+ Point aPos = aFileViewTB.GetPosPixel();
+ aPos.X() = nItemSize + nSplitterWidth / 2;
+ aFileViewTB.SetPosPixel( aPos );
+
+ Size aWinSize = GetOutputSizePixel();
+ long nWidth = aWinSize.Width() - aPos.X();
+
+ nItemSize = nWidth * aSplitWin.GetItemSize( FILEWIN_ID ) / 100;
+ aPos.X() = pFrameWin->GetPosPixel().X() + 2;
+ aFrameWinTB.SetPosPixel( aPos );
+
+ Size aSize = aFileViewTB.GetSizePixel();
+ aSize.Width() = nItemSize;
+ aFileViewTB.SetSizePixel( aSize );
+
+ aSize = aFrameWinTB.GetSizePixel();
+ aSize.Width() = nWidth - nItemSize;
+ aFrameWinTB.SetSizePixel( aSize );
+
+ long nToolBoxHeight = aSize.Height() + aFrameWinTB.GetPosPixel().Y();
+ aSize = aWinSize;
+ aSize.Height() -= nToolBoxHeight;
+ aSplitWin.SetPosSizePixel( Point( 0, nToolBoxHeight ), aSize );
+}
+
+// ------------------------------------------------------------------------
+
+String SvtTemplateWindow::GetSelectedFile() const
+{
+ return pFileWin->GetSelectedFile();
+}
+
+// ------------------------------------------------------------------------
+
+sal_Bool SvtTemplateWindow::IsFileSelected() const
+{
+ String aURL = pFileWin->GetSelectedFile();
+ sal_Bool bRet = ( aURL.Len() > 0 && !::utl::UCBContentHelper::IsFolder( aURL ) );
+ return bRet;
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::OpenFile( sal_Bool bNotAsTemplate )
+{
+ String aURL = pFileWin->GetSelectedFile();
+ if ( aURL.Len() > 0 && !::utl::UCBContentHelper::IsFolder( aURL ) )
+ pFrameWin->OpenFile( aURL, sal_False, pFileWin->IsTemplateFolder(), !bNotAsTemplate );
+}
+
+// ------------------------------------------------------------------------
+
+String SvtTemplateWindow::GetFolderTitle() const
+{
+ String sTitle;
+ String sFolderURL = pFileWin->GetFolderURL();
+ if ( pIconWin->IsRootURL( sFolderURL ) )
+ sTitle = pIconWin->GetIconText( sFolderURL );
+ else
+ sTitle = pFileWin->GetFolderTitle();
+ return sTitle;
+}
+
+// ------------------------------------------------------------------------
+
+String SvtTemplateWindow::GetFolderURL() const
+{
+ return pFileWin->GetFolderURL();
+}
+
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::SetFocus( sal_Bool bIconWin )
+{
+ if ( bIconWin )
+ pIconWin->SetFocus();
+ else
+ pFileWin->SetFocus();
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::OpenTemplateRoot()
+{
+ pFileWin->OpenFolder( pIconWin->GetTemplateRootURL() );
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::SetPrevLevelButtonState( const String& rURL )
+{
+ // disable the prev level button on root folder of the icon pane (except My Documents)
+ // and on the root of all (file:/// -> count == 0)
+ INetURLObject aObj( rURL );
+ sal_Int32 nCount = aObj.getSegmentCount();
+ sal_Bool bEnable =
+ ( nCount > 0 &&
+ ( !pIconWin->IsRootURL( rURL ) || rURL == pIconWin->GetMyDocumentsRootURL() ) );
+ aFileViewTB.EnableItem( TI_DOCTEMPLATE_PREV, bEnable );
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::ClearHistory()
+{
+ if( pHistoryList )
+ pHistoryList->Clear();
+}
+
+// ------------------------------------------------------------------------
+
+long SvtTemplateWindow::CalcHeight() const
+{
+ // toolbox height
+ long nHeight = aFileViewTB.GetSizePixel().Height();
+ // + iconwin height
+ nHeight += pIconWin->CalcHeight();
+ // + little offset
+ nHeight += 8;
+ return nHeight;
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::ReadViewSettings()
+{
+ // defaults
+ sal_Int32 nSelectedGroup = ICON_POS_TEMPLATES;
+ sal_Int32 nSelectedView = TI_DOCTEMPLATE_DOCINFO;
+ double nSplitRatio = 0.5;
+ ::rtl::OUString sLastFolder;
+
+ SvtViewOptions aViewSettings( E_DIALOG, VIEWSETTING_NEWFROMTEMPLATE );
+ if ( aViewSettings.Exists() )
+ {
+ // read the settings
+ Sequence< NamedValue > aSettings = aViewSettings.GetUserData( );
+
+ aViewSettings.GetUserItem( VIEWSETTING_SELECTEDGROUP ) >>= nSelectedGroup;
+ aViewSettings.GetUserItem( VIEWSETTING_SELECTEDVIEW ) >>= nSelectedView;
+ aViewSettings.GetUserItem( VIEWSETTING_SPLITRATIO ) >>= nSplitRatio;
+ aViewSettings.GetUserItem( VIEWSETTING_LASTFOLDER ) >>= sLastFolder;
+ }
+ // normalize
+ if ( nSelectedGroup < ICON_POS_NEWDOC ) nSelectedGroup = ICON_POS_NEWDOC;
+ if ( nSelectedGroup > ICON_POS_SAMPLES ) nSelectedGroup = ICON_POS_SAMPLES;
+
+ if ( ( TI_DOCTEMPLATE_DOCINFO != nSelectedView ) && ( TI_DOCTEMPLATE_PREVIEW != nSelectedView ) )
+ nSelectedView = TI_DOCTEMPLATE_DOCINFO;
+
+ if ( nSplitRatio < 0.2 ) nSplitRatio = 0.2;
+ if ( nSplitRatio > 0.8 ) nSplitRatio = 0.8;
+
+ // change our view according to the settings
+
+ // the selected view (details or preview)
+ pFrameWin->ToggleView( TI_DOCTEMPLATE_DOCINFO == nSelectedView );
+ aFrameWinTB.CheckItem( (sal_uInt16)nSelectedView, TRUE );
+
+ // the split ratio
+ sal_Int32 nSplitFileAndFrameSize = aSplitWin.GetItemSize( FILEWIN_ID ) + aSplitWin.GetItemSize( FRAMEWIN_ID );
+ sal_Int32 nSplitFileSize = (sal_Int32)(nSplitFileAndFrameSize * nSplitRatio);
+ sal_Int32 nSplitFrameSize = nSplitFileAndFrameSize - nSplitFileSize;
+ aSplitWin.SetItemSize( FILEWIN_ID, nSplitFileSize );
+ aSplitWin.SetItemSize( FRAMEWIN_ID, nSplitFrameSize );
+ Resize();
+
+ // the selected folder
+ pIconWin->SetCursorPos( nSelectedGroup );
+
+ // open the last folder or the selected group
+ if ( sLastFolder.getLength() > 0 )
+ pFileWin->OpenFolder( sLastFolder );
+ else
+ IconClickHdl_Impl( NULL );
+}
+
+// ------------------------------------------------------------------------
+
+void SvtTemplateWindow::WriteViewSettings()
+{
+ // collect
+ Sequence< NamedValue > aSettings(4);
+
+ // the selected group
+ aSettings[0].Name = VIEWSETTING_SELECTEDGROUP;
+ pIconWin->SetFocus();
+ aSettings[0].Value <<= (sal_Int32)pIconWin->GetCursorPos( );
+
+ // the selected view mode
+ aSettings[1].Name = VIEWSETTING_SELECTEDVIEW;
+ aSettings[1].Value <<= sal_Int32( aFrameWinTB.IsItemChecked( TI_DOCTEMPLATE_DOCINFO ) ? TI_DOCTEMPLATE_DOCINFO : TI_DOCTEMPLATE_PREVIEW );
+
+ // the split ratio
+ aSettings[2].Name = VIEWSETTING_SPLITRATIO;
+ sal_Int32 nSplitFileSize = aSplitWin.GetItemSize( FILEWIN_ID );
+ sal_Int32 nSplitFileAndFrameSize = nSplitFileSize + aSplitWin.GetItemSize( FRAMEWIN_ID );
+ aSettings[2].Value <<= double( 1.0 * nSplitFileSize / nSplitFileAndFrameSize );
+
+ // last folder
+ aSettings[3].Name = VIEWSETTING_LASTFOLDER;
+ aSettings[3].Value <<= ::rtl::OUString( pFileWin->GetFolderURL() );
+
+ // write
+ SvtViewOptions aViewSettings( E_DIALOG, VIEWSETTING_NEWFROMTEMPLATE );
+ aViewSettings.SetUserData( aSettings );
+}
+
+void SvtTemplateWindow::SelectFolder(sal_Int32 nFolderPosition)
+{
+ pIconWin->SelectFolder(nFolderPosition);
+}
+// struct SvtTmplDlg_Impl ------------------------------------------------
+
+struct SvtTmplDlg_Impl
+{
+ SvtTemplateWindow* pWin;
+ String aTitle;
+ Timer aUpdateTimer;
+ sal_Bool bSelectNoOpen;
+
+ uno::Reference< util::XOfficeInstallationDirectories > m_xOfficeInstDirs;
+
+
+ SvtTmplDlg_Impl( Window* pParent ) : pWin( new SvtTemplateWindow( pParent ) ) ,bSelectNoOpen( sal_False ) {}
+
+ ~SvtTmplDlg_Impl() { delete pWin; }
+
+ uno::Reference< util::XOfficeInstallationDirectories > getOfficeInstDirs();
+};
+
+uno::Reference< util::XOfficeInstallationDirectories > SvtTmplDlg_Impl::getOfficeInstDirs()
+{
+ if ( !m_xOfficeInstDirs.is() )
+ {
+ try
+ {
+ uno::Reference< lang::XMultiServiceFactory > xSMgr = comphelper::getProcessServiceFactory();
+
+ uno::Reference< beans::XPropertySet > xPropSet( xSMgr, uno::UNO_QUERY );
+ if ( xPropSet.is() )
+ {
+ uno::Reference< uno::XComponentContext > xCtx;
+ xPropSet->getPropertyValue(
+ rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) )
+ >>= xCtx;
+
+ if ( xCtx.is() )
+ {
+ xCtx->getValueByName(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
+ "/singletons/com.sun.star.util.theOfficeInstallationDirectories" ) ) )
+ >>= m_xOfficeInstDirs;
+ }
+ }
+ }
+ catch( uno::Exception& )
+ {}
+ }
+
+ return m_xOfficeInstDirs;
+}
+
+// class SvtDocumentTemplateDialog ---------------------------------------
+
+SvtDocumentTemplateDialog::SvtDocumentTemplateDialog( Window* _pParent, SelectOnly ) :
+ ModalDialog( _pParent, SvtResId( DLG_DOCTEMPLATE ) ),
+
+ aMoreTemplatesLink ( this, SvtResId( FT_DOCTEMPLATE_LINK ) ),
+ aLine ( this, SvtResId( FL_DOCTEMPLATE ) ),
+ aManageBtn ( this, SvtResId( BTN_DOCTEMPLATE_MANAGE ) ),
+ aEditBtn ( this, SvtResId( BTN_DOCTEMPLATE_EDIT ) ),
+ aOKBtn ( this, SvtResId( BTN_DOCTEMPLATE_OPEN ) ),
+ aCancelBtn ( this, SvtResId( BTN_DOCTEMPLATE_CANCEL ) ),
+ aHelpBtn ( this, SvtResId( BTN_DOCTEMPLATE_HELP ) ),
+ pImpl ( NULL )
+{
+ FreeResource();
+ InitImpl( );
+
+ // no editing of templates
+ aEditBtn.Hide();
+
+ pImpl->bSelectNoOpen = sal_True;
+}
+
+// ------------------------------------------------------------------------
+
+SvtDocumentTemplateDialog::SvtDocumentTemplateDialog( Window* pParent ) :
+
+ ModalDialog( pParent, SvtResId( DLG_DOCTEMPLATE ) ),
+
+ aMoreTemplatesLink ( this, SvtResId( FT_DOCTEMPLATE_LINK ) ),
+ aLine ( this, SvtResId( FL_DOCTEMPLATE ) ),
+ aManageBtn ( this, SvtResId( BTN_DOCTEMPLATE_MANAGE ) ),
+ aEditBtn ( this, SvtResId( BTN_DOCTEMPLATE_EDIT ) ),
+ aOKBtn ( this, SvtResId( BTN_DOCTEMPLATE_OPEN ) ),
+ aCancelBtn ( this, SvtResId( BTN_DOCTEMPLATE_CANCEL ) ),
+ aHelpBtn ( this, SvtResId( BTN_DOCTEMPLATE_HELP ) ),
+ pImpl ( NULL )
+{
+ FreeResource();
+ InitImpl( );
+}
+
+// ------------------------------------------------------------------------
+
+void SvtDocumentTemplateDialog::InitImpl( )
+{
+ pImpl = new SvtTmplDlg_Impl( this );
+ pImpl->aTitle = GetText();
+
+ bool bHideLink = ( SvtExtendedSecurityOptions().GetOpenHyperlinkMode()
+ == SvtExtendedSecurityOptions::OPEN_NEVER );
+ if ( !bHideLink )
+ {
+ aMoreTemplatesLink.SetURL( String(
+ RTL_CONSTASCII_USTRINGPARAM( "http://templates.libreoffice.org/" ) ) );
+ aMoreTemplatesLink.SetClickHdl( LINK( this, SvtDocumentTemplateDialog, OpenLinkHdl_Impl ) );
+ }
+ else
+ aMoreTemplatesLink.Hide();
+
+ aManageBtn.SetClickHdl( LINK( this, SvtDocumentTemplateDialog, OrganizerHdl_Impl ) );
+ Link aLink = LINK( this, SvtDocumentTemplateDialog, OKHdl_Impl );
+ aEditBtn.SetClickHdl( aLink );
+ aOKBtn.SetClickHdl( aLink );
+
+ pImpl->pWin->SetSelectHdl( LINK( this, SvtDocumentTemplateDialog, SelectHdl_Impl ) );
+ pImpl->pWin->SetDoubleClickHdl( LINK( this, SvtDocumentTemplateDialog, DoubleClickHdl_Impl ) );
+ pImpl->pWin->SetNewFolderHdl( LINK( this, SvtDocumentTemplateDialog, NewFolderHdl_Impl ) );
+ pImpl->pWin->SetSendFocusHdl( LINK( this, SvtDocumentTemplateDialog, SendFocusHdl_Impl ) );
+
+ // dynamic height adjustment
+ long nHeight = pImpl->pWin->CalcHeight();
+
+ Size aSize = GetOutputSizePixel();
+ Point aPos = aMoreTemplatesLink.GetPosPixel();
+ Size a6Size = LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
+ if ( bHideLink )
+ aPos.Y() += aMoreTemplatesLink.GetSizePixel().Height();
+ else
+ aPos.Y() -= a6Size.Height();
+ long nDelta = aPos.Y() - nHeight;
+ aSize.Height() -= nDelta;
+ SetOutputSizePixel( aSize );
+
+ aSize.Height() = nHeight;
+ aSize.Width() -= ( a6Size.Width() * 2 );
+ pImpl->pWin->SetPosSizePixel( Point( a6Size.Width(), 0 ), aSize );
+
+ aPos = aMoreTemplatesLink.GetPosPixel();
+ aPos.Y() -= nDelta;
+ aMoreTemplatesLink.SetPosPixel( aPos );
+ aPos = aLine.GetPosPixel();
+ aPos.Y() -= nDelta;
+ aLine.SetPosPixel( aPos );
+ aPos = aManageBtn.GetPosPixel();
+ aPos.Y() -= nDelta;
+ aManageBtn.SetPosPixel( aPos );
+ aPos = aEditBtn.GetPosPixel();
+ aPos.Y() -= nDelta;
+ aEditBtn.SetPosPixel( aPos );
+ aPos = aOKBtn.GetPosPixel();
+ aPos.Y() -= nDelta;
+ aOKBtn.SetPosPixel( aPos );
+ aPos = aCancelBtn.GetPosPixel();
+ aPos.Y() -= nDelta;
+ aCancelBtn.SetPosPixel( aPos );
+ aPos = aHelpBtn.GetPosPixel();
+ aPos.Y() -= nDelta;
+ aHelpBtn.SetPosPixel( aPos );
+
+ pImpl->pWin->Show();
+
+ SelectHdl_Impl( NULL );
+ NewFolderHdl_Impl( NULL );
+
+ UpdateHdl_Impl( NULL );
+}
+
+// ------------------------------------------------------------------------
+
+SvtDocumentTemplateDialog::~SvtDocumentTemplateDialog()
+{
+ delete pImpl;
+}
+
+// ------------------------------------------------------------------------
+
+sal_Bool SvtDocumentTemplateDialog::IsFileSelected( ) const
+{
+ return pImpl->pWin->IsFileSelected();
+}
+
+// ------------------------------------------------------------------------
+
+String SvtDocumentTemplateDialog::GetSelectedFileURL( ) const
+{
+ return pImpl->pWin->GetSelectedFile();
+}
+
+// ------------------------------------------------------------------------
+
+sal_Bool SvtDocumentTemplateDialog::CanEnableEditBtn() const
+{
+ sal_Bool bEnable = sal_False;
+
+ ::rtl::OUString aFolderURL = pImpl->pWin->GetFolderURL();
+ if ( pImpl->pWin->IsFileSelected() && aFolderURL.getLength() )
+ {
+ ::rtl::OUString aFileTargetURL = pImpl->pWin->GetSelectedFile();
+ bEnable = aFileTargetURL.getLength() > 0;
+ }
+
+ return bEnable;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtDocumentTemplateDialog , SelectHdl_Impl, SvtTemplateWindow *, EMPTYARG )
+{
+ aEditBtn.Enable( pImpl->pWin->IsTemplateFolderOpen() && CanEnableEditBtn() );
+ aOKBtn.Enable( pImpl->pWin->IsFileSelected() );
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtDocumentTemplateDialog , DoubleClickHdl_Impl, SvtTemplateWindow *, EMPTYARG )
+{
+ EndDialog( RET_OK );
+
+ if ( !pImpl->bSelectNoOpen )
+ pImpl->pWin->OpenFile( !pImpl->pWin->IsTemplateFolderOpen() );
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtDocumentTemplateDialog , NewFolderHdl_Impl, SvtTemplateWindow *, EMPTYARG )
+{
+ String aNewTitle( pImpl->aTitle );
+ aNewTitle += String( ASCII_STR(" - ") );
+ aNewTitle += pImpl->pWin->GetFolderTitle();
+ SetText( aNewTitle );
+
+ SelectHdl_Impl( NULL );
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtDocumentTemplateDialog , SendFocusHdl_Impl, SvtTemplateWindow *, EMPTYARG )
+{
+ if ( pImpl->pWin->HasIconWinFocus() )
+ aHelpBtn.GrabFocus();
+ else
+ {
+ if ( aEditBtn.IsEnabled() )
+ aEditBtn.GrabFocus();
+ else if ( aOKBtn.IsEnabled() )
+ aOKBtn.GrabFocus();
+ else
+ aCancelBtn.GrabFocus();
+ }
+
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtDocumentTemplateDialog , OKHdl_Impl, PushButton *, pBtn )
+{
+ if ( pImpl->pWin->IsFileSelected() )
+ {
+ EndDialog( RET_OK );
+
+ if ( !pImpl->bSelectNoOpen )
+ pImpl->pWin->OpenFile( &aEditBtn == pBtn );
+ }
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtDocumentTemplateDialog , OrganizerHdl_Impl, PushButton *, EMPTYARG )
+{
+ Window* pOldDefWin = Application::GetDefDialogParent();
+ Application::SetDefDialogParent( this );
+ Reference < XFramesSupplier > xDesktop = Reference < XFramesSupplier >(
+ ::comphelper::getProcessServiceFactory()->
+ createInstance( ASCII_STR("com.sun.star.frame.Desktop") ), UNO_QUERY );
+ Reference < XFrame > xFrame( xDesktop->getActiveFrame() );
+ if ( !xFrame.is() )
+ xFrame = Reference < XFrame >( xDesktop, UNO_QUERY );
+
+ com::sun::star::util::URL aTargetURL;
+ aTargetURL.Complete = ASCII_STR("slot:5540");
+ Reference < com::sun::star::util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->
+ createInstance( ASCII_STR("com.sun.star.util.URLTransformer") ), UNO_QUERY );
+ xTrans->parseStrict( aTargetURL );
+
+ Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY );
+ Reference < XDispatch > xDisp;
+ xDisp = xProv->queryDispatch( aTargetURL, ::rtl::OUString(), 0 );
+
+ if ( xDisp.is() )
+ {
+ Sequence<PropertyValue> aArgs(1);
+ PropertyValue* pArg = aArgs.getArray();
+ pArg[0].Name = ASCII_STR("Referer");
+ pArg[0].Value <<= ASCII_STR("private:user");
+ xDisp->dispatch( aTargetURL, aArgs );
+ }
+
+ Application::SetDefDialogParent( pOldDefWin );
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtDocumentTemplateDialog, UpdateHdl_Impl, Timer*, _pEventSource )
+{
+ pImpl->pWin->SetFocus( sal_False );
+ Reference< XDocumentTemplates > xTemplates( ::comphelper::getProcessServiceFactory()->
+ createInstance( ASCII_STR("com.sun.star.frame.DocumentTemplates") ), UNO_QUERY );
+ if ( xTemplates.is() )
+ {
+ if ( _pEventSource )
+ { // it was no direct call, which means it was triggered by the timer, which means we alread checked the necessity
+ WaitObject aWaitCursor( this );
+ xTemplates->update();
+ if ( pImpl->pWin->IsTemplateFolderOpen() )
+ {
+ pImpl->pWin->ClearHistory();
+ pImpl->pWin->OpenTemplateRoot();
+ }
+ }
+ else
+ {
+ // check if we really need to do the update
+ ::svt::TemplateFolderCache aCache;
+ if ( aCache.needsUpdate() )
+ { // yes -> do it asynchronous (it will take a noticeable time)
+
+ // (but first store the current state)
+ aCache.storeState();
+
+ // start the timer for the async update
+ pImpl->aUpdateTimer.SetTimeout( 300 );
+ pImpl->aUpdateTimer.SetTimeoutHdl( LINK( this, SvtDocumentTemplateDialog, UpdateHdl_Impl ) );
+ pImpl->aUpdateTimer.Start();
+ }
+ }
+ }
+ return 0;
+}
+
+// ------------------------------------------------------------------------
+
+IMPL_LINK ( SvtDocumentTemplateDialog, OpenLinkHdl_Impl, svt::FixedHyperlink*, EMPTYARG )
+{
+ ::rtl::OUString sURL( aMoreTemplatesLink.GetURL() );
+ if ( sURL.getLength() > 0 )
+ {
+ localizeWebserviceURI(sURL);
+ try
+ {
+ uno::Reference< lang::XMultiServiceFactory > xSMGR =
+ ::comphelper::getProcessServiceFactory();
+ uno::Reference< com::sun::star::system::XSystemShellExecute > xSystemShell(
+ xSMGR->createInstance( ::rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.system.SystemShellExecute" ) ) ),
+ uno::UNO_QUERY_THROW );
+ if ( xSystemShell.is() )
+ xSystemShell->execute( sURL, ::rtl::OUString(), com::sun::star::system::SystemShellExecuteFlags::DEFAULTS );
+ EndDialog( RET_CANCEL );
+ }
+ catch( const uno::Exception& e )
+ {
+ OSL_TRACE( "Caught exception: %s\n thread terminated.\n",
+ rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
+ }
+ }
+ return 0;
+}
+
+void SvtDocumentTemplateDialog::SelectTemplateFolder()
+{
+ pImpl->pWin->SelectFolder(ICON_POS_TEMPLATES);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */