sogo/UI/Common/UIxTabItem.m
dev-unix.inverse.qc.ca f18c764ffa see ChangeLog
Monotone-Revision: 9054022ef1ca8aeba6e34842d27d9b94ce002b89

Monotone-Author: dev-unix.inverse.qc.ca
Monotone-Date: 2006-06-15T19:34:10
Monotone-Branch: ca.inverse.sogo
2006-06-15 19:34:10 +00:00

476 lines
13 KiB
Objective-C

/*
Copyright (C) 2000-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#include "UIxTabView.h"
#include "common.h"
#if DEBUG
# define DEBUG_JS 1
#endif
/* context keys */
extern NSString *UIxTabView_HEAD;
extern NSString *UIxTabView_BODY;
extern NSString *UIxTabView_KEYS;
extern NSString *UIxTabView_SCRIPT;
extern NSString *UIxTabView_ACTIVEKEY;
extern NSString *UIxTabView_COLLECT;
@implementation UIxTabItem
static Class StrClass = Nil;
+ (int)version {
return [super version] + 0;
}
+ (void)initialize {
StrClass = [NSString class];
}
static NSString *retStrForInt(int i) {
switch(i) {
case 0: return @"0";
case 1: return @"1";
case 2: return @"2";
case 3: return @"3";
case 4: return @"4";
case 5: return @"5";
case 6: return @"6";
case 7: return @"7";
case 8: return @"8";
case 9: return @"9";
case 10: return @"10";
// TODO: find useful count!
default:
return [[StrClass alloc] initWithFormat:@"%i", i];
}
}
- (id)initWithName:(NSString *)_name
associations:(NSDictionary *)_config
template:(WOElement *)_subs
{
if ((self = [super initWithName:_name associations:_config template:_subs])) {
self->key = WOExtGetProperty(_config, @"key");
self->label = WOExtGetProperty(_config, @"label");
self->isScript = WOExtGetProperty(_config, @"isScript");
self->href = WOExtGetProperty(_config, @"href");
self->icon = WOExtGetProperty(_config, @"icon");
self->action = WOExtGetProperty(_config, @"action");
self->tabStyle = WOExtGetProperty(_config, @"tabStyle");
self->selectedTabStyle = WOExtGetProperty(_config, @"selectedTabStyle");
self->tabIcon = WOExtGetProperty(_config, @"tabIcon");
self->leftTabIcon = WOExtGetProperty(_config, @"leftTabIcon");
self->selectedTabIcon = WOExtGetProperty(_config, @"selectedTabIcon");
self->asBackground = WOExtGetProperty(_config, @"asBackground");
self->width = WOExtGetProperty(_config, @"width");
self->height = WOExtGetProperty(_config, @"height");
self->activeBgColor = WOExtGetProperty(_config, @"activeBgColor");
self->inactiveBgColor = WOExtGetProperty(_config, @"inactiveBgColor");
self->template = [_subs retain];
}
return self;
}
- (void)dealloc {
[self->key release];
[self->label release];
[self->href release];
[self->action release];
[self->isScript release];
[self->template release];
[self->tabStyle release];
[self->selectedTabStyle release];
[self->icon release];
[self->leftTabIcon release];
[self->selectedTabIcon release];
[self->tabIcon release];
[self->asBackground release];
[self->width release];
[self->height release];
[self->activeBgColor release];
[self->inactiveBgColor release];
[super dealloc];
}
/* responder */
- (void)takeValuesFromRequest:(WORequest *)_rq inContext:(WOContext *)_ctx {
NSString *activeTabKey;
NSString *myTabKey;
BOOL doCheck;
if ([_ctx objectForKey:UIxTabView_HEAD]) {
/* head clicks */
[[_ctx component] debugWithFormat:
@"UIxTabItem: head takes (no) values, eid='%@'",
[_ctx elementID]];
return;
}
if ((activeTabKey = [_ctx objectForKey:UIxTabView_BODY]) == nil) {
[[_ctx component] debugWithFormat:@"UIxTabItem: invalid state"];
[self->template takeValuesFromRequest:_rq inContext:_ctx];
return;
}
myTabKey = [self->key stringValueInComponent:[_ctx component]];
doCheck = [self->isScript boolValueInComponent:[_ctx component]];
if ([activeTabKey isEqualToString:myTabKey] || doCheck) {
#if ADD_OWN_ELEMENTIDS
[_ctx appendElementIDComponent:activeTabKey];
#endif
#if DEBUG_TAKEVALUES
[[_ctx component] debugWithFormat:
@"UIxTabItem: body takes values, eid='%@'",
[_ctx elementID]];
#endif
[self->template takeValuesFromRequest:_rq inContext:_ctx];
#if ADD_OWN_ELEMENTIDS
[_ctx deleteLastElementIDComponent];
#endif
}
#if DEBUG_TAKEVALUES
else {
[[_ctx component] debugWithFormat:
@"UIxTabItem: body takes no values, eid='%@'",
[_ctx elementID]];
}
#endif
}
- (id)invokeActionForRequest:(WORequest *)_req inContext:(WOContext *)_ctx {
id result;
WOAssociation *tmp;
NSString *activeTabKey;
if ((tmp = [_ctx objectForKey:UIxTabView_HEAD])) {
/* click on tab icon */
NSString *tabkey;
tabkey = [_ctx currentElementID];
[_ctx consumeElementID];
[_ctx appendElementIDComponent:tabkey];
if ([tmp isValueSettable])
[tmp setValue:tabkey inComponent:[_ctx component]];
#if 0
result = [self->action valueInComponent:[_ctx component]];
#endif
[_ctx deleteLastElementIDComponent];
}
else if ((activeTabKey = [_ctx objectForKey:UIxTabView_BODY])) {
/* clicked somewhere in the (active) body */
result = [self->template invokeActionForRequest:_req inContext:_ctx];
}
else {
[[_ctx component] logWithFormat:@"UIxTabItem: invalid invoke state"];
result = [self->template invokeActionForRequest:_req inContext:_ctx];
}
return result;
}
/* info collection */
- (void)_collectInContext:(WOContext *)_ctx key:(NSString *)k {
BOOL isLeft = NO;
NSMutableArray *keys;
UIxTabItemInfo *info;
WOComponent *cmp;
cmp = [_ctx component];
keys = [_ctx objectForKey:UIxTabView_KEYS];
if (keys == nil) {
keys = [[[NSMutableArray alloc] init] autorelease];
[_ctx setObject:keys forKey:UIxTabView_KEYS];
isLeft = YES;
}
if (k == nil) {
/* auto-assign a key */
k = retStrForInt([keys count]);
}
else
k = [k retain];
[_ctx appendElementIDComponent:k];
info = [[UIxTabItemInfo alloc] init];
info->key = [k copy];
info->label = [[self->label stringValueInComponent:cmp] copy];
info->icon = [[self->icon stringValueInComponent:cmp] copy];
#if 0
info->uri = [[_ctx componentActionURL] copy];
#else
info->uri = [[self->href stringValueInComponent:cmp] copy];
#endif
info->isScript = [self->isScript boolValueInComponent:cmp];
info->tabIcon = [[self->tabIcon stringValueInComponent:cmp] copy];
info->leftIcon = [[self->leftTabIcon stringValueInComponent:cmp] copy];
info->selIcon = [[self->selectedTabIcon stringValueInComponent:cmp]
copy];
info->tabStyle = [[self->tabStyle stringValueInComponent:cmp] copy];
info->selectedTabStyle = [[self->selectedTabStyle stringValueInComponent:cmp]
copy];
if (self->asBackground == nil)
info->asBackground = 0;
else {
info->asBackground
= ([self->asBackground boolValueInComponent:cmp]) ? 1 : -1;
}
info->width = [[self->width stringValueInComponent:cmp] copy];
info->height = [[self->height stringValueInComponent:cmp] copy];
info->activeBg = [[self->activeBgColor stringValueInComponent:cmp]
copy];
info->inactiveBg = [[self->inactiveBgColor stringValueInComponent:cmp]
copy];
if (info->leftIcon == nil) info->leftIcon = [info->tabIcon copy];
[keys addObject:info];
[info release];
[k release];
[_ctx deleteLastElementIDComponent];
}
/* header generation */
- (void)_appendHeadToResponse:(WOResponse *)_response
inContext:(WOContext *)_ctx
activeKey:(NSString *)activeKey
key:(NSString *)k
{
/* head is currently generated in UIxTabView */
#if 0
// note: some associations can be inherited by UIxTabView !
BOOL doImages;
WOComponent *comp;
BOOL doBgIcon;
NSString *label;
NSString *w, *h;
doImages = ![[[_ctx request] clientCapabilities] isTextModeBrowser];
comp = [_ctx component];
doBgIcon = self->asBackground && doImages
? [self->asBackground boolValueInComponent:comp] ? YES : NO
: NO;
if ((label = [self->label stringValueInComponent:comp]) == nil)
label = k;
if (doImages) {
/* lookup image */
NSString *imgName = nil;
// ...
imgUri = WEUriOfResource(imgName, _ctx);
if ([imgUri length] < 1)
doImages = NO;
}
// .... _isActive
#endif
}
/* body generation */
- (void)_appendBodyToResponse:(WOResponse *)_response
inContext:(WOContext *)_ctx
activeKey:(NSString *)tmp
key:(NSString *)k
{
BOOL doScript;
BOOL isScript_;
BOOL isActive;
doScript = [[_ctx objectForKey:UIxTabView_SCRIPT] boolValue];
isScript_ = [self->isScript boolValueInComponent:[_ctx component]];
isActive = [tmp isEqualToString:k];
if (doScript && (isActive || isScript_)) {
[_response appendContentString:@"<div id=\""];
[_response appendContentString:k];
[_response appendContentString:@"TabLayer\" style=\"display: none;\">\n"];
}
if (isActive || (doScript && isScript_)) {
/* content is active or used as layer*/
#if ADD_OWN_ELEMENTIDS
[_ctx appendElementIDComponent:k];
#endif
#if DEBUG && 0
NSLog(@"TAB: %@", k);
#endif
[self->template appendToResponse:_response inContext:_ctx];
#if ADD_OWN_ELEMENTIDS
[_ctx deleteLastElementIDComponent];
#endif
}
if (doScript && (isActive || isScript_)) {
NSString *jsout;
[_response appendContentString:@"</div>"];
jsout = [NSString alloc];
jsout = [jsout initWithFormat:
@"<script language=\"JavaScript\">\n<!--\n"
@"%@Tab[\"Div\"] = %@TabLayer;\n",
k, k];
[_response appendContentString:jsout];
[jsout release];
#if DEBUG_JS
jsout = [NSString alloc];
jsout = [jsout initWithFormat:
@"if (%@Tab[\"Div\"].style==null) {"
@"alert('missing style in div for tab %@');}",
k, k];
[_response appendContentString:jsout];
[jsout release];
#endif
if (isActive) {
[_response appendContentString:@"showTab("];
[_response appendContentString:k];
[_response appendContentString:@"Tab);\n"];
}
[_response appendContentString:@"//-->\n</script>"];
}
}
/* master generation method */
- (void)appendToResponse:(WOResponse *)_response inContext:(WOContext *)_ctx {
NSString *k;
BOOL doForm;
id tmp;
doForm = [_ctx isInForm];
k = [self->key stringValueInComponent:[_ctx component]];
if ((tmp = [_ctx objectForKey:UIxTabView_HEAD])) {
if ([tmp isEqual:UIxTabView_COLLECT]) {
[self _collectInContext:_ctx key:k];
}
else {
[self _appendHeadToResponse:_response inContext:_ctx
activeKey:tmp key:k];
}
}
else if ((tmp = [_ctx objectForKey:UIxTabView_BODY])) {
[self _appendBodyToResponse:_response inContext:_ctx
activeKey:tmp key:k];
}
else {
[self warnWithFormat:@"(%s): invalid UIxTabItem state !!!",
__PRETTY_FUNCTION__];
[_response appendContentString:@"[invalid state]"];
}
}
@end /* UIxTabItem */
@implementation UIxTabItemInfo
- (void)dealloc {
[self->uri release];
[self->icon release];
[self->label release];
[self->key release];
[self->tabStyle release];
[self->selectedTabStyle release];
[self->tabIcon release];
[self->selIcon release];
[self->leftIcon release];
[self->width release];
[self->height release];
[self->activeBg release];
[self->inactiveBg release];
[super dealloc];
}
/* accessors */
- (NSString *)key {
return self->key;
}
- (NSString *)label {
return self->label;
}
- (NSString *)icon {
return self->icon;
}
- (NSString *)uri {
return self->uri;
}
- (BOOL)isScript {
return self->isScript;
}
- (int)asBackground {
return self->asBackground;
}
- (NSString *)width {
return self->width;
}
- (NSString *)height {
return self->height;
}
- (NSString *)activeBg {
return self->activeBg;
}
- (NSString *)inactiveBg {
return self->inactiveBg;
}
@end /* UIxTabItemInfo */