libs-gscoredata/DataBuilder/AttributeEditor.m

286 lines
7.4 KiB
Mathematica
Raw Permalink Normal View History

/*
AttributeEditor.m
Implementation of the AttributeEditor 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 "AttributeEditor.h"
#import "Document.h"
@interface AttributeEditor (Private)
- (void) setControlsEnabled: (BOOL) flag;
@end
@implementation AttributeEditor (Private)
- (void) setControlsEnabled: (BOOL) flag
{
[type setEnabled: flag];
[valueClassName setEditable: flag];
[name setEditable: flag];
[transient setEnabled: flag];
[optional setEnabled: flag];
}
@end
@implementation AttributeEditor
- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver: self];
TEST_RELEASE(attribute);
TEST_RELEASE(entity);
TEST_RELEASE(configuration);
[super dealloc];
}
- (id) initWithModel: (NSManagedObjectModel *) aModel
document: (Document *) aDocument
{
if ((self = [super initWithModel: aModel document: aDocument]))
{
[NSBundle loadNibNamed: @"AttributeEditor" owner: self];
// watch for changes in the entity's property list - in case
// the attribute we're editing is removed, reset our display
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(notePropertiesChanged:)
name: PropertiesDidChangeNotification
object: model];
}
return self;
}
- (void) setupWithAttribute: (NSAttributeDescription *) anAttribute
inEntity: (NSEntityDescription *) anEntity
configuration: (NSString *) aConfiguration
{
NSNotificationCenter * nc = [NSNotificationCenter defaultCenter];
if (attribute != nil)
{
[nc removeObserver: self
name: PropertyDidChangeNotification
object: attribute];
}
ASSIGN(attribute, anAttribute);
ASSIGN(entity, anEntity);
ASSIGN(configuration, aConfiguration);
[self refresh: nil];
if (attribute != nil)
{
[nc addObserver: self
selector: @selector(noteAttributeChanged:)
name: PropertyDidChangeNotification
object: attribute];
[self setControlsEnabled: YES];
}
else
{
[self setControlsEnabled: NO];
}
}
- (void) refresh: sender
{
switch ([attribute attributeType])
{
case NSUndefinedAttributeType:
[type selectItemAtIndex: 0];
break;
case NSInteger16AttributeType:
[type selectItemAtIndex: 1];
break;
case NSInteger32AttributeType:
[type selectItemAtIndex: 2];
break;
case NSInteger64AttributeType:
[type selectItemAtIndex: 3];
break;
case NSDecimalAttributeType:
[type selectItemAtIndex: 4];
break;
case NSDoubleAttributeType:
[type selectItemAtIndex: 5];
break;
case NSFloatAttributeType:
[type selectItemAtIndex: 6];
break;
case NSStringAttributeType:
[type selectItemAtIndex: 7];
break;
case NSBooleanAttributeType:
[type selectItemAtIndex: 8];
break;
case NSDateAttributeType:
[type selectItemAtIndex: 9];
break;
case NSBinaryDataAttributeType:
[type selectItemAtIndex: 10];
break;
}
[name setStringValue: [attribute name]];
[valueClassName setStringValue: [attribute attributeValueClassName]];
[transient setState: [attribute isTransient]];
[optional setState: [attribute isOptional]];
}
- (void) updateValueClassName: (id)sender
{
[[document undoManager] setActionName: _(@"Set Attribute Value Class Name")];
[document setAttributeValueClassName: [valueClassName stringValue]
ofAttribute: attribute];
}
- (void) updateType: (id)sender
{
[[document undoManager] setActionName: _(@"Set Attribute Type")];
switch ([type indexOfSelectedItem])
{
case 0:
[document setAttributeType: NSUndefinedAttributeType
ofAttribute: attribute];
break;
case 1:
[document setAttributeType: NSInteger16AttributeType
ofAttribute: attribute];
break;
case 2:
[document setAttributeType: NSInteger32AttributeType
ofAttribute: attribute];
break;
case 3:
[document setAttributeType: NSInteger64AttributeType
ofAttribute: attribute];
break;
case 4:
[document setAttributeType: NSDecimalAttributeType
ofAttribute: attribute];
break;
case 5:
[document setAttributeType: NSDoubleAttributeType
ofAttribute: attribute];
break;
case 6:
[document setAttributeType: NSFloatAttributeType
ofAttribute: attribute];
break;
case 7:
[document setAttributeType: NSStringAttributeType
ofAttribute: attribute];
break;
case 8:
[document setAttributeType: NSBooleanAttributeType
ofAttribute: attribute];
break;
case 9:
[document setAttributeType: NSDateAttributeType
ofAttribute: attribute];
break;
case 10:
[document setAttributeType: NSBinaryDataAttributeType
ofAttribute: attribute];
break;
}
}
- (void) updateTransient: (id)sender
{
[[document undoManager] setActionName: [transient state] ?
_(@"Set Transient") : _(@"Unset Transient")];
[document setTransient: [transient state] ofProperty: attribute];
}
- (void) updateName: (id)sender
{
NSString * newName = [name stringValue];
if ([newName length] == 0)
{
NSRunAlertPanel(_(@"Invalid name"),
_(@"You must specify a name for the attribute."),
nil, nil, nil);
return;
}
if ([[[entity propertiesByName] allKeys] containsObject: newName])
{
NSRunAlertPanel(_(@"Name already in use"),
_(@"The name you have entered is already in use."),
nil, nil, nil);
return;
}
[[document undoManager] setActionName: _(@"Rename attribute")];
[document setName: newName
ofProperty: attribute
inEntity: entity
configuration: configuration];
}
- (void) updateOptional: (id)sender
{
[[document undoManager] setActionName: [optional state] ?
_(@"Set Optional") : _(@"Unset Optional")];
[document setOptional: [optional state] ofProperty: attribute];
}
- (void) noteAttributeChanged: (NSNotification *) notif
{
if (attribute == [notif object])
{
[self refresh: nil];
}
}
- (void) notePropertiesChanged: (NSNotification *) notif
{
// reset our display if the attribute we've been editing has been removed
if (![[entity properties] containsObject: attribute])
{
[self setupWithAttribute: nil
inEntity: nil
configuration: nil];
}
}
@end