1 /* 2 * Copyright 2001-2009, Haiku, Inc. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Stefano Ceccherini (stefano.ceccherini@gmail.com) 7 */ 8 9 #include <MenuPrivate.h> 10 11 #include <Bitmap.h> 12 #include <Menu.h> 13 14 const unsigned char kCtrlBits[] = { 15 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14, 16 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 17 0x1d,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 18 0x1d,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, 19 0x1d,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, 20 0x1d,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, 21 0x1d,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, 22 0x1d,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14, 23 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 24 0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14, 25 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14 26 }; 27 28 29 const unsigned char kAltBits[] = { 30 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14, 31 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 32 0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 33 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14, 34 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, 35 0x1d,0x1a,0x1a,0x04,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, 36 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, 37 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x17,0x14, 38 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 39 0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14, 40 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14 41 }; 42 43 44 const unsigned char kOptBits[] = { 45 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14, 46 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 47 0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 48 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14, 49 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x17,0x14, 50 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, 51 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, 52 0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, 53 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 54 0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14, 55 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14 56 }; 57 58 59 const unsigned char kShiftBits[] = { 60 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14, 61 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 62 0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 63 0x1d,0x1a,0x1a,0x04,0x17,0x17,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14, 64 0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, 65 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, 66 0x1d,0x1a,0x1a,0x04,0x17,0x17,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, 67 0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, 68 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 69 0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14, 70 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14 71 }; 72 73 namespace BPrivate { 74 75 76 BBitmap* MenuPrivate::sMenuItemAlt; 77 BBitmap* MenuPrivate::sMenuItemControl; 78 BBitmap* MenuPrivate::sMenuItemOption; 79 BBitmap* MenuPrivate::sMenuItemShift; 80 81 82 MenuPrivate::MenuPrivate(BMenu *menu) 83 : 84 fMenu(menu) 85 { 86 } 87 88 89 menu_layout 90 MenuPrivate::Layout() const 91 { 92 return fMenu->Layout(); 93 } 94 95 96 void 97 MenuPrivate::ItemMarked(BMenuItem *item) 98 { 99 fMenu->_ItemMarked(item); 100 } 101 102 103 void 104 MenuPrivate::CacheFontInfo() 105 { 106 fMenu->_CacheFontInfo(); 107 } 108 109 110 float 111 MenuPrivate::FontHeight() const 112 { 113 return fMenu->fFontHeight; 114 } 115 116 117 float 118 MenuPrivate::Ascent() const 119 { 120 return fMenu->fAscent; 121 } 122 123 124 BRect 125 MenuPrivate::Padding() const 126 { 127 return fMenu->fPad; 128 } 129 130 131 void 132 MenuPrivate::GetItemMargins(float *left, float *top, 133 float *right, float *bottom) const 134 { 135 fMenu->GetItemMargins(left, top, right, bottom); 136 } 137 138 139 /* static */ 140 bool 141 MenuPrivate::IsAltCommandKey() 142 { 143 return BMenu::sAltAsCommandKey; 144 } 145 146 147 int 148 MenuPrivate::State(BMenuItem **item) const 149 { 150 return fMenu->_State(item); 151 } 152 153 154 void 155 MenuPrivate::Install(BWindow *window) 156 { 157 fMenu->_Install(window); 158 } 159 160 161 void 162 MenuPrivate::Uninstall() 163 { 164 fMenu->_Uninstall(); 165 } 166 167 168 void 169 MenuPrivate::SetSuper(BMenu *menu) 170 { 171 fMenu->fSuper = menu; 172 } 173 174 175 void 176 MenuPrivate::SetSuperItem(BMenuItem *item) 177 { 178 fMenu->fSuperitem = item; 179 } 180 181 182 void 183 MenuPrivate::InvokeItem(BMenuItem *item, bool now) 184 { 185 fMenu->_InvokeItem(item, now); 186 } 187 188 189 void 190 MenuPrivate::QuitTracking(bool thisMenuOnly) 191 { 192 fMenu->_QuitTracking(thisMenuOnly); 193 } 194 195 196 /* static */ 197 status_t 198 MenuPrivate::CreateBitmaps() 199 { 200 BRect smallRect(0, 0, 16, 10); 201 BRect largeRect(0, 0, 21, 10); 202 try { 203 sMenuItemAlt = new BBitmap(smallRect, B_CMAP8); 204 sMenuItemControl = new BBitmap(smallRect, B_CMAP8); 205 sMenuItemOption = new BBitmap(smallRect, B_CMAP8); 206 sMenuItemShift = new BBitmap(largeRect, B_CMAP8); 207 } catch (...) { 208 return B_NO_MEMORY; 209 } 210 211 sMenuItemAlt->ImportBits(kAltBits, sizeof(kAltBits), 212 17, 0, B_CMAP8); 213 sMenuItemControl->ImportBits(kCtrlBits, sizeof(kCtrlBits), 214 17, 0, B_CMAP8); 215 sMenuItemOption->ImportBits(kOptBits, sizeof(kOptBits), 216 17, 0, B_CMAP8); 217 sMenuItemShift->ImportBits(kShiftBits, sizeof(kShiftBits), 218 22, 0, B_CMAP8); 219 220 return B_OK; 221 } 222 223 224 /* static */ 225 void 226 MenuPrivate::DeleteBitmaps() 227 { 228 delete sMenuItemAlt; 229 delete sMenuItemControl; 230 delete sMenuItemOption; 231 delete sMenuItemShift; 232 } 233 234 235 /* static */ 236 const BBitmap * 237 MenuPrivate::MenuItemCommand() 238 { 239 if (BMenu::sAltAsCommandKey) 240 return sMenuItemAlt; 241 242 return sMenuItemControl; 243 } 244 245 246 /* static */ 247 const BBitmap * 248 MenuPrivate::MenuItemControl() 249 { 250 if (BMenu::sAltAsCommandKey) 251 return sMenuItemControl; 252 253 return sMenuItemAlt; 254 } 255 256 257 /* static */ 258 const BBitmap * 259 MenuPrivate::MenuItemOption() 260 { 261 return sMenuItemOption; 262 } 263 264 265 /* static */ 266 const BBitmap * 267 MenuPrivate::MenuItemShift() 268 { 269 return sMenuItemShift; 270 } 271 272 273 } // namespace BPrivate 274