Menu reference handlin patch and further keyed archiving.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@18547 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Fred Kiefer 2004-02-06 00:16:54 +00:00
parent 4e1f4489e3
commit 93b7e7acf8
9 changed files with 220 additions and 175 deletions

View file

@ -1,3 +1,17 @@
2004-02-06 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSMenu.m (-dealloc) Clean up pointer from items to menu.
* Source/NSMenuView.m (-update) Removed the setting of the menu
for the title view. Patch by Quentin Mathé
(gnustep-quentin@club-internet.fr)
* Source/NSActionCell.m
* Source/NSComboBoxCell.m
* Source/NSTableColumn.m
* Source/NSTableView.m
* Source/NSTextField.m
* Source/NSTextFieldCell.m
Added keyed decoding.
2004-02-05 21:04 Alexander Malmberg <alexander@malmberg.org>
* Source/GSTitleView.m: Fix declarations after statements.

View file

@ -325,14 +325,22 @@ static Class controlClass;
- (id) initWithCoder: (NSCoder*)aDecoder
{
id dummy;
self = [super initWithCoder: aDecoder];
[aDecoder decodeValueOfObjCType: @encode(int) at: &_tag];
_target = [aDecoder decodeObject];
[aDecoder decodeValueOfObjCType: @encode(SEL) at: &_action];
// Don't decode _control_view, as this may no longer be valid.
dummy = [aDecoder decodeObject];
if ([aDecoder allowsKeyedCoding])
{
}
else
{
id dummy;
[aDecoder decodeValueOfObjCType: @encode(int) at: &_tag];
_target = [aDecoder decodeObject];
[aDecoder decodeValueOfObjCType: @encode(SEL) at: &_action];
// Don't decode _control_view, as this may no longer be valid.
dummy = [aDecoder decodeObject];
}
return self;
}

View file

@ -940,27 +940,48 @@ buttonCellFrameFromRect(NSRect cellRect)
[coder encodeConditionalObject: _dataSource];
}
- (id) initWithCoder: (NSCoder *)coder
- (id) initWithCoder: (NSCoder *)aDecoder
{
BOOL dummy;
self = [super initWithCoder: aDecoder];
self = [super initWithCoder: coder];
[coder decodeValueOfObjCType: @encode(id) at: &_buttonCell];
RETAIN(_buttonCell);
[coder decodeValueOfObjCType: @encode(id) at: &_popUpList];
RETAIN(_popUpList);
[coder decodeValueOfObjCType: @encode(BOOL) at: &_usesDataSource];
[coder decodeValueOfObjCType: @encode(BOOL) at: &_hasVerticalScroller];
[coder decodeValueOfObjCType: @encode(BOOL) at: &_completes];
[coder decodeValueOfObjCType: @encode(BOOL) at: &dummy];
[coder decodeValueOfObjCType: @encode(int) at: &_visibleItems];
[coder decodeValueOfObjCType: @encode(NSSize) at: &_intercellSpacing];
[coder decodeValueOfObjCType: @encode(float) at: &_itemHeight];
[coder decodeValueOfObjCType: @encode(int) at: &_selectedItem];
if ([aDecoder allowsKeyedCoding])
{
//id delegate = [aDecoder decodeObjectForKey: @"NSDelegate"];
// FIXME: This does not match the way GNUstep currently implements
// the list of popup items.
//id table = [aDecoder decodeObjectForKey: @"NSTableView"];
if (_usesDataSource == YES)
[self setDataSource: [coder decodeObject]];
if ([aDecoder containsValueForKey: @"NSHasVerticalScroller"])
{
[self setHasVerticalScroller: [aDecoder decodeBoolForKey:
@"NSHasVerticalScroller"]];
}
if ([aDecoder containsValueForKey: @"NSVisibleItemCount"])
{
[self setNumberOfVisibleItems: [aDecoder decodeIntForKey:
@"NSVisibleItemCount"]];
}
}
else
{
BOOL dummy;
[aDecoder decodeValueOfObjCType: @encode(id) at: &_buttonCell];
RETAIN(_buttonCell);
[aDecoder decodeValueOfObjCType: @encode(id) at: &_popUpList];
RETAIN(_popUpList);
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_usesDataSource];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_hasVerticalScroller];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_completes];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &dummy];
[aDecoder decodeValueOfObjCType: @encode(int) at: &_visibleItems];
[aDecoder decodeValueOfObjCType: @encode(NSSize) at: &_intercellSpacing];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_itemHeight];
[aDecoder decodeValueOfObjCType: @encode(int) at: &_selectedItem];
if (_usesDataSource == YES)
[self setDataSource: [aDecoder decodeObject]];
}
return self;
}

