16d739b60SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 36d739b60SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 46d739b60SAndrew Rist * or more contributor license agreements. See the NOTICE file 56d739b60SAndrew Rist * distributed with this work for additional information 66d739b60SAndrew Rist * regarding copyright ownership. The ASF licenses this file 76d739b60SAndrew Rist * to you under the Apache License, Version 2.0 (the 86d739b60SAndrew Rist * "License"); you may not use this file except in compliance 96d739b60SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 116d739b60SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 136d739b60SAndrew Rist * Unless required by applicable law or agreed to in writing, 146d739b60SAndrew Rist * software distributed under the License is distributed on an 156d739b60SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 166d739b60SAndrew Rist * KIND, either express or implied. See the License for the 176d739b60SAndrew Rist * specific language governing permissions and limitations 186d739b60SAndrew Rist * under the License. 19cdf0e10cSrcweir * 206d739b60SAndrew Rist *************************************************************/ 216d739b60SAndrew Rist 226d739b60SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_framework.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 28cdf0e10cSrcweir // my own includes 29cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 30cdf0e10cSrcweir #include "framework/addonmenu.hxx" 31cdf0e10cSrcweir #include "framework/addonsoptions.hxx" 32cdf0e10cSrcweir #include <general.h> 33cdf0e10cSrcweir #include <macros/debug/assertion.hxx> 34cdf0e10cSrcweir #include <framework/imageproducer.hxx> 35cdf0e10cSrcweir #include <framework/menuconfiguration.hxx> 36*39ca3745STsutomu Uchino #include <services.h> 37cdf0e10cSrcweir 38cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 39cdf0e10cSrcweir // interface includes 40cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 41cdf0e10cSrcweir #include <com/sun/star/uno/Reference.hxx> 42cdf0e10cSrcweir #include <com/sun/star/util/URL.hpp> 43cdf0e10cSrcweir #include <com/sun/star/util/XURLTransformer.hpp> 44*39ca3745STsutomu Uchino #include <com/sun/star/frame/XModuleManager.hpp> 45cdf0e10cSrcweir 46cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 47cdf0e10cSrcweir // includes of other projects 48cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 49cdf0e10cSrcweir #include <tools/config.hxx> 50cdf0e10cSrcweir #include <vcl/svapp.hxx> 51cdf0e10cSrcweir #include <svtools/menuoptions.hxx> 52cdf0e10cSrcweir #include <svl/solar.hrc> 53cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 54cdf0e10cSrcweir // namespace 55cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 56cdf0e10cSrcweir 57cdf0e10cSrcweir using namespace ::com::sun::star::uno; 58cdf0e10cSrcweir using namespace ::com::sun::star::lang; 59cdf0e10cSrcweir using namespace ::com::sun::star::frame; 60cdf0e10cSrcweir using namespace ::com::sun::star::beans; 61cdf0e10cSrcweir 62cdf0e10cSrcweir // Please look at sfx2/inc/sfxsids.hrc the values are defined there. Due to build dependencies 63cdf0e10cSrcweir // we cannot include the header file. 64cdf0e10cSrcweir const sal_uInt16 SID_HELPMENU = (SID_SFX_START + 410); 65707fc0d4SJürgen Schmidt const sal_uInt16 SID_HELP_SUPPORTPAGE = (SID_SFX_START + 1683); 66cdf0e10cSrcweir 67cdf0e10cSrcweir namespace framework 68cdf0e10cSrcweir { 69cdf0e10cSrcweir 70cdf0e10cSrcweir AddonMenu::AddonMenu( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame ) : 71cdf0e10cSrcweir m_xFrame( rFrame ) 72cdf0e10cSrcweir { 73cdf0e10cSrcweir } 74cdf0e10cSrcweir 75cdf0e10cSrcweir AddonMenu::~AddonMenu() 76cdf0e10cSrcweir { 77cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < GetItemCount(); i++ ) 78cdf0e10cSrcweir { 79cdf0e10cSrcweir if ( GetItemType( i ) != MENUITEM_SEPARATOR ) 80cdf0e10cSrcweir { 81cdf0e10cSrcweir // delete user attributes created with new! 82cdf0e10cSrcweir sal_uInt16 nId = GetItemId( i ); 83cdf0e10cSrcweir MenuConfiguration::Attributes* pUserAttributes = (MenuConfiguration::Attributes*)GetUserValue( nId ); 84cdf0e10cSrcweir delete pUserAttributes; 85cdf0e10cSrcweir delete GetPopupMenu( nId ); 86cdf0e10cSrcweir } 87cdf0e10cSrcweir } 88cdf0e10cSrcweir } 89cdf0e10cSrcweir 90cdf0e10cSrcweir // ------------------------------------------------------------------------ 91cdf0e10cSrcweir 92cdf0e10cSrcweir // ------------------------------------------------------------------------ 93cdf0e10cSrcweir // Check if command URL string has the unique prefix to identify addon popup menus 94cdf0e10cSrcweir sal_Bool AddonPopupMenu::IsCommandURLPrefix( const ::rtl::OUString& aCmdURL ) 95cdf0e10cSrcweir { 96cdf0e10cSrcweir const char aPrefixCharBuf[] = ADDONSPOPUPMENU_URL_PREFIX_STR; 97cdf0e10cSrcweir 98cdf0e10cSrcweir return aCmdURL.matchAsciiL( aPrefixCharBuf, sizeof( aPrefixCharBuf )-1, 0 ); 99cdf0e10cSrcweir } 100cdf0e10cSrcweir 101cdf0e10cSrcweir AddonPopupMenu::AddonPopupMenu( const com::sun::star::uno::Reference< com::sun::star::frame::XFrame >& rFrame ) : 102cdf0e10cSrcweir AddonMenu( rFrame ) 103cdf0e10cSrcweir { 104cdf0e10cSrcweir } 105cdf0e10cSrcweir 106cdf0e10cSrcweir AddonPopupMenu::~AddonPopupMenu() 107cdf0e10cSrcweir { 108cdf0e10cSrcweir } 109cdf0e10cSrcweir 110cdf0e10cSrcweir // ------------------------------------------------------------------------ 111cdf0e10cSrcweir 112*39ca3745STsutomu Uchino static ::rtl::OUString GetModuleIdentifier( const Reference< XMultiServiceFactory >& rServiceManager, 113*39ca3745STsutomu Uchino const Reference< XFrame >& rFrame ) 114cdf0e10cSrcweir { 115*39ca3745STsutomu Uchino Reference< XModuleManager > xModuleManager( rServiceManager->createInstance( SERVICENAME_MODULEMANAGER ), UNO_QUERY ); 116*39ca3745STsutomu Uchino if ( xModuleManager.is() ) 117cdf0e10cSrcweir { 118*39ca3745STsutomu Uchino try 119*39ca3745STsutomu Uchino { 120*39ca3745STsutomu Uchino return xModuleManager->identify( rFrame ); 121cdf0e10cSrcweir } 122*39ca3745STsutomu Uchino catch ( Exception& ) 123*39ca3745STsutomu Uchino { 124*39ca3745STsutomu Uchino } 125*39ca3745STsutomu Uchino } 126*39ca3745STsutomu Uchino return ::rtl::OUString(); 127cdf0e10cSrcweir } 128cdf0e10cSrcweir 129cdf0e10cSrcweir // ------------------------------------------------------------------------ 130cdf0e10cSrcweir 131cdf0e10cSrcweir sal_Bool AddonMenuManager::HasAddonMenuElements() 132cdf0e10cSrcweir { 133cdf0e10cSrcweir return AddonsOptions().HasAddonsMenu(); 134cdf0e10cSrcweir } 135cdf0e10cSrcweir 136cdf0e10cSrcweir sal_Bool AddonMenuManager::HasAddonHelpMenuElements() 137cdf0e10cSrcweir { 138cdf0e10cSrcweir return AddonsOptions().HasAddonsHelpMenu(); 139cdf0e10cSrcweir } 140cdf0e10cSrcweir 141cdf0e10cSrcweir // Factory method to create different Add-On menu types 142cdf0e10cSrcweir PopupMenu* AddonMenuManager::CreatePopupMenuType( MenuType eMenuType, const Reference< XFrame >& rFrame ) 143cdf0e10cSrcweir { 144cdf0e10cSrcweir if ( eMenuType == ADDON_MENU ) 145cdf0e10cSrcweir return new AddonMenu( rFrame ); 146cdf0e10cSrcweir else if ( eMenuType == ADDON_POPUPMENU ) 147cdf0e10cSrcweir return new AddonPopupMenu( rFrame ); 148cdf0e10cSrcweir else 149cdf0e10cSrcweir return NULL; 150cdf0e10cSrcweir } 151cdf0e10cSrcweir 152cdf0e10cSrcweir // Create the Add-Ons menu 153*39ca3745STsutomu Uchino AddonMenu* AddonMenuManager::CreateAddonMenu( const Reference< XFrame >& rFrame, 154*39ca3745STsutomu Uchino const Reference< XMultiServiceFactory >& rServiceManager ) 155cdf0e10cSrcweir { 156cdf0e10cSrcweir AddonsOptions aOptions; 157cdf0e10cSrcweir AddonMenu* pAddonMenu = NULL; 158cdf0e10cSrcweir sal_uInt16 nUniqueMenuId = ADDONMENU_ITEMID_START; 159cdf0e10cSrcweir 160cdf0e10cSrcweir const Sequence< Sequence< PropertyValue > >& rAddonMenuEntries = aOptions.GetAddonsMenu(); 161cdf0e10cSrcweir if ( rAddonMenuEntries.getLength() > 0 ) 162cdf0e10cSrcweir { 163cdf0e10cSrcweir pAddonMenu = (AddonMenu *)AddonMenuManager::CreatePopupMenuType( ADDON_MENU, rFrame ); 164*39ca3745STsutomu Uchino ::rtl::OUString aModuleIdentifier = GetModuleIdentifier( rServiceManager, rFrame ); 165*39ca3745STsutomu Uchino AddonMenuManager::BuildMenu( pAddonMenu, ADDON_MENU, MENU_APPEND, nUniqueMenuId, rAddonMenuEntries, rFrame, aModuleIdentifier ); 166cdf0e10cSrcweir 167cdf0e10cSrcweir // Don't return an empty Add-On menu 168cdf0e10cSrcweir if ( pAddonMenu->GetItemCount() == 0 ) 169cdf0e10cSrcweir { 170cdf0e10cSrcweir delete pAddonMenu; 171cdf0e10cSrcweir pAddonMenu = NULL; 172cdf0e10cSrcweir } 173cdf0e10cSrcweir } 174cdf0e10cSrcweir 175cdf0e10cSrcweir return pAddonMenu; 176cdf0e10cSrcweir } 177cdf0e10cSrcweir 178cdf0e10cSrcweir // Returns the next insert position from nPos. 179cdf0e10cSrcweir sal_uInt16 AddonMenuManager::GetNextPos( sal_uInt16 nPos ) 180cdf0e10cSrcweir { 181cdf0e10cSrcweir return ( nPos == MENU_APPEND ) ? MENU_APPEND : ( nPos+1 ); 182cdf0e10cSrcweir } 183cdf0e10cSrcweir 184cdf0e10cSrcweir 185cdf0e10cSrcweir static sal_uInt16 FindMenuId( Menu* pMenu, const String aCommand ) 186cdf0e10cSrcweir { 187cdf0e10cSrcweir sal_uInt16 nPos = 0; 188cdf0e10cSrcweir String aCmd; 189cdf0e10cSrcweir for ( nPos = 0; nPos < pMenu->GetItemCount(); nPos++ ) 190cdf0e10cSrcweir { 191cdf0e10cSrcweir sal_uInt16 nId = pMenu->GetItemId( nPos ); 192cdf0e10cSrcweir aCmd = pMenu->GetItemCommand( nId ); 193cdf0e10cSrcweir if ( aCmd == aCommand ) 194cdf0e10cSrcweir return nId; 195cdf0e10cSrcweir } 196cdf0e10cSrcweir 197cdf0e10cSrcweir return USHRT_MAX; 198cdf0e10cSrcweir } 199cdf0e10cSrcweir 200cdf0e10cSrcweir 201cdf0e10cSrcweir // Merge the Add-Ons help menu items into the given menu bar at a defined pos 202*39ca3745STsutomu Uchino void AddonMenuManager::MergeAddonHelpMenu( const Reference< XFrame >& rFrame, 203*39ca3745STsutomu Uchino MenuBar* pMergeMenuBar, 204*39ca3745STsutomu Uchino const Reference< XMultiServiceFactory >& rServiceManager ) 205cdf0e10cSrcweir { 206cdf0e10cSrcweir if ( pMergeMenuBar ) 207cdf0e10cSrcweir { 208cdf0e10cSrcweir PopupMenu* pHelpMenu = pMergeMenuBar->GetPopupMenu( SID_HELPMENU ); 209cdf0e10cSrcweir if ( !pHelpMenu ) 210cdf0e10cSrcweir { 211cdf0e10cSrcweir sal_uInt16 nId = FindMenuId( pMergeMenuBar, String::CreateFromAscii( ".uno:HelpMenu" )); 212cdf0e10cSrcweir if ( nId != USHRT_MAX ) 213cdf0e10cSrcweir pHelpMenu = pMergeMenuBar->GetPopupMenu( nId ); 214cdf0e10cSrcweir } 215cdf0e10cSrcweir 216cdf0e10cSrcweir if ( pHelpMenu ) 217cdf0e10cSrcweir { 218707fc0d4SJürgen Schmidt static const char REFERENCECOMMAND_AFTER[] = ".uno:HelpSupport"; 219cdf0e10cSrcweir static const char REFERENCECOMMAND_BEFORE[] = ".uno:About"; 220cdf0e10cSrcweir 221cdf0e10cSrcweir // Add-Ons help menu items should be inserted after the "registration" menu item 222cdf0e10cSrcweir bool bAddAfter = true; 223cdf0e10cSrcweir sal_uInt16 nItemCount = pHelpMenu->GetItemCount(); 224707fc0d4SJürgen Schmidt sal_uInt16 nSupPos = pHelpMenu->GetItemPos( SID_HELP_SUPPORTPAGE ); 225707fc0d4SJürgen Schmidt sal_uInt16 nInsPos = nSupPos; 226cdf0e10cSrcweir sal_uInt16 nInsSepAfterPos = MENU_APPEND; 227cdf0e10cSrcweir sal_uInt16 nUniqueMenuId = ADDONMENU_ITEMID_START; 228cdf0e10cSrcweir AddonsOptions aOptions; 229cdf0e10cSrcweir 230707fc0d4SJürgen Schmidt if ( nSupPos == USHRT_MAX ) 231cdf0e10cSrcweir { 232cdf0e10cSrcweir // try to detect the online registration dialog menu item with the command URL 233cdf0e10cSrcweir sal_uInt16 nId = FindMenuId( pHelpMenu, String::CreateFromAscii( REFERENCECOMMAND_AFTER )); 234707fc0d4SJürgen Schmidt nSupPos = pHelpMenu->GetItemPos( nId ); 235707fc0d4SJürgen Schmidt nInsPos = nSupPos; 236cdf0e10cSrcweir } 237cdf0e10cSrcweir 238707fc0d4SJürgen Schmidt if ( nSupPos == USHRT_MAX ) 239cdf0e10cSrcweir { 240cdf0e10cSrcweir // second try: 241cdf0e10cSrcweir // try to detect the about menu item with the command URL 242cdf0e10cSrcweir sal_uInt16 nId = FindMenuId( pHelpMenu, String::CreateFromAscii( REFERENCECOMMAND_BEFORE )); 243707fc0d4SJürgen Schmidt nSupPos = pHelpMenu->GetItemPos( nId ); 244707fc0d4SJürgen Schmidt nInsPos = nSupPos; 245cdf0e10cSrcweir bAddAfter = false; 246cdf0e10cSrcweir } 247cdf0e10cSrcweir 248cdf0e10cSrcweir Sequence< Sequence< PropertyValue > > aAddonSubMenu; 249cdf0e10cSrcweir const Sequence< Sequence< PropertyValue > >& rAddonHelpMenuEntries = aOptions.GetAddonsHelpMenu(); 250cdf0e10cSrcweir 251cdf0e10cSrcweir nInsPos = bAddAfter ? AddonMenuManager::GetNextPos( nInsPos ) : nInsPos; 252cdf0e10cSrcweir if ( nInsPos < nItemCount && pHelpMenu->GetItemType( nInsPos ) != MENUITEM_SEPARATOR ) 253cdf0e10cSrcweir nInsSepAfterPos = nInsPos; 254cdf0e10cSrcweir 255*39ca3745STsutomu Uchino ::rtl::OUString aModuleIdentifier = GetModuleIdentifier( rServiceManager, rFrame ); 256*39ca3745STsutomu Uchino AddonMenuManager::BuildMenu( pHelpMenu, ADDON_MENU, nInsPos, nUniqueMenuId, rAddonHelpMenuEntries, rFrame, aModuleIdentifier ); 257cdf0e10cSrcweir 258cdf0e10cSrcweir if ( pHelpMenu->GetItemCount() > nItemCount ) 259cdf0e10cSrcweir { 260cdf0e10cSrcweir if ( nInsSepAfterPos < MENU_APPEND ) 261cdf0e10cSrcweir { 262cdf0e10cSrcweir nInsSepAfterPos += ( pHelpMenu->GetItemCount() - nItemCount ); 263cdf0e10cSrcweir if ( pHelpMenu->GetItemType( nInsSepAfterPos ) != MENUITEM_SEPARATOR ) 264cdf0e10cSrcweir pHelpMenu->InsertSeparator( nInsSepAfterPos ); 265cdf0e10cSrcweir } 266707fc0d4SJürgen Schmidt if ( nSupPos < MENU_APPEND ) 267707fc0d4SJürgen Schmidt pHelpMenu->InsertSeparator( nSupPos+1 ); 268cdf0e10cSrcweir else 269cdf0e10cSrcweir pHelpMenu->InsertSeparator( nItemCount ); 270cdf0e10cSrcweir } 271cdf0e10cSrcweir } 272cdf0e10cSrcweir } 273cdf0e10cSrcweir } 274cdf0e10cSrcweir 275cdf0e10cSrcweir // Merge the addon popup menus into the given menu bar at the provided pos. 276cdf0e10cSrcweir void AddonMenuManager::MergeAddonPopupMenus( const Reference< XFrame >& rFrame, 277cdf0e10cSrcweir sal_uInt16 nMergeAtPos, 278*39ca3745STsutomu Uchino MenuBar* pMergeMenuBar, 279*39ca3745STsutomu Uchino const Reference< XMultiServiceFactory >& rServiceManager ) 280cdf0e10cSrcweir { 281cdf0e10cSrcweir if ( pMergeMenuBar ) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir AddonsOptions aAddonsOptions; 284cdf0e10cSrcweir sal_uInt16 nInsertPos = nMergeAtPos; 285cdf0e10cSrcweir 286cdf0e10cSrcweir ::rtl::OUString aTitle; 287cdf0e10cSrcweir ::rtl::OUString aURL; 288cdf0e10cSrcweir ::rtl::OUString aTarget; 289cdf0e10cSrcweir ::rtl::OUString aImageId; 290cdf0e10cSrcweir ::rtl::OUString aContext; 291cdf0e10cSrcweir Sequence< Sequence< PropertyValue > > aAddonSubMenu; 292cdf0e10cSrcweir sal_uInt16 nUniqueMenuId = ADDONMENU_ITEMID_START; 293*39ca3745STsutomu Uchino ::rtl::OUString aModuleIdentifier = GetModuleIdentifier( rServiceManager, rFrame ); 294cdf0e10cSrcweir 295cdf0e10cSrcweir const Sequence< Sequence< PropertyValue > >& rAddonMenuEntries = aAddonsOptions.GetAddonsMenuBarPart(); 296cdf0e10cSrcweir for ( sal_Int32 i = 0; i < rAddonMenuEntries.getLength(); i++ ) 297cdf0e10cSrcweir { 298cdf0e10cSrcweir AddonMenuManager::GetMenuEntry( rAddonMenuEntries[i], 299cdf0e10cSrcweir aTitle, 300cdf0e10cSrcweir aURL, 301cdf0e10cSrcweir aTarget, 302cdf0e10cSrcweir aImageId, 303cdf0e10cSrcweir aContext, 304cdf0e10cSrcweir aAddonSubMenu ); 305cdf0e10cSrcweir if ( aTitle.getLength() > 0 && 306cdf0e10cSrcweir aURL.getLength() > 0 && 307cdf0e10cSrcweir aAddonSubMenu.getLength() > 0 && 308*39ca3745STsutomu Uchino AddonMenuManager::IsCorrectContext( aModuleIdentifier, aContext )) 309cdf0e10cSrcweir { 310cdf0e10cSrcweir sal_uInt16 nId = nUniqueMenuId++; 311cdf0e10cSrcweir AddonPopupMenu* pAddonPopupMenu = (AddonPopupMenu *)AddonMenuManager::CreatePopupMenuType( ADDON_POPUPMENU, rFrame ); 312cdf0e10cSrcweir 313*39ca3745STsutomu Uchino AddonMenuManager::BuildMenu( pAddonPopupMenu, ADDON_MENU, MENU_APPEND, nUniqueMenuId, aAddonSubMenu, rFrame, aModuleIdentifier ); 314cdf0e10cSrcweir 315cdf0e10cSrcweir if ( pAddonPopupMenu->GetItemCount() > 0 ) 316cdf0e10cSrcweir { 317cdf0e10cSrcweir pAddonPopupMenu->SetCommandURL( aURL ); 318cdf0e10cSrcweir pMergeMenuBar->InsertItem( nId, aTitle, 0, nInsertPos++ ); 319cdf0e10cSrcweir pMergeMenuBar->SetPopupMenu( nId, pAddonPopupMenu ); 320cdf0e10cSrcweir 321cdf0e10cSrcweir // Store the command URL into the VCL menu bar for later identification 322cdf0e10cSrcweir pMergeMenuBar->SetItemCommand( nId, aURL ); 323cdf0e10cSrcweir } 324cdf0e10cSrcweir else 325cdf0e10cSrcweir delete pAddonPopupMenu; 326cdf0e10cSrcweir } 327cdf0e10cSrcweir } 328cdf0e10cSrcweir } 329cdf0e10cSrcweir } 330cdf0e10cSrcweir 331cdf0e10cSrcweir // Insert the menu and sub menu entries into pCurrentMenu with the aAddonMenuDefinition provided 332cdf0e10cSrcweir void AddonMenuManager::BuildMenu( PopupMenu* pCurrentMenu, 333cdf0e10cSrcweir MenuType nSubMenuType, 334cdf0e10cSrcweir sal_uInt16 nInsPos, 335cdf0e10cSrcweir sal_uInt16& nUniqueMenuId, 336cdf0e10cSrcweir Sequence< Sequence< PropertyValue > > aAddonMenuDefinition, 337cdf0e10cSrcweir const Reference< XFrame >& rFrame, 338*39ca3745STsutomu Uchino const ::rtl::OUString& rModuleIdentifier ) 339cdf0e10cSrcweir { 340cdf0e10cSrcweir Sequence< Sequence< PropertyValue > > aAddonSubMenu; 341cdf0e10cSrcweir sal_Bool bInsertSeparator = sal_False; 342cdf0e10cSrcweir sal_uInt32 i = 0; 343cdf0e10cSrcweir sal_uInt32 nElements = 0; 344cdf0e10cSrcweir sal_uInt32 nCount = aAddonMenuDefinition.getLength(); 345cdf0e10cSrcweir AddonsOptions aAddonsOptions; 346cdf0e10cSrcweir 347cdf0e10cSrcweir ::rtl::OUString aTitle; 348cdf0e10cSrcweir ::rtl::OUString aURL; 349cdf0e10cSrcweir ::rtl::OUString aTarget; 350cdf0e10cSrcweir ::rtl::OUString aImageId; 351cdf0e10cSrcweir ::rtl::OUString aContext; 352cdf0e10cSrcweir 353cdf0e10cSrcweir for ( i = 0; i < nCount; ++i ) 354cdf0e10cSrcweir { 355cdf0e10cSrcweir GetMenuEntry( aAddonMenuDefinition[i], aTitle, aURL, aTarget, aImageId, aContext, aAddonSubMenu ); 356cdf0e10cSrcweir 357*39ca3745STsutomu Uchino if ( !IsCorrectContext( rModuleIdentifier, aContext ) || ( !aTitle.getLength() && !aURL.getLength() )) 358cdf0e10cSrcweir continue; 359cdf0e10cSrcweir 360cdf0e10cSrcweir if ( aURL == ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:separator" ))) 361cdf0e10cSrcweir bInsertSeparator = sal_True; 362cdf0e10cSrcweir else 363cdf0e10cSrcweir { 364cdf0e10cSrcweir PopupMenu* pSubMenu = NULL; 365cdf0e10cSrcweir if ( aAddonSubMenu.getLength() > 0 ) 366cdf0e10cSrcweir { 367cdf0e10cSrcweir pSubMenu = AddonMenuManager::CreatePopupMenuType( nSubMenuType, rFrame ); 368*39ca3745STsutomu Uchino AddonMenuManager::BuildMenu( pSubMenu, nSubMenuType, MENU_APPEND, nUniqueMenuId, aAddonSubMenu, rFrame, rModuleIdentifier ); 369cdf0e10cSrcweir 370cdf0e10cSrcweir // Don't create a menu item for an empty sub menu 371cdf0e10cSrcweir if ( pSubMenu->GetItemCount() == 0 ) 372cdf0e10cSrcweir { 373cdf0e10cSrcweir delete pSubMenu; 374cdf0e10cSrcweir pSubMenu = NULL; 375cdf0e10cSrcweir continue; 376cdf0e10cSrcweir } 377cdf0e10cSrcweir } 378cdf0e10cSrcweir 379cdf0e10cSrcweir if ( bInsertSeparator && nElements > 0 ) 380cdf0e10cSrcweir { 381cdf0e10cSrcweir // Insert a separator only when we insert a new element afterwards and we 382cdf0e10cSrcweir // have already one before us 383cdf0e10cSrcweir nElements = 0; 384cdf0e10cSrcweir bInsertSeparator = sal_False; 385cdf0e10cSrcweir pCurrentMenu->InsertSeparator( nInsPos ); 386cdf0e10cSrcweir nInsPos = AddonMenuManager::GetNextPos( nInsPos ); 387cdf0e10cSrcweir } 388cdf0e10cSrcweir 389cdf0e10cSrcweir sal_uInt16 nId = nUniqueMenuId++; 390cdf0e10cSrcweir pCurrentMenu->InsertItem( nId, aTitle, 0, nInsPos ); 391cdf0e10cSrcweir nInsPos = AddonMenuManager::GetNextPos( nInsPos ); 392cdf0e10cSrcweir 393cdf0e10cSrcweir ++nElements; 394cdf0e10cSrcweir 395cdf0e10cSrcweir // Store values from configuration to the New and Wizard menu entries to enable 396cdf0e10cSrcweir // sfx2 based code to support high contrast mode correctly! 397cdf0e10cSrcweir pCurrentMenu->SetUserValue( nId, sal_uIntPtr( new MenuConfiguration::Attributes( aTarget, aImageId )) ); 398cdf0e10cSrcweir pCurrentMenu->SetItemCommand( nId, aURL ); 399cdf0e10cSrcweir 400cdf0e10cSrcweir if ( pSubMenu ) 401cdf0e10cSrcweir pCurrentMenu->SetPopupMenu( nId, pSubMenu ); 402cdf0e10cSrcweir } 403cdf0e10cSrcweir } 404cdf0e10cSrcweir } 405cdf0e10cSrcweir 406cdf0e10cSrcweir // Retrieve the menu entry property values from a sequence 407cdf0e10cSrcweir void AddonMenuManager::GetMenuEntry( const Sequence< PropertyValue >& rAddonMenuEntry, 408cdf0e10cSrcweir ::rtl::OUString& rTitle, 409cdf0e10cSrcweir ::rtl::OUString& rURL, 410cdf0e10cSrcweir ::rtl::OUString& rTarget, 411cdf0e10cSrcweir ::rtl::OUString& rImageId, 412cdf0e10cSrcweir ::rtl::OUString& rContext, 413cdf0e10cSrcweir Sequence< Sequence< PropertyValue > >& rAddonSubMenu ) 414cdf0e10cSrcweir { 415cdf0e10cSrcweir // Reset submenu parameter 416cdf0e10cSrcweir rAddonSubMenu = Sequence< Sequence< PropertyValue > >(); 417cdf0e10cSrcweir 418cdf0e10cSrcweir for ( int i = 0; i < rAddonMenuEntry.getLength(); i++ ) 419cdf0e10cSrcweir { 420cdf0e10cSrcweir ::rtl::OUString aMenuEntryPropName = rAddonMenuEntry[i].Name; 421cdf0e10cSrcweir if ( aMenuEntryPropName == ADDONSMENUITEM_PROPERTYNAME_URL ) 422cdf0e10cSrcweir rAddonMenuEntry[i].Value >>= rURL; 423cdf0e10cSrcweir else if ( aMenuEntryPropName == ADDONSMENUITEM_PROPERTYNAME_TITLE ) 424cdf0e10cSrcweir rAddonMenuEntry[i].Value >>= rTitle; 425cdf0e10cSrcweir else if ( aMenuEntryPropName == ADDONSMENUITEM_PROPERTYNAME_TARGET ) 426cdf0e10cSrcweir rAddonMenuEntry[i].Value >>= rTarget; 427cdf0e10cSrcweir else if ( aMenuEntryPropName == ADDONSMENUITEM_PROPERTYNAME_IMAGEIDENTIFIER ) 428cdf0e10cSrcweir rAddonMenuEntry[i].Value >>= rImageId; 429cdf0e10cSrcweir else if ( aMenuEntryPropName == ADDONSMENUITEM_PROPERTYNAME_SUBMENU ) 430cdf0e10cSrcweir rAddonMenuEntry[i].Value >>= rAddonSubMenu; 431cdf0e10cSrcweir else if ( aMenuEntryPropName == ADDONSMENUITEM_PROPERTYNAME_CONTEXT ) 432cdf0e10cSrcweir rAddonMenuEntry[i].Value >>= rContext; 433cdf0e10cSrcweir } 434cdf0e10cSrcweir } 435cdf0e10cSrcweir 436cdf0e10cSrcweir // Check if the context string matches the provided xModel context 437*39ca3745STsutomu Uchino sal_Bool AddonMenuManager::IsCorrectContext( const ::rtl::OUString& rModuleIdentifier, const ::rtl::OUString& aContext ) 438cdf0e10cSrcweir { 439*39ca3745STsutomu Uchino if ( aContext.isEmpty() ) 440cdf0e10cSrcweir return sal_True; 441*39ca3745STsutomu Uchino 442*39ca3745STsutomu Uchino if ( !rModuleIdentifier.isEmpty() ) 443*39ca3745STsutomu Uchino { 444*39ca3745STsutomu Uchino sal_Int32 nIndex = aContext.indexOf( rModuleIdentifier ); 445*39ca3745STsutomu Uchino return ( nIndex >= 0 ); 446cdf0e10cSrcweir } 447cdf0e10cSrcweir 448*39ca3745STsutomu Uchino return sal_False; 449cdf0e10cSrcweir } 450cdf0e10cSrcweir 451cdf0e10cSrcweir } 452cdf0e10cSrcweir 453