1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: pages.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_desktop.hxx"
37 #include "migration.hxx"
38 #include <vcl/msgbox.hxx>
39 #include <vcl/mnemonic.hxx>
40 #include <vos/security.hxx>
42 #include <rtl/ustring.hxx>
43 #include <osl/file.hxx>
44 #include <unotools/bootstrap.hxx>
45 #include <unotools/configmgr.hxx>
46 #include <svtools/regoptions.hxx>
47 #include <svtools/useroptions.hxx>
48 #include <sfx2/basedlgs.hxx>
49 #include <comphelper/processfactory.hxx>
50 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
51 #include <com/sun/star/lang/XInitialization.hpp>
52 #include <com/sun/star/frame/XDesktop.hpp>
53 #include <com/sun/star/beans/XMaterialHolder.hpp>
54 #include <com/sun/star/beans/NamedValue.hpp>
55 #include <com/sun/star/container/XNameReplace.hpp>
56 #include <com/sun/star/task/XJobExecutor.hpp>
57 #include <comphelper/configurationhelper.hxx>
58 #include <rtl/bootstrap.hxx>
59 #include <rtl/ustrbuf.hxx>
60 #include <osl/file.hxx>
61 #include <unotools/bootstrap.hxx>
62 #include <tools/config.hxx>
68 using namespace com::sun::star::frame
;
69 using namespace com::sun::star::lang
;
70 using namespace com::sun::star::util
;
71 using namespace com::sun::star::beans
;
72 using namespace com::sun::star::uno
;
73 using namespace com::sun::star::container
;
75 #define UNISTRING(s) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))
79 static void _setBold(FixedText
& ft
)
81 Font f
= ft
.GetControlFont();
82 f
.SetWeight(WEIGHT_BOLD
);
86 WelcomePage::WelcomePage( svt::OWizardMachine
* parent
, const ResId
& resid
, sal_Bool bLicenseNeedsAcceptance
)
87 : OWizardPage(parent
, resid
)
88 , m_ftHead(this, WizardResId(FT_WELCOME_HEADER
))
89 , m_ftBody(this, WizardResId(FT_WELCOME_BODY
))
91 , m_bLicenseNeedsAcceptance( bLicenseNeedsAcceptance
)
92 , bIsEvalVersion(false)
100 // we need to choose the welcome text that is diplayed
101 // choices are the default text, default text+migradtion,
102 // OEM and extended OEM
103 // No OEM is built, remove the check
104 // switch (checkOEM())
107 // check for migration
108 if (Migration::checkMigration())
110 String
aText(WizardResId(STR_WELCOME_MIGRATION
));
111 // replace %OLDPRODUCT with found version name
112 aText
.SearchAndReplaceAll( UniString::CreateFromAscii("%OLD_VERSION"), Migration::getOldVersionName());
113 m_ftBody
.SetText( aText
);
116 if ( ! m_bLicenseNeedsAcceptance
)
118 String
aText(WizardResId(STR_WELCOME_WITHOUT_LICENSE
));
119 m_ftBody
.SetText( aText
);
124 void WelcomePage::checkEval()
126 Reference
< XMultiServiceFactory
> xFactory
= ::comphelper::getProcessServiceFactory();
127 Reference
< XMaterialHolder
> xHolder(xFactory
->createInstance(
128 OUString::createFromAscii("com.sun.star.tab.tabreg")), UNO_QUERY
);
130 Any aData
= xHolder
->getMaterial();
131 Sequence
< NamedValue
> aSeq
;
132 if (aData
>>= aSeq
) {
133 bIsEvalVersion
= true;
134 for (int i
=0; i
< aSeq
.getLength(); i
++) {
135 if (aSeq
[i
].Name
.equalsAscii("NoEvalText")) {
136 aSeq
[i
].Value
>>= bNoEvalText
;
144 void WelcomePage::ActivatePage()
146 OWizardPage::ActivatePage();
147 // this page has no controls, so forwarding to default
148 // button (next) won't work if we grap focus
152 LicensePage::LicensePage( svt::OWizardMachine
* parent
, const ResId
& resid
, const rtl::OUString
&rLicensePath
)
153 : OWizardPage(parent
, resid
)
155 , m_ftHead(this, WizardResId(FT_LICENSE_HEADER
))
156 , m_ftBody1(this, WizardResId(FT_LICENSE_BODY_1
))
157 , m_ftBody1Txt(this, WizardResId(FT_LICENSE_BODY_1_TXT
))
158 , m_ftBody2(this, WizardResId(FT_LICENSE_BODY_2
))
159 , m_ftBody2Txt(this, WizardResId(FT_LICENSE_BODY_2_TXT
))
160 , m_mlLicense(this, WizardResId(ML_LICENSE
))
161 , m_pbDown(this, WizardResId(PB_LICENSE_DOWN
))
162 , m_bLicenseRead(sal_False
)
168 m_mlLicense
.SetEndReachedHdl( LINK(this, LicensePage
, EndReachedHdl
) );
169 m_mlLicense
.SetScrolledHdl( LINK(this, LicensePage
, ScrolledHdl
) );
170 m_pbDown
.SetClickHdl( LINK(this, LicensePage
, PageDownHdl
) );
172 // We want a automatic repeating page down button
173 WinBits aStyle
= m_pbDown
.GetStyle();
175 m_pbDown
.SetStyle( aStyle
);
177 // replace %PAGEDOWN in text2 with button text
178 String aText
= m_ftBody1Txt
.GetText();
179 aText
.SearchAndReplaceAll( UniString::CreateFromAscii("%PAGEDOWN"),
180 MnemonicGenerator::EraseAllMnemonicChars(m_pbDown
.GetText()));
182 m_ftBody1Txt
.SetText( aText
);
185 File
aLicenseFile(rLicensePath
);
186 if ( aLicenseFile
.open(OpenFlag_Read
) == FileBase::E_None
)
189 DirectoryItem::get(rLicensePath
, d
);
190 FileStatus
fs(FileStatusMask_FileSize
);
192 sal_uInt64 nBytesRead
= 0;
193 sal_uInt64 nPosition
= 0;
194 sal_uInt32 nBytes
= (sal_uInt32
)fs
.getFileSize();
195 sal_Char
*pBuffer
= new sal_Char
[nBytes
];
196 // FileBase RC r = FileBase::E_None;
197 while (aLicenseFile
.read(pBuffer
+nPosition
, nBytes
-nPosition
, nBytesRead
) == FileBase::E_None
198 && nPosition
+ nBytesRead
< nBytes
)
200 nPosition
+= nBytesRead
;
202 OUString
aLicenseString(pBuffer
, nBytes
, RTL_TEXTENCODING_UTF8
,
203 OSTRING_TO_OUSTRING_CVTFLAGS
| RTL_TEXTTOUNICODE_FLAGS_GLOBAL_SIGNATURE
);
205 m_mlLicense
.SetText(aLicenseString
);
210 void LicensePage::ActivatePage()
212 OWizardPage::ActivatePage();
213 m_bLicenseRead
= m_mlLicense
.IsEndReached();
214 m_pbDown
.GrabFocus();
215 updateDialogTravelUI();
218 bool LicensePage::canAdvance() const
220 if (m_mlLicense
.IsEndReached())
221 const_cast< LicensePage
* >( this )->m_pbDown
.Disable();
223 const_cast< LicensePage
* >( this )->m_pbDown
.Enable();
225 return m_bLicenseRead
;
228 IMPL_LINK( LicensePage
, PageDownHdl
, PushButton
*, EMPTYARG
)
230 m_mlLicense
.ScrollDown( SCROLL_PAGEDOWN
);
234 IMPL_LINK( LicensePage
, EndReachedHdl
, LicenseView
*, EMPTYARG
)
236 m_bLicenseRead
= TRUE
;
237 updateDialogTravelUI();
241 IMPL_LINK( LicensePage
, ScrolledHdl
, LicenseView
*, EMPTYARG
)
243 updateDialogTravelUI();
248 LicenseView::LicenseView( Window
* pParent
, const ResId
& rResId
)
249 : MultiLineEdit( pParent
, rResId
)
252 mbEndReached
= IsEndReached();
253 StartListening( *GetTextEngine() );
256 LicenseView::~LicenseView()
258 maEndReachedHdl
= Link();
259 maScrolledHdl
= Link();
263 void LicenseView::ScrollDown( ScrollType eScroll
)
265 ScrollBar
* pScroll
= GetVScrollBar();
267 pScroll
->DoScrollAction( eScroll
);
270 BOOL
LicenseView::IsEndReached() const
274 ExtTextView
* pView
= GetTextView();
275 ExtTextEngine
* pEdit
= GetTextEngine();
276 ULONG nHeight
= pEdit
->GetTextHeight();
277 Size aOutSize
= pView
->GetWindow()->GetOutputSizePixel();
278 Point
aBottom( 0, aOutSize
.Height() );
280 if ( (ULONG
) pView
->GetDocPos( aBottom
).Y() >= nHeight
- 1 )
288 void LicenseView::Notify( SfxBroadcaster
&, const SfxHint
& rHint
)
290 if ( rHint
.IsA( TYPE(TextHint
) ) )
292 BOOL bLastVal
= EndReached();
293 ULONG nId
= ((const TextHint
&)rHint
).GetId();
295 if ( nId
== TEXT_HINT_PARAINSERTED
)
298 mbEndReached
= IsEndReached();
300 else if ( nId
== TEXT_HINT_VIEWSCROLLED
)
302 if ( ! mbEndReached
)
303 mbEndReached
= IsEndReached();
304 maScrolledHdl
.Call( this );
307 if ( EndReached() && !bLastVal
)
309 maEndReachedHdl
.Call( this );
316 // -------------------------------------------------------------------
318 MigrationPage::MigrationPage( svt::OWizardMachine
* parent
, const ResId
& resid
)
319 : OWizardPage(parent
, resid
)
320 , m_ftHead(this, WizardResId(FT_MIGRATION_HEADER
))
321 , m_ftBody(this, WizardResId(FT_MIGRATION_BODY
))
322 , m_cbMigration(this, WizardResId(CB_MIGRATION
))
323 , m_bMigrationDone(sal_False
)
328 // replace %OLDPRODUCT with found version name
329 String aText
= m_ftBody
.GetText();
330 aText
.SearchAndReplaceAll( UniString::CreateFromAscii("%OLDPRODUCT"), Migration::getOldVersionName());
331 m_ftBody
.SetText( aText
);
334 sal_Bool
MigrationPage::commitPage( CommitPageReason _eReason
)
336 if (_eReason
== eTravelForward
&& m_cbMigration
.IsChecked() && !m_bMigrationDone
)
339 Migration::doMigration();
341 m_bMigrationDone
= sal_True
;
344 Migration::cancelMigration();
348 void MigrationPage::ActivatePage()
350 OWizardPage::ActivatePage();
354 UserPage::UserPage( svt::OWizardMachine
* parent
, const ResId
& resid
)
355 : OWizardPage(parent
, resid
)
356 , m_ftHead(this, WizardResId(FT_USER_HEADER
))
357 , m_ftBody(this, WizardResId(FT_USER_BODY
))
358 , m_ftFirst(this, WizardResId(FT_USER_FIRST
))
359 , m_edFirst(this, WizardResId(ED_USER_FIRST
))
360 , m_ftLast(this, WizardResId(FT_USER_LAST
))
361 , m_edLast(this, WizardResId(ED_USER_LAST
))
362 , m_ftInitials(this, WizardResId(FT_USER_INITIALS
))
363 , m_edInitials(this, WizardResId(ED_USER_INITIALS
))
364 , m_ftFather(this, WizardResId(FT_USER_FATHER
))
365 , m_edFather(this, WizardResId(ED_USER_FATHER
))
366 , m_lang(Application::GetSettings().GetUILanguage())
371 // check whether this is a russian version. otherwise
372 // we'll hide the 'Fathers name' field
373 SvtUserOptions aUserOpt
;
374 m_edFirst
.SetText(aUserOpt
.GetFirstName());
375 m_edLast
.SetText(aUserOpt
.GetLastName());
376 rtl::OUString aUserName
;
377 vos::OSecurity().getUserName( aUserName
);
378 aUserOpt
.SetID( aUserName
);
380 m_edInitials
.SetText(aUserOpt
.GetID());
381 if (m_lang
== LANGUAGE_RUSSIAN
)
385 m_edFather
.SetText(aUserOpt
.GetFathersName());
389 sal_Bool
UserPage::commitPage( CommitPageReason
)
391 SvtUserOptions aUserOpt
;
392 aUserOpt
.SetFirstName(m_edFirst
.GetText());
393 aUserOpt
.SetLastName(m_edLast
.GetText());
394 aUserOpt
.SetID( m_edInitials
.GetText());
396 if (m_lang
== LANGUAGE_RUSSIAN
)
397 aUserOpt
.SetFathersName(m_edFather
.GetText());
402 void UserPage::ActivatePage()
404 OWizardPage::ActivatePage();
408 // -------------------------------------------------------------------
409 UpdateCheckPage::UpdateCheckPage( svt::OWizardMachine
* parent
, const ResId
& resid
)
410 : OWizardPage(parent
, resid
)
411 , m_ftHead(this, WizardResId(FT_UPDATE_CHECK_HEADER
))
412 , m_ftBody(this, WizardResId(FT_UPDATE_CHECK_BODY
))
413 , m_cbUpdateCheck(this, WizardResId(CB_UPDATE_CHECK
))
419 sal_Bool
UpdateCheckPage::commitPage( CommitPageReason _eReason
)
421 if ( _eReason
== eTravelForward
)
424 Reference
< XNameReplace
> xUpdateAccess
;
425 Reference
< XMultiServiceFactory
> xFactory( ::comphelper::getProcessServiceFactory() );
427 xUpdateAccess
= Reference
< XNameReplace
>(
428 xFactory
->createInstance( UNISTRING( "com.sun.star.setup.UpdateCheckConfig" ) ), UNO_QUERY_THROW
);
430 if ( !xUpdateAccess
.is() )
433 sal_Bool bAutoUpdChk
= m_cbUpdateCheck
.IsChecked();
434 xUpdateAccess
->replaceByName( UNISTRING("AutoCheckEnabled"), makeAny( bAutoUpdChk
) );
436 Reference
< XChangesBatch
> xChangesBatch( xUpdateAccess
, UNO_QUERY
);
437 if( xChangesBatch
.is() && xChangesBatch
->hasPendingChanges() )
438 xChangesBatch
->commitChanges();
439 } catch (RuntimeException
)
447 void UpdateCheckPage::ActivatePage()
449 OWizardPage::ActivatePage();
453 // -------------------------------------------------------------------
454 RegistrationPage::RegistrationPage( Window
* pParent
, const ResId
& rResid
)
455 : OWizardPage( pParent
, rResid
)
456 , m_ftHeader(this, WizardResId(FT_REGISTRATION_HEADER
))
457 , m_ftBody(this, WizardResId(FT_REGISTRATION_BODY
))
458 , m_rbNow(this, WizardResId(RB_REGISTRATION_NOW
))
459 , m_rbLater(this, WizardResId(RB_REGISTRATION_LATER
))
460 , m_rbNever(this, WizardResId(RB_REGISTRATION_NEVER
))
461 , m_flSeparator(this, WizardResId(FL_REGISTRATION
))
462 , m_ftEnd(this, WizardResId(FT_REGISTRATION_END
))
463 , m_bNeverVisible( sal_True
)
467 // another text for OOo
468 sal_Int32 nOpenSourceContext
= 0;
471 ::utl::ConfigManager::GetDirectConfigProperty(
472 ::utl::ConfigManager::OPENSOURCECONTEXT
) >>= nOpenSourceContext
;
476 DBG_ERRORFILE( "RegistrationPage::RegistrationPage(): error while getting open source context" );
479 if ( nOpenSourceContext
> 0 )
481 String
sBodyText( WizardResId( STR_REGISTRATION_OOO
) );
482 m_ftBody
.SetText( sBodyText
);
485 // calculate height of body text and rearrange the buttons
486 Size aSize
= m_ftBody
.GetSizePixel();
487 Size aMinSize
= m_ftBody
.CalcMinimumSize( aSize
.Width() );
488 long nTxtH
= aMinSize
.Height();
489 long nCtrlH
= aSize
.Height();
490 long nDelta
= ( nCtrlH
- nTxtH
);
491 aSize
.Height() -= nDelta
;
492 m_ftBody
.SetSizePixel( aSize
);
493 Window
* pWins
[] = { &m_rbNow
, &m_rbLater
, &m_rbNever
};
494 Window
** pCurrent
= pWins
;
495 for ( sal_uInt32 i
= 0; i
< sizeof( pWins
) / sizeof( pWins
[ 0 ] ); ++i
, ++pCurrent
)
497 Point aNewPos
= (*pCurrent
)->GetPosPixel();
498 aNewPos
.Y() -= nDelta
;
499 (*pCurrent
)->SetPosPixel( aNewPos
);
502 _setBold(m_ftHeader
);
503 impl_retrieveConfigurationData();
504 updateButtonStates();
507 bool RegistrationPage::canAdvance() const
512 void RegistrationPage::ActivatePage()
514 OWizardPage::ActivatePage();
518 void RegistrationPage::impl_retrieveConfigurationData()
520 static ::rtl::OUString PACKAGE
= ::rtl::OUString::createFromAscii("org.openoffice.FirstStartWizard");
521 static ::rtl::OUString PATH
= ::rtl::OUString::createFromAscii("TabPages/Registration/RegistrationOptions/NeverButton");
522 static ::rtl::OUString KEY
= ::rtl::OUString::createFromAscii("Visible");
524 ::com::sun::star::uno::Any aValue
;
527 aValue
= ::comphelper::ConfigurationHelper::readDirectKey(
528 ::comphelper::getProcessServiceFactory(),
532 ::comphelper::ConfigurationHelper::E_READONLY
);
534 catch(const ::com::sun::star::uno::Exception
&)
537 aValue
>>= m_bNeverVisible
;
540 void RegistrationPage::updateButtonStates()
542 m_rbNever
.Show( m_bNeverVisible
);
545 sal_Bool
RegistrationPage::commitPage( CommitPageReason _eReason
)
547 if ( _eReason
== eFinish
)
549 ::svt::RegOptions aOptions
;
550 rtl::OUString aEvent
;
552 if ( m_rbNow
.IsChecked())
554 aEvent
= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RegistrationRequired" ) );
556 else if (m_rbLater
.IsChecked())
558 aOptions
.activateReminder(7);
559 // avtivate a reminder job...
561 // aOptions.markSessionDone();
565 // create the Desktop component which can load components
566 Reference
< XMultiServiceFactory
> xFactory
= ::comphelper::getProcessServiceFactory();
569 Reference
< com::sun::star::task::XJobExecutor
> xProductRegistration(
570 xFactory
->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.setup.ProductRegistration" ) ) ),
573 // tell it that the user wants to register
574 xProductRegistration
->trigger( aEvent
);
577 catch( const Exception
& )
584 RegistrationPage::RegistrationMode
RegistrationPage::getRegistrationMode() const
586 RegistrationPage::RegistrationMode eMode
= rmNow
;
587 if ( m_rbLater
.IsChecked() )
589 else if ( m_rbNever
.IsChecked() )
594 void RegistrationPage::prepareSingleMode()
596 // remove wizard text (hide and cut)
597 m_flSeparator
.Hide();
599 Size aNewSize
= GetSizePixel();
600 aNewSize
.Height() -= ( aNewSize
.Height() - m_flSeparator
.GetPosPixel().Y() );
601 SetSizePixel( aNewSize
);
604 bool RegistrationPage::hasReminderDateCome()
606 return ::svt::RegOptions().hasReminderDateCome();
609 void RegistrationPage::executeSingleMode()
611 // opens the page in a single tabdialog
612 SfxSingleTabDialog
aSingleDlg( NULL
, TP_REGISTRATION
);
613 RegistrationPage
* pPage
= new RegistrationPage( &aSingleDlg
, WizardResId( TP_REGISTRATION
) );
614 pPage
->prepareSingleMode();
615 aSingleDlg
.SetPage( pPage
);
616 aSingleDlg
.SetText( pPage
->getSingleModeTitle() );
617 aSingleDlg
.Execute();
618 // the registration modes "Now" and "Later" are handled by the page
619 RegistrationPage::RegistrationMode eMode
= pPage
->getRegistrationMode();
620 if ( eMode
== RegistrationPage::rmNow
|| eMode
== RegistrationPage::rmLater
)
621 pPage
->commitPage( IWizardPage::eFinish
);
622 if ( eMode
!= RegistrationPage::rmLater
)
623 ::svt::RegOptions().removeReminder();
626 // -----------------------------------------------------------------------
628 static char const OEM_PRELOAD_SECTION
[] = "Bootstrap";
629 static char const OEM_PRELOAD
[] = "Preload";
630 static char const STR_TRUE
[] = "1";
631 static char const STR_FALSE
[] = "0";
633 static sal_Bool
existsURL( OUString
const& _sURL
)
636 DirectoryItem aDirItem
;
638 if (_sURL
.getLength() != 0)
639 return ( DirectoryItem::get( _sURL
, aDirItem
) == DirectoryItem::E_None
);
645 // locate soffice.ini/.rc file
646 static OUString
locateIniFile()
648 OUString aUserDataPath
;
649 OUString aSofficeIniFileURL
;
651 // Retrieve the default file URL for the soffice.ini/rc
652 rtl::Bootstrap().getIniName( aSofficeIniFileURL
);
654 if ( utl::Bootstrap::locateUserData( aUserDataPath
) == utl::Bootstrap::PATH_EXISTS
)
656 const char CONFIG_DIR
[] = "/config";
658 sal_Int32 nIndex
= aSofficeIniFileURL
.lastIndexOf( '/');
661 OUString aUserSofficeIniFileURL
;
662 OUStringBuffer
aBuffer( aUserDataPath
);
663 aBuffer
.appendAscii( CONFIG_DIR
);
664 aBuffer
.append( aSofficeIniFileURL
.copy( nIndex
));
665 aUserSofficeIniFileURL
= aBuffer
.makeStringAndClear();
667 if ( existsURL( aUserSofficeIniFileURL
))
668 return aUserSofficeIniFileURL
;
671 // Fallback try to use the soffice.ini/rc from program folder
672 return aSofficeIniFileURL
;
675 // check whether the OEMPreload flag was set in soffice.ini/.rc
676 static sal_Int32
checkOEMPreloadFlag()
678 OUString aSofficeIniFileURL
;
679 aSofficeIniFileURL
= locateIniFile();
680 Config
aConfig(aSofficeIniFileURL
);
681 aConfig
.SetGroup( OEM_PRELOAD_SECTION
);
682 ByteString sResult
= aConfig
.ReadKey( OEM_PRELOAD
);
683 return sResult
.ToInt32();
685 if ( sResult == STR_TRUE )
692 WelcomePage::OEMType
WelcomePage::checkOEM()
694 sal_Int32 oemResult
= checkOEMPreloadFlag();
705 } // namespace desktop