]> err.no Git - sope/blob - sope-appserver/WEExtensions/JSMenu.m
Add libxml2-dev to libsope-xml4.7-dev deps
[sope] / sope-appserver / WEExtensions / JSMenu.m
1 /*
2   Copyright (C) 2000-2005 SKYRIX Software AG
3
4   This file is part of SOPE.
5
6   SOPE is free software; you can redistribute it and/or modify it under
7   the terms of the GNU Lesser General Public License as published by the
8   Free Software Foundation; either version 2, or (at your option) any
9   later version.
10
11   SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
12   WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14   License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with SOPE; see the file COPYING.  If not, write to the
18   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19   02111-1307, USA.
20 */
21
22 #include "JSMenu.h"
23 #include "JSMenuItem.h"
24 #include <NGObjWeb/NGObjWeb.h>
25 #include <NGObjWeb/WEClientCapabilities.h>
26 #include "common.h"
27
28 @implementation JSMenu
29
30 - (id)initWithName:(NSString *)_name
31   associations:(NSDictionary *)_config
32   template:(WOElement *)_subs
33 {
34   if((self = [super initWithName:_name associations:_config template:_subs])) {
35     self->fgColor     = OWGetProperty(_config,@"fgColor");
36     self->bgColor     = OWGetProperty(_config,@"bgColor");
37     self->fgColorHigh = OWGetProperty(_config,@"fgColorHigh");
38     self->bgColorHigh = OWGetProperty(_config,@"bgColorHigh");
39     self->borderColor = OWGetProperty(_config,@"borderColor");
40     self->borderWidth = OWGetProperty(_config,@"borderWidth");
41     self->fontSize    = OWGetProperty(_config,@"fontSize");
42     self->width       = OWGetProperty(_config,@"width");
43     self->leftPadding = OWGetProperty(_config,@"leftPadding");
44     self->string      = OWGetProperty(_config,@"string");
45     self->bindAtId    = OWGetProperty(_config,@"bindAtId");
46     self->align       = OWGetProperty(_config,@"align");
47     self->tag         = OWGetProperty(_config,@"tag");
48
49     self->template = [_subs retain];
50   }
51   return self;
52 }
53
54 - (void)dealloc {
55   [self->fgColor     release];
56   [self->bgColor     release];
57   [self->fgColorHigh release];
58   [self->bgColorHigh release];
59   [self->borderWidth release];
60   [self->fontSize    release];
61   [self->width       release];
62   [self->leftPadding release];
63   [self->string      release];
64   [self->bindAtId    release];
65   [self->align       release];
66   [self->tag         release];
67   [self->template    release];
68   [super dealloc];
69 }
70
71 /* handling requests */
72
73 - (id)invokeActionForRequest:(WORequest *)_req inContext:(WOContext *)_ctx {
74   return [self->template invokeActionForRequest:_req inContext:_ctx];
75 }
76
77 /* generate response */
78
79 - (void)appendToResponse:(WOResponse *)_response inContext:(WOContext *)_ctx {
80   WOComponent          *comp;
81   NSString             *tmp;
82   NSString             *eid; // [_ctx elementID]
83   WEClientCapabilities *ccaps;
84   BOOL                 ie, ns;
85
86   if ([_ctx isRenderingDisabled]) {
87     [self->template appendToResponse:_response inContext:_ctx];
88     return;
89   }
90
91   eid   = [[[_ctx elementID] componentsSeparatedByString:@"."]
92                   componentsJoinedByString:@"_"];
93   comp  = [_ctx component];
94   ccaps = [[_ctx request] clientCapabilities];
95   ie    = [ccaps isJavaScriptBrowser] && [ccaps isInternetExplorer];
96   ns    = [ccaps isJavaScriptBrowser] && [ccaps isNetscape];
97
98   [_ctx setObject:eid forKey:@"eid"];
99
100   if (!ie) {
101     return;
102
103     [_response appendContentString:@"<font size=\"-1\">["];
104     [self->template appendToResponse:_response inContext:_ctx];
105     [_response appendContentString:@"]</font>"];
106     return;
107   }
108
109   if (ie) {
110     if ([_ctx objectForKey:@"jsmenu_included"] == nil) {
111       [_ctx setObject:@"done" forKey:@"jsmenu_included"];
112       tmp = [[NSString alloc] initWithFormat:
113                       @"<style>\n"
114                       @".menuItem {\n"
115                       @"  font:%@pt sans-serif;\n"
116                       @"  width:%@;\n"
117                       @"  padding-left:%@;\n"
118                       @"  background-Color:%@;\n"
119                       @"  color:%@;\n"
120                       @"  text-align:%@\n"
121                       @"}\n"
122                       @".highlightItem {\n"
123                       @"  font:%@pt sans-serif;\n"
124                       @"  width:%@;\n"
125                       @"  padding-left:%@;\n"
126                       @"  background-Color:%@;\n"
127                       @"  color:%@\n"
128                       @"  text-align:%@\n"
129                       @"}\n"
130                       @"</style>\n",
131                       [self->fontSize stringValueInComponent:comp],
132                       [self->width stringValueInComponent:comp],
133                       [self->leftPadding stringValueInComponent:comp],
134                       [self->bgColor stringValueInComponent:comp],
135                       [self->fgColor stringValueInComponent:comp],
136                       [self->align stringValueInComponent:comp],
137                       [self->fontSize stringValueInComponent:comp],
138                       [self->width stringValueInComponent:comp],
139                       [self->leftPadding stringValueInComponent:comp],
140                       [self->bgColorHigh stringValueInComponent:comp],
141                       [self->fgColorHigh stringValueInComponent:comp],
142                       [self->align stringValueInComponent:comp]];
143       [_response appendContentString:tmp];
144       [tmp release];
145
146       tmp = [[NSString alloc] initWithFormat:
147                       @"<script language=\"javascript\">\n"
148                       @"var menuOpened;\n"
149                       @"function displayMenu(m) {\n"
150                       @"  closeMenu();\n"
151                       @"  if(m.parentNode != event.srcElement)\n"
152                       @"    return false;\n"
153                       @"  menuOpened=m;\n"
154                       @"  m.style.posLeft=event.clientX+document.body.scrollLeft;\n"
155                       @"  m.style.posTop=event.clientY+document.body.scrollTop;\n"
156                       @"  if(document.body.clientWidth<event.clientX+%@+5)\n"
157                       @"    m.style.posLeft-=%@;\n"
158                       @"  m.style.display=\"\";\n"
159                       @"  m.setCapture();\n"
160                       @"  return false;\n"
161                       @"}\n"
162                       @"function switchMenu() {\n"
163                       @"  el=event.srcElement;\n"
164                       @"  if(el.className==\"menuItem\")\n"
165                       @"    el.className=\"highlightItem\";\n"
166                       @"  else if(el.className==\"highlightItem\")\n"
167                       @"    el.className=\"menuItem\";\n"
168                       @"}\n"
169                       @"function clickMenu(m) {\n"
170                       @"  m.releaseCapture();\n"
171                       @"  m.style.display=\"none\";\n"
172                       @"  el=event.srcElement;\n"
173                       @"  if(m==el.parentNode)window.location=el.url;\n"
174                       @"  return false;\n"
175                       @"}\n"
176                       @"function closeMenu() {\n"
177                       @"  if(menuOpened==null)"
178                       @"    return;\n"
179                       @"  menuOpened.releaseCapture();\n"
180                       @"  menuOpened.style.display=\"none\";\n"
181                       @"  menuOpened=null;\n"
182                       @"}\n"
183                       @"</script>\n",
184                       [self->width stringValueInComponent:comp],
185                       [self->width stringValueInComponent:comp]];
186       [_response appendContentString:tmp];
187       [tmp release];
188     }
189     tmp = [[NSString alloc] initWithFormat:
190                     @"<div id=\"m%@\" onclick=\"return clickMenu(m%@);\" "
191                     @"onmouseover=\"switchMenu();\" "
192                     @"onmouseout=\"switchMenu();\" "
193                     @"style=\"position:absolute;display:none;width:%@;"
194                     @"background-Color:%@;border:outset %@px %@;"
195                     @"text-decoration:none\">",
196                     eid, eid,
197                     [self->width       stringValueInComponent:comp],
198                     [self->bgColor     stringValueInComponent:comp],
199                     [self->borderWidth stringValueInComponent:comp],
200                     [self->borderColor stringValueInComponent:comp]];
201     [_response appendContentString:tmp];
202     [tmp release];
203
204     [self->template appendToResponse:_response inContext:_ctx];
205
206     [_response appendContentString:@"</div>"];
207 #if 0
208     if ([self->tag stringValueInComponent:comp] != nil)
209       tmp = [[NSString alloc] initWithFormat:
210                       @"<script id=\"s%@\" language=\"javascript\">"
211                       @"function c%@(){return displayMenu(m%@);}"
212                       @"tmp=document.getElementById(\"s%@\");"
213                       @"i=5;"
214                       @"while((tmp.tagName!=\"%@\")&&i--)"
215                       @"tmp=tmp.parentNode;"
216                       @"tmp.oncontextmenu=c%@;"
217                       @"</script>",
218                       eid, eid, eid, eid,
219                       [self->tag stringValueInComponent:comp], eid];
220     else
221 #endif
222       tmp = [[NSString alloc] initWithFormat:
223                       @"<script id=\"s%@\" language=\"javascript\">"
224                       @"function c%@() { return displayMenu(m%@); }"
225                       @"s%@.parentNode.oncontextmenu=c%@;"
226                       @"</script>",
227                       eid, eid, eid, eid, eid];
228     [_response appendContentString:tmp];
229     [tmp release];
230   }
231 #if 0
232   if (ns) {
233     if ([_ctx objectForKey:@"jsmenu_included"] == nil) {
234       tmp = [[NSString alloc] initWithFormat:
235                       @"<script language=\"javascript1.2\" "
236                       @"src=\"http://inster:9000/sascha/menu07.js\">"
237                       @"</script>\n"
238                       @"<script language=\"javascript1.2\">"
239                       @"function onLoad(){m%@.writeMenus();}</script>\n",
240                       eid];
241       [_response appendContentString:tmp];
242       [tmp release];
243     }
244
245     tmp = [[NSString alloc] initWithFormat:
246                     @"<script language=\"javascript1.2\">\n"
247                     @"m%@=new Menu();",eid];
248     [_response appendContentString:tmp];
249     [tmp release];
250
251     [self->template appendToResponse:_response inContext:_ctx];
252
253     tmp = [[NSString alloc] initWithFormat:
254                     @"</script>\n"
255                     @"<a href=\"#\" onclick=\"showMenu(m%@);return false;\">"
256                     @"M</a>", eid];
257     [_response appendContentString:tmp];
258     [tmp release];
259
260     [_ctx setObject:@"done" forKey:@"jsmenu_included"];
261   }
262 #endif
263 }
264
265 @end /* JSMenu */