* GSWeb/GSWCheckBoxList.m

fix appendToResponse:inContext:
  respect GNUstep coding standard (curly brackets placement, etc.)
  use GSWAssignAndRemoveAssociation() in initWithName:associations:template:
* GSWeb/GSWElement.[hm]
  add GSWAssignAndRemoveAssociation() to make controls code simplier



git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gsweb/trunk@37850 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Manuel Guesdon 2014-05-06 16:28:44 +00:00
parent 6194720fed
commit af78e8fe37
4 changed files with 237 additions and 216 deletions

View file

@ -1,4 +1,11 @@
2014-04-29 Manuel Guesdon <mguesdon@orange-concept.com> 2014-05-06 Manuel Guesdon <mguesdon@orange-concept.com>
* GSWeb/GSWCheckBoxList.m
fix appendToResponse:inContext:
respect GNUstep coding standard (curly brackets placement, etc.)
use GSWAssignAndRemoveAssociation() in initWithName:associations:template:
* GSWeb/GSWElement.[hm]
add GSWAssignAndRemoveAssociation() to make controls code simplier
w2014-04-29 Manuel Guesdon <mguesdon@orange-concept.com>
* GSWeb/GSWApplication.m: * GSWeb/GSWApplication.m:
fix -baseURL fix -baseURL
* GSWeb/GSWResourceManager.m: * GSWeb/GSWResourceManager.m:

View file

