xref: /trunk/main/cui/source/dialogs/about.cxx (revision 23c0a6f8)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_cui.hxx"
26 
27 // include ---------------------------------------------------------------
28 
29 #include <vcl/svapp.hxx>
30 #include <vcl/msgbox.hxx>
31 #include <tools/stream.hxx>
32 #include <tools/urlobj.hxx>
33 #include <rtl/bootstrap.hxx>
34 #include <unotools/configmgr.hxx>
35 #include <unotools/bootstrap.hxx>
36 #include <com/sun/star/uno/Any.h>
37 #include <vcl/graph.hxx>
38 #include <svtools/filter.hxx>
39 #include <sfx2/sfxuno.hxx>
40 #include "about.hxx"
41 #include <sfx2/sfxdefs.hxx>
42 #include <sfx2/app.hxx>
43 #include <sfx2/sfxcommands.h>
44 #include "about.hrc"
45 #include <dialmgr.hxx>
46 #include <svtools/svtools.hrc>
47 
48 #include <comphelper/processfactory.hxx>
49 #include <com/sun/star/system/XSystemShellExecute.hpp>
50 #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
51 
52 // defines ---------------------------------------------------------------
53 
54 #define _STRINGIFY(x) #x
55 #define STRINGIFY(x) _STRINGIFY(x)
56 
57 // -----------------------------------------------------------------------
58 
59 static void layoutFixedText( FixedText &rControl, const Point& aPos, Size &aSize, const long nTextWidth )
60 {
61     aSize = rControl.GetSizePixel();
62     // change the width
63     aSize.Width() = nTextWidth;
64     // set Position and Size, to calculate the minimum size
65     // this will update the Height
66     rControl.SetPosSizePixel( aPos, aSize );
67     aSize = rControl.CalcMinimumSize();
68     // update the size with the right Height
69     rControl.SetSizePixel( aSize );
70 }
71 
72 static void layoutEdit( Edit &rControl, const Point& aPos, Size &aSize, const long nTextWidth )
73 {
74     aSize = rControl.GetSizePixel();
75     // change the width
76     aSize.Width() = nTextWidth;
77     // set Position and Size, to calculate the minimum size
78     // this will update the Height
79     rControl.SetPosSizePixel( aPos, aSize );
80     aSize = rControl.CalcMinimumSize();
81     // update the size with the right Height
82     rControl.SetSizePixel( aSize );
83 }
84 
85 // -----------------------------------------------------------------------
86 
87 AboutDialog::AboutDialog( Window* pParent, const ResId& rId ) :
88     SfxModalDialog( pParent, rId ),
89     maOKButton( this, ResId( RID_CUI_ABOUT_BTN_OK, *rId.GetResMgr() ) ),
90     maVersionText( this, ResId( RID_CUI_ABOUT_FTXT_VERSION, *rId.GetResMgr() ) ),
91     maBuildInfoEdit( this, ResId( RID_CUI_ABOUT_FTXT_BUILDDATA, *rId.GetResMgr() ) ),
92     maCopyrightEdit( this, ResId( RID_CUI_ABOUT_FTXT_COPYRIGHT, *rId.GetResMgr() ) ),
93     maCreditsLink( this, ResId( RID_CUI_ABOUT_FTXT_WELCOME_LINK, *rId.GetResMgr() )  ),
94     maCopyrightTextStr( ResId( RID_CUI_ABOUT_STR_COPYRIGHT, *rId.GetResMgr() ) )
95 {
96     // load image from module path
97     maAppLogo = SfxApplication::GetApplicationLogo();
98 
99     InitControls();
100 
101     // set links
102     maCreditsLink.SetClickHdl( LINK( this, AboutDialog, OpenLinkHdl_Impl ) );
103 
104     FreeResource();
105 
106     SetHelpId( CMD_SID_ABOUT );
107 }
108 
109 // -----------------------------------------------------------------------
110 
111 AboutDialog::~AboutDialog()
112 {
113 }
114 
115 // -----------------------------------------------------------------------
116 
117 void AboutDialog::InitControls()
118 {
119     // apply font, background et al.
120     ApplyStyleSettings();
121 
122     // set strings
123     maCopyrightEdit.SetText( maCopyrightTextStr );
124     maBuildInfoEdit.SetText( GetBuildVersionString() );
125     maCreditsLink.SetURL( maCreditsLink.GetText() );
126 
127     // determine size and position of the dialog & elements
128     Size aDlgSize;
129     LayoutControls( aDlgSize );
130 
131     // Change the width of the dialog
132     SetOutputSizePixel( aDlgSize );
133 }
134 
135 // -----------------------------------------------------------------------
136 
137 void AboutDialog::ApplyStyleSettings()
138 {
139     // Transparenter Font
140     Font aFont = GetFont();
141     aFont.SetTransparent( sal_True );
142     SetFont( aFont );
143 
144     // set for background and text the correct system color
145     const StyleSettings& rSettings = GetSettings().GetStyleSettings();
146     Color aWhiteCol( rSettings.GetWindowColor() );
147     Wallpaper aWall( aWhiteCol );
148     SetBackground( aWall );
149     Font aNewFont( maCopyrightEdit.GetFont() );
150     aNewFont.SetTransparent( sal_True );
151 
152     maVersionText.SetFont( aNewFont );
153     maCopyrightEdit.SetFont( aNewFont );
154 
155     maVersionText.SetBackground();
156     maCopyrightEdit.SetBackground();
157     maBuildInfoEdit.SetBackground();
158     maCreditsLink.SetBackground();
159 
160     Color aTextColor( rSettings.GetWindowTextColor() );
161     maVersionText.SetControlForeground( aTextColor );
162     maCopyrightEdit.SetControlForeground( aTextColor );
163     maBuildInfoEdit.SetControlForeground( aTextColor );
164     maCreditsLink.SetControlForeground();
165 
166     Size aSmaller = aNewFont.GetSize();
167     aSmaller.Width() = (long) (aSmaller.Width() * 0.75);
168     aSmaller.Height() = (long) (aSmaller.Height() * 0.75);
169     aNewFont.SetSize( aSmaller );
170 
171     maBuildInfoEdit.SetFont( aNewFont );
172 
173     // the following is a hack to force the MultiLineEdit update its settings
174     // in order to reflect the Font
175     // See
176     //      Window::SetControlFont
177     //      MultiLineEdit::StateChanged
178     //      MultiLineEdit::ImplInitSettings
179     // TODO Override SetFont in MultiLineEdit and do the following,
180     // otherwise SetFont has no effect at all!
181     aSmaller = PixelToLogic( aSmaller, MAP_POINT );
182     aNewFont.SetSize( aSmaller );
183     maBuildInfoEdit.SetControlFont( aNewFont );
184 }
185 
186 // -----------------------------------------------------------------------
187 
188 void AboutDialog::LayoutControls( Size& aDlgSize )
189 {
190     Size aAppLogoSiz = maAppLogo.GetSizePixel();
191 
192     aDlgSize = GetOutputSizePixel();
193     aDlgSize.Width() = aAppLogoSiz.Width();
194 
195     Size a6Size      = maVersionText.LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
196     long nY          = aAppLogoSiz.Height() + ( a6Size.Height() * 2 );
197     long nDlgMargin  = a6Size.Width() * 2;
198     long nCtrlMargin = a6Size.Height() * 2;
199     long nTextWidth  = aDlgSize.Width() - ( nDlgMargin * 2 );
200 
201     Point aPos( nDlgMargin, nY );
202     Size aSize;
203     // layout fixed text control
204     layoutFixedText( maVersionText, aPos, aSize, nTextWidth );
205     // set the next control closer
206     nY += aSize.Height() + (nCtrlMargin / 2);
207 
208     // Multiline edit with Build info
209     aPos.Y() = nY;
210     layoutEdit( maBuildInfoEdit, aPos, aSize, nTextWidth );
211     nY += aSize.Height() + nCtrlMargin;
212 
213     // Multiline edit with Copyright-Text
214     aPos.Y() = nY;
215     layoutEdit( maCopyrightEdit, aPos, aSize, nTextWidth );
216     // set the next control closer
217     nY += aSize.Height() + (nCtrlMargin/2);
218 
219     // Hyperlink
220     aPos.Y() = nY;
221     layoutFixedText( maCreditsLink, aPos, aSize, nTextWidth );
222     nY += aSize.Height() + nCtrlMargin;
223 
224     // OK-Button-Position (at the bottom and centered)
225     Size aOKSiz = maOKButton.GetSizePixel();
226     Point aOKPnt( ( aDlgSize.Width() - aOKSiz.Width() ) / 2, nY );
227     maOKButton.SetPosPixel( aOKPnt );
228 
229     aDlgSize.Height() = aOKPnt.Y() + aOKSiz.Height() + nCtrlMargin;
230 }
231 
232 // -----------------------------------------------------------------------
233 
234 const rtl::OUString AboutDialog::GetBuildId() const
235 {
236     rtl::OUString sDefault;
237 
238     // Get buildid from version[rc|.ini]
239     rtl::OUString sBuildId( utl::Bootstrap::getBuildIdData( sDefault ) );
240     OSL_ENSURE( sBuildId.getLength() > 0, "No BUILDID in bootstrap file" );
241     rtl::OUStringBuffer sBuildIdBuff( sBuildId );
242 
243     // Get ProductSource from version[rc|.ini]
244     rtl::OUString sProductSource( utl::Bootstrap::getProductSource( sDefault ) );
245     OSL_ENSURE( sProductSource.getLength() > 0, "No ProductSource in bootstrap file" );
246 
247     // the product source is something like "AOO340",
248     // while the build id is something like "340m1(Build:9590)"
249     // For better readability, strip the duplicate ProductMajor ("340").
250     if ( sProductSource.getLength() )
251     {
252         bool bMatchingUPD =
253                 ( sProductSource.getLength() >= 3 )
254             &&  ( sBuildId.getLength() >= 3 )
255             &&  ( sProductSource.copy( sProductSource.getLength() - 3 ) == sBuildId.copy( 0, 3 ) );
256         OSL_ENSURE( bMatchingUPD, "BUILDID and ProductSource do not match in their UPD" );
257         if ( bMatchingUPD )
258             sProductSource = sProductSource.copy( 0, sProductSource.getLength() - 3 );
259 
260         // prepend the product source
261         sBuildIdBuff.insert( 0, sProductSource );
262     }
263 
264     return sBuildIdBuff.makeStringAndClear();
265 }
266 
267 // -----------------------------------------------------------------------
268 
269 const rtl::OUString AboutDialog::GetBuildVersionString() const
270 {
271     rtl::OUStringBuffer aBuildString( GetBuildId() );
272     rtl::OUString sRevision( utl::Bootstrap::getRevisionInfo() );
273 
274     if ( sRevision.getLength() > 0 )
275     {
276         aBuildString.appendAscii( RTL_CONSTASCII_STRINGPARAM( "  -  Rev. " ) );
277         aBuildString.append( sRevision );
278     }
279 
280 #ifdef BUILD_VER_STRING
281     rtl::OUString sBuildVer( RTL_CONSTASCII_USTRINGPARAM( STRINGIFY( BUILD_VER_STRING ) ) );
282     if ( sBuildVer.getLength() > 0 )
283     {
284         aBuildString.append( sal_Unicode( '\n' ) );
285         aBuildString.append( sBuildVer );
286     }
287 #endif
288 
289     return aBuildString.makeStringAndClear();
290 }
291 
292 // -----------------------------------------------------------------------
293 
294 sal_Bool AboutDialog::Close()
295 {
296     EndDialog( RET_OK );
297     return( sal_False );
298 }
299 
300 // -----------------------------------------------------------------------
301 
302 void AboutDialog::Paint( const Rectangle& rRect )
303 {
304     SetClipRegion( rRect );
305     Point aPos( 0, 0 );
306     DrawImage( aPos, maAppLogo );
307 
308     return;
309 }
310 
311 // -----------------------------------------------------------------------
312 
313 IMPL_LINK ( AboutDialog, OpenLinkHdl_Impl, svt::FixedHyperlink*, EMPTYARG )
314 {
315     ::rtl::OUString sURL( maCreditsLink.GetURL() );
316     if ( sURL.getLength() > 0 )
317     {
318         try
319         {
320             com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > xSMGR =
321                 ::comphelper::getProcessServiceFactory();
322             com::sun::star::uno::Reference< com::sun::star::system::XSystemShellExecute > xSystemShell(
323                 xSMGR->createInstance( ::rtl::OUString(
324                     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.system.SystemShellExecute" ) ) ),
325                 com::sun::star::uno::UNO_QUERY_THROW );
326             if ( xSystemShell.is() )
327                 xSystemShell->execute( sURL, ::rtl::OUString(), com::sun::star::system::SystemShellExecuteFlags::DEFAULTS );
328         }
329         catch( const com::sun::star::uno::Exception& e )
330         {
331              OSL_TRACE( "Caught exception: %s\n thread terminated.\n",
332                 rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
333         }
334     }
335     return 0;
336 }
337