diff --git a/ChangeLog b/ChangeLog index fe2ae9bd8..25b509223 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-01-08 22:35-EST Gregory John Casamento + + * Headers/AppKit/NSSegmentedCell.h: Added rect ivar to cache frame. + * Source/NSBundleAdditions.m: Minor formatting changes. + * Source/NSController.m: Added ivars to encodeWithCoder:. + * Source/NSNibBindingConnector.m: Added ivars to encodeWithCoder:. + * Source/NSSegmentedCell.m: Changes to fully implement rendering + of the cell. + * Source/NSSegmentedControl.m: Changes to fully implement + control. + 2008-01-08 09:42-EST Gregory John Casamento * Source/NSSegmentedCell.m: Code to draw and render text in diff --git a/Headers/AppKit/NSSegmentedCell.h b/Headers/AppKit/NSSegmentedCell.h index 31030d133..4a4bf1236 100644 --- a/Headers/AppKit/NSSegmentedCell.h +++ b/Headers/AppKit/NSSegmentedCell.h @@ -56,6 +56,7 @@ typedef enum { unsigned int _recalcToolTips:1; unsigned int unused:24; } _segmentCellFlags; + int _previous_selection; } // Specifying number of segments... diff --git a/Source/NSBundleAdditions.m b/Source/NSBundleAdditions.m index 97fb2e35b..81cdd901a 100644 --- a/Source/NSBundleAdditions.m +++ b/Source/NSBundleAdditions.m @@ -186,7 +186,7 @@ @implementation NSNibControlConnector - (void) establishConnection { - SEL sel = NSSelectorFromString(_tag); + SEL sel = NSSelectorFromString(_tag); [_src setTarget: _dst]; [_src setAction: sel]; @@ -198,8 +198,8 @@ { if (_src != nil) { - NSString *selName; - SEL sel; + NSString *selName; + SEL sel; selName = [NSString stringWithFormat: @"set%@%@:", [[_tag substringToIndex: 1] uppercaseString], @@ -212,10 +212,10 @@ } else { - const char *nam = [_tag cString]; - const char *type; - unsigned int size; - int offset; + const char *nam = [_tag cString]; + const char *type; + unsigned int size; + int offset; /* * Use the GNUstep additional function to set the instance diff --git a/Source/NSController.m b/Source/NSController.m index f1717583f..30b855e2f 100644 --- a/Source/NSController.m +++ b/Source/NSController.m @@ -53,7 +53,14 @@ - (void) encodeWithCoder: (NSCoder *)aCoder { - // TODO + if([aCoder allowsKeyedCoding]) + { + [aCoder encodeObject: _declared_keys forKey: @"NSDeclaredKeys"]; + } + else + { + [aCoder encodeObject: _declared_keys]; + } } - (id) initWithCoder: (NSCoder *)aDecoder diff --git a/Source/NSNibBindingConnector.m b/Source/NSNibBindingConnector.m index 4e8014354..4d33ebe68 100644 --- a/Source/NSNibBindingConnector.m +++ b/Source/NSNibBindingConnector.m @@ -36,6 +36,17 @@ @implementation NSNibBindingConnector +- (id) init +{ + if((self = [super init]) != nil) + { + _binding = RETAIN([NSString stringWithString: @""]); + _keyPath = RETAIN([NSString stringWithString: @""]); + _options = RETAIN([NSMutableDictionary dictionary]); + } + return self; +} + - (void) dealloc { RELEASE(_binding); @@ -154,9 +165,9 @@ } else { - [aDecoder decodeValueOfObjCType: @encode(id) at: &_binding]; - [aDecoder decodeValueOfObjCType: @encode(id) at: &_keyPath]; - [aDecoder decodeValueOfObjCType: @encode(id) at: &_options]; + ASSIGN(_binding,[aDecoder decodeObject]); + ASSIGN(_keyPath,[aDecoder decodeObject]); + ASSIGN(_options,[aDecoder decodeObject]); } return self; diff --git a/Source/NSSegmentedCell.m b/Source/NSSegmentedCell.m index a91a95475..5d04aa96e 100644 --- a/Source/NSSegmentedCell.m +++ b/Source/NSSegmentedCell.m @@ -33,6 +33,7 @@ #include #include #include +#include @interface NSSegmentItem : NSObject { @@ -44,6 +45,7 @@ NSString *_label; NSString *_tool_tip; NSImage *_image; + NSRect _frame; } - (BOOL) isSelected; @@ -62,6 +64,8 @@ - (void) setTag: (int)tag; - (float) width; - (void) setWidth: (float)width; +- (NSRect) frame; +- (void) setFrame: (NSRect)frame; @end @implementation NSSegmentItem @@ -163,6 +167,16 @@ _width = width; } +- (NSRect) frame +{ + return _frame; +} + +- (void) setFrame: (NSRect)frame +{ + _frame = frame; +} + - (void) encodeWithCoder:(NSCoder *) aCoder { if ([aCoder allowsKeyedCoding]) @@ -245,6 +259,7 @@ _items = [[NSMutableArray alloc] initWithCapacity: 2]; _selected_segment = -1; + _previous_selection = -1; [self setAlignment: NSCenterTextAlignment]; return self; @@ -258,6 +273,7 @@ _items = [[NSMutableArray alloc] initWithCapacity: 2]; _selected_segment = -1; + _previous_selection = -1; [self setAlignment: NSCenterTextAlignment]; return self; @@ -319,12 +335,27 @@ - (void) setSelected: (BOOL)flag forSegment: (int)seg { NSSegmentItem *segment = [_items objectAtIndex: seg]; + NSSegmentItem *previous = nil; - [segment setSelected: flag]; - if (flag) - _selected_segment = seg; - else if (seg == _selected_segment) - _selected_segment = -1; + if(_selected_segment != -1) + { + _previous_selection = _selected_segment; + previous = [_items objectAtIndex: _previous_selection]; + [previous setSelected: NO]; + } + + if([segment isEnabled]) + { + [segment setSelected: flag]; + if (flag) + { + _selected_segment = seg; + } + else if (seg == _selected_segment) + { + _selected_segment = -1; + } + } } - (int) selectedSegment @@ -501,6 +532,7 @@ textFrame.origin.x += x_offset; textFrame.size.width -= x_offset; + [segment setFrame: frame]; if([segment isSelected]) { @@ -567,6 +599,7 @@ ASSIGN(_items, [aDecoder decodeObjectForKey: @"NSSegmentImages"]); if ([aDecoder containsValueForKey: @"NSSelectedSegment"]) _selected_segment = [aDecoder decodeIntForKey: @"NSSelectedSegment"]; + _previous_selection = -1; } else { @@ -576,4 +609,32 @@ return self; } +- (void) _detectHit: (NSPoint)point +{ + int count = [self segmentCount]; + int i = 0; + + for(i = 0; i < count; i++) + { + id segment = [_items objectAtIndex: i]; + NSRect frame = [segment frame]; + if(NSPointInRect(point,frame)) + { + [self setSelectedSegment: i]; + break; + } + } +} + +- (void) stopTracking: (NSPoint)lastPoint + at: (NSPoint)stopPoint + inView: (NSView*)controlView + mouseIsUp: (BOOL)flag +{ + [super stopTracking: lastPoint + at: stopPoint + inView: controlView + mouseIsUp: (BOOL)flag]; + [self _detectHit: lastPoint]; +} @end diff --git a/Source/NSSegmentedControl.m b/Source/NSSegmentedControl.m index 067e013f2..12f4251ad 100644 --- a/Source/NSSegmentedControl.m +++ b/Source/NSSegmentedControl.m @@ -25,6 +25,7 @@ #include #include +#include @implementation NSSegmentedControl @@ -115,4 +116,16 @@ { return [_cell isEnabledForSegment: segment]; } + +/* +- (void) mouseDown: (NSEvent *)event +{ + NSPoint location = [self convertPoint: [event locationInWindow] + fromView: nil]; + + [super mouseDown: event]; + [_cell _detectHit: location]; + NSLog(@"%@",NSStringFromPoint(location)); +} +*/ @end