xref: /haiku/src/tests/kits/interface/menu/menuworld/TestMenuBuilder.cpp (revision 3f28966548baf455f231941a6fbc83552119821d)
1 //--------------------------------------------------------------------
2 //
3 //	TestMenuBuilder.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 <Font.h>
15 #include <Menu.h>
16 #include <MenuItem.h>
17 #include <Message.h>
18 #include <stdio.h>
19 #include <string.h>
20 
21 #include "constants.h"
22 #include "TestIcons.h"
23 #include "TestMenuBuilder.h"
24 #include "BitmapMenuItem.h"
25 
26 //====================================================================
27 //	TestMenuBuilder Implementation
28 
29 #define TEST_NAME_LENGTH		20
30 
31 
32 
33 //--------------------------------------------------------------------
34 //	TestMenuBuilder entry point
35 
BuildTestMenu(icon_size size)36 BMenu* TestMenuBuilder::BuildTestMenu(icon_size size)
37 {
38 	BitmapMenuItem *pItemArray[NUM_TEST_ITEMS_DOWN][NUM_TEST_ITEMS_ACROSS];
39 	BitmapMenuItem *pTypicalItem = NULL;
40 
41 	// fill the array of bitmap menu items
42 	for (int32 i=0; i<NUM_TEST_ITEMS_DOWN; i++) {
43 		for (int32 j=0; j<NUM_TEST_ITEMS_ACROSS; j++) {
44 			BBitmap *pBitmap = LoadTestBitmap(i, j, size);
45 			if (! pBitmap) {
46 				pItemArray[i][j] = NULL;
47 			} else {
48 				int32 itemIndex = NUM_TEST_ITEMS_ACROSS*i + j + 1;
49 				char name[TEST_NAME_LENGTH];
50 				sprintf(name, "%s %ld", STR_MNU_TEST_ITEM, itemIndex);
51 				BMessage* pTestMsg = new BMessage(MSG_TEST_ITEM);
52 				pTestMsg->AddInt32("Item Index", itemIndex);
53 				char shortcut = '0' + itemIndex; // the item's number
54 				BitmapMenuItem *pItem = new BitmapMenuItem(name, *pBitmap,
55 					pTestMsg, shortcut, 0);
56 				pItemArray[i][j] = pItem;
57 				pTypicalItem = pItem;
58 			}
59 			delete pBitmap;
60 		}
61 	}
62 
63 	float menuHeight, menuWidth;
64 
65 	// Simplifying assumption: All test items have same width and height.
66 	// Use pTypicalItem to calculate frames.
67 	if (! pTypicalItem) {
68 		// no items to put in a menu
69 		return NULL;
70 	}
71 	float itemHeight, itemWidth;
72 	pTypicalItem->GetBitmapSize(&itemWidth, &itemHeight);
73 	itemWidth++; // take space between items into account
74 	itemHeight++;
75 
76 	menuWidth = NUM_TEST_ITEMS_ACROSS*itemWidth;
77 	menuHeight = NUM_TEST_ITEMS_DOWN*itemHeight;
78 
79 	// create menu
80 	float left, top;
81 	BRect frame;
82 	BMenu* pMenu = new BMenu(STR_MNU_TEST, menuWidth, menuHeight);
83 	for (int32 i=0; i<NUM_TEST_ITEMS_DOWN; i++) {
84 		for (int32 j=0; j<NUM_TEST_ITEMS_ACROSS; j++) {
85 			BitmapMenuItem* pItem = pItemArray[i][j];
86 			if (pItem) {
87 				left = j*itemWidth;
88 				top = i*itemHeight;
89 				frame.Set(left, top, left + itemWidth - 1,
90 					top + itemHeight - 1);
91 				pMenu->AddItem(pItem, frame);
92 			}
93 		}
94 	}
95 
96 	return pMenu;
97 }
98 
99 //--------------------------------------------------------------------
100 //	TestMenuBuilder implementation member functions
101 
LoadTestBitmap(int32 i,int32 j,icon_size size)102 BBitmap* TestMenuBuilder::LoadTestBitmap(int32 i, int32 j, icon_size size)
103 {
104 	BBitmap* pBitmap;
105 	const uint8* bits;
106 	uint32 byteLen;
107 	color_space iconColorSpace;
108 	BRect iconBounds(0,0,0,0);
109 
110 	if ((i < 0) || (j < 0)) {
111 		return NULL;
112 	}
113 
114 	if ((i >= NUM_TEST_ITEMS_DOWN) || (j >= NUM_TEST_ITEMS_ACROSS)) {
115 		return NULL;
116 	}
117 
118 	if (size == B_LARGE_ICON) {
119 		bits = kLargeTestIcons[i][j];
120 		byteLen = LARGE_ICON_BYTES;
121 		iconBounds.right = kLargeIconWidth - 1; // 0 counts as a pixel!
122 		iconBounds.bottom = kLargeIconHeight - 1;
123 		iconColorSpace = kLargeIconColorSpace;
124 	} else {
125 		bits = kMiniTestIcons[i][j];
126 		byteLen = MINI_ICON_BYTES;
127 		iconBounds.right = kMiniIconWidth - 1;
128 		iconBounds.bottom = kMiniIconHeight - 1;
129 		iconColorSpace = kMiniIconColorSpace;
130 	}
131 
132 	pBitmap = new BBitmap(iconBounds, iconColorSpace);
133 	uint8* destBits = (uint8*)pBitmap->Bits();
134 	memcpy(destBits, bits, byteLen);
135 
136 	return pBitmap;
137 }
138