xref: /aoo4110/main/vcl/win/source/window/salmenu.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_vcl.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <tools/svwin.h>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <vcl/menu.hxx>
30*b1cdbd2cSJim Jagielski #include <vcl/sysdata.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <win/wincomp.hxx>
33*b1cdbd2cSJim Jagielski #include <win/saldata.hxx>
34*b1cdbd2cSJim Jagielski #include <win/salinst.h>
35*b1cdbd2cSJim Jagielski #include <win/salframe.h>
36*b1cdbd2cSJim Jagielski #include <win/salmenu.h>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include <impbmp.hxx>
39*b1cdbd2cSJim Jagielski #include <salgdi.hxx>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski // uncomment the following line to have ownerdrawn menues, ie, with bitmaps
42*b1cdbd2cSJim Jagielski // however, this is incompatible with OLE inplace editing
43*b1cdbd2cSJim Jagielski // so it is not activated by default
44*b1cdbd2cSJim Jagielski //#define OWNERDRAW
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski static DWORD myerr=0;
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski // =======================================================================
49*b1cdbd2cSJim Jagielski 
IsKnownMenuHandle(HMENU hMenu)50*b1cdbd2cSJim Jagielski sal_Bool SalData::IsKnownMenuHandle( HMENU hMenu )
51*b1cdbd2cSJim Jagielski {
52*b1cdbd2cSJim Jagielski     if( mhMenuSet.find( hMenu ) == mhMenuSet.end() )
53*b1cdbd2cSJim Jagielski         return FALSE;
54*b1cdbd2cSJim Jagielski     else
55*b1cdbd2cSJim Jagielski         return TRUE;
56*b1cdbd2cSJim Jagielski }
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski // =======================================================================
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski // WinSalInst factory methods
61*b1cdbd2cSJim Jagielski 
CreateMenu(sal_Bool bMenuBar,Menu *)62*b1cdbd2cSJim Jagielski SalMenu* WinSalInstance::CreateMenu( sal_Bool bMenuBar, Menu* )
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski     WinSalMenu *pSalMenu = new WinSalMenu();
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski     pSalMenu->mbMenuBar = bMenuBar;
67*b1cdbd2cSJim Jagielski     pSalMenu->mhWnd     = NULL;
68*b1cdbd2cSJim Jagielski     if( bMenuBar )
69*b1cdbd2cSJim Jagielski         pSalMenu->mhMenu = ::CreateMenu();
70*b1cdbd2cSJim Jagielski     else
71*b1cdbd2cSJim Jagielski         pSalMenu->mhMenu = ::CreatePopupMenu();
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski     if( pSalMenu->mhMenu )
74*b1cdbd2cSJim Jagielski         GetSalData()->mhMenuSet.insert( pSalMenu->mhMenu );
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski     return pSalMenu;
77*b1cdbd2cSJim Jagielski }
78*b1cdbd2cSJim Jagielski 
DestroyMenu(SalMenu * pSalMenu)79*b1cdbd2cSJim Jagielski void WinSalInstance::DestroyMenu( SalMenu* pSalMenu )
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski     delete pSalMenu;
82*b1cdbd2cSJim Jagielski }
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski 
CreateMenuItem(const SalItemParams * pItemData)85*b1cdbd2cSJim Jagielski SalMenuItem* WinSalInstance::CreateMenuItem( const SalItemParams* pItemData )
86*b1cdbd2cSJim Jagielski {
87*b1cdbd2cSJim Jagielski     if( !pItemData )
88*b1cdbd2cSJim Jagielski         return NULL;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski     WinSalMenuItem *pSalMenuItem = new WinSalMenuItem();
91*b1cdbd2cSJim Jagielski     memset( &pSalMenuItem->mInfo, 0, sizeof( MENUITEMINFOW ) );
92*b1cdbd2cSJim Jagielski     pSalMenuItem->mInfo.cbSize = sizeof( MENUITEMINFOW );
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski     if( pItemData->eType == MENUITEM_SEPARATOR )
95*b1cdbd2cSJim Jagielski     {
96*b1cdbd2cSJim Jagielski         // separator
97*b1cdbd2cSJim Jagielski         pSalMenuItem->mInfo.fMask = MIIM_TYPE;
98*b1cdbd2cSJim Jagielski         pSalMenuItem->mInfo.fType = MFT_SEPARATOR;
99*b1cdbd2cSJim Jagielski     }
100*b1cdbd2cSJim Jagielski     else
101*b1cdbd2cSJim Jagielski     {
102*b1cdbd2cSJim Jagielski         // item
103*b1cdbd2cSJim Jagielski         pSalMenuItem->mText   = pItemData->aText;
104*b1cdbd2cSJim Jagielski         pSalMenuItem->mpMenu  = pItemData->pMenu;
105*b1cdbd2cSJim Jagielski         pSalMenuItem->maBitmap= !!pItemData->aImage ? pItemData->aImage.GetBitmapEx().GetBitmap() : Bitmap();
106*b1cdbd2cSJim Jagielski         pSalMenuItem->mnId    = pItemData->nId;
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski         // 'translate' mnemonics
109*b1cdbd2cSJim Jagielski         pSalMenuItem->mText.SearchAndReplace( '~', '&' );
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski         pSalMenuItem->mInfo.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID | MIIM_DATA;
112*b1cdbd2cSJim Jagielski         pSalMenuItem->mInfo.fType = MFT_STRING;
113*b1cdbd2cSJim Jagielski #ifdef OWNERDRAW
114*b1cdbd2cSJim Jagielski         if( pItemData->pMenu && !pItemData->pMenu->IsMenuBar() )
115*b1cdbd2cSJim Jagielski             pSalMenuItem->mInfo.fType |= MFT_OWNERDRAW;
116*b1cdbd2cSJim Jagielski         pSalMenuItem->mInfo.fState = MFS_ENABLED;
117*b1cdbd2cSJim Jagielski #endif
118*b1cdbd2cSJim Jagielski         pSalMenuItem->mInfo.dwTypeData = (LPWSTR) pSalMenuItem->mText.GetBuffer();
119*b1cdbd2cSJim Jagielski         pSalMenuItem->mInfo.cch = pSalMenuItem->mText.Len();
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski         pSalMenuItem->mInfo.wID = pItemData->nId;
122*b1cdbd2cSJim Jagielski         pSalMenuItem->mInfo.dwItemData = (ULONG_PTR) pSalMenuItem; // user data
123*b1cdbd2cSJim Jagielski     }
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski     return pSalMenuItem;
126*b1cdbd2cSJim Jagielski }
127*b1cdbd2cSJim Jagielski 
DestroyMenuItem(SalMenuItem * pSalMenuItem)128*b1cdbd2cSJim Jagielski void WinSalInstance::DestroyMenuItem( SalMenuItem* pSalMenuItem )
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski     delete pSalMenuItem;
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski // =======================================================================
135*b1cdbd2cSJim Jagielski 
ImplDrawMenuBar(SalMenu * pMenu)136*b1cdbd2cSJim Jagielski static void ImplDrawMenuBar( SalMenu *pMenu )
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski     if( pMenu->VisibleMenuBar() )
139*b1cdbd2cSJim Jagielski     {
140*b1cdbd2cSJim Jagielski         // redrawing the menubar all the time actually seems to be unnecessary (it just flickers)
141*b1cdbd2cSJim Jagielski         /*
142*b1cdbd2cSJim Jagielski         WinSalMenu *pMenuBar = ImplFindMenuBar( pMenu );
143*b1cdbd2cSJim Jagielski         if( pMenuBar && pMenuBar->mhWnd )
144*b1cdbd2cSJim Jagielski             ::DrawMenuBar( pMenuBar->mhWnd );
145*b1cdbd2cSJim Jagielski             */
146*b1cdbd2cSJim Jagielski     }
147*b1cdbd2cSJim Jagielski }
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski // =======================================================================
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski /*
153*b1cdbd2cSJim Jagielski  * WinSalMenu
154*b1cdbd2cSJim Jagielski  */
155*b1cdbd2cSJim Jagielski 
WinSalMenu()156*b1cdbd2cSJim Jagielski WinSalMenu::WinSalMenu()
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski     mhMenu       = NULL;
159*b1cdbd2cSJim Jagielski     mbMenuBar    = FALSE;
160*b1cdbd2cSJim Jagielski     mhWnd        = NULL;
161*b1cdbd2cSJim Jagielski     mpParentMenu = NULL;
162*b1cdbd2cSJim Jagielski }
163*b1cdbd2cSJim Jagielski 
~WinSalMenu()164*b1cdbd2cSJim Jagielski WinSalMenu::~WinSalMenu()
165*b1cdbd2cSJim Jagielski {
166*b1cdbd2cSJim Jagielski     // only required if not associated to a window...
167*b1cdbd2cSJim Jagielski     GetSalData()->mhMenuSet.erase( mhMenu );
168*b1cdbd2cSJim Jagielski     ::DestroyMenu( mhMenu );
169*b1cdbd2cSJim Jagielski }
170*b1cdbd2cSJim Jagielski 
VisibleMenuBar()171*b1cdbd2cSJim Jagielski sal_Bool WinSalMenu::VisibleMenuBar()
172*b1cdbd2cSJim Jagielski {
173*b1cdbd2cSJim Jagielski     // The Win32 implementation never shows a native
174*b1cdbd2cSJim Jagielski     // menubar. Thus, native menues are only visible
175*b1cdbd2cSJim Jagielski     // when the menu is merged with an OLE container.
176*b1cdbd2cSJim Jagielski     // The reason are missing tooltips, ownerdraw
177*b1cdbd2cSJim Jagielski     // issues and accessibility which are better supported
178*b1cdbd2cSJim Jagielski     // by VCL menues.
179*b1cdbd2cSJim Jagielski     // Nevertheless, the native menues are always created
180*b1cdbd2cSJim Jagielski     // and the application will properly react to all native
181*b1cdbd2cSJim Jagielski     // menu messages.
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski     return FALSE;
184*b1cdbd2cSJim Jagielski }
185*b1cdbd2cSJim Jagielski 
SetFrame(const SalFrame * pFrame)186*b1cdbd2cSJim Jagielski void WinSalMenu::SetFrame( const SalFrame *pFrame )
187*b1cdbd2cSJim Jagielski {
188*b1cdbd2cSJim Jagielski     if( pFrame )
189*b1cdbd2cSJim Jagielski         mhWnd = static_cast<const WinSalFrame*>(pFrame)->mhWnd;
190*b1cdbd2cSJim Jagielski     else
191*b1cdbd2cSJim Jagielski         mhWnd = NULL;
192*b1cdbd2cSJim Jagielski }
193*b1cdbd2cSJim Jagielski 
InsertItem(SalMenuItem * pSalMenuItem,unsigned nPos)194*b1cdbd2cSJim Jagielski void WinSalMenu::InsertItem( SalMenuItem* pSalMenuItem, unsigned nPos )
195*b1cdbd2cSJim Jagielski {
196*b1cdbd2cSJim Jagielski     if( pSalMenuItem )
197*b1cdbd2cSJim Jagielski     {
198*b1cdbd2cSJim Jagielski 	WinSalMenuItem* pWItem = static_cast<WinSalMenuItem*>(pSalMenuItem);
199*b1cdbd2cSJim Jagielski         if( nPos == MENU_APPEND )
200*b1cdbd2cSJim Jagielski         {
201*b1cdbd2cSJim Jagielski             nPos = ::GetMenuItemCount( mhMenu );
202*b1cdbd2cSJim Jagielski             if( nPos == -1 )
203*b1cdbd2cSJim Jagielski                 return;
204*b1cdbd2cSJim Jagielski         }
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski         if(!::InsertMenuItemW( mhMenu, nPos, TRUE, &pWItem->mInfo ))
207*b1cdbd2cSJim Jagielski             myerr = GetLastError();
208*b1cdbd2cSJim Jagielski         else
209*b1cdbd2cSJim Jagielski         {
210*b1cdbd2cSJim Jagielski             pWItem->mpSalMenu = this;
211*b1cdbd2cSJim Jagielski             ImplDrawMenuBar( this );
212*b1cdbd2cSJim Jagielski         }
213*b1cdbd2cSJim Jagielski     }
214*b1cdbd2cSJim Jagielski }
215*b1cdbd2cSJim Jagielski 
RemoveItem(unsigned nPos)216*b1cdbd2cSJim Jagielski void WinSalMenu::RemoveItem( unsigned nPos )
217*b1cdbd2cSJim Jagielski {
218*b1cdbd2cSJim Jagielski     int num = ::GetMenuItemCount( mhMenu );
219*b1cdbd2cSJim Jagielski     if( num != -1 && nPos < (unsigned)num )
220*b1cdbd2cSJim Jagielski     {
221*b1cdbd2cSJim Jagielski         WinSalMenuItem *pSalMenuItem = NULL;
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski         MENUITEMINFOW mi;
224*b1cdbd2cSJim Jagielski         memset( &mi, 0, sizeof(mi) );
225*b1cdbd2cSJim Jagielski         mi.cbSize = sizeof( mi );
226*b1cdbd2cSJim Jagielski         mi.fMask = MIIM_DATA;
227*b1cdbd2cSJim Jagielski         if( !GetMenuItemInfoW( mhMenu, nPos, TRUE, &mi) )
228*b1cdbd2cSJim Jagielski             myerr = GetLastError();
229*b1cdbd2cSJim Jagielski         else
230*b1cdbd2cSJim Jagielski             pSalMenuItem = (WinSalMenuItem *) mi.dwItemData;
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski         if( !::RemoveMenu( mhMenu, nPos, MF_BYPOSITION ) )
233*b1cdbd2cSJim Jagielski             myerr = GetLastError();
234*b1cdbd2cSJim Jagielski         else
235*b1cdbd2cSJim Jagielski         {
236*b1cdbd2cSJim Jagielski             if( pSalMenuItem )
237*b1cdbd2cSJim Jagielski                 pSalMenuItem->mpSalMenu = NULL;
238*b1cdbd2cSJim Jagielski             ImplDrawMenuBar( this );
239*b1cdbd2cSJim Jagielski         }
240*b1cdbd2cSJim Jagielski     }
241*b1cdbd2cSJim Jagielski }
242*b1cdbd2cSJim Jagielski 
ImplRemoveItemById(WinSalMenu * pSalMenu,unsigned nItemId)243*b1cdbd2cSJim Jagielski void ImplRemoveItemById( WinSalMenu *pSalMenu, unsigned nItemId )
244*b1cdbd2cSJim Jagielski {
245*b1cdbd2cSJim Jagielski     if( !pSalMenu )
246*b1cdbd2cSJim Jagielski         return;
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski     WinSalMenuItem *pSalMenuItem = NULL;
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski     MENUITEMINFOW mi;
251*b1cdbd2cSJim Jagielski     memset( &mi, 0, sizeof(mi) );
252*b1cdbd2cSJim Jagielski     mi.cbSize = sizeof( mi );
253*b1cdbd2cSJim Jagielski     mi.fMask = MIIM_DATA;
254*b1cdbd2cSJim Jagielski     if( !GetMenuItemInfoW( pSalMenu->mhMenu, nItemId, FALSE, &mi) )
255*b1cdbd2cSJim Jagielski         myerr = GetLastError();
256*b1cdbd2cSJim Jagielski     else
257*b1cdbd2cSJim Jagielski         pSalMenuItem = (WinSalMenuItem *) mi.dwItemData;
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski     if( !::RemoveMenu( pSalMenu->mhMenu, nItemId, MF_BYCOMMAND ) )
260*b1cdbd2cSJim Jagielski         myerr = GetLastError();
261*b1cdbd2cSJim Jagielski     else
262*b1cdbd2cSJim Jagielski     {
263*b1cdbd2cSJim Jagielski         if( pSalMenuItem )
264*b1cdbd2cSJim Jagielski             pSalMenuItem->mpSalMenu = NULL;
265*b1cdbd2cSJim Jagielski         ImplDrawMenuBar( pSalMenu );
266*b1cdbd2cSJim Jagielski     }
267*b1cdbd2cSJim Jagielski }
268*b1cdbd2cSJim Jagielski 
SetSubMenu(SalMenuItem * pSalMenuItem,SalMenu * pSubMenu,unsigned nPos)269*b1cdbd2cSJim Jagielski void WinSalMenu::SetSubMenu( SalMenuItem* pSalMenuItem, SalMenu* pSubMenu, unsigned nPos )
270*b1cdbd2cSJim Jagielski {
271*b1cdbd2cSJim Jagielski     if( pSalMenuItem )
272*b1cdbd2cSJim Jagielski     {
273*b1cdbd2cSJim Jagielski 	    WinSalMenuItem* pWMenuItem = static_cast<WinSalMenuItem*>(pSalMenuItem);
274*b1cdbd2cSJim Jagielski 	    WinSalMenu* pWSubMenu = static_cast<WinSalMenu*>(pSubMenu);
275*b1cdbd2cSJim Jagielski         if( pWMenuItem->mInfo.hSubMenu )
276*b1cdbd2cSJim Jagielski         {
277*b1cdbd2cSJim Jagielski             GetSalData()->mhMenuSet.erase( pWMenuItem->mInfo.hSubMenu );
278*b1cdbd2cSJim Jagielski             ::DestroyMenu( pWMenuItem->mInfo.hSubMenu );
279*b1cdbd2cSJim Jagielski         }
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski         pWMenuItem->mInfo.fMask |= MIIM_SUBMENU;
282*b1cdbd2cSJim Jagielski         if( !pSubMenu )
283*b1cdbd2cSJim Jagielski             pWMenuItem->mInfo.hSubMenu = NULL;
284*b1cdbd2cSJim Jagielski         else
285*b1cdbd2cSJim Jagielski         {
286*b1cdbd2cSJim Jagielski             pWMenuItem->mInfo.hSubMenu = pWSubMenu->mhMenu;
287*b1cdbd2cSJim Jagielski             pWSubMenu->mpParentMenu = this;
288*b1cdbd2cSJim Jagielski         }
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski         if(!::SetMenuItemInfoW( mhMenu, nPos, TRUE, &pWMenuItem->mInfo ) )
291*b1cdbd2cSJim Jagielski             myerr = GetLastError();
292*b1cdbd2cSJim Jagielski         else
293*b1cdbd2cSJim Jagielski             ImplDrawMenuBar( this );
294*b1cdbd2cSJim Jagielski     }
295*b1cdbd2cSJim Jagielski }
296*b1cdbd2cSJim Jagielski 
CheckItem(unsigned nPos,sal_Bool bCheck)297*b1cdbd2cSJim Jagielski void WinSalMenu::CheckItem( unsigned nPos, sal_Bool bCheck )
298*b1cdbd2cSJim Jagielski {
299*b1cdbd2cSJim Jagielski     if( -1 != ::CheckMenuItem( mhMenu, nPos, MF_BYPOSITION|(bCheck ? MF_CHECKED : MF_UNCHECKED) ) )
300*b1cdbd2cSJim Jagielski         ImplDrawMenuBar( this );
301*b1cdbd2cSJim Jagielski }
302*b1cdbd2cSJim Jagielski 
EnableItem(unsigned nPos,sal_Bool bEnable)303*b1cdbd2cSJim Jagielski void WinSalMenu::EnableItem( unsigned nPos, sal_Bool bEnable )
304*b1cdbd2cSJim Jagielski {
305*b1cdbd2cSJim Jagielski     if( -1 != ::EnableMenuItem( mhMenu, nPos, MF_BYPOSITION|(bEnable ? MF_ENABLED : (MF_DISABLED|MF_GRAYED) ) ) )
306*b1cdbd2cSJim Jagielski         ImplDrawMenuBar( this );
307*b1cdbd2cSJim Jagielski }
308*b1cdbd2cSJim Jagielski 
SetItemImage(unsigned,SalMenuItem * pSalMenuItem,const Image & rImage)309*b1cdbd2cSJim Jagielski void WinSalMenu::SetItemImage( unsigned /*nPos*/, SalMenuItem* pSalMenuItem, const Image& rImage )
310*b1cdbd2cSJim Jagielski {
311*b1cdbd2cSJim Jagielski     if( pSalMenuItem )
312*b1cdbd2cSJim Jagielski     {
313*b1cdbd2cSJim Jagielski 	WinSalMenuItem* pWItem = static_cast<WinSalMenuItem*>(pSalMenuItem);
314*b1cdbd2cSJim Jagielski         if( !!rImage )
315*b1cdbd2cSJim Jagielski             pWItem->maBitmap = rImage.GetBitmapEx().GetBitmap();
316*b1cdbd2cSJim Jagielski         else
317*b1cdbd2cSJim Jagielski             pWItem->maBitmap = Bitmap();
318*b1cdbd2cSJim Jagielski     }
319*b1cdbd2cSJim Jagielski }
320*b1cdbd2cSJim Jagielski 
SetItemText(unsigned nPos,SalMenuItem * pSalMenuItem,const XubString & rText)321*b1cdbd2cSJim Jagielski void WinSalMenu::SetItemText( unsigned nPos, SalMenuItem* pSalMenuItem, const XubString& rText )
322*b1cdbd2cSJim Jagielski {
323*b1cdbd2cSJim Jagielski     if( pSalMenuItem )
324*b1cdbd2cSJim Jagielski     {
325*b1cdbd2cSJim Jagielski 	WinSalMenuItem* pWItem = static_cast<WinSalMenuItem*>(pSalMenuItem);
326*b1cdbd2cSJim Jagielski         pWItem->mText = rText;
327*b1cdbd2cSJim Jagielski         // 'translate' mnemonics
328*b1cdbd2cSJim Jagielski         pWItem->mText.SearchAndReplace( '~', '&' );
329*b1cdbd2cSJim Jagielski         pWItem->mInfo.fMask = MIIM_TYPE | MIIM_DATA;
330*b1cdbd2cSJim Jagielski         pWItem->mInfo.fType = MFT_STRING;
331*b1cdbd2cSJim Jagielski #ifdef OWNERDRAW
332*b1cdbd2cSJim Jagielski         if( pWItem->mpMenu && !((Menu*) pWItem->mpMenu)->IsMenuBar() )
333*b1cdbd2cSJim Jagielski             pWItem->mInfo.fType |= MFT_OWNERDRAW;
334*b1cdbd2cSJim Jagielski #endif
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski         // combine text and accelerator text
337*b1cdbd2cSJim Jagielski         XubString aStr( pWItem->mText );
338*b1cdbd2cSJim Jagielski         if( pWItem->mAccelText.Len() )
339*b1cdbd2cSJim Jagielski         {
340*b1cdbd2cSJim Jagielski             aStr.AppendAscii("\t");
341*b1cdbd2cSJim Jagielski             aStr.Append( pWItem->mAccelText );
342*b1cdbd2cSJim Jagielski         }
343*b1cdbd2cSJim Jagielski         pWItem->mInfo.dwTypeData = (LPWSTR) aStr.GetBuffer();
344*b1cdbd2cSJim Jagielski         pWItem->mInfo.cch = aStr.Len();
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski         if(!::SetMenuItemInfoW( mhMenu, nPos, TRUE, &pWItem->mInfo ))
347*b1cdbd2cSJim Jagielski             myerr = GetLastError();
348*b1cdbd2cSJim Jagielski         else
349*b1cdbd2cSJim Jagielski             ImplDrawMenuBar( this );
350*b1cdbd2cSJim Jagielski     }
351*b1cdbd2cSJim Jagielski }
352*b1cdbd2cSJim Jagielski 
SetAccelerator(unsigned nPos,SalMenuItem * pSalMenuItem,const KeyCode &,const XubString & rKeyName)353*b1cdbd2cSJim Jagielski void WinSalMenu::SetAccelerator( unsigned nPos, SalMenuItem* pSalMenuItem, const KeyCode&, const XubString& rKeyName )
354*b1cdbd2cSJim Jagielski {
355*b1cdbd2cSJim Jagielski     if( pSalMenuItem )
356*b1cdbd2cSJim Jagielski     {
357*b1cdbd2cSJim Jagielski 	WinSalMenuItem* pWItem = static_cast<WinSalMenuItem*>(pSalMenuItem);
358*b1cdbd2cSJim Jagielski         pWItem->mAccelText = rKeyName;
359*b1cdbd2cSJim Jagielski         pWItem->mInfo.fMask = MIIM_TYPE | MIIM_DATA;
360*b1cdbd2cSJim Jagielski         pWItem->mInfo.fType = MFT_STRING;
361*b1cdbd2cSJim Jagielski #ifdef OWNERDRAW
362*b1cdbd2cSJim Jagielski         if( pWItem->mpMenu && !((Menu*)pWItem->mpMenu)->IsMenuBar() )
363*b1cdbd2cSJim Jagielski             pWItem->mInfo.fType |= MFT_OWNERDRAW;
364*b1cdbd2cSJim Jagielski #endif
365*b1cdbd2cSJim Jagielski         // combine text and accelerator text
366*b1cdbd2cSJim Jagielski         XubString aStr( pWItem->mText );
367*b1cdbd2cSJim Jagielski         if( pWItem->mAccelText.Len() )
368*b1cdbd2cSJim Jagielski         {
369*b1cdbd2cSJim Jagielski             aStr.AppendAscii("\t");
370*b1cdbd2cSJim Jagielski             aStr.Append( pWItem->mAccelText );
371*b1cdbd2cSJim Jagielski         }
372*b1cdbd2cSJim Jagielski         pWItem->mInfo.dwTypeData = (LPWSTR) aStr.GetBuffer();
373*b1cdbd2cSJim Jagielski         pWItem->mInfo.cch = aStr.Len();
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski         if(!::SetMenuItemInfoW( mhMenu, nPos, TRUE, &pWItem->mInfo ))
376*b1cdbd2cSJim Jagielski             myerr = GetLastError();
377*b1cdbd2cSJim Jagielski         else
378*b1cdbd2cSJim Jagielski             ImplDrawMenuBar( this );
379*b1cdbd2cSJim Jagielski     }
380*b1cdbd2cSJim Jagielski }
381*b1cdbd2cSJim Jagielski 
GetSystemMenuData(SystemMenuData * pData)382*b1cdbd2cSJim Jagielski void WinSalMenu::GetSystemMenuData( SystemMenuData* pData )
383*b1cdbd2cSJim Jagielski {
384*b1cdbd2cSJim Jagielski     if( pData )
385*b1cdbd2cSJim Jagielski         pData->hMenu = mhMenu;
386*b1cdbd2cSJim Jagielski }
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski // =======================================================================
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski /*
391*b1cdbd2cSJim Jagielski  * SalMenuItem
392*b1cdbd2cSJim Jagielski  */
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski 
WinSalMenuItem()395*b1cdbd2cSJim Jagielski WinSalMenuItem::WinSalMenuItem()
396*b1cdbd2cSJim Jagielski {
397*b1cdbd2cSJim Jagielski     memset( &mInfo, 0, sizeof( MENUITEMINFOW ) );
398*b1cdbd2cSJim Jagielski     mpMenu = NULL;
399*b1cdbd2cSJim Jagielski     mnId  = 0xFFFF;
400*b1cdbd2cSJim Jagielski     mpSalMenu = NULL;
401*b1cdbd2cSJim Jagielski }
402*b1cdbd2cSJim Jagielski 
~WinSalMenuItem()403*b1cdbd2cSJim Jagielski WinSalMenuItem::~WinSalMenuItem()
404*b1cdbd2cSJim Jagielski {
405*b1cdbd2cSJim Jagielski     if( mpSalMenu )
406*b1cdbd2cSJim Jagielski         ImplRemoveItemById( mpSalMenu, mnId );
407*b1cdbd2cSJim Jagielski }
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------
410*b1cdbd2cSJim Jagielski 
411