ROVLib2
RISCOSC++applicationdevelopmentlibrary
menu.cpp
1 #include "menu.h"
2 #include "task.h"
3 #include "errorexception.h"
4 #include "wimp_error.h"
5 #include <stdlib.h>
6 
7 namespace rov2
8 {
9 
10 CMenu::CMenu(const std::string& rksTitle, size_t iMaxSize)
11  : m_sTitle(rksTitle)
12 {
13  m_mcMenu = (tCheckedMenu*)::calloc(sizeof(tMenu) + sizeof(tMenuItem) * iMaxSize, 1);
14  m_mcMenu->uiKey = s_kuiKey;
15  m_mcMenu->pmMenu = this;
16  m_mcMenu->mMenu.kpcaTitle = m_sTitle.c_str();
17  m_mcMenu->mMenu.kpcaValidation = (char*) -1;
18  m_mcMenu->mMenu.iTitleLength = m_sTitle.size();
19  m_mcMenu->mMenu.bTitleBackgroundColour = 2;
20  m_mcMenu->mMenu.bTitleForegroundColour = 7;
21  m_mcMenu->mMenu.bWorkAreaBackgroundColour = 0;
22  m_mcMenu->mMenu.bWorkAreaForegroundColour = 7;
23  m_mcMenu->mMenu.cMenuItemWidth = 16;
24  m_mcMenu->mMenu.cMenuItemHeight = 44;
25  m_mcMenu->mMenu.cVerticalGap = 0;
26 
27  m_iMaxItems = iMaxSize;
28 }
29 
30 CMenu::~CMenu()
31 {
32  if (m_mcMenu != NULL)
33  {
34  free(m_mcMenu);
35  }
36  m_mcMenu = NULL;
37 }
38 
39 eMenuHandled
40 CMenu::Clicked(const unsigned int* kuiaEntries)
41 {
42  return mhUnhandled;
43 }
44 
45 void
47 {
48  if (m_lpmiItems.size() == m_iMaxItems)
49  {
50  throw new CErrorException("Too many menu items created");
51  }
52 
53  m_lpmiItems.push_back(pmiItem);
54 }
55 
58 {
59  tLocation rlSize({ 0,0 });
60 
61  tMenuItem* pmiItem = &m_mcMenu->mMenu.miMenuItems[0];
62  for (std::list<CMenuItem*>::iterator it = m_lpmiItems.begin(); it != m_lpmiItems.end(); ++it)
63  {
64  int itemWidth = (*it)->PopulateMenu(pmiItem);
65  rlSize.cY += 44;
66  if (pmiItem->mfMenuFlags.mfDottedLine)
67  {
68  rlSize.cY += 24;
69  }
70 
71  if (rlSize.cX < itemWidth)
72  {
73  rlSize.cX = itemWidth;
74  }
75  pmiItem++;
76  }
77  m_mcMenu->mMenu.miMenuItems[0].mfMenuFlags.mfTitleIsIndirectText = 1;
78  pmiItem--;
79  pmiItem->mfMenuFlags.mfLastItem = 1;
80 
81  // Set the size
82  m_mcMenu->mMenu.cMenuItemWidth = rlSize.cX;
83 
84  return rlSize;
85 }
86 
87 void
89 {
90  tMouseClickBlock mcbPointer;
91  wimp_getpointerinfo(&mcbPointer);
92  tLocation rlSize = PopulateMenu();
93 
94  mcbPointer.lMouse.cY = 96 + rlSize.cY;
95  mcbPointer.lMouse.cX -= 64;
96 
97  CTask::CurrentTask()->OpenMenu(this, mcbPointer.lMouse);
98 }
99 
100 unsigned int CMenu::s_kuiKey = 0xf74d6e75; // [0xf7]Mnu
101 
102 }
CMenu(const std::string &rksTitle, size_t iMaxItems)
Definition: menu.cpp:10
CMenu * pmMenu
Definition: menu.h:21
tMenu mMenu
Definition: menu.h:23
void DisplayAsIconbarMenu()
Definition: menu.cpp:88
void AddItem(CMenuItem *pmiItem)
Definition: menu.cpp:46
void OpenMenu(CMenu *kpmMenu, tLocation &rlLocation)
Definition: task.cpp:161
unsigned int uiKey
Definition: menu.h:19
virtual eMenuHandled Clicked(const unsigned int *kuiaEntries)
Definition: menu.cpp:40
static CTask * CurrentTask()
Definition: task.h:70
virtual tLocation PopulateMenu()
Definition: menu.cpp:57