2 Copyright (C) 2000-2003 SKYRIX Software AG
4 This file is part of OGo
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
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.
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
23 #include <NGObjDOM/ODNodeRendererFactorySet.h>
25 @interface _ODNodeRendererFactorySetEntry : NSObject
28 ODNodeRendererFactory *factory;
29 EOQualifier *qualifier;
30 NSString *namespaceURI;
34 - (BOOL)matchesNode:(id)_node;
35 - (ODNodeRendererFactory *)nodeRendererFactory;
39 #include <NGObjDOM/ODRNodeText.h>
40 #include <NGObjDOM/ODRGenericTag.h>
42 #include <EOControl/EOQualifier.h>
44 @implementation ODNodeRendererFactorySet
51 RELEASE(self->subfactories);
57 [self->cache removeAllObjects];
62 - (void)registerFactory:(id<NSObject,ODNodeRendererFactory>)_factory
63 forNodeQualifier:(EOQualifier *)_qualifier
65 _ODNodeRendererFactorySetEntry *entry;
68 if (![_factory conformsToProtocol:@protocol(ODNodeRendererFactory)]) {
69 NSLog(@"WARNING(%s): node-factory %@ to be registered, doesn't implement "
70 @"the ODNodeRendererFactory protocol !",
71 __PRETTY_FUNCTION__, _factory);
77 entry = [[_ODNodeRendererFactorySetEntry alloc] init];
78 entry->factory = RETAIN(_factory);
79 entry->qualifier = RETAIN(_qualifier);
81 if (self->subfactories == nil)
82 self->subfactories = [[NSMutableArray alloc] initWithCapacity:4];
83 [self->subfactories addObject:entry];
87 - (void)registerFactory:(id<NSObject,ODNodeRendererFactory>)_factory
88 forNamespaceURI:(NSString *)_namespaceURI
89 tagName:(NSString *)_tagName
91 _ODNodeRendererFactorySetEntry *entry;
94 if (![_factory conformsToProtocol:@protocol(ODNodeRendererFactory)]) {
95 NSLog(@"WARNING(%s): node-factory %@ to be registered, doesn't implement "
96 @"the ODNodeRendererFactory protocol !",
97 __PRETTY_FUNCTION__, _factory);
103 entry = [[_ODNodeRendererFactorySetEntry alloc] init];
104 entry->factory = RETAIN(_factory);
105 entry->namespaceURI = [_namespaceURI copy];
106 entry->tagName = [_tagName copy];
108 if (self->subfactories == nil)
109 self->subfactories = [[NSMutableArray alloc] initWithCapacity:4];
110 [self->subfactories addObject:entry];
114 - (void)registerFactory:(id<NSObject,ODNodeRendererFactory>)_factory
115 forNamespaceURI:(NSString *)_namespaceURI
117 [self registerFactory:_factory
118 forNamespaceURI:_namespaceURI
125 - (ODNodeRenderer *)rendererForTextNode:(id)_domNode
126 inContext:(WOContext *)_ctx
129 if (r == nil) r = [[ODRNodeText alloc] init];
133 - (ODNodeRenderer *)rendererForElementNode:(id)_domNode
134 inContext:(WOContext *)_ctx
136 ODNodeRenderer *renderer;
140 key = [NSString stringWithFormat:@"{%@}%@",
141 [_domNode namespaceURI], [_domNode tagName]];
143 if ((renderer = [self->cache objectForKey:key]))
147 NSLog(@"1st lookup renderer: %@", key);
150 for (i = 0, count = [self->subfactories count]; i < count; i++) {
151 _ODNodeRendererFactorySetEntry *entry;
153 entry = [self->subfactories objectAtIndex:i];
155 if ([entry matchesNode:_domNode]) {
156 renderer = [[entry nodeRendererFactory]
157 rendererForNode:_domNode
163 if (renderer == nil) {
166 if (r == nil) r = [[ODRGenericTag alloc] init];
171 if (self->cache == nil)
172 self->cache = [[NSMutableDictionary alloc] initWithCapacity:64];
173 [self->cache setObject:renderer forKey:key];
179 - (ODNodeRenderer *)rendererForNode:(id)_domNode
180 inContext:(WOContext *)_ctx
182 ODNodeRenderer *renderer;
184 switch ([_domNode nodeType]) {
186 case DOM_CDATA_SECTION_NODE:
187 renderer = [self rendererForTextNode:_domNode inContext:_ctx];
190 case DOM_ELEMENT_NODE:
191 renderer = [self rendererForElementNode:_domNode inContext:_ctx];
195 static id compoundRenderer = nil;
197 if (compoundRenderer == nil)
198 compoundRenderer = [[ODNodeRenderer alloc] init];
200 renderer = compoundRenderer;
209 - (NSString *)description {
212 ms = [NSMutableString stringWithCapacity:32];
214 [ms appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])];
215 [ms appendFormat:@" factories=#%d", [self->subfactories count]];
216 [ms appendFormat:@">"];
221 @end /* ODNodeRendererFactorySet */
223 @implementation _ODNodeRendererFactorySetEntry
226 RELEASE(self->factory);
227 RELEASE(self->namespaceURI);
228 RELEASE(self->tagName);
229 RELEASE(self->qualifier);
233 - (BOOL)matchesNode:(id)_node {
234 if (self->namespaceURI) {
235 if (![self->namespaceURI isEqualToString:[_node namespaceURI]])
239 if (![self->tagName isEqualToString:[_node tagName]])
242 if (self->qualifier) {
243 if (![(id<EOQualifierEvaluation>)self->qualifier evaluateWithObject:_node])
250 - (ODNodeRendererFactory *)nodeRendererFactory {
251 return self->factory;
254 @end /* _ODNodeRendererFactorySetEntry */