Codebase list agenda.app / HEAD MemoryStore.m
HEAD

Tree @HEAD (Download .tar.gz)

MemoryStore.m @HEAD

ab1ee24
6a35e6d
 
 
 
 
ab1ee24
 
 
 
 
 
7f2d733
 
6a35e6d
ab1ee24
7f2d733
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6a35e6d
 
7f2d733
6a35e6d
 
 
 
 
 
 
 
e06e995
ab1ee24
 
 
 
 
6a35e6d
 
ab1ee24
 
6a35e6d
 
ab1ee24
6a35e6d
 
 
 
 
 
7f2d733
6a35e6d
 
 
 
 
 
 
7f2d733
 
 
 
 
6a35e6d
 
 
 
 
 
 
 
 
ab1ee24
 
 
 
 
 
 
 
 
6a35e6d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ab1ee24
 
6a35e6d
 
ab1ee24
6a35e6d
ab1ee24
6a35e6d
ab1ee24
 
 
6a35e6d
 
 
 
ab1ee24
 
6a35e6d
ab1ee24
6a35e6d
ab1ee24
6a35e6d
ab1ee24
 
 
6a35e6d
 
 
 
 
 
ab1ee24
 
 
6a35e6d
 
 
 
 
 
 
 
 
ab1ee24
6a35e6d
 
 
 
 
 
 
ab1ee24
6a35e6d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ab1ee24
6a35e6d
 
 
ab1ee24
6a35e6d
 
 
 
ab1ee24
6a35e6d
 
 
ab1ee24
6a35e6d
 
 
 
 
 
 
 
 
 
ab1ee24
6a35e6d
 
ab1ee24
 
 
 
 
 
 
 
 
 
 
6a35e6d
#import <AppKit/NSColor.h>
#import "MemoryStore.h"
#import "Event.h"
#import "Task.h"
#import "defines.h"

NSString * const SADataChangedInStore = @"SADataDidChangedInStore";
NSString * const SAStatusChangedForStore = @"SAStatusChangedForStore";
NSString * const SAEnabledStatusChangedForStore = @"SAEnabledStatusChangedForStore";
NSString * const SAElementAddedToStore = @"SAElementAddedToStore";
NSString * const SAElementRemovedFromStore = @"SAElementRemoveFromStore";
NSString * const SAElementUpdatedInStore = @"SAElementUpdatedInStore";
NSString * const SAErrorReadingStore = @"SAErrorReadingStore";
NSString * const SAErrorWritingStore = @"SAErrorWritingStore";

@implementation MemoryStore
+ (BOOL)registerWithName:(NSString *)name
{
  return NO;
}
+ (id)storeNamed:(NSString *)name
{
  return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithName:name]);
}
+ (BOOL)isUserInstanciable
{
  return NO;
}
+ (NSString *)storeName
{
  [self subclassResponsibility:_cmd];
  return nil;
}
+ (NSString *)storeTypeName
{
  [self subclassResponsibility:_cmd];
  return nil;
}
- (NSDictionary *)defaults
{
  [self subclassResponsibility:_cmd];
  return nil;
}

- (id)initWithName:(NSString *)name
{
  self = [super init];
  if (self) {
    _name = [name copy];
    _config = [[ConfigManager alloc] initForKey:name];
    /*
     * Don't remove this even if it's seems silly : it will
     * call the subclass's -defaults method which will have
     * values
     */
    [_config registerDefaults:[self defaults]];
    _modified = NO;
    _data = [[NSMutableDictionary alloc] initWithCapacity:512];
    _tasks = [[NSMutableDictionary alloc] initWithCapacity:128];
    _writable = [[_config objectForKey:ST_RW] boolValue];
    _displayed = [[_config objectForKey:ST_DISPLAY] boolValue];
    _enabled = [[_config objectForKey:ST_ENABLED] boolValue];
  }
  return self;
}

- (void)dealloc
{
  NSDebugLLog(@"SimpleAgenda", @"Releasing store %@", _name);
  [_data release];
  [_tasks release];
  [_name release];
  [_config release];
  [super dealloc];
}

- (ConfigManager *)config
{
  return _config;
}

