ROVLib2
RISCOSC++applicationdevelopmentlibrary
window.cpp
1 // ROVLib2
2 // Basic window
3 
4 #include "window.h"
5 #include "task.h"
6 #include "icon.h"
7 #include <string.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include "wimp_error.h"
11 
12 namespace rov2
13 {
14 
15 CWindow::CWindow(const std::string& rksTitle)
16 {
17  strcpy(m_caWindowTitle, rksTitle.c_str());
18 }
19 
20 void
21 CWindow::Create(const tLocation& rklSize)
22 {
23  tWindowCreateBlock wcbWindow;
24  ::memset(&wcbWindow, 0, sizeof(tWindowCreateBlock));
25 
26  if (rklSize.cX < 0)
27  {
28  wcbWindow.lVisibleMinimum.cX = rklSize.cX;
29  wcbWindow.lVisibleMaximum.cX = 0;
30  }
31  else
32  {
33  wcbWindow.lVisibleMaximum.cX = rklSize.cX;
34  wcbWindow.lVisibleMinimum.cX = 0;
35  }
36 
37  if (rklSize.cY < 0)
38  {
39  wcbWindow.lVisibleMinimum.cY = rklSize.cY;
40  wcbWindow.lVisibleMaximum.cY = 0;
41  }
42  else
43  {
44  wcbWindow.lVisibleMaximum.cY = rklSize.cY;
45  wcbWindow.lVisibleMinimum.cY = 0;
46  }
47 
48  wcbWindow.lScrollOffset.cX = 0;
49  wcbWindow.lScrollOffset.cY = 0;
50 
51  wcbWindow.wfFlags.wfIsMoveable = 1;
52  wcbWindow.wfFlags.wfWimpRedrawn = 1;
53  wcbWindow.wfFlags.wfUsesNewBits = 1;
54  wcbWindow.wfFlags.wfHasTitlebar = 1;
55  wcbWindow.wfFlags.wfHasBackIcon = 1;
56  wcbWindow.wfFlags.wfHasCloseIcon = 1;
57 
58  wcbWindow.bTitleForegroundColour = 7;
59  wcbWindow.bTitleBackgroundColour = 2;
60  wcbWindow.bWorkAreaForegroundColour = 7;
61  wcbWindow.bWorkAreaBackgroundColour = 1;
62  wcbWindow.bScrollbarInnerColour = 3;
63  wcbWindow.bScrollbarOuterColour = 1;
64  wcbWindow.bTitleFocusBackgroundColour = 12;
65  wcbWindow.lWorkareaMinimum = wcbWindow.lVisibleMinimum;
66  wcbWindow.lWorkareaMaximum = wcbWindow.lVisibleMaximum;
67 
68  wcbWindow.ifTitleBarIconFlags.ifContainsText = 1;
69  wcbWindow.ifTitleBarIconFlags.ifContentsCentredHorzontally = 1;
70  wcbWindow.ifTitleBarIconFlags.ifDataIndirected = 1;
71  wcbWindow.ifTitleBarIconFlags.ifForegroundColour = 7;
72  wcbWindow.ifTitleBarIconFlags.ifBackgroundColour = 2;
73 
74  wcbWindow.ucMinimumXSize = 1;
75  wcbWindow.ucMinimumYSize = 1;
76 
77  wcbWindow.uWorkareaButtonType = 0;
78  wcbWindow.vpSpriteArea = (void*)1;
79  wcbWindow.idTitleData.indirectedText.pcaTextbuffer = m_caWindowTitle;
80  wcbWindow.idTitleData.indirectedText.kpcaValidationString = (const char*)-1;
81  wcbWindow.idTitleData.indirectedText.iBufferLength = 256;
82 
83  wcbWindow.uiIconCount = 0;
84 
85  Adorn(wcbWindow);
86 
87  m_whHandle = wimp_createwindow(&wcbWindow);
88  if (m_whHandle == 0)
89  {
90  throw ::pebLastError;
91  }
93  Created();
94 }
95 
97 {
98  if (m_whHandle != -1)
99  {
101  wimp_deletewindow(m_whHandle);
102  m_whHandle = -1;
103  }
104 }
105 
106 void CWindow::SetTitle(const std::string& rksNewTitle)
107 {
108  strcpy(m_caWindowTitle, rksNewTitle.c_str());
109 }
110 
111 void
113 {
114  m_lkpwIcons.push_back(kpiIcon);
115 }
116 
117 void
119 {
120  m_lkpwIcons.remove(kpiIcon);
121 }
122 
123 const CIcon*
124 CWindow::FindIcon(const tIconHandle kihIcon)
125 {
126  for (std::list<const CIcon*>::iterator it = m_lkpwIcons.begin(); it != m_lkpwIcons.end(); ++it)
127  {
128  if (kihIcon == (*it)->Handle())
129  {
130  return *it;
131  }
132  }
133 
134  return NULL;
135 }
136 
137 bool
138 CWindow::Clicked(const tMouseClickBlock& rkmcbClickBlock)
139 {
140  const CIcon* kpiIcon = FindIcon(rkmcbClickBlock.ihIcon);
141  if (kpiIcon != NULL)
142  {
143  CIcon* piIcon = const_cast<CIcon*>(kpiIcon);
144  if (piIcon->Clicked(rkmcbClickBlock))
145  {
146  return true;
147  }
148  }
149  return false;
150 }
151 
152 void
153 CWindow::Open(const tWindowOpenBlock& rkwobOpenBlock)
154 {
155  wimp_openwindow(&rkwobOpenBlock);
156 }
157 
158 }
std::list< const CIcon * > m_lkpwIcons
Definition: window.h:100
tWindowHandle m_whHandle
Definition: window.h:97
void DeregisterIcon(const CIcon *kpiIcon)
Definition: window.cpp:118
void DeregisterWindow(const CWindow *kpwWindow)
Definition: task.cpp:141
void Create(const tLocation &rklSize)
Definition: window.cpp:21
virtual void SetTitle(const std::string &rksNewTitle)
Definition: window.cpp:106
virtual bool Clicked(const tMouseClickBlock &rkmcbClickBlock)
Definition: clickable.h:15
static CTask * CurrentTask()
Definition: task.h:70
char m_caWindowTitle[256]
Definition: window.h:91
void RegisterIcon(const CIcon *kpiIcon)
Definition: window.cpp:112
void RegisterWindow(const CWindow *kpwWindow)
Definition: task.cpp:135
const CIcon * FindIcon(const tIconHandle kihIcon)
Definition: window.cpp:124
virtual void Adorn(tWindowCreateBlock &rwcbBlock)
Definition: window.h:88
virtual bool Clicked(const tMouseClickBlock &rkmcbClickBlock)
Definition: window.cpp:138
virtual void Created(void)
Definition: window.h:91
virtual void Open(const tWindowOpenBlock &rkwobOpenBlock)
Definition: window.cpp:153