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