Imported MenuWorld beos sample code into the repository.

Wrote a jamfile and did some build fix (but doesn't build yet).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37109 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stefano Ceccherini
2010-06-12 07:03:01 +00:00
parent 9623c48284
commit 3f28966548
24 changed files with 2916 additions and 0 deletions
@@ -0,0 +1,79 @@
//--------------------------------------------------------------------
//
// BitmapMenuItem.cpp
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#include "BitmapMenuItem.h"
#include "constants.h"
//====================================================================
// BitmapMenuItem Implementation
//--------------------------------------------------------------------
// BitmapMenuItem constructors, destructors, operators
BitmapMenuItem::BitmapMenuItem(const char* name, const BBitmap& bitmap,
BMessage* message, char shortcut, uint32 modifiers)
: BMenuItem(name, message, shortcut, modifiers),
m_bitmap(bitmap.Bounds(), bitmap.ColorSpace())
{
// Sadly, operator= for bitmaps is not yet implemented.
// Half of m_bitmap's initialization is above; now we copy
// the bits.
m_bitmap.SetBits(bitmap.Bits(), bitmap.BitsLength(),
0, bitmap.ColorSpace());
}
//--------------------------------------------------------------------
// BitmapMenuItem constructors, destructors, operators
void BitmapMenuItem::Draw(void)
{
BMenu* menu = Menu();
if (menu) {
BRect itemFrame = Frame();
BRect bitmapFrame = itemFrame;
bitmapFrame.InsetBy(2, 2); // account for 2-pixel margin
menu->SetDrawingMode(B_OP_COPY);
menu->SetHighColor(BKG_GREY);
menu->FillRect(itemFrame);
menu->DrawBitmap(&m_bitmap, bitmapFrame);
if (IsSelected()) {
// a nonstandard but simple way to draw highlights
menu->SetDrawingMode(B_OP_INVERT);
menu->SetHighColor(0,0,0);
menu->FillRect(itemFrame);
}
}
}
void BitmapMenuItem::GetContentSize(float* width, float* height)
{
GetBitmapSize(width, height);
}
//--------------------------------------------------------------------
// BitmapMenuItem accessors
void BitmapMenuItem::GetBitmapSize(float* width, float* height)
{
BRect r = m_bitmap.Bounds();
*width = r.Width() + 4; // 2-pixel boundary on either side
*height = r.Height() + 4; // 2-pixel boundary on top/bottom
}
@@ -0,0 +1,54 @@
//--------------------------------------------------------------------
//
// BitmapMenuItem.h
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#ifndef _BitmapMenuItem_h
#define _BitmapMenuItem_h
#include <Bitmap.h>
#include <MenuItem.h>
//====================================================================
// CLASS: BitmapMenuItem
class BitmapMenuItem : public BMenuItem
{
//----------------------------------------------------------------
// Constructors, destructors, operators
public:
BitmapMenuItem(const char* name, const BBitmap& bitmap,
BMessage* message, char shortcut = 0,
uint32 modifiers = 0);
//----------------------------------------------------------------
// Virtual member function overrides
protected:
void Draw(void);
void GetContentSize(float* width, float* height);
//----------------------------------------------------------------
// Accessors
public:
void GetBitmapSize(float* width, float* height);
//----------------------------------------------------------------
// Member variables
private:
BBitmap m_bitmap;
};
#endif /* _BitmapMenuItem_h */
@@ -0,0 +1,15 @@
SubDir HAIKU_TOP src tests kits interface menu menuworld ;
Application MenuWorld :
BitmapMenuItem.cpp
constants.cpp
main.cpp
MenuApp.cpp
MenuView.cpp
MenuWindow.cpp
PostDispatchInvoker.cpp
stddlg.cpp
TestMenuBuilder.cpp
ViewLayoutFactory.cpp
: be $(TARGET_LIBSUPC++)
;
@@ -0,0 +1,31 @@
----------------------
Be Sample Code License
----------------------
Copyright 1991-1999, Be Incorporated.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions, and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,50 @@
//--------------------------------------------------------------------
//
// MenuApp.cpp
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#include <Alert.h>
#include "constants.h"
#include "MenuApp.h"
#include "MenuWindow.h"
//====================================================================
// MenuApp Implementation
//--------------------------------------------------------------------
// MenuApp constructors, destructors, operators
MenuApp::MenuApp()
: BApplication(STR_APP_SIG)
{
// empty
}
//--------------------------------------------------------------------
// MenuApp virtual function overrides
void MenuApp::AboutRequested(void)
{
BAlert* aboutBox = new BAlert(STR_ABOUT_TITLE,
STR_ABOUT_DESC, STR_ABOUT_BUTTON);
aboutBox->Go();
}
void MenuApp::ReadyToRun(void)
{
MenuWindow* pWin = new MenuWindow(STR_APP_NAME);
pWin->Show();
}
@@ -0,0 +1,39 @@
//--------------------------------------------------------------------
//
// MenuApp.h
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#ifndef _MenuApp_h
#define _MenuApp_h
#include <Application.h>
//====================================================================
// CLASS: MenuApp
class MenuApp : public BApplication
{
//----------------------------------------------------------------
// Constructors, destructors, operators
public:
MenuApp();
//----------------------------------------------------------------
// Virtual function overrides
public:
void AboutRequested(void);
void ReadyToRun(void);
};
#endif /* _MenuApp_h */
@@ -0,0 +1,563 @@
//--------------------------------------------------------------------
//
// MenuView.cpp
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#include <Alert.h>
#include <Button.h>
#include <CheckBox.h>
#include <Menu.h>
#include <MenuItem.h>
#include <OutlineListView.h>
#include <ScrollView.h>
#include <TextControl.h>
#include <List.h>
#include <string.h>
#include "constants.h"
#include "MenuView.h"
#include "MenuWindow.h"
#include "PostDispatchInvoker.h"
#include "stddlg.h"
#include "ViewLayoutFactory.h"
//====================================================================
// MenuView Implementation
//--------------------------------------------------------------------
// MenuView constructors, destructors, operators
MenuView::MenuView(uint32 resizingMode)
: BView(BRect(0, 0, 0, 0), "Menu View", resizingMode,
B_WILL_DRAW)
{
ViewLayoutFactory aFactory; // for semi-intelligent layout
SetViewColor(BKG_GREY);
// "hide user menus" check box
float fCheck_x = 20.0f;
float fCheck_y = 100.0f;
m_pHideUserCheck = aFactory.MakeCheckBox("Hide User Menus",
STR_HIDE_USER_MENUS, MSG_WIN_HIDE_USER_MENUS,
BPoint(fCheck_x, fCheck_y));
m_pHideUserCheck->SetValue(B_CONTROL_OFF);
AddChild(m_pHideUserCheck);
// "large test icons" check box
fCheck_y = m_pHideUserCheck->Frame().bottom + 10;
m_pLargeTestIconCheck = aFactory.MakeCheckBox("Large Test Icons",
STR_LARGE_TEST_ICONS, MSG_WIN_LARGE_TEST_ICONS,
BPoint(fCheck_x, fCheck_y));
m_pLargeTestIconCheck->SetValue(B_CONTROL_OFF);
AddChild(m_pLargeTestIconCheck);
// "add menu", "add item", "delete" buttons
BList buttons;
float fButton_x = m_pHideUserCheck->Frame().right + 15;
float fButton_y = m_pHideUserCheck->Frame().top;
m_pAddMenuButton = aFactory.MakeButton("Add Menu Bar", STR_ADD_MENU,
MSG_VIEW_ADD_MENU, BPoint(fButton_x, fButton_y));
AddChild(m_pAddMenuButton);
buttons.AddItem(m_pAddMenuButton);
// for purposes of size calculation, use the longest piece
// of text we're going to stuff into the button
const char* addItemText;
float itemLen, sepLen;
itemLen = be_plain_font->StringWidth(STR_ADD_ITEM);
sepLen = be_plain_font->StringWidth(STR_ADD_SEP);
addItemText = (itemLen > sepLen) ? STR_ADD_ITEM : STR_ADD_SEP;
m_pAddItemButton = aFactory.MakeButton("Add Item To Menu",
addItemText, MSG_VIEW_ADD_ITEM,
BPoint(fButton_x, fButton_y));
m_pAddItemButton->SetEnabled(false);
AddChild(m_pAddItemButton);
buttons.AddItem(m_pAddItemButton);
m_pDelButton = aFactory.MakeButton("Delete Menu Bar", STR_DELETE_MENU,
MSG_VIEW_DELETE_MENU, BPoint(fButton_x, fButton_y));
m_pDelButton->SetEnabled(false);
AddChild(m_pDelButton);
buttons.AddItem(m_pDelButton);
// now resize list of buttons to max width
aFactory.ResizeToListMax(buttons, RECT_WIDTH);
// now align buttons along left side
aFactory.Align(buttons, ALIGN_LEFT,
m_pAddItemButton->Frame().Height() + 15);
// now make add menu the default, AFTER we've
// laid out the buttons, since the button bloats
// when it's the default
m_pAddMenuButton->MakeDefault(true);
// item "label" control
float fEdit_left = 20.0f, fEdit_bottom = m_pHideUserCheck->Frame().top - 20;
float fEdit_right = m_pAddItemButton->Frame().right;
m_pLabelCtrl = aFactory.MakeTextControl("Menu Bar Control",
STR_LABEL_CTRL, NULL, BPoint(fEdit_left, fEdit_bottom),
fEdit_right - fEdit_left, CORNER_BOTTOMLEFT);
AddChild(m_pLabelCtrl);
// menu outline view
BRect r;
r.left = m_pAddItemButton->Frame().right + 30;
r.top = 20.0f;
r.right = r.left + 200 - B_V_SCROLL_BAR_WIDTH;
// API quirk here: <= 12 (hscroll height - 2) height
// results in scrollbar drawing error
r.bottom = r.top + 100 - B_H_SCROLL_BAR_HEIGHT;
m_pMenuOutlineView = new BOutlineListView(r, "Menu Outline",
B_SINGLE_SELECTION_LIST, B_FOLLOW_ALL);
m_pMenuOutlineView->SetSelectionMessage(
new BMessage(MSG_MENU_OUTLINE_SEL));
// wrap outline view in scroller
m_pScrollView = new BScrollView("Menu Outline Scroller",
m_pMenuOutlineView, B_FOLLOW_LEFT | B_FOLLOW_TOP, 0,
true, true);
m_pScrollView->SetViewColor(BKG_GREY);
AddChild(m_pScrollView);
}
//--------------------------------------------------------------------
// MenuView virtual function overrides
void MenuView::MessageReceived(BMessage* message)
{
switch (message->what) {
case MSG_VIEW_ADD_MENU:
AddMenu(message);
break;
case MSG_VIEW_DELETE_MENU:
DeleteMenu(message);
break;
case MSG_VIEW_ADD_ITEM:
AddMenuItem(message);
break;
case MSG_MENU_OUTLINE_SEL:
MenuSelectionChanged(message);
break;
case MSG_LABEL_EDIT:
SetButtonState();
break;
default:
BView::MessageReceived(message);
break;
}
}
void MenuView::AllAttached(void)
{
if (! Valid()) {
return;
}
// Set button and view targets (now that window looper is available).
m_pAddMenuButton->SetTarget(this);
m_pDelButton->SetTarget(this);
m_pAddItemButton->SetTarget(this);
m_pMenuOutlineView->SetTarget(this);
// Set button's initial state
SetButtonState();
// Wrap a message filter/invoker around the label control's text field
// that will post us B_LABEL_EDIT msg after the text field processes a
// B_KEY_DOWN message.
m_pLabelCtrl->TextView()->AddFilter(
new PostDispatchInvoker(B_KEY_DOWN, new BMessage(MSG_LABEL_EDIT), this));
// Get one item's height by adding a dummy item to
// the BOutlineListView and calculating its height.
m_pMenuOutlineView->AddItem(new BStringItem("Dummy"));
float itemHeight = m_pMenuOutlineView->ItemFrame(0).Height();
itemHeight++; // account for 1-pixel offset between items
// which eliminates overlap
delete m_pMenuOutlineView->RemoveItem((int32)0);
// Resize outline list view to integral item height.
// fudge factor of 4 comes from 2-pixel space between
// scrollview and outline list view on top & bottom
float viewHeight = 16*itemHeight;
m_pScrollView->ResizeTo(m_pScrollView->Frame().Width(),
viewHeight + B_H_SCROLL_BAR_HEIGHT + 4);
BScrollBar *pBar = m_pScrollView->ScrollBar(B_HORIZONTAL);
if (pBar) {
pBar->SetRange(0, 300);
}
// Resize view to surround contents.
ViewLayoutFactory aFactory;
aFactory.ResizeAroundChildren(*this, BPoint(20,20));
}
//--------------------------------------------------------------------
// MenuView operations
void MenuView::PopulateUserMenu(BMenu* pMenu, int32 index)
{
if ((! pMenu) || (! Valid())) {
return;
}
// blow away all menu items
BMenuItem* pMenuItem = pMenu->RemoveItem((int32)0);
while(pMenuItem) {
delete pMenuItem;
pMenuItem = pMenu->RemoveItem((int32)0);
}
// build menu up from outline list view
BListItem* pListItem = m_pMenuOutlineView->ItemUnderAt(NULL, true, index);
// recursive buildup of menu items
BuildMenuItems(pMenu, pListItem, m_pMenuOutlineView);
}
//--------------------------------------------------------------------
// MenuView message handlers
void MenuView::AddMenu(BMessage* message)
{
if (! Valid()) {
return;
}
const char* menuName = m_pLabelCtrl->Text();
if ((! menuName) || (! *menuName)) {
BAlert* pAlert = new BAlert("Add menu alert",
"Please specify the menu name first.", "OK");
pAlert->Go();
return;
}
m_pMenuOutlineView->AddItem(new BStringItem(menuName));
// add some info and pass to window
BMessage newMsg(MSG_WIN_ADD_MENU);
newMsg.AddString("Menu Name", menuName);
BWindow* pWin = Window();
if (pWin) {
pWin->PostMessage(&newMsg);
}
// Reset the label control and buttons
m_pLabelCtrl->SetText("");
SetButtonState();
}
void MenuView::DeleteMenu(BMessage* message)
{
if (! Valid())
return;
int32 itemCount;
int32 selected = m_pMenuOutlineView->CurrentSelection();
if (selected < 0)
return;
BStringItem* pSelItem = dynamic_cast<BStringItem*>
(m_pMenuOutlineView->ItemAt(selected));
if (! pSelItem)
return;
if (pSelItem->OutlineLevel() == 0) {
// get index of item among items in 0 level
itemCount = m_pMenuOutlineView->CountItemsUnder(NULL, true);
int32 i;
for (i=0; i<itemCount; i++) {
BListItem* pItem = m_pMenuOutlineView->ItemUnderAt(NULL, true, i);
if (pItem == pSelItem) {
break;
}
}
// Stuff the index into the message and pass along to
// the window.
BMessage newMsg(MSG_WIN_DELETE_MENU);
newMsg.AddInt32("Menu Index", i);
BWindow* pWin = Window();
if (pWin) {
pWin->PostMessage(&newMsg);
}
}
// Find & record all subitems of selection, because we'll
// have to delete them after they're removed from the list.
BList subItems;
int32 j;
itemCount = m_pMenuOutlineView->CountItemsUnder(pSelItem, false);
for (j=0; j<itemCount; j++) {
BListItem* pItem = m_pMenuOutlineView->ItemUnderAt(pSelItem, false, j);
subItems.AddItem(pItem);
}
// Note the superitem for reference just below
BStringItem* pSuperitem = dynamic_cast<BStringItem*>
(m_pMenuOutlineView->Superitem(pSelItem));
// Remove selected item and all subitems from
// the outline list view.
m_pMenuOutlineView->RemoveItem(pSelItem); // removes super- and subitems
// Update window status
MenuWindow* pWin = dynamic_cast<MenuWindow*>(Window());
if (pWin) {
const char* itemName = pSelItem->Text();
if (strcmp(itemName, STR_SEPARATOR)) {
pWin->UpdateStatus(STR_STATUS_DELETE_ITEM, itemName);
} else {
pWin->UpdateStatus(STR_STATUS_DELETE_SEPARATOR);
}
}
// Delete the selected item and all subitems
for (j=0; j<itemCount; j++) {
BListItem* pItem = reinterpret_cast<BListItem*>(subItems.ItemAt(j));
delete pItem; // deletes subitems
}
delete pSelItem; // deletes superitem
if (pSuperitem) {
// There's a bug in outline list view which does not
// update the superitem correctly. The only way to do so
// is to remove and add a brand-new superitem afresh.
if (! m_pMenuOutlineView->CountItemsUnder(pSuperitem, true))
{
int32 index = m_pMenuOutlineView->FullListIndexOf(pSuperitem);
m_pMenuOutlineView->RemoveItem(pSuperitem);
BStringItem* pCloneItem = new BStringItem(
pSuperitem->Text(), pSuperitem->OutlineLevel());
m_pMenuOutlineView->AddItem(pCloneItem, index);
delete pSuperitem;
}
}
}
void MenuView::AddMenuItem(BMessage* message)
{
if (! Valid()) {
return;
}
// Add item to outline list view but DON'T update the
// window right away; the actual menu items will be
// created dynamically later on.
int32 selected = m_pMenuOutlineView->CurrentSelection();
if (selected >= 0) {
BListItem* pSelItem = m_pMenuOutlineView->ItemAt(selected);
if (pSelItem) {
int32 level = pSelItem->OutlineLevel() + 1;
int32 index = m_pMenuOutlineView->FullListIndexOf(pSelItem)
+ m_pMenuOutlineView->CountItemsUnder(pSelItem, false) + 1;
const char* itemName = m_pLabelCtrl->Text();
bool bIsSeparator = IsSeparator(itemName);
if (bIsSeparator) {
m_pMenuOutlineView->AddItem(new BStringItem(STR_SEPARATOR, level),
index);
} else {
m_pMenuOutlineView->AddItem(new BStringItem(itemName, level),
index);
}
MenuWindow* pWin = dynamic_cast<MenuWindow*>(Window());
if (pWin) {
if (! bIsSeparator) {
pWin->UpdateStatus(STR_STATUS_ADD_ITEM, itemName);
} else {
pWin->UpdateStatus(STR_STATUS_ADD_SEPARATOR);
}
}
m_pMenuOutlineView->Invalidate(); // outline view doesn't
// invalidate correctly
// Reset the label control the buttons
m_pLabelCtrl->SetText("");
SetButtonState();
}
}
}
void MenuView::MenuSelectionChanged(BMessage* message)
{
SetButtonState();
}
//--------------------------------------------------------------------
// MenuView implementation member functions
void MenuView::BuildMenuItems(BMenu* pMenu, BListItem* pSuperitem,
BOutlineListView* pView)
{
if ((! pMenu) || (! pSuperitem) || (! pView)) {
return;
}
int32 len = pView->CountItemsUnder(pSuperitem, true);
if (len == 0) {
BMenuItem* pEmptyItem = new BMenuItem(STR_MNU_EMPTY_ITEM, NULL);
pEmptyItem->SetEnabled(false);
pMenu->AddItem(pEmptyItem);
}
for (int32 i=0; i<len; i++) {
BStringItem* pItem = dynamic_cast<BStringItem*>
(pView->ItemUnderAt(pSuperitem, true, i));
if (pItem) {
if (pView->CountItemsUnder(pItem, true) > 0) {
// add a submenu & fill it
BMenu* pNewMenu = new BMenu(pItem->Text());
BuildMenuItems(pNewMenu, pItem, pView);
pMenu->AddItem(pNewMenu);
} else {
if (strcmp(pItem->Text(), STR_SEPARATOR)) {
// add a string item
BMessage* pMsg = new BMessage(MSG_USER_ITEM);
pMsg->AddString("Item Name", pItem->Text());
pMenu->AddItem(new BMenuItem(pItem->Text(), pMsg));
} else {
// add a separator item
pMenu->AddItem(new BSeparatorItem());
}
}
}
}
}
bool MenuView::IsSeparator(const char* text) const
{
if (! text) {
return true;
}
if (! *text) {
return true;
}
int32 len = strlen(text);
for (int32 i = 0; i < len; i++) {
char ch = text[i];
if ((ch != ' ') && (ch != '-')) {
return false;
}
}
return true;
}
void MenuView::SetButtonState(void)
{
if (! Valid()) {
return;
}
// See if an item in the outline list is selected
int32 index = m_pMenuOutlineView->CurrentSelection();
bool bIsSelected = (index >= 0);
// If an item is selected, see if the selected
// item is a separator
bool bSeparatorSelected = false;
if (bIsSelected) {
BStringItem* pItem = dynamic_cast<BStringItem*>
(m_pMenuOutlineView->ItemAt(index));
if (pItem) {
bSeparatorSelected = (! strcmp(pItem->Text(), STR_SEPARATOR));
}
}
// Delete: enable if anything is selected
m_pDelButton->SetEnabled(bIsSelected);
// Add Item: enable if anything but a separator is selected
bool bEnableAddItem = bIsSelected && (! bSeparatorSelected);
m_pAddItemButton->SetEnabled(bEnableAddItem);
// Add Menu: enable if there's any text in the label field
const char* labelText = m_pLabelCtrl->Text();
m_pAddMenuButton->SetEnabled(labelText && (*labelText));
// Add Item: text says Add Separator if button is enabled
// and the label field contains separator text,
// Add Item otherwise
const char* itemText;
if (bEnableAddItem && IsSeparator(labelText)) {
itemText = STR_ADD_SEP;
} else {
itemText = STR_ADD_ITEM;
}
m_pAddItemButton->SetLabel(itemText);
// If add item button is enabled, it should be the default
if (bEnableAddItem) {
m_pAddItemButton->MakeDefault(true);
} else {
m_pAddMenuButton->MakeDefault(true);
}
}
bool MenuView::Valid(void)
{
if (! m_pLabelCtrl) {
ierror(STR_NO_LABEL_CTRL);
return false;
}
if (! m_pHideUserCheck) {
ierror(STR_NO_HIDE_USER_CHECK);
return false;
}
if (! m_pLargeTestIconCheck) {
ierror(STR_NO_LARGE_ICON_CHECK);
return false;
}
if (! m_pAddMenuButton) {
ierror(STR_NO_ADDMENU_BUTTON);
return false;
}
if (! m_pAddItemButton) {
ierror(STR_NO_ADDITEM_BUTTON);
return false;
}
if (! m_pDelButton) {
ierror(STR_NO_DELETE_BUTTON);
return false;
}
if (! m_pMenuOutlineView) {
ierror(STR_NO_MENU_OUTLINE);
return false;
}
if (! m_pScrollView) {
ierror(STR_NO_MENU_SCROLL_VIEW);
return false;
}
return true;
}
@@ -0,0 +1,85 @@
//--------------------------------------------------------------------
//
// MenuView.h
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#ifndef _MenuView_h
#define _MenuView_h
#include <View.h>
class BButton;
class BListItem;
class BOutlineListView;
class BStringView;
class BTextControl;
//====================================================================
// CLASS: MenuView
class MenuView : public BView
{
//----------------------------------------------------------------
// Constructors, destructors, operators
public:
MenuView(uint32 resizingMode);
//----------------------------------------------------------------
// Virtual member function overrides
public:
void MessageReceived(BMessage* message);
void AllAttached(void);
//----------------------------------------------------------------
// Operations
public:
void PopulateUserMenu(BMenu* pMenu, int32 index);
//----------------------------------------------------------------
// Message handlers
private:
void AddMenu(BMessage* message);
void DeleteMenu(BMessage* message);
void AddMenuItem(BMessage* message);
void MenuSelectionChanged(BMessage* message);
//----------------------------------------------------------------
// Implementation member functions
private:
void BuildMenuItems(BMenu* pMenu, BListItem* superitem,
BOutlineListView* pView);
bool IsSeparator(const char* text) const;
void SetButtonState(void);
bool Valid(void);
//----------------------------------------------------------------
// Member variables
private:
BTextControl* m_pLabelCtrl;
BCheckBox* m_pHideUserCheck;
BCheckBox* m_pLargeTestIconCheck;
BButton* m_pAddMenuButton;
BButton* m_pDelButton;
BButton* m_pAddItemButton;
BOutlineListView* m_pMenuOutlineView;
BScrollView* m_pScrollView;
};
#endif /* _MenuView_h */
@@ -0,0 +1,358 @@
//--------------------------------------------------------------------
//
// MenuWindow.cpp
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#include <Application.h>
#include <Box.h>
#include <CheckBox.h>
#include <Menu.h>
#include <MenuBar.h>
#include <MenuItem.h>
#include <StringView.h>
#include <stdio.h>
#include <string.h>
#include "constants.h"
#include "MenuView.h"
#include "MenuWindow.h"
#include "stddlg.h"
//====================================================================
// MenuWindow Implementation
#define MAX_TEST_STATUS_CHARS 25
//--------------------------------------------------------------------
// MenuWindow constructors, destructors, operators
MenuWindow::MenuWindow(const char* name)
: BWindow(BRect(60,60,60,60), name, B_TITLED_WINDOW,
B_NOT_RESIZABLE | B_NOT_ZOOMABLE)
{
m_bUsingFullMenuBar = true;
// menu bars
BRect dummyFrame(0, 0, 0, 0);
m_pFullMenuBar = new BMenuBar(dummyFrame, "Full Menu Bar");
m_pHiddenMenuBar = new BMenuBar(dummyFrame, "Menu Bar w. Hidden User Menus");
// File menu
BMenu* pMenu = BuildFileMenu();
if (pMenu) {
m_pFullMenuBar->AddItem(pMenu);
}
pMenu = BuildFileMenu();
if (pMenu) {
m_pHiddenMenuBar->AddItem(pMenu);
}
// Test menu
pMenu = m_testMenuBuilder.BuildTestMenu(B_MINI_ICON);
if (pMenu) {
m_pFullMenuBar->AddItem(pMenu);
}
pMenu = m_testMenuBuilder.BuildTestMenu(B_MINI_ICON);
if (pMenu) {
m_pHiddenMenuBar->AddItem(pMenu);
}
// add child after menus are added so its initially
// calculated app_server bounds take added menus into
// account
AddChild(m_pFullMenuBar);
float menuHeight = m_pFullMenuBar->Bounds().Height();
// Menu view
m_pMenuView = new MenuView(B_FOLLOW_NONE); // don't follow window just yet!
m_pMenuView->MoveBy(0, menuHeight + 1);
AddChild(m_pMenuView);
// Status view
BRect menuViewRect = m_pMenuView->Frame();
float top = menuViewRect.bottom + 1;
font_height plainHeight;
be_plain_font->GetHeight(&plainHeight);
// Simulate a vertical divider by making a BBox where only the top side
// can be seen in the window.
BRect boxFrame;
boxFrame.Set(menuViewRect.left - 2,
top,
menuViewRect.right + 2,
top + plainHeight.ascent + plainHeight.descent + plainHeight.leading + 4);
BBox* pStatusBox = new BBox(boxFrame);
AddChild(pStatusBox);
BRect statusFrame = pStatusBox->Bounds();
statusFrame.InsetBy(2,2);
m_pStatusView = new BStringView(statusFrame, "Status View", STR_STATUS_DEFAULT,
B_FOLLOW_ALL); // don't follow window just yet!
m_pStatusView->SetViewColor(BKG_GREY);
pStatusBox->AddChild(m_pStatusView);
// Resize window dynamically to fit MenuView (and Status View)
float windowWidth = m_pMenuView->Frame().right;
float windowHeight = boxFrame.bottom - 4;
ResizeTo(windowWidth, windowHeight);
}
//--------------------------------------------------------------------
// MenuWindow virtual function overrides
void MenuWindow::MenusBeginning(void)
{
if ((! Valid()) || (! m_bUsingFullMenuBar)) {
return;
}
int32 len = m_pFullMenuBar->CountItems();
for (int32 i = 2; i < len; i++) // skipping File and Test menus
{
BMenu* pMenu = m_pFullMenuBar->SubmenuAt(i);
if (pMenu) {
m_pMenuView->PopulateUserMenu(pMenu, i - 2);
}
}
}
void MenuWindow::MessageReceived(BMessage* message)
{
switch (message->what) {
case MSG_WIN_ADD_MENU:
AddMenu(message);
break;
case MSG_WIN_DELETE_MENU:
DeleteMenu(message);
break;
case MSG_TEST_ITEM:
TestMenu(message);
break;
case MSG_USER_ITEM:
UserMenu(message);
break;
case MSG_WIN_HIDE_USER_MENUS:
ToggleUserMenus(message);
break;
case MSG_WIN_LARGE_TEST_ICONS:
ToggleTestIcons(message);
break;
default:
BWindow::MessageReceived(message);
break;
}
}
bool MenuWindow::QuitRequested(void)
{
be_app->PostMessage(B_QUIT_REQUESTED);
return true;
}
//--------------------------------------------------------------------
// MenuWindow operations
void MenuWindow::UpdateStatus(const char* str1, const char* str2)
{
uint32 lenTotal = 0, len1 = 0, len2 = 0;
if (str1)
len1 = strlen(str1);
if (str2)
len2 = strlen(str2);
lenTotal = len1 + len2;
char* updateText = new char[lenTotal+1];
updateText[0] = '\0'; // in case str1 and str2 are both NULL
if (str1)
strcpy(updateText, str1);
if (str2)
strcpy(updateText + len1, str2);
if (Lock() && Valid()) {
m_pStatusView->SetText(updateText);
Unlock();
}
delete [] updateText;
}
//--------------------------------------------------------------------
// MenuWindow message handlers
void MenuWindow::AddMenu(BMessage* message)
{
if (! Valid()) {
return;
}
const char* menuName;
if (message->FindString("Menu Name", &menuName) == B_OK) {
m_pFullMenuBar->AddItem(new BMenu(menuName));
UpdateStatus(STR_STATUS_ADD_MENU, menuName);
}
}
void MenuWindow::DeleteMenu(BMessage* message)
{
if (! Valid()) {
return;
}
int32 i;
if (message->FindInt32("Menu Index", &i) == B_OK) {
BMenuItem* pItem = m_pFullMenuBar->ItemAt(i+2);
if (pItem) {
// menu index is the above index + 2 (for File and Test menus)
m_pFullMenuBar->RemoveItem(pItem);
UpdateStatus(STR_STATUS_DELETE_MENU, pItem->Label());
delete pItem;
}
}
}
void MenuWindow::TestMenu(BMessage* message)
{
if (! Valid()) {
return;
}
int32 i;
if (message->FindInt32("Item Index", &i) == B_OK) {
char numText[3];
sprintf(numText, "%ld", i);
UpdateStatus(STR_STATUS_TEST, numText);
}
}
void MenuWindow::UserMenu(BMessage* message)
{
if (! Valid()) {
return;
}
const char* itemName;
if (message->FindString("Item Name", &itemName) == B_OK) {
UpdateStatus(STR_STATUS_USER, itemName);
}
}
void MenuWindow::ToggleUserMenus(BMessage* message)
{
if (! Valid()) {
return;
}
void* pSrc;
bool useFullMenus = false;
if (message->FindPointer("source", &pSrc) == B_OK) {
BCheckBox* pCheckBox = reinterpret_cast<BCheckBox*>(pSrc);
useFullMenus = (pCheckBox->Value() == B_CONTROL_OFF);
}
if ((! useFullMenus) && m_bUsingFullMenuBar) {
RemoveChild(m_pFullMenuBar);
AddChild(m_pHiddenMenuBar);
m_bUsingFullMenuBar = false;
} else if (useFullMenus && (! m_bUsingFullMenuBar)) {
RemoveChild(m_pHiddenMenuBar);
AddChild(m_pFullMenuBar);
m_bUsingFullMenuBar = true;
}
}
void MenuWindow::ToggleTestIcons(BMessage* message)
{
if (! Valid()) {
return;
}
void* pSrc;
icon_size size = B_MINI_ICON;
if (message->FindPointer("source", &pSrc) == B_OK) {
BCheckBox* pCheckBox = reinterpret_cast<BCheckBox*>(pSrc);
size = (pCheckBox->Value() == B_CONTROL_ON) ? B_LARGE_ICON : B_MINI_ICON;
}
ReplaceTestMenu(m_pFullMenuBar, size);
ReplaceTestMenu(m_pHiddenMenuBar, size);
}
//--------------------------------------------------------------------
// MenuWindow implementation member functions
bool MenuWindow::Valid(void) const
{
if (! m_pFullMenuBar) {
ierror(STR_NO_FULL_MENU_BAR);
return false;
}
if (! m_pHiddenMenuBar) {
ierror(STR_NO_HIDDEN_MENU_BAR);
return false;
}
if (! m_pMenuView) {
ierror(STR_NO_MENU_VIEW);
return false;
}
if (! m_pStatusView) {
ierror(STR_NO_STATUS_VIEW);
return false;
}
return true;
}
BMenu* MenuWindow::BuildFileMenu(void) const
{
BMenu* pMenu = new BMenu(STR_MNU_FILE);
BMenuItem* pAboutItem = new BMenuItem(STR_MNU_FILE_ABOUT,
new BMessage(B_ABOUT_REQUESTED));
pAboutItem->SetTarget(NULL, be_app);
pMenu->AddItem(pAboutItem);
pMenu->AddSeparatorItem();
pMenu->AddItem(new BMenuItem(STR_MNU_FILE_CLOSE,
new BMessage(B_QUIT_REQUESTED), CMD_FILE_CLOSE));
return pMenu;
}
void MenuWindow::ReplaceTestMenu(BMenuBar* pMenuBar, icon_size size)
{
if (! pMenuBar) {
return;
}
BMenu* pTestMenu = m_testMenuBuilder.BuildTestMenu(size);
if (pTestMenu) {
BMenuItem* pPrevItem = pMenuBar->RemoveItem(1);
if (pPrevItem) {
delete pPrevItem;
}
pMenuBar->AddItem(pTestMenu, 1);
}
}
@@ -0,0 +1,90 @@
//--------------------------------------------------------------------
//
// MenuWindow.h
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#ifndef _MenuWindow_h
#define _MenuWindow_h
#include <Message.h>
#include <Window.h>
#include "TestMenuBuilder.h"
class MenuView;
class BButton;
class BListItem;
class BOutlineListView;
class BStringView;
class BTextControl;
//====================================================================
// CLASS: MenuWindow
class MenuWindow : public BWindow
{
//----------------------------------------------------------------
// Constructors, destructors, operators
public:
MenuWindow(const char* name);
//----------------------------------------------------------------
// Virtual member function overrides
public:
void MenusBeginning(void);
void MessageReceived(BMessage* message);
bool QuitRequested(void);
//----------------------------------------------------------------
// Operations
public:
void UpdateStatus(const char* str1 = NULL,
const char* str2 = NULL);
//----------------------------------------------------------------
// Message handlers
private:
void AddMenu(BMessage* message);
void DeleteMenu(BMessage* message);
void TestMenu(BMessage* message);
void UserMenu(BMessage* message);
void ToggleUserMenus(BMessage* message);
void ToggleTestIcons(BMessage* message);
//----------------------------------------------------------------
// Implementation member functions
private:
bool Valid(void) const;
BMenu* BuildFileMenu(void) const;
void ReplaceTestMenu(BMenuBar* pMenuBar, icon_size size);
//----------------------------------------------------------------
// Member variables
private:
BMenuBar* m_pFullMenuBar;
BMenuBar* m_pHiddenMenuBar;
bool m_bUsingFullMenuBar;
BStringView* m_pStatusView;
MenuView* m_pMenuView;
TestMenuBuilder m_testMenuBuilder;
};
#endif /* _MenuWindow_h */
@@ -0,0 +1,45 @@
//--------------------------------------------------------------------
//
// PostDispatchInvoker.cpp
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#include "PostDispatchInvoker.h"
#include <Looper.h>
//====================================================================
// PostDispatchInvoker Implementation
//--------------------------------------------------------------------
// PostDispatchInvoker constructors, destructors, operators
PostDispatchInvoker::PostDispatchInvoker(uint32 cmdFilter,
BMessage* invokeMsg, BHandler* invokeHandler,
BLooper* invokeLooper)
: BMessageFilter(cmdFilter, NULL),
BInvoker(invokeMsg, invokeHandler, invokeLooper)
{ }
//--------------------------------------------------------------------
// PostDispatchInvoker virtual function overrides
filter_result PostDispatchInvoker::Filter(BMessage* message,
BHandler** target)
{
Looper()->DispatchMessage(message, *target);
BMessage* pInvMsg = Message();
pInvMsg->AddMessage("Dispatched Message", message);
pInvMsg->AddPointer("Dispatch Target", *target);
Invoke();
return B_SKIP_MESSAGE;
}
@@ -0,0 +1,53 @@
//--------------------------------------------------------------------
//
// PostDispatchInvoker.h
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#ifndef _PostDispatchInvoker_h
#define _PostDispatchInvoker_h
#include <MessageFilter.h>
#include <Invoker.h>
//====================================================================
// CLASS: PostDispatchInvoker
// ---------------------------
// A simple kind of message filter which, when it receives a
// message of the target type, dispatches it directly to the
// looper, then posts a message to a specified handler when
// the dispatch is completed. Two fields are appended to the
// message before it is delivered:
// Dispatched Message B_MESSAGE_TYPE
// Dispatch Target B_POINTER_TYPE (BHandler*)
//
// Most message filters are designed to intercept messages
// before they're delievered; this one allows you to do some
// handling after they've been delivered.
class PostDispatchInvoker : public BMessageFilter, public BInvoker
{
//----------------------------------------------------------------
// Constructors, destructors, operators
public:
PostDispatchInvoker(uint32 cmdFilter,
BMessage* invokeMsg, BHandler* invokeHandler,
BLooper* invokeLooper = NULL);
//----------------------------------------------------------------
// Virtual member function overrides
public:
filter_result Filter(BMessage* message, BHandler** target);
};
#endif /* _PostDispatchInvoker_h */
@@ -0,0 +1,584 @@
//--------------------------------------------------------------------
//
// TestIcons.h
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#ifndef _TestIcons_h
#define _TestIcons_h
//--------------------------------------------------------------------
// These icons were generated with the help of the File Types
// preference panel. I created these icons by editing the
// resource file icons, using the File Types preference panel
// and Icon-O-Matic. Then, I selected the menu command
// File>Dump Icons in Icon-O-Matic. Finally, I copied and
// pasted the icon data from the newly generated ~/Bitmaps.h.
#define NUM_TEST_ITEMS_ACROSS 3
#define NUM_TEST_ITEMS_DOWN 2
#define LARGE_ICON_BYTES 1024
const uint8 kLargeIconWidth = 32;
const uint8 kLargeIconHeight = 32;
const color_space kLargeIconColorSpace = B_COLOR_8_BIT;
#define MINI_ICON_BYTES 256
const uint8 kMiniIconWidth = 16;
const uint8 kMiniIconHeight = 16;
const color_space kMiniIconColorSpace = B_COLOR_8_BIT;
//--------------------------------------------------------------------
// Large Test Icons
extern const uint8
kLargeTestIcons[NUM_TEST_ITEMS_DOWN][NUM_TEST_ITEMS_ACROSS][LARGE_ICON_BYTES] =
{
{ /* 1st row */
{ /* Icon 1 */
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x31,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,
0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x31,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,
0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x1b,0x1b,0x1b,0x1b,0x1b
},
{ /* Icon 2 */
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,
0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x26,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x26,0x1b,0x1b,
0x26,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x1b,
0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x1b,0x1b,0x1b,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x26,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x26,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x26,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x26,0x28,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,
0x28,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,
0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x28,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x1b,0x1b,0x1b,0x1b,0x1b
},
{ /* Icon 3 */
0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x39,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3b,0x39,0x39,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3b,0x3b,0x39,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3b,0x39,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3b,0x39,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3b,0x39,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,0x1b,0x3b,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,0x1b,0x1b,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x39,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x39,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x3b,0x39,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x3b,0x39,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3b,0x39,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
0x35,0x35,0x35,0x35,0x35,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3b,0x39,0x39,0x39,0x39,0x35,0x35,0x35,0x35,
0x35,0x39,0x39,0x39,0x39,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3b,0x3b,0x3b,0x3b,0x39,0x39,0x39,0x39,
0x39,0x39,0x3b,0x3b,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3b,0x3b,0x3b,0x3b,
0x3b,0x3b,0x3b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b
}
}, /* end of 1st row */
{ /* Row 2 */
{ /* Icon 4 */
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,
0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,
0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,
0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,
0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0x92,0x92,0x92,0x92,0x92,0xd2,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,
0x52,0x52,0x52,0x52,0x52,0x52,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x92,0x92,0x92,0x92,0x92,0x92,0x92,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b
},
{ /* Icon 5 */
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0xf8,0xf8,0xf8,0xf8,
0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x98,0x98,0x98,
0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0xf8,0xf8,
0xf8,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x98,0x98,
0x98,0xf8,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x1b,
0x1b,0x98,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x1b,0x1b,0x1b,0x1b,
0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x1b,0x1b,0x1b,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xf8,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x98,0xf8,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x98,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x98,0xf8,0xf8,0xf8,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
0xfa,0xfa,0xfa,0xfa,0xf8,0xf8,0x98,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x98,0x98,0x98,0xf8,0xf8,0xf8,0xfa,0xfa,0xfa,0xfa,
0xfa,0xf8,0xf8,0xf8,0xf8,0x98,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x98,0x98,0x98,0xf8,0xf8,0xf8,0xf8,
0xf8,0xf8,0x98,0x98,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x98,0x98,0x98,0x98,
0x98,0x98,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b
},
{ /* Icon 6 */
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xe9,0xe9,
0xe9,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0xef,0xef,
0xef,0xef,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0xef,0x1b,0x1b,
0x1b,0x1b,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,
0x1b,0x1b,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,
0x1b,0x1b,0xef,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0xe0,0xe0,0xe0,
0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xe9,0xe9,
0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xe9,0xef,0xef,0xef,
0xef,0xe9,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0xef,0x1b,0x1b,
0x1b,0xef,0xef,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,
0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xef,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0xef,0xe9,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xef,0xef,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xef,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xef,0xe9,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,
0xe0,0xe0,0xe0,0xe0,0xe9,0xe9,0xe9,0xef,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xef,0xef,0xe9,0xe9,0xe9,0xe9,0xe9,
0xe9,0xe9,0xe9,0xe9,0xe9,0xef,0xef,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xef,0xef,0xef,0xef,0xef,
0xef,0xef,0xef,0xef,0xef,0xef,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b
}
}};
//--------------------------------------------------------------------
// Mini Test Icons
extern const uint8
kMiniTestIcons[NUM_TEST_ITEMS_DOWN][NUM_TEST_ITEMS_ACROSS][MINI_ICON_BYTES] =
{
{ /* 1st row */
{ /* Icon 1 */
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x2a,0x2a,0x2f,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x2a,0x2f,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x1b,0x1b,0x1b,
0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,
0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,
0x1b,0x1b,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2f,0x1b,0x1b,
0x1b,0x1b,0x1b,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x1b,0x1b
},
{ /* Icon 2 */
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,
0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x26,0x26,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,
0x1b,0x1b,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,
0x1b,0x1b,0x1b,0x26,0x26,0x26,0x26,0x1b,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x26,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1b,0x1b,0x1b,
0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,
0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,
0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x26,0x1b,0x1b,
0x1b,0x1b,0x1b,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x1b,0x1b
},
{ /* Icon 3 */
0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,
0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x1b,0x1b,
0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x1b,0x1b,
0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x1b,0x1b,
0x1b,0x1b,0x1b,0x39,0x39,0x39,0x39,0x35,0x35,0x35,0x35,0x35,0x39,0x39,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x39,0x39,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x39,0x39,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x39,0x39,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x39,0x35,0x35,0x35,0x35,0x35,0x1b,0x1b,0x1b,
0x1b,0x1b,0x35,0x35,0x35,0x35,0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x39,0x1b,0x1b,
0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x1b,0x1b,
0x1b,0x1b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x39,0x1b,0x1b,
0x1b,0x1b,0x39,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x39,0x39,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x39,0x39,0x35,0x35,0x35,0x35,0x39,0x39,0x39,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x39,0x39,0x39,0x39,0x39,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b
}
}, /* end of 1st row */
{ /* 2nd row */
{ /* Icon 4 */
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x1b,
0x1b,0x1b,0x52,0x52,0x52,0x52,0x52,0x92,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x1b,
0x1b,0x52,0x52,0x52,0x52,0x52,0x92,0x1b,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x1b,
0x1b,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x1b,
0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x1b,0x1b,
0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0x1b,
0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0x1b,
0x1b,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x92,0x1b,
0x1b,0x1b,0x92,0x92,0x92,0x92,0x92,0x92,0x52,0x52,0x52,0x52,0x92,0x92,0x92,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x52,0x52,0x52,0x52,0x92,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x92,0x92,0x92,0x92,0x1b,0x1b,0x1b
},
{ /* Icon 5 */
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xf8,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xf8,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0x1b,0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xf8,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xf8,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0x1b,0x1b,
0x1b,0x1b,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0xf8,0x1b,0x1b,
0x1b,0x1b,0xf8,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0xf8,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0xf8,0xfa,0xfa,0xfa,0xfa,0xfa,0xf8,0xf8,0xf8,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b
},
{ /* Icon 6 */
0x1b,0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,
0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xe9,0xe0,0xe0,0xe0,0xe0,0xe9,0x1b,0x1b,
0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe9,0xe9,0x1b,0xe9,0xe0,0xe0,0xe0,0xe9,0x1b,0x1b,
0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe9,0x1b,0x1b,0x1b,0xe9,0xe9,0xe9,0xe9,0x1b,0x1b,
0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe9,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,0x1b,
0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xe9,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0x1b,
0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe9,0xe9,0x1b,0xe9,0xe0,0xe0,0xe0,0xe9,0x1b,0x1b,
0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe0,0x1b,0x1b,0xe0,0xe0,0xe0,0xe0,0xe9,0x1b,0x1b,
0x1b,0x1b,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0x1b,0x1b,
0x1b,0x1b,0x1b,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xe9,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe9,0xe9,0x1b,0x1b,0x1b,
0x1b,0x1b,0x1b,0x1b,0x1b,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x1b,0x1b,0x1b,0x1b
}
}};
#endif /* _TestIcons_h */
@@ -0,0 +1,137 @@
//--------------------------------------------------------------------
//
// TestMenuBuilder.cpp
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#include <Font.h>
#include <Menu.h>
#include <MenuItem.h>
#include <Message.h>
#include <stdio.h>
#include <string.h>
#include "constants.h"
#include "TestIcons.h"
#include "TestMenuBuilder.h"
#include "BitmapMenuItem.h"
//====================================================================
// TestMenuBuilder Implementation
#define TEST_NAME_LENGTH 20
//--------------------------------------------------------------------
// TestMenuBuilder entry point
BMenu* TestMenuBuilder::BuildTestMenu(icon_size size)
{
BitmapMenuItem *pItemArray[NUM_TEST_ITEMS_DOWN][NUM_TEST_ITEMS_ACROSS];
BitmapMenuItem *pTypicalItem = NULL;
// fill the array of bitmap menu items
for (int32 i=0; i<NUM_TEST_ITEMS_DOWN; i++) {
for (int32 j=0; j<NUM_TEST_ITEMS_ACROSS; j++) {
BBitmap *pBitmap = LoadTestBitmap(i, j, size);
if (! pBitmap) {
pItemArray[i][j] = NULL;
} else {
int32 itemIndex = NUM_TEST_ITEMS_ACROSS*i + j + 1;
char name[TEST_NAME_LENGTH];
sprintf(name, "%s %ld", STR_MNU_TEST_ITEM, itemIndex);
BMessage* pTestMsg = new BMessage(MSG_TEST_ITEM);
pTestMsg->AddInt32("Item Index", itemIndex);
char shortcut = '0' + itemIndex; // the item's number
BitmapMenuItem *pItem = new BitmapMenuItem(name, *pBitmap,
pTestMsg, shortcut, 0);
pItemArray[i][j] = pItem;
pTypicalItem = pItem;
}
delete pBitmap;
}
}
float menuHeight, menuWidth;
// Simplifying assumption: All test items have same width and height.
// Use pTypicalItem to calculate frames.
if (! pTypicalItem) {
// no items to put in a menu
return NULL;
}
float itemHeight, itemWidth;
pTypicalItem->GetBitmapSize(&itemWidth, &itemHeight);
itemWidth++; // take space between items into account
itemHeight++;
menuWidth = NUM_TEST_ITEMS_ACROSS*itemWidth;
menuHeight = NUM_TEST_ITEMS_DOWN*itemHeight;
// create menu
float left, top;
BRect frame;
BMenu* pMenu = new BMenu(STR_MNU_TEST, menuWidth, menuHeight);
for (int32 i=0; i<NUM_TEST_ITEMS_DOWN; i++) {
for (int32 j=0; j<NUM_TEST_ITEMS_ACROSS; j++) {
BitmapMenuItem* pItem = pItemArray[i][j];
if (pItem) {
left = j*itemWidth;
top = i*itemHeight;
frame.Set(left, top, left + itemWidth - 1,
top + itemHeight - 1);
pMenu->AddItem(pItem, frame);
}
}
}
return pMenu;
}
//--------------------------------------------------------------------
// TestMenuBuilder implementation member functions
BBitmap* TestMenuBuilder::LoadTestBitmap(int32 i, int32 j, icon_size size)
{
BBitmap* pBitmap;
const uint8* bits;
uint32 byteLen;
color_space iconColorSpace;
BRect iconBounds(0,0,0,0);
if ((i < 0) || (j < 0)) {
return NULL;
}
if ((i >= NUM_TEST_ITEMS_DOWN) || (j >= NUM_TEST_ITEMS_ACROSS)) {
return NULL;
}
if (size == B_LARGE_ICON) {
bits = kLargeTestIcons[i][j];
byteLen = LARGE_ICON_BYTES;
iconBounds.right = kLargeIconWidth - 1; // 0 counts as a pixel!
iconBounds.bottom = kLargeIconHeight - 1;
iconColorSpace = kLargeIconColorSpace;
} else {
bits = kMiniTestIcons[i][j];
byteLen = MINI_ICON_BYTES;
iconBounds.right = kMiniIconWidth - 1;
iconBounds.bottom = kMiniIconHeight - 1;
iconColorSpace = kMiniIconColorSpace;
}
pBitmap = new BBitmap(iconBounds, iconColorSpace);
uint8* destBits = (uint8*)pBitmap->Bits();
memcpy(destBits, bits, byteLen);
return pBitmap;
}
@@ -0,0 +1,39 @@
//--------------------------------------------------------------------
//
// TestMenuBuilder.h
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#ifndef _TestMenuBuilder_h
#define _TestMenuBuilder_h
#include <Menu.h>
#include <Mime.h> /* for icon_size */
//====================================================================
// CLASS: TestMenuBuilder
class TestMenuBuilder
{
//----------------------------------------------------------------
// Entry point
public:
BMenu* BuildTestMenu(icon_size size);
//----------------------------------------------------------------
// Implementation member functions
private:
BBitmap* LoadTestBitmap(int32 i, int32 j, icon_size size);
};
#endif /* _TestMenuBuilder_h */
@@ -0,0 +1,261 @@
//--------------------------------------------------------------------
//
// ViewLayoutFactory.cpp
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#include "ViewLayoutFactory.h"
#include <Button.h>
#include <CheckBox.h>
#include <TextControl.h>
#include <View.h>
#include <List.h>
#include <algobase.h>
#include <assert.h>
#include <stdio.h>
template <class T>
inline T average(const T& x, const T& y)
{
return (x + y) / 2;
}
//--------------------------------------------------------------------
// ViewLayoutFactory factory generators
BButton* ViewLayoutFactory::MakeButton(const char* name, const char* label,
uint32 msgID, BPoint pos, corner posRef)
{
BRect dummyFrame(0,0,0,0);
BButton* pButton = new BButton(dummyFrame, name, label,
new BMessage(msgID));
pButton->ResizeToPreferred();
MoveViewCorner(*pButton, pos, posRef);
return pButton;
}
BCheckBox* ViewLayoutFactory::MakeCheckBox(const char* name,
const char* label, uint32 msgID, BPoint pos, corner posRef)
{
BRect dummyFrame(0,0,0,0);
BCheckBox* pCheckBox = new BCheckBox(dummyFrame, name, label,
new BMessage(msgID));
pCheckBox->ResizeToPreferred();
MoveViewCorner(*pCheckBox, pos, posRef);
return pCheckBox;
}
BTextControl* ViewLayoutFactory::MakeTextControl(const char* name,
const char* label, const char* text, BPoint pos, float controlWidth,
corner posRef)
{
// Note: this function is almost identical to the regular
// BTextControl constructor, but it minimizes the label
// width and maximizes the field width, instead of divvying
// them up half-&-half or 2 : 3, and gives the standard
// flexibility of corner positioning.
BRect dummyFrame(0,0,0,0);
BTextControl* pCtrl = new BTextControl(dummyFrame, name, label,
text, NULL);
LayoutTextControl(*pCtrl, pos, controlWidth, posRef);
return pCtrl;
}
void ViewLayoutFactory::LayoutTextControl(BTextControl& control,
BPoint pos, float controlWidth, corner posRef)
{
control.ResizeToPreferred();
BTextView* pTextView = control.TextView();
float widthExpand = controlWidth;
widthExpand -= control.Bounds().Width();
if (widthExpand > 0) {
control.ResizeBy(widthExpand, 0);
pTextView->ResizeBy(widthExpand, 0);
}
MoveViewCorner(control, pos, posRef);
}
//--------------------------------------------------------------------
// ViewLayoutFactory implementation member functions
void ViewLayoutFactory::MoveViewCorner(BView& view, BPoint pos, corner posRef)
{
BRect frame = view.Frame();
BPoint topLeft;
switch (posRef) {
case CORNER_TOPLEFT:
topLeft = pos;
break;
case CORNER_BOTTOMLEFT:
topLeft.x = pos.x;
topLeft.y = pos.y - frame.Height();
break;
case CORNER_TOPRIGHT:
topLeft.x = pos.x - frame.Width();
topLeft.y = pos.y;
break;
case CORNER_BOTTOMRIGHT:
topLeft.x = pos.x - frame.Width();
topLeft.y = pos.y - frame.Height();
break;
}
view.MoveTo(topLeft);
}
void ViewLayoutFactory::Align(BList& viewList, align_side side,
float alignLen)
{
int32 i, len = viewList.CountItems();
if (len <= 1) {
return;
}
// make sure alignment is recognized
if ((side != ALIGN_LEFT) && (side != ALIGN_TOP)
&& (side != ALIGN_RIGHT) && (side != ALIGN_BOTTOM)
&& (side != ALIGN_HCENTER) && (side != ALIGN_VCENTER))
{
return;
}
// find initial location for placement, based on head item
BPoint viewLoc;
BView* pView = reinterpret_cast<BView*>(viewList.ItemAt(0));
if (! pView) {
return;
}
BRect frame = pView->Frame();
switch (side) {
case ALIGN_LEFT:
case ALIGN_TOP:
viewLoc.Set(frame.left, frame.top);
break;
case ALIGN_RIGHT:
viewLoc.Set(frame.right, frame.top);
break;
case ALIGN_BOTTOM:
viewLoc.Set(frame.left, frame.bottom);
break;
case ALIGN_HCENTER:
viewLoc.Set(frame.left, average(frame.top, frame.bottom));
break;
case ALIGN_VCENTER:
viewLoc.Set(average(frame.left, frame.right), frame.top);
printf("Aligning along vcenter\nInitial position: ");
viewLoc.PrintToStream();
break;
}
// align items relative to head item
for (i=1; i<len; i++) {
BView* pView = reinterpret_cast<BView*>(viewList.ItemAt(i));
if (pView) {
switch (side) {
case ALIGN_LEFT:
viewLoc.y += alignLen;
MoveViewCorner(*pView, viewLoc, CORNER_TOPLEFT);
break;
case ALIGN_TOP:
viewLoc.x += alignLen;
MoveViewCorner(*pView, viewLoc, CORNER_TOPLEFT);
break;
case ALIGN_RIGHT:
viewLoc.y += alignLen;
MoveViewCorner(*pView, viewLoc, CORNER_TOPRIGHT);
break;
case ALIGN_BOTTOM:
viewLoc.x += alignLen;
MoveViewCorner(*pView, viewLoc, CORNER_BOTTOMLEFT);
break;
case ALIGN_HCENTER:
{
viewLoc.x += alignLen;
BPoint moveLoc = viewLoc;
BRect r = pView->Frame();
moveLoc.y -= (r.bottom - r.top) / 2;
MoveViewCorner(*pView, moveLoc, CORNER_TOPLEFT);
break;
}
case ALIGN_VCENTER:
{
viewLoc.y += alignLen;
BPoint moveLoc = viewLoc;
BRect r = pView->Frame();
moveLoc.x -= (r.right - r.left) / 2;
MoveViewCorner(*pView, moveLoc, CORNER_TOPLEFT);
break;
}
}
}
}
}
void ViewLayoutFactory::ResizeToListMax(BList& viewList, rect_dim resizeDim,
corner anchor)
{
int32 i, len = viewList.CountItems();
float maxWidth = 0.0f, maxHeight = 0.0f;
float curWidth = 0.0f, curHeight = 0.0f;
// find maximum dimensions
for (i=0; i<len; i++) {
BView* pView = reinterpret_cast<BView*>(viewList.ItemAt(i));
if (pView) {
BRect frame = pView->Frame();
curWidth = frame.Width();
curHeight = frame.Height();
if (curWidth > maxWidth) {
maxWidth = curWidth;
}
if (curHeight > maxHeight) {
maxHeight = curHeight;
}
}
}
// now resize everything in the list based on selected dimension
for (i=0; i<len; i++) {
BView* pView = reinterpret_cast<BView*>(viewList.ItemAt(i));
if (pView) {
float newWidth, newHeight;
BRect frame = pView->Frame();
newWidth = (resizeDim & RECT_WIDTH)
? maxWidth : frame.Width();
newHeight = (resizeDim & RECT_HEIGHT)
? maxHeight : frame.Height();
pView->ResizeTo(newWidth, newHeight);
}
}
}
void ViewLayoutFactory::ResizeAroundChildren(BView& view, BPoint margin)
{
float fMax_x = 0.0f, fMax_y = 0.0f;
int32 numChild = view.CountChildren();
for (int32 i = 0; i < numChild; i++)
{
BView* childView = view.ChildAt(i);
if (childView) {
BRect r = childView->Frame();
fMax_x = max(fMax_x, r.right);
fMax_y = max(fMax_y, r.bottom);
}
}
fMax_x += margin.x;
fMax_y += margin.y;
view.ResizeTo(fMax_x, fMax_y);
}
@@ -0,0 +1,79 @@
//--------------------------------------------------------------------
//
// ViewLayoutFactory.h
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#ifndef _ViewLayoutFactory_h
#define _ViewLayoutFactory_h
#include <SupportDefs.h>
typedef enum { CORNER_TOPLEFT, CORNER_BOTTOMLEFT,
CORNER_TOPRIGHT, CORNER_BOTTOMRIGHT } corner;
// bit flags
typedef enum { RECT_WIDTH = 1, RECT_HEIGHT,
RECT_WIDTH_AND_HEIGHT } rect_dim;
typedef enum { ALIGN_LEFT, ALIGN_TOP, ALIGN_RIGHT,
ALIGN_BOTTOM, ALIGN_HCENTER, ALIGN_VCENTER } align_side;
//====================================================================
// CLASS: ViewLayoutFactory
// ---------------------------
// A class, still under construction, that handles some
// simple view layout problems. Primarily, it creates
// standard Interface Kit views that are automatically
// set to their preferred size. In addition, it provides:
//
// * Positioning of views using any one of the corners of
// the view's rectangle
// * Alignment of a group of views along one edge or center,
// to a specified distance between views.
// * Adjustment of the width or height of a group of views
// to the maximum value represented by the group.
// * Resizing of a view to surround all of its children,
// plus a specified margin on the right and bottom sides.
class ViewLayoutFactory
{
//----------------------------------------------------------------
// Factory generators
public:
BButton* MakeButton(const char* name, const char* label,
uint32 msgID, BPoint pos,
corner posRef = CORNER_TOPLEFT);
BCheckBox* MakeCheckBox(const char* name, const char* label,
uint32 msgID, BPoint pos,
corner posRef = CORNER_TOPLEFT);
BTextControl* MakeTextControl(const char* name, const char* label,
const char* text, BPoint pos, float controlWidth,
corner posRef = CORNER_TOPLEFT);
void LayoutTextControl(BTextControl& control,
BPoint pos, float controlWidth,
corner posRef = CORNER_TOPLEFT);
//----------------------------------------------------------------
// Other operations
public:
void MoveViewCorner(BView& view, BPoint pos,
corner posRef = CORNER_TOPLEFT);
void Align(BList& viewList, align_side side,
float alignLen);
void ResizeToListMax(BList& viewList, rect_dim resizeDim,
corner anchor = CORNER_TOPLEFT);
void ResizeAroundChildren(BView& view, BPoint margin);
};
#endif /* _ViewLayoutFactory_h */
@@ -0,0 +1,9 @@
MenuWorld
This is an application which demostrates customizing menus in the Interface Kit. It ties in with the newsletter article "Mucking With Menus," located at:
http://www.be.com/aboutbe/benewsletter/volume_II/Issue30.html#Workshop
See the About box... for directions on using MenuWorld, and the newsletter article for other salient points.
-- Owen Smith, 29-Jul-98
@@ -0,0 +1,177 @@
//--------------------------------------------------------------------
//
// constants.cpp
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#include "constants.h"
extern const char* STR_APP_SIG
= "application/x-vnd.BeDTS.MenuWorld";
#if defined(LOCALE_USA)
//--------------------------------------------------------------------
// American English Strings
extern const char* STR_APP_NAME
= "MenuWorld";
extern const char* STR_IERROR
= "Internal Error:\n";
extern const char* STR_SEPARATOR
= "--------------------";
extern const char* STR_NO_FULL_MENU_BAR
= "Couldn't find the window's menu bar.";
extern const char* STR_NO_HIDDEN_MENU_BAR
= "Couldn't find the window's hidden menu bar.";
extern const char* STR_NO_MENU_VIEW
= "Couldn't find the window's menu view";
extern const char* STR_NO_STATUS_VIEW
= "Couldn't find the window's status view";
extern const char* STR_NO_LABEL_CTRL
= "Couldn't find the label edit field.";
extern const char* STR_NO_HIDE_USER_CHECK
= "Couldn't find the hide user menus check box.";
extern const char* STR_NO_LARGE_ICON_CHECK
= "Couldn't find the large test icons check box.";
extern const char* STR_NO_ADDMENU_BUTTON
= "Couldn't find the add menu button.";
extern const char* STR_NO_ADDITEM_BUTTON
= "Couldn't find the add menu item button.";
extern const char* STR_NO_DELETE_BUTTON
= "Couldn't find the delete button.";
extern const char* STR_NO_MENU_OUTLINE
= "Couldn't find the menu outline list.";
extern const char* STR_NO_MENU_SCROLL_VIEW
= "Couldn't find the menu outline list scroll view.";
extern const char* STR_MNU_FILE
= "File";
extern const char* STR_MNU_FILE_ABOUT
= "About...";
extern const char* STR_MNU_FILE_CLOSE
= "Close";
extern const char* STR_MNU_TEST
= "Test";
extern const char* STR_MNU_TEST_ITEM
= "Test Item";
extern const char* STR_MNU_EMPTY_ITEM
= "(Empty menu)";
extern const char* STR_LABEL_CTRL
= "Label:";
extern const char* STR_HIDE_USER_MENUS
= "Hide User Menus";
extern const char* STR_LARGE_TEST_ICONS
= "Large Test Icons";
extern const char* STR_ADD_MENU
= "Add Menu";
extern const char* STR_ADD_ITEM
= "Add Item";
extern const char* STR_ADD_SEP
= "Add Separator";
extern const char* STR_DELETE_MENU
= "Delete";
extern const char* STR_STATUS_DEFAULT
= "";
extern const char* STR_STATUS_TEST
= "Test item selected: ";
extern const char* STR_STATUS_USER
= "Menu item selected: ";
extern const char* STR_STATUS_ADD_MENU
= "Added menu: ";
extern const char* STR_STATUS_ADD_ITEM
= "Added menu item: ";
extern const char* STR_STATUS_ADD_SEPARATOR
= "Added separator menu item";
extern const char* STR_STATUS_DELETE_MENU
= "Deleted menu: ";
extern const char* STR_STATUS_DELETE_ITEM
= "Deleted menu item: ";
extern const char* STR_STATUS_DELETE_SEPARATOR
= "Deleted separator menu item";
extern const char* STR_ABOUT_TITLE
= "About MenuWorld";
extern const char* STR_ABOUT_BUTTON
= "Struth!";
extern const char* STR_ABOUT_DESC
= "MenuWorld: a menu editing example\n\n"
"How to use:\n"
" Type some text into the label field, and "
"press \"Add Menu\" to add a menu.\n"
" Select an item in the outline list, and "
"press \"Delete\" to remove it.\n"
" Select an item in the outline list, type "
"some text into the label field, and press "
"\"Add Item\" to add an item under the selected "
"item. If nothing besides spaces or dashes is "
"typed in, a separator item will be created.\n"
" \"Hide User Menus\" hides the menus you've "
"generated.\n"
" \"Large Test Icons\" changes the size of "
"the numbers in the Test menu.";
#endif /* LOCALE_USA */
//--------------------------------------------------------------------
// Shortcuts
extern const char CMD_FILE_CLOSE
= 'W';
extern const char CMD_TEST_ICON_SIZE
= 'I';
//--------------------------------------------------------------------
// Colors
extern const rgb_color BKG_GREY = { 216, 216, 216, 0 };
@@ -0,0 +1,97 @@
//--------------------------------------------------------------------
//
// constants.h
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#ifndef _constants_h
#define _constants_h
#include <GraphicsDefs.h>
//--------------------------------------------------------------------
// Message IDs
const int32 MSG_WIN_ADD_MENU = 'oWAM';
const int32 MSG_WIN_DELETE_MENU = 'oWDM';
const int32 MSG_VIEW_ADD_MENU = 'oVAM';
const int32 MSG_VIEW_DELETE_MENU = 'oVDM';
const int32 MSG_VIEW_ADD_ITEM = 'oVAI';
const int32 MSG_WIN_HIDE_USER_MENUS = 'oWHU';
const int32 MSG_WIN_LARGE_TEST_ICONS = 'oWFM';
const int32 MSG_MENU_OUTLINE_SEL = 'oSMU';
const int32 MSG_TEST_ITEM = 'oWTM';
const int32 MSG_USER_ITEM = 'oWUM';
const int32 MSG_LABEL_EDIT = 'oLED';
//--------------------------------------------------------------------
// Strings
extern const char* STR_APP_SIG;
// Simple localization scheme
#define LOCALE_USA
extern const char* STR_APP_NAME;
extern const char* STR_IERROR;
extern const char* STR_SEPARATOR;
extern const char* STR_NO_FULL_MENU_BAR;
extern const char* STR_NO_HIDDEN_MENU_BAR;
extern const char* STR_NO_MENU_VIEW;
extern const char* STR_NO_STATUS_VIEW;
extern const char* STR_NO_LABEL_CTRL;
extern const char* STR_NO_HIDE_USER_CHECK;
extern const char* STR_NO_LARGE_ICON_CHECK;
extern const char* STR_NO_ADDMENU_BUTTON;
extern const char* STR_NO_ADDITEM_BUTTON;
extern const char* STR_NO_DELETE_BUTTON;
extern const char* STR_NO_MENU_OUTLINE;
extern const char* STR_NO_MENU_SCROLL_VIEW;
extern const char* STR_MNU_FILE;
extern const char* STR_MNU_FILE_ABOUT;
extern const char* STR_MNU_FILE_CLOSE;
extern const char* STR_MNU_TEST;
extern const char* STR_MNU_TEST_ITEM;
extern const char* STR_MNU_EMPTY_ITEM;
extern const char* STR_LABEL_CTRL;
extern const char* STR_HIDE_USER_MENUS;
extern const char* STR_LARGE_TEST_ICONS;
extern const char* STR_ADD_MENU;
extern const char* STR_ADD_ITEM;
extern const char* STR_ADD_SEP;
extern const char* STR_DELETE_MENU;
extern const char* STR_STATUS_DEFAULT;
extern const char* STR_STATUS_TEST;
extern const char* STR_STATUS_USER;
extern const char* STR_STATUS_ADD_MENU;
extern const char* STR_STATUS_ADD_ITEM;
extern const char* STR_STATUS_ADD_SEPARATOR;
extern const char* STR_STATUS_DELETE_SEPARATOR;
extern const char* STR_STATUS_DELETE_MENU;
extern const char* STR_STATUS_DELETE_ITEM;
extern const char* STR_ABOUT_TITLE;
extern const char* STR_ABOUT_BUTTON;
extern const char* STR_ABOUT_DESC;
//--------------------------------------------------------------------
// Shortcuts
extern const char CMD_FILE_CLOSE;
extern const char CMD_TEST_ICON_SIZE;
//--------------------------------------------------------------------
// Colors
extern const rgb_color BKG_GREY;
#endif /* _constants_h */
@@ -0,0 +1,23 @@
//--------------------------------------------------------------------
//
// main.cpp
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#include "MenuApp.h"
int main(void)
{
MenuApp app;
app.Run();
return B_NO_ERROR;
}
@@ -0,0 +1,29 @@
//--------------------------------------------------------------------
//
// stddlg.cpp
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#include <Alert.h>
#include <string.h>
#include "constants.h"
#include "stddlg.h"
void ierror(const char* msg)
{
char* fullMsg = new char[strlen(STR_IERROR) + strlen(msg) + 1];
strcpy(fullMsg, STR_IERROR);
strcpy(fullMsg, msg);
BAlert alert("Internal Error", fullMsg, "OK", NULL, NULL,
B_WIDTH_AS_USUAL, B_STOP_ALERT);
alert.Go();
delete [] fullMsg;
}
@@ -0,0 +1,19 @@
//--------------------------------------------------------------------
//
// stddlg.h
//
// Written by: Owen Smith
//
//--------------------------------------------------------------------
/*
Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License.
*/
#ifndef _stddlg_h
#define _stddlg_h
void ierror(const char* msg);
#endif /* _stddlg_h */