summaryrefslogtreecommitdiff
path: root/extensions/source/update/ui/updatecheckui.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/update/ui/updatecheckui.cxx')
-rw-r--r--extensions/source/update/ui/updatecheckui.cxx1056
1 files changed, 0 insertions, 1056 deletions
diff --git a/extensions/source/update/ui/updatecheckui.cxx b/extensions/source/update/ui/updatecheckui.cxx
deleted file mode 100644
index 8c5be1bdf..000000000
--- a/extensions/source/update/ui/updatecheckui.cxx
+++ /dev/null
@@ -1,1056 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_extensions.hxx"
-
-#include <list>
-
-#include <cppuhelper/implbase3.hxx>
-#include <cppuhelper/implementationentry.hxx>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/lang/XComponent.hpp>
-#include <com/sun/star/document/XEventListener.hpp>
-#include <com/sun/star/document/XEventBroadcaster.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/graphic/XGraphicProvider.hpp>
-#include <com/sun/star/task/XJob.hpp>
-
-#include <comphelper/processfactory.hxx>
-
-#include <osl/mutex.hxx>
-
-#include <vcl/window.hxx>
-#include <vcl/floatwin.hxx>
-#include <vcl/timer.hxx>
-#include <vcl/menu.hxx>
-#include <vcl/outdev.hxx>
-#include <vcl/msgbox.hxx>
-#include <vcl/lineinfo.hxx>
-#include <vcl/button.hxx>
-#include <vcl/settings.hxx>
-#include <vcl/svapp.hxx>
-#include <sfx2/sfx.hrc>
-#include "rtl/ustrbuf.hxx"
-
-#include "updatecheckui.hrc"
-
-#define UNISTRING(s) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))
-
-#define MSG_ERR_NO_WEBBROWSER_FOUND (RID_SFX_APP_START + 7)
-#define DEFAULT_MENUBAR_HEIGHT 24
-
-#define PROPERTY_TITLE RTL_CONSTASCII_STRINGPARAM("BubbleHeading")
-#define PROPERTY_TEXT RTL_CONSTASCII_STRINGPARAM("BubbleText")
-#define PROPERTY_IMAGE RTL_CONSTASCII_STRINGPARAM("BubbleImageURL")
-#define PROPERTY_SHOW_BUBBLE RTL_CONSTASCII_STRINGPARAM("BubbleVisible")
-#define PROPERTY_CLICK_HDL RTL_CONSTASCII_STRINGPARAM("MenuClickHDL")
-#define PROPERTY_SHOW_MENUICON RTL_CONSTASCII_STRINGPARAM("MenuIconVisible")
-
-#define START_TIMER 1
-
-using namespace ::com::sun::star;
-
-//------------------------------------------------------------------------------
-
-static uno::Sequence< rtl::OUString > getServiceNames()
-{
- uno::Sequence< rtl::OUString > aServiceList(1);
- aServiceList[0] = UNISTRING( "com.sun.star.setup.UpdateCheckUI");
- return aServiceList;
-}
-
-//------------------------------------------------------------------------------
-
-static rtl::OUString getImplementationName()
-{
- return UNISTRING( "vnd.sun.UpdateCheckUI");
-}
-
-//------------------------------------------------------------------------------
-
-namespace
-{
-
-//------------------------------------------------------------------------------
-class BubbleWindow : public FloatingWindow
-{
- Point maTipPos;
- Region maBounds;
- Polygon maRectPoly;
- Polygon maTriPoly;
- XubString maBubbleTitle;
- XubString maBubbleText;
- Image maBubbleImage;
- Size maMaxTextSize;
- Rectangle maTitleRect;
- Rectangle maTextRect;
- long mnTipOffset;
-
-private:
- void RecalcTextRects();
-
-public:
- BubbleWindow( Window* pParent, const XubString& rTitle,
- const XubString& rText, const Image& rImage );
- ~BubbleWindow();
-
- virtual void MouseButtonDown( const MouseEvent& rMEvt );
- virtual void Paint( const Rectangle& rRect );
- void Resize();
- void Show( sal_Bool bVisible = sal_True, sal_uInt16 nFlags = SHOW_NOACTIVATE );
- void SetTipPosPixel( const Point& rTipPos ) { maTipPos = rTipPos; }
- void SetTitleAndText( const XubString& rTitle, const XubString& rText,
- const Image& rImage );
-};
-
-//------------------------------------------------------------------------------
-class UpdateCheckUI : public ::cppu::WeakImplHelper3
- < lang::XServiceInfo, document::XEventListener, beans::XPropertySet >
-{
- uno::Reference< uno::XComponentContext > m_xContext;
- uno::Reference< task::XJob > mrJob;
- rtl::OUString maBubbleTitle;
- rtl::OUString maBubbleText;
- rtl::OUString maBubbleImageURL;
- Image maBubbleImage;
- BubbleWindow* mpBubbleWin;
- SystemWindow* mpIconSysWin;
- MenuBar* mpIconMBar;
- ResMgr* mpUpdResMgr;
- ResMgr* mpSfxResMgr;
- Timer maWaitTimer;
- Timer maTimeoutTimer;
- Link maWindowEventHdl;
- Link maApplicationEventHdl;
- bool mbShowBubble;
- bool mbShowMenuIcon;
- bool mbBubbleChanged;
- sal_uInt16 mnIconID;
-
-private:
- DECL_LINK( ClickHdl, sal_uInt16* );
- DECL_LINK( HighlightHdl, MenuBar::MenuBarButtonCallbackArg* );
- DECL_LINK( WaitTimeOutHdl, Timer* );
- DECL_LINK( TimeOutHdl, Timer* );
- DECL_LINK( UserEventHdl, UpdateCheckUI* );
- DECL_LINK( WindowEventHdl, VclWindowEvent* );
- DECL_LINK( ApplicationEventHdl, VclSimpleEvent* );
-
- BubbleWindow* GetBubbleWindow();
- void RemoveBubbleWindow( bool bRemoveIcon );
- Image GetMenuBarIcon( MenuBar* pMBar );
- void AddMenuBarIcon( SystemWindow* pSysWin, bool bAddEventHdl );
- Image GetBubbleImage( ::rtl::OUString &rURL );
-
- uno::Reference< document::XEventBroadcaster > getGlobalEventBroadcaster() const
- throw (uno::RuntimeException);
-
-public:
- UpdateCheckUI(const uno::Reference<uno::XComponentContext>&);
- virtual ~UpdateCheckUI();
-
- // XServiceInfo
- virtual rtl::OUString SAL_CALL getImplementationName()
- throw (uno::RuntimeException);
- virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & serviceName)
- throw (uno::RuntimeException);
- virtual uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames()
- throw (uno::RuntimeException);
-
- // XEventListener
- virtual void SAL_CALL notifyEvent(const document::EventObject& Event)
- throw (uno::RuntimeException);
- virtual void SAL_CALL disposing(const lang::EventObject& Event)
- throw (uno::RuntimeException);
-
- //XPropertySet
- virtual uno::Reference< beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(void)
- throw ( uno::RuntimeException );
- virtual void SAL_CALL setPropertyValue(const rtl::OUString& PropertyName, const uno::Any& aValue)
- throw( beans::UnknownPropertyException, beans::PropertyVetoException,
- lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException );
- virtual uno::Any SAL_CALL getPropertyValue(const rtl::OUString& PropertyName)
- throw ( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException );
- virtual void SAL_CALL addPropertyChangeListener(const rtl::OUString& PropertyName,
- const uno::Reference< beans::XPropertyChangeListener > & aListener)
- throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException );
- virtual void SAL_CALL removePropertyChangeListener(const rtl::OUString& PropertyName,
- const uno::Reference< beans::XPropertyChangeListener > & aListener)
- throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException );
- virtual void SAL_CALL addVetoableChangeListener(const rtl::OUString& PropertyName,
- const uno::Reference< beans::XVetoableChangeListener > & aListener)
- throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException );
- virtual void SAL_CALL removeVetoableChangeListener(const rtl::OUString& PropertyName,
- const uno::Reference< beans::XVetoableChangeListener > & aListener)
- throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException );
-};
-
-//------------------------------------------------------------------------------
-UpdateCheckUI::UpdateCheckUI(const uno::Reference<uno::XComponentContext>& xContext) :
- m_xContext(xContext)
- , mpBubbleWin( NULL )
- , mpIconSysWin( NULL )
- , mpIconMBar( NULL )
- , mbShowBubble( false )
- , mbShowMenuIcon( false )
- , mbBubbleChanged( false )
- , mnIconID( 0 )
-{
- mpUpdResMgr = ResMgr::CreateResMgr( "updchk" );
- mpSfxResMgr = ResMgr::CreateResMgr( "sfx" );
-
- maBubbleImage = GetBubbleImage( maBubbleImageURL );
-
- maWaitTimer.SetTimeout( 400 );
- maWaitTimer.SetTimeoutHdl( LINK( this, UpdateCheckUI, WaitTimeOutHdl ) );
-
- maTimeoutTimer.SetTimeout( 10000 );
- maTimeoutTimer.SetTimeoutHdl( LINK( this, UpdateCheckUI, TimeOutHdl ) );
-
- uno::Reference< document::XEventBroadcaster > xBroadcaster( getGlobalEventBroadcaster() );
- xBroadcaster->addEventListener( this );
-
- maWindowEventHdl = LINK( this, UpdateCheckUI, WindowEventHdl );
- maApplicationEventHdl = LINK( this, UpdateCheckUI, ApplicationEventHdl );
- Application::AddEventListener( maApplicationEventHdl );
-}
-
-//------------------------------------------------------------------------------
-UpdateCheckUI::~UpdateCheckUI()
-{
- Application::RemoveEventListener( maApplicationEventHdl );
- RemoveBubbleWindow( true );
- delete mpUpdResMgr;
- delete mpSfxResMgr;
-}
-
-//------------------------------------------------------------------------------
-uno::Reference<document::XEventBroadcaster>
-UpdateCheckUI::getGlobalEventBroadcaster() const throw (uno::RuntimeException)
-{
- if( !m_xContext.is() )
- throw uno::RuntimeException(
- UNISTRING( "UpdateCheckUI: empty component context" ),
- uno::Reference< uno::XInterface >() );
-
- uno::Reference< lang::XMultiComponentFactory > xServiceManager(m_xContext->getServiceManager());
-
- if( !xServiceManager.is() )
- throw uno::RuntimeException(
- UNISTRING( "UpdateCheckUI: unable to obtain service manager from component context" ),
- uno::Reference< uno::XInterface >() );
-
- return uno::Reference<document::XEventBroadcaster> (
- xServiceManager->createInstanceWithContext(
- UNISTRING( "com.sun.star.frame.GlobalEventBroadcaster" ),
- m_xContext),
- uno::UNO_QUERY_THROW);
-}
-
-//------------------------------------------------------------------------------
-rtl::OUString SAL_CALL
-UpdateCheckUI::getImplementationName() throw (uno::RuntimeException)
-{
- return ::getImplementationName();
-}
-
-//------------------------------------------------------------------------------
-uno::Sequence< rtl::OUString > SAL_CALL
-UpdateCheckUI::getSupportedServiceNames() throw (uno::RuntimeException)
-{
- return ::getServiceNames();
-}
-
-//------------------------------------------------------------------------------
-sal_Bool SAL_CALL
-UpdateCheckUI::supportsService( rtl::OUString const & serviceName ) throw (uno::RuntimeException)
-{
- uno::Sequence< rtl::OUString > aServiceNameList = ::getServiceNames();
-
- for( sal_Int32 n=0; n < aServiceNameList.getLength(); n++ )
- if( aServiceNameList[n].equals(serviceName) )
- return sal_True;
-
- return sal_False;
-}
-
-//------------------------------------------------------------------------------
-Image UpdateCheckUI::GetMenuBarIcon( MenuBar* pMBar )
-{
- sal_uInt32 nResID;
- Window *pMBarWin = pMBar->GetWindow();
- sal_uInt32 nMBarHeight = 20;
-
- if ( pMBarWin )
- nMBarHeight = pMBarWin->GetOutputSizePixel().getHeight();
-
- if ( nMBarHeight >= 35 )
- nResID = RID_UPDATE_AVAILABLE_26;
- else
- nResID = RID_UPDATE_AVAILABLE_16;
-
- return Image( ResId( nResID, *mpUpdResMgr ) );
-}
-
-//------------------------------------------------------------------------------
-Image UpdateCheckUI::GetBubbleImage( ::rtl::OUString &rURL )
-{
- Image aImage;
-
- if ( maBubbleImageURL.getLength() != 0 )
- {
- uno::Reference< lang::XMultiServiceFactory > xServiceManager = ::comphelper::getProcessServiceFactory();
-
- if( !xServiceManager.is() )
- throw uno::RuntimeException(
- UNISTRING( "UpdateCheckUI: unable to obtain service manager from component context" ),
- uno::Reference< uno::XInterface >() );
-
- try
- {
- uno::Reference< graphic::XGraphicProvider > xGraphProvider(
- xServiceManager->createInstance(
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.graphic.GraphicProvider")) ),
- uno::UNO_QUERY );
- if ( xGraphProvider.is() )
- {
- uno::Sequence< beans::PropertyValue > aMediaProps( 1 );
- aMediaProps[0].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("URL"));
- aMediaProps[0].Value <<= rURL;
-
- uno::Reference< graphic::XGraphic > xGraphic = xGraphProvider->queryGraphic( aMediaProps );
- if ( xGraphic.is() )
- {
- aImage = Image( xGraphic );
- }
- }
- }
- catch( uno::Exception& )
- {
- }
- }
-
- if ( aImage.GetSizePixel().Width() == 0 )
- aImage = InfoBox::GetStandardImage();
-
- return aImage;
-}
-
-//------------------------------------------------------------------------------
-void UpdateCheckUI::AddMenuBarIcon( SystemWindow *pSysWin, bool bAddEventHdl )
-{
- if ( ! mbShowMenuIcon )
- return;
-
- SolarMutexGuard aGuard;
-
- MenuBar *pActiveMBar = pSysWin->GetMenuBar();
- if ( ( pSysWin != mpIconSysWin ) || ( pActiveMBar != mpIconMBar ) )
- {
- if ( bAddEventHdl && mpIconSysWin )
- mpIconSysWin->RemoveEventListener( maWindowEventHdl );
-
- RemoveBubbleWindow( true );
-
- if ( pActiveMBar )
- {
- rtl::OUStringBuffer aBuf;
- if( maBubbleTitle.getLength() )
- aBuf.append( maBubbleTitle );
- if( maBubbleText.getLength() )
- {
- if( maBubbleTitle.getLength() )
- aBuf.appendAscii( "\n\n" );
- aBuf.append( maBubbleText );
- }
-
- Image aImage = GetMenuBarIcon( pActiveMBar );
- mnIconID = pActiveMBar->AddMenuBarButton( aImage,
- LINK( this, UpdateCheckUI, ClickHdl ),
- aBuf.makeStringAndClear()
- );
- pActiveMBar->SetMenuBarButtonHighlightHdl( mnIconID,
- LINK( this, UpdateCheckUI, HighlightHdl ) );
- }
- mpIconMBar = pActiveMBar;
- mpIconSysWin = pSysWin;
- if ( bAddEventHdl && mpIconSysWin )
- mpIconSysWin->AddEventListener( maWindowEventHdl );
- }
-
- if ( mbShowBubble && pActiveMBar )
- {
- mpBubbleWin = GetBubbleWindow();
- if ( mpBubbleWin )
- {
- mpBubbleWin->Show( sal_True );
- maTimeoutTimer.Start();
- }
- mbShowBubble = false;
- }
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL UpdateCheckUI::notifyEvent(const document::EventObject& rEvent)
- throw (uno::RuntimeException)
-{
- SolarMutexGuard aGuard;
-
- if( rEvent.EventName.compareToAscii( RTL_CONSTASCII_STRINGPARAM("OnPrepareViewClosing") ) == 0 )
- {
- RemoveBubbleWindow( true );
- }
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL UpdateCheckUI::disposing(const lang::EventObject&)
- throw (uno::RuntimeException)
-{
-}
-
-//------------------------------------------------------------------------------
-uno::Reference< beans::XPropertySetInfo > UpdateCheckUI::getPropertySetInfo(void)
- throw ( uno::RuntimeException )
-{
- return NULL;
-}
-
-//------------------------------------------------------------------------------
-void UpdateCheckUI::setPropertyValue(const rtl::OUString& rPropertyName,
- const uno::Any& rValue)
- throw( beans::UnknownPropertyException, beans::PropertyVetoException,
- lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
-{
- SolarMutexGuard aGuard;
-
- rtl::OUString aString;
-
- if( rPropertyName.compareToAscii( PROPERTY_TITLE ) == 0 ) {
- rValue >>= aString;
- if ( aString != maBubbleTitle ) {
- maBubbleTitle = aString;
- mbBubbleChanged = true;
- }
- }
- else if( rPropertyName.compareToAscii( PROPERTY_TEXT ) == 0 ) {
- rValue >>= aString;
- if ( aString != maBubbleText ) {
- maBubbleText = aString;
- mbBubbleChanged = true;
- }
- }
- else if( rPropertyName.compareToAscii( PROPERTY_IMAGE ) == 0 ) {
- rValue >>= aString;
- if ( aString != maBubbleImageURL ) {
- maBubbleImageURL = aString;
- maBubbleImage = GetBubbleImage( maBubbleImageURL );
- mbBubbleChanged = true;
- }
- }
- else if( rPropertyName.compareToAscii( PROPERTY_SHOW_BUBBLE ) == 0 ) {
- rValue >>= mbShowBubble;
- if ( mbShowBubble )
- Application::PostUserEvent( LINK( this, UpdateCheckUI, UserEventHdl ) );
- else if ( mpBubbleWin )
- mpBubbleWin->Show( sal_False );
- }
- else if( rPropertyName.compareToAscii( PROPERTY_CLICK_HDL ) == 0 ) {
- uno::Reference< task::XJob > aJob;
- rValue >>= aJob;
- if ( aJob.is() )
- mrJob = aJob;
- else
- throw lang::IllegalArgumentException();
- }
- else if (rPropertyName.compareToAscii( PROPERTY_SHOW_MENUICON ) == 0) {
- bool bShowMenuIcon = sal_False;
- rValue >>= bShowMenuIcon;
- if ( bShowMenuIcon != mbShowMenuIcon )
- {
- mbShowMenuIcon = bShowMenuIcon;
- if ( bShowMenuIcon )
- Application::PostUserEvent( LINK( this, UpdateCheckUI, UserEventHdl ) );
- else
- RemoveBubbleWindow( true );
- }
- }
- else
- throw beans::UnknownPropertyException();
-
- if ( mbBubbleChanged && mpBubbleWin )
- mpBubbleWin->Show( sal_False );
-}
-
-//------------------------------------------------------------------------------
-uno::Any UpdateCheckUI::getPropertyValue(const rtl::OUString& rPropertyName)
- throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
-{
- SolarMutexGuard aGuard;
-
- uno::Any aRet;
-
- if( rPropertyName.compareToAscii( PROPERTY_TITLE ) == 0 )
- aRet = uno::makeAny( maBubbleTitle );
- else if( rPropertyName.compareToAscii( PROPERTY_TEXT ) == 0 )
- aRet = uno::makeAny( maBubbleText );
- else if( rPropertyName.compareToAscii( PROPERTY_SHOW_BUBBLE ) == 0 )
- aRet = uno::makeAny( mbShowBubble );
- else if( rPropertyName.compareToAscii( PROPERTY_IMAGE ) == 0 )
- aRet = uno::makeAny( maBubbleImageURL );
- else if( rPropertyName.compareToAscii( PROPERTY_CLICK_HDL ) == 0 )
- aRet = uno::makeAny( mrJob );
- else if( rPropertyName.compareToAscii( PROPERTY_SHOW_MENUICON ) == 0 )
- aRet = uno::makeAny( mbShowMenuIcon );
- else
- throw beans::UnknownPropertyException();
-
- return aRet;
-}
-
-//------------------------------------------------------------------------------
-void UpdateCheckUI::addPropertyChangeListener( const rtl::OUString& /*aPropertyName*/,
- const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/)
- throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
-{
- //no bound properties
-}
-
-//------------------------------------------------------------------------------
-void UpdateCheckUI::removePropertyChangeListener( const rtl::OUString& /*aPropertyName*/,
- const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/)
- throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
-{
- //no bound properties
-}
-
-//------------------------------------------------------------------------------
-void UpdateCheckUI::addVetoableChangeListener( const rtl::OUString& /*aPropertyName*/,
- const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/)
- throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
-{
- //no vetoable properties
-}
-
-//------------------------------------------------------------------------------
-void UpdateCheckUI::removeVetoableChangeListener( const rtl::OUString& /*aPropertyName*/,
- const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/)
- throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
-{
- //no vetoable properties
-}
-
-
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-BubbleWindow * UpdateCheckUI::GetBubbleWindow()
-{
- if ( !mpIconSysWin )
- return NULL;
-
- Rectangle aIconRect = mpIconMBar->GetMenuBarButtonRectPixel( mnIconID );
- if( aIconRect.IsEmpty() )
- return NULL;
-
- BubbleWindow* pBubbleWin = mpBubbleWin;
-
- if ( !pBubbleWin ) {
- pBubbleWin = new BubbleWindow( mpIconSysWin,
- XubString( maBubbleTitle ),
- XubString( maBubbleText ),
- maBubbleImage );
- mbBubbleChanged = false;
- }
- else if ( mbBubbleChanged ) {
- pBubbleWin->SetTitleAndText( XubString( maBubbleTitle ),
- XubString( maBubbleText ),
- maBubbleImage );
- mbBubbleChanged = false;
- }
-
- Point aWinPos = aIconRect.BottomCenter();
-
- pBubbleWin->SetTipPosPixel( aWinPos );
-
- return pBubbleWin;
-}
-
-//------------------------------------------------------------------------------
-void UpdateCheckUI::RemoveBubbleWindow( bool bRemoveIcon )
-{
- SolarMutexGuard aGuard;
-
- maWaitTimer.Stop();
- maTimeoutTimer.Stop();
-
- if ( mpBubbleWin )
- {
- delete mpBubbleWin;
- mpBubbleWin = NULL;
- }
-
- if ( bRemoveIcon )
- {
- try {
- if ( mpIconMBar && ( mnIconID != 0 ) )
- {
- mpIconMBar->RemoveMenuBarButton( mnIconID );
- mpIconMBar = NULL;
- mnIconID = 0;
- }
- }
- catch ( ... ) {
- mpIconMBar = NULL;
- mnIconID = 0;
- }
-
- mpIconSysWin = NULL;
- }
-}
-
-// -----------------------------------------------------------------------
-IMPL_LINK( UpdateCheckUI, ClickHdl, sal_uInt16*, EMPTYARG )
-{
- SolarMutexGuard aGuard;
-
- maWaitTimer.Stop();
- if ( mpBubbleWin )
- mpBubbleWin->Show( sal_False );
-
- if ( mrJob.is() )
- {
- try {
- uno::Sequence<beans::NamedValue> aEmpty;
- mrJob->execute( aEmpty );
- }
- catch(const uno::Exception&) {
- ErrorBox( NULL, ResId( MSG_ERR_NO_WEBBROWSER_FOUND, *mpSfxResMgr )).Execute();
- }
- }
-
- return 0;
-}
-
-// -----------------------------------------------------------------------
-IMPL_LINK( UpdateCheckUI, HighlightHdl, MenuBar::MenuBarButtonCallbackArg*, pData )
-{
- if ( pData->bHighlight )
- maWaitTimer.Start();
- else
- RemoveBubbleWindow( false );
-
- return 0;
-}
-
-// -----------------------------------------------------------------------
-IMPL_LINK( UpdateCheckUI, WaitTimeOutHdl, Timer*, EMPTYARG )
-{
- SolarMutexGuard aGuard;
-
- mpBubbleWin = GetBubbleWindow();
-
- if ( mpBubbleWin )
- {
- mpBubbleWin->Show();
- }
-
- return 0;
-}
-
-// -----------------------------------------------------------------------
-IMPL_LINK( UpdateCheckUI, TimeOutHdl, Timer*, EMPTYARG )
-{
- RemoveBubbleWindow( false );
-
- return 0;
-}
-
-// -----------------------------------------------------------------------
-IMPL_LINK( UpdateCheckUI, UserEventHdl, UpdateCheckUI*, EMPTYARG )
-{
- SolarMutexGuard aGuard;
-
- Window *pTopWin = Application::GetFirstTopLevelWindow();
- Window *pActiveWin = Application::GetActiveTopWindow();
- SystemWindow *pActiveSysWin = NULL;
-
- Window *pBubbleWin = NULL;
- if ( mpBubbleWin )
- pBubbleWin = mpBubbleWin;
-
- if ( pActiveWin && ( pActiveWin != pBubbleWin ) && pActiveWin->IsTopWindow() )
- pActiveSysWin = pActiveWin->GetSystemWindow();
-
- if ( pActiveWin == pBubbleWin )
- pActiveSysWin = NULL;
-
- while ( !pActiveSysWin && pTopWin )
- {
- if ( ( pTopWin != pBubbleWin ) && pTopWin->IsTopWindow() )
- pActiveSysWin = pTopWin->GetSystemWindow();
- if ( !pActiveSysWin )
- pTopWin = Application::GetNextTopLevelWindow( pTopWin );
- }
-
- if ( pActiveSysWin )
- AddMenuBarIcon( pActiveSysWin, true );
-
- return 0;
-}
-
-// -----------------------------------------------------------------------
-IMPL_LINK( UpdateCheckUI, WindowEventHdl, VclWindowEvent*, pEvent )
-{
- sal_uLong nEventID = pEvent->GetId();
-
- if ( VCLEVENT_OBJECT_DYING == nEventID )
- {
- SolarMutexGuard aGuard;
- if ( mpIconSysWin == pEvent->GetWindow() )
- {
- mpIconSysWin->RemoveEventListener( maWindowEventHdl );
- RemoveBubbleWindow( true );
- }
- }
- else if ( VCLEVENT_WINDOW_MENUBARADDED == nEventID )
- {
- SolarMutexGuard aGuard;
- Window *pWindow = pEvent->GetWindow();
- if ( pWindow )
- {
- SystemWindow *pSysWin = pWindow->GetSystemWindow();
- if ( pSysWin )
- {
- AddMenuBarIcon( pSysWin, false );
- }
- }
- }
- else if ( VCLEVENT_WINDOW_MENUBARREMOVED == nEventID )
- {
- SolarMutexGuard aGuard;
- MenuBar *pMBar = (MenuBar*) pEvent->GetData();
- if ( pMBar && ( pMBar == mpIconMBar ) )
- RemoveBubbleWindow( true );
- }
- else if ( ( nEventID == VCLEVENT_WINDOW_MOVE ) ||
- ( nEventID == VCLEVENT_WINDOW_RESIZE ) )
- {
- SolarMutexGuard aGuard;
- if ( ( mpIconSysWin == pEvent->GetWindow() ) &&
- ( mpBubbleWin != NULL ) && ( mpIconMBar != NULL ) )
- {
- Rectangle aIconRect = mpIconMBar->GetMenuBarButtonRectPixel( mnIconID );
- Point aWinPos = aIconRect.BottomCenter();
- mpBubbleWin->SetTipPosPixel( aWinPos );
- if ( mpBubbleWin->IsVisible() )
- mpBubbleWin->Show(); // This will recalc the screen positon of the bubble
- }
- }
-
- return 0;
-}
-
-//------------------------------------------------------------------------------
-IMPL_LINK( UpdateCheckUI, ApplicationEventHdl, VclSimpleEvent *, pEvent)
-{
- switch (pEvent->GetId())
- {
- case VCLEVENT_WINDOW_SHOW:
- case VCLEVENT_WINDOW_ACTIVATE:
- case VCLEVENT_WINDOW_GETFOCUS: {
- SolarMutexGuard aGuard;
-
- Window *pWindow = static_cast< VclWindowEvent * >(pEvent)->GetWindow();
- if ( pWindow && pWindow->IsTopWindow() )
- {
- SystemWindow *pSysWin = pWindow->GetSystemWindow();
- MenuBar *pMBar = pSysWin->GetMenuBar();
- if ( pSysWin && pMBar )
- {
- AddMenuBarIcon( pSysWin, true );
- }
- }
- break;
- }
- }
- return 0;
-}
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-
-#define TIP_HEIGHT 15
-#define TIP_WIDTH 7
-#define TIP_RIGHT_OFFSET 18
-#define BUBBLE_BORDER 10
-#define TEXT_MAX_WIDTH 300
-#define TEXT_MAX_HEIGHT 200
-#define INITIAL_SHOW_TIME 10000
-
-//------------------------------------------------------------------------------
-BubbleWindow::BubbleWindow( Window* pParent, const XubString& rTitle,
- const XubString& rText, const Image& rImage )
- : FloatingWindow( pParent, WB_SYSTEMWINDOW
- | WB_OWNERDRAWDECORATION
- | WB_NOBORDER
- )
- , maBubbleTitle( rTitle )
- , maBubbleText( rText )
- , maBubbleImage( rImage )
- , maMaxTextSize( TEXT_MAX_WIDTH, TEXT_MAX_HEIGHT )
- , mnTipOffset( 0 )
-{
- SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetHelpColor() ) );
-}
-
-//------------------------------------------------------------------------------
-BubbleWindow::~BubbleWindow()
-{
-}
-
-//------------------------------------------------------------------------------
-void BubbleWindow::Resize()
-{
- SolarMutexGuard aGuard;
-
- FloatingWindow::Resize();
-
- Size aSize = GetSizePixel();
-
- if ( ( aSize.Height() < 20 ) || ( aSize.Width() < 60 ) )
- return;
-
- Rectangle aRect( 0, TIP_HEIGHT, aSize.Width(), aSize.Height() - TIP_HEIGHT );
- maRectPoly = Polygon( aRect, 6, 6 );
- Region aRegion( maRectPoly );
- long nTipOffset = aSize.Width() - TIP_RIGHT_OFFSET + mnTipOffset;
-
- Point aPointArr[4];
- aPointArr[0] = Point( nTipOffset, TIP_HEIGHT );
- aPointArr[1] = Point( nTipOffset, 0 );
- aPointArr[2] = Point( nTipOffset + TIP_WIDTH , TIP_HEIGHT );
- aPointArr[3] = Point( nTipOffset, TIP_HEIGHT );
- maTriPoly = Polygon( 4, aPointArr );
- Region aTriRegion( maTriPoly );
-
- aRegion.Union( aTriRegion);
- maBounds = aRegion;
-
- SetWindowRegionPixel( maBounds );
-}
-
-//------------------------------------------------------------------------------
-void BubbleWindow::SetTitleAndText( const XubString& rTitle,
- const XubString& rText,
- const Image& rImage )
-{
- maBubbleTitle = rTitle;
- maBubbleText = rText;
- maBubbleImage = rImage;
-
- Resize();
-}
-
-//------------------------------------------------------------------------------
-void BubbleWindow::Paint( const Rectangle& )
-{
- SolarMutexGuard aGuard;
-
- LineInfo aThickLine( LINE_SOLID, 2 );
-
- DrawPolyLine( maRectPoly, aThickLine );
- DrawPolyLine( maTriPoly );
-
- Color aOldLine = GetLineColor();
- Size aSize = GetSizePixel();
- long nTipOffset = aSize.Width() - TIP_RIGHT_OFFSET + mnTipOffset;
-
- SetLineColor( GetSettings().GetStyleSettings().GetHelpColor() );
- DrawLine( Point( nTipOffset+2, TIP_HEIGHT ),
- Point( nTipOffset + TIP_WIDTH -1 , TIP_HEIGHT ),
- aThickLine );
- SetLineColor( aOldLine );
-
- //Image aImage = InfoBox::GetStandardImage();
- Size aImgSize = maBubbleImage.GetSizePixel();
-
- DrawImage( Point( BUBBLE_BORDER, BUBBLE_BORDER + TIP_HEIGHT ), maBubbleImage );
-
- Font aOldFont = GetFont();
- Font aBoldFont = aOldFont;
- aBoldFont.SetWeight( WEIGHT_BOLD );
-
- SetFont( aBoldFont );
- Rectangle aTitleRect = maTitleRect;
- aTitleRect.Move( aImgSize.Width(), 0 );
- DrawText( aTitleRect, maBubbleTitle, TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK );
-
- SetFont( aOldFont );
- Rectangle aTextRect = maTextRect;
- aTextRect.Move( aImgSize.Width(), 0 );
- DrawText( aTextRect, maBubbleText, TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK );
-}
-
-//------------------------------------------------------------------------------
-void BubbleWindow::MouseButtonDown( const MouseEvent& )
-{
- Show( sal_False );
-}
-
-//------------------------------------------------------------------------------
-void BubbleWindow::Show( sal_Bool bVisible, sal_uInt16 nFlags )
-{
- SolarMutexGuard aGuard;
-
- if ( !bVisible )
- {
- FloatingWindow::Show( bVisible );
- return;
- }
-
- // don't show bubbles without a text
- if ( ( maBubbleTitle.Len() == 0 ) && ( maBubbleText.Len() == 0 ) )
- return;
-
- Size aWindowSize = GetSizePixel();
-
- // Image aImage = InfoBox::GetStandardImage();
- Size aImgSize = maBubbleImage.GetSizePixel();
-
- RecalcTextRects();
-
- aWindowSize.setHeight( maTitleRect.GetHeight() * 7 / 4+ maTextRect.GetHeight() +
- 3 * BUBBLE_BORDER + TIP_HEIGHT );
-
- if ( maTitleRect.GetWidth() > maTextRect.GetWidth() )
- aWindowSize.setWidth( maTitleRect.GetWidth() );
- else
- aWindowSize.setWidth( maTextRect.GetWidth() );
-
- aWindowSize.setWidth( aWindowSize.Width() + 3 * BUBBLE_BORDER + aImgSize.Width() );
-
- if ( aWindowSize.Height() < aImgSize.Height() + TIP_HEIGHT + 2 * BUBBLE_BORDER )
- aWindowSize.setHeight( aImgSize.Height() + TIP_HEIGHT + 2 * BUBBLE_BORDER );
-
- Point aPos;
- aPos.X() = maTipPos.X() - aWindowSize.Width() + TIP_RIGHT_OFFSET;
- aPos.Y() = maTipPos.Y();
- Point aScreenPos = GetParent()->OutputToAbsoluteScreenPixel( aPos );
- if ( aScreenPos.X() < 0 )
- {
- mnTipOffset = aScreenPos.X();
- aPos.X() -= mnTipOffset;
- }
- SetPosSizePixel( aPos, aWindowSize );
-
- FloatingWindow::Show( bVisible, nFlags );
-}
-
-//------------------------------------------------------------------------------
-void BubbleWindow::RecalcTextRects()
-{
- Size aTotalSize;
- sal_Bool bFinished = sal_False;
- Font aOldFont = GetFont();
- Font aBoldFont = aOldFont;
-
- aBoldFont.SetWeight( WEIGHT_BOLD );
-
- while ( !bFinished )
- {
- SetFont( aBoldFont );
-
- maTitleRect = GetTextRect( Rectangle( Point( 0, 0 ), maMaxTextSize ),
- maBubbleTitle,
- TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK );
-
- SetFont( aOldFont );
- maTextRect = GetTextRect( Rectangle( Point( 0, 0 ), maMaxTextSize ),
- maBubbleText,
- TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK );
-
- if ( maTextRect.GetHeight() < 10 )
- maTextRect.setHeight( 10 );
-
- aTotalSize.setHeight( maTitleRect.GetHeight() +
- aBoldFont.GetHeight() * 3 / 4 +
- maTextRect.GetHeight() +
- 3 * BUBBLE_BORDER + TIP_HEIGHT );
- if ( aTotalSize.Height() > maMaxTextSize.Height() )
- {
- maMaxTextSize.Width() = maMaxTextSize.Width() * 3 / 2;
- maMaxTextSize.Height() = maMaxTextSize.Height() * 3 / 2;
- }
- else
- bFinished = sal_True;
- }
- maTitleRect.Move( 2*BUBBLE_BORDER, BUBBLE_BORDER + TIP_HEIGHT );
- maTextRect.Move( 2*BUBBLE_BORDER, BUBBLE_BORDER + TIP_HEIGHT + maTitleRect.GetHeight() + aBoldFont.GetHeight() * 3 / 4 );
-}
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-
-} // anonymous namespace
-
-//------------------------------------------------------------------------------
-
-static uno::Reference<uno::XInterface> SAL_CALL
-createInstance(const uno::Reference<uno::XComponentContext>& xContext)
-{
- return *new UpdateCheckUI(xContext);
-}
-
-//------------------------------------------------------------------------------
-
-static const cppu::ImplementationEntry kImplementations_entries[] =
-{
- {
- createInstance,
- getImplementationName,
- getServiceNames,
- cppu::createSingleComponentFactory,
- NULL,
- 0
- },
- { NULL, NULL, NULL, NULL, NULL, 0 }
-} ;
-
-//------------------------------------------------------------------------------
-
-extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(const sal_Char *pszImplementationName, void *pServiceManager, void *pRegistryKey)
-{
- return cppu::component_getFactoryHelper(
- pszImplementationName,
- pServiceManager,
- pRegistryKey,
- kImplementations_entries) ;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */