2 Copyright (C) 2000-2003 SKYRIX Software AG
4 This file is part of OGo
6 OGo 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
11 OGo 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.
16 You should have received a copy of the GNU Lesser General Public
17 License along with OGo; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 #include "ODR_bind_tablecell.h"
24 #include "ODR_bind_tableview.h"
29 @implementation ODR_bind_tablecell
31 static NSNumber *YesNumber = nil;
32 static NSNumber *NoNumber = nil;
35 if (YesNumber == nil) YesNumber = [[NSNumber numberWithBool:YES] retain];
36 if (NoNumber == nil) NoNumber = [[NSNumber numberWithBool:NO] retain];
39 - (void)appendSortIcon:(id)_node
40 toResponse:(WOResponse *)_response
41 inContext:(WOContext *)_ctx
45 BOOL doForm = [_ctx isInForm];
51 sortedKey = [_ctx objectForKey:ODRTableView_SORTEDKEY];
52 sk = [self stringFor:@"sortkey" node:_node ctx:_ctx];
54 label = [self stringFor:@"sortlabel" node:_node ctx:_ctx];
55 label = (label) ? label : ODRTableLabelForKey(@"sort", _ctx);
60 if (![sk isEqualToString:sortedKey])
62 else if ( [_ctx objectForKey:ODRTableView_ISDESCENDING] == nil ||
63 [[_ctx objectForKey:ODRTableView_ISDESCENDING] boolValue])
69 case 1: nav = @"down"; break;
70 case 0: nav = @"non"; break;
71 case -1: nav = @"up"; break;
75 icon = [self stringFor:@"downwardsorticon" node:_node ctx:_ctx];
76 if ([icon length] == 0)
77 icon = [_ctx objectForKey:ODRTableView_downwardIcon];
80 icon = [self stringFor:@"nonsorticon" node:_node ctx:_ctx];
81 if ([icon length] == 0)
82 icon = [_ctx objectForKey:ODRTableView_nonSortIcon];
85 icon = [self stringFor:@"upwardsorticon" node:_node ctx:_ctx];
86 if ([icon length] == 0)
87 icon = [_ctx objectForKey:ODRTableView_upwardIcon];
93 NSLog(@"%s: DID NOT FIND SORTICON (%i), ctx is %@\n vars: %@",
95 sortDir, _ctx, [_ctx variableDictionary]);
100 if (!ODRUriOfResource(icon,_ctx)) {
102 case 1: icon = [_ctx objectForKey:ODRTableView_downwardIcon]; break;
103 case 0: icon = [_ctx objectForKey:ODRTableView_nonSortIcon]; break;
104 case -1: icon = [_ctx objectForKey:ODRTableView_upwardIcon]; break;
109 icon = ODRUriOfResource(icon, _ctx);
110 doForm = doForm && (icon != nil);
112 // append something like that: sort.name.down
113 [_ctx appendElementIDComponent:@"sort"];
114 [_ctx appendElementIDComponent:sk]; // remember sortKey
115 [_ctx appendElementIDComponent:nav]; // remember sortDirection
117 // append as submit button
119 ODRAppendButton(_response, [_ctx elementID], icon, label);
121 /* append as hyperlink */
123 [_response appendContentString:@"<a href=\""];
124 [_response appendContentString:[_ctx componentActionURL]];
125 [_response appendContentString:@"\">"];
128 ODRAppendImage(_response, nil, icon, label);
132 case 1: [_response appendContentString:@"↑"]; break;
133 case 0: [_response appendContentString:@"-"]; break;
134 case -1: [_response appendContentString:@"↓"]; break;
137 [_response appendContentString:@"</a>"];
139 [_ctx deleteLastElementIDComponent]; // delete sortDirection
140 [_ctx deleteLastElementIDComponent]; // delete sortKey
141 [_ctx deleteLastElementIDComponent]; // delete @"sort"
146 - (void)appendTitle:(id)_node
147 toResponse:(WOResponse *)_response
148 inContext:(WOContext *)_ctx
151 NSString *tC, *tF, *tS; // text font attrtibutes
154 tC = [_ctx objectForKey:ODRTableView_fontColor];
155 tF = [_ctx objectForKey:ODRTableView_fontFace];
156 tS = [_ctx objectForKey:ODRTableView_fontSize];
158 hasFont = (tC || tF || tS) ? YES : NO;
160 title = [self stringFor:@"title" node:_node ctx:_ctx];
164 ODRAppendFont(_response, tC, tF, tS); // <FONT...>
166 [_response appendContentString:@" <b>"];
167 [_response appendContentString:title];
168 [_response appendContentString:@"</b>"];
171 [_response appendContentString:@"</font>"]; // </FONT>
175 /* --- responder --- */
177 - (void)takeValuesForNode:(id)_node
178 fromRequest:(WORequest *)_req
179 inContext:(WOContext *)_ctx
183 k = [self stringFor:@"sortkey" node:_node ctx:_ctx];
185 if (k && [[_ctx objectForKey:ODRTableView_HeaderMode] boolValue]) {
187 tmp = [[_ctx elementID] stringByAppendingFormat:@".sort.%@.", k];
189 if ([_req formValueForKey:[tmp stringByAppendingString:@"down.x"]]) {
190 [_ctx addActiveFormElement:self];
191 [_ctx setRequestSenderID:[tmp stringByAppendingString:@"down"]];
193 else if ([_req formValueForKey:[tmp stringByAppendingString:@"up.x"]]) {
194 [_ctx addActiveFormElement:self];
195 [_ctx setRequestSenderID:[tmp stringByAppendingString:@"up"]];
197 else if ([_req formValueForKey:[tmp stringByAppendingString:@"non.x"]]) {
198 [_ctx addActiveFormElement:self];
199 [_ctx setRequestSenderID:[tmp stringByAppendingString:@"non"]];
202 [super takeValuesForNode:_node fromRequest:_req inContext:_ctx];
205 [super takeValuesForNode:_node fromRequest:_req inContext:_ctx];
208 - (id)invokeActionForNode:(id)_node
209 fromRequest:(WORequest *)_req
210 inContext:(WOContext *)_ctx
216 NSLog(@"%s: invoke on tablecell %@ (eid=%@, sid=%@)", __PRETTY_FUNCTION__,
217 _node, [_ctx elementID], [_ctx senderID]);
220 k = [self stringFor:@"sortkey" node:_node ctx:_ctx];
221 if ([[_ctx currentElementID] isEqual:@"sort"] && k != nil) {
224 [_ctx consumeElementID]; // consume "sort"
225 [_ctx appendElementIDComponent:@"sort"]; // append "sort"
227 tmp = [_ctx currentElementID];
228 if (tmp != nil && [tmp isEqualToString:k]) {
229 BOOL doNegate = [self boolFor:@"negatesort" node:_node ctx:_ctx];
231 [_ctx consumeElementID]; // consume sortKey
232 [_ctx appendElementIDComponent:k]; // append sortKey
233 [_ctx setObject:k forKey:ODRTableView_SORTEDKEY];
235 tmp = [_ctx currentElementID];
237 if ([tmp isEqualToString:@"down"])
238 [_ctx setObject:YesNumber forKey:ODRTableView_ISDESCENDING];
239 else if ([tmp isEqualToString:@"up"])
240 [_ctx setObject:NoNumber forKey:ODRTableView_ISDESCENDING];
241 else if ([tmp isEqualToString:@"non"])
242 [_ctx setObject:[NSNumber numberWithBool:doNegate]
243 forKey:ODRTableView_ISDESCENDING];
245 [_ctx removeObjectForKey:ODRTableView_ISDESCENDING];
246 [_ctx removeObjectForKey:ODRTableView_SORTEDKEY];
248 [_ctx deleteLastElementIDComponent];
250 [_ctx deleteLastElementIDComponent];
253 result = [self invokeActionForChildNodes:[_node childNodes]
260 @end /* ODR_bind_tablecell */