]> err.no Git - scalable-opengroupware.org/blob - UI/MailerUI/UIxMailToolbar.m
moved SOGo files up
[scalable-opengroupware.org] / UI / MailerUI / UIxMailToolbar.m
1 /*
2   Copyright (C) 2004-2005 SKYRIX Software AG
3
4   This file is part of OpenGroupware.org.
5
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
9   later version.
10
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.
15
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
19   02111-1307, USA.
20 */
21
22 #include <SOGoUI/UIxComponent.h>
23
24 @class NSArray, NSDictionary;
25
26 @interface UIxMailToolbar : UIxComponent
27 {
28   NSArray      *toolbarConfig;
29   NSArray      *toolbarGroup;
30   NSDictionary *buttonInfo;
31 }
32 @end
33
34 #include <SoObjects/Mailer/SOGoMailBaseObject.h>
35 #include "common.h"
36 #include <NGObjWeb/SoComponent.h>
37
38 @implementation UIxMailToolbar
39
40 - (void)dealloc {
41   [self->toolbarGroup  release];
42   [self->toolbarConfig release];
43   [self->buttonInfo    release];
44   [super dealloc];
45 }
46
47 /* notifications */
48
49 - (void)sleep {
50   [self->toolbarGroup  release]; self->toolbarGroup  = nil;
51   [self->toolbarConfig release]; self->toolbarConfig = nil;
52   [self->buttonInfo    release]; self->buttonInfo    = nil;
53   [super sleep];
54 }
55
56 /* accessors */
57
58 - (void)setToolbarGroup:(id)_group {
59   ASSIGN(self->toolbarGroup, _group);
60 }
61 - (id)toolbarGroup {
62   return self->toolbarGroup;
63 }
64
65 - (void)setButtonInfo:(id)_info {
66   ASSIGN(self->buttonInfo, _info);
67 }
68 - (id)buttonInfo {
69   return self->buttonInfo;
70 }
71
72 /* toolbar */
73
74 - (WOResourceManager *)pageResourceManager {
75   WOResourceManager *rm;
76   
77   if ((rm = [[[self context] page] resourceManager]) != nil)
78     return rm;
79   
80   return [[self application] resourceManager];
81 }
82
83 - (id)loadToolbarConfigFromResourceNamed:(NSString *)_name {
84   /*
85     Note: we cannot cache by name because we don't know how the resource
86           manager will look up the name.
87           Both, the clientObject and the page might be different.
88           
89           Of course the resourcemanager will cache the resource path and we
90           cache the parsed content for a given path;
91   */
92   static NSMutableDictionary *pathToConfig = nil;
93   WOResourceManager *rm;
94   NSDictionary *tb;
95   NSRange  r;
96   NSString *fw, *rn, *path;
97
98   r = [_name rangeOfString:@"/"];
99   if (r.length > 0) {
100     fw = [_name substringToIndex:r.location];
101     rn = [_name substringFromIndex:(r.location + r.length)];
102   }
103   else {
104     rn = _name;
105     fw = nil;
106   }
107   
108   rm   = [self pageResourceManager];
109   path = [rm pathForResourceNamed:rn inFramework:fw 
110              languages:[[self context] resourceLookupLanguages]];
111   if (path == nil) {
112     [self errorWithFormat:@"Did not find toolbar resource: %@", _name];
113     return nil;
114   }
115
116   if ((tb = [pathToConfig objectForKey:path]) != nil)
117     return [tb isNotNull] ? tb : nil;
118   
119   if ((tb = [NSArray arrayWithContentsOfFile:path]) == nil)
120     [self errorWithFormat:@"Could not load toolbar resource: %@", _name];
121
122   if (pathToConfig == nil)
123     pathToConfig = [[NSMutableDictionary alloc] initWithCapacity:32];
124   [pathToConfig setObject:(tb ? tb : (id)[NSNull null]) forKey:path];
125   
126   return tb;
127 }
128
129 - (id)toolbarConfig {
130   id tb;
131   
132   if (self->toolbarConfig != nil)
133     return [self->toolbarConfig isNotNull] ? self->toolbarConfig : nil;
134   
135   tb = [[self clientObject] lookupName:@"toolbar" inContext:[self context]
136                             acquire:NO];
137   if ([tb isKindOfClass:[NSException class]]) {
138     [self errorWithFormat:
139             @"not toolbar configuration found on SoObject: %@ (%@)",
140             [self clientObject], [[self clientObject] soClass]];
141     self->toolbarConfig = [[NSNull null] retain];
142     return nil;
143   }
144   
145   if ([tb isKindOfClass:[NSString class]])
146     tb = [self loadToolbarConfigFromResourceNamed:tb];
147   
148   self->toolbarConfig = [tb retain];
149   return self->toolbarConfig;
150 }
151
152 /* labels */
153
154 - (NSString *)buttonLabel {
155   WOResourceManager *rm;
156   NSString          *key, *label;
157   
158   key = [[self buttonInfo] valueForKey:@"label"];
159   
160   /* lookup resource manager */
161   
162   if ((rm = [self pageResourceManager]) == nil)
163     rm = [[WOApplication application] resourceManager];
164   if (rm == nil)
165     [self warnWithFormat:@"missing resource manager!"];
166   
167   /* lookup string */
168   
169   label = [rm stringForKey:key inTableNamed:nil withDefaultValue:key
170               languages:[[self context] resourceLookupLanguages]];
171   return label;
172 }
173
174 /* enable/disable buttons */
175
176 - (BOOL)isButtonEnabled {
177   // TODO: replace 'enabled' with WOAssociation when this gets a dynamic
178   //       element
179   NSString *onOffKey;
180   
181   if ((onOffKey = [[self buttonInfo] valueForKey:@"enabled"]) == nil)
182     return YES;
183   
184   return [[[[self context] page] valueForKeyPath:onOffKey] boolValue];
185 }
186
187 @end /* UIxMailToolbar */