View file

@ -294,6 +294,9 @@ static NSNotificationCenter *nc;
{
[nc removeObserver: self];
// Now clean the pointer to us stored each _items element
[_items makeObjectsPerformSelector: @selector(setMenu:) withObject: nil];
RELEASE(_notifications);
RELEASE(_title);
RELEASE(_items);
@ -393,7 +396,10 @@ static NSNotificationCenter *nc;
* isn't added.
*/
if ([newItem menu] != nil)
return;
{
NSLog(@"The object %@ is already attached to a menu, then it isn't possible to add it.\n", newItem);
return;
}
[_items insertObject: newItem atIndex: index];
_needsSizing = YES;

View file

@ -473,11 +473,6 @@ _addLeftBorderOffsetToRect(NSRect aRect)
[_titleView removeFromSuperview];
_titleView = nil;
}
if ((_titleView != nil) && ([_titleView menu] == nil))
{
[_titleView setMenu: _attachedMenu];
}
// Resize it anyway.
[self sizeToFit];

View file

@ -384,39 +384,66 @@
- (id) initWithCoder: (NSCoder*)aDecoder
{
int version = [aDecoder versionForClassName:
@"NSTableColumn"];
if (version == 2)
if ([aDecoder allowsKeyedCoding])
{
self = [super init];
_identifier = RETAIN([aDecoder decodeObject]);
id identifier = [aDecoder decodeObjectForKey: @"NSIdentifier"];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_width];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_min_width];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_max_width];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_is_resizable];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_is_editable];
_headerCell = RETAIN([aDecoder decodeObject]);
_dataCell = RETAIN([aDecoder decodeObject]);
return self;
self = [self initWithIdentifier: identifier];
if ([aDecoder containsValueForKey: @"NSDataCell"])
{
[self setDataCell: [aDecoder decodeObjectForKey: @"NSDataCell"]];
}
if ([aDecoder containsValueForKey: @"NSHeaderCell"])
{
[self setHeaderCell: [aDecoder decodeObjectForKey: @"NSHeaderCell"]];
}
if ([aDecoder containsValueForKey: @"NSIsResizeable"])
{
[self setResizable: [aDecoder decodeBoolForKey: @"NSIsResizeable"]];
}
if ([aDecoder containsValueForKey: @"NSWidth"])
{
[self setWidth: [aDecoder decodeFloatForKey: @"NSWidth"]];
}
if ([aDecoder containsValueForKey: @"NSMinWidth"])
{
[self setMinWidth: [aDecoder decodeFloatForKey: @"NSMinWidth"]];
}
if ([aDecoder containsValueForKey: @"NSMaxWidth"])
{
[self setMaxWidth: [aDecoder decodeFloatForKey: @"NSMaxWidth"]];
}
}
else
{
int version = [aDecoder versionForClassName:
@"NSTableColumn"];
self = [super init];
_identifier = RETAIN([aDecoder decodeObject]);
_headerCell = RETAIN([aDecoder decodeObject]);
_dataCell = RETAIN([aDecoder decodeObject]);
[aDecoder decodeValueOfObjCType: @encode(float) at: &_width];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_min_width];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_max_width];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_is_resizable];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_is_editable];
return self;
if (version == 2)
{
_identifier = RETAIN([aDecoder decodeObject]);
[aDecoder decodeValueOfObjCType: @encode(float) at: &_width];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_min_width];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_max_width];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_is_resizable];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_is_editable];
_headerCell = RETAIN([aDecoder decodeObject]);
_dataCell = RETAIN([aDecoder decodeObject]);
}
else
{
_identifier = RETAIN([aDecoder decodeObject]);
_headerCell = RETAIN([aDecoder decodeObject]);
_dataCell = RETAIN([aDecoder decodeObject]);
[aDecoder decodeValueOfObjCType: @encode(float) at: &_width];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_min_width];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_max_width];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_is_resizable];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_is_editable];
}
}
return self;
}
@end

View file

