libs-gdl2/DBModeler/DefaultColumnProvider.m
Matt Rice 91868e3d12 * DBModeler/AdaptorsPanel.m (-init): Add parenthesis around
assignment.   Replace label with window title.
(-runAdaptorsPanel:): Remove unused variable.

* DBModeler/DefaultColumnProvider.m: Add missing braces, remove
unused ivars.
(-cellForColumnNamed:): Autorelease cells.

* DBModeler/EOAdditions.m: New EOAttribute KVC methods -allowNull and
 -setAllowNull:.

* DBModeler/GNUmakefile: Add new to project.

* DBModeler/KVDataSource.m (-createObject:): Return nil after
throwing exception.

* DBModeler/MainModelEditor.m
(-dragImageForRows:event:dragImageOffset:):: Enable drag and
drop for relationships.
(-initWithDocument:): Add parenthesis around assignment. Don't
release the document window on close.
(-ecStuff:): temporarily reload everything in the outline view when
something changes.
(-viewSelectedObject:): Remove NSLog.  Rewrite editor activation.
Fix leaks.

* DBModeler/Modeler.m (-applicationWillFinishLaunching:): Add new menu
items. Don't order our menu in.
(-new:,-open:): Move document initializition to _newDocumentWithModel:.
(-_newDocumentWithModel:,-newFromDatabase:): New methods.
(-validateMenuItem:,-generateSQL:): Ditto.

* DBModeler/ModelerAttributeEditor.m (-initWithParentEditor:):
Remove unused variables.
(-displayGroupDidChangeSelection:): return early if there is no
longer a selection.

* DBModeler/ModelerEntityEditor.m:
(-canSupportCurrentSelection): Remove NSLog.
(-displayGroupDidChangeSelection:): Ditto.
(-dealloc:): New method.
(-initWithParentEditor:): Remove unused variables.  Add parens around
assignment.  Release local variables.

* DBModeler/ModelerTableEmbedibleEditor:
(-addDefaultTableColumnsForTableView:displayGroup:): Release table
 columns.
(-addTableColumnForItem:tableView:): Ditto.

* DBModeler/Inspectors/RelationshipInspector.m:
(-selectedEntity, -selectedDestinationAttribute): New methods.
(-selectedSourceAttribute, -indexOfSourceAttribute:): Ditto.
(-indexOfDestinationAttribute:,joinWithSource:destination:): Ditto.
(-selectedJoin:,updateConnectButton,): Ditto.
(-refresh): Rewrite using new methods.
(-numberOfRowsInTableView:): Add fallback return value.
(-tableView:objectValueForTableColumn:row:): Ditto.
(-tableView:selectionDidChange:): If a source or destination
attribute is now selected, select its counterpart.
(-tableView:shouldSelectRow:): New method to disallow entity
selection if there is a destination entity.
(-tableView:willDisplayCell:forTableColumn:row:): New method,
set the cell text color to disabled text color, if we would disallow
 selection.
(-connectionChanged:): Implement disconnection.

* DBModeler/SQLGenerator.h/m: New files initial implementation.
* DBModeler/Resources/SQLGenerator.gorm: Ditto.
* DBModeler/ConsistencyChecker.h/m: Ditto.
* DBModeler/ConsistencyResults.h/m: Ditto.
* DBModeler/ConsistencyResults.gorm: Ditto.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gdl2/trunk@21438 72102866-910b-0410-8b05-ffd578937521
2005-07-09 02:07:42 +00:00

245 lines
7.5 KiB
Objective-C

