libs-gdl2/EOInterface/EOTableViewAssociation.m
Matt Rice b70ec2777a * EOInterface/EOAssociation.m: New variable _objectToAssociations.
(+objectDeallocated:): New private method.
(+initialize): initialize _objectToAssociations.
(-dealloc): Discard any pending notifications.
(-establishConnection): Retain display groups we're bound to.
Retain our self and register our object for dealloc notification.
(-breakConnection): Release display groups we're bound to. Release
our self and discard any pending notifications.
(-subjectChanged): Add comment

* EOInterface/EOColumnAssociation.m (-establishConnection): Assign our
dg ivar after establishing connection.  Use the dg ivar and move 2 if
statements into one.

* EOInterface/EODisplayGroup.m: Remove debugging class/category for
emptyArray and emptyDictionary.
(-indexesForObjectsIndeticalTo:): Fix typo by renaming to
-indexesForObjectsIdenticalTo:.
(-dealloc): Remove our self as an observer for any notifications,
as an editor or message handler for our editing context, our observer
proxies as observers from the observer center. Don't release
array/dictionary ivars that are emptyArray or emptyDictionary.
(-setSelectionIndexes:): Update to reflect change in method name.
(-deleteSelection): Remove unused local var.
(-fetch:): Call -redisplay.
(-updatedObjectIndex:): Return -1 instead of 0 until this is
implemented.
(-setValue:forObject:key:): fix comment in exception handlers.

* EOInterface/EOGenericControlAssociation.m:
(-subjectChanged:): Remove unused local variable.

* EOMasterDetailAssociation.m:
(-establishConnection, -breakConnection, -subjectChanged): Implement.

* EOInterface/EOPopUpAssociation.m: Remove unused local variables.

* EOInterface/EOTableViewAssociation.m:
(-breakConnection:): Remove our NSTableView object from the map table.
(-subjectChanged:): Remove unused local variables. Release temporary
retain on selection indexes.
(+bindToTableView:displayGroup:): Don't retain the table views in the
map table.  Release the newly created association.
(-dealloc): Remove self from the tvAssociationMap.

* EOInterface/SubclassFlags.h: Fix bitmask on MatchKey1AspectMask.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gdl2/trunk@21439 72102866-910b-0410-8b05-ffd578937521
2005-07-09 03:01:22 +00:00

301 lines
8.2 KiB
Objective-C

