xref: /haiku/src/tests/kits/interface/menu/menuworld/BitmapMenuItem.cpp (revision 21258e2674226d6aa732321b6f8494841895af5f)
1 //--------------------------------------------------------------------
2 //
3 //	BitmapMenuItem.cpp
4 //
5 //	Written by: Owen Smith
6 //
7 //--------------------------------------------------------------------
8 
9 /*
10 	Copyright 1999, Be Incorporated.   All Rights Reserved.
11 	This file may be used under the terms of the Be Sample Code License.
12 */
13 
14 #include "BitmapMenuItem.h"
15 #include "constants.h"
16 
17 //====================================================================
18 //	BitmapMenuItem Implementation
19 
20 
21 
22 //--------------------------------------------------------------------
23 //	BitmapMenuItem constructors, destructors, operators
24 
25 BitmapMenuItem::BitmapMenuItem(const char* name, const BBitmap& bitmap,
26 	BMessage* message, char shortcut, uint32 modifiers)
27 	: BMenuItem(name, message, shortcut, modifiers),
28 	m_bitmap(bitmap.Bounds(), bitmap.ColorSpace())
29 {
30 	// Sadly, operator= for bitmaps is not yet implemented.
31 	// Half of m_bitmap's initialization is above; now we copy
32 	// the bits.
33 	m_bitmap.SetBits(bitmap.Bits(), bitmap.BitsLength(),
34 		0, bitmap.ColorSpace());
35 }
36 
37 
38 
39 //--------------------------------------------------------------------
40 //	BitmapMenuItem constructors, destructors, operators
41 
42 void BitmapMenuItem::Draw(void)
43 {
44 	BMenu* menu = Menu();
45 	if (menu) {
46 		BRect itemFrame = Frame();
47 		BRect bitmapFrame = itemFrame;
48 		bitmapFrame.InsetBy(2, 2); // account for 2-pixel margin
49 
50 		menu->SetDrawingMode(B_OP_COPY);
51 		menu->SetHighColor(BKG_GREY);
52 		menu->FillRect(itemFrame);
53 		menu->DrawBitmap(&m_bitmap, bitmapFrame);
54 
55 		if (IsSelected()) {
56 			// a nonstandard but simple way to draw highlights
57 			menu->SetDrawingMode(B_OP_INVERT);
58 			menu->SetHighColor(0,0,0);
59 			menu->FillRect(itemFrame);
60 		}
61 	}
62 }
63 
64 void BitmapMenuItem::GetContentSize(float* width, float* height)
65 {
66 	GetBitmapSize(width, height);
67 }
68 
69 
70 
71 //--------------------------------------------------------------------
72 //	BitmapMenuItem accessors
73 
74 void BitmapMenuItem::GetBitmapSize(float* width, float* height)
75 {
76 	BRect r = m_bitmap.Bounds();
77 	*width = r.Width() + 4; // 2-pixel boundary on either side
78 	*height = r.Height() + 4; // 2-pixel boundary on top/bottom
79 }
80