DCL 3.7.4
Loading...
Searching...
No Matches
Menu.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#ifdef __WINNT__
4#include <windows.h>
5#endif
6
7#include <dcl/List.h>
8#include <dcl/HashMap.h>
9#include <dcl/Numeric.h>
10#include <dcl/Files.h>
11
12#include "ServletMain.h"
13#include "HtmlPage.h"
14#include "Menu.h"
15
16#if __DCL_HAVE_THIS_FILE__
17#undef __THIS_FILE__
18static const char_t __THIS_FILE__[] = __T("fastpage/Menu.cpp");
19#endif
20
21__DCL_BEGIN_NAMESPACE
22
24{
25protected:
27 PointerList __children;
28 String __strTitle;
29 String __strLink;
32
33 friend HtmlMenu;
34public:
37 void assign(
38 TextTemplate* pDest,
39 const Session& session,
40 TextTemplate* ABEGIN,
41 TextTemplate* AEND,
42 TextTemplate* BEGIN,
43 TextTemplate* END,
44 TextTemplate* LINK,
45 TextTemplate* ACTIVE,
46 TextTemplate* CAPTION,
47 TextTemplate* SEPARATOR
48 );
49 void setActive();
50};
51
55
57{
58 PointerList::Iterator itList = __children.begin();
59 for(; itList != __children.end(); itList++)
60 delete (HtmlMenuItem*)(*itList);
61}
62
63void HtmlMenu::parse(const String& strMenu)
64{
65 StringArray lines;
66 strMenu.split(L'\n', lines);
67 HtmlMenuItem* pParent = NULL;
68 HtmlMenuItem* pItem = NULL;
69 StringArray::Iterator itLines = lines.begin();
70 for( ; itLines != lines.end(); itLines++) {
71 (*itLines).trim();
72 StringArray items;
73 (*itLines).split(L',', items);
74 StringArray::Iterator itItems = items.begin();
75 __DCL_TRACE1(L"%ls\n", (*itLines).data());
76 __DCL_ASSERT(itItems != items.end());
77
78 if ((*itItems).compareNoCase(L"BEGIN") == 0)
79 pParent = pItem;
80 else if ((*itItems).compareNoCase(L"END") == 0)
81 pParent = NULL;
82 else {
83 pItem = new HtmlMenuItem();
84 if ((*itItems).compareNoCase(L"SEPARATOR") == 0) {
85
86 }
87 else {
88 if (itItems != items.end()) {
89 pItem->__strTitle = *itItems;
90 ++itItems;
91 if (itItems != items.end()) {
92 pItem->__strLink = *itItems;
93 ++itItems;
94 if (itItems != items.end()) {
95 if (!(*itItems).isEmpty())
96 pItem->__nRoleID = Integer::parse(*itItems, 10, 10);
97 ++itItems;
98 if (itItems != items.end()) {
99 StringArray pages;
100 if ((*itItems).split(L' ', pages) > 0) {
101 StringArray::Iterator itPages = pages.begin();
102 for( ; itPages != pages.end(); itPages++) {
103 __mapPageToItem[Integer::parse(*itPages, 10, -1)]
104 = pItem;
105 }
106 }
107 }
108 }
109 }
110 }
111 }
112
113 if (pParent) {
114 pItem->__pParent = pParent;
115 pParent->__children.addTail(pItem);
116 }
117 else
118 __children.addTail(pItem);
119 }
120 }
121}
122
123void HtmlMenu::setActive(int nPageID)
124{
125 IntToPointerMap::Iterator it = __mapPageToItem.find(nPageID);
126 if (it != __mapPageToItem.end())
127 ((HtmlMenuItem*)(*it).value)->setActive();
128}
129
131 TextTemplate* pDest,
132 TextTemplate* pSource,
133 const Session& session
134)
135{
136 TextTemplate* ABEGIN = &(*pSource)[L"ABEGIN"];
137 TextTemplate* AEND = &(*pSource)[L"AEND"];
138 TextTemplate* BEGIN = &(*pSource)[L"BEGIN"];
139 TextTemplate* END = &(*pSource)[L"END"];
140 TextTemplate* LINK = &(*pSource)[L"LINK"];
141 TextTemplate* ACTIVE = &(*pSource)[L"ACTIVE"];
142 TextTemplate* CAPTION = &(*pSource)[L"CAPTION"];
143 TextTemplate* SEPARATOR = &(*pSource)[L"SEPARATOR"];
144
145 PointerList::Iterator itList = __children.begin();
146 for( ; itList != __children.end(); itList++) {
147 ((HtmlMenuItem*)(*itList))->assign(
148 pDest,
149 session,
150 ABEGIN, AEND,
151 BEGIN, END,
152 LINK, ACTIVE, CAPTION, SEPARATOR
153 );
154 }
155}
156
158{
159 __pParent = NULL;
160 __nRoleID = 10;
161 __bActive = false;
162}
163
165{
166 PointerList::Iterator itList = __children.begin();
167 for( ; itList != __children.end(); itList++)
168 delete (HtmlMenuItem*)(*itList);
169}
170
172 TextTemplate* pDest,
173 const Session& session,
174 TextTemplate* ABEGIN,
175 TextTemplate* AEND,
176 TextTemplate* BEGIN,
177 TextTemplate* END,
178 TextTemplate* LINK,
179 TextTemplate* ACTIVE,
180 TextTemplate* CAPTION,
181 TextTemplate* SEPARATOR
182)
183{
184 if (session.__nRoleID <= __nRoleID) {
185 if (__bActive) {
186 ACTIVE->assign(L"TITLE", __strTitle);
187 pDest->append(L"MENUITEM", *ACTIVE);
188 }
189 else {
190 if (__strTitle.isEmpty() && __strLink.isEmpty()) {
191 pDest->append(L"MENUITEM", *SEPARATOR);
192 }
193 else if (__strLink.isEmpty()) {
194 CAPTION->assign(L"TITLE", __strTitle);
195 pDest->append(L"MENUITEM", *CAPTION);
196 }
197 else {
198 LINK->assign(L"TITLE", __strTitle);
199 LINK->assign(L"LINK", __strLink);
200 pDest->append(L"MENUITEM", *LINK);
201 }
202 }
203
204 PointerList::Iterator itList = __children.begin();
205 if (itList != __children.end()) {
206 if (__bActive)
207 pDest->append(L"MENUITEM", *ABEGIN);
208 else
209 pDest->append(L"MENUITEM", *BEGIN);
210
211 for( ; itList != __children.end(); itList++)
212 ((HtmlMenuItem*)(*itList))->assign(pDest, session, ABEGIN, AEND, BEGIN, END, LINK, ACTIVE, CAPTION, SEPARATOR);
213
214 if (__bActive)
215 pDest->append(L"MENUITEM", *AEND);
216 else
217 pDest->append(L"MENUITEM", *END);
218 }
219 }
220}
221
223{
224 __bActive = true;
225
226 if (__pParent)
227 __pParent->setActive();
228}
229
231
232MenuView::MenuView(HtmlPage* pPage)
233 : HtmlView(pPage)
234{
235}
236
237void MenuView::init(SQLFields& fields)
239{
240 HtmlView::init(fields);
241
242 String rValue;
243 if (__mapParams.lookup(L"MENU", rValue))
244 __strMenuFile = __pPage->site()->strSkinDir + rValue;
245 else {
246 SQLField& SKIN_FILE = fields.byName(L"SKIN_FILE");
247 if (!SKIN_FILE.isNull()) {
248 rValue = SKIN_FILE.asString();
249 __strMenuFile = __pPage->site()->strSkinDir + rValue + L".menu";
250 }
251 }
252}
253
254void MenuView::onPrint(Session& session)
256{
257 __onPrint(__strMenuFile, this, session);
258 HtmlView::onPrint(session);
259}
260
261void MenuView::__onPrint(
262 const String& strMenuFile,
263 HtmlView* pView,
264 Session& session
266{
267 const HtmlPage* pPage = pView->page();
268 ListedStringToStringArrayMap& mapQuery = session.__ctx.__queryMap;
269
270 TextTemplate* pMENU = pView->atP(L"MENU");
271 if (pMENU) {
272 int nPageID = pPage->__nPageID;
273#ifdef __DCL_DEBUG
274 String strMenuID = HtmlView::getDefault(mapQuery, L"menu");
275 if (!strMenuID.isEmpty())
276 nPageID = Integer::parse(strMenuID);
277#endif
278
279 __DCL_ASSERT(strMenuFile.length() > 0);
280 UTF8Decoder dec;
281 String s = Files::readText(strMenuFile, dec);
282 HtmlMenu menu;
283 menu.parse(s);
284 /*
285 "Main 1,?page=4&menu=1,10,1\n"
286 "Main 2,?page=4&menu=2,10,2\n"
287 "begin\n"
288 "sub 2-1,?page=4&menu=21,10,21\n"
289 "sub 2-2,?page=4&menu=22,10,22 23\n"
290 "end\n"
291 "Main 3\n"
292 "begin\n"
293 "sub 3-1,?page=4&menu=31,10,31\n"
294 "sub 3-2,?page=4&menu=32,10,32\n"
295 "end\n"
296 "\n"
297 "Main 4,?page=4&menu=4,2,4"
298 );
299 */
300
301 menu.setActive(nPageID);
302
303 menu.assign(pMENU, pMENU, session);
304 pView->assign(L"MENU", *pMENU);
305 }
306}
307
309
310HeadSignMenuForm::HeadSignMenuForm(HtmlPage* pPage)
311 : FormView(pPage)
312{
313}
314
315void HeadSignMenuForm::init(SQLFields& fields) __DCL_THROWS1(Exception*)
316{
317 FormView::init(fields);
318
319 String rValue;
320 if (__mapParams.lookup(L"MENU", rValue))
321 __strMenuFile = __pPage->site()->strSkinDir + rValue;
322 else {
323 SQLField& SKIN_FILE = fields.byName(L"SKIN_FILE");
324 if (!SKIN_FILE.isNull()) {
325 rValue = SKIN_FILE.asString();
326 __strMenuFile = __pPage->site()->strSkinDir + rValue + L".menu";
327 }
328 }
329}
330
331void HeadSignMenuForm::onPrint(Session& session)
333{
334 HeadView::__onPrint(this);
335 SignForm::__onPrint(this, session);
336 MenuView::__onPrint(__strMenuFile, this, session);
337
338 FormView::onPrint(session);
339}
340
341void HeadSignMenuForm::onGet(Session& session)
343{
344 SignForm::__onGet(this, session);
345}
346
347void HeadSignMenuForm::onPost(Session& session)
349{
350 SignForm::__onPost(this, session);
351 FormView::onPost(session);
352}
353
354__DCL_END_NAMESPACE
#define __THIS_FILE__
Definition _trace.h:14
#define NULL
Definition Config.h:312
wchar_t char_t
Definition Config.h:247
#define __DCL_THROWS1(e)
Definition Config.h:152
#define IMPLEMENT_CLASSINFO_EX(class_name, base_class_name)
Definition HtmlView.h:37
#define __DCL_TRACE1(fmt, arg1)
Definition Object.h:399
#define __DCL_ASSERT(expr)
Definition Object.h:394
#define __T(str)
Definition Object.h:60
static String readText(const String &_filename) __DCL_THROWS1(IOException *)
Definition Files.cpp:435
HtmlMenu()
Definition Menu.cpp:52
void parse(const String &strMenu)
Definition Menu.cpp:63
~HtmlMenu()
Definition Menu.cpp:56
PointerList __children
Definition Menu.h:13
IntToPointerMap __mapPageToItem
Definition Menu.h:14
void assign(TextTemplate *pDest, TextTemplate *pSource, const Session &session)
Definition Menu.cpp:130
void setActive(int nPageID)
Definition Menu.cpp:123
HtmlMenuItem * __pParent
Definition Menu.cpp:26
bool __bActive
Definition Menu.cpp:31
void setActive()
Definition Menu.cpp:222
void assign(TextTemplate *pDest, const Session &session, TextTemplate *ABEGIN, TextTemplate *AEND, TextTemplate *BEGIN, TextTemplate *END, TextTemplate *LINK, TextTemplate *ACTIVE, TextTemplate *CAPTION, TextTemplate *SEPARATOR)
Definition Menu.cpp:171
PointerList __children
Definition Menu.cpp:27
String __strLink
Definition Menu.cpp:29
int __nRoleID
Definition Menu.cpp:30
friend HtmlMenu
Definition Menu.cpp:33
~HtmlMenuItem()
Definition Menu.cpp:164
String __strTitle
Definition Menu.cpp:28
int __nPageID
Definition HtmlPage.h:32
virtual void onPrint(Session &session) __DCL_THROWS1(Exception *)
Definition HtmlView.cpp:349
static String getDefault(ListedStringToStringArrayMap &map, const String &strKey)
Definition HtmlView.cpp:256
virtual void init(SQLFields &fields) __DCL_THROWS1(Exception *)
Definition HtmlView.cpp:298
static int parse(const wchar_t *_number, unsigned _base=10) __DCL_THROWS1(NumericConvertException *)
Definition Numeric.inl:36
Definition SQL.h:48
int __nRoleID
Definition Session.h:35