/**
EOTableViewAssociation.m
Copyright (C) 2004 Free Software Foundation, Inc.
Author: David Ayers <d.ayers@inode.at>
This file is part of the GNUstep Database Library
The GNUstep Database Library is free software; you can redistribute it
and/or modify it under the terms of the GNU Lesser General Public License
as published by the Free Software Foundation; either version 2,
or (at your option) any later version.
The GNUstep Database Library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the GNUstep Database Library; see the file COPYING. If not,
write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef GNUSTEP
#include <Foundation/NSArray.h>
#include <Foundation/NSMapTable.h>
#include <Foundation/NSNotification.h>
#include <Foundation/NSString.h>
#include <Foundation/NSValue.h>
#include <AppKit/NSTableView.h>
#include <AppKit/NSTableColumn.h>
#include <AppKit/NSText.h>
#else
#include <Foundation/Foundation.h>
#include <AppKit/AppKit.h>
#endif
#include "EOColumnAssociation.h"
#include "EODisplayGroup.h"
@implementation EOTableViewAssociation
static NSMapTable *tvAssociationMap;
+ (NSArray *)aspects
{
static NSArray *_aspects = nil;
if (_aspects == nil)
{
NSArray *arr = [NSArray arrayWithObjects:
@"source", @"enabled", @"textColor",
@"bold", @"italic", nil];
_aspects = RETAIN([[super aspects] arrayByAddingObjectsFromArray: arr]);
}
return _aspects;
}
+ (NSArray *)aspectSignatures
{
static NSArray *_signatures = nil;
if (_signatures == nil)
{
NSArray *arr = [NSArray arrayWithObjects:
@"", @"A", @"A", @"A", @"A", nil];
arr = [[super aspectSignatures] arrayByAddingObjectsFromArray: arr];
_signatures = RETAIN(arr);
}
return _signatures;
}
+ (NSArray *)objectKeysTaken
{
static NSArray *_keys = nil;
if (_keys == nil)
{
_keys = [[NSArray alloc] initWithObjects:
@"target", @"delegate", @"dataSource", nil];
}
return _keys;
}
+ (BOOL)isUsableWithObject: (id)object
{
return [object isKindOfClass: [NSTableView class]];
}
+ (NSString *)primaryAspect
{
return @"source";
}
- (void)establishConnection
{
[super establishConnection];
_enabledAspectBound = [self displayGroupForAspect:@"enabled"] != nil;
_italicAspectBound = [self displayGroupForAspect:@"italic"] != nil;
_colorAspectBound = [self displayGroupForAspect:@"color"] != nil;
_boldAspectBound = [self displayGroupForAspect:@"bold"] != nil;
}
- (void)breakConnection
{
[super breakConnection];
NSMapRemove(tvAssociationMap, _object);
_enabledAspectBound = NO;
_italicAspectBound = NO;
_colorAspectBound = NO;
_boldAspectBound = NO;
}
- (void)subjectChanged
{
EODisplayGroup *dg = [self displayGroupForAspect:@"source"];
/* this must be before selection changes in the case where the selected row
is not yet inserted */
if ([dg contentsChanged])
[[self object] reloadData];
if ([dg selectionChanged])
{
NSArray *selectionIndexes = RETAIN([dg selectionIndexes]);
unsigned int i, count;
count = [selectionIndexes count];
for (i = 0; i < count; i++)
{
int rowIndex = [[selectionIndexes objectAtIndex:i] intValue];
[[self object] selectRow: rowIndex
byExtendingSelection: (i != 0)]; /* don't extend the first selection */
[[self object] scrollRowToVisible:rowIndex];
}
RELEASE(selectionIndexes);
}
}
+ (void)bindToTableView: (NSTableView *)tableView
displayGroup: (EODisplayGroup *)displayGroup
{
EOTableViewAssociation *assoc;
if (!tvAssociationMap)
{
tvAssociationMap = NSCreateMapTableWithZone(NSNonRetainedObjectMapKeyCallBacks,
NSNonRetainedObjectMapValueCallBacks,
0, [self zone]);
assoc = [[self allocWithZone:NSDefaultMallocZone()] initWithObject:tableView];
NSMapInsert(tvAssociationMap, (void *)tableView, (void *)assoc);
[assoc bindAspect:@"source" displayGroup:displayGroup key:@""];
[tableView setDataSource:assoc];
[tableView setDelegate:assoc];
[assoc establishConnection];
RELEASE(assoc);
return;
}
assoc = (EOTableViewAssociation *)NSMapGet(tvAssociationMap, tableView);
if (!assoc)
{
assoc = [[self allocWithZone:NSDefaultMallocZone()] initWithObject:tableView];
[assoc bindAspect:@"source" displayGroup:displayGroup key:@""];
[tableView setDataSource:assoc];
[tableView setDelegate:assoc];
[assoc establishConnection];
RELEASE(assoc);
NSMapInsert(tvAssociationMap, tableView, assoc);
}
}
- (BOOL)sortsByColumnOrder
{
return _sortsByColumnOrder;
}
- (void)setSortsByColumnOrder: (BOOL)flag
{
_sortsByColumnOrder = flag ? YES : NO;
}
- (EOColumnAssociation *)editingAssociation
{
int editedColumn = [[self object] editedColumn];
if (editedColumn == -1)
{
return nil;
}
else
{
return [[[[self object] tableColumns] objectAtIndex:editedColumn] identifier];
}
}
- (int)numberOfRowsInTableView: (NSTableView *)tableView
{
return [[[self displayGroupForAspect:@"source"] displayedObjects] count];
}
- (void)tableView: (NSTableView *)tableView
setObjectValue: (id)object
forTableColumn: (NSTableColumn *)tableColumn
row: (int)row
{
[(EOColumnAssociation *)[tableColumn identifier]
tableView: tableView
setObjectValue: object
forTableColumn: tableColumn
row: row];
}
- (id)tableView: (NSTableView *)tableView
objectValueForTableColumn: (NSTableColumn *)tableColumn
row: (int)row
{
id object;
object = [[tableColumn identifier] tableView: tableView
objectValueForTableColumn: tableColumn
row: row];
return object;
}
- (BOOL)tableView: (NSTableView *)tableView
shouldEditTableColumn: (NSTableColumn *)tableColumn
row: (int)row
{
if (_enabledAspectBound)
if ([[self valueForAspect: @"enabled" atIndex:row] boolValue] == NO)
return NO;
return [[tableColumn identifier] tableView:tableView shouldEditTableColumn:tableColumn row:row];
}
- (void)tableView: (NSTableView *)tableView
willDisplayCell: (id)cell
forTableColumn: (NSTableColumn *)tableColumn
row: (int)row
{
if (_enabledAspectBound)
[cell setEnabled: [[self valueForAspect:@"enabled" atIndex: row] boolValue]];
/* maybe these should setup an attributed string */
if (_italicAspectBound)
; /* TODO */
if (_boldAspectBound)
; /* TODO */
if (_colorAspectBound)
{
if ([cell respondsToSelector:@selector(setTextColor:)])
[cell setTextColor: [self valueForAspect:@"color" atIndex:row]];
}
}
- (void)tableViewSelectionDidChange: (NSNotification *)notification
{
EODisplayGroup *dg = [self displayGroupForAspect:@"source"];
NSMutableArray *selectionIndices = [[NSMutableArray alloc] init];
NSTableView *tv = [notification object];
NSEnumerator *selectionEnum = [tv selectedRowEnumerator];
id index;
while ((index = [selectionEnum nextObject]))
{
[selectionIndices addObject:index];
}
[dg setSelectionIndexes: AUTORELEASE(selectionIndices)];
}
- (BOOL)control: (NSControl *)control
didFailToFormatString: (NSString *)string
errorDescription: (NSString *)description
{
return [[self editingAssociation]
control: control
didFailToFormatString: string
errorDescription: description];
}
- (BOOL)control: (NSControl *)control
isValidObject: (id)object
{
return [[self editingAssociation] control: control
isValidObject: object];
}
- (BOOL)control: (NSControl *)control
textShouldBeginEditing: (NSText *)fieldEditor
{
return [[self editingAssociation] control: control
textShouldBeginEditing: fieldEditor];
}
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
{
[[self displayGroupForAspect:@"source"] endEditing];
}
- (void) dealloc
{
[super dealloc];
}
@end