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
BmkMenu_Impl(BmkMenu * pRoot)100 BmkMenu_Impl::BmkMenu_Impl( BmkMenu* pRoot ) :
101 m_pRoot(pRoot),
102 m_bInitialized(sal_False)
103 {
104 }
105
BmkMenu_Impl()106 BmkMenu_Impl::BmkMenu_Impl() :
107 m_pRoot(0),
108 m_bInitialized(sal_False)
109 {
110 }
111
~BmkMenu_Impl()112 BmkMenu_Impl::~BmkMenu_Impl()
113 {
114 }
115
GetMID()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
BmkMenu(com::sun::star::uno::Reference<XFrame> & xFrame,BmkMenu::BmkMenuType nType,BmkMenu * pRoot)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
BmkMenu(Reference<XFrame> & xFrame,BmkMenu::BmkMenuType nType)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
~BmkMenu()142 BmkMenu::~BmkMenu()
143 {
144 delete _pImp;
145 }
146
Initialize()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
CreateMenuId()222 sal_uInt16 BmkMenu::CreateMenuId()
223 {
224 return BmkMenu_Impl::GetMID();
225 }
226
GetMenuEntry(Sequence<PropertyValue> & aDynamicMenuEntry,::rtl::OUString & rTitle,::rtl::OUString & rURL,::rtl::OUString & rFrame,::rtl::OUString & rImageId)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