1/* 2 * Copyright 2006-2015 Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Stefano Ceccherini (stefano.ceccherini@gmail.com) 7 */ 8 9#ifndef __MENU_PRIVATE_H 10#define __MENU_PRIVATE_H 11 12 13#include <Menu.h> 14 15 16enum menu_states { 17 MENU_STATE_TRACKING = 0, 18 MENU_STATE_TRACKING_SUBMENU = 1, 19 MENU_STATE_KEY_TO_SUBMENU = 2, 20 MENU_STATE_KEY_LEAVE_SUBMENU = 3, 21 MENU_STATE_CLOSED = 5 22}; 23 24 25class BBitmap; 26class BMenu; 27class BWindow; 28 29 30namespace BPrivate { 31 32extern const char* kEmptyMenuLabel; 33 34class MenuPrivate { 35public: 36 MenuPrivate(BMenu* menu); 37 38 menu_layout Layout() const; 39 void SetLayout(menu_layout layout); 40 41 void ItemMarked(BMenuItem* item); 42 void CacheFontInfo(); 43 44 float FontHeight() const; 45 float Ascent() const; 46 BRect Padding() const; 47 void GetItemMargins(float*, float*, float*, float*) 48 const; 49 void SetItemMargins(float, float, float, float); 50 51 int State(BMenuItem** item = NULL) const; 52 53 void Install(BWindow* window); 54 void Uninstall(); 55 void SetSuper(BMenu* menu); 56 void SetSuperItem(BMenuItem* item); 57 void InvokeItem(BMenuItem* item, bool now = false); 58 void QuitTracking(bool thisMenuOnly = true); 59 bool HasSubmenus() { return fMenu->fHasSubmenus; } 60 61 static status_t CreateBitmaps(); 62 static void DeleteBitmaps(); 63 64 static const BBitmap* MenuItemShift(); 65 static const BBitmap* MenuItemControl(); 66 static const BBitmap* MenuItemOption(); 67 static const BBitmap* MenuItemCommand(); 68 static const BBitmap* MenuItemMenu(); 69 70private: 71 BMenu* fMenu; 72 73 static BBitmap* sMenuItemShift; 74 static BBitmap* sMenuItemControl; 75 static BBitmap* sMenuItemOption; 76 static BBitmap* sMenuItemAlt; 77 static BBitmap* sMenuItemMenu; 78 79}; 80 81}; // namespace BPrivate 82 83 84// Note: since sqrt is slow, we don't use it and return the square of the 85// distance 86#define square(x) ((x) * (x)) 87static inline float 88point_distance(const BPoint &pointA, const BPoint &pointB) 89{ 90 return square(pointA.x - pointB.x) + square(pointA.y - pointB.y); 91} 92#undef square 93 94 95#endif // __MENU_PRIVATE_H 96