Monotone-Parent: fdaa9bb9f2456732024f9c342a2ebc46376564c1
Monotone-Revision: 28b77f21d4bb7c941a2ab46340a22efd022cde3d Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2007-11-18T09:39:49 Monotone-Branch: ca.inverse.sogo
This commit is contained in:
parent
2f23567109
commit
6efe8c5980
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
2007-11-18 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* UI/Common/UIxTabItem.m: removed useless class module.
|
||||
|
||||
* UI/Common/UIxTabView.[hm]: removed useless class module.
|
||||
|
||||
* UI/Common/UIxPrintPageFrame.m: removed useless class module.
|
||||
|
||||
* UI/Common/UIxAppNavView.m: removed useless class module.
|
||||
|
||||
2007-11-16 Ludovic Marcotte <ludovic@inverse.ca>
|
||||
|
||||
* SoObjects/Mailer/SOGoMailBaseObject.m
|
||||
|
|
|
@ -1,101 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2004 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.
|
||||
*/
|
||||
|
||||
#import <NGObjWeb/SoObject+SoDAV.h>
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
|
||||
#import <SOGoUI/UIxComponent.h>
|
||||
|
||||
@interface UIxAppNavView : UIxComponent
|
||||
{
|
||||
id element;
|
||||
id lastElement;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIxAppNavView
|
||||
|
||||
- (void)dealloc {
|
||||
[element release];
|
||||
[lastElement release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
/* accessors */
|
||||
|
||||
- (void)setElement:(id)_element {
|
||||
ASSIGN(element, _element);
|
||||
}
|
||||
- (id)element {
|
||||
return element;
|
||||
}
|
||||
|
||||
- (void)setLastElement:(id)_element {
|
||||
ASSIGN(lastElement, _element);
|
||||
}
|
||||
- (id)lastElement {
|
||||
return lastElement;
|
||||
}
|
||||
|
||||
/* navigation */
|
||||
|
||||
- (NSArray *)navPathElements {
|
||||
NSArray *traversalObjects;
|
||||
NSMutableArray *navPathComponents;
|
||||
unsigned int i, count;
|
||||
|
||||
traversalObjects = [[self context] objectTraversalStack];
|
||||
count = ([traversalObjects count] - 1); /* remove SoPageInvocation */
|
||||
|
||||
navPathComponents = [[NSMutableArray alloc] initWithCapacity:count];
|
||||
for (i = 0; i < count; i++) {
|
||||
NSString *name;
|
||||
id obj;
|
||||
|
||||
obj = [traversalObjects objectAtIndex:i];
|
||||
|
||||
name = [obj davDisplayName];
|
||||
if ([name length] == 0)
|
||||
name = NSStringFromClass([obj class]);
|
||||
name = [self labelForKey:name];
|
||||
|
||||
if (![name hasPrefix:@"sogod"]) {
|
||||
NSMutableDictionary *c;
|
||||
NSString *url;
|
||||
|
||||
url = [obj baseURLInContext:[self context]];
|
||||
if (![url hasSuffix:@"/"])
|
||||
url = [url stringByAppendingString:@"/"];
|
||||
|
||||
c = [[NSMutableDictionary alloc] initWithCapacity:2];
|
||||
[c setObject:name forKey:@"name"];
|
||||
[c setObject:url forKey:@"url"];
|
||||
[navPathComponents addObject:c];
|
||||
[c release];
|
||||
}
|
||||
}
|
||||
|
||||
[self setLastElement:[navPathComponents lastObject]];
|
||||
return [navPathComponents autorelease];
|
||||
}
|
||||
|
||||
@end /* UIxAppNavView */
|
|
@ -1,53 +0,0 @@
|
|||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
#import <NGObjWeb/SoComponent.h>
|
||||
|
||||
@class NSString;
|
||||
|
||||
@interface UIxPrintPageFrame : SoComponent
|
||||
{
|
||||
NSString *title;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIxPrintPageFrame
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
[title release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
/* accessors */
|
||||
|
||||
- (void)setTitle: (NSString *) _value
|
||||
{
|
||||
ASSIGNCOPY (title, _value);
|
||||
}
|
||||
|
||||
- (NSString *) title
|
||||
{
|
||||
return title;
|
||||
}
|
||||
|
||||
@end /* UIxPrintPageFrame */
|
|
@ -1,475 +0,0 @@
|
|||
/*
|
||||
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 */
|
|
@ -1,133 +0,0 @@
|
|||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef __UIxTabView_H__
|
||||
#define __UIxTabView_H__
|
||||
|
||||
/*
|
||||
This is a library private header !
|
||||
*/
|
||||
|
||||
#include <NGObjWeb/WODynamicElement.h>
|
||||
|
||||
/*
|
||||
Does not support tab-head-creation from nested components !!!
|
||||
|
||||
hh: Why not ??? -> Because selection is manipulated in sub-elements
|
||||
|
||||
UIxTabView creates element-IDs like
|
||||
|
||||
.h.*.$key. for the tab-items (head-mode)
|
||||
.b.$key... for the tab-content (content-mode) (new, hh)
|
||||
|
||||
!!! UIxTabView JavaScript can't handle duplicate tab-keys !!!
|
||||
*/
|
||||
|
||||
@interface UIxTabView : WODynamicElement
|
||||
{
|
||||
WOAssociation *selection;
|
||||
|
||||
/* config: */
|
||||
WOAssociation *headerStyle;
|
||||
WOAssociation *bodyStyle;
|
||||
WOAssociation *tabStyle;
|
||||
WOAssociation *selectedTabStyle;
|
||||
|
||||
/* old config: */
|
||||
WOAssociation *bgColor;
|
||||
WOAssociation *nonSelectedBgColor;
|
||||
WOAssociation *leftCornerIcon;
|
||||
WOAssociation *rightCornerIcon;
|
||||
|
||||
WOAssociation *tabIcon;
|
||||
WOAssociation *leftTabIcon;
|
||||
WOAssociation *selectedTabIcon;
|
||||
|
||||
WOAssociation *asBackground;
|
||||
WOAssociation *width;
|
||||
WOAssociation *height;
|
||||
WOAssociation *activeBgColor;
|
||||
WOAssociation *inactiveBgColor;
|
||||
|
||||
WOAssociation *fontColor;
|
||||
WOAssociation *fontSize;
|
||||
WOAssociation *fontFace;
|
||||
|
||||
id template;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@interface UIxTabItem : WODynamicElement
|
||||
{
|
||||
WOAssociation *key;
|
||||
WOAssociation *label;
|
||||
|
||||
WOAssociation *href;
|
||||
WOAssociation *isScript;
|
||||
|
||||
WOAssociation *action;
|
||||
WOAssociation *icon;
|
||||
|
||||
/* config: */
|
||||
WOAssociation *tabStyle;
|
||||
WOAssociation *selectedTabStyle;
|
||||
|
||||
/* old config */
|
||||
WOAssociation *tabIcon;
|
||||
WOAssociation *leftTabIcon;
|
||||
WOAssociation *selectedTabIcon;
|
||||
|
||||
WOAssociation *asBackground;
|
||||
WOAssociation *width;
|
||||
WOAssociation *height;
|
||||
WOAssociation *activeBgColor;
|
||||
WOAssociation *inactiveBgColor;
|
||||
|
||||
id template;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@interface UIxTabItemInfo : NSObject
|
||||
{
|
||||
@public
|
||||
NSString *label;
|
||||
NSString *icon;
|
||||
NSString *key;
|
||||
NSString *uri;
|
||||
NSString *tabIcon;
|
||||
NSString *leftIcon;
|
||||
NSString *selIcon;
|
||||
NSString *tabStyle;
|
||||
NSString *selectedTabStyle;
|
||||
|
||||
int asBackground; // 0 -> not set, 1 -> YES, else -> NO
|
||||
NSString *width;
|
||||
NSString *height;
|
||||
NSString *activeBg;
|
||||
NSString *inactiveBg;
|
||||
|
||||
BOOL isScript;
|
||||
}
|
||||
@end
|
||||
|
||||
#endif /* __UIxTabView_H__ */
|
|
@ -1,684 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2000-2004 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"
|
||||
#include <NGObjWeb/NGObjWeb.h>
|
||||
#include <NGExtensions/NGExtensions.h>
|
||||
#include <EOControl/EOControl.h>
|
||||
#include <NGObjWeb/WEClientCapabilities.h>
|
||||
|
||||
#if DEBUG
|
||||
// # define DEBUG_TAKEVALUES 1
|
||||
# define DEBUG_JS 1
|
||||
#endif
|
||||
|
||||
/* context keys */
|
||||
NSString *UIxTabView_HEAD = @"UIxTabView_head";
|
||||
NSString *UIxTabView_BODY = @"UIxTabView_body";
|
||||
NSString *UIxTabView_KEYS = @"UIxTabView_keys";
|
||||
NSString *UIxTabView_SCRIPT = @"UIxTabView_script";
|
||||
NSString *UIxTabView_ACTIVEKEY = @"UIxTabView_activekey";
|
||||
NSString *UIxTabView_COLLECT = @"~tv~";
|
||||
|
||||
@implementation UIxTabView
|
||||
|
||||
static NSNumber *YesNumber;
|
||||
|
||||
+ (void)initialize {
|
||||
if (YesNumber == nil)
|
||||
YesNumber = [[NSNumber numberWithBool:YES] retain];
|
||||
}
|
||||
|
||||
+ (int)version {
|
||||
return [super version] + 0;
|
||||
}
|
||||
|
||||
- (id)initWithName:(NSString *)_name
|
||||
associations:(NSDictionary *)_config
|
||||
template:(WOElement *)_subs
|
||||
{
|
||||
if ((self = [super initWithName:_name associations:_config template:_subs])) {
|
||||
self->selection = WOExtGetProperty(_config, @"selection");
|
||||
|
||||
self->headerStyle = WOExtGetProperty(_config, @"headerStyle");
|
||||
self->bodyStyle = WOExtGetProperty(_config, @"bodyStyle");
|
||||
self->tabStyle = WOExtGetProperty(_config, @"tabStyle");
|
||||
self->selectedTabStyle = WOExtGetProperty(_config, @"selectedTabStyle");
|
||||
|
||||
self->bgColor = WOExtGetProperty(_config, @"bgColor");
|
||||
self->nonSelectedBgColor = WOExtGetProperty(_config, @"nonSelectedBgColor");
|
||||
self->leftCornerIcon = WOExtGetProperty(_config, @"leftCornerIcon");
|
||||
self->rightCornerIcon = WOExtGetProperty(_config, @"rightCornerIcon");
|
||||
|
||||
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->fontColor = WOExtGetProperty(_config, @"fontColor");
|
||||
self->fontSize = WOExtGetProperty(_config, @"fontSize");
|
||||
self->fontFace = WOExtGetProperty(_config, @"fontFace");
|
||||
|
||||
self->template = RETAIN(_subs);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[self->selection release];
|
||||
|
||||
[self->headerStyle release];
|
||||
[self->bodyStyle release];
|
||||
[self->tabStyle release];
|
||||
[self->selectedTabStyle release];
|
||||
|
||||
RELEASE(self->bgColor);
|
||||
RELEASE(self->nonSelectedBgColor);
|
||||
RELEASE(self->leftCornerIcon);
|
||||
RELEASE(self->rightCornerIcon);
|
||||
|
||||
RELEASE(self->leftTabIcon);
|
||||
RELEASE(self->selectedTabIcon);
|
||||
RELEASE(self->tabIcon);
|
||||
|
||||
RELEASE(self->width);
|
||||
RELEASE(self->height);
|
||||
|
||||
RELEASE(self->activeBgColor);
|
||||
RELEASE(self->inactiveBgColor);
|
||||
|
||||
RELEASE(self->fontColor);
|
||||
RELEASE(self->fontSize);
|
||||
RELEASE(self->fontFace);
|
||||
|
||||
RELEASE(self->template);
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
/* nesting */
|
||||
|
||||
- (id)saveNestedStateInContext:(WOContext *)_ctx {
|
||||
return nil;
|
||||
}
|
||||
- (void)restoreNestedState:(id)_state inContext:(WOContext *)_ctx {
|
||||
if (_state == nil) return;
|
||||
}
|
||||
|
||||
- (NSArray *)collectKeysInContext:(WOContext *)_ctx {
|
||||
/* collect mode, collects all keys */
|
||||
[_ctx setObject:UIxTabView_COLLECT forKey:UIxTabView_HEAD];
|
||||
|
||||
[self->template appendToResponse:nil inContext:_ctx];
|
||||
|
||||
[_ctx removeObjectForKey:UIxTabView_HEAD];
|
||||
return [_ctx objectForKey:UIxTabView_KEYS];
|
||||
}
|
||||
|
||||
/* responder */
|
||||
|
||||
- (void)takeValuesFromRequest:(WORequest *)_req inContext:(WOContext *)_ctx {
|
||||
id nestedState;
|
||||
NSString *activeTabKey;
|
||||
|
||||
activeTabKey = [self->selection stringValueInComponent:[_ctx component]];
|
||||
NSLog(@"%s activeTabKey:%@", __PRETTY_FUNCTION__, activeTabKey);
|
||||
nestedState = [self saveNestedStateInContext:_ctx];
|
||||
[_ctx appendElementIDComponent:@"b"];
|
||||
[_ctx appendElementIDComponent:activeTabKey];
|
||||
|
||||
[_ctx setObject:activeTabKey forKey:UIxTabView_BODY];
|
||||
|
||||
#if DEBUG_TAKEVALUES
|
||||
[[_ctx component] debugWithFormat:@"UIxTabView: body takes values, eid='%@'",
|
||||
[_ctx elementID]];
|
||||
#endif
|
||||
|
||||
[self->template takeValuesFromRequest:_req inContext:_ctx];
|
||||
|
||||
[_ctx removeObjectForKey:UIxTabView_BODY];
|
||||
[_ctx deleteLastElementIDComponent]; // activeKey
|
||||
[_ctx deleteLastElementIDComponent]; /* 'b' */
|
||||
[self restoreNestedState:nestedState inContext:_ctx];
|
||||
}
|
||||
|
||||
- (id)invokeActionForRequest:(WORequest *)_req inContext:(WOContext *)_ctx {
|
||||
NSString *key;
|
||||
id result;
|
||||
id nestedState;
|
||||
|
||||
if ((key = [_ctx currentElementID]) == nil)
|
||||
return nil;
|
||||
|
||||
result = nil;
|
||||
nestedState = [self saveNestedStateInContext:_ctx];
|
||||
|
||||
if ([key isEqualToString:@"h"]) {
|
||||
/* header action */
|
||||
//NSString *urlKey;
|
||||
|
||||
[_ctx consumeElementID];
|
||||
[_ctx appendElementIDComponent:@"h"];
|
||||
#if 0
|
||||
if ((urlKey = [_ctx currentElementID]) == nil) {
|
||||
[[_ctx application]
|
||||
debugWithFormat:@"missing active head tab key !"];
|
||||
}
|
||||
else {
|
||||
//NSLog(@"clicked: %@", urlKey);
|
||||
[_ctx consumeElementID];
|
||||
[_ctx appendElementIDComponent:urlKey];
|
||||
}
|
||||
#endif
|
||||
|
||||
[_ctx setObject:self->selection forKey:UIxTabView_HEAD];
|
||||
result = [self->template invokeActionForRequest:_req inContext:_ctx];
|
||||
[_ctx removeObjectForKey:UIxTabView_HEAD];
|
||||
|
||||
#if 0
|
||||
if (urlKey)
|
||||
[_ctx deleteLastElementIDComponent]; // active key
|
||||
#endif
|
||||
[_ctx deleteLastElementIDComponent]; // 'h'
|
||||
}
|
||||
else if ([key isEqualToString:@"b"]) {
|
||||
/* body action */
|
||||
NSString *activeTabKey, *urlKey;
|
||||
|
||||
[_ctx consumeElementID];
|
||||
[_ctx appendElementIDComponent:@"b"];
|
||||
|
||||
if ((urlKey = [_ctx currentElementID]) == nil) {
|
||||
[[_ctx application]
|
||||
debugWithFormat:@"missing active body tab key !"];
|
||||
}
|
||||
else {
|
||||
//NSLog(@"clicked: %@", urlKey);
|
||||
[_ctx consumeElementID];
|
||||
[_ctx appendElementIDComponent:urlKey];
|
||||
}
|
||||
|
||||
activeTabKey = [self->selection stringValueInComponent:[_ctx component]];
|
||||
[_ctx setObject:activeTabKey forKey:UIxTabView_BODY];
|
||||
|
||||
result = [self->template invokeActionForRequest:_req inContext:_ctx];
|
||||
|
||||
[_ctx removeObjectForKey:UIxTabView_BODY];
|
||||
|
||||
if (urlKey)
|
||||
[_ctx deleteLastElementIDComponent]; // active key
|
||||
[_ctx deleteLastElementIDComponent]; // 'b'
|
||||
}
|
||||
else {
|
||||
[[_ctx application]
|
||||
debugWithFormat:@"unknown tab container key '%@'", key];
|
||||
}
|
||||
|
||||
[self restoreNestedState:nestedState inContext:_ctx];
|
||||
return result;
|
||||
}
|
||||
|
||||
- (NSString *)_tabViewCountInContext:(WOContext *)_ctx {
|
||||
int count;
|
||||
count = [[_ctx valueForKey:@"UIxTabViewScriptDone"] intValue];
|
||||
return [NSString stringWithFormat:@"%d",count];
|
||||
}
|
||||
|
||||
- (NSString *)scriptHref:(UIxTabItemInfo *)_info
|
||||
inContext:(WOContext *)_ctx
|
||||
isLeft:(BOOL)_isLeft
|
||||
keys:(NSArray *)_keys
|
||||
{
|
||||
NSMutableString *result = [NSMutableString string];
|
||||
UIxTabItemInfo *tmp;
|
||||
NSString *activeKey;
|
||||
int i, cnt;
|
||||
NSString *elID;
|
||||
NSString *tstring;
|
||||
|
||||
activeKey = [self->selection stringValueInComponent:[_ctx component]];
|
||||
[result appendString:@"JavaScript:showTab("];
|
||||
[result appendString:_info->key];
|
||||
[result appendString:@"Tab);"];
|
||||
|
||||
[result appendString:@"swapCorners("];
|
||||
tstring = (!_isLeft)
|
||||
? @"tabCorner%@,tabCornerLeft%@);"
|
||||
: @"tabCornerLeft%@,tabCorner%@);";
|
||||
elID = [self _tabViewCountInContext:_ctx];
|
||||
[result appendString:[NSString stringWithFormat:tstring,elID,elID]];
|
||||
|
||||
for (i=0, cnt = [_keys count]; i < cnt; i++) {
|
||||
tmp = [_keys objectAtIndex:i];
|
||||
|
||||
if ((tmp->isScript || [tmp->key isEqualToString:activeKey])
|
||||
&& ![tmp->key isEqualToString:_info->key]) {
|
||||
[result appendString:@"hideTab("];
|
||||
[result appendString:tmp->key];
|
||||
[result appendString:@"Tab);"];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
- (void)appendLink:(UIxTabItemInfo *)_info
|
||||
toResponse:(WOResponse *)_response
|
||||
inContext:(WOContext *)_ctx
|
||||
isActive:(BOOL)_isActive isLeft:(BOOL)_isLeft
|
||||
doScript:(BOOL)_doScript keys:(NSArray *)_keys
|
||||
{
|
||||
NSString *headUri = nil;
|
||||
NSString *label = nil;
|
||||
NSString *styleName = nil;
|
||||
WEClientCapabilities *ccaps;
|
||||
WOComponent *comp;
|
||||
|
||||
ccaps = [[_ctx request] clientCapabilities];
|
||||
|
||||
comp = [_ctx component];
|
||||
headUri = _info->uri;
|
||||
|
||||
if ((label = _info->label) == nil)
|
||||
label = _info->key;
|
||||
|
||||
if (_isActive) {
|
||||
styleName = (_info->selectedTabStyle)
|
||||
? _info->selectedTabStyle
|
||||
: [self->selectedTabStyle stringValueInComponent:comp];
|
||||
}
|
||||
else {
|
||||
styleName = (_info->tabStyle)
|
||||
? _info->tabStyle
|
||||
: [self->tabStyle stringValueInComponent:comp];
|
||||
}
|
||||
|
||||
[_response appendContentString:@"<td align='center' valign='middle'"];
|
||||
|
||||
if (styleName) {
|
||||
[_response appendContentString:@" class='"];
|
||||
[_response appendContentHTMLAttributeValue:styleName];
|
||||
[_response appendContentCharacter:'\''];
|
||||
}
|
||||
|
||||
// click on td background
|
||||
if ([ccaps isInternetExplorer] && [ccaps isJavaScriptBrowser]) {
|
||||
[_response appendContentString:@" onclick=\"window.location.href='"];
|
||||
[_response appendContentHTMLAttributeValue:headUri];
|
||||
[_response appendContentString:@"'\""];
|
||||
}
|
||||
|
||||
[_response appendContentCharacter:'>'];
|
||||
|
||||
[_response appendContentString:@"<a href=\""];
|
||||
|
||||
[_response appendContentHTMLAttributeValue:headUri];
|
||||
|
||||
[_response appendContentString:@"\" "];
|
||||
[_response appendContentString:
|
||||
[NSString stringWithFormat:@"name='%@TabLink'", _info->key]];
|
||||
[_response appendContentString:@">"];
|
||||
|
||||
if ([label length] < 1)
|
||||
label = _info->key;
|
||||
[_response appendContentString:@"<nobr>"];
|
||||
[_response appendContentHTMLString:label];
|
||||
[_response appendContentString:@"</nobr>"];
|
||||
|
||||
[_response appendContentString:@"</a>"];
|
||||
|
||||
[_response appendContentString:@"</td>"];
|
||||
}
|
||||
|
||||
- (void)appendSubmitButton:(UIxTabItemInfo *)_info
|
||||
toResponse:(WOResponse *)_response
|
||||
inContext:(WOContext *)_ctx
|
||||
isActive:(BOOL)_isActive isLeft:(BOOL)_left
|
||||
doScript:(BOOL)_doScript keys:(NSArray *)_keys
|
||||
{
|
||||
[self appendLink:_info
|
||||
toResponse:_response
|
||||
inContext:_ctx
|
||||
isActive:_isActive isLeft:_left
|
||||
doScript:NO keys:_keys];
|
||||
}
|
||||
|
||||
- (void)_appendTabViewJSScriptToResponse:(WOResponse *)_response
|
||||
inContext:(WOContext *)_ctx
|
||||
{
|
||||
[_response appendContentString:
|
||||
@"<script language=\"JavaScript\">\n<!--\n\n"
|
||||
@"function showTab(obj) {\n"
|
||||
#if DEBUG_JS
|
||||
@" if (obj==null) { alert('missing tab obj ..'); return; }\n"
|
||||
@" if (obj['Div']==null) {"
|
||||
@" alert('missing div key in ' + obj); return; }\n"
|
||||
@" if (obj['Div'].style==null) {"
|
||||
@" alert('missing style key in div ' + obj['Div']);return; }\n"
|
||||
#endif
|
||||
@" obj['Div'].style.display = \"\";\n"
|
||||
@" obj['Img'].src = obj[\"Ar\"][1].src;\n"
|
||||
@" obj['link'].href = obj[\"href2\"];\n"
|
||||
@"}\n"
|
||||
@"function hideTab(obj) {\n"
|
||||
#if DEBUG_JS
|
||||
@" if (obj==null) { alert('missing tab obj ..'); return; }\n"
|
||||
@" if (obj['Div']==null) {"
|
||||
@" alert('missing div key in ' + obj); return; }\n"
|
||||
@" if (obj['Div'].style==null) {"
|
||||
@" alert('missing style key in div ' + obj['Div']);return; }\n"
|
||||
#endif
|
||||
@" obj['Div'].style.display = \"none\";\n"
|
||||
@" obj['Img'].src = obj[\"Ar\"][0].src;\n"
|
||||
@" obj['link'].href = obj[\"href1\"];\n"
|
||||
@"}\n"
|
||||
@"function swapCorners(obj1,obj2) {\n"
|
||||
@" if (obj1==null) { alert('missing corner 1'); return; }\n"
|
||||
@" if (obj2==null) { alert('missing corner 2'); return; }\n"
|
||||
@" obj1.style.display = \"none\";\n"
|
||||
@" obj2.style.display = \"\";\n"
|
||||
@"}\n"
|
||||
@"//-->\n</script>"];
|
||||
}
|
||||
|
||||
- (void)_appendHeaderRowToResponse:(WOResponse *)_response
|
||||
inContext:(WOContext *)_ctx
|
||||
keys:(NSArray *)keys activeKey:(NSString *)activeKey
|
||||
doScript:(BOOL)doScript
|
||||
{
|
||||
unsigned i, count;
|
||||
BOOL doForm;
|
||||
NSString *styleName;
|
||||
|
||||
doForm = NO; /* generate form controls ? */
|
||||
|
||||
[_response appendContentString:@"<tr><td colspan='2'>"];
|
||||
|
||||
styleName = [self->headerStyle stringValueInComponent:[_ctx component]];
|
||||
if(styleName) {
|
||||
[_response appendContentString:
|
||||
@"<table border='0' cellpadding='0' cellspacing='0' class='"];
|
||||
[_response appendContentHTMLAttributeValue:styleName];
|
||||
[_response appendContentString:@"'><tr>"];
|
||||
}
|
||||
else {
|
||||
[_response appendContentString:
|
||||
@"<table border='0' cellpadding='0' cellspacing='0'><tr>"];
|
||||
}
|
||||
|
||||
for (i = 0, count = [keys count]; i < count; i++) {
|
||||
UIxTabItemInfo *info;
|
||||
NSString *key;
|
||||
BOOL isActive;
|
||||
|
||||
info = [keys objectAtIndex:i];
|
||||
key = info->key;
|
||||
isActive = [key isEqualToString:activeKey];
|
||||
|
||||
[_ctx appendElementIDComponent:key];
|
||||
|
||||
if (doForm) {
|
||||
/* tab is inside of a FORM, so produce submit buttons */
|
||||
[self appendSubmitButton:info
|
||||
toResponse:_response
|
||||
inContext:_ctx
|
||||
isActive:isActive
|
||||
isLeft:(i == 0) ? YES : NO
|
||||
doScript:NO
|
||||
keys:keys];
|
||||
}
|
||||
else {
|
||||
/* tab is not in a FORM, generate hyperlinks for tab */
|
||||
[self appendLink:info
|
||||
toResponse:_response
|
||||
inContext:_ctx
|
||||
isActive:isActive
|
||||
isLeft:(i == 0) ? YES : NO
|
||||
doScript:NO
|
||||
keys:keys];
|
||||
}
|
||||
|
||||
[_ctx deleteLastElementIDComponent];
|
||||
}
|
||||
// [_response appendContentString:@"<td></td>"];
|
||||
[_response appendContentString:@"</tr></table>"];
|
||||
[_response appendContentString:@"</td></tr>"];
|
||||
}
|
||||
|
||||
- (void)_appendHeaderFootRowToResponse:(WOResponse *)_response
|
||||
inContext:(WOContext *)_ctx
|
||||
bgcolor:(NSString *)bgcolor
|
||||
doScript:(BOOL)doScript
|
||||
isLeftActive:(BOOL)isLeftActive
|
||||
{
|
||||
NSString *styleName;
|
||||
[_response appendContentString:@" <tr"];
|
||||
|
||||
styleName = [self->bodyStyle stringValueInComponent:[_ctx component]];
|
||||
if(styleName) {
|
||||
[_response appendContentString:@" class='"];
|
||||
[_response appendContentHTMLAttributeValue:styleName];
|
||||
[_response appendContentCharacter:'\''];
|
||||
}
|
||||
if (bgcolor) {
|
||||
[_response appendContentString:@" bgcolor=\""];
|
||||
[_response appendContentHTMLAttributeValue:bgcolor];
|
||||
[_response appendContentString:@"\""];
|
||||
}
|
||||
[_response appendContentString:@">\n"];
|
||||
|
||||
/* left corner */
|
||||
[_response appendContentString:@" <td align=\"left\" width=\"10\">"];
|
||||
|
||||
if (isLeftActive)
|
||||
[_response appendContentString:@" "];
|
||||
|
||||
if (!isLeftActive) {
|
||||
NSString *uri;
|
||||
|
||||
uri = [self->leftCornerIcon stringValueInComponent:[_ctx component]];
|
||||
if ((uri = WEUriOfResource(uri, _ctx))) {
|
||||
[_response appendContentString:@"<img border=\"0\" alt=\"\" src=\""];
|
||||
[_response appendContentString:uri];
|
||||
[_response appendContentString:@"\" />"];
|
||||
}
|
||||
else
|
||||
[_response appendContentString:@" "];
|
||||
}
|
||||
|
||||
[_response appendContentString:@"</td>"];
|
||||
|
||||
/* right corner */
|
||||
[_response appendContentString:@" <td align=\"right\">"];
|
||||
{
|
||||
NSString *uri;
|
||||
|
||||
uri = [self->rightCornerIcon stringValueInComponent:[_ctx component]];
|
||||
if ((uri = WEUriOfResource(uri, _ctx))) {
|
||||
[_response appendContentString:@"<img border=\"0\" alt=\"\" src=\""];
|
||||
[_response appendContentString:uri];
|
||||
[_response appendContentString:@"\" />"];
|
||||
}
|
||||
else
|
||||
[_response appendContentString:@" "];
|
||||
}
|
||||
[_response appendContentString:@"</td>\n"];
|
||||
|
||||
[_response appendContentString:@" </tr>\n"];
|
||||
}
|
||||
|
||||
- (void)_appendBodyRowToResponse:(WOResponse *)_response
|
||||
inContext:(WOContext *)_ctx
|
||||
bgcolor:(NSString *)bgcolor
|
||||
activeKey:(NSString *)activeKey
|
||||
{
|
||||
WEClientCapabilities *ccaps;
|
||||
BOOL indentContent;
|
||||
NSString *styleName;
|
||||
|
||||
styleName = [self->bodyStyle stringValueInComponent:[_ctx component]];
|
||||
ccaps = [[_ctx request] clientCapabilities];
|
||||
|
||||
/* put additional padding table into content ??? */
|
||||
indentContent = [ccaps isFastTableBrowser] && ![ccaps isTextModeBrowser];
|
||||
|
||||
[_response appendContentString:@"<tr"];
|
||||
if(styleName) {
|
||||
[_response appendContentString:@" class='"];
|
||||
[_response appendContentHTMLAttributeValue:styleName];
|
||||
[_response appendContentCharacter:'\''];
|
||||
}
|
||||
[_response appendContentString:@"><td colspan='2'"];
|
||||
if (bgcolor) {
|
||||
[_response appendContentString:@" bgcolor=\""];
|
||||
[_response appendContentHTMLAttributeValue:bgcolor];
|
||||
[_response appendContentCharacter:'\"'];
|
||||
}
|
||||
[_response appendContentCharacter:'>'];
|
||||
|
||||
if (indentContent) {
|
||||
/* start padding table */
|
||||
[_response appendContentString:
|
||||
@"<table border='0' width='100%'"
|
||||
@" cellpadding='10' cellspacing='0'>"];
|
||||
[_response appendContentString:@"<tr><td>"];
|
||||
}
|
||||
|
||||
[_ctx appendElementIDComponent:@"b"];
|
||||
[_ctx appendElementIDComponent:activeKey];
|
||||
|
||||
/* generate currently active body */
|
||||
{
|
||||
[_ctx setObject:activeKey forKey:UIxTabView_BODY];
|
||||
[self->template appendToResponse:_response inContext:_ctx];
|
||||
[_ctx removeObjectForKey:UIxTabView_BODY];
|
||||
}
|
||||
|
||||
[_ctx deleteLastElementIDComponent]; // activeKey
|
||||
[_ctx deleteLastElementIDComponent]; // 'b'
|
||||
|
||||
if (indentContent)
|
||||
/* close padding table */
|
||||
[_response appendContentString:@"</td></tr></table>"];
|
||||
|
||||
[_response appendContentString:@"</td></tr>"];
|
||||
}
|
||||
|
||||
- (BOOL)isLeftActiveInKeys:(NSArray *)keys activeKey:(NSString *)activeKey{
|
||||
unsigned i, count;
|
||||
BOOL isLeftActive;
|
||||
|
||||
isLeftActive = NO;
|
||||
|
||||
for (i = 0, count = [keys count]; i < count; i++) {
|
||||
UIxTabItemInfo *info;
|
||||
|
||||
info = [keys objectAtIndex:i];
|
||||
|
||||
if ((i == 0) && [info->key isEqualToString:activeKey])
|
||||
isLeftActive = YES;
|
||||
}
|
||||
|
||||
return isLeftActive;
|
||||
}
|
||||
|
||||
- (void)appendToResponse:(WOResponse *)_response inContext:(WOContext *)_ctx {
|
||||
WOComponent *cmp;
|
||||
NSString *bgcolor;
|
||||
BOOL isLeftActive;
|
||||
id nestedState;
|
||||
NSString *activeKey;
|
||||
NSArray *keys;
|
||||
int tabViewCount; /* used for image id's and writing script once */
|
||||
|
||||
tabViewCount = [[_ctx valueForKey:@"UIxTabViewScriptDone"] intValue];
|
||||
cmp = [_ctx component];
|
||||
|
||||
/* save state */
|
||||
|
||||
nestedState = [self saveNestedStateInContext:_ctx];
|
||||
|
||||
/* configure */
|
||||
|
||||
activeKey = [self->selection stringValueInComponent:cmp];
|
||||
|
||||
bgcolor = [self->bgColor stringValueInComponent:cmp];
|
||||
bgcolor = [bgcolor stringValue];
|
||||
|
||||
[_ctx appendElementIDComponent:@"h"];
|
||||
|
||||
/* collect & process keys (= available tabs) */
|
||||
|
||||
keys = [self collectKeysInContext:_ctx];
|
||||
|
||||
if (![[keys valueForKey:@"key"] containsObject:activeKey])
|
||||
/* selection is not available in keys */
|
||||
activeKey = nil;
|
||||
|
||||
if ((activeKey == nil) && ([keys count] > 0)) {
|
||||
/* no or invalid selection, use first key */
|
||||
activeKey = [[keys objectAtIndex:0] key];
|
||||
if ([self->selection isValueSettable])
|
||||
[self->selection setValue:activeKey inComponent:[_ctx component]];
|
||||
}
|
||||
|
||||
/* start appending */
|
||||
|
||||
/* count up for unique tabCorner/tabCornerLeft images */
|
||||
[_ctx takeValue:[NSNumber numberWithInt:(tabViewCount + 1)]
|
||||
forKey:@"UIxTabViewScriptDone"];
|
||||
|
||||
[_response appendContentString:
|
||||
@"<table border='0' width='100%'"
|
||||
@" cellpadding='0' cellspacing='0'>"];
|
||||
|
||||
/* find out whether left is active */
|
||||
|
||||
isLeftActive = [self isLeftActiveInKeys:keys activeKey:activeKey];
|
||||
|
||||
/* generate header row */
|
||||
|
||||
[self _appendHeaderRowToResponse:_response inContext:_ctx
|
||||
keys:keys activeKey:activeKey
|
||||
doScript:NO];
|
||||
|
||||
[_ctx deleteLastElementIDComponent]; // 'h' for head
|
||||
[_ctx removeObjectForKey:UIxTabView_HEAD];
|
||||
|
||||
/* body row */
|
||||
|
||||
[self _appendBodyRowToResponse:_response inContext:_ctx
|
||||
bgcolor:bgcolor
|
||||
activeKey:activeKey];
|
||||
|
||||
/* close table */
|
||||
|
||||
[_response appendContentString:@"</table>"];
|
||||
[_ctx removeObjectForKey:UIxTabView_ACTIVEKEY];
|
||||
[_ctx removeObjectForKey:UIxTabView_KEYS];
|
||||
[self restoreNestedState:nestedState inContext:_ctx];
|
||||
}
|
||||
|
||||
@end /* UIxTabView */
|
Loading…
Reference in a new issue