/**
DefaultColumnProvider.m
Author: Matt Rice <ratmice@yahoo.com>
Date: Apr 2005
This file is part of DBModeler.
<license>
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
</license>
**/
#include "DefaultColumnProvider.h"
#include "ModelerEntityEditor.h"
#include <EOModeler/EOModelerApp.h>
#include <EOInterface/EOColumnAssociation.h>
#include <EOAccess/EOAttribute.h>
#include <EOAccess/EOEntity.h>
#include <AppKit/NSTableColumn.h>
#include <AppKit/NSCell.h>
#include <AppKit/NSTextFieldCell.h>
#include <AppKit/NSButtonCell.h>
#include <AppKit/NSTableView.h>
#include <AppKit/NSImage.h>
#include <Foundation/NSDictionary.h>
#define DICTSIZE(dict) (sizeof(dict) / sizeof(dict[0]))
#define uhuh (id)1
static DefaultColumnProvider *_sharedDefaultColumnProvider;
static NSMutableDictionary *_aspectsAndKeys;
/* 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}
};
static id relationship_columns[][3]= {
{@"isClassProperty", @"Class property", uhuh},
{@"definition", @"Definition", nil},
{@"name", @"Name", uhuh},
{@"destinationEntity.name", @"Destination Entity", uhuh}
};
static id entity_columns[][3] = {
{@"name", @"Name", uhuh},
{@"className", @"Class name", uhuh},
{@"externalName", @"External name", uhuh},
{@"externalQuery", @"External query", nil},
{@"parentEntity.name", @"Parent", nil}
};
@implementation DefaultColumnProvider
/* function to create a NSDictionary out of the c arrays..
* which looks like
{
Class = {
columnName1 = "aspectKey1";
columnName2 = "aspectKey2";
};
Class2 = {
otherColumnName = "otherAspectKey";
};
}
* 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)
{
id *objects;
id *keys;
int i;
size_t size;
NSDictionary *tmp;
size = (count * sizeof(id));
objects = (id *)NSZoneMalloc([_sharedDefaultColumnProvider zone], size);
keys = (id *)NSZoneMalloc([_sharedDefaultColumnProvider zone], size);
for (i = 0; i < count; i++)
{
objects[i] = columns[i][0];
keys[i] = columns[i][1];
if (columns[i][2] == uhuh)
{
[defaultColumnsArray addObject:keys[i]];
}
}
tmp = [NSDictionary dictionaryWithObjects:objects
forKeys:keys
count:count];
[EOMApp registerColumnNames: [tmp allKeys]
forClass: aClass
provider:_sharedDefaultColumnProvider];
NSZoneFree([_sharedDefaultColumnProvider zone], objects);
NSZoneFree([_sharedDefaultColumnProvider zone], keys);
[_aspectsAndKeys setObject: tmp
forKey: aClass];
}
+ (void)initialize
{
DefaultEntityColumns = [[NSMutableArray alloc] init];
DefaultAttributeColumns = [[NSMutableArray alloc] init];
DefaultRelationshipColumns = [[NSMutableArray alloc] init];
_sharedDefaultColumnProvider = [[self alloc] init];
_aspectsAndKeys = [[NSMutableDictionary alloc] init];
registerColumnsForClass(attribute_columns,
DICTSIZE(attribute_columns),
[EOAttribute class],
DefaultAttributeColumns);
registerColumnsForClass(entity_columns,
DICTSIZE(entity_columns),
[EOEntity class],
DefaultEntityColumns);
registerColumnsForClass(relationship_columns,
DICTSIZE(relationship_columns),
[EORelationship class],
DefaultRelationshipColumns);
}
- (NSCell *)cellForColumnNamed:(NSString *)name
{
/* TODO need a switch button for "Locking" and "Allows null" */
if ([name isEqual:@"Primary key"])
{
NSButtonCell *cell = [[NSButtonCell alloc] initImageCell:nil];
[cell setButtonType:NSSwitchButton];
[cell setImagePosition:NSImageOnly];
[cell setBordered:NO];
[cell setBezeled:NO];
[cell setAlternateImage:[NSImage imageNamed:@"Key_On"]];
[cell setControlSize: NSSmallControlSize];
[cell setEditable:YES];
return AUTORELEASE(cell);
}
else if ([name isEqual:@"Class property"])
{
NSButtonCell *cell = [[NSButtonCell alloc] initImageCell:nil];
[cell setButtonType:NSSwitchButton];
[cell setImagePosition:NSImageOnly];
[cell setBordered:NO];
[cell setBezeled:NO];
[cell setAlternateImage:[NSImage imageNamed:@"ClassProperty_On"]];
[cell setControlSize: NSSmallControlSize];
[cell setEditable:YES];
return AUTORELEASE(cell);
}
else if ([name isEqual:@"Locking"])
{
NSButtonCell *cell = [[NSButtonCell alloc] initImageCell:nil];
[cell setButtonType:NSSwitchButton];
[cell setImagePosition:NSImageOnly];
[cell setBordered:NO];
[cell setBezeled:NO];
[cell setAlternateImage:[NSImage imageNamed:@"ClassProperty_On"]];
[cell setControlSize: NSSmallControlSize];
[cell setEditable:YES];
return AUTORELEASE(cell);
}
else if ([name isEqual:@"Allows null"])
{
NSButtonCell *cell = [[NSButtonCell alloc] initImageCell:nil];
[cell setButtonType:NSSwitchButton];
[cell setImagePosition:NSImageOnly];
[cell setBordered:NO];
[cell setBezeled:NO];
[cell setControlSize: NSSmallControlSize];
[cell setEditable:YES];
return AUTORELEASE(cell);
}
else
{
NSTextFieldCell *cell = [[NSTextFieldCell alloc] initTextCell:@""];
[cell setEnabled:YES];
[cell setEditable:YES];
[cell setScrollable: YES];
return AUTORELEASE(cell);
}
}
- (void)initColumn:(NSTableColumn *)tc
class:(Class)class
name:(NSString *)columnName
displayGroup:(EODisplayGroup *)displayGroup
document:(EOModelerDocument *)doc
{
EOColumnAssociation *association;
NSCell *cell;
NSString *aspectKey;
NSString *aspect;
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];
[association bindAspect:aspect displayGroup:displayGroup key:aspectKey];
[association establishConnection];
[association release];
}
@end