@ -5939,15 +5939,65 @@ byExtendingSelection: (BOOL)flag
- (id) initWithCoder: (NSCoder*)aDecoder
{
int version = [aDecoder versionForClassName:
@"NSTableView"];
self = [super initWithCoder: aDecoder];
id aDelegate;
if (version == currentVersion)
if ([aDecoder allowsKeyedCoding])
{
self = [super initWithCoder: aDecoder];
NSSize intercellSpacing = [self intercellSpacing];
NSArray *columns;
NSEnumerator *e;
NSTableColumn *col;
[self setDataSource: [aDecoder decodeObjectForKey: @"NSDataSource"]];
[self setDelegate: [aDecoder decodeObjectForKey: @"NSDelegate"]];
[self setTarget: [aDecoder decodeObjectForKey: @"NSTarget"]];
if ([aDecoder containsValueForKey: @"NSAction"])
{
NSString *action = [aDecoder decodeObjectForKey: @"NSAction"];
[self setAction: NSSelectorFromString(action)];
}
if ([aDecoder containsValueForKey: @"NSBackgroundColor"])
{
[self setBackgroundColor: [aDecoder decodeObjectForKey: @"NSBackgroundColor"]];
}
if ([aDecoder containsValueForKey: @"NSGridColor"])
{
[self setGridColor: [aDecoder decodeObjectForKey: @"NSGridColor"]];
}
if ([aDecoder containsValueForKey: @"NSIntercellSpacingHeight"])
{
intercellSpacing.height = [aDecoder decodeFloatForKey: @"NSIntercellSpacingHeight"];
}
if ([aDecoder containsValueForKey: @"NSIntercellSpacingWidth"])
{
intercellSpacing.width = [aDecoder decodeFloatForKey: @"NSIntercellSpacingWidth"];
}
[self setIntercellSpacing: intercellSpacing];
if ([aDecoder containsValueForKey: @"NSRowHeight"])
{
[self setRowHeight: [aDecoder decodeFloatForKey: @"NSRowHeight"]];
}
columns = [aDecoder decodeObjectForKey: @"NSTableColumns"];
e = [columns objectEnumerator];
while ((col = [e nextObject]) != nil)
{
[self addTableColumn: col];
}
if ([aDecoder containsValueForKey: @"NSTvFlags"])
{
//int vFlags = [aDecoder decodeIntForKey: @"NSTvFlags"];
// FIXME set the flags
}
}
else
{
int version = [aDecoder versionForClassName:
@"NSTableView"];
id aDelegate;
_dataSource = [aDecoder decodeObject];
_tableColumns = RETAIN([aDecoder decodeObject]);
_gridColor = RETAIN([aDecoder decodeObject]);
@ -5961,11 +6011,8 @@ byExtendingSelection: (BOOL)flag
[_headerView setTableView: self];
[_tableColumns makeObjectsPerformSelector: @selector(setTableView:)
withObject: self];
[aDecoder decodeValueOfObjCType: @encode(int) at: &_numberOfRows];
[aDecoder decodeValueOfObjCType: @encode(int) at: &_numberOfColumns];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_drawsGrid];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_rowHeight];
[aDecoder decodeValueOfObjCType: @encode(SEL) at: &_doubleAction];
@ -5975,8 +6022,14 @@ byExtendingSelection: (BOOL)flag
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsEmptySelection];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsColumnSelection];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsColumnResizing];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsColumnReordering];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_autoresizesAllColumnsToFit];
if (version == currentVersion)
{
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsColumnReordering];
}
else if (version >= 2)
{
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_autoresizesAllColumnsToFit];
}
ASSIGN (_selectedColumns, [NSMutableArray array]);
ASSIGN (_selectedRows, [NSMutableArray array]);
@ -5992,111 +6045,21 @@ byExtendingSelection: (BOOL)flag
_editedColumn = -1;
_editedRow = -1;
/*
[self tile];
NSLog(@"frame %@", NSStringFromRect([self frame]));
NSLog(@"dataSource %@", _dataSource);
if (_dataSource != nil)
{
[self setDataSource: _dataSource];
NSLog(@"dataSource set");
if (version == 2)
{
[self tile];
}
/*
NSLog(@"frame %@", NSStringFromRect([self frame]));
NSLog(@"dataSource %@", _dataSource);
if (_dataSource != nil)
{
[self setDataSource: _dataSource];
NSLog(@"dataSource set");
}
*/
}
else if (version == 2)
{
self = [super initWithCoder: aDecoder];
_dataSource = [aDecoder decodeObject];
_tableColumns = RETAIN([aDecoder decodeObject]);
_gridColor = RETAIN([aDecoder decodeObject]);
_backgroundColor = RETAIN([aDecoder decodeObject]);
_headerView = RETAIN([aDecoder decodeObject]);
_cornerView = RETAIN([aDecoder decodeObject]);
aDelegate = [aDecoder decodeObject];
_target = [aDecoder decodeObject];
[self setDelegate: aDelegate];
[_headerView setTableView: self];
[_tableColumns makeObjectsPerformSelector: @selector(setTableView:)
withObject: self];
[aDecoder decodeValueOfObjCType: @encode(int) at: &_numberOfRows];
[aDecoder decodeValueOfObjCType: @encode(int) at: &_numberOfColumns];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_drawsGrid];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_rowHeight];
[aDecoder decodeValueOfObjCType: @encode(SEL) at: &_doubleAction];
_intercellSpacing = [aDecoder decodeSize];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsMultipleSelection];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsEmptySelection];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsColumnSelection];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsColumnResizing];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_autoresizesAllColumnsToFit];
ASSIGN (_selectedColumns, [NSMutableArray array]);
ASSIGN (_selectedRows, [NSMutableArray array]);
if (_numberOfColumns)
_columnOrigins = NSZoneMalloc (NSDefaultMallocZone (),
sizeof(float) * _numberOfColumns);
_clickedRow = -1;
_clickedColumn = -1;
_selectingColumns = NO;
_selectedColumn = -1;
_selectedRow = -1;
_editedColumn = -1;
_editedRow = -1;
[self tile];
}
else if (version == 1)
{
self = [super initWithCoder: aDecoder];
_dataSource = [aDecoder decodeObject];
_tableColumns = RETAIN([aDecoder decodeObject]);
_gridColor = RETAIN([aDecoder decodeObject]);
_backgroundColor = RETAIN([aDecoder decodeObject]);
_headerView = RETAIN([aDecoder decodeObject]);
_cornerView = RETAIN([aDecoder decodeObject]);
aDelegate = [aDecoder decodeObject];
_target = [aDecoder decodeObject];
[self setDelegate: aDelegate];
[_headerView setTableView: self];
[_tableColumns makeObjectsPerformSelector: @selector(setTableView:)
withObject: self];
[aDecoder decodeValueOfObjCType: @encode(int) at: &_numberOfRows];
[aDecoder decodeValueOfObjCType: @encode(int) at: &_numberOfColumns];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_drawsGrid];
[aDecoder decodeValueOfObjCType: @encode(float) at: &_rowHeight];
[aDecoder decodeValueOfObjCType: @encode(SEL) at: &_doubleAction];
_intercellSpacing = [aDecoder decodeSize];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsMultipleSelection];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsEmptySelection];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsColumnSelection];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsColumnResizing];
ASSIGN (_selectedColumns, [NSMutableArray array]);
ASSIGN (_selectedRows, [NSMutableArray array]);
if (_numberOfColumns)
_columnOrigins = NSZoneMalloc (NSDefaultMallocZone (),
sizeof(float) * _numberOfColumns);
_clickedRow = -1;
_clickedColumn = -1;
_selectingColumns = NO;
_selectedColumn = -1;
_selectedRow = -1;
_editedColumn = -1;
_editedRow = -1;
}
return self;
}

