xref: /AOO41X/main/toolkit/source/awt/vclxmenu.cxx (revision d3e0dd8eb215533c15e891ee35bd141abe9397ee)
1b0724fc6SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3b0724fc6SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4b0724fc6SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5b0724fc6SAndrew Rist  * distributed with this work for additional information
6b0724fc6SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7b0724fc6SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8b0724fc6SAndrew Rist  * "License"); you may not use this file except in compliance
9b0724fc6SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11b0724fc6SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13b0724fc6SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14b0724fc6SAndrew Rist  * software distributed under the License is distributed on an
15b0724fc6SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b0724fc6SAndrew Rist  * KIND, either express or implied.  See the License for the
17b0724fc6SAndrew Rist  * specific language governing permissions and limitations
18b0724fc6SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20b0724fc6SAndrew Rist  *************************************************************/
21b0724fc6SAndrew Rist 
22b0724fc6SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_toolkit.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <toolkit/awt/vclxmenu.hxx>
28d026be40SAriel Constenla-Haile #include <toolkit/helper/convert.hxx>
29cdf0e10cSrcweir #include <toolkit/helper/macros.hxx>
30cdf0e10cSrcweir #include <toolkit/helper/servicenames.hxx>
31cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
32d026be40SAriel Constenla-Haile 
33cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx>
34cdf0e10cSrcweir #include <rtl/memory.h>
35d026be40SAriel Constenla-Haile #include <rtl/ustrbuf.hxx>
36cdf0e10cSrcweir #include <rtl/uuid.h>
37cdf0e10cSrcweir #include <vcl/image.hxx>
38d026be40SAriel Constenla-Haile #include <vcl/keycod.hxx>
39d026be40SAriel Constenla-Haile #include <vcl/menu.hxx>
40cdf0e10cSrcweir #include <vcl/mnemonic.hxx>
41cdf0e10cSrcweir #include <vcl/svapp.hxx>
42d026be40SAriel Constenla-Haile #include <vos/mutex.hxx>
43cdf0e10cSrcweir 
44cdf0e10cSrcweir #include <com/sun/star/awt/KeyModifier.hpp>
45cdf0e10cSrcweir 
46d026be40SAriel Constenla-Haile using rtl::OUString;
47d026be40SAriel Constenla-Haile using rtl::OUStringBuffer;
48cdf0e10cSrcweir 
49cdf0e10cSrcweir 
DBG_NAME(VCLXMenu)50cdf0e10cSrcweir DBG_NAME(VCLXMenu)
51cdf0e10cSrcweir 
52d026be40SAriel Constenla-Haile VCLXMenu::VCLXMenu()
53d026be40SAriel Constenla-Haile     : maMenuListeners( *this )
54cdf0e10cSrcweir {
55cdf0e10cSrcweir     DBG_CTOR( VCLXMenu, 0 );
56cdf0e10cSrcweir     mpMenu = NULL;
57cdf0e10cSrcweir }
58cdf0e10cSrcweir 
VCLXMenu(Menu * pMenu)59d026be40SAriel Constenla-Haile VCLXMenu::VCLXMenu( Menu* pMenu )
60d026be40SAriel Constenla-Haile     : maMenuListeners( *this )
61cdf0e10cSrcweir {
62cdf0e10cSrcweir     DBG_CTOR( VCLXMenu, 0 );
63cdf0e10cSrcweir     mpMenu = pMenu;
64cdf0e10cSrcweir }
65cdf0e10cSrcweir 
~VCLXMenu()66cdf0e10cSrcweir VCLXMenu::~VCLXMenu()
67cdf0e10cSrcweir {
68cdf0e10cSrcweir     DBG_DTOR( VCLXMenu, 0 );
69cdf0e10cSrcweir     for ( sal_uInt32 n = maPopupMenueRefs.Count(); n; )
70cdf0e10cSrcweir     {
71d026be40SAriel Constenla-Haile         css::uno::Reference< css::awt::XPopupMenu > * pRef = maPopupMenueRefs.GetObject( --n );
72cdf0e10cSrcweir         delete pRef;
73cdf0e10cSrcweir     }
74cdf0e10cSrcweir     if ( mpMenu )
75cdf0e10cSrcweir     {
76cdf0e10cSrcweir         mpMenu->RemoveEventListener( LINK( this, VCLXMenu, MenuEventListener ) );
77cdf0e10cSrcweir         delete mpMenu;
78cdf0e10cSrcweir     }
79cdf0e10cSrcweir }
80cdf0e10cSrcweir 
IsPopupMenu() const81cdf0e10cSrcweir sal_Bool VCLXMenu::IsPopupMenu() const
82cdf0e10cSrcweir {
83cdf0e10cSrcweir     return (mpMenu && ! mpMenu->IsMenuBar());
84cdf0e10cSrcweir }
85cdf0e10cSrcweir 
ImplCreateMenu(sal_Bool bPopup)86cdf0e10cSrcweir void VCLXMenu::ImplCreateMenu( sal_Bool bPopup )
87cdf0e10cSrcweir {
88cdf0e10cSrcweir     DBG_ASSERT( !mpMenu, "CreateMenu: Menu exists!" );
89cdf0e10cSrcweir 
90cdf0e10cSrcweir     if ( bPopup )
91cdf0e10cSrcweir         mpMenu = new PopupMenu;
92cdf0e10cSrcweir     else
93cdf0e10cSrcweir         mpMenu = new MenuBar;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir     mpMenu->AddEventListener( LINK( this, VCLXMenu, MenuEventListener ) );
96cdf0e10cSrcweir }
97cdf0e10cSrcweir 
IMPL_LINK(VCLXMenu,MenuEventListener,VclSimpleEvent *,pEvent)98cdf0e10cSrcweir IMPL_LINK( VCLXMenu, MenuEventListener, VclSimpleEvent*, pEvent )
99cdf0e10cSrcweir {
100cdf0e10cSrcweir     DBG_ASSERT( pEvent && pEvent->ISA( VclMenuEvent ), "Unknown Event!" );
101cdf0e10cSrcweir     if ( pEvent && pEvent->ISA( VclMenuEvent ) )
102cdf0e10cSrcweir     {
103cdf0e10cSrcweir         DBG_ASSERT( ((VclMenuEvent*)pEvent)->GetMenu() && mpMenu, "Menu???" );
104cdf0e10cSrcweir 
105cdf0e10cSrcweir         VclMenuEvent* pMenuEvent = (VclMenuEvent*)pEvent;
106cdf0e10cSrcweir         if ( pMenuEvent->GetMenu() == mpMenu )  // Also called for the root menu
107cdf0e10cSrcweir         {
108cdf0e10cSrcweir             switch ( pMenuEvent->GetId() )
109cdf0e10cSrcweir             {
110cdf0e10cSrcweir                 case VCLEVENT_MENU_SELECT:
111cdf0e10cSrcweir                 {
112cdf0e10cSrcweir                     if ( maMenuListeners.getLength() )
113cdf0e10cSrcweir                     {
114d026be40SAriel Constenla-Haile                         css::awt::MenuEvent aEvent;
115cdf0e10cSrcweir                         aEvent.Source = (::cppu::OWeakObject*)this;
116cdf0e10cSrcweir                         aEvent.MenuId = mpMenu->GetCurItemId();
117d026be40SAriel Constenla-Haile                         maMenuListeners.itemSelected( aEvent );
118cdf0e10cSrcweir                     }
119cdf0e10cSrcweir                 }
120cdf0e10cSrcweir                 break;
121cdf0e10cSrcweir                 case VCLEVENT_OBJECT_DYING:
122cdf0e10cSrcweir                 {
123cdf0e10cSrcweir                     mpMenu = NULL;
124cdf0e10cSrcweir                 }
125cdf0e10cSrcweir                 break;
126cdf0e10cSrcweir                 case VCLEVENT_MENU_HIGHLIGHT:
127cdf0e10cSrcweir                 {
128cdf0e10cSrcweir                     if ( maMenuListeners.getLength() )
129cdf0e10cSrcweir                     {
130d026be40SAriel Constenla-Haile                         css::awt::MenuEvent aEvent;
131cdf0e10cSrcweir                         aEvent.Source = (::cppu::OWeakObject*)this;
132cdf0e10cSrcweir                         aEvent.MenuId = mpMenu->GetCurItemId();
133d026be40SAriel Constenla-Haile                         maMenuListeners.itemHighlighted( aEvent );
134cdf0e10cSrcweir                     }
135cdf0e10cSrcweir                 }
136cdf0e10cSrcweir                 break;
137cdf0e10cSrcweir                 case VCLEVENT_MENU_ACTIVATE:
138cdf0e10cSrcweir                 {
139cdf0e10cSrcweir                     if ( maMenuListeners.getLength() )
140cdf0e10cSrcweir                     {
141d026be40SAriel Constenla-Haile                         css::awt::MenuEvent aEvent;
142cdf0e10cSrcweir                         aEvent.Source = (::cppu::OWeakObject*)this;
143cdf0e10cSrcweir                         aEvent.MenuId = mpMenu->GetCurItemId();
144d026be40SAriel Constenla-Haile                         maMenuListeners.itemActivated( aEvent );
145cdf0e10cSrcweir                     }
146cdf0e10cSrcweir                 }
147cdf0e10cSrcweir                 break;
148cdf0e10cSrcweir                 case VCLEVENT_MENU_DEACTIVATE:
149cdf0e10cSrcweir                 {
150cdf0e10cSrcweir                     if ( maMenuListeners.getLength() )
151cdf0e10cSrcweir                     {
152d026be40SAriel Constenla-Haile                         css::awt::MenuEvent aEvent;
153cdf0e10cSrcweir                         aEvent.Source = (::cppu::OWeakObject*)this;
154cdf0e10cSrcweir                         aEvent.MenuId = mpMenu->GetCurItemId();
155d026be40SAriel Constenla-Haile                         maMenuListeners.itemDeactivated( aEvent );
156cdf0e10cSrcweir                     }
157cdf0e10cSrcweir                 }
158cdf0e10cSrcweir                 break;
159cdf0e10cSrcweir 
160cdf0e10cSrcweir                 // ignore accessibility events
161cdf0e10cSrcweir                 case VCLEVENT_MENU_ENABLE:
162cdf0e10cSrcweir                 case VCLEVENT_MENU_INSERTITEM:
163cdf0e10cSrcweir                 case VCLEVENT_MENU_REMOVEITEM:
164cdf0e10cSrcweir                 case VCLEVENT_MENU_SUBMENUACTIVATE:
165cdf0e10cSrcweir                 case VCLEVENT_MENU_SUBMENUDEACTIVATE:
166cdf0e10cSrcweir                 case VCLEVENT_MENU_SUBMENUCHANGED:
167cdf0e10cSrcweir                 case VCLEVENT_MENU_DEHIGHLIGHT:
168cdf0e10cSrcweir                 case VCLEVENT_MENU_DISABLE:
169cdf0e10cSrcweir                 case VCLEVENT_MENU_ITEMTEXTCHANGED:
170cdf0e10cSrcweir                 case VCLEVENT_MENU_ITEMCHECKED:
171cdf0e10cSrcweir                 case VCLEVENT_MENU_ITEMUNCHECKED:
172cdf0e10cSrcweir                 case VCLEVENT_MENU_SHOW:
173cdf0e10cSrcweir                 case VCLEVENT_MENU_HIDE:
174cdf0e10cSrcweir                 break;
175cdf0e10cSrcweir 
176cdf0e10cSrcweir                 default:    DBG_ERROR( "MenuEventListener - Unknown event!" );
177cdf0e10cSrcweir            }
178cdf0e10cSrcweir        }
179cdf0e10cSrcweir     }
180cdf0e10cSrcweir     return 0;
181cdf0e10cSrcweir }
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 
getImplementationName()184d026be40SAriel Constenla-Haile OUString SAL_CALL VCLXMenu::getImplementationName(  )
185d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
186cdf0e10cSrcweir {
187cdf0e10cSrcweir     ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
188cdf0e10cSrcweir     const sal_Bool bIsPopupMenu = IsPopupMenu();
189cdf0e10cSrcweir     aGuard.clear();
190cdf0e10cSrcweir 
191d026be40SAriel Constenla-Haile     OUStringBuffer implName;
192d026be40SAriel Constenla-Haile     implName.appendAscii( RTL_CONSTASCII_STRINGPARAM( "stardiv.Toolkit." ) );
193cdf0e10cSrcweir     if ( bIsPopupMenu )
194d026be40SAriel Constenla-Haile         implName.appendAscii( RTL_CONSTASCII_STRINGPARAM( "VCLXPopupMenu" ) );
195cdf0e10cSrcweir     else
196d026be40SAriel Constenla-Haile         implName.appendAscii( RTL_CONSTASCII_STRINGPARAM( "VCLXMenuBar" ) );
197cdf0e10cSrcweir 
198d026be40SAriel Constenla-Haile     return implName.makeStringAndClear();
199cdf0e10cSrcweir }
200cdf0e10cSrcweir 
201cdf0e10cSrcweir 
getSupportedServiceNames()202d026be40SAriel Constenla-Haile css::uno::Sequence< OUString > SAL_CALL VCLXMenu::getSupportedServiceNames(  )
203d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
204cdf0e10cSrcweir {
205cdf0e10cSrcweir     ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
206cdf0e10cSrcweir     const sal_Bool bIsPopupMenu = IsPopupMenu();
207cdf0e10cSrcweir     aGuard.clear();
208cdf0e10cSrcweir 
209d026be40SAriel Constenla-Haile     css::uno::Sequence< OUString > aNames( 1 );
210cdf0e10cSrcweir     if ( bIsPopupMenu )
211d026be40SAriel Constenla-Haile         aNames[ 0 ] = OUString::createFromAscii( szServiceName2_PopupMenu );
212cdf0e10cSrcweir     else
213d026be40SAriel Constenla-Haile         aNames[ 0 ] = OUString::createFromAscii( szServiceName2_MenuBar );
214cdf0e10cSrcweir 
215cdf0e10cSrcweir     return aNames;
216cdf0e10cSrcweir }
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 
supportsService(const OUString & rServiceName)219d026be40SAriel Constenla-Haile ::sal_Bool SAL_CALL VCLXMenu::supportsService(
220d026be40SAriel Constenla-Haile     const OUString& rServiceName )
221d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
222cdf0e10cSrcweir {
223d026be40SAriel Constenla-Haile     css::uno::Sequence< OUString > aServiceNames( getSupportedServiceNames() );
224cdf0e10cSrcweir 
225cdf0e10cSrcweir     if ( aServiceNames[ 0 ] == rServiceName )
226cdf0e10cSrcweir         return sal_True;
227cdf0e10cSrcweir 
228cdf0e10cSrcweir     return sal_False;
229cdf0e10cSrcweir }
230cdf0e10cSrcweir 
231cdf0e10cSrcweir 
queryInterface(const css::uno::Type & rType)232d026be40SAriel Constenla-Haile css::uno::Any VCLXMenu::queryInterface(
233d026be40SAriel Constenla-Haile     const css::uno::Type & rType )
234d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
235cdf0e10cSrcweir {
236cdf0e10cSrcweir     ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
237cdf0e10cSrcweir     const sal_Bool bIsPopupMenu = IsPopupMenu();
238cdf0e10cSrcweir     aGuard.clear();
239cdf0e10cSrcweir 
240d026be40SAriel Constenla-Haile     css::uno::Any aRet;
241cdf0e10cSrcweir 
242cdf0e10cSrcweir     if ( bIsPopupMenu )
243cdf0e10cSrcweir         aRet = ::cppu::queryInterface(  rType,
244d026be40SAriel Constenla-Haile                                         SAL_STATIC_CAST( css::awt::XMenu*, (css::awt::XPopupMenu*) this ),
245d026be40SAriel Constenla-Haile                                         SAL_STATIC_CAST( css::awt::XPopupMenu*, this ),
246d026be40SAriel Constenla-Haile                                         SAL_STATIC_CAST( css::lang::XTypeProvider*, this ),
247d026be40SAriel Constenla-Haile                                         SAL_STATIC_CAST( css::lang::XServiceInfo*, this ),
248d026be40SAriel Constenla-Haile                                         SAL_STATIC_CAST( css::lang::XUnoTunnel*, this ) );
249cdf0e10cSrcweir     else
250cdf0e10cSrcweir         aRet = ::cppu::queryInterface(  rType,
251d026be40SAriel Constenla-Haile                                         SAL_STATIC_CAST( css::awt::XMenu*, (css::awt::XMenuBar*) this ),
252d026be40SAriel Constenla-Haile                                         SAL_STATIC_CAST( css::awt::XMenuBar*, this ),
253d026be40SAriel Constenla-Haile                                         SAL_STATIC_CAST( css::lang::XTypeProvider*, this ),
254d026be40SAriel Constenla-Haile                                         SAL_STATIC_CAST( css::lang::XServiceInfo*, this ),
255d026be40SAriel Constenla-Haile                                         SAL_STATIC_CAST( css::lang::XUnoTunnel*, this ) );
256cdf0e10cSrcweir 
257cdf0e10cSrcweir     return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ));
258cdf0e10cSrcweir }
259cdf0e10cSrcweir 
260d026be40SAriel Constenla-Haile 
IMPL_XUNOTUNNEL(VCLXMenu)261cdf0e10cSrcweir IMPL_XUNOTUNNEL( VCLXMenu )
262cdf0e10cSrcweir 
263d026be40SAriel Constenla-Haile 
264d026be40SAriel Constenla-Haile css::uno::Sequence< css::uno::Type > VCLXMenu::getTypes()
265d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
266cdf0e10cSrcweir {
267cdf0e10cSrcweir     ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
268cdf0e10cSrcweir     const sal_Bool bIsPopupMenu = IsPopupMenu();
269cdf0e10cSrcweir     aGuard.clear();
270cdf0e10cSrcweir 
271cdf0e10cSrcweir     static ::cppu::OTypeCollection* pCollectionMenuBar = NULL;
272cdf0e10cSrcweir     static ::cppu::OTypeCollection* pCollectionPopupMenu = NULL;
273cdf0e10cSrcweir 
274cdf0e10cSrcweir     if ( bIsPopupMenu )
275cdf0e10cSrcweir     {
276cdf0e10cSrcweir         if( !pCollectionPopupMenu )
277cdf0e10cSrcweir         {
278cdf0e10cSrcweir             ::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() );
279cdf0e10cSrcweir             if( !pCollectionPopupMenu )
280cdf0e10cSrcweir             {
281cdf0e10cSrcweir                 static ::cppu::OTypeCollection collectionPopupMenu(
282d026be40SAriel Constenla-Haile                 getCppuType( ( css::uno::Reference< css::lang::XTypeProvider>* ) NULL ),
283d026be40SAriel Constenla-Haile                 getCppuType( ( css::uno::Reference< css::awt::XMenu>* ) NULL ),
284d026be40SAriel Constenla-Haile                 getCppuType( ( css::uno::Reference< css::awt::XPopupMenu>* ) NULL ),
285d026be40SAriel Constenla-Haile                 getCppuType( ( css::uno::Reference< css::lang::XServiceInfo>* ) NULL ) );
286cdf0e10cSrcweir                 pCollectionPopupMenu = &collectionPopupMenu;
287cdf0e10cSrcweir             }
288cdf0e10cSrcweir         }
289cdf0e10cSrcweir 
290cdf0e10cSrcweir         return (*pCollectionPopupMenu).getTypes();
291cdf0e10cSrcweir     }
292cdf0e10cSrcweir     else
293cdf0e10cSrcweir     {
294cdf0e10cSrcweir         if( !pCollectionMenuBar )
295cdf0e10cSrcweir         {
296cdf0e10cSrcweir             ::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() );
297cdf0e10cSrcweir             if( !pCollectionMenuBar )
298cdf0e10cSrcweir             {
299cdf0e10cSrcweir                 static ::cppu::OTypeCollection collectionMenuBar(
300d026be40SAriel Constenla-Haile                 getCppuType( ( css::uno::Reference< css::lang::XTypeProvider>* ) NULL ),
301d026be40SAriel Constenla-Haile                 getCppuType( ( css::uno::Reference< css::awt::XMenu>* ) NULL ),
302d026be40SAriel Constenla-Haile                 getCppuType( ( css::uno::Reference< css::awt::XMenuBar>* ) NULL ),
303d026be40SAriel Constenla-Haile                 getCppuType( ( css::uno::Reference< css::lang::XServiceInfo>* ) NULL ) );
304cdf0e10cSrcweir                 pCollectionMenuBar = &collectionMenuBar;
305cdf0e10cSrcweir             }
306cdf0e10cSrcweir         }
307cdf0e10cSrcweir         return (*pCollectionMenuBar).getTypes();
308cdf0e10cSrcweir     }
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir 
getImplementationId()312d026be40SAriel Constenla-Haile css::uno::Sequence< sal_Int8 > VCLXMenu::getImplementationId()
313d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
314cdf0e10cSrcweir {
315cdf0e10cSrcweir     ::osl::ResettableGuard < ::osl::Mutex > aGuard( GetMutex() );
316cdf0e10cSrcweir     const sal_Bool bIsPopupMenu = IsPopupMenu();
317cdf0e10cSrcweir     aGuard.clear();
318cdf0e10cSrcweir 
319cdf0e10cSrcweir     static ::cppu::OImplementationId* pIdMenuBar = NULL;
320cdf0e10cSrcweir     static ::cppu::OImplementationId* pIdPopupMenu = NULL;
321cdf0e10cSrcweir 
322cdf0e10cSrcweir     if ( bIsPopupMenu )
323cdf0e10cSrcweir     {
324cdf0e10cSrcweir         if( !pIdPopupMenu )
325cdf0e10cSrcweir         {
326cdf0e10cSrcweir             ::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() );
327cdf0e10cSrcweir             if( !pIdPopupMenu )
328cdf0e10cSrcweir             {
329cdf0e10cSrcweir                 static ::cppu::OImplementationId idPopupMenu( sal_False );
330cdf0e10cSrcweir                 pIdPopupMenu = &idPopupMenu;
331cdf0e10cSrcweir             }
332cdf0e10cSrcweir         }
333cdf0e10cSrcweir 
334cdf0e10cSrcweir         return (*pIdPopupMenu).getImplementationId();
335cdf0e10cSrcweir     }
336cdf0e10cSrcweir     else
337cdf0e10cSrcweir     {
338cdf0e10cSrcweir         if( !pIdMenuBar )
339cdf0e10cSrcweir         {
340cdf0e10cSrcweir             ::osl::Guard< ::osl::Mutex > aGlobalGuard( ::osl::Mutex::getGlobalMutex() );
341cdf0e10cSrcweir             if( !pIdMenuBar )
342cdf0e10cSrcweir             {
343cdf0e10cSrcweir                 static ::cppu::OImplementationId idMenuBar( sal_False );
344cdf0e10cSrcweir                 pIdMenuBar = &idMenuBar;
345cdf0e10cSrcweir             }
346cdf0e10cSrcweir         }
347cdf0e10cSrcweir 
348cdf0e10cSrcweir         return (*pIdMenuBar).getImplementationId();
349cdf0e10cSrcweir     }
350cdf0e10cSrcweir }
351cdf0e10cSrcweir 
addMenuListener(const css::uno::Reference<css::awt::XMenuListener> & rxListener)352d026be40SAriel Constenla-Haile void VCLXMenu::addMenuListener(
353d026be40SAriel Constenla-Haile     const css::uno::Reference< css::awt::XMenuListener >& rxListener )
354d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
355cdf0e10cSrcweir {
356cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
357cdf0e10cSrcweir 
358cdf0e10cSrcweir     maMenuListeners.addInterface( rxListener );
359cdf0e10cSrcweir }
360cdf0e10cSrcweir 
removeMenuListener(const css::uno::Reference<css::awt::XMenuListener> & rxListener)361d026be40SAriel Constenla-Haile void VCLXMenu::removeMenuListener(
362d026be40SAriel Constenla-Haile     const css::uno::Reference< css::awt::XMenuListener >& rxListener )
363d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
364cdf0e10cSrcweir {
365cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
366cdf0e10cSrcweir 
367cdf0e10cSrcweir     maMenuListeners.removeInterface( rxListener );
368cdf0e10cSrcweir }
369cdf0e10cSrcweir 
insertItem(sal_Int16 nItemId,const OUString & aText,sal_Int16 nItemStyle,sal_Int16 nPos)370d026be40SAriel Constenla-Haile void VCLXMenu::insertItem(
371d026be40SAriel Constenla-Haile     sal_Int16 nItemId,
372d026be40SAriel Constenla-Haile     const OUString& aText,
373d026be40SAriel Constenla-Haile     sal_Int16 nItemStyle,
374d026be40SAriel Constenla-Haile     sal_Int16 nPos )
375d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
376cdf0e10cSrcweir {
377cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
378cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
379cdf0e10cSrcweir 
380cdf0e10cSrcweir     if ( mpMenu )
381cdf0e10cSrcweir         mpMenu->InsertItem( nItemId, aText, (MenuItemBits)nItemStyle, nPos );
382cdf0e10cSrcweir }
383cdf0e10cSrcweir 
removeItem(sal_Int16 nPos,sal_Int16 nCount)384d026be40SAriel Constenla-Haile void VCLXMenu::removeItem(
385d026be40SAriel Constenla-Haile     sal_Int16 nPos,
386d026be40SAriel Constenla-Haile     sal_Int16 nCount )
387d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
388cdf0e10cSrcweir {
389cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
390cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
391cdf0e10cSrcweir 
392cdf0e10cSrcweir     sal_Int32 nItemCount = (sal_Int32)mpMenu->GetItemCount();
393cdf0e10cSrcweir     if ( mpMenu && ( nCount > 0 ) && ( nPos >= 0 ) && ( nPos < nItemCount ) && ( nItemCount > 0 ))
394cdf0e10cSrcweir     {
395cdf0e10cSrcweir         sal_Int16 nP = sal::static_int_cast< sal_Int16 >(
396cdf0e10cSrcweir             Min( (int)(nPos+nCount), (int)nItemCount ));
397cdf0e10cSrcweir         while( nP-nPos > 0 )
398cdf0e10cSrcweir             mpMenu->RemoveItem( --nP );
399cdf0e10cSrcweir     }
400cdf0e10cSrcweir }
401cdf0e10cSrcweir 
getItemCount()402d026be40SAriel Constenla-Haile sal_Int16 VCLXMenu::getItemCount(  )
403d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
404cdf0e10cSrcweir {
405cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
406cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
407cdf0e10cSrcweir 
408cdf0e10cSrcweir     return mpMenu ? mpMenu->GetItemCount() : 0;
409cdf0e10cSrcweir }
410cdf0e10cSrcweir 
getItemId(sal_Int16 nPos)411d026be40SAriel Constenla-Haile sal_Int16 VCLXMenu::getItemId(
412d026be40SAriel Constenla-Haile     sal_Int16 nPos )
413d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
414cdf0e10cSrcweir {
415cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
416cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
417cdf0e10cSrcweir 
418cdf0e10cSrcweir     return mpMenu ? mpMenu->GetItemId( nPos ) : 0;
419cdf0e10cSrcweir }
420cdf0e10cSrcweir 
getItemPos(sal_Int16 nId)421d026be40SAriel Constenla-Haile sal_Int16 VCLXMenu::getItemPos(
422d026be40SAriel Constenla-Haile     sal_Int16 nId )
423d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
424cdf0e10cSrcweir {
425cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
426cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
427cdf0e10cSrcweir 
428cdf0e10cSrcweir     return mpMenu ? mpMenu->GetItemPos( nId ) : 0;
429cdf0e10cSrcweir }
430cdf0e10cSrcweir 
enableItem(sal_Int16 nItemId,sal_Bool bEnable)431d026be40SAriel Constenla-Haile void VCLXMenu::enableItem(
432d026be40SAriel Constenla-Haile     sal_Int16 nItemId,
433d026be40SAriel Constenla-Haile     sal_Bool bEnable )
434d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
435cdf0e10cSrcweir {
436cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
437cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
438cdf0e10cSrcweir 
439cdf0e10cSrcweir     if ( mpMenu )
440cdf0e10cSrcweir         mpMenu->EnableItem( nItemId, bEnable );
441cdf0e10cSrcweir }
442cdf0e10cSrcweir 
isItemEnabled(sal_Int16 nItemId)443d026be40SAriel Constenla-Haile sal_Bool VCLXMenu::isItemEnabled(
444d026be40SAriel Constenla-Haile     sal_Int16 nItemId )
445d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
446cdf0e10cSrcweir {
447cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
448cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
449cdf0e10cSrcweir 
450cdf0e10cSrcweir     return mpMenu ? mpMenu->IsItemEnabled( nItemId ) : sal_False;
451cdf0e10cSrcweir }
452cdf0e10cSrcweir 
setItemText(sal_Int16 nItemId,const OUString & aText)453d026be40SAriel Constenla-Haile void VCLXMenu::setItemText(
454d026be40SAriel Constenla-Haile     sal_Int16 nItemId,
455d026be40SAriel Constenla-Haile     const OUString& aText )
456d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
457cdf0e10cSrcweir {
458cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
459cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
460cdf0e10cSrcweir 
461cdf0e10cSrcweir     if ( mpMenu )
462cdf0e10cSrcweir         mpMenu->SetItemText( nItemId, aText );
463cdf0e10cSrcweir }
464cdf0e10cSrcweir 
getItemText(sal_Int16 nItemId)465d026be40SAriel Constenla-Haile OUString VCLXMenu::getItemText(
466d026be40SAriel Constenla-Haile     sal_Int16 nItemId )
467d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
468cdf0e10cSrcweir {
469cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
470cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
471cdf0e10cSrcweir 
472d026be40SAriel Constenla-Haile     OUString aItemText;
473cdf0e10cSrcweir     if ( mpMenu )
474cdf0e10cSrcweir         aItemText = mpMenu->GetItemText( nItemId );
475cdf0e10cSrcweir     return aItemText;
476cdf0e10cSrcweir }
477cdf0e10cSrcweir 
setPopupMenu(sal_Int16 nItemId,const css::uno::Reference<css::awt::XPopupMenu> & rxPopupMenu)478d026be40SAriel Constenla-Haile void VCLXMenu::setPopupMenu(
479d026be40SAriel Constenla-Haile     sal_Int16 nItemId,
480d026be40SAriel Constenla-Haile     const css::uno::Reference< css::awt::XPopupMenu >& rxPopupMenu )
481d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
482cdf0e10cSrcweir {
483cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
484cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
485cdf0e10cSrcweir 
486cdf0e10cSrcweir     VCLXMenu* pVCLMenu = VCLXMenu::GetImplementation( rxPopupMenu );
487cdf0e10cSrcweir     DBG_ASSERT( pVCLMenu && pVCLMenu->GetMenu() && pVCLMenu->IsPopupMenu(), "setPopupMenu: Invalid Menu!" );
488cdf0e10cSrcweir 
489cdf0e10cSrcweir     if ( mpMenu && pVCLMenu && pVCLMenu->GetMenu() && pVCLMenu->IsPopupMenu() )
490cdf0e10cSrcweir     {
491cdf0e10cSrcweir         // Selbst eine Ref halten!
492d026be40SAriel Constenla-Haile         css::uno::Reference< css::awt::XPopupMenu > * pNewRef = new css::uno::Reference< css::awt::XPopupMenu > ;
493cdf0e10cSrcweir         *pNewRef = rxPopupMenu;
494cdf0e10cSrcweir         maPopupMenueRefs.Insert( pNewRef, LIST_APPEND );
495cdf0e10cSrcweir 
496cdf0e10cSrcweir         mpMenu->SetPopupMenu( nItemId, (PopupMenu*) pVCLMenu->GetMenu() );
497cdf0e10cSrcweir     }
498cdf0e10cSrcweir }
499cdf0e10cSrcweir 
getPopupMenu(sal_Int16 nItemId)500d026be40SAriel Constenla-Haile css::uno::Reference< css::awt::XPopupMenu > VCLXMenu::getPopupMenu(
501d026be40SAriel Constenla-Haile     sal_Int16 nItemId )
502d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
503cdf0e10cSrcweir {
504cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
505cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
506cdf0e10cSrcweir 
507d026be40SAriel Constenla-Haile     css::uno::Reference< css::awt::XPopupMenu >  aRef;
508cdf0e10cSrcweir     Menu* pMenu = mpMenu ? mpMenu->GetPopupMenu( nItemId ) : NULL;
509cdf0e10cSrcweir     if ( pMenu )
510cdf0e10cSrcweir     {
511cdf0e10cSrcweir         for ( sal_uInt32 n = maPopupMenueRefs.Count(); n; )
512cdf0e10cSrcweir         {
513d026be40SAriel Constenla-Haile             css::uno::Reference< css::awt::XPopupMenu > * pRef = maPopupMenueRefs.GetObject( --n );
514cdf0e10cSrcweir             Menu* pM = ((VCLXMenu*)pRef->get())->GetMenu();
515cdf0e10cSrcweir             if ( pM == pMenu )
516cdf0e10cSrcweir             {
517cdf0e10cSrcweir                 aRef = *pRef;
518cdf0e10cSrcweir                 break;
519cdf0e10cSrcweir             }
520cdf0e10cSrcweir         }
521cdf0e10cSrcweir     }
522cdf0e10cSrcweir     return aRef;
523cdf0e10cSrcweir }
524cdf0e10cSrcweir 
525d026be40SAriel Constenla-Haile // css::awt::XPopupMenu
insertSeparator(sal_Int16 nPos)526d026be40SAriel Constenla-Haile void VCLXMenu::insertSeparator(
527d026be40SAriel Constenla-Haile     sal_Int16 nPos )
528d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
529cdf0e10cSrcweir {
530cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
531cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
532cdf0e10cSrcweir 
533cdf0e10cSrcweir     if ( mpMenu )
534cdf0e10cSrcweir         mpMenu->InsertSeparator( nPos );
535cdf0e10cSrcweir }
536cdf0e10cSrcweir 
setDefaultItem(sal_Int16 nItemId)537d026be40SAriel Constenla-Haile void VCLXMenu::setDefaultItem(
538d026be40SAriel Constenla-Haile     sal_Int16 nItemId )
539d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
540cdf0e10cSrcweir {
541cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
542cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
543cdf0e10cSrcweir 
544cdf0e10cSrcweir     if ( mpMenu )
545cdf0e10cSrcweir         mpMenu->SetDefaultItem( nItemId );
546cdf0e10cSrcweir }
547cdf0e10cSrcweir 
getDefaultItem()548d026be40SAriel Constenla-Haile sal_Int16 VCLXMenu::getDefaultItem(  )
549d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
550cdf0e10cSrcweir {
551cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
552cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
553cdf0e10cSrcweir 
554cdf0e10cSrcweir     return mpMenu ? mpMenu->GetDefaultItem() : 0;
555cdf0e10cSrcweir }
556cdf0e10cSrcweir 
checkItem(sal_Int16 nItemId,sal_Bool bCheck)557d026be40SAriel Constenla-Haile void VCLXMenu::checkItem(
558d026be40SAriel Constenla-Haile     sal_Int16 nItemId,
559d026be40SAriel Constenla-Haile     sal_Bool bCheck )
560d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
561cdf0e10cSrcweir {
562cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
563cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
564cdf0e10cSrcweir 
565cdf0e10cSrcweir     if ( mpMenu )
566cdf0e10cSrcweir         mpMenu->CheckItem( nItemId, bCheck );
567cdf0e10cSrcweir }
568cdf0e10cSrcweir 
isItemChecked(sal_Int16 nItemId)569d026be40SAriel Constenla-Haile sal_Bool VCLXMenu::isItemChecked(
570d026be40SAriel Constenla-Haile     sal_Int16 nItemId )
571d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
572cdf0e10cSrcweir {
573cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
574cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
575cdf0e10cSrcweir 
576cdf0e10cSrcweir     return mpMenu ? mpMenu->IsItemChecked( nItemId ) : sal_False;
577cdf0e10cSrcweir }
578cdf0e10cSrcweir 
execute(const css::uno::Reference<css::awt::XWindowPeer> & rxWindowPeer,const css::awt::Rectangle & rPos,sal_Int16 nFlags)579d026be40SAriel Constenla-Haile sal_Int16 VCLXMenu::execute(
580d026be40SAriel Constenla-Haile     const css::uno::Reference< css::awt::XWindowPeer >& rxWindowPeer,
581*31d843d7SAriel Constenla-Haile     const css::awt::Rectangle& rPos,
582d026be40SAriel Constenla-Haile     sal_Int16 nFlags )
583d026be40SAriel Constenla-Haile throw(css::uno::RuntimeException)
584cdf0e10cSrcweir {
585cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
586cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
587cdf0e10cSrcweir 
588cdf0e10cSrcweir     sal_Int16 nRet = 0;
589cdf0e10cSrcweir     if ( mpMenu && IsPopupMenu() )
590d026be40SAriel Constenla-Haile     {
591d026be40SAriel Constenla-Haile         nRet = ((PopupMenu*)mpMenu)->Execute( VCLUnoHelper::GetWindow( rxWindowPeer ),
592*31d843d7SAriel Constenla-Haile                                               VCLRectangle( rPos ),
593d026be40SAriel Constenla-Haile                                               nFlags | POPUPMENU_NOMOUSEUPCLOSE );
594d026be40SAriel Constenla-Haile     }
595cdf0e10cSrcweir     return nRet;
596cdf0e10cSrcweir }
597cdf0e10cSrcweir 
598cdf0e10cSrcweir 
setCommand(sal_Int16 nItemId,const OUString & aCommand)599d026be40SAriel Constenla-Haile void SAL_CALL VCLXMenu::setCommand(
600d026be40SAriel Constenla-Haile     sal_Int16 nItemId,
601d026be40SAriel Constenla-Haile     const OUString& aCommand )
602d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
603cdf0e10cSrcweir {
604cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
605cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
606cdf0e10cSrcweir 
607cdf0e10cSrcweir     if ( mpMenu )
608cdf0e10cSrcweir         mpMenu->SetItemCommand( nItemId, aCommand );
609cdf0e10cSrcweir }
610cdf0e10cSrcweir 
getCommand(sal_Int16 nItemId)611d026be40SAriel Constenla-Haile OUString SAL_CALL VCLXMenu::getCommand(
612d026be40SAriel Constenla-Haile     sal_Int16 nItemId )
613d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
614cdf0e10cSrcweir {
615cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
616cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
617cdf0e10cSrcweir 
618d026be40SAriel Constenla-Haile     OUString aItemCommand;
619cdf0e10cSrcweir     if ( mpMenu )
620cdf0e10cSrcweir         aItemCommand = mpMenu->GetItemCommand( nItemId );
621cdf0e10cSrcweir     return aItemCommand;
622cdf0e10cSrcweir }
623cdf0e10cSrcweir 
setHelpCommand(sal_Int16 nItemId,const OUString & aHelp)624d026be40SAriel Constenla-Haile void SAL_CALL VCLXMenu::setHelpCommand(
625d026be40SAriel Constenla-Haile     sal_Int16 nItemId,
626d026be40SAriel Constenla-Haile     const OUString& aHelp )
627d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
628cdf0e10cSrcweir {
629cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
630cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
631cdf0e10cSrcweir 
632cdf0e10cSrcweir     if ( mpMenu )
633cdf0e10cSrcweir         mpMenu->SetHelpCommand( nItemId, aHelp );
634cdf0e10cSrcweir }
635cdf0e10cSrcweir 
getHelpCommand(sal_Int16 nItemId)636d026be40SAriel Constenla-Haile OUString SAL_CALL VCLXMenu::getHelpCommand(
637d026be40SAriel Constenla-Haile     sal_Int16 nItemId )
638d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
639cdf0e10cSrcweir {
640cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
641cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
642cdf0e10cSrcweir 
643d026be40SAriel Constenla-Haile     OUString aHelpCommand;
644cdf0e10cSrcweir     if ( mpMenu )
645cdf0e10cSrcweir         aHelpCommand = mpMenu->GetHelpCommand( nItemId );
646cdf0e10cSrcweir     return aHelpCommand;
647cdf0e10cSrcweir }
648cdf0e10cSrcweir 
649cdf0e10cSrcweir 
650cdf0e10cSrcweir namespace
651cdf0e10cSrcweir {
lcl_XGraphic2VCLImage(const css::uno::Reference<css::graphic::XGraphic> & xGraphic,sal_Bool bResize)652d026be40SAriel Constenla-Haile     static Image lcl_XGraphic2VCLImage(
653cdf0e10cSrcweir         const css::uno::Reference< css::graphic::XGraphic >& xGraphic,
654cdf0e10cSrcweir         sal_Bool bResize )
655cdf0e10cSrcweir     {
656cdf0e10cSrcweir         Image aImage;
657cdf0e10cSrcweir         if ( !xGraphic.is() )
658cdf0e10cSrcweir             return aImage;
659cdf0e10cSrcweir 
660cdf0e10cSrcweir         aImage = Image( xGraphic );
661cdf0e10cSrcweir         const ::Size aCurSize = aImage.GetSizePixel();
662cdf0e10cSrcweir         const sal_Int32 nCurWidth = aCurSize.Width();
663cdf0e10cSrcweir         const sal_Int32 nCurHeight = aCurSize.Height();
664cdf0e10cSrcweir         const sal_Int32 nIdeal( 16 );
665cdf0e10cSrcweir 
666cdf0e10cSrcweir         if ( nCurWidth > 0 && nCurHeight > 0 )
667cdf0e10cSrcweir         {
668cdf0e10cSrcweir             if ( bResize && ( nCurWidth > nIdeal || nCurHeight > nIdeal ) )
669cdf0e10cSrcweir             {
670cdf0e10cSrcweir                 sal_Int32 nIdealWidth  = nCurWidth  > nIdeal ? nIdeal : nCurWidth;
671cdf0e10cSrcweir                 sal_Int32 nIdealHeight = nCurHeight > nIdeal ? nIdeal : nCurHeight;
672cdf0e10cSrcweir 
673cdf0e10cSrcweir                 ::Size aNewSize( nIdealWidth, nIdealHeight );
674cdf0e10cSrcweir 
675cdf0e10cSrcweir                 sal_Bool bModified( sal_False );
676cdf0e10cSrcweir                 BitmapEx aBitmapEx = aImage.GetBitmapEx();
677cdf0e10cSrcweir                 bModified = aBitmapEx.Scale( aNewSize, BMP_SCALE_INTERPOLATE );
678cdf0e10cSrcweir 
679cdf0e10cSrcweir                 if ( bModified )
680cdf0e10cSrcweir                     aImage = Image( aBitmapEx );
681cdf0e10cSrcweir             }
682cdf0e10cSrcweir         }
683cdf0e10cSrcweir         return aImage;
684cdf0e10cSrcweir     }
685cdf0e10cSrcweir 
686d026be40SAriel Constenla-Haile     /** Copied from svtools/inc/acceleratorexecute.hxx */
lcl_VCLKey2AWTKey(const KeyCode & aVCLKey)687d026be40SAriel Constenla-Haile     static css::awt::KeyEvent lcl_VCLKey2AWTKey(
688d026be40SAriel Constenla-Haile         const KeyCode& aVCLKey)
689cdf0e10cSrcweir     {
690cdf0e10cSrcweir         css::awt::KeyEvent aAWTKey;
691cdf0e10cSrcweir         aAWTKey.Modifiers = 0;
692cdf0e10cSrcweir         aAWTKey.KeyCode   = (sal_Int16)aVCLKey.GetCode();
693cdf0e10cSrcweir 
694cdf0e10cSrcweir         if (aVCLKey.IsShift())
695cdf0e10cSrcweir             aAWTKey.Modifiers |= css::awt::KeyModifier::SHIFT;
696cdf0e10cSrcweir         if (aVCLKey.IsMod1())
697cdf0e10cSrcweir             aAWTKey.Modifiers |= css::awt::KeyModifier::MOD1;
698cdf0e10cSrcweir         if (aVCLKey.IsMod2())
699cdf0e10cSrcweir             aAWTKey.Modifiers |= css::awt::KeyModifier::MOD2;
700cdf0e10cSrcweir         if (aVCLKey.IsMod3())
701cdf0e10cSrcweir             aAWTKey.Modifiers |= css::awt::KeyModifier::MOD3;
702cdf0e10cSrcweir 
703cdf0e10cSrcweir         return aAWTKey;
704cdf0e10cSrcweir     }
705cdf0e10cSrcweir 
lcl_AWTKey2VCLKey(const css::awt::KeyEvent & aAWTKey)706cdf0e10cSrcweir     KeyCode lcl_AWTKey2VCLKey(const css::awt::KeyEvent& aAWTKey)
707cdf0e10cSrcweir     {
708cdf0e10cSrcweir         sal_Bool bShift = ((aAWTKey.Modifiers & css::awt::KeyModifier::SHIFT) == css::awt::KeyModifier::SHIFT );
709cdf0e10cSrcweir         sal_Bool bMod1  = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD1 ) == css::awt::KeyModifier::MOD1  );
710cdf0e10cSrcweir         sal_Bool bMod2  = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD2 ) == css::awt::KeyModifier::MOD2  );
711cdf0e10cSrcweir         sal_Bool bMod3  = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD3 ) == css::awt::KeyModifier::MOD3  );
712cdf0e10cSrcweir         sal_uInt16   nKey   = (sal_uInt16)aAWTKey.KeyCode;
713cdf0e10cSrcweir 
714cdf0e10cSrcweir         return KeyCode(nKey, bShift, bMod1, bMod2, bMod3);
715cdf0e10cSrcweir     }
716cdf0e10cSrcweir 
717d026be40SAriel Constenla-Haile }
718cdf0e10cSrcweir 
719cdf0e10cSrcweir 
isPopupMenu()720d026be40SAriel Constenla-Haile ::sal_Bool SAL_CALL VCLXMenu::isPopupMenu(  )
721d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
722cdf0e10cSrcweir {
723cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
724cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
725cdf0e10cSrcweir     return IsPopupMenu();
726cdf0e10cSrcweir }
727cdf0e10cSrcweir 
clear()728d026be40SAriel Constenla-Haile void SAL_CALL VCLXMenu::clear(  )
729d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
730cdf0e10cSrcweir {
731cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
732cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
733cdf0e10cSrcweir     if ( mpMenu )
734cdf0e10cSrcweir         mpMenu->Clear();
735cdf0e10cSrcweir }
736cdf0e10cSrcweir 
737cdf0e10cSrcweir 
getItemType(::sal_Int16 nItemPos)738d026be40SAriel Constenla-Haile css::awt::MenuItemType SAL_CALL VCLXMenu::getItemType(
739d026be40SAriel Constenla-Haile     ::sal_Int16 nItemPos )
740d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
741cdf0e10cSrcweir {
742cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
743cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
744cdf0e10cSrcweir 
745d026be40SAriel Constenla-Haile     css::awt::MenuItemType aMenuItemType =
746d026be40SAriel Constenla-Haile         css::awt::MenuItemType_DONTKNOW;
747cdf0e10cSrcweir     if ( mpMenu )
748cdf0e10cSrcweir     {
749d026be40SAriel Constenla-Haile         aMenuItemType = ( (css::awt::MenuItemType) mpMenu->GetItemType( nItemPos ) );
750cdf0e10cSrcweir     }
751cdf0e10cSrcweir 
752cdf0e10cSrcweir     return aMenuItemType;
753cdf0e10cSrcweir }
754cdf0e10cSrcweir 
hideDisabledEntries(::sal_Bool bHide)755d026be40SAriel Constenla-Haile void SAL_CALL VCLXMenu::hideDisabledEntries(
756d026be40SAriel Constenla-Haile     ::sal_Bool bHide )
757d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
758cdf0e10cSrcweir {
759cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
760cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
761cdf0e10cSrcweir     if ( mpMenu )
762cdf0e10cSrcweir     {
763cdf0e10cSrcweir         if ( bHide )
764cdf0e10cSrcweir             mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() | MENU_FLAG_HIDEDISABLEDENTRIES );
765cdf0e10cSrcweir         else
766cdf0e10cSrcweir             mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() & ~MENU_FLAG_HIDEDISABLEDENTRIES );
767cdf0e10cSrcweir     }
768cdf0e10cSrcweir }
769cdf0e10cSrcweir 
770cdf0e10cSrcweir 
isInExecute()771cdf0e10cSrcweir ::sal_Bool SAL_CALL VCLXMenu::isInExecute(  )
772d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
773cdf0e10cSrcweir {
774cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
775cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
776cdf0e10cSrcweir 
777cdf0e10cSrcweir     if ( mpMenu && IsPopupMenu() )
778cdf0e10cSrcweir         return ( (PopupMenu*) mpMenu )->IsInExecute();
779cdf0e10cSrcweir     else
780cdf0e10cSrcweir         return sal_False;
781cdf0e10cSrcweir }
782cdf0e10cSrcweir 
783cdf0e10cSrcweir 
endExecute()784cdf0e10cSrcweir void SAL_CALL VCLXMenu::endExecute()
785d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
786cdf0e10cSrcweir {
787cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
788cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
789cdf0e10cSrcweir 
790cdf0e10cSrcweir     if ( mpMenu && IsPopupMenu() )
791cdf0e10cSrcweir         ( (PopupMenu*) mpMenu )->EndExecute();
792cdf0e10cSrcweir }
793cdf0e10cSrcweir 
794cdf0e10cSrcweir 
enableAutoMnemonics(::sal_Bool bEnable)795d026be40SAriel Constenla-Haile void SAL_CALL VCLXMenu::enableAutoMnemonics(
796d026be40SAriel Constenla-Haile     ::sal_Bool bEnable )
797d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
798cdf0e10cSrcweir {
799cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
800cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
801cdf0e10cSrcweir     if ( mpMenu )
802cdf0e10cSrcweir     {
803cdf0e10cSrcweir         if ( !bEnable )
804cdf0e10cSrcweir             mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS );
805cdf0e10cSrcweir         else
806cdf0e10cSrcweir             mpMenu->SetMenuFlags( mpMenu->GetMenuFlags() & ~MENU_FLAG_NOAUTOMNEMONICS );
807cdf0e10cSrcweir     }
808cdf0e10cSrcweir }
809cdf0e10cSrcweir 
810cdf0e10cSrcweir 
setAcceleratorKeyEvent(::sal_Int16 nItemId,const css::awt::KeyEvent & aKeyEvent)811d026be40SAriel Constenla-Haile void SAL_CALL VCLXMenu::setAcceleratorKeyEvent(
812d026be40SAriel Constenla-Haile     ::sal_Int16 nItemId,
813d026be40SAriel Constenla-Haile     const css::awt::KeyEvent& aKeyEvent )
814d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
815cdf0e10cSrcweir {
816cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
817cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
818cdf0e10cSrcweir 
819d026be40SAriel Constenla-Haile     if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
820cdf0e10cSrcweir     {
821cdf0e10cSrcweir         KeyCode aVCLKeyCode = lcl_AWTKey2VCLKey( aKeyEvent );
822cdf0e10cSrcweir         mpMenu->SetAccelKey( nItemId, aVCLKeyCode );
823cdf0e10cSrcweir     }
824cdf0e10cSrcweir }
825cdf0e10cSrcweir 
826cdf0e10cSrcweir 
getAcceleratorKeyEvent(::sal_Int16 nItemId)827d026be40SAriel Constenla-Haile css::awt::KeyEvent SAL_CALL VCLXMenu::getAcceleratorKeyEvent(
828d026be40SAriel Constenla-Haile     ::sal_Int16 nItemId )
829d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
830cdf0e10cSrcweir {
831cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
832cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
833cdf0e10cSrcweir 
834d026be40SAriel Constenla-Haile     css::awt::KeyEvent aKeyEvent;
835d026be40SAriel Constenla-Haile     if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
836cdf0e10cSrcweir     {
837cdf0e10cSrcweir         KeyCode nKeyCode = mpMenu->GetAccelKey( nItemId );
838cdf0e10cSrcweir         aKeyEvent = lcl_VCLKey2AWTKey( nKeyCode );
839cdf0e10cSrcweir     }
840cdf0e10cSrcweir 
841cdf0e10cSrcweir     return aKeyEvent;
842cdf0e10cSrcweir }
843cdf0e10cSrcweir 
844cdf0e10cSrcweir 
setHelpText(::sal_Int16 nItemId,const OUString & sHelpText)845d026be40SAriel Constenla-Haile void SAL_CALL VCLXMenu::setHelpText(
846d026be40SAriel Constenla-Haile     ::sal_Int16 nItemId,
847d026be40SAriel Constenla-Haile     const OUString& sHelpText )
848d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
849cdf0e10cSrcweir {
850cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
851cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
852cdf0e10cSrcweir 
853d026be40SAriel Constenla-Haile     if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
854cdf0e10cSrcweir     {
855cdf0e10cSrcweir         mpMenu->SetHelpText( nItemId, sHelpText );
856cdf0e10cSrcweir     }
857cdf0e10cSrcweir }
858cdf0e10cSrcweir 
859cdf0e10cSrcweir 
getHelpText(::sal_Int16 nItemId)860d026be40SAriel Constenla-Haile OUString SAL_CALL VCLXMenu::getHelpText(
861d026be40SAriel Constenla-Haile     ::sal_Int16 nItemId )
862d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
863cdf0e10cSrcweir {
864cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
865cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
866cdf0e10cSrcweir 
867cdf0e10cSrcweir     rtl::OUString sHelpText;
868d026be40SAriel Constenla-Haile     if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
869cdf0e10cSrcweir     {
870cdf0e10cSrcweir         sHelpText = mpMenu->GetHelpText( nItemId );
871cdf0e10cSrcweir     }
872cdf0e10cSrcweir 
873cdf0e10cSrcweir     return sHelpText;
874cdf0e10cSrcweir }
875cdf0e10cSrcweir 
876cdf0e10cSrcweir 
setTipHelpText(::sal_Int16 nItemId,const OUString & sTipHelpText)877d026be40SAriel Constenla-Haile void SAL_CALL VCLXMenu::setTipHelpText(
878d026be40SAriel Constenla-Haile     ::sal_Int16 nItemId,
879d026be40SAriel Constenla-Haile     const OUString& sTipHelpText )
880d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
881cdf0e10cSrcweir {
882cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
883cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
884cdf0e10cSrcweir 
885d026be40SAriel Constenla-Haile     if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
886cdf0e10cSrcweir     {
887cdf0e10cSrcweir         mpMenu->SetTipHelpText( nItemId, sTipHelpText );
888cdf0e10cSrcweir     }
889cdf0e10cSrcweir }
890cdf0e10cSrcweir 
891cdf0e10cSrcweir 
getTipHelpText(::sal_Int16 nItemId)892d026be40SAriel Constenla-Haile OUString SAL_CALL VCLXMenu::getTipHelpText(
893d026be40SAriel Constenla-Haile     ::sal_Int16 nItemId )
894d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
895cdf0e10cSrcweir {
896cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
897cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
898cdf0e10cSrcweir 
899cdf0e10cSrcweir     rtl::OUString sTipHelpText;
900d026be40SAriel Constenla-Haile     if ( mpMenu && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
901cdf0e10cSrcweir     {
902cdf0e10cSrcweir         sTipHelpText = mpMenu->GetTipHelpText( nItemId );
903cdf0e10cSrcweir     }
904cdf0e10cSrcweir     return sTipHelpText;
905cdf0e10cSrcweir }
906cdf0e10cSrcweir 
907cdf0e10cSrcweir 
setItemImage(::sal_Int16 nItemId,const css::uno::Reference<css::graphic::XGraphic> & xGraphic,::sal_Bool bScale)908cdf0e10cSrcweir void SAL_CALL VCLXMenu::setItemImage(
909cdf0e10cSrcweir     ::sal_Int16 nItemId,
910d026be40SAriel Constenla-Haile     const css::uno::Reference< css::graphic::XGraphic >& xGraphic,
911d026be40SAriel Constenla-Haile     ::sal_Bool bScale )
912d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
913cdf0e10cSrcweir {
914cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
915cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
916cdf0e10cSrcweir 
917d026be40SAriel Constenla-Haile     if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
918cdf0e10cSrcweir     {
919cdf0e10cSrcweir         Image aImage = lcl_XGraphic2VCLImage( xGraphic, bScale );
920cdf0e10cSrcweir         mpMenu->SetItemImage( nItemId, aImage );
921cdf0e10cSrcweir     }
922cdf0e10cSrcweir }
923cdf0e10cSrcweir 
924cdf0e10cSrcweir 
925d026be40SAriel Constenla-Haile css::uno::Reference< css::graphic::XGraphic > SAL_CALL
getItemImage(::sal_Int16 nItemId)926d026be40SAriel Constenla-Haile VCLXMenu::getItemImage(
927d026be40SAriel Constenla-Haile     ::sal_Int16 nItemId )
928d026be40SAriel Constenla-Haile throw (css::uno::RuntimeException)
929cdf0e10cSrcweir {
930cdf0e10cSrcweir     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
931cdf0e10cSrcweir     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
932cdf0e10cSrcweir 
933d026be40SAriel Constenla-Haile     css::uno::Reference< css::graphic::XGraphic > rxGraphic;
934cdf0e10cSrcweir 
935d026be40SAriel Constenla-Haile     if ( mpMenu && IsPopupMenu() && MENU_ITEM_NOTFOUND != mpMenu->GetItemPos( nItemId ) )
936cdf0e10cSrcweir     {
937cdf0e10cSrcweir         Image aImage = mpMenu->GetItemImage( nItemId );
938cdf0e10cSrcweir         if ( !!aImage )
939cdf0e10cSrcweir             rxGraphic = aImage.GetXGraphic();
940cdf0e10cSrcweir     }
941cdf0e10cSrcweir     return rxGraphic;
942cdf0e10cSrcweir }
943cdf0e10cSrcweir 
944cdf0e10cSrcweir 
945cdf0e10cSrcweir 
946cdf0e10cSrcweir DBG_NAME(VCLXMenuBar);
947cdf0e10cSrcweir 
VCLXMenuBar()948cdf0e10cSrcweir VCLXMenuBar::VCLXMenuBar()
949cdf0e10cSrcweir {
950cdf0e10cSrcweir     DBG_CTOR( VCLXMenuBar, 0 );
951cdf0e10cSrcweir     ImplCreateMenu( sal_False );
952cdf0e10cSrcweir }
953cdf0e10cSrcweir 
VCLXMenuBar(MenuBar * pMenuBar)954cdf0e10cSrcweir VCLXMenuBar::VCLXMenuBar( MenuBar* pMenuBar ) : VCLXMenu( (Menu *)pMenuBar )
955cdf0e10cSrcweir {
956cdf0e10cSrcweir     DBG_CTOR( VCLXMenuBar, 0 );
957cdf0e10cSrcweir }
958cdf0e10cSrcweir 
959cdf0e10cSrcweir 
960cdf0e10cSrcweir DBG_NAME(VCLXPopupMenu);
961cdf0e10cSrcweir 
VCLXPopupMenu()962cdf0e10cSrcweir VCLXPopupMenu::VCLXPopupMenu()
963cdf0e10cSrcweir {
964cdf0e10cSrcweir     DBG_CTOR( VCLXPopupMenu, 0 );
965cdf0e10cSrcweir     ImplCreateMenu( sal_True );
966cdf0e10cSrcweir }
967