mirror of
https://github.com/gnustep/libs-gscoredata.git
synced 2025-03-13 10:51:59 +00:00
285 lines
7.4 KiB
Objective-C
285 lines
7.4 KiB
Objective-C
/*
|
|
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
|