1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_framework.hxx" 26 27 //_________________________________________________________________________________________________________________ 28 // my own includes 29 //_________________________________________________________________________________________________________________ 30 31 #include <limits.h> 32 33 #include "framework/bmkmenu.hxx" 34 #include <general.h> 35 #include <macros/debug/assertion.hxx> 36 #include <framework/imageproducer.hxx> 37 #include <framework/menuconfiguration.hxx> 38 39 //_________________________________________________________________________________________________________________ 40 // interface includes 41 //_________________________________________________________________________________________________________________ 42 #include <com/sun/star/uno/Reference.h> 43 #include <com/sun/star/util/URL.hpp> 44 #include <com/sun/star/beans/PropertyValue.hpp> 45 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX 46 #include <comphelper/processfactory.hxx> 47 #endif 48 #include <com/sun/star/util/XURLTransformer.hpp> 49 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 50 #include <com/sun/star/util/DateTime.hpp> 51 52 //_________________________________________________________________________________________________________________ 53 // includes of other projects 54 //_________________________________________________________________________________________________________________ 55 #include <tools/config.hxx> 56 #include <vcl/svapp.hxx> 57 #include <unotools/dynamicmenuoptions.hxx> 58 #include <svtools/menuoptions.hxx> 59 #include <rtl/logfile.hxx> 60 61 //_________________________________________________________________________________________________________________ 62 // namespace 63 //_________________________________________________________________________________________________________________ 64 65 using namespace ::comphelper; 66 using namespace ::com::sun::star::uno; 67 using namespace ::com::sun::star::lang; 68 using namespace ::com::sun::star::util; 69 using namespace ::com::sun::star::frame; 70 using namespace ::com::sun::star::beans; 71 72 namespace framework 73 { 74 75 void GetMenuEntry( 76 Sequence< PropertyValue >& aDynamicMenuEntry, 77 ::rtl::OUString& rTitle, 78 ::rtl::OUString& rURL, 79 ::rtl::OUString& rFrame, 80 ::rtl::OUString& rImageId ); 81 82 class BmkMenu_Impl 83 { 84 private: 85 static sal_uInt16 m_nMID; 86 87 public: 88 BmkMenu* m_pRoot; 89 sal_Bool m_bInitialized; 90 91 BmkMenu_Impl( BmkMenu* pRoot ); 92 BmkMenu_Impl(); 93 ~BmkMenu_Impl(); 94 95 static sal_uInt16 GetMID(); 96 }; 97 98 sal_uInt16 BmkMenu_Impl::m_nMID = BMKMENU_ITEMID_START; 99 100 BmkMenu_Impl::BmkMenu_Impl( BmkMenu* pRoot ) : 101 m_pRoot(pRoot), 102 m_bInitialized(sal_False) 103 { 104 } 105 106 BmkMenu_Impl::BmkMenu_Impl() : 107 m_pRoot(0), 108 m_bInitialized(sal_False) 109 { 110 } 111 112 BmkMenu_Impl::~BmkMenu_Impl() 113 { 114 } 115 116 sal_uInt16 BmkMenu_Impl::GetMID() 117 { 118 m_nMID++; 119 if( !m_nMID ) 120 m_nMID = BMKMENU_ITEMID_START; 121 return m_nMID; 122 } 123 124 // ------------------------------------------------------------------------ 125 126 BmkMenu::BmkMenu( com::sun::star::uno::Reference< XFrame >& xFrame, BmkMenu::BmkMenuType nType, BmkMenu* pRoot ) 127 :AddonMenu(xFrame) 128 ,m_nType( nType ) 129 { 130 _pImp = new BmkMenu_Impl( pRoot ); 131 Initialize(); 132 } 133 134 BmkMenu::BmkMenu( Reference< XFrame >& xFrame, BmkMenu::BmkMenuType nType ) 135 :AddonMenu(xFrame) 136 ,m_nType( nType ) 137 { 138 _pImp = new BmkMenu_Impl(); 139 Initialize(); 140 } 141 142 BmkMenu::~BmkMenu() 143 { 144 delete _pImp; 145 } 146 147 void BmkMenu::Initialize() 148 { 149 RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::BmkMenu::Initialize" ); 150 151 if( _pImp->m_bInitialized ) 152 return; 153 154 _pImp->m_bInitialized = sal_True; 155 156 Sequence< Sequence< PropertyValue > > aDynamicMenuEntries; 157 158 if ( m_nType == BmkMenu::BMK_NEWMENU ) 159 aDynamicMenuEntries = SvtDynamicMenuOptions().GetMenu( E_NEWMENU ); 160 else if ( m_nType == BmkMenu::BMK_WIZARDMENU ) 161 aDynamicMenuEntries = SvtDynamicMenuOptions().GetMenu( E_WIZARDMENU ); 162 163 const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings(); 164 sal_Bool bShowMenuImages = rSettings.GetUseImagesInMenus(); 165 166 ::rtl::OUString aTitle; 167 ::rtl::OUString aURL; 168 ::rtl::OUString aTargetFrame; 169 ::rtl::OUString aImageId; 170 171 sal_Bool bIsHiContrastMode = rSettings.GetHighContrastMode(); 172 173 sal_uInt32 i, nCount = aDynamicMenuEntries.getLength(); 174 for ( i = 0; i < nCount; ++i ) 175 { 176 GetMenuEntry( aDynamicMenuEntries[i], aTitle, aURL, aTargetFrame, aImageId ); 177 178 if ( !aTitle.getLength() && !aURL.getLength() ) 179 continue; 180 181 if ( aURL == ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:separator" ))) 182 InsertSeparator(); 183 else 184 { 185 sal_Bool bImageSet = sal_False; 186 sal_uInt16 nId = CreateMenuId(); 187 188 if ( bShowMenuImages ) 189 { 190 if ( aImageId.getLength() > 0 ) 191 { 192 Image aImage = GetImageFromURL( m_xFrame, aImageId, sal_False, bIsHiContrastMode ); 193 if ( !!aImage ) 194 { 195 bImageSet = sal_True; 196 InsertItem( nId, aTitle, aImage ); 197 } 198 } 199 200 if ( !bImageSet ) 201 { 202 Image aImage = GetImageFromURL( m_xFrame, aURL, sal_False, bIsHiContrastMode ); 203 if ( !aImage ) 204 InsertItem( nId, aTitle ); 205 else 206 InsertItem( nId, aTitle, aImage ); 207 } 208 } 209 else 210 InsertItem( nId, aTitle ); 211 212 // Store values from configuration to the New and Wizard menu entries to enable 213 // sfx2 based code to support high contrast mode correctly! 214 MenuConfiguration::Attributes* pUserAttributes = new MenuConfiguration::Attributes( aTargetFrame, aImageId ); 215 SetUserValue( nId, (sal_uIntPtr)pUserAttributes ); 216 217 SetItemCommand( nId, aURL ); 218 } 219 } 220 } 221 222 sal_uInt16 BmkMenu::CreateMenuId() 223 { 224 return BmkMenu_Impl::GetMID(); 225 } 226 227 void GetMenuEntry 228 ( 229 Sequence< PropertyValue >& aDynamicMenuEntry, 230 ::rtl::OUString& rTitle, 231 ::rtl::OUString& rURL, 232 ::rtl::OUString& rFrame, 233 ::rtl::OUString& rImageId 234 ) 235 { 236 for ( int i = 0; i < aDynamicMenuEntry.getLength(); i++ ) 237 { 238 if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_URL ) 239 aDynamicMenuEntry[i].Value >>= rURL; 240 else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_TITLE ) 241 aDynamicMenuEntry[i].Value >>= rTitle; 242 else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_IMAGEIDENTIFIER ) 243 aDynamicMenuEntry[i].Value >>= rImageId; 244 else if ( aDynamicMenuEntry[i].Name == DYNAMICMENU_PROPERTYNAME_TARGETNAME ) 245 aDynamicMenuEntry[i].Value >>= rFrame; 246 } 247 } 248 249 } 250 251