@ -53,9 +53,6 @@ Bindings
selections Array of selected objects (used to pre-check checkboxes and modified to reflect user choices) selections Array of selected objects (used to pre-check checkboxes and modified to reflect user choices)
It contains objects from list, not value binding evaluated ones ! It contains objects from list, not value binding evaluated ones !
selectionValues Array of selected values (used to pre-check checkboxes and modified to reflect user choices)
It contains evaluated values binding !
name Name of the element in the form (should be unique). If not specified, GSWeb assign one. name Name of the element in the form (should be unique). If not specified, GSWeb assign one.
disabled If evaluated to yes, the check box appear inactivated. disabled If evaluated to yes, the check box appear inactivated.
@ -88,69 +85,41 @@ static Class standardClass = Nil;
associations:(NSDictionary*)associations associations:(NSDictionary*)associations
template:(GSWElement*)template template:(GSWElement*)template
{ {
self = [super initWithName:aName associations:associations template: template]; if ((self = [super initWithName:aName associations:associations template: template]))
if (!self) { {
return nil;
}
_loggedSlow = NO; _loggedSlow = NO;
ASSIGN(_list, [_associations objectForKey: list__Key]); GSWAssignAndRemoveAssociation(&_list,_associations,list__Key);
if (_list != nil) { GSWAssignAndRemoveAssociation(&_item,_associations,item__Key);
[_associations removeObjectForKey: list__Key]; GSWAssignAndRemoveAssociation(&_index,_associations,index__Key);
} GSWAssignAndRemoveAssociation(&_selections,_associations,selections__Key);
ASSIGN(_item, [_associations objectForKey: item__Key]); GSWAssignAndRemoveAssociation(&_prefix,_associations,prefix__Key);
if (_item != nil) { GSWAssignAndRemoveAssociation(&_prefix,_associations,prefix__Key);
[_associations removeObjectForKey: item__Key]; GSWAssignAndRemoveAssociation(&_suffix,_associations,suffix__Key);
} GSWAssignAndRemoveAssociation(&_escapeHTML,_associations,escapeHTML__Key);
ASSIGN(_index, [_associations objectForKey: index__Key]);
if (_index != nil) {
[_associations removeObjectForKey: index__Key];
}
ASSIGN(_selections, [_associations objectForKey: selections__Key]);
if (_selections != nil) {
[_associations removeObjectForKey: selections__Key];
}
ASSIGN(_prefix, [_associations objectForKey: prefix__Key]);
if (_prefix != nil) {
[_associations removeObjectForKey: prefix__Key];
}
ASSIGN(_suffix, [_associations objectForKey: suffix__Key]);
if (_suffix != nil) {
[_associations removeObjectForKey: suffix__Key];
}
ASSIGN(_displayString, [_associations objectForKey: displayString__Key]);
if (_displayString != nil) {
[_associations removeObjectForKey: displayString__Key];
}
ASSIGN(_escapeHTML, [_associations objectForKey: escapeHTML__Key]);
if (_escapeHTML != nil) {
[_associations removeObjectForKey: escapeHTML__Key];
}
if (_displayString == nil) { if (GSWAssignAndRemoveAssociation(&_displayString,_associations,displayString__Key)==nil)
ASSIGN(_displayString, [_associations objectForKey: value__Key]); {
if (_displayString != nil) { GSWAssignAndRemoveAssociation(&_displayString,_associations,value__Key);
[_associations removeObjectForKey: value__Key];
}
_defaultEscapeHTML = NO; _defaultEscapeHTML = NO;
} else {
_defaultEscapeHTML = YES;
} }
else
_defaultEscapeHTML = YES;
if ((_list == nil) || ((_value != nil || _displayString != nil) && ((_item == nil) || (![_item isValueSettable]))) || if (_list == nil
((_selections != nil) && (![_selections isValueSettable]))) { || ((_value != nil || _displayString != nil)
&& (_item == nil || ![_item isValueSettable]))
|| (_selections != nil && ![_selections isValueSettable]))
{
[NSException raise:NSInvalidArgumentException [NSException raise:NSInvalidArgumentException
format:@"%s: 'list' must be present. 'item' must not be a constant if 'displayString' or 'value' is present. 'selection' must not be a constant if present.", format:@"%s: 'list' must be present. 'item' must not be a constant if 'displayString' or 'value' is present. 'selection' must not be a constant if present.",
__PRETTY_FUNCTION__]; __PRETTY_FUNCTION__];
} }
}
return self; return self;
} }
-(void)dealloc -(void)dealloc
{ {
DESTROY(_list); DESTROY(_list);
@ -183,51 +152,59 @@ static Class standardClass = Nil;
inContext:(GSWContext*)context inContext:(GSWContext*)context
{ {
GSWComponent * component = GSWContext_component(context); GSWComponent * component = GSWContext_component(context);
if ((_selections != nil) && (![self disabledInComponent:component]) && ([context _wasFormSubmitted])) { if (_selections != nil
&& ![self disabledInComponent:component]
&& [context _wasFormSubmitted])
{
NSArray* selections = nil;
NSString * ctxName = [self nameInContext:context]; NSString * ctxName = [self nameInContext:context];
NSArray * formValues = [request formValuesForKey: ctxName]; NSArray * formValues = [request formValuesForKey: ctxName];
NSMutableArray * mutArray = nil; int formValuesCount = [formValues count];
int count = 0;
int count2 = 0; if (formValuesCount==0)
selections = [NSArray array];
else
{
NSArray* listValue = [_list valueInComponent:component];
int listCount = 0;
int i=0; int i=0;
if ((formValues != nil) && (count = [formValues count])) { if ([listValue isKindOfClass:[NSArray class]] == NO)
mutArray = [NSMutableArray arrayWithCapacity:count]; {
} else {
mutArray = [NSMutableArray arrayWithCapacity:5];
}
if ((formValues != nil) && (count > 0)) {
id listValue = [_list valueInComponent:component];
if ([listValue isKindOfClass:[NSArray class]] == NO) {
[NSException raise:NSInvalidArgumentException [NSException raise:NSInvalidArgumentException
format:@"%s: Evaluating 'list' binding returned a '%@' class and not a NSArray.", format:@"%s: Evaluating 'list' binding returned a '%@' class and not a NSArray.",
__PRETTY_FUNCTION__, [listValue class]]; __PRETTY_FUNCTION__, [listValue class]];
} }
count2 = [listValue count]; listCount = [listValue count];
for (i = 0; i < count2; i++) { selections = [NSMutableArray arrayWithCapacity:formValuesCount];
id obj1 = [(NSArray*) listValue objectAtIndex:i];
id obj2 = nil;
[_item setValue:obj1 inComponent: component]; for (i = 0; i < listCount; i++)
{
id item = [listValue objectAtIndex:i];
id value = nil;
[_item setValue: item
inComponent: component];
value = [_value valueInComponent:component];
if (value != nil)
{
if ([formValues containsObject:NSStringWithObject(value)])
[(NSMutableArray*)selections addObject:item];
obj2= [_value valueInComponent:component];
if (obj2 != nil) {
if ([formValues containsObject:obj2]) {
[mutArray addObject:obj1];
} }
} else { else
{
NSLog(@"%s 'value' evaluated to nil in component %@.\nUnable to select item %@", NSLog(@"%s 'value' evaluated to nil in component %@.\nUnable to select item %@",
__PRETTY_FUNCTION__, self, obj1); __PRETTY_FUNCTION__, self, value);
}
} }
} }
} [_selections setValue: selections
[_selections setValue:mutArray inComponent: component]; inComponent: component];
} }
} }
@ -236,136 +213,156 @@ static Class standardClass = Nil;
{ {
GSWComponent * component = GSWContext_component(context); GSWComponent * component = GSWContext_component(context);
if ((_selections != nil) && (![self disabledInComponent:component]) && ([context _wasFormSubmitted])) { if (_selections != nil
&& ![self disabledInComponent:component]
&& [context _wasFormSubmitted])
{
NSArray* selections = nil;
NSString * ctxName = [self nameInContext:context]; NSString * ctxName = [self nameInContext:context];
NSArray * formValues = [request formValuesForKey: ctxName]; NSArray * formValues = [request formValuesForKey: ctxName];
int count = 0; int formValuesCount = [formValues count];
if (formValuesCount==0)
{
selections = [NSArray array];
}
else
{
NSArray* listValue = [_list valueInComponent:component];
int listCount = 0;
int i = 0; int i = 0;
NSMutableArray * mutablearray;
count = (formValues == nil) ? 0 : [formValues count]; if ([listValue isKindOfClass:[NSArray class]] == NO)
mutablearray = [NSMutableArray arrayWithCapacity:count]; {
if (count > 0) {
id listValue = [_list valueInComponent:component];
if ([listValue isKindOfClass:[NSArray class]] == NO) {
[NSException raise:NSInvalidArgumentException [NSException raise:NSInvalidArgumentException
format:@"%s: Evaluating 'list' binding returned a '%@' class and not a NSArray.", format:@"%s: Evaluating 'list' binding returned a '%@' class and not a NSArray.",
__PRETTY_FUNCTION__, [listValue class]]; __PRETTY_FUNCTION__, [listValue class]];
} }
for (i = 0; i < count; i++) { listCount = [listValue count];
int j = [NSStringWithObject([formValues objectAtIndex:i]) intValue];
[mutablearray addObject:[listValue objectAtIndex:j]]; for (i = 0; i < listCount; i++)
{
int itemIndex = [NSStringWithObject([formValues objectAtIndex:i]) intValue];
[(NSMutableArray*)selections addObject:[listValue objectAtIndex:itemIndex]];
} }
} }
[_selections setValue:mutablearray inComponent: component]; [_selections setValue: selections
inComponent: component];
} }
} }
-(void)appendToResponse:(GSWResponse*)response -(void)appendToResponse:(GSWResponse*)response
inContext:(GSWContext*)context inContext:(GSWContext*)context
{ {
int count = 0;
int j = 0;
GSWComponent * component = GSWContext_component(context); GSWComponent * component = GSWContext_component(context);
BOOL doEscape;
NSString * ctxName = [self nameInContext:context];
id listValue = [_list valueInComponent:component]; id listValue = [_list valueInComponent:component];
id selectionsValue = nil; int listCount = 0;
doEscape = (_escapeHTML == nil) ? _defaultEscapeHTML : [_escapeHTML boolValueInComponent:component]; if ([listValue isKindOfClass:[NSArray class]] == NO)
{
if ([listValue isKindOfClass:[NSArray class]] == NO) {
[NSException raise:NSInvalidArgumentException [NSException raise:NSInvalidArgumentException
format:@"%s: Evaluating 'list' binding returned a '%@' class and not a NSArray.", format:@"%s: Evaluating 'list' binding returned a '%@' class and not a NSArray.",
__PRETTY_FUNCTION__, [listValue class]]; __PRETTY_FUNCTION__, [listValue class]];
} }
selectionsValue = _selections == nil ? nil : [_selections valueInComponent:component]; listCount=[listValue count];
if (listCount>0)
{
NSString* ctxName = [self nameInContext:context];
int i = 0;
BOOL doEscape = NO;
id selections = nil;
if (selectionsValue != nil) { if (_escapeHTML==nil)
count = [selectionsValue count]; doEscape=_defaultEscapeHTML;
} else
doEscape=[_escapeHTML boolValueInComponent:component];
for (j = 0; j < count; j++) { if (_selections!=nil)
selections = [_selections valueInComponent:component];
for (i = 0; i < listCount; i++)
{
NSString * prefixStr = nil; NSString * prefixStr = nil;
NSString * suffixStr = nil; NSString * suffixStr = nil;
NSString * dispStr = nil; NSString * displayString = nil;
id obj2 = nil; id item = nil;
id displayValue = nil; id value = nil;
id valueValue = nil;
if ((_prefix != nil)) { if (_prefix != nil)
prefixStr = NSStringWithObject([_prefix valueInComponent:component]); prefixStr = NSStringWithObject([_prefix valueInComponent:component]);
}
if ((_suffix != nil)) { if (_suffix != nil)
suffixStr = NSStringWithObject([_suffix valueInComponent:component]); suffixStr = NSStringWithObject([_suffix valueInComponent:component]);
}
if (_index != nil) { if (_index != nil)
[_index setValue:GSWIntToNSString(j) {
[_index setValue:GSWIntToNSString(i)
inComponent:component]; inComponent:component];
} }
obj2 = [listValue objectAtIndex:j]; item = [listValue objectAtIndex:i];
if ((_item != nil) && (_displayString != nil)) { if (_item != nil
[_item setValue:obj2 && _displayString != nil)
{
id displayValue=nil;
[_item setValue:item
inComponent:component]; inComponent:component];
displayValue= [_displayString valueInComponent:component]; displayValue= [_displayString valueInComponent:component];
if (displayValue == nil) { if (displayValue == nil)
dispStr = NSStringWithObject(obj2); {
displayString = NSStringWithObject(displayValue);
NSLog(@"%s: 'displayString' evaluated to nil in component %@. Using %@", NSLog(@"%s: 'displayString' evaluated to nil in component %@. Using %@",
__PRETTY_FUNCTION__, component, dispStr); __PRETTY_FUNCTION__, component, displayString);
} else {
dispStr = NSStringWithObject(displayValue);
} }
} else { else
dispStr = NSStringWithObject(obj2); {
displayString = NSStringWithObject(displayValue);
} }
}
else
displayString = NSStringWithObject(item);
GSWResponse_appendContentAsciiString(response, @"<input name=\""); GSWResponse_appendContentAsciiString(response, @"<input name=\"");
GSWResponse_appendContentString(response,ctxName); GSWResponse_appendContentString(response,ctxName);
GSWResponse_appendContentAsciiString(response,@"\" type=checkbox value=\""); GSWResponse_appendContentAsciiString(response,@"\" type=checkbox value=\"");
if (_value != nil) if (_value != nil)
{ {
valueValue = [_value valueInComponent:component]; value = [_value valueInComponent:component];
if (valueValue != nil) { if (value != nil)
GSWResponse_appendContentHTMLConvertString(response, NSStringWithObject(valueValue)); {
} else { GSWResponse_appendContentHTMLConvertString(response, NSStringWithObject(value));
}
else
{
NSLog(@"%s: 'value' evaluated to nil in component %@. Using to index.", NSLog(@"%s: 'value' evaluated to nil in component %@. Using to index.",
__PRETTY_FUNCTION__, self); __PRETTY_FUNCTION__, self);
} }
} }
if (valueValue == nil) { if (value == nil)
GSWResponse_appendContentAsciiString(response,GSWIntToNSString(j)); GSWResponse_appendContentAsciiString(response,GSWIntToNSString(i));
}
if ([selectionsValue containsObject:obj2]) {
GSWResponse_appendContentAsciiString(response,@"\" checked>");
} else {
GSWResponse_appendContentAsciiString(response,@"\">");
}
if (prefixStr != nil) {
GSWResponse_appendContentString(response,prefixStr);
}
if (doEscape)
{
GSWResponse_appendContentHTMLConvertString(response,dispStr);
} else {
GSWResponse_appendContentString(response,dispStr);
}
if (suffixStr != nil) {
GSWResponse_appendContentString(response,suffixStr);
}
} // for
if ([selections containsObject:item])
GSWResponse_appendContentAsciiString(response,@"\" checked>");
else
GSWResponse_appendContentAsciiString(response,@"\">");
if (prefixStr != nil)
GSWResponse_appendContentString(response,prefixStr);
if (doEscape)
GSWResponse_appendContentHTMLConvertString(response,displayString);
else
GSWResponse_appendContentString(response,displayString);
if (suffixStr != nil)
GSWResponse_appendContentString(response,suffixStr);
} // for
}
} }
-(BOOL)appendStringAtRight:(id)_unkwnon -(BOOL)appendStringAtRight:(id)_unkwnon
@ -388,16 +385,18 @@ static Class standardClass = Nil;
-(void)takeValuesFromRequest:(GSWRequest*)request -(void)takeValuesFromRequest:(GSWRequest*)request
inContext:(GSWContext*)context inContext:(GSWContext*)context
{ {
if (_value != nil) { if (_value != nil)
if (!_loggedSlow) { {
if (!_loggedSlow)
{
NSLog(@"%s Warning: Avoid using the 'value' binding as it is much slower than omitting it, and it is just cosmetic.", NSLog(@"%s Warning: Avoid using the 'value' binding as it is much slower than omitting it, and it is just cosmetic.",
__PRETTY_FUNCTION__); __PRETTY_FUNCTION__);
_loggedSlow = YES; _loggedSlow = YES;
} }
[self _slowTakeValuesFromRequest:request inContext:context]; [self _slowTakeValuesFromRequest:request inContext:context];
} else {
[self _fastTakeValuesFromRequest:request inContext:context];
} }
else
[self _fastTakeValuesFromRequest:request inContext:context];
} }
@end @end

View file

@ -44,6 +44,11 @@ GSWEB_EXPORT BYTE ElementsMap_attributeElement;
@class GSWContext; @class GSWContext;
@class GSWRequest; @class GSWRequest;
@class GSWAssociation;
GSWEB_EXPORT GSWAssociation* GSWAssignAndRemoveAssociation(GSWAssociation** associationPtr,
NSMutableDictionary* associations,
NSString* associationName);
#ifndef NDEBBUG #ifndef NDEBBUG
#define GSWELEMENT_HAS_DECLARATION_NAME #define GSWELEMENT_HAS_DECLARATION_NAME

View file

@ -45,6 +45,16 @@ BYTE ElementsMap_gswebElement = (BYTE)0x57; // 'W'
BYTE ElementsMap_dynamicElement = (BYTE)0x43; // 'C' BYTE ElementsMap_dynamicElement = (BYTE)0x43; // 'C'
BYTE ElementsMap_attributeElement = (BYTE)0x41; // 'A' BYTE ElementsMap_attributeElement = (BYTE)0x41; // 'A'
GSWAssociation* GSWAssignAndRemoveAssociation(GSWAssociation** associationPtr,
NSMutableDictionary* associations,
NSString* associationName)
{
ASSIGN(*associationPtr,([associations objectForKey:associationName]));
if (*associationPtr)
[associations removeObjectForKey:associationName];
return *associationPtr;
}
//==================================================================== //====================================================================
@implementation GSWElement @implementation GSWElement