1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_framework.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 33*cdf0e10cSrcweir // my own includes 34*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 35*cdf0e10cSrcweir #include <classes/menumanager.hxx> 36*cdf0e10cSrcweir #include <framework/menuconfiguration.hxx> 37*cdf0e10cSrcweir #include <framework/bmkmenu.hxx> 38*cdf0e10cSrcweir #include <framework/addonmenu.hxx> 39*cdf0e10cSrcweir #include <framework/imageproducer.hxx> 40*cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx> 41*cdf0e10cSrcweir #include "framework/addonsoptions.hxx" 42*cdf0e10cSrcweir #include <classes/fwkresid.hxx> 43*cdf0e10cSrcweir #include <services.h> 44*cdf0e10cSrcweir #include "classes/resource.hrc" 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 47*cdf0e10cSrcweir // interface includes 48*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 49*cdf0e10cSrcweir #include <com/sun/star/frame/XDispatchProvider.hpp> 50*cdf0e10cSrcweir #include <com/sun/star/frame/XDispatch.hpp> 51*cdf0e10cSrcweir #include <com/sun/star/util/XURLTransformer.hpp> 52*cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 53*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 54*cdf0e10cSrcweir #include <com/sun/star/frame/XFramesSupplier.hpp> 55*cdf0e10cSrcweir #include <com/sun/star/frame/XDesktop.hpp> 56*cdf0e10cSrcweir #include <com/sun/star/container/XEnumeration.hpp> 57*cdf0e10cSrcweir #include <com/sun/star/util/XStringWidth.hpp> 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 60*cdf0e10cSrcweir // includes of other projects 61*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 62*cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir #include <comphelper/extract.hxx> 65*cdf0e10cSrcweir #include <svtools/menuoptions.hxx> 66*cdf0e10cSrcweir #include <unotools/historyoptions.hxx> 67*cdf0e10cSrcweir #include <unotools/pathoptions.hxx> 68*cdf0e10cSrcweir #include <unotools/localfilehelper.hxx> 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_ 71*cdf0e10cSrcweir #include <toolkit/unohlp.hxx> 72*cdf0e10cSrcweir #endif 73*cdf0e10cSrcweir #include <tools/urlobj.hxx> 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir #include <vcl/svapp.hxx> 76*cdf0e10cSrcweir #include <vcl/window.hxx> 77*cdf0e10cSrcweir #include <vos/mutex.hxx> 78*cdf0e10cSrcweir #include <vcl/svapp.hxx> 79*cdf0e10cSrcweir #include <osl/file.hxx> 80*cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx> 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 83*cdf0e10cSrcweir // namespace 84*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir using namespace ::cppu; 87*cdf0e10cSrcweir using namespace ::vos; 88*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 89*cdf0e10cSrcweir using namespace ::com::sun::star::util; 90*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 91*cdf0e10cSrcweir using namespace ::com::sun::star::frame; 92*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 93*cdf0e10cSrcweir using namespace ::com::sun::star::container; 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir class StringLength : public ::cppu::WeakImplHelper1< ::com::sun::star::util::XStringWidth > 97*cdf0e10cSrcweir { 98*cdf0e10cSrcweir public: 99*cdf0e10cSrcweir StringLength() {} 100*cdf0e10cSrcweir virtual ~StringLength() {} 101*cdf0e10cSrcweir 102*cdf0e10cSrcweir // XStringWidth 103*cdf0e10cSrcweir sal_Int32 SAL_CALL queryStringWidth( const ::rtl::OUString& aString ) 104*cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 105*cdf0e10cSrcweir { 106*cdf0e10cSrcweir return aString.getLength(); 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir }; 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir namespace framework 111*cdf0e10cSrcweir { 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir // special menu ids/command ids for dynamic popup menus 114*cdf0e10cSrcweir #define SID_SFX_START 5000 115*cdf0e10cSrcweir #define SID_NEWDOCDIRECT (SID_SFX_START + 537) 116*cdf0e10cSrcweir #define SID_AUTOPILOTMENU (SID_SFX_START + 1381) 117*cdf0e10cSrcweir #define SID_PICKLIST (SID_SFX_START + 510) 118*cdf0e10cSrcweir #define SID_MDIWINDOWLIST (SID_SFX_START + 610) 119*cdf0e10cSrcweir #define SID_ADDONLIST (SID_SFX_START + 1677) 120*cdf0e10cSrcweir #define SID_HELPMENU (SID_SFX_START + 410) 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir #define SFX_REFERER_USER "private:user" 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir const ::rtl::OUString aSlotNewDocDirect( RTL_CONSTASCII_USTRINGPARAM( "slot:5537" )); 125*cdf0e10cSrcweir const ::rtl::OUString aSlotAutoPilot( RTL_CONSTASCII_USTRINGPARAM( "slot:6381" )); 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir const ::rtl::OUString aSpecialFileMenu( RTL_CONSTASCII_USTRINGPARAM( "file" )); 128*cdf0e10cSrcweir const ::rtl::OUString aSpecialWindowMenu( RTL_CONSTASCII_USTRINGPARAM( "window" )); 129*cdf0e10cSrcweir const ::rtl::OUString aSlotSpecialFileMenu( RTL_CONSTASCII_USTRINGPARAM( "slot:5510" )); 130*cdf0e10cSrcweir const ::rtl::OUString aSlotSpecialWindowMenu( RTL_CONSTASCII_USTRINGPARAM( "slot:5610" )); 131*cdf0e10cSrcweir const ::rtl::OUString aSlotSpecialToolsMenu( RTL_CONSTASCII_USTRINGPARAM( "slot:6677" )); 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir // special uno commands for picklist and window list 134*cdf0e10cSrcweir const ::rtl::OUString aSpecialFileCommand( RTL_CONSTASCII_USTRINGPARAM( "PickList" )); 135*cdf0e10cSrcweir const ::rtl::OUString aSpecialWindowCommand( RTL_CONSTASCII_USTRINGPARAM( "WindowList" )); 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir const ::rtl::OUString UNO_COMMAND( RTL_CONSTASCII_USTRINGPARAM( ".uno:" )); 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir // #110897# 140*cdf0e10cSrcweir MenuManager::MenuManager( 141*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory, 142*cdf0e10cSrcweir REFERENCE< XFRAME >& rFrame, Menu* pMenu, sal_Bool bDelete, sal_Bool bDeleteChildren ) 143*cdf0e10cSrcweir : // #110897# 144*cdf0e10cSrcweir ThreadHelpBase( &Application::GetSolarMutex() ), 145*cdf0e10cSrcweir mxServiceFactory(xServiceFactory) 146*cdf0e10cSrcweir { 147*cdf0e10cSrcweir m_bActive = sal_False; 148*cdf0e10cSrcweir m_bDeleteMenu = bDelete; 149*cdf0e10cSrcweir m_bDeleteChildren = bDeleteChildren; 150*cdf0e10cSrcweir m_pVCLMenu = pMenu; 151*cdf0e10cSrcweir m_xFrame = rFrame; 152*cdf0e10cSrcweir m_bInitialized = sal_False; 153*cdf0e10cSrcweir m_bIsBookmarkMenu = sal_False; 154*cdf0e10cSrcweir SAL_STATIC_CAST( ::com::sun::star::uno::XInterface*, (OWeakObject*)this )->acquire(); 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings(); 157*cdf0e10cSrcweir m_bWasHiContrast = rSettings.GetHighContrastMode(); 158*cdf0e10cSrcweir m_bShowMenuImages = rSettings.GetUseImagesInMenus(); 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir sal_Int32 nAddonsURLPrefixLength = ADDONSPOPUPMENU_URL_PREFIX.getLength(); 161*cdf0e10cSrcweir #if 0 162*cdf0e10cSrcweir ::std::vector< sal_uInt16 > aQueryLabelItemIdVector; 163*cdf0e10cSrcweir #endif 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir sal_uInt16 nItemCount = pMenu->GetItemCount(); 166*cdf0e10cSrcweir m_aMenuItemHandlerVector.reserve(nItemCount); 167*cdf0e10cSrcweir ::rtl::OUString aItemCommand; 168*cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < nItemCount; i++ ) 169*cdf0e10cSrcweir { 170*cdf0e10cSrcweir sal_uInt16 nItemId = FillItemCommand(aItemCommand,pMenu, i ); 171*cdf0e10cSrcweir bool bShowMenuImages( m_bShowMenuImages ); 172*cdf0e10cSrcweir MenuItemBits nBits = pMenu->GetItemBits( nItemId ); 173*cdf0e10cSrcweir // overwrite the default? 174*cdf0e10cSrcweir if ( nBits ) 175*cdf0e10cSrcweir bShowMenuImages = ( ( nBits & MIB_ICON ) == MIB_ICON ); 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir PopupMenu* pPopupMenu = pMenu->GetPopupMenu( nItemId ); 179*cdf0e10cSrcweir if ( pPopupMenu ) 180*cdf0e10cSrcweir { 181*cdf0e10cSrcweir AddMenu(pPopupMenu,aItemCommand,nItemId,bDeleteChildren,bDeleteChildren); 182*cdf0e10cSrcweir if (! (( aItemCommand.getLength() > nAddonsURLPrefixLength ) && 183*cdf0e10cSrcweir ( aItemCommand.indexOf( ADDONSPOPUPMENU_URL_PREFIX ) == 0 )) ) 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir // #110897# 186*cdf0e10cSrcweir // MenuManager* pSubMenuManager = new MenuManager( rFrame, pPopupMenu, bDeleteChildren, bDeleteChildren ); 187*cdf0e10cSrcweir #if 0 188*cdf0e10cSrcweir if ( pMenu->GetItemText( nItemId ).Len() == 0 ) 189*cdf0e10cSrcweir aQueryLabelItemIdVector.push_back( nItemId ); 190*cdf0e10cSrcweir #endif 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir // Create addon popup menu if there exist elements and this is the tools popup menu 193*cdf0e10cSrcweir if (( nItemId == SID_ADDONLIST || 194*cdf0e10cSrcweir aItemCommand == aSlotSpecialToolsMenu ) && 195*cdf0e10cSrcweir AddonMenuManager::HasAddonMenuElements() ) 196*cdf0e10cSrcweir { 197*cdf0e10cSrcweir sal_uInt16 nCount = 0; 198*cdf0e10cSrcweir AddonMenu* pSubMenu = AddonMenuManager::CreateAddonMenu( rFrame ); 199*cdf0e10cSrcweir if ( pSubMenu && ( pSubMenu->GetItemCount() > 0 )) 200*cdf0e10cSrcweir { 201*cdf0e10cSrcweir if ( pPopupMenu->GetItemType( nCount-1 ) != MENUITEM_SEPARATOR ) 202*cdf0e10cSrcweir pPopupMenu->InsertSeparator(); 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir // Use resource to load popup menu title 205*cdf0e10cSrcweir String aAddonsStrRes = String( FwkResId( STR_MENU_ADDONS )); 206*cdf0e10cSrcweir pPopupMenu->InsertItem( ITEMID_ADDONLIST, aAddonsStrRes ); 207*cdf0e10cSrcweir pPopupMenu->SetPopupMenu( ITEMID_ADDONLIST, pSubMenu ); 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir // Set item command for popup menu to enable it for GetImageFromURL 210*cdf0e10cSrcweir const static ::rtl::OUString aSlotString( RTL_CONSTASCII_USTRINGPARAM( "slot:" )); 211*cdf0e10cSrcweir aItemCommand = aSlotString; 212*cdf0e10cSrcweir aItemCommand += ::rtl::OUString::valueOf( (sal_Int32)ITEMID_ADDONLIST ); 213*cdf0e10cSrcweir pPopupMenu->SetItemCommand( ITEMID_ADDONLIST, aItemCommand ); 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir // #110897# 216*cdf0e10cSrcweir // MenuManager* pSubMenuManager = new MenuManager( rFrame, pSubMenu, sal_True, sal_False ); 217*cdf0e10cSrcweir AddMenu(pSubMenu,::rtl::OUString(),nItemId,sal_True,sal_False); 218*cdf0e10cSrcweir #if 0 219*cdf0e10cSrcweir if ( pMenu->GetItemText( nItemId ).Len() == 0 ) 220*cdf0e10cSrcweir aQueryLabelItemIdVector.push_back( nItemId ); 221*cdf0e10cSrcweir #endif 222*cdf0e10cSrcweir // Set image for the addon popup menu item 223*cdf0e10cSrcweir if ( bShowMenuImages && !pPopupMenu->GetItemImage( ITEMID_ADDONLIST )) 224*cdf0e10cSrcweir { 225*cdf0e10cSrcweir Image aImage = GetImageFromURL( rFrame, aItemCommand, sal_False, m_bWasHiContrast ); 226*cdf0e10cSrcweir if ( !!aImage ) 227*cdf0e10cSrcweir pPopupMenu->SetItemImage( ITEMID_ADDONLIST, aImage ); 228*cdf0e10cSrcweir } 229*cdf0e10cSrcweir } 230*cdf0e10cSrcweir else 231*cdf0e10cSrcweir delete pSubMenu; 232*cdf0e10cSrcweir } 233*cdf0e10cSrcweir } 234*cdf0e10cSrcweir } 235*cdf0e10cSrcweir else 236*cdf0e10cSrcweir { 237*cdf0e10cSrcweir if ( nItemId == SID_NEWDOCDIRECT || 238*cdf0e10cSrcweir aItemCommand == aSlotNewDocDirect ) 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir // #110897# 241*cdf0e10cSrcweir // Reference< ::com::sun::star::lang::XMultiServiceFactory > aMultiServiceFactory(::comphelper::getProcessServiceFactory()); 242*cdf0e10cSrcweir // MenuConfiguration aMenuCfg( aMultiServiceFactory ); 243*cdf0e10cSrcweir MenuConfiguration aMenuCfg( getServiceFactory() ); 244*cdf0e10cSrcweir BmkMenu* pSubMenu = (BmkMenu*)aMenuCfg.CreateBookmarkMenu( rFrame, BOOKMARK_NEWMENU ); 245*cdf0e10cSrcweir pMenu->SetPopupMenu( nItemId, pSubMenu ); 246*cdf0e10cSrcweir 247*cdf0e10cSrcweir // #110897# 248*cdf0e10cSrcweir // MenuManager* pSubMenuManager = new MenuManager( rFrame, pSubMenu, sal_True, sal_False ); 249*cdf0e10cSrcweir AddMenu(pSubMenu,::rtl::OUString(),nItemId,sal_True,sal_False); 250*cdf0e10cSrcweir #if 0 251*cdf0e10cSrcweir if ( pMenu->GetItemText( nItemId ).Len() == 0 ) 252*cdf0e10cSrcweir aQueryLabelItemIdVector.push_back( nItemId ); 253*cdf0e10cSrcweir #endif 254*cdf0e10cSrcweir 255*cdf0e10cSrcweir if ( bShowMenuImages && !pMenu->GetItemImage( nItemId )) 256*cdf0e10cSrcweir { 257*cdf0e10cSrcweir Image aImage = GetImageFromURL( rFrame, aItemCommand, sal_False, m_bWasHiContrast ); 258*cdf0e10cSrcweir if ( !!aImage ) 259*cdf0e10cSrcweir pMenu->SetItemImage( nItemId, aImage ); 260*cdf0e10cSrcweir } 261*cdf0e10cSrcweir } 262*cdf0e10cSrcweir else if ( nItemId == SID_AUTOPILOTMENU || 263*cdf0e10cSrcweir aItemCommand == aSlotAutoPilot ) 264*cdf0e10cSrcweir { 265*cdf0e10cSrcweir // #110897# 266*cdf0e10cSrcweir // Reference< ::com::sun::star::lang::XMultiServiceFactory > aMultiServiceFactory(::comphelper::getProcessServiceFactory()); 267*cdf0e10cSrcweir // MenuConfiguration aMenuCfg( aMultiServiceFactory ); 268*cdf0e10cSrcweir MenuConfiguration aMenuCfg( getServiceFactory() ); 269*cdf0e10cSrcweir BmkMenu* pSubMenu = (BmkMenu*)aMenuCfg.CreateBookmarkMenu( rFrame, BOOKMARK_WIZARDMENU ); 270*cdf0e10cSrcweir pMenu->SetPopupMenu( nItemId, pSubMenu ); 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir // #110897# 273*cdf0e10cSrcweir // MenuManager* pSubMenuManager = new MenuManager( rFrame, pSubMenu, sal_True, sal_False ); 274*cdf0e10cSrcweir AddMenu(pSubMenu,::rtl::OUString(),nItemId,sal_True,sal_False); 275*cdf0e10cSrcweir #if 0 276*cdf0e10cSrcweir if ( pMenu->GetItemText( nItemId ).Len() == 0 ) 277*cdf0e10cSrcweir aQueryLabelItemIdVector.push_back( nItemId ); 278*cdf0e10cSrcweir #endif 279*cdf0e10cSrcweir 280*cdf0e10cSrcweir if ( bShowMenuImages && !pMenu->GetItemImage( nItemId )) 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir Image aImage = GetImageFromURL( rFrame, aItemCommand, sal_False, m_bWasHiContrast ); 283*cdf0e10cSrcweir if ( !!aImage ) 284*cdf0e10cSrcweir pMenu->SetItemImage( nItemId, aImage ); 285*cdf0e10cSrcweir } 286*cdf0e10cSrcweir } 287*cdf0e10cSrcweir else if ( pMenu->GetItemType( i ) != MENUITEM_SEPARATOR ) 288*cdf0e10cSrcweir { 289*cdf0e10cSrcweir if ( bShowMenuImages ) 290*cdf0e10cSrcweir { 291*cdf0e10cSrcweir if ( AddonMenuManager::IsAddonMenuId( nItemId )) 292*cdf0e10cSrcweir { 293*cdf0e10cSrcweir // Add-Ons uses a images from different places 294*cdf0e10cSrcweir Image aImage; 295*cdf0e10cSrcweir rtl::OUString aImageId; 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir MenuConfiguration::Attributes* pMenuAttributes = 298*cdf0e10cSrcweir (MenuConfiguration::Attributes*)pMenu->GetUserValue( nItemId ); 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir if ( pMenuAttributes && pMenuAttributes->aImageId.getLength() > 0 ) 301*cdf0e10cSrcweir { 302*cdf0e10cSrcweir // Retrieve image id from menu attributes 303*cdf0e10cSrcweir aImage = GetImageFromURL( rFrame, aImageId, sal_False, m_bWasHiContrast ); 304*cdf0e10cSrcweir } 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir if ( !aImage ) 307*cdf0e10cSrcweir { 308*cdf0e10cSrcweir aImage = GetImageFromURL( rFrame, aItemCommand, sal_False, m_bWasHiContrast ); 309*cdf0e10cSrcweir if ( !aImage ) 310*cdf0e10cSrcweir aImage = AddonsOptions().GetImageFromURL( aItemCommand, sal_False, m_bWasHiContrast ); 311*cdf0e10cSrcweir } 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir if ( !!aImage ) 314*cdf0e10cSrcweir pMenu->SetItemImage( nItemId, aImage ); 315*cdf0e10cSrcweir } 316*cdf0e10cSrcweir else if ( !pMenu->GetItemImage( nItemId )) 317*cdf0e10cSrcweir { 318*cdf0e10cSrcweir Image aImage = GetImageFromURL( rFrame, aItemCommand, sal_False, m_bWasHiContrast ); 319*cdf0e10cSrcweir if ( !!aImage ) 320*cdf0e10cSrcweir pMenu->SetItemImage( nItemId, aImage ); 321*cdf0e10cSrcweir } 322*cdf0e10cSrcweir } 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir REFERENCE< XDISPATCH > aXDispatchRef; 325*cdf0e10cSrcweir m_aMenuItemHandlerVector.push_back( new MenuItemHandler( nItemId, NULL, aXDispatchRef )); 326*cdf0e10cSrcweir #if 0 327*cdf0e10cSrcweir if ( pMenu->GetItemText( nItemId ).Len() == 0 ) 328*cdf0e10cSrcweir aQueryLabelItemIdVector.push_back( nItemId ); 329*cdf0e10cSrcweir #endif 330*cdf0e10cSrcweir } 331*cdf0e10cSrcweir } 332*cdf0e10cSrcweir } 333*cdf0e10cSrcweir 334*cdf0e10cSrcweir 335*cdf0e10cSrcweir // retrieve label information for all menu items without item text 336*cdf0e10cSrcweir #if 0 337*cdf0e10cSrcweir if ( aQueryLabelItemIdVector.size() > 0 ) 338*cdf0e10cSrcweir { 339*cdf0e10cSrcweir Sequence< ::rtl::OUString > aURLSequence( aQueryLabelItemIdVector.size() ); 340*cdf0e10cSrcweir Sequence< ::rtl::OUString > aLabelSequence( aQueryLabelItemIdVector.size() ); 341*cdf0e10cSrcweir 342*cdf0e10cSrcweir sal_uInt32 nPos = 0; 343*cdf0e10cSrcweir ::std::vector< sal_uInt16 >::iterator p; 344*cdf0e10cSrcweir for ( p = aQueryLabelItemIdVector.begin(); p != aQueryLabelItemIdVector.end(); p++ ) 345*cdf0e10cSrcweir aURLSequence[nPos++] = pMenu->GetItemCommand( *p ); 346*cdf0e10cSrcweir 347*cdf0e10cSrcweir Reference< XDispatchInformationProvider > xDIP( xFrame, UNO_QUERY ); 348*cdf0e10cSrcweir if ( xDIP.is() ) 349*cdf0e10cSrcweir { 350*cdf0e10cSrcweir nPos = 0; 351*cdf0e10cSrcweir xDIP->queryDispatchInformations( aURLSequence, aLabelSequence ); 352*cdf0e10cSrcweir for ( p = aQueryLabelItemIdVector.begin(); p != aQueryLabelItemIdVector.end(); p++ ) 353*cdf0e10cSrcweir pMenu->SetItemText( *p, aLabelSequence( nPos++ )); 354*cdf0e10cSrcweir } 355*cdf0e10cSrcweir } 356*cdf0e10cSrcweir #endif 357*cdf0e10cSrcweir SetHdl(); 358*cdf0e10cSrcweir } 359*cdf0e10cSrcweir 360*cdf0e10cSrcweir #if 0 361*cdf0e10cSrcweir // #110897# 362*cdf0e10cSrcweir MenuManager::MenuManager( 363*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory, 364*cdf0e10cSrcweir REFERENCE< XFRAME >& rFrame, AddonMenu* pAddonMenu, sal_Bool bDelete, sal_Bool bDeleteChildren ) 365*cdf0e10cSrcweir : // #110897# 366*cdf0e10cSrcweir ThreadHelpBase( &Application::GetSolarMutex() ), 367*cdf0e10cSrcweir mxServiceFactory(xServiceFactory) 368*cdf0e10cSrcweir { 369*cdf0e10cSrcweir m_bActive = sal_False; 370*cdf0e10cSrcweir m_bDeleteMenu = bDelete; 371*cdf0e10cSrcweir m_bDeleteChildren = bDeleteChildren; 372*cdf0e10cSrcweir m_pVCLMenu = pAddonMenu; 373*cdf0e10cSrcweir m_xFrame = rFrame; 374*cdf0e10cSrcweir m_bInitialized = sal_False; 375*cdf0e10cSrcweir m_bIsBookmarkMenu = sal_True; 376*cdf0e10cSrcweir 377*cdf0e10cSrcweir const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings(); 378*cdf0e10cSrcweir m_bWasHiContrast = rSettings.GetHighContrastMode(); 379*cdf0e10cSrcweir 380*cdf0e10cSrcweir SAL_STATIC_CAST( ::com::sun::star::uno::XInterface*, (OWeakObject*)this )->acquire(); 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir sal_uInt16 nItemCount = pAddonMenu->GetItemCount(); 383*cdf0e10cSrcweir m_aMenuItemHandlerVector.reserve(nItemCount); 384*cdf0e10cSrcweir ::rtl::OUString aItemCommand; 385*cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < nItemCount; i++ ) 386*cdf0e10cSrcweir { 387*cdf0e10cSrcweir sal_uInt16 nItemId = FillItemCommand(aItemCommand,pAddonMenu, i ); 388*cdf0e10cSrcweir 389*cdf0e10cSrcweir PopupMenu* pPopupMenu = pAddonMenu->GetPopupMenu( nItemId ); 390*cdf0e10cSrcweir if ( pPopupMenu ) 391*cdf0e10cSrcweir { 392*cdf0e10cSrcweir // #110897# 393*cdf0e10cSrcweir // MenuManager* pSubMenuManager = new MenuManager( rFrame, pPopupMenu, bDeleteChildren, bDeleteChildren ); 394*cdf0e10cSrcweir AddMenu(pPopupMenu,aItemCommand,nItemId,bDeleteChildren,bDeleteChildren); 395*cdf0e10cSrcweir } 396*cdf0e10cSrcweir else 397*cdf0e10cSrcweir { 398*cdf0e10cSrcweir if ( pAddonMenu->GetItemType( i ) != MENUITEM_SEPARATOR ) 399*cdf0e10cSrcweir { 400*cdf0e10cSrcweir MenuConfiguration::Attributes* pAddonAttributes = (MenuConfiguration::Attributes *)(pAddonMenu->GetUserValue( nItemId )); 401*cdf0e10cSrcweir REFERENCE< XDISPATCH > aXDispatchRef; 402*cdf0e10cSrcweir MenuItemHandler* pMenuItemHandler = new MenuItemHandler( nItemId, NULL, aXDispatchRef ); 403*cdf0e10cSrcweir 404*cdf0e10cSrcweir if ( pAddonAttributes ) 405*cdf0e10cSrcweir { 406*cdf0e10cSrcweir // read additional attributes from attributes struct and AddonMenu implementation will delete all attributes itself!! 407*cdf0e10cSrcweir pMenuItemHandler->aTargetFrame = pAddonAttributes->aTargetFrame; 408*cdf0e10cSrcweir } 409*cdf0e10cSrcweir 410*cdf0e10cSrcweir m_aMenuItemHandlerVector.push_back( pMenuItemHandler ); 411*cdf0e10cSrcweir } 412*cdf0e10cSrcweir } 413*cdf0e10cSrcweir } 414*cdf0e10cSrcweir 415*cdf0e10cSrcweir SetHdl(); 416*cdf0e10cSrcweir } 417*cdf0e10cSrcweir #endif 418*cdf0e10cSrcweir 419*cdf0e10cSrcweir void MenuManager::SetHdl() 420*cdf0e10cSrcweir { 421*cdf0e10cSrcweir m_pVCLMenu->SetHighlightHdl( LINK( this, MenuManager, Highlight )); 422*cdf0e10cSrcweir m_pVCLMenu->SetActivateHdl( LINK( this, MenuManager, Activate )); 423*cdf0e10cSrcweir m_pVCLMenu->SetDeactivateHdl( LINK( this, MenuManager, Deactivate )); 424*cdf0e10cSrcweir m_pVCLMenu->SetSelectHdl( LINK( this, MenuManager, Select )); 425*cdf0e10cSrcweir 426*cdf0e10cSrcweir if ( mxServiceFactory.is() ) 427*cdf0e10cSrcweir m_xURLTransformer.set( mxServiceFactory->createInstance(SERVICENAME_URLTRANSFORMER),UNO_QUERY ); 428*cdf0e10cSrcweir } 429*cdf0e10cSrcweir 430*cdf0e10cSrcweir MenuManager::~MenuManager() 431*cdf0e10cSrcweir { 432*cdf0e10cSrcweir std::vector< MenuItemHandler* >::iterator p; 433*cdf0e10cSrcweir for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ ) 434*cdf0e10cSrcweir { 435*cdf0e10cSrcweir MenuItemHandler* pItemHandler = *p; 436*cdf0e10cSrcweir pItemHandler->xMenuItemDispatch.clear(); 437*cdf0e10cSrcweir if ( pItemHandler->pSubMenuManager ) 438*cdf0e10cSrcweir SAL_STATIC_CAST( ::com::sun::star::uno::XInterface*, (OWeakObject*)pItemHandler->pSubMenuManager )->release(); 439*cdf0e10cSrcweir delete pItemHandler; 440*cdf0e10cSrcweir } 441*cdf0e10cSrcweir 442*cdf0e10cSrcweir if ( m_bDeleteMenu ) 443*cdf0e10cSrcweir delete m_pVCLMenu; 444*cdf0e10cSrcweir } 445*cdf0e10cSrcweir 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir MenuManager::MenuItemHandler* MenuManager::GetMenuItemHandler( sal_uInt16 nItemId ) 448*cdf0e10cSrcweir { 449*cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 450*cdf0e10cSrcweir 451*cdf0e10cSrcweir std::vector< MenuItemHandler* >::iterator p; 452*cdf0e10cSrcweir for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ ) 453*cdf0e10cSrcweir { 454*cdf0e10cSrcweir MenuItemHandler* pItemHandler = *p; 455*cdf0e10cSrcweir if ( pItemHandler->nItemId == nItemId ) 456*cdf0e10cSrcweir return pItemHandler; 457*cdf0e10cSrcweir } 458*cdf0e10cSrcweir 459*cdf0e10cSrcweir return 0; 460*cdf0e10cSrcweir } 461*cdf0e10cSrcweir 462*cdf0e10cSrcweir 463*cdf0e10cSrcweir void SAL_CALL MenuManager::statusChanged( const FEATURSTATEEVENT& Event ) 464*cdf0e10cSrcweir throw ( RuntimeException ) 465*cdf0e10cSrcweir { 466*cdf0e10cSrcweir ::rtl::OUString aFeatureURL = Event.FeatureURL.Complete; 467*cdf0e10cSrcweir MenuItemHandler* pStatusChangedMenu = NULL; 468*cdf0e10cSrcweir 469*cdf0e10cSrcweir { 470*cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 471*cdf0e10cSrcweir 472*cdf0e10cSrcweir std::vector< MenuItemHandler* >::iterator p; 473*cdf0e10cSrcweir for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ ) 474*cdf0e10cSrcweir { 475*cdf0e10cSrcweir MenuItemHandler* pMenuItemHandler = *p; 476*cdf0e10cSrcweir if ( pMenuItemHandler->aMenuItemURL == aFeatureURL ) 477*cdf0e10cSrcweir { 478*cdf0e10cSrcweir pStatusChangedMenu = pMenuItemHandler; 479*cdf0e10cSrcweir break; 480*cdf0e10cSrcweir } 481*cdf0e10cSrcweir } 482*cdf0e10cSrcweir } 483*cdf0e10cSrcweir 484*cdf0e10cSrcweir if ( pStatusChangedMenu ) 485*cdf0e10cSrcweir { 486*cdf0e10cSrcweir OGuard aSolarGuard( Application::GetSolarMutex() ); 487*cdf0e10cSrcweir { 488*cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 489*cdf0e10cSrcweir 490*cdf0e10cSrcweir sal_Bool bSetCheckmark = sal_False; 491*cdf0e10cSrcweir sal_Bool bCheckmark = sal_False; 492*cdf0e10cSrcweir sal_Bool bMenuItemEnabled = m_pVCLMenu->IsItemEnabled( pStatusChangedMenu->nItemId ); 493*cdf0e10cSrcweir 494*cdf0e10cSrcweir if ( Event.IsEnabled != bMenuItemEnabled ) 495*cdf0e10cSrcweir m_pVCLMenu->EnableItem( pStatusChangedMenu->nItemId, Event.IsEnabled ); 496*cdf0e10cSrcweir 497*cdf0e10cSrcweir if ( Event.State >>= bCheckmark ) 498*cdf0e10cSrcweir bSetCheckmark = sal_True; 499*cdf0e10cSrcweir 500*cdf0e10cSrcweir if ( bSetCheckmark ) 501*cdf0e10cSrcweir m_pVCLMenu->CheckItem( pStatusChangedMenu->nItemId, bCheckmark ); 502*cdf0e10cSrcweir } 503*cdf0e10cSrcweir 504*cdf0e10cSrcweir if ( Event.Requery ) 505*cdf0e10cSrcweir { 506*cdf0e10cSrcweir URL aTargetURL; 507*cdf0e10cSrcweir aTargetURL.Complete = pStatusChangedMenu->aMenuItemURL; 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir // #110897# 510*cdf0e10cSrcweir m_xURLTransformer->parseStrict( aTargetURL ); 511*cdf0e10cSrcweir 512*cdf0e10cSrcweir REFERENCE< XDISPATCHPROVIDER > xDispatchProvider( m_xFrame, UNO_QUERY ); 513*cdf0e10cSrcweir REFERENCE< XDISPATCH > xMenuItemDispatch = xDispatchProvider->queryDispatch( 514*cdf0e10cSrcweir aTargetURL, ::rtl::OUString(), 0 ); 515*cdf0e10cSrcweir 516*cdf0e10cSrcweir if ( xMenuItemDispatch.is() ) 517*cdf0e10cSrcweir { 518*cdf0e10cSrcweir pStatusChangedMenu->xMenuItemDispatch = xMenuItemDispatch; 519*cdf0e10cSrcweir pStatusChangedMenu->aMenuItemURL = aTargetURL.Complete; 520*cdf0e10cSrcweir xMenuItemDispatch->addStatusListener( SAL_STATIC_CAST( XSTATUSLISTENER*, this ), aTargetURL ); 521*cdf0e10cSrcweir } 522*cdf0e10cSrcweir } 523*cdf0e10cSrcweir } 524*cdf0e10cSrcweir } 525*cdf0e10cSrcweir 526*cdf0e10cSrcweir 527*cdf0e10cSrcweir void MenuManager::RemoveListener() 528*cdf0e10cSrcweir { 529*cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 530*cdf0e10cSrcweir ClearMenuDispatch(); 531*cdf0e10cSrcweir } 532*cdf0e10cSrcweir 533*cdf0e10cSrcweir void MenuManager::ClearMenuDispatch(const EVENTOBJECT& Source,bool _bRemoveOnly) 534*cdf0e10cSrcweir { 535*cdf0e10cSrcweir // disposing called from parent dispatcher 536*cdf0e10cSrcweir // remove all listener to prepare shutdown 537*cdf0e10cSrcweir 538*cdf0e10cSrcweir // #110897# 539*cdf0e10cSrcweir std::vector< MenuItemHandler* >::iterator p; 540*cdf0e10cSrcweir for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ ) 541*cdf0e10cSrcweir { 542*cdf0e10cSrcweir MenuItemHandler* pItemHandler = *p; 543*cdf0e10cSrcweir if ( pItemHandler->xMenuItemDispatch.is() ) 544*cdf0e10cSrcweir { 545*cdf0e10cSrcweir URL aTargetURL; 546*cdf0e10cSrcweir aTargetURL.Complete = pItemHandler->aMenuItemURL; 547*cdf0e10cSrcweir m_xURLTransformer->parseStrict( aTargetURL ); 548*cdf0e10cSrcweir 549*cdf0e10cSrcweir pItemHandler->xMenuItemDispatch->removeStatusListener( 550*cdf0e10cSrcweir SAL_STATIC_CAST( XSTATUSLISTENER*, this ), aTargetURL ); 551*cdf0e10cSrcweir } 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir pItemHandler->xMenuItemDispatch.clear(); 554*cdf0e10cSrcweir if ( pItemHandler->pSubMenuManager ) 555*cdf0e10cSrcweir { 556*cdf0e10cSrcweir if ( _bRemoveOnly ) 557*cdf0e10cSrcweir pItemHandler->pSubMenuManager->RemoveListener(); 558*cdf0e10cSrcweir else 559*cdf0e10cSrcweir pItemHandler->pSubMenuManager->disposing( Source ); 560*cdf0e10cSrcweir } 561*cdf0e10cSrcweir } 562*cdf0e10cSrcweir } 563*cdf0e10cSrcweir 564*cdf0e10cSrcweir 565*cdf0e10cSrcweir void SAL_CALL MenuManager::disposing( const EVENTOBJECT& Source ) throw ( RUNTIMEEXCEPTION ) 566*cdf0e10cSrcweir { 567*cdf0e10cSrcweir if ( Source.Source == m_xFrame ) 568*cdf0e10cSrcweir { 569*cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 570*cdf0e10cSrcweir ClearMenuDispatch(Source,false); 571*cdf0e10cSrcweir } 572*cdf0e10cSrcweir else 573*cdf0e10cSrcweir { 574*cdf0e10cSrcweir // disposing called from menu item dispatcher, remove listener 575*cdf0e10cSrcweir MenuItemHandler* pMenuItemDisposing = NULL; 576*cdf0e10cSrcweir 577*cdf0e10cSrcweir { 578*cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 579*cdf0e10cSrcweir 580*cdf0e10cSrcweir std::vector< MenuItemHandler* >::iterator p; 581*cdf0e10cSrcweir for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ ) 582*cdf0e10cSrcweir { 583*cdf0e10cSrcweir MenuItemHandler* pMenuItemHandler = *p; 584*cdf0e10cSrcweir if ( pMenuItemHandler->xMenuItemDispatch == Source.Source ) 585*cdf0e10cSrcweir { 586*cdf0e10cSrcweir pMenuItemDisposing = pMenuItemHandler; 587*cdf0e10cSrcweir break; 588*cdf0e10cSrcweir } 589*cdf0e10cSrcweir } 590*cdf0e10cSrcweir 591*cdf0e10cSrcweir if ( pMenuItemDisposing ) 592*cdf0e10cSrcweir { 593*cdf0e10cSrcweir URL aTargetURL; 594*cdf0e10cSrcweir aTargetURL.Complete = pMenuItemDisposing->aMenuItemURL; 595*cdf0e10cSrcweir 596*cdf0e10cSrcweir // #110897# 597*cdf0e10cSrcweir m_xURLTransformer->parseStrict( aTargetURL ); 598*cdf0e10cSrcweir 599*cdf0e10cSrcweir pMenuItemDisposing->xMenuItemDispatch->removeStatusListener(SAL_STATIC_CAST( XSTATUSLISTENER*, this ), aTargetURL ); 600*cdf0e10cSrcweir pMenuItemDisposing->xMenuItemDispatch.clear(); 601*cdf0e10cSrcweir } 602*cdf0e10cSrcweir } 603*cdf0e10cSrcweir } 604*cdf0e10cSrcweir } 605*cdf0e10cSrcweir 606*cdf0e10cSrcweir 607*cdf0e10cSrcweir void MenuManager::UpdateSpecialFileMenu( Menu* pMenu ) 608*cdf0e10cSrcweir { 609*cdf0e10cSrcweir // update picklist 610*cdf0e10cSrcweir Sequence< Sequence< PropertyValue > > aHistoryList = SvtHistoryOptions().GetList( ePICKLIST ); 611*cdf0e10cSrcweir ::std::vector< MenuItemHandler* > aNewPickVector; 612*cdf0e10cSrcweir Reference< XStringWidth > xStringLength( new StringLength ); 613*cdf0e10cSrcweir 614*cdf0e10cSrcweir sal_uInt16 nPickItemId = START_ITEMID_PICKLIST; 615*cdf0e10cSrcweir int nPickListMenuItems = ( aHistoryList.getLength() > 99 ) ? 99 : aHistoryList.getLength(); 616*cdf0e10cSrcweir 617*cdf0e10cSrcweir aNewPickVector.reserve(nPickListMenuItems); 618*cdf0e10cSrcweir for ( int i = 0; i < nPickListMenuItems; i++ ) 619*cdf0e10cSrcweir { 620*cdf0e10cSrcweir Sequence< PropertyValue > aPickListEntry = aHistoryList[i]; 621*cdf0e10cSrcweir 622*cdf0e10cSrcweir REFERENCE< XDISPATCH > aXDispatchRef; 623*cdf0e10cSrcweir MenuItemHandler* pNewMenuItemHandler = new MenuItemHandler( 624*cdf0e10cSrcweir nPickItemId++, 625*cdf0e10cSrcweir NULL, 626*cdf0e10cSrcweir aXDispatchRef ); 627*cdf0e10cSrcweir 628*cdf0e10cSrcweir for ( int j = 0; j < aPickListEntry.getLength(); j++ ) 629*cdf0e10cSrcweir { 630*cdf0e10cSrcweir Any a = aPickListEntry[j].Value; 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir if ( aPickListEntry[j].Name == HISTORY_PROPERTYNAME_URL ) 633*cdf0e10cSrcweir a >>= pNewMenuItemHandler->aMenuItemURL; 634*cdf0e10cSrcweir else if ( aPickListEntry[j].Name == HISTORY_PROPERTYNAME_FILTER ) 635*cdf0e10cSrcweir a >>= pNewMenuItemHandler->aFilter; 636*cdf0e10cSrcweir else if ( aPickListEntry[j].Name == HISTORY_PROPERTYNAME_TITLE ) 637*cdf0e10cSrcweir a >>= pNewMenuItemHandler->aTitle; 638*cdf0e10cSrcweir else if ( aPickListEntry[j].Name == HISTORY_PROPERTYNAME_PASSWORD ) 639*cdf0e10cSrcweir a >>= pNewMenuItemHandler->aPassword; 640*cdf0e10cSrcweir } 641*cdf0e10cSrcweir 642*cdf0e10cSrcweir aNewPickVector.push_back( pNewMenuItemHandler ); 643*cdf0e10cSrcweir } 644*cdf0e10cSrcweir 645*cdf0e10cSrcweir if ( !aNewPickVector.empty() ) 646*cdf0e10cSrcweir { 647*cdf0e10cSrcweir URL aTargetURL; 648*cdf0e10cSrcweir REFERENCE< XDISPATCHPROVIDER > xDispatchProvider( m_xFrame, UNO_QUERY ); 649*cdf0e10cSrcweir 650*cdf0e10cSrcweir // #110897# 651*cdf0e10cSrcweir REFERENCE< XDISPATCH > xMenuItemDispatch; 652*cdf0e10cSrcweir 653*cdf0e10cSrcweir static const ::rtl::OUString s_sDefault(RTL_CONSTASCII_USTRINGPARAM("_default")); 654*cdf0e10cSrcweir // query for dispatcher 655*cdf0e10cSrcweir std::vector< MenuItemHandler* >::iterator p; 656*cdf0e10cSrcweir for ( p = aNewPickVector.begin(); p != aNewPickVector.end(); p++ ) 657*cdf0e10cSrcweir { 658*cdf0e10cSrcweir MenuItemHandler* pMenuItemHandler = *p; 659*cdf0e10cSrcweir 660*cdf0e10cSrcweir aTargetURL.Complete = pMenuItemHandler->aMenuItemURL; 661*cdf0e10cSrcweir m_xURLTransformer->parseStrict( aTargetURL ); 662*cdf0e10cSrcweir 663*cdf0e10cSrcweir if ( !xMenuItemDispatch.is() ) 664*cdf0e10cSrcweir { 665*cdf0e10cSrcweir // attention: this code assume that "_blank" can only be consumed by desktop service 666*cdf0e10cSrcweir xMenuItemDispatch = xDispatchProvider->queryDispatch( aTargetURL, s_sDefault, 0 ); 667*cdf0e10cSrcweir } 668*cdf0e10cSrcweir 669*cdf0e10cSrcweir if ( xMenuItemDispatch.is() ) 670*cdf0e10cSrcweir { 671*cdf0e10cSrcweir pMenuItemHandler->xMenuItemDispatch = xMenuItemDispatch; 672*cdf0e10cSrcweir pMenuItemHandler->aMenuItemURL = aTargetURL.Complete; 673*cdf0e10cSrcweir } 674*cdf0e10cSrcweir } 675*cdf0e10cSrcweir 676*cdf0e10cSrcweir { 677*cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 678*cdf0e10cSrcweir 679*cdf0e10cSrcweir int nRemoveItemCount = 0; 680*cdf0e10cSrcweir int nItemCount = pMenu->GetItemCount(); 681*cdf0e10cSrcweir 682*cdf0e10cSrcweir if ( nItemCount > 0 ) 683*cdf0e10cSrcweir { 684*cdf0e10cSrcweir // remove all old picklist entries from menu 685*cdf0e10cSrcweir sal_uInt16 nPos = pMenu->GetItemPos( START_ITEMID_PICKLIST ); 686*cdf0e10cSrcweir for ( sal_uInt16 n = nPos; n < pMenu->GetItemCount(); ) 687*cdf0e10cSrcweir { 688*cdf0e10cSrcweir pMenu->RemoveItem( n ); 689*cdf0e10cSrcweir ++nRemoveItemCount; 690*cdf0e10cSrcweir } 691*cdf0e10cSrcweir 692*cdf0e10cSrcweir if ( pMenu->GetItemType( pMenu->GetItemCount()-1 ) == MENUITEM_SEPARATOR ) 693*cdf0e10cSrcweir pMenu->RemoveItem( pMenu->GetItemCount()-1 ); 694*cdf0e10cSrcweir 695*cdf0e10cSrcweir // remove all old picklist entries from menu handler 696*cdf0e10cSrcweir if ( nRemoveItemCount > 0 ) 697*cdf0e10cSrcweir { 698*cdf0e10cSrcweir for( sal_uInt32 nIndex = m_aMenuItemHandlerVector.size() - nRemoveItemCount; 699*cdf0e10cSrcweir nIndex < m_aMenuItemHandlerVector.size(); ) 700*cdf0e10cSrcweir { 701*cdf0e10cSrcweir delete m_aMenuItemHandlerVector.at( nIndex ); 702*cdf0e10cSrcweir m_aMenuItemHandlerVector.erase( m_aMenuItemHandlerVector.begin() + nIndex ); 703*cdf0e10cSrcweir } 704*cdf0e10cSrcweir } 705*cdf0e10cSrcweir } 706*cdf0e10cSrcweir 707*cdf0e10cSrcweir // append new picklist menu entries 708*cdf0e10cSrcweir aNewPickVector.reserve(aNewPickVector.size()); 709*cdf0e10cSrcweir pMenu->InsertSeparator(); 710*cdf0e10cSrcweir const sal_uInt32 nCount = aNewPickVector.size(); 711*cdf0e10cSrcweir for ( sal_uInt32 i = 0; i < nCount; i++ ) 712*cdf0e10cSrcweir { 713*cdf0e10cSrcweir char menuShortCut[5] = "~n: "; 714*cdf0e10cSrcweir 715*cdf0e10cSrcweir ::rtl::OUString aMenuShortCut; 716*cdf0e10cSrcweir if ( i <= 9 ) 717*cdf0e10cSrcweir { 718*cdf0e10cSrcweir if ( i == 9 ) 719*cdf0e10cSrcweir aMenuShortCut = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "1~0: " )); 720*cdf0e10cSrcweir else 721*cdf0e10cSrcweir { 722*cdf0e10cSrcweir menuShortCut[1] = (char)( '1' + i ); 723*cdf0e10cSrcweir aMenuShortCut = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( menuShortCut )); 724*cdf0e10cSrcweir } 725*cdf0e10cSrcweir } 726*cdf0e10cSrcweir else 727*cdf0e10cSrcweir { 728*cdf0e10cSrcweir aMenuShortCut = rtl::OUString::valueOf((sal_Int32)( i + 1 )); 729*cdf0e10cSrcweir aMenuShortCut += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": " )); 730*cdf0e10cSrcweir } 731*cdf0e10cSrcweir 732*cdf0e10cSrcweir // Abbreviate URL 733*cdf0e10cSrcweir rtl::OUString aURLString( aNewPickVector.at( i )->aMenuItemURL ); 734*cdf0e10cSrcweir rtl::OUString aTipHelpText; 735*cdf0e10cSrcweir rtl::OUString aMenuTitle; 736*cdf0e10cSrcweir INetURLObject aURL( aURLString ); 737*cdf0e10cSrcweir 738*cdf0e10cSrcweir if ( aURL.GetProtocol() == INET_PROT_FILE ) 739*cdf0e10cSrcweir { 740*cdf0e10cSrcweir // Do handle file URL differently => convert it to a system 741*cdf0e10cSrcweir // path and abbreviate it with a special function: 742*cdf0e10cSrcweir String aFileSystemPath( aURL.getFSysPath( INetURLObject::FSYS_DETECT ) ); 743*cdf0e10cSrcweir 744*cdf0e10cSrcweir ::rtl::OUString aSystemPath( aFileSystemPath ); 745*cdf0e10cSrcweir ::rtl::OUString aCompactedSystemPath; 746*cdf0e10cSrcweir 747*cdf0e10cSrcweir aTipHelpText = aSystemPath; 748*cdf0e10cSrcweir oslFileError nError = osl_abbreviateSystemPath( aSystemPath.pData, &aCompactedSystemPath.pData, 46, NULL ); 749*cdf0e10cSrcweir if ( !nError ) 750*cdf0e10cSrcweir aMenuTitle = String( aCompactedSystemPath ); 751*cdf0e10cSrcweir else 752*cdf0e10cSrcweir aMenuTitle = aSystemPath; 753*cdf0e10cSrcweir } 754*cdf0e10cSrcweir else 755*cdf0e10cSrcweir { 756*cdf0e10cSrcweir // Use INetURLObject to abbreviate all other URLs 757*cdf0e10cSrcweir String aShortURL; 758*cdf0e10cSrcweir aShortURL = aURL.getAbbreviated( xStringLength, 46, INetURLObject::DECODE_UNAMBIGUOUS ); 759*cdf0e10cSrcweir aMenuTitle += aShortURL; 760*cdf0e10cSrcweir aTipHelpText = aURLString; 761*cdf0e10cSrcweir } 762*cdf0e10cSrcweir 763*cdf0e10cSrcweir ::rtl::OUString aTitle( aMenuShortCut + aMenuTitle ); 764*cdf0e10cSrcweir 765*cdf0e10cSrcweir MenuItemHandler* pMenuItemHandler = aNewPickVector.at( i ); 766*cdf0e10cSrcweir pMenu->InsertItem( pMenuItemHandler->nItemId, aTitle ); 767*cdf0e10cSrcweir pMenu->SetTipHelpText( pMenuItemHandler->nItemId, aTipHelpText ); 768*cdf0e10cSrcweir m_aMenuItemHandlerVector.push_back( pMenuItemHandler ); 769*cdf0e10cSrcweir } 770*cdf0e10cSrcweir } 771*cdf0e10cSrcweir } 772*cdf0e10cSrcweir } 773*cdf0e10cSrcweir 774*cdf0e10cSrcweir void MenuManager::UpdateSpecialWindowMenu( Menu* pMenu,const Reference< XMultiServiceFactory >& xServiceFactory,framework::IMutex& _rMutex ) 775*cdf0e10cSrcweir { 776*cdf0e10cSrcweir // update window list 777*cdf0e10cSrcweir ::std::vector< ::rtl::OUString > aNewWindowListVector; 778*cdf0e10cSrcweir 779*cdf0e10cSrcweir // #110897# 780*cdf0e10cSrcweir Reference< XDesktop > xDesktop( xServiceFactory->createInstance( SERVICENAME_DESKTOP ), UNO_QUERY ); 781*cdf0e10cSrcweir 782*cdf0e10cSrcweir sal_uInt16 nActiveItemId = 0; 783*cdf0e10cSrcweir sal_uInt16 nItemId = START_ITEMID_WINDOWLIST; 784*cdf0e10cSrcweir 785*cdf0e10cSrcweir if ( xDesktop.is() ) 786*cdf0e10cSrcweir { 787*cdf0e10cSrcweir Reference< XFramesSupplier > xTasksSupplier( xDesktop, UNO_QUERY ); 788*cdf0e10cSrcweir Reference< XFrame > xCurrentFrame = xDesktop->getCurrentFrame(); 789*cdf0e10cSrcweir Reference< XIndexAccess > xList( xTasksSupplier->getFrames(), UNO_QUERY ); 790*cdf0e10cSrcweir sal_Int32 nCount = xList->getCount(); 791*cdf0e10cSrcweir aNewWindowListVector.reserve(nCount); 792*cdf0e10cSrcweir for (sal_Int32 i=0; i<nCount; ++i ) 793*cdf0e10cSrcweir { 794*cdf0e10cSrcweir Reference< XFrame > xFrame; 795*cdf0e10cSrcweir xList->getByIndex(i) >>= xFrame; 796*cdf0e10cSrcweir 797*cdf0e10cSrcweir if (xFrame.is()) 798*cdf0e10cSrcweir { 799*cdf0e10cSrcweir if ( xFrame == xCurrentFrame ) 800*cdf0e10cSrcweir nActiveItemId = nItemId; 801*cdf0e10cSrcweir 802*cdf0e10cSrcweir Window* pWin = VCLUnoHelper::GetWindow( xFrame->getContainerWindow() ); 803*cdf0e10cSrcweir if ( pWin && pWin->IsVisible() ) 804*cdf0e10cSrcweir { 805*cdf0e10cSrcweir aNewWindowListVector.push_back( pWin->GetText() ); 806*cdf0e10cSrcweir ++nItemId; 807*cdf0e10cSrcweir } 808*cdf0e10cSrcweir } 809*cdf0e10cSrcweir } 810*cdf0e10cSrcweir } 811*cdf0e10cSrcweir 812*cdf0e10cSrcweir { 813*cdf0e10cSrcweir ResetableGuard aGuard( _rMutex ); 814*cdf0e10cSrcweir 815*cdf0e10cSrcweir int nItemCount = pMenu->GetItemCount(); 816*cdf0e10cSrcweir 817*cdf0e10cSrcweir if ( nItemCount > 0 ) 818*cdf0e10cSrcweir { 819*cdf0e10cSrcweir // remove all old window list entries from menu 820*cdf0e10cSrcweir sal_uInt16 nPos = pMenu->GetItemPos( START_ITEMID_WINDOWLIST ); 821*cdf0e10cSrcweir for ( sal_uInt16 n = nPos; n < pMenu->GetItemCount(); ) 822*cdf0e10cSrcweir pMenu->RemoveItem( n ); 823*cdf0e10cSrcweir 824*cdf0e10cSrcweir if ( pMenu->GetItemType( pMenu->GetItemCount()-1 ) == MENUITEM_SEPARATOR ) 825*cdf0e10cSrcweir pMenu->RemoveItem( pMenu->GetItemCount()-1 ); 826*cdf0e10cSrcweir } 827*cdf0e10cSrcweir 828*cdf0e10cSrcweir if ( !aNewWindowListVector.empty() ) 829*cdf0e10cSrcweir { 830*cdf0e10cSrcweir // append new window list entries to menu 831*cdf0e10cSrcweir pMenu->InsertSeparator(); 832*cdf0e10cSrcweir nItemId = START_ITEMID_WINDOWLIST; 833*cdf0e10cSrcweir const sal_uInt32 nCount = aNewWindowListVector.size(); 834*cdf0e10cSrcweir for ( sal_uInt32 i = 0; i < nCount; i++ ) 835*cdf0e10cSrcweir { 836*cdf0e10cSrcweir pMenu->InsertItem( nItemId, aNewWindowListVector.at( i ), MIB_RADIOCHECK ); 837*cdf0e10cSrcweir if ( nItemId == nActiveItemId ) 838*cdf0e10cSrcweir pMenu->CheckItem( nItemId ); 839*cdf0e10cSrcweir ++nItemId; 840*cdf0e10cSrcweir } 841*cdf0e10cSrcweir } 842*cdf0e10cSrcweir } 843*cdf0e10cSrcweir } 844*cdf0e10cSrcweir 845*cdf0e10cSrcweir 846*cdf0e10cSrcweir void MenuManager::CreatePicklistArguments( Sequence< PropertyValue >& aArgsList, const MenuItemHandler* pMenuItemHandler ) 847*cdf0e10cSrcweir { 848*cdf0e10cSrcweir int NUM_OF_PICKLIST_ARGS = 3; 849*cdf0e10cSrcweir 850*cdf0e10cSrcweir Any a; 851*cdf0e10cSrcweir aArgsList.realloc( NUM_OF_PICKLIST_ARGS ); 852*cdf0e10cSrcweir 853*cdf0e10cSrcweir aArgsList[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FileName" )); 854*cdf0e10cSrcweir a <<= pMenuItemHandler->aMenuItemURL; 855*cdf0e10cSrcweir aArgsList[0].Value = a; 856*cdf0e10cSrcweir 857*cdf0e10cSrcweir aArgsList[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Referer" )); 858*cdf0e10cSrcweir a <<= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SFX_REFERER_USER )); 859*cdf0e10cSrcweir aArgsList[1].Value = a; 860*cdf0e10cSrcweir 861*cdf0e10cSrcweir ::rtl::OUString aFilter( pMenuItemHandler->aFilter ); 862*cdf0e10cSrcweir 863*cdf0e10cSrcweir sal_Int32 nPos = aFilter.indexOf( '|' ); 864*cdf0e10cSrcweir if ( nPos >= 0 ) 865*cdf0e10cSrcweir { 866*cdf0e10cSrcweir ::rtl::OUString aFilterOptions; 867*cdf0e10cSrcweir 868*cdf0e10cSrcweir if ( nPos < ( aFilter.getLength() - 1 ) ) 869*cdf0e10cSrcweir aFilterOptions = aFilter.copy( nPos+1 ); 870*cdf0e10cSrcweir 871*cdf0e10cSrcweir aArgsList[2].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FilterOptions" )); 872*cdf0e10cSrcweir a <<= aFilterOptions; 873*cdf0e10cSrcweir aArgsList[2].Value = a; 874*cdf0e10cSrcweir 875*cdf0e10cSrcweir aFilter = aFilter.copy( 0, nPos-1 ); 876*cdf0e10cSrcweir aArgsList.realloc( ++NUM_OF_PICKLIST_ARGS ); 877*cdf0e10cSrcweir } 878*cdf0e10cSrcweir 879*cdf0e10cSrcweir aArgsList[NUM_OF_PICKLIST_ARGS-1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FilterName" )); 880*cdf0e10cSrcweir a <<= aFilter; 881*cdf0e10cSrcweir aArgsList[NUM_OF_PICKLIST_ARGS-1].Value = a; 882*cdf0e10cSrcweir } 883*cdf0e10cSrcweir 884*cdf0e10cSrcweir 885*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 886*cdf0e10cSrcweir // vcl handler 887*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 888*cdf0e10cSrcweir 889*cdf0e10cSrcweir IMPL_LINK( MenuManager, Activate, Menu *, pMenu ) 890*cdf0e10cSrcweir { 891*cdf0e10cSrcweir if ( pMenu == m_pVCLMenu ) 892*cdf0e10cSrcweir { 893*cdf0e10cSrcweir // set/unset hiding disabled menu entries 894*cdf0e10cSrcweir sal_Bool bDontHide = SvtMenuOptions().IsEntryHidingEnabled(); 895*cdf0e10cSrcweir const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings(); 896*cdf0e10cSrcweir sal_Bool bShowMenuImages = rSettings.GetUseImagesInMenus(); 897*cdf0e10cSrcweir 898*cdf0e10cSrcweir sal_uInt16 nFlag = pMenu->GetMenuFlags(); 899*cdf0e10cSrcweir if ( bDontHide ) 900*cdf0e10cSrcweir nFlag &= ~MENU_FLAG_HIDEDISABLEDENTRIES; 901*cdf0e10cSrcweir else 902*cdf0e10cSrcweir nFlag |= MENU_FLAG_HIDEDISABLEDENTRIES; 903*cdf0e10cSrcweir pMenu->SetMenuFlags( nFlag ); 904*cdf0e10cSrcweir 905*cdf0e10cSrcweir if ( m_bActive ) 906*cdf0e10cSrcweir return 0; 907*cdf0e10cSrcweir 908*cdf0e10cSrcweir m_bActive = sal_True; 909*cdf0e10cSrcweir 910*cdf0e10cSrcweir ::rtl::OUString aCommand( m_aMenuItemCommand ); 911*cdf0e10cSrcweir if ( m_aMenuItemCommand.matchIgnoreAsciiCase( UNO_COMMAND, 0 )) 912*cdf0e10cSrcweir { 913*cdf0e10cSrcweir // Remove protocol part from command so we can use an easier comparision method 914*cdf0e10cSrcweir aCommand = aCommand.copy( UNO_COMMAND.getLength() ); 915*cdf0e10cSrcweir } 916*cdf0e10cSrcweir 917*cdf0e10cSrcweir if ( m_aMenuItemCommand == aSpecialFileMenu || 918*cdf0e10cSrcweir m_aMenuItemCommand == aSlotSpecialFileMenu || 919*cdf0e10cSrcweir aCommand == aSpecialFileCommand ) 920*cdf0e10cSrcweir UpdateSpecialFileMenu( pMenu ); 921*cdf0e10cSrcweir else if ( m_aMenuItemCommand == aSpecialWindowMenu || 922*cdf0e10cSrcweir m_aMenuItemCommand == aSlotSpecialWindowMenu || 923*cdf0e10cSrcweir aCommand == aSpecialWindowCommand ) 924*cdf0e10cSrcweir UpdateSpecialWindowMenu( pMenu,getServiceFactory(),m_aLock ); 925*cdf0e10cSrcweir 926*cdf0e10cSrcweir // Check if some modes have changed so we have to update our menu images 927*cdf0e10cSrcweir sal_Bool bIsHiContrast = rSettings.GetHighContrastMode(); 928*cdf0e10cSrcweir 929*cdf0e10cSrcweir if ( m_bWasHiContrast != bIsHiContrast || bShowMenuImages != m_bShowMenuImages ) 930*cdf0e10cSrcweir { 931*cdf0e10cSrcweir // The mode changed so we have to replace all images 932*cdf0e10cSrcweir m_bWasHiContrast = bIsHiContrast; 933*cdf0e10cSrcweir m_bShowMenuImages = bShowMenuImages; 934*cdf0e10cSrcweir FillMenuImages(m_xFrame,pMenu,bIsHiContrast,bShowMenuImages); 935*cdf0e10cSrcweir } 936*cdf0e10cSrcweir 937*cdf0e10cSrcweir if ( m_bInitialized ) 938*cdf0e10cSrcweir return 0; 939*cdf0e10cSrcweir else 940*cdf0e10cSrcweir { 941*cdf0e10cSrcweir URL aTargetURL; 942*cdf0e10cSrcweir 943*cdf0e10cSrcweir // #110897# 944*cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 945*cdf0e10cSrcweir 946*cdf0e10cSrcweir REFERENCE< XDISPATCHPROVIDER > xDispatchProvider( m_xFrame, UNO_QUERY ); 947*cdf0e10cSrcweir if ( xDispatchProvider.is() ) 948*cdf0e10cSrcweir { 949*cdf0e10cSrcweir std::vector< MenuItemHandler* >::iterator p; 950*cdf0e10cSrcweir for ( p = m_aMenuItemHandlerVector.begin(); p != m_aMenuItemHandlerVector.end(); p++ ) 951*cdf0e10cSrcweir { 952*cdf0e10cSrcweir MenuItemHandler* pMenuItemHandler = *p; 953*cdf0e10cSrcweir if ( pMenuItemHandler && 954*cdf0e10cSrcweir pMenuItemHandler->pSubMenuManager == 0 && 955*cdf0e10cSrcweir !pMenuItemHandler->xMenuItemDispatch.is() ) 956*cdf0e10cSrcweir { 957*cdf0e10cSrcweir // There is no dispatch mechanism for the special window list menu items, 958*cdf0e10cSrcweir // because they are handled directly through XFrame->activate!!! 959*cdf0e10cSrcweir if ( pMenuItemHandler->nItemId < START_ITEMID_WINDOWLIST || 960*cdf0e10cSrcweir pMenuItemHandler->nItemId > END_ITEMID_WINDOWLIST ) 961*cdf0e10cSrcweir { 962*cdf0e10cSrcweir ::rtl::OUString aItemCommand = pMenu->GetItemCommand( pMenuItemHandler->nItemId ); 963*cdf0e10cSrcweir if ( !aItemCommand.getLength() ) 964*cdf0e10cSrcweir { 965*cdf0e10cSrcweir const static ::rtl::OUString aSlotString( RTL_CONSTASCII_USTRINGPARAM( "slot:" )); 966*cdf0e10cSrcweir aItemCommand = aSlotString; 967*cdf0e10cSrcweir aItemCommand += ::rtl::OUString::valueOf( (sal_Int32)pMenuItemHandler->nItemId ); 968*cdf0e10cSrcweir pMenu->SetItemCommand( pMenuItemHandler->nItemId, aItemCommand ); 969*cdf0e10cSrcweir } 970*cdf0e10cSrcweir 971*cdf0e10cSrcweir aTargetURL.Complete = aItemCommand; 972*cdf0e10cSrcweir 973*cdf0e10cSrcweir m_xURLTransformer->parseStrict( aTargetURL ); 974*cdf0e10cSrcweir 975*cdf0e10cSrcweir REFERENCE< XDISPATCH > xMenuItemDispatch; 976*cdf0e10cSrcweir if ( m_bIsBookmarkMenu ) 977*cdf0e10cSrcweir xMenuItemDispatch = xDispatchProvider->queryDispatch( aTargetURL, pMenuItemHandler->aTargetFrame, 0 ); 978*cdf0e10cSrcweir else 979*cdf0e10cSrcweir xMenuItemDispatch = xDispatchProvider->queryDispatch( aTargetURL, ::rtl::OUString(), 0 ); 980*cdf0e10cSrcweir 981*cdf0e10cSrcweir if ( xMenuItemDispatch.is() ) 982*cdf0e10cSrcweir { 983*cdf0e10cSrcweir pMenuItemHandler->xMenuItemDispatch = xMenuItemDispatch; 984*cdf0e10cSrcweir pMenuItemHandler->aMenuItemURL = aTargetURL.Complete; 985*cdf0e10cSrcweir xMenuItemDispatch->addStatusListener( SAL_STATIC_CAST( XSTATUSLISTENER*, this ), aTargetURL ); 986*cdf0e10cSrcweir } 987*cdf0e10cSrcweir else 988*cdf0e10cSrcweir pMenu->EnableItem( pMenuItemHandler->nItemId, sal_False ); 989*cdf0e10cSrcweir } 990*cdf0e10cSrcweir } 991*cdf0e10cSrcweir } 992*cdf0e10cSrcweir } 993*cdf0e10cSrcweir } 994*cdf0e10cSrcweir } 995*cdf0e10cSrcweir 996*cdf0e10cSrcweir return 1; 997*cdf0e10cSrcweir } 998*cdf0e10cSrcweir 999*cdf0e10cSrcweir 1000*cdf0e10cSrcweir IMPL_LINK( MenuManager, Deactivate, Menu *, pMenu ) 1001*cdf0e10cSrcweir { 1002*cdf0e10cSrcweir if ( pMenu == m_pVCLMenu ) 1003*cdf0e10cSrcweir m_bActive = sal_False; 1004*cdf0e10cSrcweir 1005*cdf0e10cSrcweir return 1; 1006*cdf0e10cSrcweir } 1007*cdf0e10cSrcweir 1008*cdf0e10cSrcweir 1009*cdf0e10cSrcweir IMPL_LINK( MenuManager, Select, Menu *, pMenu ) 1010*cdf0e10cSrcweir { 1011*cdf0e10cSrcweir URL aTargetURL; 1012*cdf0e10cSrcweir Sequence<PropertyValue> aArgs; 1013*cdf0e10cSrcweir REFERENCE< XDISPATCH > xDispatch; 1014*cdf0e10cSrcweir 1015*cdf0e10cSrcweir { 1016*cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1017*cdf0e10cSrcweir 1018*cdf0e10cSrcweir sal_uInt16 nCurItemId = pMenu->GetCurItemId(); 1019*cdf0e10cSrcweir if ( pMenu == m_pVCLMenu && 1020*cdf0e10cSrcweir pMenu->GetItemType( nCurItemId ) != MENUITEM_SEPARATOR ) 1021*cdf0e10cSrcweir { 1022*cdf0e10cSrcweir if ( nCurItemId >= START_ITEMID_WINDOWLIST && 1023*cdf0e10cSrcweir nCurItemId <= END_ITEMID_WINDOWLIST ) 1024*cdf0e10cSrcweir { 1025*cdf0e10cSrcweir // window list menu item selected 1026*cdf0e10cSrcweir 1027*cdf0e10cSrcweir // #110897# 1028*cdf0e10cSrcweir // Reference< XFramesSupplier > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance( 1029*cdf0e10cSrcweir // DESKTOP_SERVICE ), UNO_QUERY ); 1030*cdf0e10cSrcweir Reference< XFramesSupplier > xDesktop( getServiceFactory()->createInstance( SERVICENAME_DESKTOP ), UNO_QUERY ); 1031*cdf0e10cSrcweir 1032*cdf0e10cSrcweir if ( xDesktop.is() ) 1033*cdf0e10cSrcweir { 1034*cdf0e10cSrcweir sal_uInt16 nTaskId = START_ITEMID_WINDOWLIST; 1035*cdf0e10cSrcweir Reference< XIndexAccess > xList( xDesktop->getFrames(), UNO_QUERY ); 1036*cdf0e10cSrcweir sal_Int32 nCount = xList->getCount(); 1037*cdf0e10cSrcweir for ( sal_Int32 i=0; i<nCount; ++i ) 1038*cdf0e10cSrcweir { 1039*cdf0e10cSrcweir Reference< XFrame > xFrame; 1040*cdf0e10cSrcweir xList->getByIndex(i) >>= xFrame; 1041*cdf0e10cSrcweir 1042*cdf0e10cSrcweir if ( xFrame.is() && nTaskId == nCurItemId ) 1043*cdf0e10cSrcweir { 1044*cdf0e10cSrcweir Window* pWin = VCLUnoHelper::GetWindow( xFrame->getContainerWindow() ); 1045*cdf0e10cSrcweir pWin->GrabFocus(); 1046*cdf0e10cSrcweir pWin->ToTop( TOTOP_RESTOREWHENMIN ); 1047*cdf0e10cSrcweir break; 1048*cdf0e10cSrcweir } 1049*cdf0e10cSrcweir 1050*cdf0e10cSrcweir nTaskId++; 1051*cdf0e10cSrcweir } 1052*cdf0e10cSrcweir } 1053*cdf0e10cSrcweir } 1054*cdf0e10cSrcweir else 1055*cdf0e10cSrcweir { 1056*cdf0e10cSrcweir MenuItemHandler* pMenuItemHandler = GetMenuItemHandler( nCurItemId ); 1057*cdf0e10cSrcweir if ( pMenuItemHandler && pMenuItemHandler->xMenuItemDispatch.is() ) 1058*cdf0e10cSrcweir { 1059*cdf0e10cSrcweir aTargetURL.Complete = pMenuItemHandler->aMenuItemURL; 1060*cdf0e10cSrcweir m_xURLTransformer->parseStrict( aTargetURL ); 1061*cdf0e10cSrcweir 1062*cdf0e10cSrcweir if ( nCurItemId >= START_ITEMID_PICKLIST && 1063*cdf0e10cSrcweir nCurItemId < START_ITEMID_WINDOWLIST ) 1064*cdf0e10cSrcweir { 1065*cdf0e10cSrcweir // picklist menu item selected 1066*cdf0e10cSrcweir CreatePicklistArguments( aArgs, pMenuItemHandler ); 1067*cdf0e10cSrcweir } 1068*cdf0e10cSrcweir else if ( m_bIsBookmarkMenu ) 1069*cdf0e10cSrcweir { 1070*cdf0e10cSrcweir // bookmark menu item selected 1071*cdf0e10cSrcweir aArgs.realloc( 1 ); 1072*cdf0e10cSrcweir aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Referer" )); 1073*cdf0e10cSrcweir aArgs[0].Value <<= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SFX_REFERER_USER )); 1074*cdf0e10cSrcweir } 1075*cdf0e10cSrcweir 1076*cdf0e10cSrcweir xDispatch = pMenuItemHandler->xMenuItemDispatch; 1077*cdf0e10cSrcweir } 1078*cdf0e10cSrcweir } 1079*cdf0e10cSrcweir } 1080*cdf0e10cSrcweir } 1081*cdf0e10cSrcweir 1082*cdf0e10cSrcweir if ( xDispatch.is() ) 1083*cdf0e10cSrcweir xDispatch->dispatch( aTargetURL, aArgs ); 1084*cdf0e10cSrcweir 1085*cdf0e10cSrcweir return 1; 1086*cdf0e10cSrcweir } 1087*cdf0e10cSrcweir 1088*cdf0e10cSrcweir 1089*cdf0e10cSrcweir IMPL_LINK( MenuManager, Highlight, Menu *, EMPTYARG ) 1090*cdf0e10cSrcweir { 1091*cdf0e10cSrcweir return 0; 1092*cdf0e10cSrcweir } 1093*cdf0e10cSrcweir 1094*cdf0e10cSrcweir // #110897# 1095*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& MenuManager::getServiceFactory() 1096*cdf0e10cSrcweir { 1097*cdf0e10cSrcweir // #110897# 1098*cdf0e10cSrcweir return mxServiceFactory; 1099*cdf0e10cSrcweir } 1100*cdf0e10cSrcweir 1101*cdf0e10cSrcweir void MenuManager::AddMenu(PopupMenu* _pPopupMenu,const ::rtl::OUString& _sItemCommand,sal_uInt16 _nItemId,sal_Bool _bDelete,sal_Bool _bDeleteChildren) 1102*cdf0e10cSrcweir { 1103*cdf0e10cSrcweir MenuManager* pSubMenuManager = new MenuManager( getServiceFactory(), m_xFrame, _pPopupMenu, _bDelete, _bDeleteChildren ); 1104*cdf0e10cSrcweir 1105*cdf0e10cSrcweir // store menu item command as we later have to know which menu is active (see Activate handler) 1106*cdf0e10cSrcweir pSubMenuManager->m_aMenuItemCommand = _sItemCommand; 1107*cdf0e10cSrcweir 1108*cdf0e10cSrcweir REFERENCE< XDISPATCH > aXDispatchRef; 1109*cdf0e10cSrcweir MenuItemHandler* pMenuItemHandler = new MenuItemHandler( 1110*cdf0e10cSrcweir _nItemId, 1111*cdf0e10cSrcweir pSubMenuManager, 1112*cdf0e10cSrcweir aXDispatchRef ); 1113*cdf0e10cSrcweir m_aMenuItemHandlerVector.push_back( pMenuItemHandler ); 1114*cdf0e10cSrcweir } 1115*cdf0e10cSrcweir 1116*cdf0e10cSrcweir sal_uInt16 MenuManager::FillItemCommand(::rtl::OUString& _rItemCommand,Menu* _pMenu,sal_uInt16 _nIndex) const 1117*cdf0e10cSrcweir { 1118*cdf0e10cSrcweir sal_uInt16 nItemId = _pMenu->GetItemId( _nIndex ); 1119*cdf0e10cSrcweir 1120*cdf0e10cSrcweir _rItemCommand = _pMenu->GetItemCommand( nItemId ); 1121*cdf0e10cSrcweir if ( !_rItemCommand.getLength() ) 1122*cdf0e10cSrcweir { 1123*cdf0e10cSrcweir const static ::rtl::OUString aSlotString( RTL_CONSTASCII_USTRINGPARAM( "slot:" )); 1124*cdf0e10cSrcweir _rItemCommand = aSlotString; 1125*cdf0e10cSrcweir _rItemCommand += ::rtl::OUString::valueOf( (sal_Int32)nItemId ); 1126*cdf0e10cSrcweir _pMenu->SetItemCommand( nItemId, _rItemCommand ); 1127*cdf0e10cSrcweir } 1128*cdf0e10cSrcweir return nItemId; 1129*cdf0e10cSrcweir } 1130*cdf0e10cSrcweir void MenuManager::FillMenuImages(Reference< XFrame >& _xFrame,Menu* _pMenu,sal_Bool bIsHiContrast,sal_Bool bShowMenuImages) 1131*cdf0e10cSrcweir { 1132*cdf0e10cSrcweir AddonsOptions aAddonOptions; 1133*cdf0e10cSrcweir 1134*cdf0e10cSrcweir for ( sal_uInt16 nPos = 0; nPos < _pMenu->GetItemCount(); nPos++ ) 1135*cdf0e10cSrcweir { 1136*cdf0e10cSrcweir sal_uInt16 nId = _pMenu->GetItemId( nPos ); 1137*cdf0e10cSrcweir if ( _pMenu->GetItemType( nPos ) != MENUITEM_SEPARATOR ) 1138*cdf0e10cSrcweir { 1139*cdf0e10cSrcweir bool bTmpShowMenuImages( bShowMenuImages ); 1140*cdf0e10cSrcweir MenuItemBits nBits = _pMenu->GetItemBits( nId ); 1141*cdf0e10cSrcweir // overwrite the default? 1142*cdf0e10cSrcweir if ( nBits ) 1143*cdf0e10cSrcweir bTmpShowMenuImages = ( ( nBits & MIB_ICON ) == MIB_ICON ); 1144*cdf0e10cSrcweir 1145*cdf0e10cSrcweir if ( bTmpShowMenuImages ) 1146*cdf0e10cSrcweir { 1147*cdf0e10cSrcweir sal_Bool bImageSet = sal_False; 1148*cdf0e10cSrcweir ::rtl::OUString aImageId; 1149*cdf0e10cSrcweir 1150*cdf0e10cSrcweir ::framework::MenuConfiguration::Attributes* pMenuAttributes = 1151*cdf0e10cSrcweir (::framework::MenuConfiguration::Attributes*)_pMenu->GetUserValue( nId ); 1152*cdf0e10cSrcweir 1153*cdf0e10cSrcweir if ( pMenuAttributes ) 1154*cdf0e10cSrcweir aImageId = pMenuAttributes->aImageId; // Retrieve image id from menu attributes 1155*cdf0e10cSrcweir 1156*cdf0e10cSrcweir if ( aImageId.getLength() > 0 ) 1157*cdf0e10cSrcweir { 1158*cdf0e10cSrcweir Image aImage = GetImageFromURL( _xFrame, aImageId, sal_False, bIsHiContrast ); 1159*cdf0e10cSrcweir if ( !!aImage ) 1160*cdf0e10cSrcweir { 1161*cdf0e10cSrcweir bImageSet = sal_True; 1162*cdf0e10cSrcweir _pMenu->SetItemImage( nId, aImage ); 1163*cdf0e10cSrcweir } 1164*cdf0e10cSrcweir } 1165*cdf0e10cSrcweir 1166*cdf0e10cSrcweir if ( !bImageSet ) 1167*cdf0e10cSrcweir { 1168*cdf0e10cSrcweir rtl::OUString aMenuItemCommand = _pMenu->GetItemCommand( nId ); 1169*cdf0e10cSrcweir Image aImage = GetImageFromURL( _xFrame, aMenuItemCommand, sal_False, bIsHiContrast ); 1170*cdf0e10cSrcweir if ( !aImage ) 1171*cdf0e10cSrcweir aImage = aAddonOptions.GetImageFromURL( aMenuItemCommand, sal_False, bIsHiContrast ); 1172*cdf0e10cSrcweir 1173*cdf0e10cSrcweir _pMenu->SetItemImage( nId, aImage ); 1174*cdf0e10cSrcweir } 1175*cdf0e10cSrcweir } 1176*cdf0e10cSrcweir else 1177*cdf0e10cSrcweir _pMenu->SetItemImage( nId, Image() ); 1178*cdf0e10cSrcweir } 1179*cdf0e10cSrcweir } 1180*cdf0e10cSrcweir } 1181*cdf0e10cSrcweir } 1182