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_desktop.hxx" 26 27 #include "cppuhelper/implbase2.hxx" 28 #include "cppuhelper/implementationentry.hxx" 29 #include "unotools/configmgr.hxx" 30 #include "comphelper/servicedecl.hxx" 31 #include "comphelper/unwrapargs.hxx" 32 #include "i18npool/mslangid.hxx" 33 #include "vcl/svapp.hxx" 34 #include "vcl/msgbox.hxx" 35 #include "toolkit/helper/vclunohelper.hxx" 36 #include "com/sun/star/lang/XServiceInfo.hpp" 37 #include "com/sun/star/task/XJobExecutor.hpp" 38 #include "svtools/svmedit.hxx" 39 #include "svl/lstner.hxx" 40 #include "svtools/xtextedt.hxx" 41 #include <vcl/scrbar.hxx> 42 #include "vcl/threadex.hxx" 43 44 45 46 #include "boost/bind.hpp" 47 #include "dp_gui_shared.hxx" 48 #include "license_dialog.hxx" 49 #include "dp_gui.hrc" 50 51 using namespace ::dp_misc; 52 namespace cssu = ::com::sun::star::uno; 53 using namespace ::com::sun::star; 54 using namespace ::com::sun::star::uno; 55 using ::rtl::OUString; 56 57 namespace dp_gui { 58 59 class LicenseView : public MultiLineEdit, public SfxListener 60 { 61 sal_Bool mbEndReached; 62 Link maEndReachedHdl; 63 Link maScrolledHdl; 64 65 public: 66 LicenseView( Window* pParent, const ResId& rResId ); 67 ~LicenseView(); 68 69 void ScrollDown( ScrollType eScroll ); 70 71 sal_Bool IsEndReached() const; 72 sal_Bool EndReached() const { return mbEndReached; } 73 void SetEndReached( sal_Bool bEnd ) { mbEndReached = bEnd; } 74 75 void SetEndReachedHdl( const Link& rHdl ) { maEndReachedHdl = rHdl; } 76 const Link& GetAutocompleteHdl() const { return maEndReachedHdl; } 77 78 void SetScrolledHdl( const Link& rHdl ) { maScrolledHdl = rHdl; } 79 const Link& GetScrolledHdl() const { return maScrolledHdl; } 80 81 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); 82 83 protected: 84 using MultiLineEdit::Notify; 85 }; 86 87 struct LicenseDialogImpl : public ModalDialog 88 { 89 cssu::Reference<cssu::XComponentContext> m_xComponentContext; 90 FixedText m_ftHead; 91 FixedText m_ftBody1; 92 FixedText m_ftBody1Txt; 93 FixedText m_ftBody2; 94 FixedText m_ftBody2Txt; 95 FixedImage m_fiArrow1; 96 FixedImage m_fiArrow2; 97 LicenseView m_mlLicense; 98 PushButton m_pbDown; 99 FixedLine m_flBottom; 100 101 OKButton m_acceptButton; 102 CancelButton m_declineButton; 103 104 DECL_LINK(PageDownHdl, PushButton*); 105 DECL_LINK(ScrolledHdl, LicenseView*); 106 DECL_LINK(EndReachedHdl, LicenseView*); 107 108 bool m_bLicenseRead; 109 110 virtual ~LicenseDialogImpl(); 111 112 LicenseDialogImpl( 113 Window * pParent, 114 css::uno::Reference< css::uno::XComponentContext > const & xContext, 115 const ::rtl::OUString & sExtensionName, 116 const ::rtl::OUString & sLicenseText); 117 118 virtual void Activate(); 119 120 }; 121 122 LicenseView::LicenseView( Window* pParent, const ResId& rResId ) 123 : MultiLineEdit( pParent, rResId ) 124 { 125 SetLeftMargin( 5 ); 126 mbEndReached = IsEndReached(); 127 StartListening( *GetTextEngine() ); 128 } 129 130 LicenseView::~LicenseView() 131 { 132 maEndReachedHdl = Link(); 133 maScrolledHdl = Link(); 134 EndListeningAll(); 135 } 136 137 void LicenseView::ScrollDown( ScrollType eScroll ) 138 { 139 ScrollBar* pScroll = GetVScrollBar(); 140 if ( pScroll ) 141 pScroll->DoScrollAction( eScroll ); 142 } 143 144 sal_Bool LicenseView::IsEndReached() const 145 { 146 sal_Bool bEndReached; 147 148 ExtTextView* pView = GetTextView(); 149 ExtTextEngine* pEdit = GetTextEngine(); 150 sal_uLong nHeight = pEdit->GetTextHeight(); 151 Size aOutSize = pView->GetWindow()->GetOutputSizePixel(); 152 Point aBottom( 0, aOutSize.Height() ); 153 154 if ( (sal_uLong) pView->GetDocPos( aBottom ).Y() >= nHeight - 1 ) 155 bEndReached = sal_True; 156 else 157 bEndReached = sal_False; 158 159 return bEndReached; 160 } 161 162 void LicenseView::Notify( SfxBroadcaster&, const SfxHint& rHint ) 163 { 164 if ( rHint.IsA( TYPE(TextHint) ) ) 165 { 166 sal_Bool bLastVal = EndReached(); 167 sal_uLong nId = ((const TextHint&)rHint).GetId(); 168 169 if ( nId == TEXT_HINT_PARAINSERTED ) 170 { 171 if ( bLastVal ) 172 mbEndReached = IsEndReached(); 173 } 174 else if ( nId == TEXT_HINT_VIEWSCROLLED ) 175 { 176 if ( ! mbEndReached ) 177 mbEndReached = IsEndReached(); 178 maScrolledHdl.Call( this ); 179 } 180 181 if ( EndReached() && !bLastVal ) 182 { 183 maEndReachedHdl.Call( this ); 184 } 185 } 186 } 187 188 //============================================================================================================== 189 190 LicenseDialogImpl::LicenseDialogImpl( 191 Window * pParent, 192 cssu::Reference< cssu::XComponentContext > const & xContext, 193 const ::rtl::OUString & sExtensionName, 194 const ::rtl::OUString & sLicenseText): 195 ModalDialog(pParent, DpGuiResId(RID_DLG_LICENSE)) 196 ,m_xComponentContext(xContext) 197 ,m_ftHead(this, DpGuiResId(FT_LICENSE_HEADER)) 198 ,m_ftBody1(this, DpGuiResId(FT_LICENSE_BODY_1)) 199 ,m_ftBody1Txt(this, DpGuiResId(FT_LICENSE_BODY_1_TXT)) 200 ,m_ftBody2(this, DpGuiResId(FT_LICENSE_BODY_2)) 201 ,m_ftBody2Txt(this, DpGuiResId(FT_LICENSE_BODY_2_TXT)) 202 ,m_fiArrow1(this, DpGuiResId(FI_LICENSE_ARROW1)) 203 ,m_fiArrow2(this, DpGuiResId(FI_LICENSE_ARROW2)) 204 ,m_mlLicense(this, DpGuiResId(ML_LICENSE)) 205 ,m_pbDown(this, DpGuiResId(PB_LICENSE_DOWN)) 206 ,m_flBottom(this, DpGuiResId(FL_LICENSE)) 207 ,m_acceptButton(this, DpGuiResId(BTN_LICENSE_ACCEPT)) 208 ,m_declineButton(this, DpGuiResId(BTN_LICENSE_DECLINE)) 209 ,m_bLicenseRead(false) 210 211 { 212 213 if (GetSettings().GetStyleSettings().GetHighContrastMode()) 214 { 215 // high contrast mode needs other images 216 m_fiArrow1.SetImage(Image(DpGuiResId(IMG_LICENCE_ARROW_HC))); 217 m_fiArrow2.SetImage(Image(DpGuiResId(IMG_LICENCE_ARROW_HC))); 218 } 219 220 FreeResource(); 221 222 m_acceptButton.SetUniqueId(UID_BTN_LICENSE_ACCEPT); 223 m_fiArrow1.Show(true); 224 m_fiArrow2.Show(false); 225 m_mlLicense.SetText(sLicenseText); 226 m_ftHead.SetText(m_ftHead.GetText() + OUString('\n') + sExtensionName); 227 228 m_mlLicense.SetEndReachedHdl( LINK(this, LicenseDialogImpl, EndReachedHdl) ); 229 m_mlLicense.SetScrolledHdl( LINK(this, LicenseDialogImpl, ScrolledHdl) ); 230 m_pbDown.SetClickHdl( LINK(this, LicenseDialogImpl, PageDownHdl) ); 231 232 // We want a automatic repeating page down button 233 WinBits aStyle = m_pbDown.GetStyle(); 234 aStyle |= WB_REPEAT; 235 m_pbDown.SetStyle( aStyle ); 236 } 237 238 LicenseDialogImpl::~LicenseDialogImpl() 239 { 240 } 241 242 void LicenseDialogImpl::Activate() 243 { 244 if (!m_bLicenseRead) 245 { 246 //Only enable the scroll down button if the license text does not fit into the window 247 if (m_mlLicense.IsEndReached()) 248 { 249 m_pbDown.Disable(); 250 m_acceptButton.Enable(); 251 m_acceptButton.GrabFocus(); 252 } 253 else 254 { 255 m_pbDown.Enable(); 256 m_pbDown.GrabFocus(); 257 m_acceptButton.Disable(); 258 } 259 } 260 } 261 262 IMPL_LINK( LicenseDialogImpl, ScrolledHdl, LicenseView *, EMPTYARG ) 263 { 264 265 if (m_mlLicense.IsEndReached()) 266 m_pbDown.Disable(); 267 else 268 m_pbDown.Enable(); 269 270 return 0; 271 } 272 273 IMPL_LINK( LicenseDialogImpl, PageDownHdl, PushButton *, EMPTYARG ) 274 { 275 m_mlLicense.ScrollDown( SCROLL_PAGEDOWN ); 276 return 0; 277 } 278 279 IMPL_LINK( LicenseDialogImpl, EndReachedHdl, LicenseView *, EMPTYARG ) 280 { 281 m_acceptButton.Enable(); 282 m_acceptButton.GrabFocus(); 283 m_fiArrow1.Show(false); 284 m_fiArrow2.Show(true); 285 m_bLicenseRead = true; 286 return 0; 287 } 288 289 //================================================================================= 290 291 292 293 294 LicenseDialog::LicenseDialog( Sequence<Any> const& args, 295 Reference<XComponentContext> const& xComponentContext) 296 : m_xComponentContext(xComponentContext) 297 { 298 comphelper::unwrapArgs( args, m_parent, m_sExtensionName, m_sLicenseText ); 299 } 300 301 // XExecutableDialog 302 //______________________________________________________________________________ 303 void LicenseDialog::setTitle( OUString const & ) throw (RuntimeException) 304 { 305 306 } 307 308 //______________________________________________________________________________ 309 sal_Int16 LicenseDialog::execute() throw (RuntimeException) 310 { 311 return vcl::solarthread::syncExecute( 312 boost::bind( &LicenseDialog::solar_execute, this)); 313 } 314 315 sal_Int16 LicenseDialog::solar_execute() 316 { 317 std::auto_ptr<LicenseDialogImpl> dlg( 318 new LicenseDialogImpl( 319 VCLUnoHelper::GetWindow(m_parent), 320 m_xComponentContext, m_sExtensionName, m_sLicenseText)); 321 322 return dlg->Execute(); 323 } 324 325 } // namespace dp_gui 326 327