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/XFilePicker.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 : #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
77 :
78 : using namespace ::com::sun::star;
79 : using namespace ::com::sun::star::system;
80 :
81 : using ::rtl::OUString;
82 :
83 :
84 : namespace dp_gui {
85 :
86 : #define TOP_OFFSET 5
87 : #define LINE_SIZE 4
88 : #define PROGRESS_WIDTH 60
89 : #define PROGRESS_HEIGHT 14
90 :
91 : #define USER_PACKAGE_MANAGER OUSTR("user")
92 : #define SHARED_PACKAGE_MANAGER OUSTR("shared")
93 : #define BUNDLED_PACKAGE_MANAGER OUSTR("bundled")
94 :
95 : //------------------------------------------------------------------------------
96 : struct StrAllFiles : public rtl::StaticWithInit< OUString, StrAllFiles >
97 : {
98 0 : const OUString operator () () {
99 0 : const SolarMutexGuard guard;
100 0 : ::std::auto_ptr< ResMgr > const resmgr( ResMgr::CreateResMgr( "fps_office" ) );
101 : OSL_ASSERT( resmgr.get() != 0 );
102 0 : String ret( ResId( STR_FILTERNAME_ALL, *resmgr.get() ) );
103 0 : return ret;
104 : }
105 : };
106 :
107 : //------------------------------------------------------------------------------
108 : // ExtBoxWithBtns_Impl
109 : //------------------------------------------------------------------------------
110 :
111 : enum MENU_COMMAND
112 : {
113 : CMD_NONE = 0,
114 : CMD_REMOVE = 1,
115 : CMD_ENABLE,
116 : CMD_DISABLE,
117 : CMD_UPDATE,
118 : CMD_SHOW_LICENSE
119 : };
120 :
121 : class ExtBoxWithBtns_Impl : public ExtensionBox_Impl
122 : {
123 : Size m_aOutputSize;
124 : bool m_bInterfaceLocked;
125 :
126 : PushButton *m_pOptionsBtn;
127 : PushButton *m_pEnableBtn;
128 : PushButton *m_pRemoveBtn;
129 :
130 : ExtMgrDialog *m_pParent;
131 :
132 : void SetButtonPos( const Rectangle& rRect );
133 : void SetButtonStatus( const TEntry_Impl pEntry );
134 : bool HandleTabKey( bool bReverse );
135 : MENU_COMMAND ShowPopupMenu( const Point &rPos, const long nPos );
136 :
137 : //-----------------
138 : DECL_DLLPRIVATE_LINK( ScrollHdl, ScrollBar * );
139 :
140 : DECL_DLLPRIVATE_LINK( HandleOptionsBtn, void * );
141 : DECL_DLLPRIVATE_LINK( HandleEnableBtn, void * );
142 : DECL_DLLPRIVATE_LINK( HandleRemoveBtn, void * );
143 : DECL_DLLPRIVATE_LINK( HandleHyperlink, FixedHyperlink * );
144 :
145 : public:
146 : ExtBoxWithBtns_Impl(Window* pParent);
147 : ~ExtBoxWithBtns_Impl();
148 :
149 : void InitFromDialog(ExtMgrDialog *pParentDialog);
150 :
151 : virtual void MouseButtonDown( const MouseEvent& rMEvt );
152 : virtual long Notify( NotifyEvent& rNEvt );
153 :
154 : virtual void RecalcAll();
155 : virtual void selectEntry( const long nPos );
156 : //-----------------
157 : void enableButtons( bool bEnable );
158 : };
159 :
160 0 : ExtBoxWithBtns_Impl::ExtBoxWithBtns_Impl(Window* pParent)
161 : : ExtensionBox_Impl(pParent)
162 : , m_bInterfaceLocked(false)
163 : , m_pOptionsBtn(NULL)
164 : , m_pEnableBtn(NULL)
165 : , m_pRemoveBtn(NULL)
166 0 : , m_pParent(NULL)
167 : {
168 0 : }
169 :
170 : //------------------------------------------------------------------------------
171 0 : void ExtBoxWithBtns_Impl::InitFromDialog(ExtMgrDialog *pParentDialog)
172 : {
173 0 : setExtensionManager(pParentDialog->getExtensionManager());
174 :
175 0 : m_pParent = pParentDialog;
176 :
177 0 : m_pOptionsBtn = new PushButton( this, WB_TABSTOP );
178 0 : m_pEnableBtn = new PushButton( this, WB_TABSTOP );
179 0 : m_pRemoveBtn = new PushButton( this, WB_TABSTOP );
180 :
181 0 : SetHelpId( HID_EXTENSION_MANAGER_LISTBOX );
182 0 : m_pOptionsBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_OPTIONS );
183 0 : m_pEnableBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_DISABLE );
184 0 : m_pRemoveBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_REMOVE );
185 :
186 0 : m_pOptionsBtn->SetClickHdl( LINK( this, ExtBoxWithBtns_Impl, HandleOptionsBtn ) );
187 0 : m_pEnableBtn->SetClickHdl( LINK( this, ExtBoxWithBtns_Impl, HandleEnableBtn ) );
188 0 : m_pRemoveBtn->SetClickHdl( LINK( this, ExtBoxWithBtns_Impl, HandleRemoveBtn ) );
189 :
190 0 : m_pOptionsBtn->SetText( DialogHelper::getResourceString( RID_CTX_ITEM_OPTIONS ) );
191 0 : m_pEnableBtn->SetText( DialogHelper::getResourceString( RID_CTX_ITEM_DISABLE ) );
192 0 : m_pRemoveBtn->SetText( DialogHelper::getResourceString( RID_CTX_ITEM_REMOVE ) );
193 :
194 : Size aSize = LogicToPixel( Size( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ),
195 0 : MapMode( MAP_APPFONT ) );
196 0 : m_pOptionsBtn->SetSizePixel( aSize );
197 0 : m_pEnableBtn->SetSizePixel( aSize );
198 0 : m_pRemoveBtn->SetSizePixel( aSize );
199 :
200 0 : SetExtraSize( aSize.Height() + 2 * TOP_OFFSET );
201 :
202 0 : SetScrollHdl( LINK( this, ExtBoxWithBtns_Impl, ScrollHdl ) );
203 0 : }
204 :
205 :
206 0 : extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeExtBoxWithBtns(Window *pParent, VclBuilder::stringmap &)
207 : {
208 0 : return new ExtBoxWithBtns_Impl(pParent);
209 : }
210 :
211 : //------------------------------------------------------------------------------
212 0 : ExtBoxWithBtns_Impl::~ExtBoxWithBtns_Impl()
213 : {
214 0 : delete m_pOptionsBtn;
215 0 : delete m_pEnableBtn;
216 0 : delete m_pRemoveBtn;
217 0 : }
218 :
219 : // -----------------------------------------------------------------------
220 0 : void ExtBoxWithBtns_Impl::RecalcAll()
221 : {
222 0 : const sal_Int32 nActive = getSelIndex();
223 :
224 0 : if ( nActive != EXTENSION_LISTBOX_ENTRY_NOTFOUND )
225 : {
226 0 : SetButtonStatus( GetEntryData( nActive) );
227 : }
228 : else
229 : {
230 0 : m_pOptionsBtn->Hide();
231 0 : m_pEnableBtn->Hide();
232 0 : m_pRemoveBtn->Hide();
233 : }
234 :
235 0 : ExtensionBox_Impl::RecalcAll();
236 :
237 0 : if ( nActive != EXTENSION_LISTBOX_ENTRY_NOTFOUND )
238 0 : SetButtonPos( GetEntryRect( nActive ) );
239 0 : }
240 :
241 :
242 : //------------------------------------------------------------------------------
243 : //This function may be called with nPos < 0
244 0 : void ExtBoxWithBtns_Impl::selectEntry( const long nPos )
245 : {
246 0 : if ( HasActive() && ( nPos == getSelIndex() ) )
247 0 : return;
248 :
249 0 : ExtensionBox_Impl::selectEntry( nPos );
250 : }
251 :
252 : // -----------------------------------------------------------------------
253 0 : void ExtBoxWithBtns_Impl::SetButtonPos( const Rectangle& rRect )
254 : {
255 0 : Size aBtnSize( m_pOptionsBtn->GetSizePixel() );
256 0 : Point aBtnPos( rRect.Left() + ICON_OFFSET,
257 0 : rRect.Bottom() - TOP_OFFSET - aBtnSize.Height() );
258 :
259 0 : m_pOptionsBtn->SetPosPixel( aBtnPos );
260 0 : aBtnPos.X() = rRect.Right() - TOP_OFFSET - aBtnSize.Width();
261 0 : m_pRemoveBtn->SetPosPixel( aBtnPos );
262 0 : aBtnPos.X() -= ( TOP_OFFSET + aBtnSize.Width() );
263 0 : m_pEnableBtn->SetPosPixel( aBtnPos );
264 0 : }
265 :
266 : // -----------------------------------------------------------------------
267 0 : void ExtBoxWithBtns_Impl::SetButtonStatus( const TEntry_Impl pEntry )
268 : {
269 0 : bool bShowOptionBtn = true;
270 :
271 0 : pEntry->m_bHasButtons = false;
272 0 : if ( ( pEntry->m_eState == REGISTERED ) || ( pEntry->m_eState == NOT_AVAILABLE ) )
273 : {
274 0 : m_pEnableBtn->SetText( DialogHelper::getResourceString( RID_CTX_ITEM_DISABLE ) );
275 0 : m_pEnableBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_DISABLE );
276 : }
277 : else
278 : {
279 0 : m_pEnableBtn->SetText( DialogHelper::getResourceString( RID_CTX_ITEM_ENABLE ) );
280 0 : m_pEnableBtn->SetHelpId( HID_EXTENSION_MANAGER_LISTBOX_ENABLE );
281 0 : bShowOptionBtn = false;
282 : }
283 :
284 0 : if ( ( !pEntry->m_bUser || ( pEntry->m_eState == NOT_AVAILABLE ) || pEntry->m_bMissingDeps )
285 0 : && !pEntry->m_bMissingLic )
286 0 : m_pEnableBtn->Hide();
287 : else
288 : {
289 0 : m_pEnableBtn->Enable( !pEntry->m_bLocked );
290 0 : m_pEnableBtn->Show();
291 0 : pEntry->m_bHasButtons = true;
292 : }
293 :
294 0 : if ( pEntry->m_bHasOptions && bShowOptionBtn )
295 : {
296 0 : m_pOptionsBtn->Enable( pEntry->m_bHasOptions );
297 0 : m_pOptionsBtn->Show();
298 0 : pEntry->m_bHasButtons = true;
299 : }
300 : else
301 0 : m_pOptionsBtn->Hide();
302 :
303 0 : if ( pEntry->m_bUser || pEntry->m_bShared )
304 : {
305 0 : m_pRemoveBtn->Enable( !pEntry->m_bLocked );
306 0 : m_pRemoveBtn->Show();
307 0 : pEntry->m_bHasButtons = true;
308 : }
309 : else
310 0 : m_pRemoveBtn->Hide();
311 0 : }
312 :
313 : // -----------------------------------------------------------------------
314 0 : bool ExtBoxWithBtns_Impl::HandleTabKey( bool bReverse )
315 : {
316 0 : sal_Int32 nIndex = getSelIndex();
317 :
318 0 : if ( nIndex == EXTENSION_LISTBOX_ENTRY_NOTFOUND )
319 0 : return false;
320 :
321 0 : PushButton *pNext = NULL;
322 :
323 0 : if ( m_pOptionsBtn->HasFocus() ) {
324 0 : if ( !bReverse && !GetEntryData( nIndex )->m_bLocked )
325 0 : pNext = m_pEnableBtn;
326 : }
327 0 : else if ( m_pEnableBtn->HasFocus() ) {
328 0 : if ( !bReverse )
329 0 : pNext = m_pRemoveBtn;
330 0 : else if ( GetEntryData( nIndex )->m_bHasOptions )
331 0 : pNext = m_pOptionsBtn;
332 : }
333 0 : else if ( m_pRemoveBtn->HasFocus() ) {
334 0 : if ( bReverse )
335 0 : pNext = m_pEnableBtn;
336 : }
337 : else {
338 0 : if ( !bReverse ) {
339 0 : if ( GetEntryData( nIndex )->m_bHasOptions )
340 0 : pNext = m_pOptionsBtn;
341 0 : else if ( ! GetEntryData( nIndex )->m_bLocked )
342 0 : pNext = m_pEnableBtn;
343 : } else {
344 0 : if ( ! GetEntryData( nIndex )->m_bLocked )
345 0 : pNext = m_pRemoveBtn;
346 0 : else if ( GetEntryData( nIndex )->m_bHasOptions )
347 0 : pNext = m_pOptionsBtn;
348 : }
349 : }
350 :
351 0 : if ( pNext )
352 : {
353 0 : pNext->GrabFocus();
354 0 : return true;
355 : }
356 : else
357 0 : return false;
358 : }
359 :
360 : // -----------------------------------------------------------------------
361 0 : MENU_COMMAND ExtBoxWithBtns_Impl::ShowPopupMenu( const Point & rPos, const long nPos )
362 : {
363 0 : if ( nPos >= (long) getItemCount() )
364 0 : return CMD_NONE;
365 :
366 0 : PopupMenu aPopup;
367 :
368 0 : aPopup.InsertItem( CMD_UPDATE, DialogHelper::getResourceString( RID_CTX_ITEM_CHECK_UPDATE ) );
369 :
370 0 : if ( ! GetEntryData( nPos )->m_bLocked )
371 : {
372 0 : if ( GetEntryData( nPos )->m_bUser )
373 : {
374 0 : if ( GetEntryData( nPos )->m_eState == REGISTERED )
375 0 : aPopup.InsertItem( CMD_DISABLE, DialogHelper::getResourceString( RID_CTX_ITEM_DISABLE ) );
376 0 : else if ( GetEntryData( nPos )->m_eState != NOT_AVAILABLE )
377 0 : aPopup.InsertItem( CMD_ENABLE, DialogHelper::getResourceString( RID_CTX_ITEM_ENABLE ) );
378 : }
379 0 : aPopup.InsertItem( CMD_REMOVE, DialogHelper::getResourceString( RID_CTX_ITEM_REMOVE ) );
380 : }
381 :
382 0 : if ( GetEntryData( nPos )->m_sLicenseText.Len() )
383 0 : aPopup.InsertItem( CMD_SHOW_LICENSE, DialogHelper::getResourceString( RID_STR_SHOW_LICENSE_CMD ) );
384 :
385 0 : return (MENU_COMMAND) aPopup.Execute( this, rPos );
386 : }
387 :
388 : //------------------------------------------------------------------------------
389 0 : void ExtBoxWithBtns_Impl::MouseButtonDown( const MouseEvent& rMEvt )
390 : {
391 0 : if ( m_bInterfaceLocked )
392 0 : return;
393 :
394 0 : const Point aMousePos( rMEvt.GetPosPixel() );
395 0 : const long nPos = PointToPos( aMousePos );
396 :
397 0 : if ( rMEvt.IsRight() )
398 : {
399 0 : switch( ShowPopupMenu( aMousePos, nPos ) )
400 : {
401 0 : case CMD_NONE: break;
402 0 : case CMD_ENABLE: m_pParent->enablePackage( GetEntryData( nPos )->m_xPackage, true );
403 0 : break;
404 0 : case CMD_DISABLE: m_pParent->enablePackage( GetEntryData( nPos )->m_xPackage, false );
405 0 : break;
406 0 : case CMD_UPDATE: m_pParent->updatePackage( GetEntryData( nPos )->m_xPackage );
407 0 : break;
408 0 : case CMD_REMOVE: m_pParent->removePackage( GetEntryData( nPos )->m_xPackage );
409 0 : break;
410 : case CMD_SHOW_LICENSE:
411 : {
412 0 : ShowLicenseDialog aLicenseDlg( m_pParent, GetEntryData( nPos )->m_xPackage );
413 0 : aLicenseDlg.Execute();
414 0 : break;
415 : }
416 : }
417 : }
418 0 : else if ( rMEvt.IsLeft() )
419 : {
420 0 : const SolarMutexGuard aGuard;
421 0 : if ( rMEvt.IsMod1() && HasActive() )
422 0 : selectEntry( EXTENSION_LISTBOX_ENTRY_NOTFOUND ); // Selecting an not existing entry will deselect the current one
423 : else
424 0 : selectEntry( nPos );
425 : }
426 : }
427 :
428 : //------------------------------------------------------------------------------
429 0 : long ExtBoxWithBtns_Impl::Notify( NotifyEvent& rNEvt )
430 : {
431 0 : bool bHandled = false;
432 :
433 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
434 : {
435 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
436 0 : KeyCode aKeyCode = pKEvt->GetKeyCode();
437 0 : sal_uInt16 nKeyCode = aKeyCode.GetCode();
438 :
439 0 : if ( nKeyCode == KEY_TAB )
440 0 : bHandled = HandleTabKey( aKeyCode.IsShift() );
441 : }
442 :
443 0 : if ( !bHandled )
444 0 : return ExtensionBox_Impl::Notify( rNEvt );
445 : else
446 0 : return true;
447 : }
448 :
449 : //------------------------------------------------------------------------------
450 0 : void ExtBoxWithBtns_Impl::enableButtons( bool bEnable )
451 : {
452 0 : m_bInterfaceLocked = ! bEnable;
453 :
454 0 : if ( bEnable )
455 : {
456 0 : sal_Int32 nIndex = getSelIndex();
457 0 : if ( nIndex != EXTENSION_LISTBOX_ENTRY_NOTFOUND )
458 0 : SetButtonStatus( GetEntryData( nIndex ) );
459 : }
460 : else
461 : {
462 0 : m_pOptionsBtn->Enable( false );
463 0 : m_pRemoveBtn->Enable( false );
464 0 : m_pEnableBtn->Enable( false );
465 : }
466 0 : }
467 :
468 : // -----------------------------------------------------------------------
469 0 : IMPL_LINK( ExtBoxWithBtns_Impl, ScrollHdl, ScrollBar*, pScrBar )
470 : {
471 0 : long nDelta = pScrBar->GetDelta();
472 :
473 0 : Point aNewOptPt( m_pOptionsBtn->GetPosPixel() - Point( 0, nDelta ) );
474 0 : Point aNewRemPt( m_pRemoveBtn->GetPosPixel() - Point( 0, nDelta ) );
475 0 : Point aNewEnPt( m_pEnableBtn->GetPosPixel() - Point( 0, nDelta ) );
476 :
477 0 : DoScroll( nDelta );
478 :
479 0 : m_pOptionsBtn->SetPosPixel( aNewOptPt );
480 0 : m_pRemoveBtn->SetPosPixel( aNewRemPt );
481 0 : m_pEnableBtn->SetPosPixel( aNewEnPt );
482 :
483 0 : return 1;
484 : }
485 :
486 : // -----------------------------------------------------------------------
487 0 : IMPL_LINK_NOARG(ExtBoxWithBtns_Impl, HandleOptionsBtn)
488 : {
489 0 : const sal_Int32 nActive = getSelIndex();
490 :
491 0 : if ( nActive != EXTENSION_LISTBOX_ENTRY_NOTFOUND )
492 : {
493 0 : SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
494 :
495 0 : if ( pFact )
496 : {
497 0 : OUString sExtensionId = GetEntryData( nActive )->m_xPackage->getIdentifier().Value;
498 0 : VclAbstractDialog* pDlg = pFact->CreateOptionsDialog( this, sExtensionId, rtl::OUString() );
499 :
500 0 : pDlg->Execute();
501 :
502 0 : delete pDlg;
503 : }
504 : }
505 :
506 0 : return 1;
507 : }
508 :
509 : // -----------------------------------------------------------------------
510 0 : IMPL_LINK_NOARG(ExtBoxWithBtns_Impl, HandleEnableBtn)
511 : {
512 0 : const sal_Int32 nActive = getSelIndex();
513 :
514 0 : if ( nActive != EXTENSION_LISTBOX_ENTRY_NOTFOUND )
515 : {
516 0 : TEntry_Impl pEntry = GetEntryData( nActive );
517 :
518 0 : if ( pEntry->m_bMissingLic )
519 0 : m_pParent->acceptLicense( pEntry->m_xPackage );
520 : else
521 : {
522 0 : const bool bEnable( pEntry->m_eState != REGISTERED );
523 0 : m_pParent->enablePackage( pEntry->m_xPackage, bEnable );
524 0 : }
525 : }
526 :
527 0 : return 1;
528 : }
529 :
530 : // -----------------------------------------------------------------------
531 0 : IMPL_LINK_NOARG(ExtBoxWithBtns_Impl, HandleRemoveBtn)
532 : {
533 0 : const sal_Int32 nActive = getSelIndex();
534 :
535 0 : if ( nActive != EXTENSION_LISTBOX_ENTRY_NOTFOUND )
536 : {
537 0 : TEntry_Impl pEntry = GetEntryData( nActive );
538 0 : m_pParent->removePackage( pEntry->m_xPackage );
539 : }
540 :
541 0 : return 1;
542 : }
543 :
544 : //------------------------------------------------------------------------------
545 : // DialogHelper
546 : //------------------------------------------------------------------------------
547 0 : DialogHelper::DialogHelper( const uno::Reference< uno::XComponentContext > &xContext,
548 : Dialog *pWindow ) :
549 : m_pVCLWindow( pWindow ),
550 : m_nEventID( 0 ),
551 0 : m_bIsBusy( false )
552 : {
553 0 : m_xContext = xContext;
554 0 : }
555 :
556 : //------------------------------------------------------------------------------
557 0 : DialogHelper::~DialogHelper()
558 : {
559 0 : if ( m_nEventID )
560 0 : Application::RemoveUserEvent( m_nEventID );
561 0 : }
562 :
563 : //------------------------------------------------------------------------------
564 0 : ResId DialogHelper::getResId( sal_uInt16 nId )
565 : {
566 0 : const SolarMutexGuard guard;
567 0 : return ResId( nId, *DeploymentGuiResMgr::get() );
568 : }
569 :
570 : //------------------------------------------------------------------------------
571 0 : String DialogHelper::getResourceString( sal_uInt16 id )
572 : {
573 0 : const SolarMutexGuard guard;
574 0 : String ret( ResId( id, *DeploymentGuiResMgr::get() ) );
575 0 : if (ret.SearchAscii( "%PRODUCTNAME" ) != STRING_NOTFOUND) {
576 : ret.SearchAndReplaceAllAscii(
577 0 : "%PRODUCTNAME", utl::ConfigManager::getProductName() );
578 : }
579 0 : return ret;
580 : }
581 :
582 : //------------------------------------------------------------------------------
583 0 : bool DialogHelper::IsSharedPkgMgr( const uno::Reference< deployment::XPackage > &xPackage )
584 : {
585 0 : if ( xPackage->getRepositoryName().equals( SHARED_PACKAGE_MANAGER ) )
586 0 : return true;
587 : else
588 0 : return false;
589 : }
590 :
591 : //------------------------------------------------------------------------------
592 0 : bool DialogHelper::continueOnSharedExtension( const uno::Reference< deployment::XPackage > &xPackage,
593 : Window *pParent,
594 : const sal_uInt16 nResID,
595 : bool &bHadWarning )
596 : {
597 0 : if ( !bHadWarning && IsSharedPkgMgr( xPackage ) )
598 : {
599 0 : const SolarMutexGuard guard;
600 0 : WarningBox aInfoBox( pParent, getResId( nResID ) );
601 0 : String aMsgText = aInfoBox.GetMessText();
602 : aMsgText.SearchAndReplaceAllAscii(
603 0 : "%PRODUCTNAME", utl::ConfigManager::getProductName() );
604 0 : aInfoBox.SetMessText( aMsgText );
605 :
606 0 : bHadWarning = true;
607 :
608 0 : if ( RET_OK == aInfoBox.Execute() )
609 0 : return true;
610 : else
611 0 : return false;
612 : }
613 : else
614 0 : return true;
615 : }
616 :
617 : //------------------------------------------------------------------------------
618 0 : void DialogHelper::openWebBrowser( const OUString & sURL, const OUString &sTitle ) const
619 : {
620 0 : if ( sURL.isEmpty() ) // Nothing to do, when the URL is empty
621 0 : return;
622 :
623 : try
624 : {
625 : uno::Reference< XSystemShellExecute > xSystemShellExecute(
626 0 : SystemShellExecute::create(m_xContext));
627 : //throws css::lang::IllegalArgumentException, css::system::SystemShellExecuteException
628 0 : xSystemShellExecute->execute( sURL, OUString(), SystemShellExecuteFlags::URIS_ONLY );
629 : }
630 0 : catch ( const uno::Exception& )
631 : {
632 0 : uno::Any exc( ::cppu::getCaughtException() );
633 0 : OUString msg( ::comphelper::anyToString( exc ) );
634 0 : const SolarMutexGuard guard;
635 0 : ErrorBox aErrorBox( NULL, WB_OK, msg );
636 0 : aErrorBox.SetText( sTitle );
637 0 : aErrorBox.Execute();
638 : }
639 : }
640 :
641 : //------------------------------------------------------------------------------
642 0 : bool DialogHelper::installExtensionWarn( const OUString &rExtensionName ) const
643 : {
644 0 : const SolarMutexGuard guard;
645 0 : WarningBox aInfo( m_pVCLWindow, getResId( RID_WARNINGBOX_INSTALL_EXTENSION ) );
646 :
647 0 : String sText( aInfo.GetMessText() );
648 0 : sText.SearchAndReplaceAllAscii( "%NAME", rExtensionName );
649 0 : aInfo.SetMessText( sText );
650 :
651 0 : return ( RET_OK == aInfo.Execute() );
652 : }
653 :
654 : //------------------------------------------------------------------------------
655 0 : bool DialogHelper::installForAllUsers( bool &bInstallForAll ) const
656 : {
657 0 : const SolarMutexGuard guard;
658 0 : QueryBox aQuery( m_pVCLWindow, getResId( RID_QUERYBOX_INSTALL_FOR_ALL ) );
659 :
660 0 : String sMsgText = aQuery.GetMessText();
661 : sMsgText.SearchAndReplaceAllAscii(
662 0 : "%PRODUCTNAME", utl::ConfigManager::getProductName() );
663 0 : aQuery.SetMessText( sMsgText );
664 :
665 0 : sal_uInt16 nYesBtnID = aQuery.GetButtonId( 0 );
666 0 : sal_uInt16 nNoBtnID = aQuery.GetButtonId( 1 );
667 :
668 0 : if ( nYesBtnID != BUTTONDIALOG_BUTTON_NOTFOUND )
669 0 : aQuery.SetButtonText( nYesBtnID, getResourceString( RID_STR_INSTALL_FOR_ME ) );
670 0 : if ( nNoBtnID != BUTTONDIALOG_BUTTON_NOTFOUND )
671 0 : aQuery.SetButtonText( nNoBtnID, getResourceString( RID_STR_INSTALL_FOR_ALL ) );
672 :
673 0 : short nRet = aQuery.Execute();
674 :
675 0 : if ( nRet == RET_CANCEL )
676 0 : return false;
677 :
678 0 : bInstallForAll = ( nRet == RET_NO );
679 0 : return true;
680 : }
681 :
682 : //------------------------------------------------------------------------------
683 0 : void DialogHelper::PostUserEvent( const Link& rLink, void* pCaller )
684 : {
685 0 : if ( m_nEventID )
686 0 : Application::RemoveUserEvent( m_nEventID );
687 :
688 0 : m_nEventID = Application::PostUserEvent( rLink, pCaller );
689 0 : }
690 :
691 : //------------------------------------------------------------------------------
692 : // ExtMgrDialog
693 : //------------------------------------------------------------------------------
694 0 : ExtMgrDialog::ExtMgrDialog(Window *pParent, TheExtensionManager *pManager)
695 : : ModelessDialog(pParent, "ExtensionManagerDialog", "desktop/ui/extensionmanager.ui")
696 : , DialogHelper(pManager->getContext(), (Dialog*) this)
697 : , m_sAddPackages(getResourceString(RID_STR_ADD_PACKAGES))
698 : , m_bHasProgress(false)
699 : , m_bProgressChanged(false)
700 : , m_bStartProgress(false)
701 : , m_bStopProgress(false)
702 : , m_bEnableWarning(false)
703 : , m_bDisableWarning(false)
704 : , m_bDeleteWarning(false)
705 : , m_nProgress(0)
706 0 : , m_pManager(pManager)
707 : {
708 0 : get(m_pExtensionBox, "extensions");
709 0 : get(m_pAddBtn, "add");
710 0 : get(m_pUpdateBtn, "update");
711 0 : get(m_pCloseBtn, "close");
712 0 : get(m_pBundledCbx, "bundled");
713 0 : get(m_pSharedCbx, "shared");
714 0 : get(m_pUserCbx, "user");
715 0 : get(m_pGetExtensions, "getextensions");
716 0 : get(m_pProgressText, "progressft");
717 0 : get(m_pProgressBar, "progressbar");
718 0 : get(m_pCancelBtn, "cancel");
719 :
720 0 : m_pExtensionBox->InitFromDialog(this);
721 0 : m_pExtensionBox->SetHyperlinkHdl( LINK( this, ExtMgrDialog, HandleHyperlink ) );
722 :
723 0 : m_pAddBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleAddBtn ) );
724 0 : m_pCloseBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleCloseBtn ) );
725 :
726 0 : m_pUpdateBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleUpdateBtn ) );
727 0 : m_pGetExtensions->SetClickHdl( LINK( this, ExtMgrDialog, HandleHyperlink ) );
728 0 : m_pCancelBtn->SetClickHdl( LINK( this, ExtMgrDialog, HandleCancelBtn ) );
729 :
730 0 : m_pBundledCbx->SetClickHdl( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
731 0 : m_pSharedCbx->SetClickHdl( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
732 0 : m_pUserCbx->SetClickHdl( LINK( this, ExtMgrDialog, HandleExtTypeCbx ) );
733 :
734 0 : m_pBundledCbx->Check( true );
735 0 : m_pSharedCbx->Check( true );
736 0 : m_pUserCbx->Check( true );
737 :
738 0 : m_pProgressBar->Hide();
739 :
740 0 : m_pUpdateBtn->Enable(false);
741 :
742 0 : m_aTimeoutTimer.SetTimeout( 500 ); // mSec
743 0 : m_aTimeoutTimer.SetTimeoutHdl( LINK( this, ExtMgrDialog, TimeOutHdl ) );
744 0 : }
745 :
746 : //------------------------------------------------------------------------------
747 0 : ExtMgrDialog::~ExtMgrDialog()
748 : {
749 0 : m_aTimeoutTimer.Stop();
750 0 : }
751 :
752 : //------------------------------------------------------------------------------
753 0 : void ExtMgrDialog::setGetExtensionsURL( const ::rtl::OUString &rURL )
754 : {
755 0 : m_pGetExtensions->SetURL( rURL );
756 0 : }
757 :
758 : //------------------------------------------------------------------------------
759 0 : long ExtMgrDialog::addPackageToList( const uno::Reference< deployment::XPackage > &xPackage,
760 : bool bLicenseMissing )
761 : {
762 :
763 0 : const SolarMutexGuard aGuard;
764 0 : m_pUpdateBtn->Enable(true);
765 :
766 0 : m_pExtensionBox->removeEntry(xPackage);
767 :
768 0 : if (m_pBundledCbx->IsChecked() && xPackage->getRepositoryName().equals( BUNDLED_PACKAGE_MANAGER ))
769 : {
770 0 : return m_pExtensionBox->addEntry( xPackage, bLicenseMissing );
771 : }
772 0 : else if (m_pSharedCbx->IsChecked() && xPackage->getRepositoryName().equals( SHARED_PACKAGE_MANAGER ))
773 : {
774 0 : return m_pExtensionBox->addEntry( xPackage, bLicenseMissing );
775 : }
776 0 : else if (m_pUserCbx->IsChecked() && xPackage->getRepositoryName().equals( USER_PACKAGE_MANAGER ))
777 : {
778 0 : return m_pExtensionBox->addEntry( xPackage, bLicenseMissing );
779 : }
780 : else
781 : {
782 : //OSL_FAIL("Package will not be displayed");
783 0 : return 0;
784 0 : }
785 : }
786 :
787 : //------------------------------------------------------------------------------
788 0 : void ExtMgrDialog::prepareChecking()
789 : {
790 0 : m_pExtensionBox->prepareChecking();
791 0 : }
792 :
793 : //------------------------------------------------------------------------------
794 0 : void ExtMgrDialog::checkEntries()
795 : {
796 0 : const SolarMutexGuard guard;
797 0 : m_pExtensionBox->checkEntries();
798 0 : }
799 :
800 : //------------------------------------------------------------------------------
801 0 : bool ExtMgrDialog::removeExtensionWarn( const OUString &rExtensionName ) const
802 : {
803 0 : const SolarMutexGuard guard;
804 0 : WarningBox aInfo( const_cast< ExtMgrDialog* >(this), getResId( RID_WARNINGBOX_REMOVE_EXTENSION ) );
805 :
806 0 : String sText( aInfo.GetMessText() );
807 0 : sText.SearchAndReplaceAllAscii( "%NAME", rExtensionName );
808 0 : aInfo.SetMessText( sText );
809 :
810 0 : return ( RET_OK == aInfo.Execute() );
811 : }
812 :
813 : //------------------------------------------------------------------------------
814 0 : bool ExtMgrDialog::enablePackage( const uno::Reference< deployment::XPackage > &xPackage,
815 : bool bEnable )
816 : {
817 0 : if ( !xPackage.is() )
818 0 : return false;
819 :
820 0 : if ( bEnable )
821 : {
822 0 : if ( ! continueOnSharedExtension( xPackage, this, RID_WARNINGBOX_ENABLE_SHARED_EXTENSION, m_bEnableWarning ) )
823 0 : return false;
824 : }
825 : else
826 : {
827 0 : if ( ! continueOnSharedExtension( xPackage, this, RID_WARNINGBOX_DISABLE_SHARED_EXTENSION, m_bDisableWarning ) )
828 0 : return false;
829 : }
830 :
831 0 : m_pManager->getCmdQueue()->enableExtension( xPackage, bEnable );
832 :
833 0 : return true;
834 : }
835 :
836 : //------------------------------------------------------------------------------
837 0 : bool ExtMgrDialog::removePackage( const uno::Reference< deployment::XPackage > &xPackage )
838 : {
839 0 : if ( !xPackage.is() )
840 0 : return false;
841 :
842 0 : if ( !IsSharedPkgMgr( xPackage ) || m_bDeleteWarning )
843 : {
844 0 : if ( ! removeExtensionWarn( xPackage->getDisplayName() ) )
845 0 : return false;
846 : }
847 :
848 0 : if ( ! continueOnSharedExtension( xPackage, this, RID_WARNINGBOX_REMOVE_SHARED_EXTENSION, m_bDeleteWarning ) )
849 0 : return false;
850 :
851 0 : m_pManager->getCmdQueue()->removeExtension( xPackage );
852 :
853 0 : return true;
854 : }
855 :
856 : //------------------------------------------------------------------------------
857 0 : bool ExtMgrDialog::updatePackage( const uno::Reference< deployment::XPackage > &xPackage )
858 : {
859 0 : if ( !xPackage.is() )
860 0 : return false;
861 :
862 : // get the extension with highest version
863 : uno::Sequence<uno::Reference<deployment::XPackage> > seqExtensions =
864 0 : m_pManager->getExtensionManager()->getExtensionsWithSameIdentifier(
865 0 : dp_misc::getIdentifier(xPackage), xPackage->getName(), uno::Reference<ucb::XCommandEnvironment>());
866 : uno::Reference<deployment::XPackage> extension =
867 0 : dp_misc::getExtensionWithHighestVersion(seqExtensions);
868 : OSL_ASSERT(extension.is());
869 0 : std::vector< css::uno::Reference< css::deployment::XPackage > > vEntries;
870 0 : vEntries.push_back(extension);
871 :
872 0 : m_pManager->getCmdQueue()->checkForUpdates( vEntries );
873 :
874 0 : return true;
875 : }
876 :
877 : //------------------------------------------------------------------------------
878 0 : bool ExtMgrDialog::acceptLicense( const uno::Reference< deployment::XPackage > &xPackage )
879 : {
880 0 : if ( !xPackage.is() )
881 0 : return false;
882 :
883 0 : m_pManager->getCmdQueue()->acceptLicense( xPackage );
884 :
885 0 : return true;
886 : }
887 :
888 : //------------------------------------------------------------------------------
889 0 : uno::Sequence< OUString > ExtMgrDialog::raiseAddPicker()
890 : {
891 0 : const uno::Any mode( static_cast< sal_Int16 >( ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE ) );
892 0 : const uno::Reference< uno::XComponentContext > xContext( m_pManager->getContext() );
893 : const uno::Reference< ui::dialogs::XFilePicker > xFilePicker(
894 0 : xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
895 : OUSTR("com.sun.star.ui.dialogs.FilePicker"),
896 0 : uno::Sequence< uno::Any >( &mode, 1 ), xContext ), uno::UNO_QUERY_THROW );
897 0 : xFilePicker->setTitle( m_sAddPackages );
898 :
899 0 : if ( m_sLastFolderURL.Len() )
900 0 : xFilePicker->setDisplayDirectory( m_sLastFolderURL );
901 :
902 : // collect and set filter list:
903 : typedef ::std::map< OUString, OUString > t_string2string;
904 0 : t_string2string title2filter;
905 0 : OUString sDefaultFilter( StrAllFiles::get() );
906 :
907 : const uno::Sequence< uno::Reference< deployment::XPackageTypeInfo > > packageTypes(
908 0 : m_pManager->getExtensionManager()->getSupportedPackageTypes() );
909 :
910 0 : for ( sal_Int32 pos = 0; pos < packageTypes.getLength(); ++pos )
911 : {
912 0 : uno::Reference< deployment::XPackageTypeInfo > const & xPackageType = packageTypes[ pos ];
913 0 : const OUString filter( xPackageType->getFileFilter() );
914 0 : if (!filter.isEmpty())
915 : {
916 0 : const OUString title( xPackageType->getShortDescription() );
917 : const ::std::pair< t_string2string::iterator, bool > insertion(
918 0 : title2filter.insert( t_string2string::value_type( title, filter ) ) );
919 0 : if ( ! insertion.second )
920 : { // already existing, append extensions:
921 0 : ::rtl::OUStringBuffer buf;
922 0 : buf.append( insertion.first->second );
923 0 : buf.append( static_cast<sal_Unicode>(';') );
924 0 : buf.append( filter );
925 0 : insertion.first->second = buf.makeStringAndClear();
926 : }
927 0 : if ( xPackageType->getMediaType() == OUSTR( "application/vnd.sun.star.package-bundle" ) )
928 0 : sDefaultFilter = title;
929 : }
930 0 : }
931 :
932 0 : const uno::Reference< ui::dialogs::XFilterManager > xFilterManager( xFilePicker, uno::UNO_QUERY_THROW );
933 : // All files at top:
934 0 : xFilterManager->appendFilter( StrAllFiles::get(), OUSTR("*.*") );
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 : xFilterManager->appendFilter( iPos->first, iPos->second );
941 : }
942 0 : catch (const lang::IllegalArgumentException & exc) {
943 : OSL_FAIL( ::rtl::OUStringToOString(
944 : exc.Message, RTL_TEXTENCODING_UTF8 ).getStr() );
945 : (void) exc;
946 : }
947 : }
948 0 : xFilterManager->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 : long 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 : sal_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 : String aText = m_aUpdateNeeded.GetText();
1227 : aText.SearchAndReplaceAllAscii(
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 : String 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, rtl::OUString(),
1559 0 : aNativeControlRegion, aNativeContentRegion ) != sal_False )
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 : sal_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( ::rtl::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 : 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 : ModalDialog( pParent, DialogHelper::getResId( RID_DLG_SHOW_LICENSE ) ),
1709 : m_aLicenseText( this, DialogHelper::getResId( ML_LICENSE ) ),
1710 0 : m_aCloseBtn( this, DialogHelper::getResId( RID_EM_BTN_CLOSE ) )
1711 : {
1712 0 : FreeResource();
1713 :
1714 0 : OUString aText = xPackage->getLicenseText();
1715 0 : m_aLicenseText.SetText( aText );
1716 0 : }
1717 :
1718 : //------------------------------------------------------------------------------
1719 0 : ShowLicenseDialog::~ShowLicenseDialog()
1720 0 : {}
1721 :
1722 : //------------------------------------------------------------------------------
1723 0 : void ShowLicenseDialog::Resize()
1724 : {
1725 0 : Size aTotalSize( GetOutputSizePixel() );
1726 0 : Size aTextSize( aTotalSize.Width() - RSC_SP_DLG_INNERBORDER_LEFT - RSC_SP_DLG_INNERBORDER_RIGHT,
1727 0 : aTotalSize.Height() - RSC_SP_DLG_INNERBORDER_TOP - 2*RSC_SP_DLG_INNERBORDER_BOTTOM
1728 0 : - m_aCloseBtn.GetSizePixel().Height() );
1729 :
1730 : m_aLicenseText.SetPosSizePixel( Point( RSC_SP_DLG_INNERBORDER_LEFT, RSC_SP_DLG_INNERBORDER_TOP ),
1731 0 : aTextSize );
1732 :
1733 0 : Point aBtnPos( (aTotalSize.Width() - m_aCloseBtn.GetSizePixel().Width())/2,
1734 0 : aTotalSize.Height() - RSC_SP_DLG_INNERBORDER_BOTTOM
1735 0 : - m_aCloseBtn.GetSizePixel().Height() );
1736 0 : m_aCloseBtn.SetPosPixel( aBtnPos );
1737 0 : }
1738 :
1739 : //=================================================================================
1740 : // UpdateRequiredDialogService
1741 : //=================================================================================
1742 0 : UpdateRequiredDialogService::UpdateRequiredDialogService( uno::Sequence< uno::Any > const&,
1743 : uno::Reference< uno::XComponentContext > const& xComponentContext )
1744 0 : : m_xComponentContext( xComponentContext )
1745 : {
1746 0 : }
1747 :
1748 : //------------------------------------------------------------------------------
1749 : // XExecutableDialog
1750 : //------------------------------------------------------------------------------
1751 0 : void UpdateRequiredDialogService::setTitle( OUString const & ) throw ( uno::RuntimeException )
1752 : {
1753 0 : }
1754 :
1755 : //------------------------------------------------------------------------------
1756 0 : sal_Int16 UpdateRequiredDialogService::execute() throw ( uno::RuntimeException )
1757 : {
1758 : ::rtl::Reference< ::dp_gui::TheExtensionManager > xManager( TheExtensionManager::get(
1759 : m_xComponentContext,
1760 : uno::Reference< awt::XWindow >(),
1761 0 : OUString() ) );
1762 0 : xManager->createDialog( true );
1763 0 : sal_Int16 nRet = xManager->execute();
1764 :
1765 0 : return nRet;
1766 : }
1767 :
1768 : //------------------------------------------------------------------------------
1769 0 : SelectedPackage::~SelectedPackage() {}
1770 :
1771 0 : } //namespace dp_gui
1772 :
1773 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|