| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_cui.hxx" |
| |
| // include --------------------------------------------------------------- |
| #include <vcl/svapp.hxx> |
| #include <sfx2/filedlghelper.hxx> |
| #include <svl/zforlist.hxx> |
| #include "optupdt.hxx" |
| #include "optupdt.hrc" |
| #include <dialmgr.hxx> |
| #include <cuires.hrc> |
| #include <comphelper/processfactory.hxx> |
| #include <com/sun/star/lang/XMultiServiceFactory.hpp> |
| #include <com/sun/star/ui/dialogs/XFolderPicker.hpp> |
| #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> |
| #include <com/sun/star/frame/XDesktop.hpp> |
| #include <com/sun/star/frame/XDispatchProvider.hpp> |
| #include <com/sun/star/util/XChangesBatch.hpp> |
| #include <com/sun/star/util/XURLTransformer.hpp> |
| #include <osl/file.hxx> |
| #include <osl/security.hxx> |
| |
| namespace beans = ::com::sun::star::beans; |
| namespace container = ::com::sun::star::container; |
| namespace dialogs = ::com::sun::star::ui::dialogs; |
| namespace frame = ::com::sun::star::frame; |
| namespace lang = ::com::sun::star::lang; |
| namespace uno = ::com::sun::star::uno; |
| namespace util = ::com::sun::star::util; |
| |
| // define ---------------------------------------------------------------- |
| |
| #define UNISTRING(s) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s)) |
| |
| // class SvxOnlineUpdateTabPage -------------------------------------------------- |
| |
| SvxOnlineUpdateTabPage::SvxOnlineUpdateTabPage( Window* pParent, const SfxItemSet& rSet ) : |
| |
| SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_ONLINEUPDATE ), rSet ), |
| m_aOptionsLine( this, CUI_RES( FL_OPTIONS ) ), |
| m_aAutoCheckCheckBox( this, CUI_RES( CB_AUTOCHECK ) ), |
| m_aEveryDayButton( this, CUI_RES( RB_EVERYDAY ) ), |
| m_aEveryWeekButton( this, CUI_RES( RB_EVERYWEEK ) ), |
| m_aEveryMonthButton( this, CUI_RES( RB_EVERYMONTH ) ), |
| m_aCheckNowButton( this, CUI_RES( PB_CHECKNOW ) ), |
| m_aAutoDownloadCheckBox( this, CUI_RES( CB_AUTODOWNLOAD ) ), |
| m_aDestPathLabel( this, CUI_RES( FT_DESTPATHLABEL ) ), |
| m_aDestPath( this, CUI_RES( FT_DESTPATH ) ), |
| m_aChangePathButton( this, CUI_RES( PB_CHANGEPATH ) ), |
| m_aLastChecked( this, CUI_RES( FT_LASTCHECKED ) ) |
| { |
| m_aNeverChecked = String( CUI_RES( STR_NEVERCHECKED ) ); |
| FreeResource(); |
| |
| m_aAutoCheckCheckBox.SetClickHdl( LINK( this, SvxOnlineUpdateTabPage, AutoCheckHdl_Impl ) ); |
| m_aCheckNowButton.SetClickHdl( LINK( this, SvxOnlineUpdateTabPage, CheckNowHdl_Impl ) ); |
| m_aChangePathButton.SetClickHdl( LINK( this, SvxOnlineUpdateTabPage, FileDialogHdl_Impl ) ); |
| |
| uno::Reference < lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); |
| |
| m_xUpdateAccess = uno::Reference < container::XNameReplace >( |
| xFactory->createInstance( UNISTRING( "com.sun.star.setup.UpdateCheckConfig" ) ), |
| uno::UNO_QUERY_THROW ); |
| |
| sal_Bool bDownloadSupported = sal_False; |
| m_xUpdateAccess->getByName( UNISTRING( "DownloadSupported") ) >>= bDownloadSupported; |
| |
| WinBits nStyle = m_aDestPath.GetStyle(); |
| nStyle |= WB_PATHELLIPSIS; |
| m_aDestPath.SetStyle(nStyle); |
| |
| m_aAutoDownloadCheckBox.Show(bDownloadSupported); |
| m_aDestPathLabel.Show(bDownloadSupported); |
| m_aDestPath.Show(bDownloadSupported); |
| m_aChangePathButton.Show(bDownloadSupported); |
| |
| // dynamical length of the PushButtons |
| CalcButtonWidth(); |
| |
| m_aLastCheckedTemplate = m_aLastChecked.GetText(); |
| |
| UpdateLastCheckedText(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SvxOnlineUpdateTabPage::~SvxOnlineUpdateTabPage() |
| { |
| } |
| |
| // ----------------------------------------------------------------------- |
| void SvxOnlineUpdateTabPage::UpdateLastCheckedText() |
| { |
| rtl::OUString aDateStr; |
| rtl::OUString aTimeStr; |
| rtl::OUString aText; |
| sal_Int64 lastChecked = 0; |
| |
| m_xUpdateAccess->getByName( UNISTRING( "LastCheck") ) >>= lastChecked; |
| |
| if( lastChecked == 0 ) // never checked |
| { |
| aText = m_aNeverChecked; |
| } |
| else |
| { |
| TimeValue lastCheckedTV; |
| oslDateTime lastCheckedDT; |
| |
| Date aDate; |
| Time aTime; |
| |
| lastCheckedTV.Seconds = (sal_uInt32) lastChecked; |
| osl_getLocalTimeFromSystemTime( &lastCheckedTV, &lastCheckedTV ); |
| |
| if ( osl_getDateTimeFromTimeValue( &lastCheckedTV, &lastCheckedDT ) ) |
| { |
| aDate = Date( lastCheckedDT.Day, lastCheckedDT.Month, lastCheckedDT.Year ); |
| aTime = Time( lastCheckedDT.Hours, lastCheckedDT.Minutes ); |
| } |
| |
| LanguageType eUILang = Application::GetSettings().GetUILanguage(); |
| SvNumberFormatter *pNumberFormatter = new SvNumberFormatter( ::comphelper::getProcessServiceFactory(), eUILang ); |
| String aTmpStr; |
| Color* pColor = NULL; |
| Date* pNullDate = pNumberFormatter->GetNullDate(); |
| sal_uInt32 nFormat = pNumberFormatter->GetStandardFormat( NUMBERFORMAT_DATE, eUILang ); |
| |
| pNumberFormatter->GetOutputString( aDate - *pNullDate, nFormat, aTmpStr, &pColor ); |
| aDateStr = aTmpStr; |
| |
| nFormat = pNumberFormatter->GetStandardFormat( NUMBERFORMAT_TIME, eUILang ); |
| pNumberFormatter->GetOutputString( aTime.GetTimeInDays(), nFormat, aTmpStr, &pColor ); |
| aTimeStr = aTmpStr; |
| |
| delete pColor; |
| delete pNumberFormatter; |
| |
| aText = m_aLastCheckedTemplate; |
| sal_Int32 nIndex = aText.indexOf( UNISTRING( "%DATE%" ) ); |
| if ( nIndex != -1 ) |
| aText = aText.replaceAt( nIndex, 6, aDateStr ); |
| |
| nIndex = aText.indexOf( UNISTRING( "%TIME%" ) ); |
| if ( nIndex != -1 ) |
| aText = aText.replaceAt( nIndex, 6, aTimeStr ); |
| } |
| |
| m_aLastChecked.SetText( aText ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SfxTabPage* |
| SvxOnlineUpdateTabPage::Create( Window* pParent, const SfxItemSet& rAttrSet ) |
| { |
| return new SvxOnlineUpdateTabPage( pParent, rAttrSet ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| |
| sal_Bool SvxOnlineUpdateTabPage::FillItemSet( SfxItemSet& ) |
| { |
| sal_Bool bModified = sal_False; |
| |
| sal_Bool bValue; |
| sal_Int64 nValue; |
| |
| if( m_aAutoCheckCheckBox.GetSavedValue() != m_aAutoCheckCheckBox.IsChecked() ) |
| { |
| bValue = (sal_True == m_aAutoCheckCheckBox.IsChecked()); |
| m_xUpdateAccess->replaceByName( UNISTRING("AutoCheckEnabled"), uno::makeAny( bValue ) ); |
| bModified = sal_True; |
| } |
| |
| nValue = 0; |
| if( sal_True == m_aEveryDayButton.IsChecked() ) |
| { |
| if( sal_False == m_aEveryDayButton.GetSavedValue() ) |
| nValue = 86400; |
| } |
| else if( sal_True == m_aEveryWeekButton.IsChecked() ) |
| { |
| if( sal_False == m_aEveryWeekButton.GetSavedValue() ) |
| nValue = 604800; |
| } |
| else if( sal_True == m_aEveryMonthButton.IsChecked() ) |
| { |
| if( sal_False == m_aEveryMonthButton.GetSavedValue() ) |
| nValue = 2592000; |
| } |
| |
| if( nValue > 0 ) |
| { |
| m_xUpdateAccess->replaceByName( UNISTRING("CheckInterval"), uno::makeAny( nValue ) ); |
| bModified = sal_True; |
| } |
| |
| if( m_aAutoDownloadCheckBox.GetSavedValue() != m_aAutoDownloadCheckBox.IsChecked() ) |
| { |
| bValue = (sal_True == m_aAutoDownloadCheckBox.IsChecked()); |
| m_xUpdateAccess->replaceByName( UNISTRING("AutoDownloadEnabled"), uno::makeAny( bValue ) ); |
| bModified = sal_True; |
| } |
| |
| rtl::OUString sValue, aURL; |
| m_xUpdateAccess->getByName( UNISTRING("DownloadDestination") ) >>= sValue; |
| |
| if( ( osl::FileBase::E_None == osl::FileBase::getFileURLFromSystemPath(m_aDestPath.GetText(), aURL) ) && |
| ( ! aURL.equals( sValue ) ) ) |
| { |
| m_xUpdateAccess->replaceByName( UNISTRING("DownloadDestination"), uno::makeAny( aURL ) ); |
| bModified = sal_True; |
| } |
| |
| uno::Reference< util::XChangesBatch > xChangesBatch(m_xUpdateAccess, uno::UNO_QUERY); |
| if( xChangesBatch.is() && xChangesBatch->hasPendingChanges() ) |
| xChangesBatch->commitChanges(); |
| |
| return bModified; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SvxOnlineUpdateTabPage::Reset( const SfxItemSet& ) |
| { |
| sal_Bool bValue = sal_Bool(); |
| m_xUpdateAccess->getByName( UNISTRING("AutoCheckEnabled") ) >>= bValue; |
| |
| m_aAutoCheckCheckBox.Check(bValue); |
| m_aEveryDayButton.Enable(bValue); |
| m_aEveryWeekButton.Enable(bValue); |
| m_aEveryMonthButton.Enable(bValue); |
| |
| sal_Int64 nValue = 0; |
| m_xUpdateAccess->getByName( UNISTRING("CheckInterval") ) >>= nValue; |
| |
| if( nValue == 86400 ) |
| m_aEveryDayButton.Check(); |
| else if( nValue == 604800 ) |
| m_aEveryWeekButton.Check(); |
| else |
| m_aEveryMonthButton.Check(); |
| |
| m_aAutoCheckCheckBox.SaveValue(); |
| m_aEveryDayButton.SaveValue(); |
| m_aEveryWeekButton.SaveValue(); |
| m_aEveryMonthButton.SaveValue(); |
| |
| m_xUpdateAccess->getByName( UNISTRING("AutoDownloadEnabled") ) >>= bValue; |
| m_aAutoDownloadCheckBox.Check(bValue); |
| m_aDestPathLabel.Enable(sal_True); |
| m_aDestPath.Enable(sal_True); |
| m_aChangePathButton.Enable(sal_True); |
| |
| rtl::OUString sValue, aPath; |
| m_xUpdateAccess->getByName( UNISTRING("DownloadDestination") ) >>= sValue; |
| |
| if( osl::FileBase::E_None == osl::FileBase::getSystemPathFromFileURL(sValue, aPath) ) |
| m_aDestPath.SetText(aPath); |
| |
| m_aAutoDownloadCheckBox.SaveValue(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void SvxOnlineUpdateTabPage::FillUserData() |
| { |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SvxOnlineUpdateTabPage, AutoCheckHdl_Impl, CheckBox *, pBox ) |
| { |
| sal_Bool bEnabled = pBox->IsChecked(); |
| |
| m_aEveryDayButton.Enable(bEnabled); |
| m_aEveryWeekButton.Enable(bEnabled); |
| m_aEveryMonthButton.Enable(bEnabled); |
| |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SvxOnlineUpdateTabPage, FileDialogHdl_Impl, PushButton *, EMPTYARG ) |
| { |
| uno::Reference < lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); |
| uno::Reference < dialogs::XFolderPicker > xFolderPicker( |
| xFactory->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( FOLDER_PICKER_SERVICE_NAME ) ) ), |
| uno::UNO_QUERY ); |
| |
| rtl::OUString aURL; |
| if( osl::FileBase::E_None != osl::FileBase::getFileURLFromSystemPath(m_aDestPath.GetText(), aURL) ) |
| osl::Security().getHomeDir(aURL); |
| |
| xFolderPicker->setDisplayDirectory( aURL ); |
| sal_Int16 nRet = xFolderPicker->execute(); |
| |
| if ( dialogs::ExecutableDialogResults::OK == nRet ) |
| { |
| rtl::OUString aFolder; |
| if( osl::FileBase::E_None == osl::FileBase::getSystemPathFromFileURL(xFolderPicker->getDirectory(), aFolder)) |
| m_aDestPath.SetText( aFolder ); |
| } |
| |
| return 0; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| IMPL_LINK( SvxOnlineUpdateTabPage, CheckNowHdl_Impl, PushButton *, EMPTYARG ) |
| { |
| uno::Reference < lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); |
| |
| try |
| { |
| uno::Reference< lang::XMultiServiceFactory > xConfigProvider( |
| xFactory->createInstance( UNISTRING( "com.sun.star.configuration.ConfigurationProvider" )), |
| uno::UNO_QUERY_THROW); |
| |
| beans::PropertyValue aProperty; |
| aProperty.Name = UNISTRING( "nodepath" ); |
| aProperty.Value = uno::makeAny( UNISTRING("org.openoffice.Office.Addons/AddonUI/OfficeHelp/UpdateCheckJob") ); |
| |
| uno::Sequence< uno::Any > aArgumentList( 1 ); |
| aArgumentList[0] = uno::makeAny( aProperty ); |
| |
| uno::Reference< container::XNameAccess > xNameAccess( |
| xConfigProvider->createInstanceWithArguments( |
| UNISTRING("com.sun.star.configuration.ConfigurationAccess"), aArgumentList ), |
| uno::UNO_QUERY_THROW ); |
| |
| util::URL aURL; |
| xNameAccess->getByName(UNISTRING("URL")) >>= aURL.Complete; |
| |
| uno::Reference < util::XURLTransformer > xTransformer( |
| xFactory->createInstance( UNISTRING( "com.sun.star.util.URLTransformer" ) ), |
| uno::UNO_QUERY_THROW ); |
| |
| xTransformer->parseStrict(aURL); |
| |
| uno::Reference < frame::XDesktop > xDesktop( |
| xFactory->createInstance( UNISTRING( "com.sun.star.frame.Desktop" ) ), |
| uno::UNO_QUERY_THROW ); |
| |
| uno::Reference< frame::XDispatchProvider > xDispatchProvider( |
| xDesktop->getCurrentFrame(), uno::UNO_QUERY ); |
| |
| uno::Reference< frame::XDispatch > xDispatch; |
| if( xDispatchProvider.is() ) |
| xDispatch = xDispatchProvider->queryDispatch(aURL, rtl::OUString(), 0); |
| |
| if( xDispatch.is() ) |
| xDispatch->dispatch(aURL, uno::Sequence< beans::PropertyValue > ()); |
| |
| UpdateLastCheckedText(); |
| } |
| 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 SvxOnlineUpdateTabPage::CalcButtonWidth() |
| { |
| // detect the longest button text |
| long nTxtWidth = ::std::max( m_aCheckNowButton.GetCtrlTextWidth( m_aCheckNowButton.GetText() ), |
| m_aCheckNowButton.GetCtrlTextWidth( m_aChangePathButton.GetText() ) ); |
| // add a little offset |
| nTxtWidth = nTxtWidth + 12; |
| // compare with the button width |
| Size aSize = m_aCheckNowButton.GetSizePixel(); |
| // and change it if it's necessary |
| if ( nTxtWidth > aSize.Width() ) |
| { |
| aSize.Width() = nTxtWidth; |
| m_aCheckNowButton.SetSizePixel( aSize ); |
| m_aChangePathButton.SetSizePixel( aSize ); |
| } |
| } |
| |