xref: /AOO41X/main/vcl/inc/vcl/menu.hxx (revision 4d7c9de063a797b8b4f3d45e3561e82ad1f8ef1f)
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 #ifndef _SV_MENU_HXX
25 #define _SV_MENU_HXX
26 
27 #include <vcl/sv.h>
28 #include <vcl/dllapi.h>
29 #include <tools/rc.hxx>
30 #include <tools/resid.hxx>
31 #include <vcl/bitmapex.hxx>
32 #include <tools/color.hxx>
33 #include <vcl/vclevent.hxx>
34 #include <com/sun/star/uno/Reference.hxx>
35 
36 struct MenuItemData;
37 class Point;
38 class Size;
39 class Rectangle;
40 class Menu;
41 class MenuItemList;
42 class HelpEvent;
43 class Image;
44 class PopupMenu;
45 class KeyCode;
46 class KeyEvent;
47 class AppBarWindow;
48 class MenuFloatingWindow;
49 class Window;
50 class SalMenu;
51 struct SystemMenuData;
52 
53 namespace com {
54 namespace sun {
55 namespace star {
56 namespace accessibility {
57     class XAccessible;
58 }}}}
59 
60 namespace vcl { struct MenuLayoutData; }
61 
62 // --------------
63 // - Menu-Types -
64 // --------------
65 
66 #define MENU_APPEND             ((sal_uInt16)0xFFFF)
67 #define MENU_ITEM_NOTFOUND      ((sal_uInt16)0xFFFF)
68 
69 #define POPUPMENU_EXECUTE_DOWN  ((sal_uInt16)0x0001)
70 #define POPUPMENU_EXECUTE_UP    ((sal_uInt16)0x0002)
71 #define POPUPMENU_EXECUTE_LEFT  ((sal_uInt16)0x0004)
72 #define POPUPMENU_EXECUTE_RIGHT ((sal_uInt16)0x0008)
73 
74 #define POPUPMENU_NOMOUSEUPCLOSE ((sal_uInt16)0x0010)
75 
76 // By changes you must also change: rsc/vclrsc.hxx
77 enum MenuItemType { MENUITEM_DONTKNOW, MENUITEM_STRING, MENUITEM_IMAGE,
78                     MENUITEM_STRINGIMAGE, MENUITEM_SEPARATOR };
79 
80 // By changes you must also change: rsc/vclrsc.hxx
81 typedef sal_uInt16 MenuItemBits;
82 #define MIB_CHECKABLE           ((MenuItemBits)0x0001)
83 #define MIB_RADIOCHECK          ((MenuItemBits)0x0002)
84 #define MIB_AUTOCHECK           ((MenuItemBits)0x0004)
85 #define MIB_ABOUT               ((MenuItemBits)0x0008)
86 #define MIB_HELP                ((MenuItemBits)0x0010)
87 #define MIB_POPUPSELECT         ((MenuItemBits)0x0020)
88 // not in rsc/vclsrc.hxx because only a prelimitary solution
89 #define MIB_NOSELECT            ((MenuItemBits)0x0040)
90 #define MIB_ICON            ((MenuItemBits)0x0080)
91 #define MIB_TEXT            ((MenuItemBits)0x0100)
92 
93 #define MENU_FLAG_NOAUTOMNEMONICS       0x0001
94 #define MENU_FLAG_HIDEDISABLEDENTRIES   0x0002
95 
96 // overrides default hiding of disabled entries in popup menus
97 #define MENU_FLAG_ALWAYSSHOWDISABLEDENTRIES 0x0004
98 
99 // forces images & toggle visibility for toolbar config popup
100 #define MENU_FLAG_SHOWCHECKIMAGES     0x0008
101 
102 struct ImplMenuDelData
103 {
104     ImplMenuDelData* mpNext;
105     const Menu* mpMenu;
106 
107     explicit ImplMenuDelData( const Menu* );
108     ~ImplMenuDelData();
109 
isDeletedImplMenuDelData110     bool isDeleted() const { return mpMenu == 0; }
111 };
112 
113 // --------
114 // - Menu -
115 // --------
116 
117 struct MenuLogo
118 {
119     BitmapEx    aBitmap;
120     Color       aStartColor;
121     Color       aEndColor;
122 };
123 
124 class VCL_DLLPUBLIC Menu : public Resource
125 {
126     friend class MenuBar;
127     friend class MenuBarWindow;
128     friend class MenuFloatingWindow;
129     friend class PopupMenu;
130     friend class SystemWindow;
131     friend struct ImplMenuDelData;
132 private:
133     ImplMenuDelData*    mpFirstDel;
134     MenuItemList*       pItemList;          // Liste mit den MenuItems
135     MenuLogo*           pLogo;
136     Menu*               pStartedFrom;
137     Window*             pWindow;
138 
139     Link                aActivateHdl;       // Active-Handler
140     Link                aDeactivateHdl;     // Deactivate-Handler
141     Link                aHighlightHdl;      // Highlight-Handler
142     Link                aSelectHdl;         // Highlight-Handler
143 
144     VclEventListeners   maEventListeners;
145     VclEventListeners   maChildEventListeners;
146 
147     XubString           aTitleText;         // PopupMenu-Text
148 
149     sal_uLong               nEventId;
150     sal_uInt16              mnHighlightedItemPos; // for native menues: keeps track of the highlighted item
151     sal_uInt16              nMenuFlags;
152     sal_uInt16              nDefaultItem;       // Id vom Default-Item
153     sal_uInt16              nSelectedId;
154     sal_uInt16              nHighlightedItem;
155     // Fuer Ausgabe:
156     sal_uInt16              nCheckPos;
157     sal_uInt16              nImagePos;
158     sal_uInt16              nTextPos;
159 
160     sal_Bool                bIsMenuBar  : 1,        // Handelt es sich um den MenuBar
161                         bCanceled   : 1,        // Waehrend eines Callbacks abgebrochen
162                         bInCallback : 1,        // In Activate/Deactivate
163                         bKilled     : 1;        // Gekillt...
164 
165     ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > mxAccessible;
166     mutable vcl::MenuLayoutData* mpLayoutData;
167     SalMenu*            mpSalMenu;
168 
169 protected:
170     SAL_DLLPRIVATE void             ImplInit();
171     SAL_DLLPRIVATE void             ImplLoadRes( const ResId& rResId );
172     SAL_DLLPRIVATE Menu*            ImplGetStartMenu();
173     SAL_DLLPRIVATE Menu*            ImplFindSelectMenu();
174     SAL_DLLPRIVATE Menu*            ImplFindMenu( sal_uInt16 nId );
175     SAL_DLLPRIVATE Size             ImplCalcSize( Window* pWin );
176     SAL_DLLPRIVATE sal_Bool             ImplIsVisible( sal_uInt16 nPos ) const;
177     SAL_DLLPRIVATE sal_Bool             ImplIsSelectable( sal_uInt16 nPos ) const;
178     SAL_DLLPRIVATE sal_uInt16           ImplGetVisibleItemCount() const;
179     SAL_DLLPRIVATE sal_uInt16           ImplGetFirstVisible() const;
180     SAL_DLLPRIVATE sal_uInt16           ImplGetPrevVisible( sal_uInt16 nPos ) const;
181     SAL_DLLPRIVATE sal_uInt16           ImplGetNextVisible( sal_uInt16 nPos ) const;
182     SAL_DLLPRIVATE void             ImplPaint( Window* pWin, sal_uInt16 nBorder, long nOffY = 0, MenuItemData* pThisDataOnly = 0, sal_Bool bHighlighted = sal_False, bool bLayout = false ) const;
183     SAL_DLLPRIVATE void             ImplSelect();
184     SAL_DLLPRIVATE void             ImplCallHighlight( sal_uInt16 nHighlightItem );
185     SAL_DLLPRIVATE void             ImplCallEventListeners( sal_uLong nEvent, sal_uInt16 nPos );
186     DECL_DLLPRIVATE_LINK(           ImplCallSelect, Menu* );
187 
188     SAL_DLLPRIVATE void             ImplFillLayoutData() const;
ImplGetSalMenu()189     SAL_DLLPRIVATE SalMenu*         ImplGetSalMenu() { return mpSalMenu; }
190     SAL_DLLPRIVATE void             ImplSetSalMenu( SalMenu *pMenu );
191     SAL_DLLPRIVATE const XubString& ImplGetHelpText( sal_uInt16 nItemId ) const;
192 
193     // returns native check and option menu symbol height;
194     // return value is Max( rCheckHeight, rRadioHeight )
195     SAL_DLLPRIVATE long             ImplGetNativeCheckAndRadioSize( Window*, long& rCheckHeight, long& rRadioHeight, long &rMaxWidth ) const;
196 
197     SAL_DLLPRIVATE void                ImplAddDel( ImplMenuDelData &rDel );
198     SAL_DLLPRIVATE void                ImplRemoveDel( ImplMenuDelData &rDel );
199 public:
200     SAL_DLLPRIVATE void             ImplKillLayoutData() const;
201     SAL_DLLPRIVATE Menu*            ImplGetStartedFrom() const;
202 
203                             Menu();
204     explicit                Menu( sal_Bool bMenuBar );
ImplGetWindow() const205     SAL_DLLPRIVATE Window*  ImplGetWindow() const { return pWindow; }
206 
207 
208     SAL_DLLPRIVATE void ImplSelectWithStart( Menu* pStartMenu = NULL );
209 public:
210     virtual             ~Menu();
211 
212     virtual void        Activate();
213     virtual void        Deactivate();
214     virtual void        Highlight();
215     virtual void        Select();
216     virtual void        RequestHelp( const HelpEvent& rHEvt );
217 
218     void                InsertItem( sal_uInt16 nItemId, const XubString& rStr,
219                                     MenuItemBits nItemBits = 0,
220                                     sal_uInt16 nPos = MENU_APPEND );
221     void                InsertItem( sal_uInt16 nItemId, const Image& rImage,
222                                     MenuItemBits nItemBits = 0,
223                                     sal_uInt16 nPos = MENU_APPEND );
224     void                InsertItem( sal_uInt16 nItemId,
225                                     const XubString& rString, const Image& rImage,
226                                     MenuItemBits nItemBits = 0,
227                                     sal_uInt16 nPos = MENU_APPEND );
228     void                InsertItem( const ResId& rResId, sal_uInt16 nPos = MENU_APPEND );
229     void                InsertSeparator( sal_uInt16 nPos = MENU_APPEND );
230     void                RemoveItem( sal_uInt16 nPos );
231     void                CopyItem( const Menu& rMenu, sal_uInt16 nPos,
232                                   sal_uInt16 nNewPos = MENU_APPEND );
233     void                Clear();
234 
235     void                CreateAutoMnemonics();
236 
SetMenuFlags(sal_uInt16 nFlags)237     void                SetMenuFlags( sal_uInt16 nFlags ) { nMenuFlags = nFlags; }
GetMenuFlags() const238     sal_uInt16              GetMenuFlags() const { return nMenuFlags; }
239 
240     sal_uInt16              GetItemCount() const;
241     sal_uInt16              GetItemId( sal_uInt16 nPos ) const;
242     sal_uInt16              GetItemPos( sal_uInt16 nItemId ) const;
243     MenuItemType        GetItemType( sal_uInt16 nPos ) const;
244     sal_uInt16              GetCurItemId() const;
245     void                    SetHightlightItem( sal_uInt16 nHighlightedItem );
246     sal_uInt16              GetHighlightItem() const;
247 
248     XubString           GetItemAccKeyStrFromPos(sal_uInt16 nPos ) const ;
249 
250     sal_Bool                IsTemporaryItemFromPos(sal_uInt16 nPos ) const;
SetDefaultItem(sal_uInt16 nItemId)251     void                SetDefaultItem( sal_uInt16 nItemId )    { nDefaultItem = nItemId; }
GetDefaultItem() const252     sal_uInt16              GetDefaultItem() const              { return nDefaultItem; }
253 
254     void                SetItemBits( sal_uInt16 nItemId, MenuItemBits nBits );
255     MenuItemBits        GetItemBits( sal_uInt16 nItemId ) const;
256 
257     void                SetUserValue( sal_uInt16 nItemId, sal_uLong nValue );
258     sal_uLong               GetUserValue( sal_uInt16 nItemId ) const;
259 
260     void                SetPopupMenu( sal_uInt16 nItemId, PopupMenu* pMenu );
261     PopupMenu*          GetPopupMenu( sal_uInt16 nItemId ) const;
262 
263     void                SetAccelKey( sal_uInt16 nItemId, const KeyCode& rKeyCode );
264     KeyCode             GetAccelKey( sal_uInt16 nItemId ) const;
265 
266     void                CheckItem( sal_uInt16 nItemId, sal_Bool bCheck = sal_True );
267     sal_Bool                IsItemChecked( sal_uInt16 nItemId ) const;
268 
269     void                SelectItem( sal_uInt16 nItemId );
DeSelect()270     void                DeSelect() { SelectItem( 0xFFFF ); } // MENUITEMPOS_INVALID
271 
272     void                EnableItem( sal_uInt16 nItemId, sal_Bool bEnable = sal_True );
273     sal_Bool                IsItemEnabled( sal_uInt16 nItemId ) const;
274 
275     void                ShowItem( sal_uInt16 nItemId, sal_Bool bVisible = sal_True );
HideItem(sal_uInt16 nItemId)276     void                HideItem( sal_uInt16 nItemId ) { ShowItem( nItemId, sal_False ); }
277 
278     sal_Bool                IsItemVisible( sal_uInt16 nItemId ) const;
279     sal_Bool                IsItemPosVisible( sal_uInt16 nItemPos ) const;
280     sal_Bool                IsMenuVisible() const;
IsMenuBar() const281     sal_Bool                IsMenuBar() const { return bIsMenuBar; }
282 
283     void                RemoveDisabledEntries( sal_Bool bCheckPopups = sal_True, sal_Bool bRemoveEmptyPopups = sal_False );
284     sal_Bool                HasValidEntries( sal_Bool bCheckPopups = sal_True );
285 
286     void                SetItemText( sal_uInt16 nItemId, const XubString& rStr );
287     XubString           GetItemText( sal_uInt16 nItemId ) const;
288 
289     void                SetItemImage( sal_uInt16 nItemId, const Image& rImage );
290     Image               GetItemImage( sal_uInt16 nItemId ) const;
291     void                SetItemImageAngle( sal_uInt16 nItemId, long nAngle10 );
292     long                GetItemImageAngle( sal_uInt16 nItemId ) const;
293     void                SetItemImageMirrorMode( sal_uInt16 nItemId, sal_Bool bMirror );
294     sal_Bool                GetItemImageMirrorMode( sal_uInt16 ) const;
295 
296     void                SetItemCommand( sal_uInt16 nItemId, const XubString& rCommand );
297     const XubString&    GetItemCommand( sal_uInt16 nItemId ) const;
298 
299     void                SetHelpText( sal_uInt16 nItemId, const XubString& rString );
300     const XubString&    GetHelpText( sal_uInt16 nItemId ) const;
301 
302     void                SetTipHelpText( sal_uInt16 nItemId, const XubString& rString );
303     const XubString&    GetTipHelpText( sal_uInt16 nItemId ) const;
304 
305     void                SetHelpCommand( sal_uInt16 nItemId, const XubString& rString );
306     const XubString&    GetHelpCommand( sal_uInt16 nItemId ) const;
307 
308     void                SetHelpId( sal_uInt16 nItemId, const rtl::OString& rHelpId );
309     rtl::OString        GetHelpId( sal_uInt16 nItemId ) const;
310 
SetActivateHdl(const Link & rLink)311     void                SetActivateHdl( const Link& rLink )     { aActivateHdl = rLink; }
GetActivateHdl() const312     const Link&         GetActivateHdl() const                  { return aActivateHdl; }
313 
SetDeactivateHdl(const Link & rLink)314     void                SetDeactivateHdl( const Link& rLink )   { aDeactivateHdl = rLink; }
GetDeactivateHdl() const315     const Link&         GetDeactivateHdl() const                { return aDeactivateHdl; }
316 
SetHighlightHdl(const Link & rLink)317     void                SetHighlightHdl( const Link& rLink )    { aHighlightHdl = rLink; }
GetHighlightHdl() const318     const Link&         GetHighlightHdl() const                 { return aHighlightHdl; }
319 
SetSelectHdl(const Link & rLink)320     void                SetSelectHdl( const Link& rLink )       { aSelectHdl = rLink; }
GetSelectHdl() const321     const Link&         GetSelectHdl() const                    { return aSelectHdl; }
322 
323     void                SetLogo( const MenuLogo& rLogo );
324     void                SetLogo();
HasLogo() const325     sal_Bool                HasLogo() const { return pLogo ? sal_True : sal_False; }
326     MenuLogo            GetLogo() const;
327 
328     void                AddEventListener( const Link& rEventListener );
329     void                RemoveEventListener( const Link& rEventListener );
330     //void                AddChildEventListener( const Link& rEventListener );
331     //void                RemoveChildEventListener( const Link& rEventListener );
332 
333     Menu&               operator =( const Menu& rMenu );
334 
335     // Fuer Menu-'Funktionen'
GetItemList() const336     MenuItemList*       GetItemList() const                     { return pItemList; }
337 
338     // returns the system's menu handle if native menues are supported
339     // pData must point to a SystemMenuData structure
340     sal_Bool                GetSystemMenuData( SystemMenuData* pData ) const;
341 
342     // accessibility helpers
343 
344     // gets the displayed text
345     String GetDisplayText() const;
346     // returns the bounding box for the character at index nIndex
347     // where nIndex is relative to the starting index of the item
348     // with id nItemId (in coordinates of the displaying window)
349     Rectangle GetCharacterBounds( sal_uInt16 nItemId, long nIndex ) const;
350     // -1 is returned if no character is at that point
351     // if an index is found the corresponding item id is filled in (else 0)
352     long GetIndexForPoint( const Point& rPoint, sal_uInt16& rItemID ) const;
353     // returns the number of lines in the result of GetDisplayText()
354     long GetLineCount() const;
355     // returns the interval [start,end] of line nLine
356     // returns [-1,-1] for an invalid line
357     Pair GetLineStartEnd( long nLine ) const;
358     // like GetLineStartEnd but first finds the line number for the item
359     Pair GetItemStartEnd( sal_uInt16 nItemId ) const;
360     // returns the item id for line nLine or 0 if nLine is invalid
361     sal_uInt16 GetDisplayItemId( long nLine ) const;
362     // returns the bounding rectangle for an item at pos nItemPos
363     Rectangle GetBoundingRectangle( sal_uInt16 nItemPos ) const;
364     sal_Bool ConvertPoint( Point& rPoint, Window* pReferenceWindow ) const;
365 
366     ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > GetAccessible();
367     void SetAccessible( const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& rxAccessible );
368 
369     // gets the activation key of the specified item
370     KeyEvent GetActivationKey( sal_uInt16 nItemId ) const;
371 
GetWindow() const372     Window*             GetWindow() const { return pWindow; }
373 
374     void                SetAccessibleName( sal_uInt16 nItemId, const XubString& rStr );
375     XubString           GetAccessibleName( sal_uInt16 nItemId ) const;
376 
377     void                SetAccessibleDescription( sal_uInt16 nItemId, const XubString& rStr );
378     XubString           GetAccessibleDescription( sal_uInt16 nItemId ) const;
GetStartedFromMenu()379     Menu* GetStartedFromMenu(){ return pStartedFrom ;}
380 
381     // returns whether the item a position nItemPos is highlighted or not.
382     bool  IsHighlighted( sal_uInt16 nItemPos ) const;
383 
384     void                HighlightItem( sal_uInt16 nItemPos );
DeHighlight()385     void                DeHighlight() { HighlightItem( 0xFFFF ); } // MENUITEMPOS_INVALID
386 
387 
388     void doLazyDelete();
389 };
390 
391 // -----------
392 // - MenuBar -
393 // -----------
394 
395 class VCL_DLLPUBLIC MenuBar : public Menu
396 {
397     Link                maCloserHdl;
398     Link                maFloatHdl;
399     Link                maHideHdl;
400     sal_Bool                mbCloserVisible;
401     sal_Bool                mbFloatBtnVisible;
402     sal_Bool                mbHideBtnVisible;
403     sal_Bool                mbDisplayable;
404 
405 //#if 0 // _SOLAR__PRIVATE
406     friend class Application;
407     friend class Menu;
408     friend class MenuBarWindow;
409     friend class MenuFloatingWindow;
410     friend class SystemWindow;
411 
412     SAL_DLLPRIVATE static Window*   ImplCreate( Window* pParent, Window* pWindow, MenuBar* pMenu );
413     SAL_DLLPRIVATE static void      ImplDestroy( MenuBar* pMenu, sal_Bool bDelete );
414     SAL_DLLPRIVATE sal_Bool             ImplHandleKeyEvent( const KeyEvent& rKEvent, sal_Bool bFromMenu = sal_True );
415 //#endif
416 
417 public:
418                         MenuBar();
419     explicit            MenuBar( const ResId& );
420                         MenuBar( const MenuBar& rMenu );
421     virtual             ~MenuBar();
422 
423     MenuBar&            operator =( const MenuBar& rMenu );
424 
425     void                ShowCloser( sal_Bool bShow = sal_True );
HasCloser() const426     sal_Bool                HasCloser() const { return mbCloserVisible; }
427     void                ShowFloatButton( sal_Bool bShow = sal_True );
HasFloatButton() const428     sal_Bool                HasFloatButton() const { return mbFloatBtnVisible; }
429     void                ShowHideButton( sal_Bool bShow = sal_True );
HasHideButton() const430     sal_Bool                HasHideButton() const { return mbHideBtnVisible; }
431     void                ShowButtons( sal_Bool bClose, sal_Bool bFloat, sal_Bool bHide );
432 
433     void                SelectEntry( sal_uInt16 nId );
434     sal_Bool                HandleMenuActivateEvent( Menu *pMenu ) const;
435     sal_Bool                HandleMenuDeActivateEvent( Menu *pMenu ) const;
436     sal_Bool                HandleMenuHighlightEvent( Menu *pMenu, sal_uInt16 nEventId ) const;
437     sal_Bool                HandleMenuCommandEvent( Menu *pMenu, sal_uInt16 nEventId ) const;
438     sal_Bool                HandleMenuButtonEvent( Menu *pMenu, sal_uInt16 nEventId ) const;
439 
SetCloserHdl(const Link & rLink)440     void                SetCloserHdl( const Link& rLink )           { maCloserHdl = rLink; }
GetCloserHdl() const441     const Link&         GetCloserHdl() const                        { return maCloserHdl; }
SetFloatButtonClickHdl(const Link & rLink)442     void                SetFloatButtonClickHdl( const Link& rLink ) { maFloatHdl = rLink; }
GetFloatButtonClickHdl() const443     const Link&         GetFloatButtonClickHdl() const              { return maFloatHdl; }
SetHideButtonClickHdl(const Link & rLink)444     void                SetHideButtonClickHdl( const Link& rLink )  { maHideHdl = rLink; }
GetHideButtonClickHdl() const445     const Link&         GetHideButtonClickHdl() const               { return maHideHdl; }
446 
447     //  - by default a menubar is displayable
448     //  - if a menubar is not displayable, its MenuBarWindow will never be shown
449     //    and it will be hidden if it was visible before
450     //  - note: if a menubar is diplayable, this does not necessarily mean that it is currently visible
451     void                SetDisplayable( sal_Bool bDisplayable );
IsDisplayable() const452     sal_Bool                IsDisplayable() const                       { return mbDisplayable; }
453 
454     struct MenuBarButtonCallbackArg
455     {
456         sal_uInt16      nId;             // Id of the button
457         bool        bHighlight;      // highlight on/off
458         MenuBar*    pMenuBar;        // menubar the button belongs to
459     };
460     // add an arbitrary button to the menubar (will appear next to closer)
461     // passed link will be call with a MenuBarButtonCallbackArg on press
462     sal_uInt16              AddMenuBarButton( const Image&, const Link&, sal_uInt16 nPos = 0 );
463     // add an arbitrary button to the menubar (will appear next to closer)
464     // passed link will be call with a MenuBarButtonCallbackArg on press
465     // passed string will be set as tooltip
466     sal_uInt16              AddMenuBarButton( const Image&, const Link&, const String&, sal_uInt16 nPos = 0 );
467     // set the highlight link for additional button with ID nId
468     // highlight link will be called with a MenuBarButtonHighlightArg
469     // the bHighlight member of that struct shall contain the new state
470     void                SetMenuBarButtonHighlightHdl( sal_uInt16 nId, const Link& );
471     // returns the rectangle occupied by the additional button named nId
472     // coordinates are relative to the systemwindiow the menubar is attached to
473     // if the menubar is unattached an empty rectangle is returned
474     Rectangle           GetMenuBarButtonRectPixel( sal_uInt16 nId );
475     void                RemoveMenuBarButton( sal_uInt16 nId );
476 };
477 
operator =(const MenuBar & rMenu)478 inline MenuBar& MenuBar::operator =( const MenuBar& rMenu )
479 {
480     Menu::operator =( rMenu );
481     return *this;
482 }
483 
484 
485 // -------------
486 // - PopupMenu -
487 // -------------
488 
489 class VCL_DLLPUBLIC PopupMenu : public Menu
490 {
491     friend class Menu;
492     friend class MenuFloatingWindow;
493     friend class MenuBarWindow;
494     friend struct MenuItemData;
495 
496 private:
497     Menu**              pRefAutoSubMenu;    // keeps track if a pointer to this Menu is stored in the MenuItemData
498 
ImplGetFloatingWindow() const499     SAL_DLLPRIVATE MenuFloatingWindow*   ImplGetFloatingWindow() const { return (MenuFloatingWindow*)Menu::ImplGetWindow(); }
500 
501 protected:
502     SAL_DLLPRIVATE sal_uInt16                ImplExecute( Window* pWindow, const Rectangle& rRect, sal_uLong nPopupFlags, Menu* pStaredFrom, sal_Bool bPreSelectFirst );
503     SAL_DLLPRIVATE long                  ImplCalcHeight( sal_uInt16 nEntries ) const;
504     SAL_DLLPRIVATE sal_uInt16                ImplCalcVisEntries( long nMaxHeight, sal_uInt16 nStartEntry = 0, sal_uInt16* pLastVisible = NULL ) const;
505 
506 public:
507                         PopupMenu();
508                         PopupMenu( const PopupMenu& rMenu );
509     explicit            PopupMenu( const ResId& );
510     virtual             ~PopupMenu();
511 
SetText(const XubString & rTitle)512     void                SetText( const XubString& rTitle )  { aTitleText = rTitle; }
GetText() const513     const XubString&    GetText() const                     { return aTitleText; }
514 
515     sal_uInt16              Execute( Window* pWindow, const Point& rPopupPos );
516     sal_uInt16              Execute( Window* pWindow, const Rectangle& rRect, sal_uInt16 nFlags = 0 );
517 
518     // Fuer das TestTool
519     void                EndExecute( sal_uInt16 nSelect = 0 );
520     void                SelectEntry( sal_uInt16 nId );
521     void                SetSelectedEntry( sal_uInt16 nId ); // for use by native submenu only
522 
523     static sal_Bool         IsInExecute();
524     static PopupMenu*   GetActivePopupMenu();
525 
526     PopupMenu&          operator =( const PopupMenu& rMenu );
527 };
528 
operator =(const PopupMenu & rMenu)529 inline PopupMenu& PopupMenu::operator =( const PopupMenu& rMenu )
530 {
531     Menu::operator =( rMenu );
532     return *this;
533 }
534 
535 #endif // _SV_MENU_HXX
536 
537