View file

@ -631,10 +631,16 @@ static Class textFieldCellClass;
- (id) initWithCoder: (NSCoder*)aDecoder
{
[super initWithCoder: aDecoder];
self = [super initWithCoder: aDecoder];
[self setDelegate: [aDecoder decodeObject]];
[aDecoder decodeValueOfObjCType: @encode(SEL) at: &_error_action];
if ([aDecoder allowsKeyedCoding])
{
}
else
{
[self setDelegate: [aDecoder decodeObject]];
[aDecoder decodeValueOfObjCType: @encode(SEL) at: &_error_action];
}
_text_object = nil;
return self;

View file

@ -198,12 +198,17 @@ static NSColor *txtCol;
- (id) initWithCoder: (NSCoder*)aDecoder
{
[super initWithCoder: aDecoder];
self = [super initWithCoder: aDecoder];
if ([aDecoder allowsKeyedCoding])
{
[self setBackgroundColor: [aDecoder decodeObjectForKey: @"NSBackgroundColor"]];
[self setTextColor: [aDecoder decodeObjectForKey: @"NSTextColor"]];
if ([aDecoder containsValueForKey: @"NSDrawsBackground"])
{
[self setDrawsBackground: [aDecoder decodeBoolForKey:
@"NSDrawsBackground"]];
}
}
else
{