]> err.no Git - sope/blob - sope-appserver/NGObjWeb/DynamicElements/WOSubmitButton.m
fixed bundle resource lookup on MacOSX, changed resource lookup in
[sope] / sope-appserver / NGObjWeb / DynamicElements / WOSubmitButton.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 "WOInput.h"
23 #include <NGObjWeb/WOApplication.h>
24 #include "common.h"
25
26 @interface WOSubmitButton : WOInput
27 {
28   // WOInput: name
29   // WOInput: value
30   // WOInput: disabled
31 @protected
32   WOAssociation *action;
33   WOAssociation *pageName;
34
35   // new in WO4:
36   WOAssociation *queryDictionary;
37   NSDictionary  *queryParameters;  // associations beginning with ?
38   WOAssociation *actionClass;
39   WOAssociation *directActionName;
40   BOOL          sidInUrl;
41 }
42
43 @end /* WOSubmitButton */
44
45 @implementation WOSubmitButton
46
47 + (int)version {
48   return 2;
49 }
50
51 - (id)initWithName:(NSString *)_name
52   associations:(NSDictionary *)_config
53   template:(WOElement *)_t
54 {
55   if ((self = [super initWithName:_name associations:_config template:_t])) {
56     WOAssociation *sidInUrlAssoc;
57
58     sidInUrlAssoc  = OWGetProperty(_config, @"?wosid");
59     self->action   = OWGetProperty(_config, @"action");
60     self->pageName = OWGetProperty(_config, @"pageName");
61
62     self->queryDictionary    = OWGetProperty(_config, @"queryDictionary");
63     self->queryParameters    = OWExtractQueryParameters(_config);
64     self->actionClass        = OWGetProperty(_config, @"actionClass");
65     self->directActionName   = OWGetProperty(_config, @"directActionName");
66     
67     self->sidInUrl = (sidInUrlAssoc)
68       ? [sidInUrlAssoc boolValueInComponent:nil]
69       : YES;
70   }
71   return self;
72 }
73
74 #if !LIB_FOUNDATION_BOEHM_GC
75 - (void)dealloc {
76   RELEASE(self->actionClass);
77   RELEASE(self->directActionName);
78   RELEASE(self->queryDictionary);
79   RELEASE(self->queryParameters);
80   RELEASE(self->action);
81   RELEASE(self->pageName);
82   [super dealloc];
83 }
84 #endif
85
86 // responder
87
88 - (void)takeValuesFromRequest:(WORequest *)_request
89   inContext:(WOContext *)_ctx
90 {
91   id formValue;
92   
93   if (self->disabled) {
94     if ([self->disabled boolValueInComponent:[_ctx component]])
95       return;
96   }
97   
98   if ((formValue = [_request formValueForKey:OWFormElementName(self, _ctx)])) {
99     //NSLog(@"%@: value=%@ ..", [self elementID], formValue);
100     
101     if ([self->value isValueSettable]) {
102       [self->value setStringValue:formValue
103            inComponent:[_ctx component]];
104     }
105     if ((self->action != nil) || (self->pageName != nil))
106       [_ctx addActiveFormElement:self];
107   }
108 }
109
110 - (id)invokeActionForRequest:(WORequest *)_request inContext:(WOContext *)_ctx {
111   if (self->disabled) {
112     if ([self->disabled boolValueInComponent:[_ctx component]])
113       return nil;
114   }
115   
116   /* check whether this is the active form element (determined in take-values) */
117   if (![[_ctx elementID] isEqualToString:[_ctx senderID]]) {
118     NSLog(@"SUBMITBUTTON is not active (%@ vs %@) !",
119           [_ctx elementID], [_ctx senderID]);
120     return nil;
121   }
122   
123   if (self->action)
124     return [self executeAction:self->action inContext:_ctx];
125
126   if (self->pageName) {
127     NSString    *pname = nil;
128     WOComponent *page = nil;
129
130     pname = [self->pageName stringValueInComponent:[_ctx component]];
131     page = [[_ctx application] pageWithName:pname inContext:_ctx];
132
133     if (page == nil) {
134       [[_ctx session] logWithFormat:
135                       @"%@[0x%08X]: did not find page with name %@ !",
136                       NSStringFromClass([self class]), self, pname];
137     }
138     NSLog(@"%@: showing page %@", self, page);
139     return page;
140   }
141
142   return nil;
143 }
144
145 - (void)appendToResponse:(WOResponse *)_response inContext:(WOContext *)_ctx {
146   NSString *v = [self->value stringValueInComponent:[_ctx component]];
147
148   WOResponse_AddCString(_response, "<input type=\"submit\" name=\"");
149   [_response appendContentHTMLAttributeValue:OWFormElementName(self, _ctx)];
150   WOResponse_AddCString(_response, "\" value=\"");
151   [_response appendContentHTMLAttributeValue:v];
152   WOResponse_AddChar(_response, '"');
153   [self appendExtraAttributesToResponse:_response inContext:_ctx];
154   if (self->otherTagString) {
155     WOResponse_AddChar(_response, ' ');
156     WOResponse_AddString(_response,
157                          [self->otherTagString stringValueInComponent:
158                               [_ctx component]]);
159   }
160   WOResponse_AddCString(_response, " />");
161 }
162
163 /* description */
164
165 - (NSString *)associationDescription {
166   NSMutableString *str = [NSMutableString stringWithCapacity:128];
167   [str appendString:[super associationDescription]];
168   if (self->action)   [str appendFormat:@" action=%@", self->action];
169   if (self->pageName) [str appendFormat:@" page=%@",   self->pageName];
170
171   if (self->actionClass)
172     [str appendFormat:@" actionClass=%@", self->actionClass];
173   if (self->directActionName)
174     [str appendFormat:@" directAction=%@", self->directActionName];
175   return str;
176 }
177
178 @end /* WOSubmitButton */