Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "dp_gui.hrc"
21 : #include <svtools/controldims.hrc>
22 : #include <svtools/svtools.hrc>
23 :
24 : #include "dp_gui.h"
25 : #include "dp_gui_dialog2.hxx"
26 : #include "dp_gui_extlistbox.hxx"
27 : #include "dp_gui_shared.hxx"
28 : #include "dp_gui_theextmgr.hxx"
29 : #include "dp_gui_extensioncmdqueue.hxx"
30 : #include "dp_misc.h"
31 : #include "dp_ucb.h"
32 : #include "dp_update.hxx"
33 : #include "dp_identifier.hxx"
34 : #include "dp_descriptioninfoset.hxx"
35 :
36 : #include <vcl/ctrl.hxx>
37 : #include <vcl/menu.hxx>
38 : #include <vcl/layout.hxx>
39 : #include <vcl/scrbar.hxx>
40 : #include <vcl/svapp.hxx>
41 :
42 : #include <osl/mutex.hxx>
43 :
44 : #include <svtools/extensionlistbox.hxx>
45 :
46 : #include <sfx2/sfxdlg.hxx>
47 :
48 : #include <comphelper/anytostring.hxx>
49 : #include <cppuhelper/exc_hlp.hxx>
50 : #include <cppuhelper/bootstrap.hxx>
51 :
52 : #include <comphelper/processfactory.hxx>
53 : #include <ucbhelper/content.hxx>
54 : #include <unotools/collatorwrapper.hxx>
55 : #include <unotools/configmgr.hxx>
56 :
57 : #include <com/sun/star/beans/StringPair.hpp>
58 :
59 : #include <com/sun/star/i18n/CollatorOptions.hpp>
60 :
61 : #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
62 : #include <com/sun/star/system/SystemShellExecute.hpp>
63 :
64 : #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
65 : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
66 : #include <com/sun/star/ui/dialogs/FilePicker.hpp>
67 : #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
68 :
69 : #include <com/sun/star/uno/Any.hxx>
70 : #include <com/sun/star/uno/XComponentContext.hpp>
71 :
72 : #include <map>
73 : #include <vector>
74 : #include <boost/scoped_ptr.hpp>
75 : #include <boost/shared_ptr.hpp>
76 :
77 : using namespace ::com::sun::star;
78 : using namespace ::com::sun::star::system;
79 :
80 :
81 :
82 : namespace dp_gui {
83 :
84 : #define TOP_OFFSET 5
85 :
86 : #define USER_PACKAGE_MANAGER "user"
87 : #define SHARED_PACKAGE_MANAGER "shared"
88 : #define BUNDLED_PACKAGE_MANAGER "bundled"
89 :
90 :
91 : struct StrAllFiles : public rtl::StaticWithInit< OUString, StrAllFiles >
92 : {
93 0 : const OUString operator () () {
94 0 : const SolarMutexGuard guard;
95 0 : ::std::unique_ptr< ResMgr > const resmgr( ResMgr::CreateResMgr( "fps_office" ) );
96 : OSL_ASSERT( resmgr.get() != 0 );
97 0 : return ResId(STR_FILTERNAME_ALL, *resmgr.get()).toString();
98 : }
99 : };
100 :
101 :
102 : // ExtBoxWithBtns_Impl
103 :
104 :
105 : enum MENU_COMMAND
106 : {
107 : CMD_NONE = 0,
108 : CMD_REMOVE = 1,
109 : CMD_ENABLE,
110 : CMD_DISABLE,
111 : CMD_UPDATE,
112 : CMD_SHOW_LICENSE
113 : };
114 :
115 : class ExtBoxWithBtns_Impl : public ExtensionBox_Impl
116 : {
117 : bool m_bInterfaceLocked;
118 :
119 : PushButton *m_pOptionsBtn;
120 : PushButton *m_pEnableBtn;
121 : PushButton *m_pRemoveBtn;
122 :
123 : ExtMgrDialog *m_pParent;
124 :
125 : void SetButtonPos( const Rectangle& rRect );
126 : void SetButtonStatus( const TEntry_Impl pEntry );
127 : bool HandleTabKey( bool bReverse );
128 : MENU_COMMAND ShowPopupMenu( const Point &rPos, const long nPos );
129 :
130 :
131 : DECL_DLLPRIVATE_LINK( ScrollHdl, ScrollBar * );
132 :
133 : DECL_DLLPRIVATE_LINK( HandleOptionsBtn, void * );
134 : DECL_DLLPRIVATE_LINK( HandleEnableBtn, void * );
135 : DECL_DLLPRIVATE_LINK( HandleRemoveBtn, void * );
136 :
137 : public:
138 : ExtBoxWithBtns_Impl(vcl::Window* pParent);
139 : virtual ~ExtBoxWithBtns_Impl();
140 :
141 : void InitFromDialog(ExtMgrDialog *pParentDialog);
142 :
143 : virtual void MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
144 : virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
145 :
146 : virtual void RecalcAll() SAL_OVERRIDE;
147 : virtual void selectEntry( const long nPos ) SAL_OVERRIDE;
148 :
149 : void enableButtons( bool bEnable );
150 : };
151 :
152 0 : ExtBoxWithBtns_Impl::ExtBoxWithBtns_Impl(vcl::Window* pParent)
153 : : ExtensionBox_Impl(pParent)
154 : , m_bInterfaceLocked(false)
155 : , m_pOptionsBtn(NULL)
156 : , m_pEnableBtn(NULL)
157 : , m_pRemoveBtn(NULL)
158 0 : , m_pParent(NULL)
159 : {
160 0 : }
161 :
162 0 : void ExtBoxWithBtns_Impl::InitFromDialog(ExtMgrDialog *pParentDialog)
163 : {
164 0 : setExtensionManager(pParentDialog->getExtensionManager());
165 :
166 0 : m_pParent = pParentDialog;
167 :
168 0 : m_pOptionsBtn = new PushButton( this, WB_TABSTOP );
169 0 : m_pEnableBtn = new PushButton( this, WB_TABSTOP );
170 0 : m_pRemoveBtn = new PushButton( this, WB_TABSTOP );
171 :
172 0 : SetHelpId( HID_EXTENSION_MANAGER_LISTBOX );
173 0 : m_pOptionsBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_OPTIONS );
174 0 : m_pEnableBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_DISABLE );
175 0 : m_pRemoveBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_REMOVE );
176 :
177 0 : m_pOptionsBtn->SetClickHdl( LINK( this, ExtBoxWithBtns_Impl, HandleOptionsBtn ) );
178 0 : m_pEnableBtn->SetClickHdl( LINK( this, ExtBoxWithBtns_Impl, HandleEnableBtn ) );
179 0 : m_pRemoveBtn->SetClickHdl( LINK( this, ExtBoxWithBtns_Impl, HandleRemoveBtn ) );
180 :
181 0 : m_pOptionsBtn->SetText( DialogHelper::getResourceString( RID_CTX_ITEM_OPTIONS ) );
182 0 : m_pEnableBtn->SetText( DialogHelper::getResourceString( RID_CTX_ITEM_DISABLE ) );
183 0 : m_pRemoveBtn->SetText( DialogHelper::getResourceString( RID_CTX_ITEM_REMOVE ) );
184 :
185 : Size aSize = LogicToPixel( Size( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ),
186 0 : MapMode( MAP_APPFONT ) );
187 0 : m_pOptionsBtn->SetSizePixel( aSize );
188 0 : m_pEnableBtn->SetSizePixel( aSize );
189 0 : m_pRemoveBtn->SetSizePixel( aSize );
190 :
191 0 : SetExtraSize( aSize.Height() + 2 * TOP_OFFSET );
192 :
193 0 : SetScrollHdl( LINK( this, ExtBoxWithBtns_Impl, ScrollHdl ) );
194 0 : }
195 :
196 :
197 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeExtBoxWithBtns(vcl::Window *pParent, VclBuilder::stringmap &)
198 : {
199 0 : return new ExtBoxWithBtns_Impl(pParent);
200 : }
201 :
202 :
203 0 : ExtBoxWithBtns_Impl::~ExtBoxWithBtns_Impl()
204 : {
205 0 : delete m_pOptionsBtn;
206 0 : delete m_pEnableBtn;
207 0 : delete m_pRemoveBtn;
208 0 : }
209 :
210 :
211 0 : void ExtBoxWithBtns_Impl::RecalcAll()
212 : {
213 0 : const sal_Int32 nActive = getSelIndex();
214 :
215 0 : if ( nActive != svt::IExtensionListBox::ENTRY_NOTFOUND )
216 : {
217 0 : SetButtonStatus( GetEntryData( nActive) );
218 : }
219 : else
220 : {
221 0 : m_pOptionsBtn->Hide();
222 0 : m_pEnableBtn->Hide();
223 0 : m_pRemoveBtn->Hide();
224 : }
225 :
226 0 : ExtensionBox_Impl::RecalcAll();
227 :
228 0 : if ( nActive != svt::IExtensionListBox::ENTRY_NOTFOUND )
229 0 : SetButtonPos( GetEntryRect( nActive ) );
230 0 : }
231 :
232 :
233 :
234 : //This function may be called with nPos < 0
235 0 : void ExtBoxWithBtns_Impl::selectEntry( const long nPos )
236 : {
237 0 : if ( HasActive() && ( nPos == getSelIndex() ) )
238 0 : return;
239 :
240 0 : ExtensionBox_Impl::selectEntry( nPos );
241 : }
242 :
243 :
244 0 : void ExtBoxWithBtns_Impl::SetButtonPos( const Rectangle& rRect )
245 : {
246 0 : Size aBtnSize( m_pOptionsBtn->GetSizePixel() );
247 0 : Point aBtnPos( rRect.Left() + ICON_OFFSET,
248 0 : rRect.Bottom() - TOP_OFFSET - aBtnSize.Height() );
249 :
250 0 : m_pOptionsBtn->SetPosPixel( aBtnPos );
251 0 : aBtnPos.X() = rRect.Right() - TOP_OFFSET - aBtnSize.Width();
252 0 : m_pRemoveBtn->SetPosPixel( aBtnPos );
253 0 : aBtnPos.X() -= ( TOP_OFFSET + aBtnSize.Width() );
254 0 : m_pEnableBtn->SetPosPixel( aBtnPos );
255 0 : }
256 :
257 :
258 0 : void ExtBoxWithBtns_Impl::SetButtonStatus( const TEntry_Impl pEntry )
259 : {
260 0 : bool bShowOptionBtn = true;
261 :
262 0 : pEntry->m_bHasButtons = false;
263 0 : if ( ( pEntry->m_eState == REGISTERED ) || ( pEntry->m_eState == NOT_AVAILABLE ) )
264 : {
265 0 : m_pEnableBtn->SetText( DialogHelper::getResourceString( RID_CTX_ITEM_DISABLE ) );
266 0 : m_pEnableBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_DISABLE );
267 : }
268 : else
269 : {
270 0 : m_pEnableBtn->SetText( DialogHelper::getResourceString( RID_CTX_ITEM_ENABLE ) );
271 0 : m_pEnableBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_ENABLE );
272 0 : bShowOptionBtn = false;
273 : }
274 :
275 0 : if ( ( !pEntry->m_bUser || ( pEntry->m_eState == NOT_AVAILABLE ) || pEntry->m_bMissingDeps )
276 0 : && !pEntry->m_bMissingLic )
277 0 : m_pEnableBtn->Hide();
278 : else
279 : {
280 0 : m_pEnableBtn->Enable( !pEntry->m_bLocked );
281 0 : m_pEnableBtn->Show();
282 0 : pEntry->m_bHasButtons = true;
283 : }
284 :
285 0 : if ( pEntry->m_bHasOptions && bShowOptionBtn )
286 : {
287 0 : m_pOptionsBtn->Enable( pEntry->m_bHasOptions );
288 0 : m_pOptionsBtn->Show();
289 0 : pEntry->m_bHasButtons = true;
290 : }
291 : else
292 0 : m_pOptionsBtn->Hide();
293 :
294 0 : if ( pEntry->m_bUser || pEntry->m_bShared )
295 : {
296 0 : m_pRemoveBtn->Enable( !pEntry->m_bLocked );
297 0 : m_pRemoveBtn->Show();
298 0 : pEntry->m_bHasButtons = true;
299 : }
300 : else
301 0 : m_pRemoveBtn->Hide();
302 0 : }
303 :
304 :
305 0 : bool ExtBoxWithBtns_Impl::HandleTabKey( bool bReverse )
306 : {
307 0 : sal_Int32 nIndex = getSelIndex();
308 :
309 0 : if ( nIndex == svt::IExtensionListBox::ENTRY_NOTFOUND )
310 0 : return false;
311 :
312 0 : PushButton *pNext = NULL;
313 :
314 0 : if ( m_pOptionsBtn->HasFocus() ) {
315 0 : if ( !bReverse && !GetEntryData( nIndex )->m_bLocked )
316 0 : pNext = m_pEnableBtn;
317 : }
318 0 : else if ( m_pEnableBtn->HasFocus() ) {
319 0 : if ( !bReverse )
320 0 : pNext = m_pRemoveBtn;
321 0 : else if ( GetEntryData( nIndex )->m_bHasOptions )
322 0 : pNext = m_pOptionsBtn;
323 : }
324 0 : else if ( m_pRemoveBtn->HasFocus() ) {
325 0 : if ( bReverse )
326 0 : pNext = m_pEnableBtn;
327 : }
328 : else {
329 0 : if ( !bReverse ) {
330 0 : if ( GetEntryData( nIndex )->m_bHasOptions )
331 0 : pNext = m_pOptionsBtn;
332 0 : else if ( ! GetEntryData( nIndex )->m_bLocked )
333 0 : pNext = m_pEnableBtn;
334 : } else {
335 0 : if ( ! GetEntryData( nIndex )->m_bLocked )
336 0 : pNext = m_pRemoveBtn;
337 0 : else if ( GetEntryData( nIndex )->m_bHasOptions )
338 0 : pNext = m_pOptionsBtn;
339 : }
340 : }
341 :
342 0 : if ( pNext )
343 : {
344 0 : pNext->GrabFocus();
345 0 : return true;
346 : }
347 : else
348 0 : return false;
349 : }
350 :
351 :
352 0 : MENU_COMMAND ExtBoxWithBtns_Impl::ShowPopupMenu( const Point & rPos, const long nPos )
353 : {
354 0 : if ( nPos >= (long) getItemCount() )
355 0 : return CMD_NONE;
356 :
357 0 : PopupMenu aPopup;
358 :
359 0 : aPopup.InsertItem( CMD_UPDATE, DialogHelper::getResourceString( RID_CTX_ITEM_CHECK_UPDATE ) );
360 :
361 0 : if ( ! GetEntryData( nPos )->m_bLocked )
362 : {
363 0 : if ( GetEntryData( nPos )->m_bUser )
364 : {
365 0 : if ( GetEntryData( nPos )->m_eState == REGISTERED )
366 0 : aPopup.InsertItem( CMD_DISABLE, DialogHelper::getResourceString( RID_CTX_ITEM_DISABLE ) );
367 0 : else if ( GetEntryData( nPos )->m_eState != NOT_AVAILABLE )
368 0 : aPopup.InsertItem( CMD_ENABLE, DialogHelper::getResourceString( RID_CTX_ITEM_ENABLE ) );
369 : }
370 0 : aPopup.InsertItem( CMD_REMOVE, DialogHelper::getResourceString( RID_CTX_ITEM_REMOVE ) );
371 : }
372 :
373 0 : if ( !GetEntryData( nPos )->m_sLicenseText.isEmpty() )
374 0 : aPopup.InsertItem( CMD_SHOW_LICENSE, DialogHelper::getResourceString( RID_STR_SHOW_LICENSE_CMD ) );
375 :
376 0 : return (MENU_COMMAND) aPopup.Execute( this, rPos );
377 : }
378 :
379 :
380 0 : void ExtBoxWithBtns_Impl::MouseButtonDown( const MouseEvent& rMEvt )
381 : {
382 0 : if ( m_bInterfaceLocked )
383 0 : return;
384 :
385 0 : const Point aMousePos( rMEvt.GetPosPixel() );
386 0 : const long nPos = PointToPos( aMousePos );
387 :
388 0 : if ( rMEvt.IsRight() )
389 : {
390 0 : switch( ShowPopupMenu( aMousePos, nPos ) )
391 : {
392 0 : case CMD_NONE: break;
393 0 : case CMD_ENABLE: m_pParent->enablePackage( GetEntryData( nPos )->m_xPackage, true );
394 0 : break;
395 0 : case CMD_DISABLE: m_pParent->enablePackage( GetEntryData( nPos )->m_xPackage, false );
396 0 : break;
397 0 : case CMD_UPDATE: m_pParent->updatePackage( GetEntryData( nPos )->m_xPackage );
398 0 : break;
399 0 : case CMD_REMOVE: m_pParent->removePackage( GetEntryData( nPos )->m_xPackage );
400 0 : break;
401 : case CMD_SHOW_LICENSE:
402 : {
403 0 : ShowLicenseDialog aLicenseDlg( m_pParent, GetEntryData( nPos )->m_xPackage );
404 0 : aLicenseDlg.Execute();
405 0 : break;
406 : }
407 : }
408 : }
409 0 : else if ( rMEvt.IsLeft() )
410 : {
411 0 : const SolarMutexGuard aGuard;
412 0 : if ( rMEvt.IsMod1() && HasActive() )
413 0 : selectEntry( svt::IExtensionListBox::ENTRY_NOTFOUND );
414 : // selecting a not existing entry will deselect the current one
415 : else
416 0 : selectEntry( nPos );
417 : }
418 : }
419 :
420 :
421 0 : bool ExtBoxWithBtns_Impl::Notify( NotifyEvent& rNEvt )
422 : {
423 0 : bool bHandled = false;
424 :
425 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
426 : {
427 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
428 0 : vcl::KeyCode aKeyCode = pKEvt->GetKeyCode();
429 0 : sal_uInt16 nKeyCode = aKeyCode.GetCode();
430 :
431 0 : if ( nKeyCode == KEY_TAB )
432 0 : bHandled = HandleTabKey( aKeyCode.IsShift() );
433 : }
434 :
435 0 : if ( !bHandled )
436 0 : return ExtensionBox_Impl::Notify( rNEvt );
437 : else
438 0 : return true;
439 : }
440 :
441 :
442 0 : void ExtBoxWithBtns_Impl::enableButtons( bool bEnable )
443 : {
444 0 : m_bInterfaceLocked = ! bEnable;
445 :
446 0 : if ( bEnable )
447 : {
448 0 : sal_Int32 nIndex = getSelIndex();
449 0 : if ( nIndex != svt::IExtensionListBox::ENTRY_NOTFOUND )
450 0 : SetButtonStatus( GetEntryData( nIndex ) );
451 : }
452 : else
453 : {
454 0 : m_pOptionsBtn->Enable( false );
455 0 : m_pRemoveBtn->Enable( false );
456 0 : m_pEnableBtn->Enable( false );
457 : }
458 0 : }
459 :
460 :
461 0 : IMPL_LINK( ExtBoxWithBtns_Impl, ScrollHdl, ScrollBar*, pScrBar )
462 : {
463 0 : long nDelta = pScrBar->GetDelta();
464 :
465 0 : Point aNewOptPt( m_pOptionsBtn->GetPosPixel() - Point( 0, nDelta ) );
466 0 : Point aNewRemPt( m_pRemoveBtn->GetPosPixel() - Point( 0, nDelta ) );
467 0 : Point aNewEnPt( m_pEnableBtn->GetPosPixel() - Point( 0, nDelta ) );
468 :
469 0 : DoScroll( nDelta );
470 :
471 0 : m_pOptionsBtn->SetPosPixel( aNewOptPt );
472 0 : m_pRemoveBtn->SetPosPixel( aNewRemPt );
473 0 : m_pEnableBtn->SetPosPixel( aNewEnPt );
474 :
475 0 : return 1;
476 : }
477 :
478 :
479 0 : IMPL_LINK_NOARG(ExtBoxWithBtns_Impl, HandleOptionsBtn)
480 : {
481 0 : const sal_Int32 nActive = getSelIndex();
482 :
483 0 : if ( nActive != svt::IExtensionListBox::ENTRY_NOTFOUND )
484 : {
485 0 : SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
486 :
487 0 : if ( pFact )
488 : {
489 0 : OUString sExtensionId = GetEntryData( nActive )->m_xPackage->getIdentifier().Value;
490 0 : boost::scoped_ptr<VclAbstractDialog> pDlg(pFact->CreateOptionsDialog( this, sExtensionId, OUString() ));
491 :
492 0 : pDlg->Execute();
493 : }
494 : }
495 :
496 0 : return 1;
497 : }
498 :
499 :
500 0 : IMPL_LINK_NOARG(ExtBoxWithBtns_Impl, HandleEnableBtn)
501 : {
502 0 : const sal_Int32 nActive = getSelIndex();
503 :
504 0 : if ( nActive != svt::IExtensionListBox::ENTRY_NOTFOUND )
505 : {
506 0 : TEntry_Impl pEntry = GetEntryData( nActive );
507 :
508 0 : if ( pEntry->m_bMissingLic )
509 0 : m_pParent->acceptLicense( pEntry->m_xPackage );
510 : else
511 : {
512 0 : const bool bEnable( pEntry->m_eState != REGISTERED );
513 0 : m_pParent->enablePackage( pEntry->m_xPackage, bEnable );
514 0 : }
515 : }
516 :
517 0 : return 1;
518 : }
519 :
520 :
521 0 : IMPL_LINK_NOARG(ExtBoxWithBtns_Impl, HandleRemoveBtn)
522 : {
523 0 : const sal_Int32 nActive = getSelIndex();
524 :
525 0 : if ( nActive != svt::IExtensionListBox::ENTRY_NOTFOUND )
526 : {
527 0 : TEntry_Impl pEntry = GetEntryData( nActive );
528 0 : m_pParent->removePackage( pEntry->m_xPackage );
529 : }
530 :
531 0 : return 1;
532 : }
533 :
534 :
535 : // DialogHelper
536 :
537 0 : DialogHelper::DialogHelper( const uno::Reference< uno::XComponentContext > &xContext,
538 : Dialog *pWindow ) :
539 : m_pVCLWindow( pWindow ),
540 : m_nEventID( 0 ),
541 0 : m_bIsBusy( false )
542 : {
543 0 : m_xContext = xContext;
544 0 : }
545 :
546 :
547 0 : DialogHelper::~DialogHelper()
548 : {
549 0 : if ( m_nEventID )
550 0 : Application::RemoveUserEvent( m_nEventID );
551 0 : }
552 :
553 :
554 0 : ResId DialogHelper::getResId( sal_uInt16 nId )
555 : {
556 0 : const SolarMutexGuard guard;
557 0 : return ResId( nId, *DeploymentGuiResMgr::get() );
558 : }
559 :
560 :
561 0 : OUString DialogHelper::getResourceString(sal_uInt16 id)
562 : {
563 0 : const SolarMutexGuard guard;
564 0 : OUString ret(ResId(id, *DeploymentGuiResMgr::get()).toString());
565 0 : if (ret.indexOf("%PRODUCTNAME" ) != -1)
566 : {
567 0 : ret = ret.replaceAll("%PRODUCTNAME", utl::ConfigManager::getProductName());
568 : }
569 0 : return ret;
570 : }
571 :
572 :
573 0 : bool DialogHelper::IsSharedPkgMgr( const uno::Reference< deployment::XPackage > &xPackage )
574 : {
575 0 : if ( xPackage->getRepositoryName() == SHARED_PACKAGE_MANAGER )
576 0 : return true;
577 : else
578 0 : return false;
579 : }
580 :
581 :
582 0 : bool DialogHelper::continueOnSharedExtension( const uno::Reference< deployment::XPackage > &xPackage,
583 : vcl::Window *pParent,
584 : const sal_uInt16 nResID,
585 : bool &bHadWarning )
586 : {
587 0 : if ( !bHadWarning && IsSharedPkgMgr( xPackage ) )
588 : {
589 0 : const SolarMutexGuard guard;
590 0 : MessageDialog aInfoBox(pParent, getResId(nResID),
591 0 : VCL_MESSAGE_WARNING, VCL_BUTTONS_OK_CANCEL);
592 :
593 0 : bHadWarning = true;
594 :
595 0 : if ( RET_OK == aInfoBox.Execute() )
596 0 : return true;
597 : else
598 0 : return false;
599 : }
600 : else
601 0 : return true;
602 : }
603 :
604 :
605 0 : void DialogHelper::openWebBrowser( const OUString & sURL, const OUString &sTitle ) const
606 : {
607 0 : if ( sURL.isEmpty() ) // Nothing to do, when the URL is empty
608 0 : return;
609 :
610 : try
611 : {
612 : uno::Reference< XSystemShellExecute > xSystemShellExecute(
613 0 : SystemShellExecute::create(m_xContext));
614 : //throws css::lang::IllegalArgumentException, css::system::SystemShellExecuteException
615 0 : xSystemShellExecute->execute( sURL, OUString(), SystemShellExecuteFlags::URIS_ONLY );
616 : }
617 0 : catch ( const uno::Exception& )
618 : {
619 0 : uno::Any exc( ::cppu::getCaughtException() );
620 0 : OUString msg( ::comphelper::anyToString( exc ) );
621 0 : const SolarMutexGuard guard;
622 0 : MessageDialog aErrorBox(NULL, msg);
623 0 : aErrorBox.SetText( sTitle );
624 0 : aErrorBox.Execute();
625 : }
626 : }
627 :
628 0 : bool DialogHelper::installExtensionWarn( const OUString &rExtensionName ) const
629 : {
630 0 : const SolarMutexGuard guard;
631 : MessageDialog aInfo(m_pVCLWindow, getResId(RID_STR_WARNING_INSTALL_EXTENSION),
632 0 : VCL_MESSAGE_WARNING, VCL_BUTTONS_OK_CANCEL);
633 :
634 0 : OUString sText(aInfo.get_primary_text());
635 0 : sText = sText.replaceAll("%NAME", rExtensionName);
636 0 : aInfo.set_primary_text(sText);
637 :
638 0 : return ( RET_OK == aInfo.Execute() );
639 : }
640 :
641 0 : bool DialogHelper::installForAllUsers( bool &bInstallForAll ) const
642 : {
643 0 : const SolarMutexGuard guard;
644 : MessageDialog aQuery(m_pVCLWindow, "InstallForAllDialog",
645 0 : "desktop/ui/installforalldialog.ui");
646 :
647 0 : short nRet = aQuery.Execute();
648 0 : if (nRet == RET_CANCEL)
649 0 : return false;
650 :
651 0 : bInstallForAll = ( nRet == RET_NO );
652 0 : return true;
653 : }
654 :
655 0 : void DialogHelper::PostUserEvent( const Link& rLink, void* pCaller )
656 : {
657 0 : if ( m_nEventID )
658 0 : Application::RemoveUserEvent( m_nEventID );
659 :
660 0 : m_nEventID = Application::PostUserEvent( rLink, pCaller );
661 0 : }
662 :
663 : // ExtMgrDialog
664 0 : ExtMgrDialog::ExtMgrDialog(vcl::Window *pParent, TheExtensionManager *pManager)
665 : : ModelessDialog(pParent, "ExtensionManagerDialog", "desktop/ui/extensionmanager.ui")
666 : , DialogHelper(pManager->getContext(), (Dialog*) this)
667 : , m_sAddPackages(getResourceString(RID_STR_ADD_PACKAGES))
668 : , m_bHasProgress(false)
669 : , m_bProgressChanged(false)
670 : , m_bStartProgress(false)
671 : , m_bStopProgress(false)
672 : , m_bEnableWarning(false)
673 : , m_bDisableWarning(false)
674 : , m_bDeleteWarning(false)
675 : , m_nProgress(0)
676 0 : , m_pManager(pManager)
677 : {
678 0 : get(m_pExtensionBox, "extensions");
679 0 : get(m_pAddBtn, "add");
680 0 : get(m_pUpdateBtn, "update");
681 0 : get(m_pCloseBtn, "close");
682 0 : get(m_pBundledCbx, "bundled");
683 0 : get(m_pSharedCbx, "shared");
684 0 : get(m_pUserCbx, "user");
685 0 : get(m_pGetExtensions, "getextensions");
686 0 : get(m_pProgressText, "progressft");
687 0 : get(m_pProgressBar, "progressbar");
688 0 : get(m_pCancelBtn, "cancel");
689 :
690 0 : m_pExtensionBox->InitFromDialog(this);
691 0 : m_pExtensionBox->SetHyperlinkHdl( LINK( this, ExtMgrDialog, HandleHyperlink ) );
692 :
693 0 : m_pAddBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleAddBtn ) );
694 0 : m_pCloseBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleCloseBtn ) );
695 :
696 0 : m_pUpdateBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleUpdateBtn ) );
697 0 : m_pGetExtensions->SetClickHdl( LINK( this, ExtMgrDialog, HandleHyperlink ) );
698 0 : m_pCancelBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleCancelBtn ) );
699 :
700 0 : m_pBundledCbx->SetClickHdl( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
701 0 : m_pSharedCbx->SetClickHdl( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
702 0 : m_pUserCbx->SetClickHdl( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
703 :
704 0 : m_pBundledCbx->Check( true );
705 0 : m_pSharedCbx->Check( true );
706 0 : m_pUserCbx->Check( true );
707 :
708 0 : m_pProgressBar->Hide();
709 :
710 0 : m_pUpdateBtn->Enable(false);
711 :
712 0 : m_aTimeoutTimer.SetTimeout( 500 ); // mSec
713 0 : m_aTimeoutTimer.SetTimeoutHdl( LINK( this, ExtMgrDialog, TimeOutHdl ) );
714 0 : }
715 :
716 :
717 0 : ExtMgrDialog::~ExtMgrDialog()
718 : {
719 0 : m_aTimeoutTimer.Stop();
720 0 : }
721 :
722 :
723 0 : void ExtMgrDialog::setGetExtensionsURL( const OUString &rURL )
724 : {
725 0 : m_pGetExtensions->SetURL( rURL );
726 0 : }
727 :
728 :
729 0 : long ExtMgrDialog::addPackageToList( const uno::Reference< deployment::XPackage > &xPackage,
730 : bool bLicenseMissing )
731 : {
732 :
733 0 : const SolarMutexGuard aGuard;
734 0 : m_pUpdateBtn->Enable(true);
735 :
736 0 : m_pExtensionBox->removeEntry(xPackage);
737 :
738 0 : if (m_pBundledCbx->IsChecked() && (xPackage->getRepositoryName() == BUNDLED_PACKAGE_MANAGER) )
739 : {
740 0 : return m_pExtensionBox->addEntry( xPackage, bLicenseMissing );
741 : }
742 0 : else if (m_pSharedCbx->IsChecked() && (xPackage->getRepositoryName() == SHARED_PACKAGE_MANAGER) )
743 : {
744 0 : return m_pExtensionBox->addEntry( xPackage, bLicenseMissing );
745 : }
746 0 : else if (m_pUserCbx->IsChecked() && (xPackage->getRepositoryName() == USER_PACKAGE_MANAGER ))
747 : {
748 0 : return m_pExtensionBox->addEntry( xPackage, bLicenseMissing );
749 : }
750 : else
751 : {
752 : //OSL_FAIL("Package will not be displayed");
753 0 : return 0;
754 0 : }
755 : }
756 :
757 :
758 0 : void ExtMgrDialog::prepareChecking()
759 : {
760 0 : m_pExtensionBox->prepareChecking();
761 0 : }
762 :
763 0 : void ExtMgrDialog::checkEntries()
764 : {
765 0 : const SolarMutexGuard guard;
766 0 : m_pExtensionBox->checkEntries();
767 0 : }
768 :
769 0 : bool ExtMgrDialog::removeExtensionWarn( const OUString &rExtensionName ) const
770 : {
771 0 : const SolarMutexGuard guard;
772 : MessageDialog aInfo(const_cast<ExtMgrDialog*>(this), getResId(RID_STR_WARNING_REMOVE_EXTENSION),
773 0 : VCL_MESSAGE_WARNING, VCL_BUTTONS_OK_CANCEL);
774 :
775 0 : OUString sText(aInfo.get_primary_text());
776 0 : sText = sText.replaceAll("%NAME", rExtensionName);
777 0 : aInfo.set_primary_text(sText);
778 :
779 0 : return ( RET_OK == aInfo.Execute() );
780 : }
781 :
782 0 : bool ExtMgrDialog::enablePackage( const uno::Reference< deployment::XPackage > &xPackage,
783 : bool bEnable )
784 : {
785 0 : if ( !xPackage.is() )
786 0 : return false;
787 :
788 0 : if ( bEnable )
789 : {
790 0 : if ( ! continueOnSharedExtension( xPackage, this, RID_STR_WARNING_ENABLE_SHARED_EXTENSION, m_bEnableWarning ) )
791 0 : return false;
792 : }
793 : else
794 : {
795 0 : if ( ! continueOnSharedExtension( xPackage, this, RID_STR_WARNING_DISABLE_SHARED_EXTENSION, m_bDisableWarning ) )
796 0 : return false;
797 : }
798 :
799 0 : m_pManager->getCmdQueue()->enableExtension( xPackage, bEnable );
800 :
801 0 : return true;
802 : }
803 :
804 :
805 0 : bool ExtMgrDialog::removePackage( const uno::Reference< deployment::XPackage > &xPackage )
806 : {
807 0 : if ( !xPackage.is() )
808 0 : return false;
809 :
810 0 : if ( !IsSharedPkgMgr( xPackage ) || m_bDeleteWarning )
811 : {
812 0 : if ( ! removeExtensionWarn( xPackage->getDisplayName() ) )
813 0 : return false;
814 : }
815 :
816 0 : if ( ! continueOnSharedExtension( xPackage, this, RID_STR_WARNING_REMOVE_SHARED_EXTENSION, m_bDeleteWarning ) )
817 0 : return false;
818 :
819 0 : m_pManager->getCmdQueue()->removeExtension( xPackage );
820 :
821 0 : return true;
822 : }
823 :
824 :
825 0 : bool ExtMgrDialog::updatePackage( const uno::Reference< deployment::XPackage > &xPackage )
826 : {
827 0 : if ( !xPackage.is() )
828 0 : return false;
829 :
830 : // get the extension with highest version
831 : uno::Sequence<uno::Reference<deployment::XPackage> > seqExtensions =
832 0 : m_pManager->getExtensionManager()->getExtensionsWithSameIdentifier(
833 0 : dp_misc::getIdentifier(xPackage), xPackage->getName(), uno::Reference<ucb::XCommandEnvironment>());
834 : uno::Reference<deployment::XPackage> extension =
835 0 : dp_misc::getExtensionWithHighestVersion(seqExtensions);
836 : OSL_ASSERT(extension.is());
837 0 : std::vector< css::uno::Reference< css::deployment::XPackage > > vEntries;
838 0 : vEntries.push_back(extension);
839 :
840 0 : m_pManager->getCmdQueue()->checkForUpdates( vEntries );
841 :
842 0 : return true;
843 : }
844 :
845 :
846 0 : bool ExtMgrDialog::acceptLicense( const uno::Reference< deployment::XPackage > &xPackage )
847 : {
848 0 : if ( !xPackage.is() )
849 0 : return false;
850 :
851 0 : m_pManager->getCmdQueue()->acceptLicense( xPackage );
852 :
853 0 : return true;
854 : }
855 :
856 :
857 0 : uno::Sequence< OUString > ExtMgrDialog::raiseAddPicker()
858 : {
859 0 : const uno::Reference< uno::XComponentContext > xContext( m_pManager->getContext() );
860 : const uno::Reference< ui::dialogs::XFilePicker3 > xFilePicker =
861 0 : ui::dialogs::FilePicker::createWithMode(xContext, ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE);
862 0 : xFilePicker->setTitle( m_sAddPackages );
863 :
864 0 : if ( !m_sLastFolderURL.isEmpty() )
865 0 : xFilePicker->setDisplayDirectory( m_sLastFolderURL );
866 :
867 : // collect and set filter list:
868 : typedef ::std::map< OUString, OUString > t_string2string;
869 0 : t_string2string title2filter;
870 0 : OUString sDefaultFilter( StrAllFiles::get() );
871 :
872 : const uno::Sequence< uno::Reference< deployment::XPackageTypeInfo > > packageTypes(
873 0 : m_pManager->getExtensionManager()->getSupportedPackageTypes() );
874 :
875 0 : for ( sal_Int32 pos = 0; pos < packageTypes.getLength(); ++pos )
876 : {
877 0 : uno::Reference< deployment::XPackageTypeInfo > const & xPackageType = packageTypes[ pos ];
878 0 : const OUString filter( xPackageType->getFileFilter() );
879 0 : if (!filter.isEmpty())
880 : {
881 0 : const OUString title( xPackageType->getShortDescription() );
882 : const ::std::pair< t_string2string::iterator, bool > insertion(
883 0 : title2filter.insert( t_string2string::value_type( title, filter ) ) );
884 0 : if ( ! insertion.second )
885 : { // already existing, append extensions:
886 0 : OUStringBuffer buf;
887 0 : buf.append( insertion.first->second );
888 0 : buf.append( ';' );
889 0 : buf.append( filter );
890 0 : insertion.first->second = buf.makeStringAndClear();
891 : }
892 0 : if ( xPackageType->getMediaType() == "application/vnd.sun.star.package-bundle" )
893 0 : sDefaultFilter = title;
894 : }
895 0 : }
896 :
897 : // All files at top:
898 0 : xFilePicker->appendFilter( StrAllFiles::get(), "*.*" );
899 : // then supported ones:
900 0 : t_string2string::const_iterator iPos( title2filter.begin() );
901 0 : const t_string2string::const_iterator iEnd( title2filter.end() );
902 0 : for ( ; iPos != iEnd; ++iPos ) {
903 : try {
904 0 : xFilePicker->appendFilter( iPos->first, iPos->second );
905 : }
906 0 : catch (const lang::IllegalArgumentException & exc) {
907 : OSL_FAIL( OUStringToOString(
908 : exc.Message, RTL_TEXTENCODING_UTF8 ).getStr() );
909 : (void) exc;
910 : }
911 : }
912 0 : xFilePicker->setCurrentFilter( sDefaultFilter );
913 :
914 0 : if ( xFilePicker->execute() != ui::dialogs::ExecutableDialogResults::OK )
915 0 : return uno::Sequence<OUString>(); // cancelled
916 :
917 0 : m_sLastFolderURL = xFilePicker->getDisplayDirectory();
918 0 : uno::Sequence< OUString > files( xFilePicker->getFiles() );
919 : OSL_ASSERT( files.getLength() > 0 );
920 0 : return files;
921 : }
922 :
923 :
924 0 : IMPL_LINK_NOARG(ExtMgrDialog, HandleCancelBtn)
925 : {
926 0 : if ( m_xAbortChannel.is() )
927 : {
928 : try
929 : {
930 0 : m_xAbortChannel->sendAbort();
931 : }
932 0 : catch ( const uno::RuntimeException & )
933 : {
934 : OSL_FAIL( "### unexpected RuntimeException!" );
935 : }
936 : }
937 0 : return 1;
938 : }
939 :
940 0 : IMPL_LINK_NOARG(ExtMgrDialog, HandleCloseBtn)
941 : {
942 0 : Close();
943 0 : return 1;
944 : }
945 :
946 :
947 :
948 0 : IMPL_LINK( ExtMgrDialog, startProgress, void*, _bLockInterface )
949 : {
950 0 : ::osl::MutexGuard aGuard( m_aMutex );
951 0 : bool bLockInterface = (bool) _bLockInterface;
952 :
953 0 : if ( m_bStartProgress && !m_bHasProgress )
954 0 : m_aTimeoutTimer.Start();
955 :
956 0 : if ( m_bStopProgress )
957 : {
958 0 : if ( m_pProgressBar->IsVisible() )
959 0 : m_pProgressBar->SetValue( 100 );
960 0 : m_xAbortChannel.clear();
961 :
962 : OSL_TRACE( " startProgress handler: stop" );
963 : }
964 : else
965 : {
966 : OSL_TRACE( " startProgress handler: start" );
967 : }
968 :
969 0 : m_pCancelBtn->Enable( bLockInterface );
970 0 : m_pAddBtn->Enable( !bLockInterface );
971 0 : m_pUpdateBtn->Enable( !bLockInterface && m_pExtensionBox->getItemCount() );
972 0 : m_pExtensionBox->enableButtons( !bLockInterface );
973 :
974 0 : clearEventID();
975 :
976 0 : return 0;
977 : }
978 :
979 :
980 0 : void ExtMgrDialog::showProgress( bool _bStart )
981 : {
982 0 : ::osl::MutexGuard aGuard( m_aMutex );
983 :
984 0 : bool bStart = _bStart;
985 :
986 0 : if ( bStart )
987 : {
988 0 : m_nProgress = 0;
989 0 : m_bStartProgress = true;
990 : OSL_TRACE( "showProgress start" );
991 : }
992 : else
993 : {
994 0 : m_nProgress = 100;
995 0 : m_bStopProgress = true;
996 : OSL_TRACE( "showProgress stop!" );
997 : }
998 :
999 0 : DialogHelper::PostUserEvent( LINK( this, ExtMgrDialog, startProgress ), reinterpret_cast<void*>(bStart) );
1000 0 : }
1001 :
1002 :
1003 0 : void ExtMgrDialog::updateProgress( const long nProgress )
1004 : {
1005 0 : ::osl::MutexGuard aGuard( m_aMutex );
1006 :
1007 0 : m_nProgress = nProgress;
1008 0 : }
1009 :
1010 :
1011 0 : void ExtMgrDialog::updateProgress( const OUString &rText,
1012 : const uno::Reference< task::XAbortChannel > &xAbortChannel)
1013 : {
1014 0 : ::osl::MutexGuard aGuard( m_aMutex );
1015 :
1016 0 : m_xAbortChannel = xAbortChannel;
1017 0 : m_sProgressText = rText;
1018 0 : m_bProgressChanged = true;
1019 0 : }
1020 :
1021 :
1022 0 : void ExtMgrDialog::updatePackageInfo( const uno::Reference< deployment::XPackage > &xPackage )
1023 : {
1024 0 : const SolarMutexGuard aGuard;
1025 0 : m_pExtensionBox->updateEntry( xPackage );
1026 0 : }
1027 :
1028 :
1029 0 : IMPL_LINK_NOARG(ExtMgrDialog, HandleAddBtn)
1030 : {
1031 0 : setBusy( true );
1032 :
1033 0 : uno::Sequence< OUString > aFileList = raiseAddPicker();
1034 :
1035 0 : if ( aFileList.getLength() )
1036 : {
1037 0 : m_pManager->installPackage( aFileList[0] );
1038 : }
1039 :
1040 0 : setBusy( false );
1041 0 : return 1;
1042 : }
1043 :
1044 :
1045 0 : IMPL_LINK_NOARG(ExtMgrDialog, HandleExtTypeCbx)
1046 : {
1047 : // re-creates the list of packages with addEntry selecting the packages
1048 0 : m_pManager->createPackageList();
1049 0 : return 1;
1050 : }
1051 :
1052 0 : IMPL_LINK_NOARG(ExtMgrDialog, HandleUpdateBtn)
1053 : {
1054 0 : m_pManager->checkUpdates( false, true );
1055 :
1056 0 : return 1;
1057 : }
1058 :
1059 :
1060 0 : IMPL_LINK( ExtMgrDialog, HandleHyperlink, FixedHyperlink*, pHyperlink )
1061 : {
1062 0 : openWebBrowser( pHyperlink->GetURL(), GetText() );
1063 :
1064 0 : return 1;
1065 : }
1066 :
1067 :
1068 0 : IMPL_LINK_NOARG(ExtMgrDialog, TimeOutHdl)
1069 : {
1070 0 : if ( m_bStopProgress )
1071 : {
1072 0 : m_bHasProgress = false;
1073 0 : m_bStopProgress = false;
1074 0 : m_pProgressText->Hide();
1075 0 : m_pProgressBar->Hide();
1076 0 : m_pCancelBtn->Hide();
1077 : }
1078 : else
1079 : {
1080 0 : if ( m_bProgressChanged )
1081 : {
1082 0 : m_bProgressChanged = false;
1083 0 : m_pProgressText->SetText(m_sProgressText);
1084 : }
1085 :
1086 0 : if ( m_bStartProgress )
1087 : {
1088 0 : m_bStartProgress = false;
1089 0 : m_bHasProgress = true;
1090 0 : m_pProgressBar->Show();
1091 0 : m_pProgressText->Show();
1092 0 : m_pCancelBtn->Enable();
1093 0 : m_pCancelBtn->Show();
1094 : }
1095 :
1096 0 : if ( m_pProgressBar->IsVisible() )
1097 0 : m_pProgressBar->SetValue( (sal_uInt16) m_nProgress );
1098 :
1099 0 : m_aTimeoutTimer.Start();
1100 : }
1101 :
1102 0 : return 1;
1103 : }
1104 :
1105 :
1106 : // VCL::Window / Dialog
1107 :
1108 0 : bool ExtMgrDialog::Notify( NotifyEvent& rNEvt )
1109 : {
1110 0 : bool bHandled = false;
1111 :
1112 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
1113 : {
1114 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
1115 0 : vcl::KeyCode aKeyCode = pKEvt->GetKeyCode();
1116 0 : sal_uInt16 nKeyCode = aKeyCode.GetCode();
1117 :
1118 0 : if ( nKeyCode == KEY_TAB )
1119 : {
1120 0 : if ( aKeyCode.IsShift() ) {
1121 0 : if ( m_pAddBtn->HasFocus() ) {
1122 0 : m_pExtensionBox->GrabFocus();
1123 0 : bHandled = true;
1124 : }
1125 : } else {
1126 0 : if ( m_pGetExtensions->HasFocus() ) {
1127 0 : m_pExtensionBox->GrabFocus();
1128 0 : bHandled = true;
1129 : }
1130 : }
1131 : }
1132 0 : if ( aKeyCode.GetGroup() == KEYGROUP_CURSOR )
1133 0 : bHandled = m_pExtensionBox->Notify( rNEvt );
1134 : }
1135 : // VCLEVENT_WINDOW_CLOSE
1136 0 : if ( !bHandled )
1137 0 : return ModelessDialog::Notify( rNEvt );
1138 : else
1139 0 : return true;
1140 : }
1141 :
1142 :
1143 0 : bool ExtMgrDialog::Close()
1144 : {
1145 0 : bool bRet = m_pManager->queryTermination();
1146 0 : if ( bRet )
1147 : {
1148 0 : bRet = ModelessDialog::Close();
1149 0 : m_pManager->terminateDialog();
1150 : }
1151 0 : return bRet;
1152 : }
1153 :
1154 : //UpdateRequiredDialog
1155 0 : UpdateRequiredDialog::UpdateRequiredDialog(vcl::Window *pParent, TheExtensionManager *pManager)
1156 : : ModalDialog(pParent, "UpdateRequiredDialog", "desktop/ui/updaterequireddialog.ui")
1157 : , DialogHelper(pManager->getContext(), (Dialog*) this)
1158 : , m_sAddPackages(getResourceString(RID_STR_ADD_PACKAGES))
1159 : , m_sCloseText(getResourceString(RID_STR_CLOSE_BTN))
1160 : , m_bHasProgress(false)
1161 : , m_bProgressChanged(false)
1162 : , m_bStartProgress(false)
1163 : , m_bStopProgress(false)
1164 : , m_bUpdateWarning(false)
1165 : , m_bDisableWarning(false)
1166 : , m_bHasLockedEntries(false)
1167 : , m_nProgress(0)
1168 0 : , m_pManager(pManager)
1169 : {
1170 0 : get(m_pExtensionBox, "extensions");
1171 0 : m_pExtensionBox->setExtensionManager(pManager);
1172 0 : get(m_pUpdateNeeded, "updatelabel");
1173 0 : get(m_pUpdateBtn, "check");
1174 0 : get(m_pCloseBtn, "disable");
1175 0 : get(m_pCancelBtn, "cancel");
1176 0 : get(m_pProgressText, "progresslabel");
1177 0 : get(m_pProgressBar, "progress");
1178 :
1179 0 : m_pExtensionBox->SetHyperlinkHdl( LINK( this, UpdateRequiredDialog, HandleHyperlink ) );
1180 :
1181 0 : m_pUpdateBtn->SetClickHdl( LINK( this, UpdateRequiredDialog, HandleUpdateBtn ) );
1182 0 : m_pCloseBtn->SetClickHdl( LINK( this, UpdateRequiredDialog, HandleCloseBtn ) );
1183 0 : m_pCancelBtn->SetClickHdl( LINK( this, UpdateRequiredDialog, HandleCancelBtn ) );
1184 :
1185 0 : OUString aText = m_pUpdateNeeded->GetText();
1186 0 : aText = aText.replaceAll(
1187 0 : "%PRODUCTNAME", utl::ConfigManager::getProductName());
1188 0 : m_pUpdateNeeded->SetText(aText);
1189 :
1190 0 : m_pProgressBar->Hide();
1191 0 : m_pUpdateBtn->Enable( false );
1192 0 : m_pCloseBtn->GrabFocus();
1193 :
1194 0 : m_aTimeoutTimer.SetTimeout( 50 ); // mSec
1195 0 : m_aTimeoutTimer.SetTimeoutHdl( LINK( this, UpdateRequiredDialog, TimeOutHdl ) );
1196 0 : }
1197 :
1198 0 : UpdateRequiredDialog::~UpdateRequiredDialog()
1199 : {
1200 0 : m_aTimeoutTimer.Stop();
1201 0 : }
1202 :
1203 0 : long UpdateRequiredDialog::addPackageToList( const uno::Reference< deployment::XPackage > &xPackage,
1204 : bool bLicenseMissing )
1205 : {
1206 : // We will only add entries to the list with unsatisfied dependencies
1207 0 : if ( !bLicenseMissing && !checkDependencies( xPackage ) )
1208 : {
1209 0 : m_bHasLockedEntries |= m_pManager->isReadOnly( xPackage );
1210 0 : const SolarMutexGuard aGuard;
1211 0 : m_pUpdateBtn->Enable( true );
1212 0 : return m_pExtensionBox->addEntry( xPackage );
1213 : }
1214 0 : return 0;
1215 : }
1216 :
1217 :
1218 0 : void UpdateRequiredDialog::prepareChecking()
1219 : {
1220 0 : m_pExtensionBox->prepareChecking();
1221 0 : }
1222 :
1223 :
1224 0 : void UpdateRequiredDialog::checkEntries()
1225 : {
1226 0 : const SolarMutexGuard guard;
1227 0 : m_pExtensionBox->checkEntries();
1228 :
1229 0 : if ( ! hasActiveEntries() )
1230 : {
1231 0 : m_pCloseBtn->SetText( m_sCloseText );
1232 0 : m_pCloseBtn->GrabFocus();
1233 0 : }
1234 0 : }
1235 :
1236 :
1237 0 : bool UpdateRequiredDialog::enablePackage( const uno::Reference< deployment::XPackage > &xPackage,
1238 : bool bEnable )
1239 : {
1240 0 : m_pManager->getCmdQueue()->enableExtension( xPackage, bEnable );
1241 :
1242 0 : return true;
1243 : }
1244 :
1245 :
1246 0 : IMPL_LINK_NOARG(UpdateRequiredDialog, HandleCancelBtn)
1247 : {
1248 0 : if ( m_xAbortChannel.is() )
1249 : {
1250 : try
1251 : {
1252 0 : m_xAbortChannel->sendAbort();
1253 : }
1254 0 : catch ( const uno::RuntimeException & )
1255 : {
1256 : OSL_FAIL( "### unexpected RuntimeException!" );
1257 : }
1258 : }
1259 0 : return 1;
1260 : }
1261 :
1262 :
1263 0 : IMPL_LINK( UpdateRequiredDialog, startProgress, void*, _bLockInterface )
1264 : {
1265 0 : ::osl::MutexGuard aGuard( m_aMutex );
1266 0 : bool bLockInterface = (bool) _bLockInterface;
1267 :
1268 0 : if ( m_bStartProgress && !m_bHasProgress )
1269 0 : m_aTimeoutTimer.Start();
1270 :
1271 0 : if ( m_bStopProgress )
1272 : {
1273 0 : if ( m_pProgressBar->IsVisible() )
1274 0 : m_pProgressBar->SetValue( 100 );
1275 0 : m_xAbortChannel.clear();
1276 : OSL_TRACE( " startProgress handler: stop" );
1277 : }
1278 : else
1279 : {
1280 : OSL_TRACE( " startProgress handler: start" );
1281 : }
1282 :
1283 0 : m_pCancelBtn->Enable( bLockInterface );
1284 0 : m_pUpdateBtn->Enable( false );
1285 0 : clearEventID();
1286 :
1287 0 : return 0;
1288 : }
1289 :
1290 :
1291 0 : void UpdateRequiredDialog::showProgress( bool _bStart )
1292 : {
1293 0 : ::osl::MutexGuard aGuard( m_aMutex );
1294 :
1295 0 : bool bStart = _bStart;
1296 :
1297 0 : if ( bStart )
1298 : {
1299 0 : m_nProgress = 0;
1300 0 : m_bStartProgress = true;
1301 : OSL_TRACE( "showProgress start" );
1302 : }
1303 : else
1304 : {
1305 0 : m_nProgress = 100;
1306 0 : m_bStopProgress = true;
1307 : OSL_TRACE( "showProgress stop!" );
1308 : }
1309 :
1310 0 : DialogHelper::PostUserEvent( LINK( this, UpdateRequiredDialog, startProgress ), reinterpret_cast<void*>(bStart) );
1311 0 : }
1312 :
1313 :
1314 0 : void UpdateRequiredDialog::updateProgress( const long nProgress )
1315 : {
1316 0 : ::osl::MutexGuard aGuard( m_aMutex );
1317 :
1318 0 : m_nProgress = nProgress;
1319 0 : }
1320 :
1321 :
1322 0 : void UpdateRequiredDialog::updateProgress( const OUString &rText,
1323 : const uno::Reference< task::XAbortChannel > &xAbortChannel)
1324 : {
1325 0 : ::osl::MutexGuard aGuard( m_aMutex );
1326 :
1327 0 : m_xAbortChannel = xAbortChannel;
1328 0 : m_sProgressText = rText;
1329 0 : m_bProgressChanged = true;
1330 0 : }
1331 :
1332 :
1333 0 : void UpdateRequiredDialog::updatePackageInfo( const uno::Reference< deployment::XPackage > &xPackage )
1334 : {
1335 : // We will remove all updated packages with satisfied dependencies, but
1336 : // we will show all disabled entries so the user sees the result
1337 : // of the 'disable all' button
1338 0 : const SolarMutexGuard aGuard;
1339 0 : if ( isEnabled( xPackage ) && checkDependencies( xPackage ) )
1340 0 : m_pExtensionBox->removeEntry( xPackage );
1341 : else
1342 0 : m_pExtensionBox->updateEntry( xPackage );
1343 :
1344 0 : if ( ! hasActiveEntries() )
1345 : {
1346 0 : m_pCloseBtn->SetText( m_sCloseText );
1347 0 : m_pCloseBtn->GrabFocus();
1348 0 : }
1349 0 : }
1350 :
1351 :
1352 0 : IMPL_LINK_NOARG(UpdateRequiredDialog, HandleUpdateBtn)
1353 : {
1354 0 : ::osl::ClearableMutexGuard aGuard( m_aMutex );
1355 :
1356 0 : std::vector< uno::Reference< deployment::XPackage > > vUpdateEntries;
1357 0 : sal_Int32 nCount = m_pExtensionBox->GetEntryCount();
1358 :
1359 0 : for ( sal_Int32 i = 0; i < nCount; ++i )
1360 : {
1361 0 : TEntry_Impl pEntry = m_pExtensionBox->GetEntryData( i );
1362 0 : vUpdateEntries.push_back( pEntry->m_xPackage );
1363 0 : }
1364 :
1365 0 : aGuard.clear();
1366 :
1367 0 : m_pManager->getCmdQueue()->checkForUpdates( vUpdateEntries );
1368 :
1369 0 : return 1;
1370 : }
1371 :
1372 :
1373 0 : IMPL_LINK_NOARG(UpdateRequiredDialog, HandleCloseBtn)
1374 : {
1375 0 : ::osl::MutexGuard aGuard( m_aMutex );
1376 :
1377 0 : if ( !isBusy() )
1378 : {
1379 0 : if ( m_bHasLockedEntries )
1380 0 : EndDialog( -1 );
1381 0 : else if ( hasActiveEntries() )
1382 0 : disableAllEntries();
1383 : else
1384 0 : EndDialog( 0 );
1385 : }
1386 :
1387 0 : return 1;
1388 : }
1389 :
1390 :
1391 0 : IMPL_LINK( UpdateRequiredDialog, HandleHyperlink, FixedHyperlink*, pHyperlink )
1392 : {
1393 0 : openWebBrowser( pHyperlink->GetURL(), GetText() );
1394 :
1395 0 : return 1;
1396 : }
1397 :
1398 :
1399 0 : IMPL_LINK_NOARG(UpdateRequiredDialog, TimeOutHdl)
1400 : {
1401 0 : if ( m_bStopProgress )
1402 : {
1403 0 : m_bHasProgress = false;
1404 0 : m_bStopProgress = false;
1405 0 : m_pProgressText->Hide();
1406 0 : m_pProgressBar->Hide();
1407 0 : m_pCancelBtn->Hide();
1408 : }
1409 : else
1410 : {
1411 0 : if ( m_bProgressChanged )
1412 : {
1413 0 : m_bProgressChanged = false;
1414 0 : m_pProgressText->SetText( m_sProgressText );
1415 : }
1416 :
1417 0 : if ( m_bStartProgress )
1418 : {
1419 0 : m_bStartProgress = false;
1420 0 : m_bHasProgress = true;
1421 0 : m_pProgressBar->Show();
1422 0 : m_pProgressText->Show();
1423 0 : m_pCancelBtn->Enable();
1424 0 : m_pCancelBtn->Show();
1425 : }
1426 :
1427 0 : if ( m_pProgressBar->IsVisible() )
1428 0 : m_pProgressBar->SetValue( (sal_uInt16) m_nProgress );
1429 :
1430 0 : m_aTimeoutTimer.Start();
1431 : }
1432 :
1433 0 : return 1;
1434 : }
1435 :
1436 : // VCL::Dialog
1437 0 : short UpdateRequiredDialog::Execute()
1438 : {
1439 : //ToDo
1440 : //I believe m_bHasLockedEntries was used to prevent showing extensions which cannot
1441 : //be disabled because they are in a read only repository. However, disabling extensions
1442 : //is now always possible because the registration data of all repositories
1443 : //are in the user installation.
1444 : //Therfore all extensions could be displayed and all the handling around m_bHasLockedEntries
1445 : //could be removed.
1446 0 : if ( m_bHasLockedEntries )
1447 : {
1448 : // Set other text, disable update btn, remove not shared entries from list;
1449 0 : m_pUpdateNeeded->SetText( DialogHelper::getResourceString( RID_STR_NO_ADMIN_PRIVILEGE ) );
1450 0 : m_pCloseBtn->SetText( DialogHelper::getResourceString( RID_STR_EXIT_BTN ) );
1451 0 : m_pUpdateBtn->Enable( false );
1452 0 : m_pExtensionBox->RemoveUnlocked();
1453 0 : Resize();
1454 : }
1455 :
1456 0 : return Dialog::Execute();
1457 : }
1458 :
1459 : // VCL::Dialog
1460 0 : bool UpdateRequiredDialog::Close()
1461 : {
1462 0 : ::osl::MutexGuard aGuard( m_aMutex );
1463 :
1464 0 : if ( !isBusy() )
1465 : {
1466 0 : if ( m_bHasLockedEntries )
1467 0 : EndDialog( -1 );
1468 0 : else if ( hasActiveEntries() )
1469 0 : disableAllEntries();
1470 : else
1471 0 : EndDialog( 0 );
1472 : }
1473 :
1474 0 : return false;
1475 : }
1476 :
1477 :
1478 : // Check dependencies of all packages
1479 :
1480 0 : bool UpdateRequiredDialog::isEnabled( const uno::Reference< deployment::XPackage > &xPackage ) const
1481 : {
1482 0 : bool bRegistered = false;
1483 : try {
1484 0 : beans::Optional< beans::Ambiguous< sal_Bool > > option( xPackage->isRegistered( uno::Reference< task::XAbortChannel >(),
1485 0 : uno::Reference< ucb::XCommandEnvironment >() ) );
1486 0 : if ( option.IsPresent )
1487 : {
1488 0 : ::beans::Ambiguous< sal_Bool > const & reg = option.Value;
1489 0 : if ( reg.IsAmbiguous )
1490 0 : bRegistered = false;
1491 : else
1492 0 : bRegistered = reg.Value ? true : false;
1493 : }
1494 : else
1495 0 : bRegistered = false;
1496 : }
1497 0 : catch ( const uno::RuntimeException & ) { throw; }
1498 0 : catch (const uno::Exception & exc) {
1499 : (void) exc;
1500 : OSL_FAIL( OUStringToOString( exc.Message, RTL_TEXTENCODING_UTF8 ).getStr() );
1501 0 : bRegistered = false;
1502 : }
1503 :
1504 0 : return bRegistered;
1505 : }
1506 :
1507 : // Checks the dependencies no matter if the extension is enabled or disabled!
1508 0 : bool UpdateRequiredDialog::checkDependencies( const uno::Reference< deployment::XPackage > &xPackage ) const
1509 : {
1510 0 : bool bDependenciesValid = false;
1511 : try {
1512 0 : bDependenciesValid = xPackage->checkDependencies( uno::Reference< ucb::XCommandEnvironment >() );
1513 : }
1514 0 : catch ( const deployment::DeploymentException & ) {}
1515 0 : return bDependenciesValid;
1516 : }
1517 :
1518 :
1519 0 : bool UpdateRequiredDialog::hasActiveEntries()
1520 : {
1521 0 : ::osl::MutexGuard aGuard( m_aMutex );
1522 :
1523 0 : bool bRet = false;
1524 0 : long nCount = m_pExtensionBox->GetEntryCount();
1525 0 : for ( long nIndex = 0; nIndex < nCount; nIndex++ )
1526 : {
1527 0 : TEntry_Impl pEntry = m_pExtensionBox->GetEntryData( nIndex );
1528 :
1529 0 : if ( isEnabled(pEntry->m_xPackage) && !checkDependencies( pEntry->m_xPackage ) )
1530 : {
1531 0 : bRet = true;
1532 0 : break;
1533 : }
1534 0 : }
1535 :
1536 0 : return bRet;
1537 : }
1538 :
1539 :
1540 0 : void UpdateRequiredDialog::disableAllEntries()
1541 : {
1542 0 : ::osl::MutexGuard aGuard( m_aMutex );
1543 :
1544 0 : setBusy( true );
1545 :
1546 0 : long nCount = m_pExtensionBox->GetEntryCount();
1547 0 : for ( long nIndex = 0; nIndex < nCount; nIndex++ )
1548 : {
1549 0 : TEntry_Impl pEntry = m_pExtensionBox->GetEntryData( nIndex );
1550 0 : enablePackage( pEntry->m_xPackage, false );
1551 0 : }
1552 :
1553 0 : setBusy( false );
1554 :
1555 0 : if ( ! hasActiveEntries() )
1556 0 : m_pCloseBtn->SetText( m_sCloseText );
1557 0 : }
1558 :
1559 :
1560 : // ShowLicenseDialog
1561 :
1562 0 : ShowLicenseDialog::ShowLicenseDialog( vcl::Window * pParent,
1563 : const uno::Reference< deployment::XPackage > &xPackage )
1564 0 : : ModalDialog(pParent, "ShowLicenseDialog", "desktop/ui/showlicensedialog.ui")
1565 : {
1566 0 : get(m_pLicenseText, "textview");
1567 0 : Size aSize(m_pLicenseText->LogicToPixel(Size(290, 170), MAP_APPFONT));
1568 0 : m_pLicenseText->set_width_request(aSize.Width());
1569 0 : m_pLicenseText->set_height_request(aSize.Height());
1570 0 : m_pLicenseText->SetText(xPackage->getLicenseText());
1571 0 : }
1572 :
1573 :
1574 : // UpdateRequiredDialogService
1575 :
1576 2 : UpdateRequiredDialogService::UpdateRequiredDialogService( uno::Sequence< uno::Any > const&,
1577 : uno::Reference< uno::XComponentContext > const& xComponentContext )
1578 2 : : m_xComponentContext( xComponentContext )
1579 : {
1580 2 : }
1581 :
1582 :
1583 : // XExecutableDialog
1584 :
1585 0 : void UpdateRequiredDialogService::setTitle( OUString const & ) throw ( uno::RuntimeException, std::exception )
1586 : {
1587 0 : }
1588 :
1589 :
1590 0 : sal_Int16 UpdateRequiredDialogService::execute() throw ( uno::RuntimeException, std::exception )
1591 : {
1592 : ::rtl::Reference< ::dp_gui::TheExtensionManager > xManager( TheExtensionManager::get(
1593 : m_xComponentContext,
1594 : uno::Reference< awt::XWindow >(),
1595 0 : OUString() ) );
1596 0 : xManager->createDialog( true );
1597 0 : sal_Int16 nRet = xManager->execute();
1598 :
1599 0 : return nRet;
1600 : }
1601 :
1602 :
1603 0 : SelectedPackage::~SelectedPackage() {}
1604 :
1605 6 : } //namespace dp_gui
1606 :
1607 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|