From efecac58754530bfef208c66ceb8cac4501d19b7 Mon Sep 17 00:00:00 2001 From: David Ayers Date: Tue, 5 Sep 2006 22:18:35 +0000 Subject: [PATCH] DBModeler/ConsistencyChecker.m (+modelConsistencyCheck:): Honor validation preferences. DBModeler/Modeler.m (-new:): Reimplement. (-setAdaptor:): Bail out it adaptor cannot be located. (-application:openFile:): Fine tune path checking and correct return values. (-openPrefs:): Implement. * DBModeler/Inspectors/RelationshipInspector.m (-displayName): Implement. (-selectedEntity): Validate selected row before commencing. (-selectedDestinationAttribute): Reimplement. (-updateConnectButton): Update enabled state of connect button. (-refresh): Correct handling of src/destAttrib_tableView. (-tableViewSelectionDidChange:): Allways call updateConnectButton. * DBModeler/SQLGenerator.m (-openSQLGenerator:): Reimplement. (-executeSQL:): Handle invalid adpator or connection information. (-saveAs:): Handle abort correctly. (-generate): Handle missing expression class. * DBModeler/ModelerTableEmbedibleEditor.h * DBModeler/ModelerEntityEditor.m (initWithParentEditor:): Correct autoresize behavior. (-activate): Update selection. (-needToFetch:): Do not reloadData in _topTable. (-displayGroupDidChangeSelection:): Update selection on parent. * DBModeler/ModelerTableEmbedibleEditor.m (-addDefaultTableColumnsForTableView:displayGroup:): Call tile instead of sizeToFit. * DBModeler/EOAdditions.m: Fix leaks. (setIsClassProperty): Reimplement. (-[setIsPrimaryKey:]): Ditto. (-[setIsClassProperty:]): Correct call to function. (-[isUsedForLocking]): Implement. (-[setIsUsedForLocking:]): Ditto. * DBModeler/MainModelEditor.h * DBModeler/MainModelEditor.m: Update view handling. * DBModeler/DefaultColumnProvider.m: Update handling of properties. * DBModeler/ModelerAttributeEditor.m: Update general GUI interaction. * DBModeler/Preferences.h: New file. * DBModeler/Preferences.m: Ditto. * DBModeler/Inspectors/RelationshipInspector.tiff: New file. * DBModeler/Inspectors/GNUmakefile: Add new file. * DBModeler/Resources/Preferences.gorm: New files. * DBModeler/Resources/Key_Header.tiff: Ditto. * DBModeler/Resources/ClassProperty_Header.tiff: Ditto. * DBModeler/Resources/Locking_On.tiff: Ditto. * DBModeler/Resources/Key_On.tiff: Ditto. * DBModeler/GNUmakefile: Add new files. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gdl2/trunk@23397 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 48 ++++ DBModeler/ConsistencyChecker.m | 34 ++- DBModeler/DefaultColumnProvider.m | 102 ++++++--- DBModeler/EOAdditions.m | 83 +++++-- DBModeler/GNUmakefile | 21 +- DBModeler/Inspectors/GNUmakefile | 5 +- DBModeler/Inspectors/RelationshipInspector.m | 64 ++++-- .../Inspectors/RelationshipInspector.tiff | Bin 0 -> 4422 bytes DBModeler/MainModelEditor.h | 5 +- DBModeler/MainModelEditor.m | 44 ++-- DBModeler/Modeler.h | 4 +- DBModeler/Modeler.m | 70 +++++- DBModeler/ModelerAttributeEditor.m | 100 +++++---- DBModeler/ModelerEntityEditor.m | 22 +- DBModeler/ModelerTableEmbedibleEditor.h | 1 - DBModeler/ModelerTableEmbedibleEditor.m | 10 +- DBModeler/Preferences.h | 63 ++++++ DBModeler/Preferences.m | 206 ++++++++++++++++++ DBModeler/Resources/ClassProperty_Header.tiff | Bin 0 -> 1390 bytes DBModeler/Resources/ClassProperty_On.tiff | Bin 1352 -> 1116 bytes DBModeler/Resources/Key_Header.tiff | Bin 0 -> 1380 bytes DBModeler/Resources/Key_On.tiff | Bin 1106 -> 1370 bytes DBModeler/Resources/Locking_On.tiff | Bin 0 -> 1110 bytes .../Resources/Preferences.gorm/data.classes | 29 +++ .../Resources/Preferences.gorm/data.info | Bin 0 -> 184 bytes .../Resources/Preferences.gorm/objects.gorm | Bin 0 -> 7185 bytes DBModeler/SQLGenerator.m | 50 ++++- 27 files changed, 776 insertions(+), 185 deletions(-) create mode 100644 DBModeler/Inspectors/RelationshipInspector.tiff create mode 100644 DBModeler/Preferences.h create mode 100644 DBModeler/Preferences.m create mode 100644 DBModeler/Resources/ClassProperty_Header.tiff create mode 100644 DBModeler/Resources/Key_Header.tiff create mode 100644 DBModeler/Resources/Locking_On.tiff create mode 100644 DBModeler/Resources/Preferences.gorm/data.classes create mode 100644 DBModeler/Resources/Preferences.gorm/data.info create mode 100644 DBModeler/Resources/Preferences.gorm/objects.gorm diff --git a/ChangeLog b/ChangeLog index a2bedf9..0446547 100644 --- a/ChangeLog +++ b/ChangeLog @@ -52,6 +52,54 @@ (-[EOModelerEmbedibleEditor dealloc]): Implement. (-[EOModelerEmbedibleEditor initWithParentEditor:]): Observe EOMSelectionChangedNotification. + + DBModeler/ConsistencyChecker.m (+modelConsistencyCheck:): Honor + validation preferences. + DBModeler/Modeler.m (-new:): Reimplement. + (-setAdaptor:): Bail out it adaptor cannot be located. + (-application:openFile:): Fine tune path checking and correct return + values. + (-openPrefs:): Implement. + * DBModeler/Inspectors/RelationshipInspector.m + (-displayName): Implement. + (-selectedEntity): Validate selected row before commencing. + (-selectedDestinationAttribute): Reimplement. + (-updateConnectButton): Update enabled state of connect button. + (-refresh): Correct handling of src/destAttrib_tableView. + (-tableViewSelectionDidChange:): Allways call updateConnectButton. + * DBModeler/SQLGenerator.m (-openSQLGenerator:): Reimplement. + (-executeSQL:): Handle invalid adpator or connection information. + (-saveAs:): Handle abort correctly. + (-generate): Handle missing expression class. + * DBModeler/ModelerTableEmbedibleEditor.h + * DBModeler/ModelerEntityEditor.m (initWithParentEditor:): Correct + autoresize behavior. + (-activate): Update selection. + (-needToFetch:): Do not reloadData in _topTable. + (-displayGroupDidChangeSelection:): Update selection on parent. + * DBModeler/ModelerTableEmbedibleEditor.m + (-addDefaultTableColumnsForTableView:displayGroup:): Call tile instead + of sizeToFit. + * DBModeler/EOAdditions.m: Fix leaks. + (setIsClassProperty): Reimplement. + (-[setIsPrimaryKey:]): Ditto. + (-[setIsClassProperty:]): Correct call to function. + (-[isUsedForLocking]): Implement. + (-[setIsUsedForLocking:]): Ditto. + * DBModeler/MainModelEditor.h + * DBModeler/MainModelEditor.m: Update view handling. + * DBModeler/DefaultColumnProvider.m: Update handling of properties. + * DBModeler/ModelerAttributeEditor.m: Update general GUI interaction. + * DBModeler/Preferences.h: New file. + * DBModeler/Preferences.m: Ditto. + * DBModeler/Inspectors/RelationshipInspector.tiff: New file. + * DBModeler/Inspectors/GNUmakefile: Add new file. + * DBModeler/Resources/Preferences.gorm: New files. + * DBModeler/Resources/Key_Header.tiff: Ditto. + * DBModeler/Resources/ClassProperty_Header.tiff: Ditto. + * DBModeler/Resources/Locking_On.tiff: Ditto. + * DBModeler/Resources/Key_On.tiff: Ditto. + * DBModeler/GNUmakefile: Add new files. 2006-05-09 Matt Rice David Ayers diff --git a/DBModeler/ConsistencyChecker.m b/DBModeler/ConsistencyChecker.m index bc27c6c..e6f22d3 100644 --- a/DBModeler/ConsistencyChecker.m +++ b/DBModeler/ConsistencyChecker.m @@ -23,9 +23,8 @@ **/ -#include - #include "ConsistencyChecker.h" +#include "Preferences.h" #include #include @@ -36,6 +35,8 @@ #include #include +#include + #define MY_PRETTY NSMutableAttributedString \ mutableAttributedStringWithBoldSubstitutionsWithFormat @@ -366,6 +367,7 @@ static BOOL isInvalid(NSString *str) NSArray *arr; unsigned i, c, j, d; BOOL flag = YES; + for (i = 0,c = [ents count]; i < c; i++) { EOEntity *entity = [ents objectAtIndex:i]; @@ -405,12 +407,28 @@ static BOOL isInvalid(NSString *str) { EOModel *model = [[notif userInfo] objectForKey:EOMConsistencyModelObjectKey]; doc = [notif object]; - /* TODO user defaults */ - [self attributeDetailsCheckForModel:model]; - [self primaryKeyCheckForModel:model]; - [self externalNameCheckForModel:model]; - [self relationshipCheckForModel:model]; - [self inheritanceCheckForModel:model]; + + if ([[DBModelerPrefs sharedPreferences] attributeDetailsCheck]) + [self attributeDetailsCheckForModel:model]; + + if ([[DBModelerPrefs sharedPreferences] primaryKeyCheck]) + [self primaryKeyCheckForModel:model]; + + if ([[DBModelerPrefs sharedPreferences] externalNameCheck]) + [self externalNameCheckForModel:model]; + + if ([[DBModelerPrefs sharedPreferences] relationshipCheck]) + [self relationshipCheckForModel:model]; + + if ([[DBModelerPrefs sharedPreferences] inheritanceCheck]) + [self inheritanceCheckForModel:model]; + + if ([[DBModelerPrefs sharedPreferences] storedProcedureCheck]) + [self storedProcedureCheckForModel:model]; + + if ([[DBModelerPrefs sharedPreferences] entityStoredProcedureCheck]) + [self entityStoredProcedureCheckForModel:model]; + doc = nil; } @end diff --git a/DBModeler/DefaultColumnProvider.m b/DBModeler/DefaultColumnProvider.m index face131..92709f6 100644 --- a/DBModeler/DefaultColumnProvider.m +++ b/DBModeler/DefaultColumnProvider.m @@ -33,6 +33,7 @@ #include #include +#include #include #include #include @@ -42,43 +43,49 @@ #include #define DICTSIZE(dict) (sizeof(dict) / sizeof(dict[0])) -#define uhuh (id)1 + static DefaultColumnProvider *_sharedDefaultColumnProvider; static NSMutableDictionary *_aspectsAndKeys; - +/* todo make this a struct instead of an array */ /* object key default */ -static id attribute_columns[][3] = { - {@"allowNull", @"Allows null", uhuh}, - {@"isClassProperty", @"Class property", uhuh}, - {@"columnName", @"Column name", uhuh}, - {@"definition", @"Definition", nil}, - {@"externalType", @"External Type", uhuh}, - {@"isUsedForLocking", @"Locking", uhuh}, - {@"name", @"Name", uhuh}, - {@"precision", @"Precision", nil}, - {@"isPrimaryKey", @"Primary key", uhuh}, - {@"readFormat", @"Read format", nil}, - {@"scale", @"Scale", nil}, - {@"valueClassName", @"Value class name", uhuh}, - {@"valueType", @"Value type", nil}, - {@"width", @"Width", uhuh}, - {@"writeFormat", @"Write format", nil} +struct column_info { + NSString *key; + NSString *name; + BOOL isDefault; +}; + +static struct column_info attribute_columns[] = { + {@"allowNull", @"Allows null", YES}, + {@"isClassProperty", @"Class property", YES}, + {@"columnName", @"Column name", YES}, + {@"definition", @"Definition", NO}, + {@"externalType", @"External Type", YES}, + {@"isUsedForLocking", @"Locking", YES}, + {@"name", @"Name", YES}, + {@"precision", @"Precision", NO}, + {@"isPrimaryKey", @"Primary key", YES}, + {@"readFormat", @"Read format", NO}, + {@"scale", @"Scale", NO}, + {@"valueClassName", @"Value class name", YES}, + {@"valueType", @"Value type", NO}, + {@"width", @"Width", YES}, + {@"writeFormat", @"Write format", NO} }; -static id relationship_columns[][3]= { - {@"isClassProperty", @"Class property", uhuh}, - {@"definition", @"Definition", nil}, - {@"name", @"Name", uhuh}, - {@"destinationEntity.name", @"Destination Entity", uhuh} +static struct column_info relationship_columns[]= { + {@"isClassProperty", @"Class property", YES}, + {@"definition", @"Definition", NO}, + {@"name", @"Name", YES}, + {@"destinationEntity.name", @"Destination Entity", YES} }; -static id entity_columns[][3] = { - {@"name", @"Name", uhuh}, - {@"className", @"Class name", uhuh}, - {@"externalName", @"External name", uhuh}, - {@"externalQuery", @"External query", nil}, - {@"parentEntity.name", @"Parent", nil} +static struct column_info entity_columns[] = { + {@"name", @"Name", YES}, + {@"className", @"Class name", YES}, + {@"externalName", @"External name", YES}, + {@"externalQuery", @"External query", NO}, + {@"parentEntity.name", @"Parent", NO} }; @@ -97,7 +104,7 @@ static id entity_columns[][3] = { } * or something not sure if id columns[][2] would work as a method so i'll use * a function.. it _should_ but iirc buggy somewhere (forwarding?) */ -void registerColumnsForClass(id columns[][3], int count, Class aClass,NSMutableArray *defaultColumnsArray) +void registerColumnsForClass(struct column_info columns[], int count, Class aClass,NSMutableArray *defaultColumnsArray) { id *objects; id *keys; @@ -111,9 +118,9 @@ void registerColumnsForClass(id columns[][3], int count, Class aClass,NSMutableA for (i = 0; i < count; i++) { - objects[i] = columns[i][0]; - keys[i] = columns[i][1]; - if (columns[i][2] == uhuh) + objects[i] = columns[i].key; + keys[i] = columns[i].name; + if (columns[i].isDefault == YES) { [defaultColumnsArray addObject:keys[i]]; } @@ -154,6 +161,31 @@ void registerColumnsForClass(id columns[][3], int count, Class aClass,NSMutableA DefaultRelationshipColumns); } +- (void) setupTitleForColumn:(NSTableColumn *)tc named:(NSString *)name +{ + NSTableHeaderCell *headerCell = [tc headerCell]; + if ([name isEqual:@"Primary key"]) + { + NSImage *img = [NSImage imageNamed:@"Key_Header"]; + [headerCell setImage:img]; + } + else if ([name isEqual:@"Class property"]) + [headerCell setImage:[NSImage imageNamed:@"ClassProperty_Header"]]; + else if ([name isEqual:@"Locking"]) + [headerCell setImage:[NSImage imageNamed:@"Locking_Header"]]; + else if ([name isEqual:@"Name"]) + { + [tc setWidth:100.0]; + [headerCell setStringValue:name]; + return; + } + else + { + [headerCell setStringValue:name]; + } + [tc sizeToFit]; +} + - (NSCell *)cellForColumnNamed:(NSString *)name { @@ -192,7 +224,7 @@ void registerColumnsForClass(id columns[][3], int count, Class aClass,NSMutableA [cell setImagePosition:NSImageOnly]; [cell setBordered:NO]; [cell setBezeled:NO]; - [cell setAlternateImage:[NSImage imageNamed:@"ClassProperty_On"]]; + [cell setAlternateImage:[NSImage imageNamed:@"Locking_On"]]; [cell setControlSize: NSSmallControlSize]; [cell setEditable:YES]; return AUTORELEASE(cell); @@ -233,10 +265,10 @@ void registerColumnsForClass(id columns[][3], int count, Class aClass,NSMutableA aspectKey = [[_aspectsAndKeys objectForKey:class] objectForKey:columnName]; aspect = @"value"; association = [[EOColumnAssociation alloc] initWithObject:tc]; - [[tc headerCell] setStringValue:columnName]; cell = [self cellForColumnNamed:columnName]; [tc setEditable:[cell isEditable]]; [tc setDataCell:cell]; + [self setupTitleForColumn:tc named:columnName]; [association bindAspect:aspect displayGroup:displayGroup key:aspectKey]; [association establishConnection]; [association release]; diff --git a/DBModeler/EOAdditions.m b/DBModeler/EOAdditions.m index 8f93c42..f711d69 100644 --- a/DBModeler/EOAdditions.m +++ b/DBModeler/EOAdditions.m @@ -33,18 +33,26 @@ /* this is all stuff for key value coding.. */ static inline NSNumber * isClassProperty(id self) { - return [NSNumber numberWithBool: [[[self entity] classProperties] containsObject:self]]; + return [NSNumber numberWithBool: + [[[self entity] classProperties] containsObject:self]]; } static inline void setIsClassProperty(id self, NSNumber *flag) { BOOL isProp = [flag boolValue]; - NSArray *props = RETAIN([[self entity] classProperties]); + NSArray *props = [[self entity] classProperties]; if (isProp) { - if (![props containsObject:self]) - [[self entity] setClassProperties: [props arrayByAddingObject:self]]; + if (!props) + { + if (![[self entity] setClassProperties: [NSArray arrayWithObject:self]]) + NSLog(@"invalid class property"); + } + else if (![props containsObject:self]) + { + [[self entity] setClassProperties: [props arrayByAddingObject:self]]; + } } else { @@ -55,25 +63,33 @@ static inline void setIsClassProperty(id self, NSNumber *flag) [[self entity] setClassProperties: newProps]; } } - RELEASE(props); } @implementation EOAttribute (ModelerAdditions) - (NSNumber *) isPrimaryKey { - return [NSNumber numberWithBool: [[[self entity] primaryKeyAttributes] containsObject:self]]; + BOOL flag = [[[self entity] primaryKeyAttributes] containsObject:self]; + return [NSNumber numberWithBool: flag]; } - (void) setIsPrimaryKey:(NSNumber *)flag { BOOL isKey = [flag boolValue]; - NSArray *pka = RETAIN([[self entity] primaryKeyAttributes]); + NSArray *pka = [[self entity] primaryKeyAttributes]; if (isKey) { - if (![pka containsObject:self]) - [[self entity] setPrimaryKeyAttributes: [pka arrayByAddingObject:self]]; + if (!pka) + { + [[self entity] + setPrimaryKeyAttributes: [NSArray arrayWithObject:self]]; + } + else if (![pka containsObject:self]) + { + [[self entity] + setPrimaryKeyAttributes: [pka arrayByAddingObject:self]]; + } } else { @@ -85,33 +101,63 @@ static inline void setIsClassProperty(id self, NSNumber *flag) } } - RELEASE(pka); } - (NSNumber *) isClassProperty { - return isClassProperty(self); + id flag = isClassProperty(self); + + return flag; } - (void) setIsClassProperty:(NSNumber *)flag { - return setIsClassProperty(self, flag); + setIsClassProperty(self, flag); } - (NSNumber *) isUsedForLocking { - return [NSNumber numberWithBool:NO]; - /* FIXME */ + BOOL flag; + + flag = [[[self entity] attributesUsedForLocking] containsObject:self]; + + return [NSNumber numberWithBool:flag]; } - (void) setIsUsedForLocking:(NSNumber *)flag { - /* FIXME */ + BOOL yn = [flag boolValue]; + NSArray *la = RETAIN([[self entity] attributesUsedForLocking]); + + if (yn) + { + + if (la == nil) + { + [[self entity] + setAttributesUsedForLocking:[NSArray arrayWithObject:self]]; + } + else if (![la containsObject:self]) + { + [[self entity] + setAttributesUsedForLocking:[la arrayByAddingObject:self]]; + } + } + else + { + if ([la containsObject:self]) + { + NSMutableArray *newLA = [NSMutableArray arrayWithArray:la]; + [newLA removeObject:self]; + [[self entity] setAttributesUsedForLocking:newLA]; + } + } } - (NSNumber *)allowNull { - return [NSNumber numberWithBool:[self allowsNull]]; + BOOL flag = [self allowsNull]; + return [NSNumber numberWithBool:flag]; } - (void) setAllowNull:(NSNumber *)flag @@ -125,12 +171,13 @@ static inline void setIsClassProperty(id self, NSNumber *flag) @implementation EORelationship (ModelerAdditions) - (NSNumber *) isClassProperty { - return isClassProperty(self); + id flag = isClassProperty(self); + return flag; } - (void) setIsClassProperty:(NSNumber *)flag { - return setIsClassProperty(self, flag); + setIsClassProperty(self, flag); } @end diff --git a/DBModeler/GNUmakefile b/DBModeler/GNUmakefile index 99a6310..d66b765 100644 --- a/DBModeler/GNUmakefile +++ b/DBModeler/GNUmakefile @@ -20,13 +20,19 @@ endif ADDITIONAL_NATIVE_LIBS += EOInterface gnustep-db2modeler -$(APP_NAME)_RESOURCE_FILES = \ - Resources/Key_On.tiff \ - Resources/ClassProperty_On.tiff \ - Resources/ModelDrag.tiff \ - Resources/SQLGenerator.gorm \ - Resources/Info-gnustep.plist \ - Resources/ConsistencyResults.gorm +$(APP_NAME)_RESOURCE_FILES = \ + Resources/Key_On.tiff \ + Resources/ClassProperty_On.tiff \ + Resources/ModelDrag.tiff \ + Resources/SQLGenerator.gorm \ + Resources/Info-gnustep.plist \ + Resources/Key_Header.tiff \ + Resources/Locking_On.tiff \ + Resources/Locking_Header.tiff \ + Resources/ClassProperty_Header.tiff \ + Resources/Preferences.gorm \ + Resources/ConsistencyResults.gorm \ + Resources/DBModeler.tiff $(APP_NAME)_OBJC_FILES = \ main.m \ @@ -41,6 +47,7 @@ $(APP_NAME)_OBJC_FILES = \ ModelerTableEmbedibleEditor.m \ SQLGenerator.m \ ConsistencyResults.m \ + Preferences.m \ ConsistencyChecker.m include $(GNUSTEP_MAKEFILES)/application.make diff --git a/DBModeler/Inspectors/GNUmakefile b/DBModeler/Inspectors/GNUmakefile index 067480e..da03788 100644 --- a/DBModeler/Inspectors/GNUmakefile +++ b/DBModeler/Inspectors/GNUmakefile @@ -4,7 +4,10 @@ ADDITIONAL_INCLUDE_DIRS+=-I../../ Inspectors_HAS_RESOURCE_BUNDLE=yes -Inspectors_RESOURCE_FILES=RelationshipInspector.gorm +Inspectors_RESOURCE_FILES= \ +RelationshipInspector.gorm \ +RelationshipInspector.tiff + Inspectors_OBJC_FILES=RelationshipInspector.m Inspectors_RESOURCE_FILES+=AttributeInspector.gorm diff --git a/DBModeler/Inspectors/RelationshipInspector.m b/DBModeler/Inspectors/RelationshipInspector.m index 8bfe685..995b223 100644 --- a/DBModeler/Inspectors/RelationshipInspector.m +++ b/DBModeler/Inspectors/RelationshipInspector.m @@ -11,11 +11,18 @@ #include @implementation RelationshipInspector + +- (NSString *) displayName +{ + return @"Relationship inspector"; +} + - (EOEntity *)selectedEntity { int row = [destEntity_tableView selectedRow]; + NSArray *entities = [[[EOMApp activeDocument] model] entities]; - if (row == -1) + if (row == -1 || row == NSNotFound || row > [entities count]) return nil; return [[[[EOMApp activeDocument] model] entities] objectAtIndex:row]; @@ -24,8 +31,9 @@ - (EOAttribute *)selectedDestinationAttribute { int row = [destAttrib_tableView selectedRow]; - - if (row == -1) + NSArray *attribs = [[self selectedEntity] attributes]; + + if (row == -1 || row == NSNotFound || row > [attribs count]) return nil; return [[[self selectedEntity] attributes] @@ -35,11 +43,12 @@ - (EOAttribute *)selectedSourceAttribute { int row = [srcAttrib_tableView selectedRow]; - - if (row == -1) + NSArray *attribs = [[[self selectedObject] entity] attributes]; + + if (row == -1 || row == NSNotFound || row > [attribs count]) return nil; - - return [[[[self selectedObject] entity] attributes] objectAtIndex:[srcAttrib_tableView selectedRow]]; + + return [attribs objectAtIndex:[srcAttrib_tableView selectedRow]]; } - (int) indexOfSourceAttribute:(EOAttribute *)srcAttrib @@ -120,8 +129,9 @@ - (EOJoin *) selectedJoin { - return [self joinWithSource:[self selectedSourceAttribute] - destination:[self selectedDestinationAttribute]]; + EOJoin *join = [self joinWithSource:[self selectedSourceAttribute] + destination:[self selectedDestinationAttribute]]; + return join; } - (void) awakeFromNib @@ -143,6 +153,7 @@ - (void) updateConnectButton { + [connect_button setEnabled:([self selectedDestinationAttribute] != nil)]; [connect_button setState: ([self selectedJoin] != nil) ? NSOnState : NSOffState]; } @@ -152,12 +163,13 @@ EOEntity *destEntity; EOAttribute *srcAttrib, *destAttrib; NSArray *joins; - unsigned int row; + unsigned int row = 0; [name_textField setStringValue:[(EORelationship *)[self selectedObject] name]]; - /* it is important that the destEntity has a selected row before the destAttrib tableview - * reloads data */ + [srcAttrib_tableView reloadData]; + [destAttrib_tableView reloadData]; [destEntity_tableView reloadData]; + destEntity = [[self selectedObject] destinationEntity]; if (destEntity) { @@ -167,7 +179,7 @@ } else if ([destEntity_tableView numberOfRows]) row = 0; - + [destEntity_tableView selectRow:row byExtendingSelection:NO]; joins = [[self selectedObject] joins]; @@ -178,14 +190,23 @@ srcAttrib = [join sourceAttribute]; destAttrib = [join destinationAttribute]; row = [self indexOfSourceAttribute:srcAttrib]; - [srcAttrib_tableView selectRow:row byExtendingSelection:NO]; + if (row != NSNotFound) + [srcAttrib_tableView selectRow:row byExtendingSelection:NO]; row = [self indexOfDestinationAttribute:srcAttrib]; - [destAttrib_tableView selectRow:row byExtendingSelection:NO]; + if (row != NSNotFound) + [destAttrib_tableView selectRow:row byExtendingSelection:NO]; } else { - [srcAttrib_tableView selectRow:0 byExtendingSelection:NO]; - [destAttrib_tableView selectRow:0 byExtendingSelection:NO]; + if ([self numberOfRowsInTableView:srcAttrib_tableView]) + { + [srcAttrib_tableView selectRow:0 byExtendingSelection:NO]; + } + + if ([self numberOfRowsInTableView:destAttrib_tableView]) + { + [destAttrib_tableView selectRow:0 byExtendingSelection:NO]; + } } [self updateConnectButton]; @@ -198,7 +219,9 @@ { EOModel *activeModel = [[EOMApp activeDocument] model]; if (tv == destEntity_tableView) - return [[activeModel entities] count]; + { + return [[activeModel entities] count]; + } else if (tv == srcAttrib_tableView) return [[(EOEntity *)[[self selectedObject] entity] attributes] count]; else if (tv == destAttrib_tableView) @@ -253,7 +276,6 @@ row:(int)rowIndex if (row != NSNotFound) [srcAttrib_tableView selectRow:row byExtendingSelection:NO]; - [self updateConnectButton]; } else if (tv == srcAttrib_tableView) { @@ -262,9 +284,9 @@ row:(int)rowIndex if (row != NSNotFound) [destAttrib_tableView selectRow:row byExtendingSelection:NO]; - - [self updateConnectButton]; } + + [self updateConnectButton]; } - (BOOL) tableView:(NSTableView *)tv shouldSelectRow:(int)rowIndex diff --git a/DBModeler/Inspectors/RelationshipInspector.tiff b/DBModeler/Inspectors/RelationshipInspector.tiff new file mode 100644 index 0000000000000000000000000000000000000000..a10849a19cf3b699afa795b827d31ed3717e4e57 GIT binary patch literal 4422 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 M07*qoM6N<$g3HK})Bpeg literal 0 HcmV?d00001 diff --git a/DBModeler/MainModelEditor.h b/DBModeler/MainModelEditor.h index 0a78358..981df0a 100644 --- a/DBModeler/MainModelEditor.h +++ b/DBModeler/MainModelEditor.h @@ -26,15 +26,16 @@ #include -#include #include #include +#include @interface MainModelEditor : EOModelerCompoundEditor { - NSBox *_box; + NSView *_editorView; NSWindow *_window; NSOutlineView *_iconPath; + NSSplitView *_vSplit; } @end diff --git a/DBModeler/MainModelEditor.m b/DBModeler/MainModelEditor.m index 7bf319c..31173eb 100644 --- a/DBModeler/MainModelEditor.m +++ b/DBModeler/MainModelEditor.m @@ -47,6 +47,7 @@ #include #include #include +#include #include #define DEBUG_STUFF 0 @@ -77,12 +78,11 @@ if ((self = [super initWithDocument:document])) { NSTableColumn *_col; - NSSplitView *vSplit = [[NSSplitView alloc] initWithFrame:NSMakeRect(0,0,400,400)]; NSScrollView *sv = [[NSScrollView alloc] initWithFrame:NSMakeRect(0,0,100,400)]; - // NSImageCell *_cell; - - [vSplit setVertical:YES]; + + _vSplit = [[NSSplitView alloc] initWithFrame:NSMakeRect(0,0,600,400)]; + [_vSplit setVertical:YES]; _iconPath = [[ModelerOutlineView alloc] initWithFrame:NSMakeRect(0,0,100,400)]; [_iconPath setIndentationPerLevel:8.0]; @@ -90,15 +90,13 @@ [_iconPath setDelegate:self]; [_iconPath setDataSource:self]; - //_cell = [[NSImageCell alloc] init]; _col = [(NSTableColumn *)[NSTableColumn alloc] initWithIdentifier:@"name"]; [_iconPath addTableColumn:_col]; [_iconPath setOutlineTableColumn:AUTORELEASE(_col)]; - //[[_iconPath tableColumnWithIdentifier:@"name"] setDataCell:_cell]; [_iconPath setAutoresizesAllColumnsToFit:YES]; [_iconPath sizeToFit]; - _window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0,0,400,400) + _window = [[NSWindow alloc] initWithContentRect:NSMakeRect(20,80,600,400) styleMask: NSTitledWindowMask | NSMiniaturizableWindowMask | NSClosableWindowMask | NSResizableWindowMask backing:NSBackingStoreBuffered defer:YES]; @@ -110,24 +108,20 @@ [_iconPath setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable]; [sv setDocumentView:_iconPath]; RELEASE(_iconPath); - [vSplit addSubview:sv]; + [_vSplit addSubview:sv]; RELEASE(sv); + _editorView = [[NSBox alloc] initWithFrame:NSMakeRect(0,0,500,400)]; - _box = [[NSBox alloc] initWithFrame:NSMakeRect(0,0,300,400)]; - [_box setTitle:@""]; - [_box setBorderType:NSNoBorder]; - [_box setAutoresizesSubviews:YES]; - [_box setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable]; - [vSplit addSubview: _box]; - RELEASE(_box); + [_vSplit addSubview: _editorView]; + RELEASE(_editorView); - [vSplit setAutoresizesSubviews:YES]; - [vSplit setAutoresizingMask: NSViewWidthSizable + [_vSplit setAutoresizesSubviews:YES]; + [_vSplit setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable]; - [vSplit adjustSubviews]; - [[_window contentView] addSubview:vSplit]; - RELEASE(vSplit); + [_vSplit adjustSubviews]; + [[_window contentView] addSubview:_vSplit]; + RELEASE(_vSplit); /* so addEntity: addAttribute: ... menu items work */ [_window setDelegate: document]; @@ -140,12 +134,14 @@ } return self; } + - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; RELEASE(_window); [super dealloc]; } + - (void) ecStuff:(NSNotification *)notif { if ([[notif object] isKindOfClass:[EOEditingContext class]]) @@ -172,10 +168,11 @@ } [mainView setAutoresizesSubviews:YES]; [mainView setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable]; - [mainView setFrame: [_box frame]]; + [mainView setFrame: [_editorView frame]]; - [_box setContentView: mainView]; - [_box setNeedsDisplay:YES]; + [_vSplit replaceSubview:_editorView with:mainView]; + _editorView = mainView; + [_editorView setNeedsDisplay:YES]; } - (void)activateEditorWithClass:(Class)embedibleEditorClass @@ -354,6 +351,7 @@ EOModel *bar = [_document model]; id item = nil; int selectedRow = [_iconPath selectedRow]; + if (selectedRow == -1) return; while (bar != item) diff --git a/DBModeler/Modeler.h b/DBModeler/Modeler.h index d92deeb..a9f5187 100644 --- a/DBModeler/Modeler.h +++ b/DBModeler/Modeler.h @@ -33,7 +33,9 @@ } - +/* runs the adaptor panel and the adaptors login panel, and sets the active + * documents connection dictionary. */ +- (void) setAdaptor:(id)sender; @end #endif // __Modeler_H_ diff --git a/DBModeler/Modeler.m b/DBModeler/Modeler.m index a77f6bb..3162fb5 100644 --- a/DBModeler/Modeler.m +++ b/DBModeler/Modeler.m @@ -30,6 +30,7 @@ #include "Modeler.h" #include "ModelerEntityEditor.h" #include "SQLGenerator.h" +#include "Preferences.h" #include #include @@ -239,11 +240,40 @@ { EOModel *newModel = [[EOModel alloc] init]; NSString *modelName; - unsigned int nDocs; + NSArray *docs = [EOMApp documents]; + unsigned docNumber, c, i; - nDocs = [[EOMApp documents] count]; - - modelName=[NSString stringWithFormat:@"Model_%u",++nDocs]; + docNumber = [[EOMApp documents] count]; + + c = [docs count]; + docNumber = c; + + /* look for the largest NNNN in models named "Model_NNNN" + * or the total number of models whichever is greater. + */ + for (i = 0; i < c; i++) + { + NSString *name = [(EOModel*)[[docs objectAtIndex:i] model] name]; + + if ([name hasPrefix:@"Model_"]) + { + NSRange range; + unsigned tmp; + + name = [name substringFromIndex:6]; + range = [name rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]]; + if (!(range.location == NSNotFound) && !(range.length == 0)) + continue; + range = [name rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]]; + if (!(range.location == NSNotFound) && !(range.length == 0)) + { + tmp = [name intValue]; + docNumber = (docNumber < ++tmp) ? tmp : docNumber; + } + } + } + + modelName = [NSString stringWithFormat:@"Model_%u",docNumber]; [newModel setName:modelName]; [self _newDocumentWithModel:newModel]; RELEASE(newModel); @@ -301,6 +331,10 @@ adaptorName = [adaptorsPanel runAdaptorsPanel]; RELEASE(adaptorsPanel); + + if (!adaptorName) + return; + [[[EOMApp activeDocument] model] setAdaptorName: adaptorName]; adaptor = [EOAdaptor adaptorWithName: adaptorName]; [[[EOMApp activeDocument] model] setConnectionDictionary:[adaptor runLoginPanel]]; @@ -312,26 +346,37 @@ [EOMInspectorController showInspector]; } -- (void) application:(NSApplication *)theApp openFile:(NSString *)filename +- (BOOL) application:(NSApplication *)theApp openFile:(NSString *)filename { NSFileManager *fm = [NSFileManager defaultManager]; NSString *pathExt = [[filename pathExtension] lowercaseString]; - - if ([fm isReadableFileAtPath:filename] == YES - && ([pathExt isEqual:@"eomodeld"] - || [pathExt isEqual:@"eomodel"])) + BOOL flag; +#if 0 + NSLog(@"%@ %@ %i %i %i %i %i", NSStringFromSelector(_cmd), filename, + [fm isReadableFileAtPath:filename] == YES, + [pathExt isEqual:@"eomodel"], + [pathExt isEqual:@"eomodeld"], + [fm fileExistsAtPath:filename isDirectory:&flag], + flag); +#endif + if (([fm isReadableFileAtPath:filename] == YES + && [pathExt isEqual:@"eomodel"]) + || ([pathExt isEqual:@"eomodeld"] + && [fm fileExistsAtPath:filename isDirectory:&flag] && flag)) { EOModel *model; NS_DURING model = [[EOModel alloc] initWithContentsOfFile:filename]; NS_HANDLER - return; + return NO; NS_ENDHANDLER [self _newDocumentWithModel:model]; RELEASE(model); + return YES; } + return NO; } - (void) open:(id)sender @@ -373,5 +418,10 @@ [[SQLGenerator sharedGenerator] openSQLGenerator:self]; } +- (void) openPrefs:(id)sender +{ + [[DBModelerPrefs sharedPreferences] showPreferences:self]; +} + @end diff --git a/DBModeler/ModelerAttributeEditor.m b/DBModeler/ModelerAttributeEditor.m index f907b0f..513910b 100644 --- a/DBModeler/ModelerAttributeEditor.m +++ b/DBModeler/ModelerAttributeEditor.m @@ -23,7 +23,6 @@ **/ - #include "DefaultColumnProvider.h" #include "ModelerAttributeEditor.h" #include "ModelerEntityEditor.h" @@ -45,8 +44,7 @@ #include #include - - + @interface NSArray (EOMAdditions) - (id) firstSelectionOfClass:(Class) aClass; @end @@ -60,12 +58,16 @@ NSMenuItem *mi = [[NSMenuItem alloc] initWithTitle:@"+" action:(SEL)nil keyEquivalent:@""]; self = [super initWithParentEditor:parentEditor]; + [DefaultColumnProvider class]; _mainView = [[NSSplitView alloc] initWithFrame:NSMakeRect(0,0,100,100)]; /* setup the attributes table view */ scrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(0,0,100,100)]; _attributes_tableView = [[NSTableView alloc] initWithFrame:NSMakeRect(0,0,100,100)]; - [_attributes_tableView setAutoresizesAllColumnsToFit:YES]; + [_attributes_tableView setAutoresizesAllColumnsToFit:NO]; + [_attributes_tableView setAllowsMultipleSelection:YES]; + [_attributes_tableView setAllowsEmptySelection:YES]; + [scrollView setBorderType: NSBezelBorder]; [scrollView setHasHorizontalScroller:YES]; [scrollView setHasVerticalScroller:YES]; @@ -79,7 +81,8 @@ [[cornerView cell] setArrowPosition:NSPopUpNoArrow]; [cornerView setTitle:@"+"]; [cornerView setPreferredEdge:NSMinYEdge]; - + [cornerView setBezelStyle:NSShadowlessSquareBezelStyle]; + [[cornerView cell] setUsesItemFromMenu:NO]; [[cornerView cell] setShowsFirstResponder:NO]; [[cornerView cell] setMenuItem:mi]; @@ -95,6 +98,7 @@ [_attributes_dg setDataSource:wds1]; RELEASE(wds1); [_attributes_dg setFetchesOnLoad:YES]; + [_attributes_dg setSelectsFirstObjectAfterFetch:NO]; [_attributes_dg setDelegate:self]; [self setupCornerView:cornerView @@ -110,7 +114,9 @@ [scrollView setHasHorizontalScroller:YES]; [scrollView setHasVerticalScroller:YES]; _relationships_tableView = [[NSTableView alloc] initWithFrame:NSMakeRect(0,0,100,100)]; - [_relationships_tableView setAutoresizesAllColumnsToFit:YES]; + [_relationships_tableView setAutoresizesAllColumnsToFit:NO]; + [_relationships_tableView setAllowsMultipleSelection:YES]; + [_relationships_tableView setAllowsEmptySelection:YES]; [scrollView setDocumentView:_relationships_tableView]; RELEASE(_relationships_tableView); [_mainView addSubview:scrollView]; @@ -121,6 +127,7 @@ [cornerView setPreferredEdge:NSMinYEdge]; [[cornerView cell] setArrowPosition:NSPopUpNoArrow]; [cornerView setTitle:@"+"]; + [cornerView setBezelStyle:NSShadowlessSquareBezelStyle]; [[cornerView cell] setUsesItemFromMenu:NO]; [[cornerView cell] setShowsFirstResponder:NO]; [[cornerView cell] setMenuItem:mi]; @@ -135,6 +142,7 @@ [_relationships_dg setDataSource:wds2]; RELEASE(wds2); [_relationships_dg setFetchesOnLoad:YES]; + [_relationships_dg setSelectsFirstObjectAfterFetch:NO]; [_relationships_dg setDelegate:self]; [self setupCornerView:cornerView @@ -144,7 +152,7 @@ [self addDefaultTableColumnsForTableView:_relationships_tableView displayGroup:_relationships_dg]; - + return self; } @@ -178,19 +186,39 @@ return flag; } +- (void) needToFetch:(id)arg +{ + [_attributes_dg fetch]; + [_relationships_dg fetch]; +} - (void) activate { - if (_entityToObserve) - [EOObserverCenter removeObserver:self forObject:_entityToObserve]; - - _entityToObserve = [[self selectionPath] firstSelectionOfClass:[EOEntity class]]; - [EOObserverCenter addObserver:self forObject:_entityToObserve]; + NSArray *selPath = [self selectionPath]; + NSArray *selWithin = [self selectionWithinViewedObject]; + id newEntityToObserve = [selPath firstSelectionOfClass:[EOEntity class]]; + if (_entityToObserve != newEntityToObserve) + { + if (_entityToObserve) + [EOObserverCenter removeObserver:self forObject:_entityToObserve]; + + _entityToObserve = newEntityToObserve; + [EOObserverCenter addObserver:self forObject:_entityToObserve]; + [(KVDataSource *)[_attributes_dg dataSource] setDataObject: _entityToObserve]; + [(KVDataSource *)[_relationships_dg dataSource] setDataObject: _entityToObserve]; + } - [(KVDataSource *)[_attributes_dg dataSource] setDataObject: _entityToObserve]; - [(KVDataSource *)[_relationships_dg dataSource] setDataObject: _entityToObserve]; - [_attributes_dg fetch]; - [_relationships_dg fetch]; + [self needToFetch:self]; + + if (![[_attributes_dg selectedObjects] isEqual:selWithin] + && ![_attributes_dg selectObjectsIdenticalTo:selWithin + selectFirstOnNoMatch:NO]) + [_attributes_dg clearSelection]; + + if (![[_relationships_dg selectedObjects] isEqual:selWithin] + && ![_relationships_dg selectObjectsIdenticalTo:selWithin + selectFirstOnNoMatch:NO]) + [_relationships_dg clearSelection]; } - (NSArray *) friendEditorClasses @@ -200,17 +228,12 @@ - (void) objectWillChange:(id)sender { - [[NSRunLoop currentRunLoop] performSelector:@selector(needToFetch:) - target:self - argument:nil - order:999 - modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]]; -} - -- (void) needToFetch:(id)arg -{ - [_attributes_dg fetch]; - [_relationships_dg fetch]; + [[NSRunLoop currentRunLoop] + performSelector:@selector(needToFetch:) + target:self + argument:nil + order:999 /* this number is probably arbitrary */ + modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]]; } - (NSArray *)defaultColumnNamesForClass:(Class)aClass @@ -231,24 +254,13 @@ - (void) displayGroupDidChangeSelection:(EODisplayGroup *)displayGroup { + NSArray *selObj = [displayGroup selectedObjects]; + NSArray *selWithin = [self selectionWithinViewedObject]; - NSArray *currentSelection = [_parentEditor selectionWithinViewedObject]; - id theSelection; - int c = [currentSelection count]; - - if (!c) - return; - else - theSelection = [currentSelection objectAtIndex:0]; - - if ([theSelection isKindOfClass:[EOEntity class]]) - { - NSArray *vop; - vop = [_parentEditor viewedObjectPath]; - [self setViewedObjectPath: [vop arrayByAddingObject:theSelection]]; - } - - [self setSelectionWithinViewedObject: [displayGroup selectedObjects]]; + if ([selObj count] + && (![selObj isEqual:selWithin]) + && ![selWithin containsObject:_entityToObserve]) + [self setSelectionWithinViewedObject: selObj]; } @end diff --git a/DBModeler/ModelerEntityEditor.m b/DBModeler/ModelerEntityEditor.m index 2a9b78c..ecc3ce7 100644 --- a/DBModeler/ModelerEntityEditor.m +++ b/DBModeler/ModelerEntityEditor.m @@ -102,7 +102,7 @@ _topTable = [[NSTableView alloc] initWithFrame:NSMakeRect(0,0,10,10)]; _bottomTable = [[NSTableView alloc] initWithFrame:NSMakeRect(0,0,10,10)]; - [_topTable setAutoresizesAllColumnsToFit:YES]; + [_topTable setAutoresizesAllColumnsToFit:NO]; [scrollView setDocumentView:_topTable]; RELEASE(_topTable); [_splitView addSubview:scrollView]; @@ -112,7 +112,7 @@ [scrollView setHasHorizontalScroller:YES]; [scrollView setHasVerticalScroller:YES]; [scrollView setBorderType: NSBezelBorder]; - [_bottomTable setAutoresizesAllColumnsToFit:YES]; + [_bottomTable setAutoresizesAllColumnsToFit:NO]; [scrollView setDocumentView:_bottomTable]; RELEASE(_bottomTable); [_splitView addSubview:scrollView]; @@ -124,6 +124,8 @@ cornerView = [[NSPopUpButton alloc] initWithFrame:[[_topTable cornerView] bounds] pullsDown:YES]; [cornerView setPreferredEdge:NSMinYEdge]; [cornerView setTitle:@"+"]; + [cornerView setBezelStyle:NSShadowlessSquareBezelStyle]; + [[cornerView cell] setBezelStyle:NSShadowlessSquareBezelStyle]; [[cornerView cell] setArrowPosition:NSPopUpNoArrow]; //[mi setImage:[NSImage imageNamed:@"plus"]]; // [mi setOnStateImage:[NSImage imageNamed:@"plus"]]; @@ -153,7 +155,7 @@ RELEASE(wds); [dg setFetchesOnLoad:YES]; [dg setDelegate: self]; - + [self setupCornerView:cornerView tableView:_topTable displayGroup:dg @@ -183,6 +185,9 @@ - (void) activate { [dg fetch]; + + [dg selectObjectsIdenticalTo:[self selectionWithinViewedObject] + selectFirstOnNoMatch:NO]; } - (NSView *)mainView @@ -192,20 +197,25 @@ - (void) objectWillChange:(id)anObject { - [[NSRunLoop currentRunLoop] performSelector:@selector(needToFetch:) target:self argument:nil order:999 modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]]; + [[NSRunLoop currentRunLoop] + performSelector:@selector(needToFetch:) + target:self + argument:nil + order:999 /* this number is probably arbitrary */ + modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]]; } - (void) needToFetch:(id)sth { [dg fetch]; - [_topTable reloadData]; } + @end @implementation ModelerEntityEditor (DisplayGroupDelegate) - (void) displayGroupDidChangeSelection:(EODisplayGroup *)displayGroup { - [self setSelectionWithinViewedObject: [displayGroup selectedObjects]]; + [[self parentEditor] setSelectionWithinViewedObject: [displayGroup selectedObjects]]; } @end diff --git a/DBModeler/ModelerTableEmbedibleEditor.h b/DBModeler/ModelerTableEmbedibleEditor.h index cbbe649..c67b5d0 100644 --- a/DBModeler/ModelerTableEmbedibleEditor.h +++ b/DBModeler/ModelerTableEmbedibleEditor.h @@ -33,7 +33,6 @@ * mostly takes care of corner views right now.. */ @interface ModelerTableEmbedibleEditor : EOModelerEmbedibleEditor - - (void) setupCornerView:(NSPopUpButton *)cornerView tableView:(NSTableView *)tableView displayGroup:(EODisplayGroup *)dg diff --git a/DBModeler/ModelerTableEmbedibleEditor.m b/DBModeler/ModelerTableEmbedibleEditor.m index 82823e3..343a1b5 100644 --- a/DBModeler/ModelerTableEmbedibleEditor.m +++ b/DBModeler/ModelerTableEmbedibleEditor.m @@ -85,18 +85,18 @@ provider = [EOMApp providerForName: columnName class:aClass]; - /* THIS *MUST* be before initColumn:class:name:displayGroup:document calls */ + /* + * THIS *MUST* be before initColumn:class:name:displayGroup:document calls */ [tv addTableColumn:tc]; RELEASE(tc); [provider initColumn:tc class:aClass name:columnName displayGroup:dg document:[self document]]; - item = (NSMenuItem *)[cv itemWithTitle:columnName]; [item setRepresentedObject:tc]; [item setState:NSOnState]; } - [tv sizeToFit]; + [tv tile]; } - (void) addTableColumnForItem:(NSMenuItem *)item @@ -120,8 +120,8 @@ name:columnName displayGroup:[[tv delegate] displayGroupForAspect:@"source"] // <-+-^ document:[self document]]; - - [tv sizeToFit]; + [tc sizeToFit]; + [tv tile]; } - (void) removeTableColumnForItem:(NSMenuItem *)item diff --git a/DBModeler/Preferences.h b/DBModeler/Preferences.h new file mode 100644 index 0000000..ba43795 --- /dev/null +++ b/DBModeler/Preferences.h @@ -0,0 +1,63 @@ +/** + Preferences.h + + Author: Matt Rice + Date: Mar 2006 + + This file is part of DBModeler. + + + DBModeler 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. + + DBModeler 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 DBModeler; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +**/ + +#include +#include + +@class NSWindow; +@class NSButton; +@class NSTableView; +@class NSMatrix; +@class NSMutableArray; + +@interface DBModelerPrefs : NSObject +{ + IBOutlet NSWindow *prefsWindow; + IBOutlet NSButton *consistencyCheckOnSave; + IBOutlet NSTableView *bundlesToLoad; + /* consistency checks */ + IBOutlet NSMatrix *check_matrix; + NSMutableArray *_bundles; +} + ++ (DBModelerPrefs *) sharedPreferences; + +- (void) showPreferences:(id)sender; + +- (BOOL) consistencyCheckOnSave; +- (BOOL) attributeDetailsCheck; +- (BOOL) storedProcedureCheck; +- (BOOL) relationshipCheck; +- (BOOL) primaryKeyCheck; +- (BOOL) inheritanceCheck; +- (BOOL) externalNameCheck; +- (BOOL) entityStoredProcedureCheck; +- (NSArray *)bundlesToLoad; + +- (IBAction) switchButtonChanged:(id)sender; +- (IBAction) checkOnSaveChanged:(id)sender; +- (IBAction) addBundle:(id)sender; +- (IBAction) removeBundle:(id)sender; +@end diff --git a/DBModeler/Preferences.m b/DBModeler/Preferences.m new file mode 100644 index 0000000..30f365b --- /dev/null +++ b/DBModeler/Preferences.m @@ -0,0 +1,206 @@ +/** + Preferences.m + + Author: Matt Rice + Date: Mar 2006 + + This file is part of DBModeler. + + + DBModeler 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. + + DBModeler 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 DBModeler; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +**/ + + +#include "Preferences.h" + +#include +#include + +#include +#include +#include +#include +#include + +#define DisableAttributeDetailsCheck @"DisableAttributeDetailsCheck" +#define DisableEntityStoredProcedureCheck @"DisableEntityStoredProcedureCheck" +#define DisableExternalNameCheck @"DisableExternalNameCheck" +#define DisableInheritanceCheck @"DisableInheritanceCheck" +#define DisablePrimaryKeyCheck @"DisablePrimaryKeyCheck" +#define DisableRelationshipCheck @"DisableRelationshipCheck" +#define DisableStoredProcedureCheck @"DisableStoredProcedureCheck" +static NSString *BundlesToLoad = @"BundlesToLoad"; +static NSString *DisableConsistencyCheckOnSave=@"DisableConsistencyCheckOnSave"; + + +static NSUserDefaults *ud; +static DBModelerPrefs *_sharedPrefs; + +/* do it this way so i can add the switch title later instead of being + * hard coded into the .gorm */ +static NSString *_switches[][2] = +{ + {DisableAttributeDetailsCheck, @"Attribute details"}, + {DisableExternalNameCheck, @"External name"}, + {DisablePrimaryKeyCheck, @"Primary key"}, + {DisableRelationshipCheck, @"Relationship"}, + {DisableEntityStoredProcedureCheck, @"Entity stored procedure"}, + {DisableStoredProcedureCheck, @"Stored procedure"}, + {DisableInheritanceCheck, @"Inheritance"} +}; + +#define FROBKEY(key) [ud boolForKey:key] ? NO : YES +#define COUNT(key) sizeof(key) / sizeof(key[0]) + +@implementation DBModelerPrefs : NSObject ++ (DBModelerPrefs *) sharedPreferences +{ + return _sharedPrefs ? _sharedPrefs : _sharedPrefs = [self new]; +} + +- (id) init +{ + self = [super init]; + /* setup ud before -awakeFromNib is called... */ + ud = [NSUserDefaults standardUserDefaults]; + _bundles = [[NSMutableArray alloc] init]; + [_bundles addObjectsFromArray:[self bundlesToLoad]]; + [NSBundle loadNibNamed:@"Preferences" owner:self]; + return self; +} + +- (void) awakeFromNib +{ + int i, c = COUNT(_switches); + + [check_matrix renewRows:c columns:1]; + + for (i = 0; i < c; i++) + { + NSButtonCell *cell = [check_matrix cellAtRow:i column:0]; + BOOL flag; + + flag = [ud boolForKey:_switches[i][0]]; + [cell setState: (flag == NO) ? NSOnState : NSOffState]; + [cell setTitle: _switches[i][1]]; + } + [check_matrix sizeToCells]; + [consistencyCheckOnSave + setState:[ud boolForKey:DisableConsistencyCheckOnSave] + ? NSOffState + : NSOnState]; + [bundlesToLoad reloadData]; +} + +- (void) showPreferences:(id)sender +{ + [prefsWindow makeKeyAndOrderFront:self]; +} + +- (void) switchButtonChanged:(id)sender +{ + [ud setBool:([[sender selectedCell] state] == NSOffState) + forKey:_switches[[sender selectedRow]][0]]; +} + +- (void) checkOnSaveChanged:(id)sender +{ + [ud setBool:([sender state] == NSOffState) + forKey:DisableConsistencyCheckOnSave]; +} + +- (NSArray *)bundlesToLoad +{ + return [ud arrayForKey:BundlesToLoad]; +} + +- (BOOL) consistencyCheckOnSave +{ + return FROBKEY(DisableConsistencyCheckOnSave); +} + +- (BOOL) attributeDetailsCheck +{ + return FROBKEY(DisableAttributeDetailsCheck); +} + +- (BOOL) entityStoredProcedureCheck +{ + return FROBKEY(DisableEntityStoredProcedureCheck); +} + +- (BOOL) externalNameCheck +{ + return FROBKEY(DisableExternalNameCheck); +} + +- (BOOL) inheritanceCheck +{ + return FROBKEY(DisableInheritanceCheck); +} + +- (BOOL) primaryKeyCheck +{ + return FROBKEY(DisablePrimaryKeyCheck); +} + +- (BOOL) relationshipCheck +{ + return FROBKEY(DisableRelationshipCheck); +} + +- (BOOL) storedProcedureCheck +{ + return FROBKEY(DisableStoredProcedureCheck); +} + + +- (int) numberOfRowsInTableView:(NSTableView *)tv +{ + int num = [_bundles count]; + return num; +} + +- (id) tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)tc row:(int)rowIndex +{ + id ov = [_bundles objectAtIndex:rowIndex]; + return ov; +} + +- (void) tableView:(NSTableView *)tv +setObjectValue:(id)newVal +forTableColumn:(NSTableColumn *)tc + row:(int)rowIndex +{ + [_bundles replaceObjectAtIndex:rowIndex withObject:newVal]; + [ud setObject:_bundles forKey:BundlesToLoad]; +} + +- (void) addBundle:(id)sender +{ + [_bundles addObject:@""]; + [bundlesToLoad reloadData]; + [bundlesToLoad selectRow:[_bundles count] - 1 byExtendingSelection:NO]; + [bundlesToLoad editColumn:0 row:[_bundles count] - 1 withEvent:nil select:YES]; +} +- (void) removeBundle:(id)sender +{ + [_bundles removeObjectAtIndex:[bundlesToLoad selectedRow]]; + [bundlesToLoad reloadData]; + [ud setObject:_bundles forKey:BundlesToLoad]; +} + +@end diff --git a/DBModeler/Resources/ClassProperty_Header.tiff b/DBModeler/Resources/ClassProperty_Header.tiff new file mode 100644 index 0000000000000000000000000000000000000000..e25447e336c01dd51ffbb1622c04e119c8ff038e GIT binary patch literal 1390 zcmeH{(MrQG6o!*-linygaDsZ#OA$2S6NnRRF9u`m$_u5or?$}9kz^HL*h?QlJ*Q?6 z*2O-6rnLFa-~T@exkwb9Gr!ONhvNjkwhV{0B~z3{*W3zNf}L@(Wp5#6x<)IsA^eu# zusX|aJ)CC854(rM(kWAqPSYPY4B02^Grm3n-fMUtYi_ZJOqazwetJfy%#L9Xd6#?a z9_J7A>>-bk!vSLl{HMQ<_0Y;58m7J@!`H}1#!m|#^Fgzp2kdiVI72?Q`kWc2Jy8q<(u0Ax=SF>LSb7SVF8J4PFbK2lE_)yJ#|{r9*t_h?@BuxU$eY literal 0 HcmV?d00001 diff --git a/DBModeler/Resources/ClassProperty_On.tiff b/DBModeler/Resources/ClassProperty_On.tiff index b91f10ee1967cf61acadcf573b0fd3f24a1af560..5f431724163c590701a022c5a6d4ca756df6dccf 100644 GIT binary patch literal 1116 zcmchW!AiqG5QaBRm0T1nSV2AHD1t6{@GMr)fW;z>SBc5g1k$D?X{4{zNAl#8sQ+fy z5R$aSixaZ@W%y=xScqkvF+*qU`!8YJHuP1yfXwp#?etZnj}GN1x2pRvA=Fn{Rq+e0 z4(oiFjnU}KN$S3ou~z1h`HEl2>wM&klCr$Pmn9W>vtO70)5k@%3|s}w;zHU$kA1N& z(|%P=&v_5uT8TSg{4DGPi>~sbW?OLwyrXs4Gxkq7yWl?fs>@hUll={R@0V&16pOxn z#n<3N<%r8)N~ zI}d|bB)ssF-`)%(k3x$16D83ib}8Y5&`FX}9L*_CmoJaAi!_)_*dQh+CC_{hQr{f= RWZqfBkvQ}ouegwW{{b+BqbdLZ literal 1352 zcmds1O-sW-5S>k1$wjb&3f3PWf-ZRSSk!|(h*C(eQj@6$woS>V0sm5dl1G1tb!Od# zB{XXNxR@}RH^X~xW-b{Fjv#CUEPwDsQDoFrRV~*I)`A_su9o?Kt>@kRsPFjEd|&5d z-=j(I^H*W#@n7|P->SR0=WgfRbid=&JzU@A&-9Mhlz&stUf&76(d|*c_p5amUZD+w z=;jeEgSV&<9u5f8&jOz5)3SZmY*-u+-V_0hD8CS=E8aars<%DYV?YjL0Op5^n9 zebF&HoOJ+t7WWAscs_>~^W33_sf5tJ@-dsD%*VwvjZvz!#JJS*VYbi(&Siq-u}bf$ uk*HI7d48QGs4$m9)Y&4BQOgT8*7`Qj=9m{xcQ><>BArZlz!e1_Z}J;P=z|de diff --git a/DBModeler/Resources/Key_Header.tiff b/DBModeler/Resources/Key_Header.tiff new file mode 100644 index 0000000000000000000000000000000000000000..d486132e74dd0a51fcfe7cb653b618ab1d6100ff GIT binary patch literal 1380 zcmebD)MDUZVHgEe41xbhfK+3Vw8ELlW`G1id>D-^hb#`)jE8})msHVE2Ro&5?$(V}NWK zBy%*NY>*p*kk~*j0|yl9XXNLm>K7%JgQyZr6!jZ>!;_H7MG+J=%=KX>E>i6 z0R>WWjPzZceDhOMb5e`+gHnt0ON)|Ii}k%zE8{&<6H`))^hz?*(iohJQWHy3QxwWG YOEMHfGEx=XJ$*rbXYc@GP{4p`0Ng>t>Hq)$ literal 0 HcmV?d00001 diff --git a/DBModeler/Resources/Key_On.tiff b/DBModeler/Resources/Key_On.tiff index 6d3d9c542da6c50b554642fd79c4f4f3ac4e3be1..04235be95a909ddefc1c4ab40206dfa3dcf6ae19 100644 GIT binary patch literal 1370 zcmebD)MDUZVHgF}4T1ka<6xLnlVSRhX=F1%;vfK{Av^>L6GzsMi;d8QU{OOqx_t=K ziDMz_Cr-zxDvClth~Xat3j-s}3`S-!TL8#sL}D`m*`UJW8IWLxii7m9LD@_|HZLO+ zgDa4J2UNocWQzgWCaeq$f{YOJIe>g2B)y_gHppBtDBA(Z7Kf?_St!NG3U-ed&>U$f zI|#^@K{7`J$_BY12#F2kGH^hlenx(7s(w*oNp5Cxs(x`X>mzvfqr^Qj*)&z zQE6VbzKfG@eoAUiYLR|WYH@yPQF3arzISS6ynmivNoHCa1A}u>YGO%hib8p2Nrpm5 UMyi6lr*8nr8V?`_1qYZ00G@A7AOHXW literal 1106 zcmchW-%7(U6vmTwN^cY=I6=MWrHC5v31kXdbtq!5WwvLw(5=#T8@|#W$t#~k{nBJ5 zbPOxPPHFO;)8F~iKs@h=IW}Y8e=*V^W#xv)cv-K4CNLOo( zSMge6<>Ko<`KpxazW5hreRG&aQblU~GOUWPj7Ot}hNA#!p3JYh&AwQR@j1usQg6ZM zhPI$_S=a{_TgPS2y4Du-2DjK9_D?XI&>iUG7GrI$>O1hajoclrW!;X}=g_;Fmksy$ zS~*V_b@sKsfj%(m9BM6Rkmi(+h|(d6tX~Y{fJ72cD468pbu`WkdJ`c{PLlWqfiO7} zm)%|(QbL({q&yvG0p;SB-kW3E+Y3SBKOMcJ;+wqc;zva`wzUF BqRapQ diff --git a/DBModeler/Resources/Locking_On.tiff b/DBModeler/Resources/Locking_On.tiff new file mode 100644 index 0000000000000000000000000000000000000000..e25895cce98ab327d87273c2f4a2bbd47c0ed23f GIT binary patch literal 1110 zcmeH`QA>nC5P)a(3SWvY=z{9O#|UbpUl0|Q&{ae}$E9=UlBc12-hb*R_0%t^X4h?z z!@{7)Msz>dZ)V38gJ2Il7vSSJ5r!e@FWrJ<(DfH|nzYe;)aqN)f=&6subn#OuYB7; zE6^$n{j_R!^53`Lis^pVwR!V&4F;@Gjc%+FqJ>q94!#u_m3x0=XJ}V+D q`Bff0iEQ$4lO0Gg9>ZyYBZ;v;7c%kh6Z9{Fp?X`mq*HB$9zOvb|3KaV literal 0 HcmV?d00001 diff --git a/DBModeler/Resources/Preferences.gorm/data.classes b/DBModeler/Resources/Preferences.gorm/data.classes new file mode 100644 index 0000000..59dcd77 --- /dev/null +++ b/DBModeler/Resources/Preferences.gorm/data.classes @@ -0,0 +1,29 @@ +{ + "## Comment" = "Do NOT change this file, Gorm maintains it"; + DBModelerPrefs = { + Actions = ( + "switchButtonChanged:", + "checkOnSaveChanged:", + "addBundle:", + "removeBundle:" + ); + Outlets = ( + prefsWindow, + consistencyCheckOnSave, + bundlesToLoad, + addBundleButton, + check_matrix, + removeBundleButton + ); + Super = NSObject; + }; + FirstResponder = { + Actions = ( + "addBundle:", + "checkOnSaveChanged:", + "removeBundle:", + "switchButtonChanged:" + ); + Super = NSObject; + }; +} \ No newline at end of file diff --git a/DBModeler/Resources/Preferences.gorm/data.info b/DBModeler/Resources/Preferences.gorm/data.info new file mode 100644 index 0000000000000000000000000000000000000000..8af267bd9e53de9f43b3c9860766f4eac5e0d925 GIT binary patch literal 184 zcmZ?w3oR~5El@}-O3uhEOEmxjqa@Q5D-Z(+j4>DnRtAiQj0_^~`9-;InK`KeMX71U zzKMB>>8V8wKw!wkz~L9{pOlrFTms@Vs4_4zFc~lzGK0i}ONuh{(t)Ck3~E4sC( literal 0 HcmV?d00001 diff --git a/DBModeler/Resources/Preferences.gorm/objects.gorm b/DBModeler/Resources/Preferences.gorm/objects.gorm new file mode 100644 index 0000000000000000000000000000000000000000..124af43c534d44b1719a073571f14978be4b8f6e GIT binary patch literal 7185 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 #include @@ -101,11 +102,23 @@ static NSString *_otherScript; - (void) openSQLGenerator:(id)sender; { + EOAdaptor *adaptor; + while (loadedNib && !goodToGo) { /* wait.. */ } - [_window makeKeyAndOrderFront:self]; + + adaptor = [[EOMApp activeDocument] adaptor]; + if (!adaptor) + { + [[EOMApp delegate] setAdaptor:self]; + } + + adaptor = [[EOMApp activeDocument] adaptor]; + + if (adaptor) + [_window makeKeyAndOrderFront:self]; } - (IBAction) executeSQL:(id)sender @@ -120,6 +133,30 @@ static NSString *_otherScript; if ([[_sqlOutput string] length] == 0) return; + if (!adaptor) + { + [[EOMApp delegate] setAdaptor:self]; + adaptor = [[EOMApp activeDocument] adaptor]; + connDict = [adaptor connectionDictionary]; + } + else if ([[connDict allKeys] count] == 0) + { + connDict = [adaptor runLoginPanel]; + + if (connDict) + [adaptor setConnectionDictionary:connDict]; + } + + if (!adaptor || [[connDict allKeys] count] == 0) + { + NSRunAlertPanel(@"Error", + @"SQL generator requires a valid adaptor and connection dictionary", + @"Ok", + nil, + nil); + return; + } + if ([adaptor hasOpenChannels]) { NSArray *contexts = [adaptor contexts]; @@ -204,13 +241,13 @@ static NSString *_otherScript; - (IBAction) saveAs:(id)sender { id savePanel = [NSSavePanel savePanel]; - NSString *path; int result = [savePanel runModal]; if (result == NSOKButton) { + NSString *path; path = [savePanel filename]; + [[_sqlOutput string] writeToFile:path atomically:YES]; } - [[_sqlOutput string] writeToFile:path atomically:YES]; } - (IBAction) switchChanged:(id)sender @@ -227,6 +264,13 @@ static NSString *_otherScript; int i, c; NSButton *btn; + if (!expr) + { + [[EOMApp delegate] setAdaptor:self]; + expr = [[[EOMApp activeDocument] adaptor] expressionClass]; + if (!expr) return; + } + for (i = 0, c = [adminSwitchButtons count]; i < c; i++) { btn = [adminSwitchButtons objectAtIndex:i];