mirror of
https://github.com/gnustep/libs-gscoredata.git
synced 2025-03-13 10:51:59 +00:00
307 lines
7.5 KiB
Mathematica
307 lines
7.5 KiB
Mathematica
|
/*
|
||
|
EntityEditor.m
|
||
|
|
||
|
Implementation of the EntityEditor class for the DataBuilder application.
|
||
|
|
||
|
Copyright (C) 2005 Saso Kiselkov
|
||
|
|
||
|
This program is free software; you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation; either version 2 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program 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 General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program; if not, write to the Free Software
|
||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||
|
*/
|
||
|
|
||
|
#import "Private.h"
|
||
|
|
||
|
#import "EntityEditor.h"
|
||
|
|
||
|
#import "Document.h"
|
||
|
#import "DocumentWindowController.h"
|
||
|
|
||
|
@interface EntityEditor (Private)
|
||
|
|
||
|
- (void) setControlsEnabled: (BOOL) flag;
|
||
|
|
||
|
@end
|
||
|
|
||
|
@implementation EntityEditor (Private)
|
||
|
|
||
|
- (void) setControlsEnabled: (BOOL) flag
|
||
|
{
|
||
|
[name setEditable: flag];
|
||
|
[abstract setEnabled: flag];
|
||
|
[objectClassName setEditable: flag];
|
||
|
[superentity setEnabled: flag];
|
||
|
}
|
||
|
|
||
|
@end
|
||
|
|
||
|
@implementation EntityEditor
|
||
|
|
||
|
- (void) dealloc
|
||
|
{
|
||
|
[[NSNotificationCenter defaultCenter] removeObserver: self];
|
||
|
|
||
|
TEST_RELEASE(entity);
|
||
|
TEST_RELEASE(configuration);
|
||
|
|
||
|
[super dealloc];
|
||
|
}
|
||
|
|
||
|
- (id) initWithModel: (NSManagedObjectModel *) aModel
|
||
|
document: (Document *) aDocument
|
||
|
{
|
||
|
if ((self = [super initWithModel: aModel document: aDocument]))
|
||
|
{
|
||
|
NSNotificationCenter * nc = [NSNotificationCenter defaultCenter];
|
||
|
|
||
|
[NSBundle loadNibNamed: @"EntityEditor" owner: self];
|
||
|
|
||
|
[nc addObserver: self
|
||
|
selector: @selector(noteEntityListChanged:)
|
||
|
name: EntitiesDidChangeNotification
|
||
|
object: model];
|
||
|
|
||
|
}
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
- (void) setupWithEntity: (NSEntityDescription *) anEntity
|
||
|
inConfiguration: (NSString *) aConfiguration
|
||
|
{
|
||
|
NSNotificationCenter * nc = [NSNotificationCenter defaultCenter];
|
||
|
|
||
|
if (entity != nil)
|
||
|
{
|
||
|
[nc removeObserver: self
|
||
|
name: EntityDidChangeNotification
|
||
|
object: entity];
|
||
|
}
|
||
|
|
||
|
ASSIGN(entity, anEntity);
|
||
|
ASSIGN(configuration, aConfiguration);
|
||
|
|
||
|
if (entity != nil)
|
||
|
{
|
||
|
[nc addObserver: self
|
||
|
selector: @selector(noteEntityChanged:)
|
||
|
name: EntityDidChangeNotification
|
||
|
object: entity];
|
||
|
|
||
|
[self setControlsEnabled: YES];
|
||
|
[self refresh: nil];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
[self setControlsEnabled: NO];
|
||
|
[name setStringValue: nil];
|
||
|
[abstract setState: NO];
|
||
|
[objectClassName setStringValue: nil];
|
||
|
[superentity removeAllItems];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (void) refresh: sender
|
||
|
{
|
||
|
|
||
|
[name setStringValue: [entity name]];
|
||
|
[abstract setState: [entity isAbstract]];
|
||
|
[objectClassName setStringValue: [entity managedObjectClassName]];
|
||
|
|
||
|
[self refreshSuperentityList: nil];
|
||
|
}
|
||
|
|
||
|
- (void) refreshSuperentityList: sender
|
||
|
{
|
||
|
NSArray * entities;
|
||
|
NSEnumerator * e;
|
||
|
NSEntityDescription * otherEntity;
|
||
|
NSMutableArray * entityNames;
|
||
|
|
||
|
if (configuration == nil)
|
||
|
{
|
||
|
entities = [[document model] entities];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
entities = [[document model] entitiesForConfiguration: configuration];
|
||
|
}
|
||
|
|
||
|
NSAssert(entities != nil, _(@"Configuration mismatch."));
|
||
|
|
||
|
// don't put into the list of selectable super-entities our own entity
|
||
|
// and any of it's subentities
|
||
|
entityNames = [NSMutableArray arrayWithCapacity: [entities count]];
|
||
|
e = [entities objectEnumerator];
|
||
|
while ((otherEntity = [e nextObject]) != nil)
|
||
|
{
|
||
|
NSEntityDescription *current = otherEntity;
|
||
|
while (current && current != entity && ![current isEqual: entity])
|
||
|
current = [current superentity];
|
||
|
if(!current)
|
||
|
{ // ok, otherEntity is not a subentity
|
||
|
[entityNames addObject: [otherEntity name]];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[entityNames sortUsingSelector: @selector(caseInsensitiveCompare:)];
|
||
|
|
||
|
[superentity removeAllItems];
|
||
|
[superentity addItemWithTitle: @""];
|
||
|
[superentity addItemsWithTitles: entityNames];
|
||
|
|
||
|
if ([entity superentity] != nil)
|
||
|
{
|
||
|
[superentity selectItemWithTitle: [[entity superentity] name]];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
[superentity selectItemAtIndex: 0];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (void) updateEntityName: (id)sender
|
||
|
{
|
||
|
NSString * newName = [name stringValue];
|
||
|
NSArray * entityNames;
|
||
|
|
||
|
if (configuration == nil)
|
||
|
{
|
||
|
entityNames = [[[document model] entitiesByName] allKeys];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
entityNames = [[[document model] entitiesByNameForConfiguration:
|
||
|
configuration] allKeys];
|
||
|
}
|
||
|
|
||
|
if ([newName length] == 0)
|
||
|
{
|
||
|
NSRunAlertPanel(_(@"Invalid name"),
|
||
|
_(@"You must specify a name for the entity."),
|
||
|
nil, nil, nil);
|
||
|
return;
|
||
|
}
|
||
|
if ([entityNames containsObject: newName])
|
||
|
{
|
||
|
NSRunAlertPanel(_(@"Name already in use"),
|
||
|
_(@"There already is an entity named %@ in this configuration."),
|
||
|
nil, nil, nil, newName);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
[[document undoManager] setActionName: _(@"Rename Entity")];
|
||
|
[document setName: newName
|
||
|
ofEntity: entity
|
||
|
inConfiguration: configuration];
|
||
|
}
|
||
|
|
||
|
|
||
|
- (void) updateAbstract: (id)sender
|
||
|
{
|
||
|
BOOL flag = [abstract state];
|
||
|
|
||
|
[[document undoManager] setActionName: flag ? _(@"Set Abstract") :
|
||
|
_(@"Unset Abstract")];
|
||
|
[document setAbstract: flag ofEntity: entity];
|
||
|
}
|
||
|
|
||
|
|
||
|
- (void) updateObjectClassName: (id)sender
|
||
|
{
|
||
|
if ([[objectClassName stringValue] length] > 0)
|
||
|
{
|
||
|
[[document undoManager] setActionName: _(@"Set Object Class Name")];
|
||
|
[document setManagedObjectClassName: [objectClassName stringValue]
|
||
|
ofEntity: entity];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
[[document undoManager] setActionName: _(@"Unset Object Class Name")];
|
||
|
[document setManagedObjectClassName: nil ofEntity: entity];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
- (void) updateSuperentity: (id)sender
|
||
|
{
|
||
|
NSString * entityName = [superentity titleOfSelectedItem];
|
||
|
NSDictionary * entitiesByName;
|
||
|
|
||
|
[[document undoManager] setActionName: _(@"Set Superentity")];
|
||
|
if (![entityName isEqualToString: @""])
|
||
|
{
|
||
|
NSEntityDescription * targetEntity;
|
||
|
|
||
|
if (configuration == nil)
|
||
|
{
|
||
|
entitiesByName = [[document model] entitiesByName];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
entitiesByName = [[document model]
|
||
|
entitiesByNameForConfiguration: configuration];
|
||
|
}
|
||
|
|
||
|
targetEntity = [entitiesByName objectForKey: entityName];
|
||
|
NSAssert(targetEntity != nil, _(@"Superentity not found."));
|
||
|
|
||
|
[document setSuperentity: targetEntity ofEntity: entity];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
[document setSuperentity: nil ofEntity: entity];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (void) noteEntityChanged: (NSNotification *) notif
|
||
|
{
|
||
|
if ([notif object] == entity)
|
||
|
{
|
||
|
[self refresh: nil];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (void) noteEntityListChanged: (NSNotification *) notif
|
||
|
{
|
||
|
NSString * aConfiguration = [[notif userInfo]
|
||
|
objectForKey: @"Configuration"];
|
||
|
|
||
|
if ((aConfiguration == nil && configuration == nil) ||
|
||
|
([aConfiguration isEqualToString: configuration]))
|
||
|
{
|
||
|
NSArray * entities;
|
||
|
|
||
|
// make sure our entity has not been removed
|
||
|
if (configuration == nil)
|
||
|
{
|
||
|
entities = [[document model] entities];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
entities = [[document model] entitiesForConfiguration:
|
||
|
configuration];
|
||
|
}
|
||
|
|
||
|
if ([entities containsObject: entity])
|
||
|
{
|
||
|
[self refreshSuperentityList: nil];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
[self setupWithEntity: nil inConfiguration: nil];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@end
|