xref: /aoo4110/main/cui/source/dialogs/about.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_cui.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
28*b1cdbd2cSJim Jagielski #include <dialmgr.hxx>
29*b1cdbd2cSJim Jagielski #include <osl/file.hxx>
30*b1cdbd2cSJim Jagielski #include <rtl/bootstrap.hxx>
31*b1cdbd2cSJim Jagielski //#include <rtl/ustrbuf.hxx>
32*b1cdbd2cSJim Jagielski #include <sfx2/sfxcommands.h>
33*b1cdbd2cSJim Jagielski #include <sfx2/sfxdefs.hxx>
34*b1cdbd2cSJim Jagielski #include <sfx2/sfxuno.hxx>
35*b1cdbd2cSJim Jagielski #include <svtools/filter.hxx>
36*b1cdbd2cSJim Jagielski #include <svtools/svtools.hrc>
37*b1cdbd2cSJim Jagielski #include <tools/stream.hxx>
38*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
39*b1cdbd2cSJim Jagielski #include <unotools/bootstrap.hxx>
40*b1cdbd2cSJim Jagielski #include <unotools/configmgr.hxx>
41*b1cdbd2cSJim Jagielski #include <vcl/graph.hxx>
42*b1cdbd2cSJim Jagielski #include <vcl/imagerepository.hxx>
43*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
44*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
45*b1cdbd2cSJim Jagielski #include <vcl/tabctrl.hxx>
46*b1cdbd2cSJim Jagielski #include <vcl/tabdlg.hxx>
47*b1cdbd2cSJim Jagielski #include <vcl/tabpage.hxx>
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/system/SystemShellExecute.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Any.h>
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski #include "about.hxx"
54*b1cdbd2cSJim Jagielski #include "about.hrc"
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski #define _STRINGIFY(x) #x
57*b1cdbd2cSJim Jagielski #define STRINGIFY(x) _STRINGIFY(x)
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski /* On Windows/OS2, all the three files have .txt extension
60*b1cdbd2cSJim Jagielski    and the README file name is in lowercase
61*b1cdbd2cSJim Jagielski    Readme files are localized and have the locale in their file name:
62*b1cdbd2cSJim Jagielski    README_de README_en-US
63*b1cdbd2cSJim Jagielski */
64*b1cdbd2cSJim Jagielski #if defined(WNT) || defined(OS2)
65*b1cdbd2cSJim Jagielski #define FILE_EXTENSION  ".txt"
66*b1cdbd2cSJim Jagielski #define README_FILE     "readme"
67*b1cdbd2cSJim Jagielski #else
68*b1cdbd2cSJim Jagielski #define FILE_EXTENSION
69*b1cdbd2cSJim Jagielski #define README_FILE     "README"
70*b1cdbd2cSJim Jagielski #endif
71*b1cdbd2cSJim Jagielski #define LICENSE_FILE    "LICENSE" FILE_EXTENSION
72*b1cdbd2cSJim Jagielski #define NOTICE_FILE     "NOTICE"  FILE_EXTENSION
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski // Dir where the files are located
75*b1cdbd2cSJim Jagielski #define OOO_DIR_SHARE_README  "${OOO_BASE_DIR}/share/readme/"
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski using namespace com::sun::star;
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski namespace
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski 
lcl_layoutFixedText(FixedText & rControl,const Point & aPos,Size & aSize,const long nTextWidth)82*b1cdbd2cSJim Jagielski     static void lcl_layoutFixedText( FixedText &rControl,
83*b1cdbd2cSJim Jagielski                                      const Point& aPos,
84*b1cdbd2cSJim Jagielski                                      Size &aSize,
85*b1cdbd2cSJim Jagielski                                      const long nTextWidth )
86*b1cdbd2cSJim Jagielski     {
87*b1cdbd2cSJim Jagielski         aSize = rControl.GetSizePixel();
88*b1cdbd2cSJim Jagielski         // change the width
89*b1cdbd2cSJim Jagielski         aSize.Width() = nTextWidth;
90*b1cdbd2cSJim Jagielski         // set Position and Size, to calculate the minimum size
91*b1cdbd2cSJim Jagielski         // this will update the Height
92*b1cdbd2cSJim Jagielski         rControl.SetPosSizePixel( aPos, aSize );
93*b1cdbd2cSJim Jagielski         aSize = rControl.CalcMinimumSize();
94*b1cdbd2cSJim Jagielski         // update the size with the right Height
95*b1cdbd2cSJim Jagielski         rControl.SetSizePixel( aSize );
96*b1cdbd2cSJim Jagielski     }
97*b1cdbd2cSJim Jagielski 
lcl_layoutEdit(Edit & rControl,const Point & aPos,Size & aSize,const long nTextWidth)98*b1cdbd2cSJim Jagielski     static void lcl_layoutEdit( Edit &rControl,
99*b1cdbd2cSJim Jagielski                                 const Point& aPos,
100*b1cdbd2cSJim Jagielski                                 Size &aSize,
101*b1cdbd2cSJim Jagielski                                 const long nTextWidth )
102*b1cdbd2cSJim Jagielski     {
103*b1cdbd2cSJim Jagielski         aSize = rControl.GetSizePixel();
104*b1cdbd2cSJim Jagielski         // change the width
105*b1cdbd2cSJim Jagielski         aSize.Width() = nTextWidth;
106*b1cdbd2cSJim Jagielski         // set Position and Size, to calculate the minimum size
107*b1cdbd2cSJim Jagielski         // this will update the Height
108*b1cdbd2cSJim Jagielski         rControl.SetPosSizePixel( aPos, aSize );
109*b1cdbd2cSJim Jagielski         aSize = rControl.CalcMinimumSize();
110*b1cdbd2cSJim Jagielski         // update the size with the right Height
111*b1cdbd2cSJim Jagielski         rControl.SetSizePixel( aSize );
112*b1cdbd2cSJim Jagielski     }
113*b1cdbd2cSJim Jagielski 
lcl_readTxtFile(const rtl::OUString & rFile,rtl::OUString & sText)114*b1cdbd2cSJim Jagielski     static  void lcl_readTxtFile( const rtl::OUString &rFile, rtl::OUString &sText )
115*b1cdbd2cSJim Jagielski     {
116*b1cdbd2cSJim Jagielski         rtl::OUString sFile( rFile );
117*b1cdbd2cSJim Jagielski         rtl::Bootstrap::expandMacros( sFile );
118*b1cdbd2cSJim Jagielski         osl::File aFile(sFile);
119*b1cdbd2cSJim Jagielski         if ( aFile.open(OpenFlag_Read) == osl::FileBase::E_None )
120*b1cdbd2cSJim Jagielski         {
121*b1cdbd2cSJim Jagielski             osl::DirectoryItem aItem;
122*b1cdbd2cSJim Jagielski             osl::DirectoryItem::get(sFile, aItem);
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski             osl::FileStatus aStatus(FileStatusMask_FileSize);
125*b1cdbd2cSJim Jagielski             aItem.getFileStatus(aStatus);
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski             sal_uInt64 nBytesRead = 0;
128*b1cdbd2cSJim Jagielski             sal_uInt64 nPosition = 0;
129*b1cdbd2cSJim Jagielski             sal_uInt32 nBytes = (sal_uInt32)aStatus.getFileSize();
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski             sal_Char *pBuffer = new sal_Char[nBytes];
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski             while ( aFile.read( pBuffer + nPosition,
134*b1cdbd2cSJim Jagielski                                 nBytes-nPosition,
135*b1cdbd2cSJim Jagielski                                 nBytesRead ) == osl::FileBase::E_None
136*b1cdbd2cSJim Jagielski                     && nPosition + nBytesRead < nBytes)
137*b1cdbd2cSJim Jagielski             {
138*b1cdbd2cSJim Jagielski                 nPosition += nBytesRead;
139*b1cdbd2cSJim Jagielski             }
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski             OSL_ENSURE( nBytes < STRING_MAXLEN, "Text file has too much bytes!" );
142*b1cdbd2cSJim Jagielski             if ( nBytes > STRING_MAXLEN )
143*b1cdbd2cSJim Jagielski                 nBytes = STRING_MAXLEN - 1;
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski             sText = rtl::OUString( pBuffer,
146*b1cdbd2cSJim Jagielski                                 nBytes,
147*b1cdbd2cSJim Jagielski                                 RTL_TEXTENCODING_UTF8,
148*b1cdbd2cSJim Jagielski                                 OSTRING_TO_OUSTRING_CVTFLAGS
149*b1cdbd2cSJim Jagielski                                 | RTL_TEXTTOUNICODE_FLAGS_GLOBAL_SIGNATURE);
150*b1cdbd2cSJim Jagielski             delete[] pBuffer;
151*b1cdbd2cSJim Jagielski         }
152*b1cdbd2cSJim Jagielski     }
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski     class ReadmeDialog;
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski     class ReadmeTabPage : public TabPage
157*b1cdbd2cSJim Jagielski     {
158*b1cdbd2cSJim Jagielski     private:
159*b1cdbd2cSJim Jagielski         MultiLineEdit maText;
160*b1cdbd2cSJim Jagielski         String        msText;
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski     public:
163*b1cdbd2cSJim Jagielski         ReadmeTabPage(Window *pParent, const String &sText);
164*b1cdbd2cSJim Jagielski         ~ReadmeTabPage();
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski         void Adjust(const Size &aSz, const Size &a6Size);
167*b1cdbd2cSJim Jagielski     };
168*b1cdbd2cSJim Jagielski 
ReadmeTabPage(Window * pParent,const String & sText)169*b1cdbd2cSJim Jagielski     ReadmeTabPage::ReadmeTabPage(Window *pParent, const String &sText)
170*b1cdbd2cSJim Jagielski         : TabPage(pParent, CUI_RES( RID_CUI_README_TBPAGE))
171*b1cdbd2cSJim Jagielski         ,maText( this, CUI_RES( RID_CUI_README_TBPAGE_EDIT ))
172*b1cdbd2cSJim Jagielski         ,msText( sText )
173*b1cdbd2cSJim Jagielski     {
174*b1cdbd2cSJim Jagielski         FreeResource();
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski         maText.SetText(msText);
177*b1cdbd2cSJim Jagielski         maText.Show();
178*b1cdbd2cSJim Jagielski     }
179*b1cdbd2cSJim Jagielski 
~ReadmeTabPage()180*b1cdbd2cSJim Jagielski     ReadmeTabPage::~ReadmeTabPage()
181*b1cdbd2cSJim Jagielski     {
182*b1cdbd2cSJim Jagielski     }
183*b1cdbd2cSJim Jagielski 
Adjust(const Size & aSz,const Size & a6Size)184*b1cdbd2cSJim Jagielski     void ReadmeTabPage::Adjust(const Size &aSz, const Size &a6Size)
185*b1cdbd2cSJim Jagielski     {
186*b1cdbd2cSJim Jagielski         long nDlgMargin  = a6Size.Width() * 2;
187*b1cdbd2cSJim Jagielski         long nCtrlMargin = a6Size.Height() * 2;
188*b1cdbd2cSJim Jagielski         maText.SetPosPixel( Point(a6Size.Width(), a6Size.Height()) );
189*b1cdbd2cSJim Jagielski         maText.SetSizePixel( Size(aSz.Width() - nDlgMargin, aSz.Height() - nCtrlMargin) );
190*b1cdbd2cSJim Jagielski     }
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski     class ReadmeDialog : public ModalDialog
193*b1cdbd2cSJim Jagielski     {
194*b1cdbd2cSJim Jagielski     private:
195*b1cdbd2cSJim Jagielski         TabControl      maTabCtrl;
196*b1cdbd2cSJim Jagielski         OKButton        maBtnOK;
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski         ReadmeTabPage  *maReadmeTabPage;
199*b1cdbd2cSJim Jagielski         ReadmeTabPage  *maLicenseTabPage;
200*b1cdbd2cSJim Jagielski         ReadmeTabPage  *maNoticeTabPage;
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski         DECL_LINK( ActivatePageHdl, TabControl * );
203*b1cdbd2cSJim Jagielski         DECL_LINK( DeactivatePageHdl, TabControl * );
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski     public:
206*b1cdbd2cSJim Jagielski         ReadmeDialog( Window* );
207*b1cdbd2cSJim Jagielski         ~ReadmeDialog();
208*b1cdbd2cSJim Jagielski     };
209*b1cdbd2cSJim Jagielski 
ReadmeDialog(Window * pParent)210*b1cdbd2cSJim Jagielski     ReadmeDialog::ReadmeDialog( Window * pParent )
211*b1cdbd2cSJim Jagielski         : ModalDialog( pParent, CUI_RES( RID_CUI_README_DLG ) )
212*b1cdbd2cSJim Jagielski         , maTabCtrl( this, CUI_RES(RID_CUI_README_TBCTL) )
213*b1cdbd2cSJim Jagielski         , maBtnOK( this, CUI_RES(RID_CUI_README_OKBTN) )
214*b1cdbd2cSJim Jagielski         , maReadmeTabPage(0)
215*b1cdbd2cSJim Jagielski         , maLicenseTabPage(0)
216*b1cdbd2cSJim Jagielski         , maNoticeTabPage(0)
217*b1cdbd2cSJim Jagielski     {
218*b1cdbd2cSJim Jagielski         FreeResource();
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski         maTabCtrl.Show();
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski         // Notice and License are not localized
223*b1cdbd2cSJim Jagielski         const rtl::OUString sLicense( RTL_CONSTASCII_USTRINGPARAM( OOO_DIR_SHARE_README LICENSE_FILE ) );
224*b1cdbd2cSJim Jagielski         const rtl::OUString sNotice( RTL_CONSTASCII_USTRINGPARAM(  OOO_DIR_SHARE_README NOTICE_FILE ) );
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski         // get localized README
227*b1cdbd2cSJim Jagielski         rtl::OUStringBuffer aBuff;
228*b1cdbd2cSJim Jagielski         lang::Locale aLocale = Application::GetSettings().GetUILocale();
229*b1cdbd2cSJim Jagielski         aBuff.appendAscii( RTL_CONSTASCII_STRINGPARAM( OOO_DIR_SHARE_README README_FILE "_" ) );
230*b1cdbd2cSJim Jagielski         aBuff.append( aLocale.Language );
231*b1cdbd2cSJim Jagielski         if ( aLocale.Country.getLength() )
232*b1cdbd2cSJim Jagielski         {
233*b1cdbd2cSJim Jagielski             aBuff.append( sal_Unicode( '-') );
234*b1cdbd2cSJim Jagielski             aBuff.append( aLocale.Country );
235*b1cdbd2cSJim Jagielski             if ( aLocale.Variant.getLength() )
236*b1cdbd2cSJim Jagielski             {
237*b1cdbd2cSJim Jagielski                 aBuff.append( sal_Unicode( '-' ) );
238*b1cdbd2cSJim Jagielski                 aBuff.append( aLocale.Variant );
239*b1cdbd2cSJim Jagielski             }
240*b1cdbd2cSJim Jagielski         }
241*b1cdbd2cSJim Jagielski #if defined(WNT) || defined(OS2)
242*b1cdbd2cSJim Jagielski         aBuff.appendAscii( RTL_CONSTASCII_STRINGPARAM( FILE_EXTENSION ) );
243*b1cdbd2cSJim Jagielski #endif
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski         rtl::OUString sReadmeTxt, sLicenseTxt, sNoticeTxt;
246*b1cdbd2cSJim Jagielski         lcl_readTxtFile( aBuff.makeStringAndClear(), sReadmeTxt );
247*b1cdbd2cSJim Jagielski         lcl_readTxtFile( sLicense, sLicenseTxt );
248*b1cdbd2cSJim Jagielski         lcl_readTxtFile( sNotice, sNoticeTxt );
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski         maReadmeTabPage = new ReadmeTabPage( &maTabCtrl, sReadmeTxt );
251*b1cdbd2cSJim Jagielski         maLicenseTabPage = new ReadmeTabPage( &maTabCtrl, sLicenseTxt );
252*b1cdbd2cSJim Jagielski         maNoticeTabPage = new ReadmeTabPage( &maTabCtrl, sNoticeTxt );
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski         maTabCtrl.SetTabPage( RID_CUI_READMEPAGE, maReadmeTabPage );
255*b1cdbd2cSJim Jagielski         maTabCtrl.SetTabPage( RID_CUI_LICENSEPAGE, maLicenseTabPage );
256*b1cdbd2cSJim Jagielski         maTabCtrl.SetTabPage( RID_CUI_NOTICEPAGE, maNoticeTabPage );
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski         maTabCtrl.SelectTabPage( RID_CUI_READMEPAGE );
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski         Size aTpSz  = maReadmeTabPage->GetOutputSizePixel();
261*b1cdbd2cSJim Jagielski         Size a6Size = maReadmeTabPage->LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski         maReadmeTabPage->Adjust( aTpSz, a6Size );
264*b1cdbd2cSJim Jagielski         maLicenseTabPage->Adjust( aTpSz, a6Size );
265*b1cdbd2cSJim Jagielski         maNoticeTabPage->Adjust( aTpSz, a6Size );
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski         Size aDlgSize = GetOutputSizePixel();
268*b1cdbd2cSJim Jagielski         Size aOkBtnSz = maBtnOK.GetSizePixel();
269*b1cdbd2cSJim Jagielski         Point aOKPnt( aDlgSize.Width() / 2 - aOkBtnSz.Width() / 2 , maBtnOK.GetPosPixel().Y() );
270*b1cdbd2cSJim Jagielski         maBtnOK.SetPosPixel( aOKPnt );
271*b1cdbd2cSJim Jagielski     }
272*b1cdbd2cSJim Jagielski 
~ReadmeDialog()273*b1cdbd2cSJim Jagielski     ReadmeDialog::~ReadmeDialog()
274*b1cdbd2cSJim Jagielski     {
275*b1cdbd2cSJim Jagielski         delete maReadmeTabPage;
276*b1cdbd2cSJim Jagielski         delete maLicenseTabPage;
277*b1cdbd2cSJim Jagielski         delete maNoticeTabPage;
278*b1cdbd2cSJim Jagielski     }
279*b1cdbd2cSJim Jagielski }
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
282*b1cdbd2cSJim Jagielski 
AboutDialog(Window * pParent,const ResId & rId)283*b1cdbd2cSJim Jagielski AboutDialog::AboutDialog( Window* pParent, const ResId  & rId ) :
284*b1cdbd2cSJim Jagielski     SfxModalDialog( pParent, rId ),
285*b1cdbd2cSJim Jagielski     maOKButton( this, ResId( RID_CUI_ABOUT_BTN_OK, *rId.GetResMgr() ) ),
286*b1cdbd2cSJim Jagielski     maReadmeButton( this, ResId( RID_CUI_ABOUT_BTN_README, *rId.GetResMgr() ) ),
287*b1cdbd2cSJim Jagielski     maVersionText( this, ResId( RID_CUI_ABOUT_FTXT_VERSION, *rId.GetResMgr() ) ),
288*b1cdbd2cSJim Jagielski     maBuildInfoEdit( this, ResId( RID_CUI_ABOUT_FTXT_BUILDDATA, *rId.GetResMgr() ) ),
289*b1cdbd2cSJim Jagielski     maCopyrightEdit( this, ResId( RID_CUI_ABOUT_FTXT_COPYRIGHT, *rId.GetResMgr() ) ),
290*b1cdbd2cSJim Jagielski     maCreditsLink( this, ResId( RID_CUI_ABOUT_FTXT_WELCOME_LINK, *rId.GetResMgr() )  )
291*b1cdbd2cSJim Jagielski //    maCopyrightTextStr( ResId( RID_CUI_ABOUT_STR_COPYRIGHT, *rId.GetResMgr() ) )
292*b1cdbd2cSJim Jagielski {
293*b1cdbd2cSJim Jagielski     bool bLoad = vcl::ImageRepository::loadBrandingImage(
294*b1cdbd2cSJim Jagielski             rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("about")),
295*b1cdbd2cSJim Jagielski             maAppLogo );
296*b1cdbd2cSJim Jagielski     OSL_ENSURE( bLoad, "Can't load about image");
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski     bLoad = vcl::ImageRepository::loadBrandingImage(
299*b1cdbd2cSJim Jagielski             rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("logo")),
300*b1cdbd2cSJim Jagielski             maMainLogo );
301*b1cdbd2cSJim Jagielski     OSL_ENSURE( bLoad, "Can't load logo image");
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski     const String vendor( ResId( RID_CUI_ABOUT_STR_COPYRIGHT_VENDOR, *rId.GetResMgr() ) );
304*b1cdbd2cSJim Jagielski     String createdRes( ResId( RID_CUI_ABOUT_STR_CREATED, *rId.GetResMgr() ) );
305*b1cdbd2cSJim Jagielski     if ( !vendor.EqualsAscii("Apache Software Foundation") ) {
306*b1cdbd2cSJim Jagielski         createdRes = String( ResId( RID_CUI_ABOUT_STR_CREATED_VENDOR, *rId.GetResMgr() ));
307*b1cdbd2cSJim Jagielski     }
308*b1cdbd2cSJim Jagielski     const String copyrightAcknowledge( ResId( RID_CUI_ABOUT_STR_ACKNOWLEDGE, *rId.GetResMgr() ) );
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski     rtl::OUStringBuffer sbcopyright(250);
311*b1cdbd2cSJim Jagielski     sbcopyright.appendAscii("Copyright ");
312*b1cdbd2cSJim Jagielski     sbcopyright.append((sal_Unicode)0x00a9);
313*b1cdbd2cSJim Jagielski     sbcopyright.appendAscii(" ");
314*b1cdbd2cSJim Jagielski // TODO:
315*b1cdbd2cSJim Jagielski //   This date needs to be updated each year... do this automagically
316*b1cdbd2cSJim Jagielski //
317*b1cdbd2cSJim Jagielski     rtl::OUString sYear( RTL_CONSTASCII_USTRINGPARAM("2021") );
318*b1cdbd2cSJim Jagielski     if (vendor.EqualsAscii("Apache Software Foundation")) {
319*b1cdbd2cSJim Jagielski         sbcopyright.append(sYear);
320*b1cdbd2cSJim Jagielski         sbcopyright.appendAscii(" The Apache Software Foundation.\n\n");
321*b1cdbd2cSJim Jagielski     } else {
322*b1cdbd2cSJim Jagielski #ifdef COPYRIGHT_YEAR
323*b1cdbd2cSJim Jagielski         const rtl::OUString sDefYear( RTL_CONSTASCII_USTRINGPARAM( STRINGIFY( COPYRIGHT_YEAR ) ) );
324*b1cdbd2cSJim Jagielski         if ( sDefYear.getLength() > 0 )
325*b1cdbd2cSJim Jagielski         {
326*b1cdbd2cSJim Jagielski             sYear = sDefYear;
327*b1cdbd2cSJim Jagielski         }
328*b1cdbd2cSJim Jagielski #endif
329*b1cdbd2cSJim Jagielski         sbcopyright.append(sYear);
330*b1cdbd2cSJim Jagielski         sbcopyright.appendAscii(" ");
331*b1cdbd2cSJim Jagielski         sbcopyright.append(vendor);
332*b1cdbd2cSJim Jagielski         sbcopyright.appendAscii(".\nPortion copyright The Apache Software Foundation.\n\n");
333*b1cdbd2cSJim Jagielski     }
334*b1cdbd2cSJim Jagielski     sbcopyright.append( createdRes );
335*b1cdbd2cSJim Jagielski     sbcopyright.appendAscii("\n\n");
336*b1cdbd2cSJim Jagielski     sbcopyright.append( copyrightAcknowledge );
337*b1cdbd2cSJim Jagielski     maCopyrightTextStr = sbcopyright.makeStringAndClear();
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski     InitControls();
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski     // set links
342*b1cdbd2cSJim Jagielski     maReadmeButton.SetClickHdl( LINK( this, AboutDialog, ShowReadme_Impl ) );
343*b1cdbd2cSJim Jagielski     maCreditsLink.SetClickHdl( LINK( this, AboutDialog, OpenLinkHdl_Impl ) );
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski     FreeResource();
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski     SetHelpId( CMD_SID_ABOUT );
348*b1cdbd2cSJim Jagielski }
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
351*b1cdbd2cSJim Jagielski 
~AboutDialog()352*b1cdbd2cSJim Jagielski AboutDialog::~AboutDialog()
353*b1cdbd2cSJim Jagielski {
354*b1cdbd2cSJim Jagielski }
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
357*b1cdbd2cSJim Jagielski 
InitControls()358*b1cdbd2cSJim Jagielski void AboutDialog::InitControls()
359*b1cdbd2cSJim Jagielski {
360*b1cdbd2cSJim Jagielski     // apply font, background et al.
361*b1cdbd2cSJim Jagielski     ApplyStyleSettings();
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski     // set strings
364*b1cdbd2cSJim Jagielski     maCopyrightEdit.SetText( maCopyrightTextStr );
365*b1cdbd2cSJim Jagielski     maBuildInfoEdit.SetText( GetBuildVersionString() );
366*b1cdbd2cSJim Jagielski     maCreditsLink.SetURL( maCreditsLink.GetText() );
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski     // determine size and position of the dialog & elements
369*b1cdbd2cSJim Jagielski     Size aDlgSize;
370*b1cdbd2cSJim Jagielski     LayoutControls( aDlgSize );
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski     // Change the width of the dialog
373*b1cdbd2cSJim Jagielski     SetOutputSizePixel( aDlgSize );
374*b1cdbd2cSJim Jagielski }
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
377*b1cdbd2cSJim Jagielski 
ApplyStyleSettings()378*b1cdbd2cSJim Jagielski void AboutDialog::ApplyStyleSettings()
379*b1cdbd2cSJim Jagielski {
380*b1cdbd2cSJim Jagielski     // Transparenter Font
381*b1cdbd2cSJim Jagielski     Font aFont = GetFont();
382*b1cdbd2cSJim Jagielski     aFont.SetTransparent( sal_True );
383*b1cdbd2cSJim Jagielski     SetFont( aFont );
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski     // set for background and text the correct system color
386*b1cdbd2cSJim Jagielski     const StyleSettings& rSettings = GetSettings().GetStyleSettings();
387*b1cdbd2cSJim Jagielski     Color aWindowColor( rSettings.GetWindowColor() );
388*b1cdbd2cSJim Jagielski     Wallpaper aWall( aWindowColor );
389*b1cdbd2cSJim Jagielski     SetBackground( aWall );
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski     Font aNewFont( maCopyrightEdit.GetFont() );
392*b1cdbd2cSJim Jagielski     aNewFont.SetTransparent( sal_True );
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski     maVersionText.SetFont( aNewFont );
395*b1cdbd2cSJim Jagielski     maCopyrightEdit.SetFont( aNewFont );
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski     maVersionText.SetBackground(aWall);
398*b1cdbd2cSJim Jagielski     maCopyrightEdit.SetBackground(aWall);
399*b1cdbd2cSJim Jagielski     maBuildInfoEdit.SetBackground(aWall);
400*b1cdbd2cSJim Jagielski     maCreditsLink.SetBackground(aWall);
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski     Color aTextColor( rSettings.GetWindowTextColor() );
403*b1cdbd2cSJim Jagielski     maVersionText.SetControlForeground( aTextColor );
404*b1cdbd2cSJim Jagielski     maCopyrightEdit.SetControlForeground( aTextColor );
405*b1cdbd2cSJim Jagielski     maBuildInfoEdit.SetControlForeground( aTextColor );
406*b1cdbd2cSJim Jagielski     maCreditsLink.SetControlForeground();
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski     Size aSmaller = aNewFont.GetSize();
409*b1cdbd2cSJim Jagielski     aSmaller.Width() = (long) (aSmaller.Width() * 0.75);
410*b1cdbd2cSJim Jagielski     aSmaller.Height() = (long) (aSmaller.Height() * 0.75);
411*b1cdbd2cSJim Jagielski     aNewFont.SetSize( aSmaller );
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski     maBuildInfoEdit.SetFont( aNewFont );
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski     // the following is a hack to force the MultiLineEdit update its settings
416*b1cdbd2cSJim Jagielski     // in order to reflect the Font
417*b1cdbd2cSJim Jagielski     // See
418*b1cdbd2cSJim Jagielski     //      Window::SetControlFont
419*b1cdbd2cSJim Jagielski     //      MultiLineEdit::StateChanged
420*b1cdbd2cSJim Jagielski     //      MultiLineEdit::ImplInitSettings
421*b1cdbd2cSJim Jagielski     // TODO Override SetFont in MultiLineEdit and do the following,
422*b1cdbd2cSJim Jagielski     // otherwise SetFont has no effect at all!
423*b1cdbd2cSJim Jagielski     aSmaller = PixelToLogic( aSmaller, MAP_POINT );
424*b1cdbd2cSJim Jagielski     aNewFont.SetSize( aSmaller );
425*b1cdbd2cSJim Jagielski     maBuildInfoEdit.SetControlFont( aNewFont );
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
429*b1cdbd2cSJim Jagielski 
LayoutControls(Size & aDlgSize)430*b1cdbd2cSJim Jagielski void AboutDialog::LayoutControls( Size& aDlgSize )
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski     Size aMainLogoSz = maMainLogo.GetSizePixel();
433*b1cdbd2cSJim Jagielski     Size aAppLogoSiz = maAppLogo.GetSizePixel();
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski     aDlgSize = GetOutputSizePixel();
436*b1cdbd2cSJim Jagielski     long nCol1 = aMainLogoSz.Width();
437*b1cdbd2cSJim Jagielski     long nCol2 = aAppLogoSiz.Width() ? aAppLogoSiz.Width() : aDlgSize.Width();
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski     Size a6Size      = maVersionText.LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
440*b1cdbd2cSJim Jagielski     long nDlgMargin  = a6Size.Width() * 2;
441*b1cdbd2cSJim Jagielski     long nCtrlMargin = a6Size.Height() * 2;
442*b1cdbd2cSJim Jagielski     long nTextWidth  = nCol2 - nDlgMargin;
443*b1cdbd2cSJim Jagielski     long nY          = aAppLogoSiz.Height() + a6Size.Height();
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski     aDlgSize.Width() = nCol1 + a6Size.Width() + nCol2;
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski     Point aPos( nCol1 + a6Size.Width(), nY );
448*b1cdbd2cSJim Jagielski     Size aSize;
449*b1cdbd2cSJim Jagielski     // layout fixed text control
450*b1cdbd2cSJim Jagielski     lcl_layoutFixedText( maVersionText, aPos, aSize, nTextWidth );
451*b1cdbd2cSJim Jagielski     nY += aSize.Height() + a6Size.Height();
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski     // Multiline edit with Build info
454*b1cdbd2cSJim Jagielski     aPos.Y() = nY;
455*b1cdbd2cSJim Jagielski     lcl_layoutEdit( maBuildInfoEdit, aPos, aSize, nTextWidth );
456*b1cdbd2cSJim Jagielski     nY += aSize.Height() + a6Size.Height();
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski     // Multiline edit with Copyright-Text
459*b1cdbd2cSJim Jagielski     aPos.Y() = nY;
460*b1cdbd2cSJim Jagielski     lcl_layoutEdit( maCopyrightEdit, aPos, aSize, nTextWidth );
461*b1cdbd2cSJim Jagielski     nY += aSize.Height() + a6Size.Height();
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski     // Hyperlink
464*b1cdbd2cSJim Jagielski     aPos.Y() = nY;
465*b1cdbd2cSJim Jagielski     lcl_layoutFixedText( maCreditsLink, aPos, aSize, nTextWidth );
466*b1cdbd2cSJim Jagielski     nY += aSize.Height();
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski     nY = std::max( nY, aMainLogoSz.Height() );
469*b1cdbd2cSJim Jagielski     nY += nCtrlMargin;
470*b1cdbd2cSJim Jagielski 
471*b1cdbd2cSJim Jagielski     // logos position
472*b1cdbd2cSJim Jagielski     maMainLogoPos = Point( 0, nY / 2 - aMainLogoSz.Height() / 2 );
473*b1cdbd2cSJim Jagielski     maAppLogoPos = Point( nCol1 + a6Size.Width(), 0 );
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski     // OK-Button-Position (at the bottom and centered)
476*b1cdbd2cSJim Jagielski     Size aOKSiz = maOKButton.GetSizePixel();
477*b1cdbd2cSJim Jagielski     Point aOKPnt( ( aDlgSize.Width() - aOKSiz.Width() ) - a6Size.Width(), nY );
478*b1cdbd2cSJim Jagielski     maOKButton.SetPosPixel( aOKPnt );
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski     maReadmeButton.SetPosPixel( Point(a6Size.Width(), nY) );
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski     aDlgSize.Height() = aOKPnt.Y() + aOKSiz.Height() + a6Size.Width();
483*b1cdbd2cSJim Jagielski }
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
486*b1cdbd2cSJim Jagielski 
GetBuildId() const487*b1cdbd2cSJim Jagielski const rtl::OUString AboutDialog::GetBuildId() const
488*b1cdbd2cSJim Jagielski {
489*b1cdbd2cSJim Jagielski     rtl::OUString sDefault;
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski     // Get buildid from version[rc|.ini]
492*b1cdbd2cSJim Jagielski     rtl::OUString sBuildId( utl::Bootstrap::getBuildIdData( sDefault ) );
493*b1cdbd2cSJim Jagielski     OSL_ENSURE( sBuildId.getLength() > 0, "No BUILDID in bootstrap file" );
494*b1cdbd2cSJim Jagielski     rtl::OUStringBuffer sBuildIdBuff( sBuildId );
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski     // Get ProductSource from version[rc|.ini]
497*b1cdbd2cSJim Jagielski     rtl::OUString sProductSource( utl::Bootstrap::getProductSource( sDefault ) );
498*b1cdbd2cSJim Jagielski     OSL_ENSURE( sProductSource.getLength() > 0, "No ProductSource in bootstrap file" );
499*b1cdbd2cSJim Jagielski 
500*b1cdbd2cSJim Jagielski     // the product source is something like "AOO340",
501*b1cdbd2cSJim Jagielski     // while the build id is something like "340m1(Build:9590)"
502*b1cdbd2cSJim Jagielski     // For better readability, strip the duplicate ProductMajor ("340").
503*b1cdbd2cSJim Jagielski     if ( sProductSource.getLength() )
504*b1cdbd2cSJim Jagielski     {
505*b1cdbd2cSJim Jagielski         sal_Int32 nMajorLength = sProductSource.getLength() - 3;
506*b1cdbd2cSJim Jagielski         bool bMatchingUPD =
507*b1cdbd2cSJim Jagielski                 ( sProductSource.getLength() >= 3 )
508*b1cdbd2cSJim Jagielski             &&  ( sBuildId.getLength() >= nMajorLength )
509*b1cdbd2cSJim Jagielski             &&  ( sProductSource.copy( 3 ) == sBuildId.copy( 0, nMajorLength ) );
510*b1cdbd2cSJim Jagielski         OSL_ENSURE( bMatchingUPD, "BUILDID and ProductSource do not match in their UPD" );
511*b1cdbd2cSJim Jagielski         if ( bMatchingUPD )
512*b1cdbd2cSJim Jagielski             sProductSource = sProductSource.copy( 0, sProductSource.getLength() - nMajorLength );
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski         // prepend the product source
515*b1cdbd2cSJim Jagielski         sBuildIdBuff.insert( 0, sProductSource );
516*b1cdbd2cSJim Jagielski     }
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski     return sBuildIdBuff.makeStringAndClear();
519*b1cdbd2cSJim Jagielski }
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
522*b1cdbd2cSJim Jagielski 
GetBuildVersionString() const523*b1cdbd2cSJim Jagielski const rtl::OUString AboutDialog::GetBuildVersionString() const
524*b1cdbd2cSJim Jagielski {
525*b1cdbd2cSJim Jagielski     rtl::OUStringBuffer aBuildString( GetBuildId() );
526*b1cdbd2cSJim Jagielski     rtl::OUString sRevision( utl::Bootstrap::getRevisionInfo() );
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski     if ( sRevision.getLength() > 0 )
529*b1cdbd2cSJim Jagielski     {
530*b1cdbd2cSJim Jagielski         aBuildString.appendAscii( RTL_CONSTASCII_STRINGPARAM( "  -  Rev. " ) );
531*b1cdbd2cSJim Jagielski         aBuildString.append( sRevision );
532*b1cdbd2cSJim Jagielski     }
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski #ifdef BUILD_VER_STRING
535*b1cdbd2cSJim Jagielski     rtl::OUString sBuildVer( RTL_CONSTASCII_USTRINGPARAM( STRINGIFY( BUILD_VER_STRING ) ) );
536*b1cdbd2cSJim Jagielski     if ( sBuildVer.getLength() > 0 )
537*b1cdbd2cSJim Jagielski     {
538*b1cdbd2cSJim Jagielski         aBuildString.append( sal_Unicode( '\n' ) );
539*b1cdbd2cSJim Jagielski         aBuildString.append( sBuildVer );
540*b1cdbd2cSJim Jagielski     }
541*b1cdbd2cSJim Jagielski #endif
542*b1cdbd2cSJim Jagielski 
543*b1cdbd2cSJim Jagielski     return aBuildString.makeStringAndClear();
544*b1cdbd2cSJim Jagielski }
545*b1cdbd2cSJim Jagielski 
546*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
547*b1cdbd2cSJim Jagielski 
Close()548*b1cdbd2cSJim Jagielski sal_Bool AboutDialog::Close()
549*b1cdbd2cSJim Jagielski {
550*b1cdbd2cSJim Jagielski     EndDialog( RET_OK );
551*b1cdbd2cSJim Jagielski     return( sal_False );
552*b1cdbd2cSJim Jagielski }
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
555*b1cdbd2cSJim Jagielski 
Paint(const Rectangle & rRect)556*b1cdbd2cSJim Jagielski void AboutDialog::Paint( const Rectangle& rRect )
557*b1cdbd2cSJim Jagielski {
558*b1cdbd2cSJim Jagielski     SetClipRegion( rRect );
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski     // workaround to ensure that the background is painted correct
561*b1cdbd2cSJim Jagielski     // on MacOS for exmaple the background was grey and the image and other controls white
562*b1cdbd2cSJim Jagielski     SetFillColor(GetSettings().GetStyleSettings().GetWindowColor());
563*b1cdbd2cSJim Jagielski     SetLineColor();
564*b1cdbd2cSJim Jagielski     DrawRect(rRect);
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski     DrawImage( maMainLogoPos, maMainLogo );
567*b1cdbd2cSJim Jagielski     DrawImage( maAppLogoPos, maAppLogo );
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski     return;
570*b1cdbd2cSJim Jagielski }
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
573*b1cdbd2cSJim Jagielski 
IMPL_LINK(AboutDialog,OpenLinkHdl_Impl,svt::FixedHyperlink *,EMPTYARG)574*b1cdbd2cSJim Jagielski IMPL_LINK ( AboutDialog, OpenLinkHdl_Impl, svt::FixedHyperlink*, EMPTYARG )
575*b1cdbd2cSJim Jagielski {
576*b1cdbd2cSJim Jagielski     ::rtl::OUString sURL( maCreditsLink.GetURL() );
577*b1cdbd2cSJim Jagielski     if ( sURL.getLength() > 0 )
578*b1cdbd2cSJim Jagielski     {
579*b1cdbd2cSJim Jagielski         try
580*b1cdbd2cSJim Jagielski         {
581*b1cdbd2cSJim Jagielski             uno::Reference< com::sun::star::system::XSystemShellExecute > xSystemShell(
582*b1cdbd2cSJim Jagielski                 com::sun::star::system::SystemShellExecute::create(
583*b1cdbd2cSJim Jagielski                     ::comphelper::getProcessComponentContext() ) );
584*b1cdbd2cSJim Jagielski             if ( xSystemShell.is() )
585*b1cdbd2cSJim Jagielski                 xSystemShell->execute( sURL, rtl::OUString(), com::sun::star::system::SystemShellExecuteFlags::DEFAULTS );
586*b1cdbd2cSJim Jagielski         }
587*b1cdbd2cSJim Jagielski         catch( const uno::Exception& e )
588*b1cdbd2cSJim Jagielski         {
589*b1cdbd2cSJim Jagielski              OSL_TRACE( "Caught exception: %s\n thread terminated.\n",
590*b1cdbd2cSJim Jagielski                 rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
591*b1cdbd2cSJim Jagielski         }
592*b1cdbd2cSJim Jagielski     }
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski     return 0;
595*b1cdbd2cSJim Jagielski }
596*b1cdbd2cSJim Jagielski 
IMPL_LINK(AboutDialog,ShowReadme_Impl,PushButton *,EMPTYARG)597*b1cdbd2cSJim Jagielski IMPL_LINK ( AboutDialog, ShowReadme_Impl, PushButton*, EMPTYARG )
598*b1cdbd2cSJim Jagielski {
599*b1cdbd2cSJim Jagielski     ReadmeDialog aDlg( this );
600*b1cdbd2cSJim Jagielski     aDlg.Execute();
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski     return 0;
603*b1cdbd2cSJim Jagielski }
604