- (NSArray *)events
{
  return [_data allValues];
}
- (NSArray *)tasks
{
  return [_tasks allValues];
}

- (Element *)elementWithUID:(NSString *)uid
{
  if ([_data objectForKey:uid] != nil)
    return [_data objectForKey:uid];
  if ([_tasks objectForKey:uid] != nil)
    return [_tasks objectForKey:uid];
  return nil;
}

/* Should be used only when loading data */
- (void)fillWithElements:(NSSet *)set
{
  NSEnumerator *enumerator = [set objectEnumerator];
  Element *elt;

  while ((elt = [enumerator nextObject])) {
    [elt setStore:self];
    if ([elt isKindOfClass:[Event class]])
      [_data setValue:elt forKey:[elt UID]];
    else
      [_tasks setValue:elt forKey:[elt UID]];
  }
  [[NSNotificationCenter defaultCenter] postNotificationName:SADataChangedInStore object:self];
}

- (void)add:(Element *)elt
{
  NSString *uid = [elt UID];
  
  [elt setStore:self];
  if ([elt isKindOfClass:[Event class]])
    [_data setValue:elt forKey:uid];
  else
    [_tasks setValue:elt forKey:uid];
  _modified = YES;
  [[NSNotificationCenter defaultCenter] postNotificationName:SAElementAddedToStore 
					              object:self
					            userInfo:[NSDictionary dictionaryWithObject:uid forKey:@"UID"]];
}

- (void)remove:(Element *)elt
{
  NSString *uid = [elt UID];

  if ([elt isKindOfClass:[Event class]])
    [_data removeObjectForKey:uid];
  else
    [_tasks removeObjectForKey:uid];
  _modified = YES;
  [[NSNotificationCenter defaultCenter] postNotificationName:SAElementRemovedFromStore 
					              object:self
					            userInfo:[NSDictionary dictionaryWithObject:uid forKey:@"UID"]];
}

- (void)update:(Element *)elt;
{
  [elt setDateStamp:[Date now]];
  _modified = YES;
  [[NSNotificationCenter defaultCenter] postNotificationName:SAElementUpdatedInStore 
					              object:self
					            userInfo:[NSDictionary dictionaryWithObject:[elt UID] forKey:@"UID"]];
}

- (BOOL)contains:(Element *)elt
{
  if ([elt isKindOfClass:[Event class]])
    return [_data objectForKey:[elt UID]] != nil;
  return [_tasks objectForKey:[elt UID]] != nil;
}

- (BOOL)writable
{
  return _writable;
}
- (void)setWritable:(BOOL)writable
{
  _writable = writable;
  [_config setObject:[NSNumber numberWithBool:_writable] forKey:ST_RW];
  [[NSNotificationCenter defaultCenter] postNotificationName:SAStatusChangedForStore object:self];
}

- (BOOL)modified
{
  return _modified;
}
- (void)setModified:(BOOL)modified
{
  _modified = modified;
}
- (NSString *)description
{
  return _name;
}

- (NSColor *)eventColor
{
  return [_config colorForKey:ST_COLOR];
}
- (void)setEventColor:(NSColor *)color
{
  [_config setColor:color forKey:ST_COLOR];
}

- (NSColor *)textColor
{
  return [_config colorForKey:ST_TEXT_COLOR];
}
- (void)setTextColor:(NSColor *)color
{
  [_config setColor:color forKey:ST_TEXT_COLOR];
}

- (BOOL)displayed
{
  return _displayed;
}
- (void)setDisplayed:(BOOL)state
{
  _displayed = state;
  [_config setObject:[NSNumber numberWithBool:_displayed] forKey:ST_DISPLAY];
  [[NSNotificationCenter defaultCenter] postNotificationName:SAStatusChangedForStore object:self];
}

- (BOOL)enabled
{
  return _enabled;
}
- (void)setEnabled:(BOOL)state
{
  _enabled = state;
  NSLog(@"Store %@ %@", _name, state ? @"enabled" : @"disabled");
  [_config setObject:[NSNumber numberWithBool:_enabled] forKey:ST_ENABLED];
  [[NSNotificationCenter defaultCenter] postNotificationName:SAEnabledStatusChangedForStore object:self];
}
@end