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  if (weEventCode == weErrorOccurred)
41  {
42  wimp_error(pebLastError->errmess, WIMPERROR_CANCELBOX);
43  return;
44  }
45  PollEvent(weEventCode, twbWimpPollBlock);
46  }
47 }
48 
49 bool
50 CTask::PollEvent(eWimpEvent weEventCode, tWimpBlock& kwbPollBlock)
51 {
52  const CWindow* kpwWindow;
53 
54  switch (weEventCode)
55  {
56  case weOpenWindowRequest:
57  kpwWindow = FindWindow(kwbPollBlock.wobOpenRequest.whWindow);
58  if (kpwWindow != NULL)
59  {
60  CWindow* pwWindow = const_cast<CWindow*>(kpwWindow);
61  pwWindow->Open(kwbPollBlock.wobOpenRequest);
62  }
63  break;
64  case weCloseWindowRequest:
65  kpwWindow = FindWindow(kwbPollBlock.wobCloseRequest.whWindow);
66  if (kpwWindow != NULL)
67  {
68  CWindow* pwWindow = const_cast<CWindow*>(kpwWindow);
69  pwWindow->Close();
70  }
71  break;
72  case weMouseClick:
73  kpwWindow = FindWindow(kwbPollBlock.mcbMouseClick.whWindow);
74  if (kpwWindow != NULL)
75  {
76  CWindow* pwWindow = const_cast<CWindow*>(kpwWindow);
77  pwWindow->Clicked(kwbPollBlock.mcbMouseClick);
78  }
79  break;
80  case weMenuSelection:
81  if (m_kpmCurrentMenu != NULL)
82  {
83  tMouseClickBlock mcbPointer;
84  wimp_getpointerinfo(&mcbPointer);
85  eMenuHandled mhValue = m_kpmCurrentMenu->Clicked(kwbPollBlock.msbMenuSelection.iaSelectedItems);
86  if (mhValue == mhHandledClose || mcbPointer.bcButtons.adjust == 0)
87  {
88  return true;
89  }
90 
91  if (mhValue == mhHandledKeepOpenRecreate)
92  {
93  m_kpmCurrentMenu->PopulateMenu();
94  }
95 
96  wimp_createmenu(&(m_kpmCurrentMenu->GetMenu()->mMenu), m_lCurrentMenuLocation.cX, m_lCurrentMenuLocation.cY);
97  return true;
98  }
99  break;
100  case weUserMessage:
101  switch (kwbPollBlock.umbUserMessage.wmaAction)
102  {
103  case wmaMessageQuit:
104  Stop();
105  return true;
106  }
107  break;
108  case weUserMessageRecorded:
109  switch (kwbPollBlock.umbUserMessage.wmaAction)
110  {
111  case wmaMessagePrequit:
112  if (PreQuit() == false)
113  {
114  AcknowledgeMessage(kwbPollBlock.umbUserMessage);
115  }
116  return true;
117  }
118  break;
119  }
120 
121  return false;
122 }
123 
124 void
126 {
127  rumbMessageBlock.iYourRef = rumbMessageBlock.iMyRef;
128  ::wimp_sendmessage(weUserMessageAcknowledged, &rumbMessageBlock);
129 }
130 
131 void
132 CTask::AcknowledgeMessage(const eWimpMessageAction kwmaActionCode, tUserMessageBlock& rumbMessageBlock)
133 {
134  rumbMessageBlock.wmaAction = kwmaActionCode;
135  rumbMessageBlock.iYourRef = rumbMessageBlock.iMyRef;
136  ::wimp_sendmessage(weUserMessageAcknowledged, &rumbMessageBlock);
137 }
138 
139 void
140 CTask::RegisterWindow(const CWindow* kpcwWindow)
141 {
142  m_lkpwWindows.push_back(kpcwWindow);
143 }
144 
145 void
147 {
148  m_lkpwWindows.remove(kpcwWindow);
149 }
150 
151 const CWindow*
152 CTask::FindWindow(const tWindowHandle kwhWindow)
153 {
154  for (std::list<const CWindow*>::iterator it = m_lkpwWindows.begin(); it != m_lkpwWindows.end(); ++it)
155  {
156  if (kwhWindow == (*it)->Handle())
157  {
158  return *it;
159  }
160  }
161 
162  return NULL;
163 }
164 
165 void
166 CTask::OpenMenu(CMenu* kpmMenu, tLocation& rlLocation)
167 {
168  m_kpmCurrentMenu = kpmMenu;
169  m_lCurrentMenuLocation.cX = rlLocation.cX;
170  m_lCurrentMenuLocation.cY = rlLocation.cY;
171  wimp_createmenu(&(kpmMenu->GetMenu()->mMenu), rlLocation.cX, rlLocation.cY);
172 }
173 
174 
175 CTask* CTask::sm_pctCurrent = NULL;
176 
177 }
void AcknowledgeMessage(tUserMessageBlock &rumbMessageBlock)
Definition: task.cpp:125
tMenu mMenu
Definition: menu.h:23
const tCheckedMenu * GetMenu()
Definition: menu.h:61
const CWindow * FindWindow(const tWindowHandle kwhWindow)
Definition: task.cpp:152
virtual void Close()
Definition: window.h:59
void Poll()
Definition: task.cpp:35
void DeregisterWindow(const CWindow *kpwWindow)
Definition: task.cpp:146
virtual bool PollEvent(eWimpEvent weEventCode, tWimpBlock &rwbWimpBlock)
Definition: task.cpp:50
void OpenMenu(CMenu *kpmMenu, tLocation &rlLocation)
Definition: task.cpp:166
void RegisterWindow(const CWindow *kpwWindow)
Definition: task.cpp:140
virtual bool Clicked(const tMouseClickBlock &rkmcbClickBlock)
Definition: window.cpp:138
virtual void Open(const tWindowOpenBlock &rkwobOpenBlock)
Definition: window.cpp:153