ROVLib2
RISCOSC++applicationdevelopmentlibrary
task.cpp
1 #include "task.h"
2 #include "wimp.h"
3 #include "errorexception.h"
4 #include "wimp_error.h"
5 #include "wimp_menu.h"
6 #include "menu.h"
7 #include <string>
8 
9 // Disable error checking because we aren't checking every possible message
10 #pragma GCC diagnostic ignored "-Wswitch"
11 
12 namespace rov2
13 {
14 
15 CTask::CTask(const std::string& rksTaskName) :
16  m_bExecuting(true)
17 {
18  if (CTask::sm_pctCurrent != NULL)
19  {
20  throw new CErrorException("Unable to create a second task");
21  }
22 
23  CTask::sm_pctCurrent = this;
24  m_thMyTask = ::wimp_init(rksTaskName.c_str());
25 }
26 
27 CTask::~CTask(void)
28 {
29  ::wimp_exit();
30  m_thMyTask = -1;
31  CTask::sm_pctCurrent = NULL;
32 }
33 
34 void
36 {
37  while (m_bExecuting)
38  {
39  eWimpEvent weEventCode = ::wimp_poll();
40  PollEvent(weEventCode, twbWimpPollBlock);
41  }
42 }
43 
44 bool
45 CTask::PollEvent(eWimpEvent weEventCode, tWimpBlock& kwbPollBlock)
46 {
47  const CWindow* kpwWindow;
48 
49  switch (weEventCode)
50  {
51  case weOpenWindowRequest:
52  kpwWindow = FindWindow(kwbPollBlock.wobOpenRequest.whWindow);
53  if (kpwWindow != NULL)
54  {
55  CWindow* pwWindow = const_cast<CWindow*>(kpwWindow);
56  pwWindow->Open(kwbPollBlock.wobOpenRequest);
57  }
58  break;
59  case weCloseWindowRequest:
60  kpwWindow = FindWindow(kwbPollBlock.wobCloseRequest.whWindow);
61  if (kpwWindow != NULL)
62  {
63  CWindow* pwWindow = const_cast<CWindow*>(kpwWindow);
64  pwWindow->Close();
65  }
66  break;
67  case weMouseClick:
68  kpwWindow = FindWindow(kwbPollBlock.mcbMouseClick.whWindow);
69  if (kpwWindow != NULL)
70  {
71  CWindow* pwWindow = const_cast<CWindow*>(kpwWindow);
72  pwWindow->Clicked(kwbPollBlock.mcbMouseClick);
73  }
74  break;
75  case weMenuSelection:
76  if (m_kpmCurrentMenu != NULL)
77  {
78  tMouseClickBlock mcbPointer;
79  wimp_getpointerinfo(&mcbPointer);
80  eMenuHandled mhValue = m_kpmCurrentMenu->Clicked(kwbPollBlock.msbMenuSelection.iaSelectedItems);
81  if (mhValue == mhHandledClose || mcbPointer.bcButtons.adjust == 0)
82  {
83  return true;
84  }
85 
86  if (mhValue == mhHandledKeepOpenRecreate)
87  {
88  m_kpmCurrentMenu->PopulateMenu();
89  }
90 
91  wimp_createmenu(&(m_kpmCurrentMenu->GetMenu()->mMenu), m_lCurrentMenuLocation.cX, m_lCurrentMenuLocation.cY);
92  return true;
93  }
94  break;
95  case weUserMessage:
96  switch (kwbPollBlock.umbUserMessage.wmaAction)
97  {
98  case wmaMessageQuit:
99  Stop();
100  return true;
101  }
102  break;
103  case weUserMessageRecorded:
104  switch (kwbPollBlock.umbUserMessage.wmaAction)
105  {
106  case wmaMessagePrequit:
107  if (PreQuit() == false)
108  {
109  AcknowledgeMessage(kwbPollBlock.umbUserMessage);
110  }
111  return true;
112  }
113  break;
114  }
115 
116  return false;
117 }
118 
119 void
121 {
122  rumbMessageBlock.iYourRef = rumbMessageBlock.iMyRef;
123  ::wimp_sendmessage(weUserMessageAcknowledged, &rumbMessageBlock);
124 }
125 
126 void
127 CTask::AcknowledgeMessage(const eWimpMessageAction kwmaActionCode, tUserMessageBlock& rumbMessageBlock)
128 {
129  rumbMessageBlock.wmaAction = kwmaActionCode;
130  rumbMessageBlock.iYourRef = rumbMessageBlock.iMyRef;
131  ::wimp_sendmessage(weUserMessageAcknowledged, &rumbMessageBlock);
132 }
133 
134 void
135 CTask::RegisterWindow(const CWindow* kpcwWindow)
136 {
137  m_lkpwWindows.push_back(kpcwWindow);
138 }
139 
140 void
142 {
143  m_lkpwWindows.remove(kpcwWindow);
144 }
145 
146 const CWindow*
147 CTask::FindWindow(const tWindowHandle kwhWindow)
148 {
149  for (std::list<const CWindow*>::iterator it = m_lkpwWindows.begin(); it != m_lkpwWindows.end(); ++it)
150  {
151  if (kwhWindow == (*it)->Handle())
152  {
153  return *it;
154  }
155  }
156 
157  return NULL;
158 }
159 
160 void
161 CTask::OpenMenu(CMenu* kpmMenu, tLocation& rlLocation)
162 {
163  m_kpmCurrentMenu = kpmMenu;
164  m_lCurrentMenuLocation.cX = rlLocation.cX;
165  m_lCurrentMenuLocation.cY = rlLocation.cY;
166  wimp_createmenu(&(kpmMenu->GetMenu()->mMenu), rlLocation.cX, rlLocation.cY);
167 }
168 
169 
170 CTask* CTask::sm_pctCurrent = NULL;
171 
172 }
void AcknowledgeMessage(tUserMessageBlock &rumbMessageBlock)
Definition: task.cpp:120
tMenu mMenu
Definition: menu.h:23
const tCheckedMenu * GetMenu()
Definition: menu.h:61
const CWindow * FindWindow(const tWindowHandle kwhWindow)
Definition: task.cpp:147
virtual void Close()
Definition: window.h:59
void Poll()
Definition: task.cpp:35
void DeregisterWindow(const CWindow *kpwWindow)
Definition: task.cpp:141
virtual bool PollEvent(eWimpEvent weEventCode, tWimpBlock &rwbWimpBlock)
Definition: task.cpp:45
void OpenMenu(CMenu *kpmMenu, tLocation &rlLocation)
Definition: task.cpp:161
void RegisterWindow(const CWindow *kpwWindow)
Definition: task.cpp:135
virtual bool Clicked(const tMouseClickBlock &rkmcbClickBlock)
Definition: window.cpp:138
virtual void Open(const tWindowOpenBlock &rkwobOpenBlock)
Definition: window.cpp:153