2008-01-07 14:33:58 +00:00
|
|
|
/* NSSegmentedCell.m
|
|
|
|
*
|
|
|
|
* Copyright (C) 2007 Free Software Foundation, Inc.
|
|
|
|
*
|
2015-06-27 04:00:05 +00:00
|
|
|
* Author: Gregory John Casamento <greg.casamento@gmail.com>
|
2008-01-07 14:33:58 +00:00
|
|
|
* Date: 2007
|
|
|
|
*
|
|
|
|
* This file is part of GNUstep.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
2020-03-17 04:23:04 +00:00
|
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
2008-06-10 04:01:49 +00:00
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
2008-01-07 14:33:58 +00:00
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program 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
|
2020-03-17 04:23:04 +00:00
|
|
|
* GNU Lesser General Public License for more details.
|
2008-01-07 14:33:58 +00:00
|
|
|
*
|
2020-03-17 04:23:04 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
2008-01-07 14:33:58 +00:00
|
|
|
* along with this program; if not, write to the Free Software
|
2019-12-09 23:45:15 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110
|
2008-01-07 14:33:58 +00:00
|
|
|
* USA.
|
|
|
|
*/
|
|
|
|
|
2011-03-04 11:33:22 +00:00
|
|
|
#import <Foundation/NSArray.h>
|
|
|
|
#import <Foundation/NSEnumerator.h>
|
|
|
|
#import <Foundation/NSException.h>
|
|
|
|
#import "AppKit/NSColor.h"
|
|
|
|
#import "AppKit/NSEvent.h"
|
|
|
|
#import "AppKit/NSFont.h"
|
|
|
|
#import "AppKit/NSGraphics.h"
|
|
|
|
#import "AppKit/NSImage.h"
|
|
|
|
#import "AppKit/NSMenu.h"
|
|
|
|
#import "AppKit/NSSegmentedCell.h"
|
|
|
|
#import "AppKit/NSStringDrawing.h"
|
|
|
|
#import "GNUstepGUI/GSTheme.h"
|
2008-01-07 14:33:58 +00:00
|
|
|
|
|
|
|
@interface NSSegmentItem : NSObject
|
|
|
|
{
|
|
|
|
BOOL _selected;
|
|
|
|
BOOL _enabled;
|
2010-03-23 21:26:24 +00:00
|
|
|
NSInteger _tag;
|
2013-02-16 00:08:33 +00:00
|
|
|
CGFloat _width;
|
2008-01-07 14:33:58 +00:00
|
|
|
NSMenu *_menu;
|
|
|
|
NSString *_label;
|
|
|
|
NSString *_tool_tip;
|
|
|
|
NSImage *_image;
|
2008-01-09 03:37:59 +00:00
|
|
|
NSRect _frame;
|
2008-01-07 14:33:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL) isSelected;
|
|
|
|
- (void) setSelected: (BOOL)flag;
|
2011-07-23 13:43:33 +00:00
|
|
|
- (BOOL) isEnabled;
|
|
|
|
- (void) setEnabled: (BOOL)flag;
|
2008-01-07 14:33:58 +00:00
|
|
|
- (NSMenu *) menu;
|
|
|
|
- (void) setMenu: (NSMenu *)menu;
|
|
|
|
- (NSString *) label;
|
|
|
|
- (void) setLabel: (NSString *)label;
|
|
|
|
- (NSString *) toolTip;
|
|
|
|
- (void) setToolTip: (NSString *)toolTip;
|
|
|
|
- (NSImage *) image;
|
|
|
|
- (void) setImage: (NSImage *)image;
|
2010-03-23 21:26:24 +00:00
|
|
|
- (NSInteger) tag;
|
|
|
|
- (void) setTag: (NSInteger)tag;
|
2013-02-16 00:08:33 +00:00
|
|
|
- (CGFloat) width;
|
|
|
|
- (void) setWidth: (CGFloat)width;
|
2008-01-09 03:37:59 +00:00
|
|
|
- (NSRect) frame;
|
|
|
|
- (void) setFrame: (NSRect)frame;
|
2008-01-07 14:33:58 +00:00
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation NSSegmentItem
|
2008-01-07 17:22:49 +00:00
|
|
|
|
|
|
|
- (id) init
|
|
|
|
{
|
|
|
|
self = [super init];
|
2011-03-14 22:59:20 +00:00
|
|
|
if (nil == self)
|
|
|
|
return nil;
|
|
|
|
|
2010-01-29 03:19:36 +00:00
|
|
|
_enabled = YES;
|
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) dealloc
|
|
|
|
{
|
|
|
|
TEST_RELEASE(_label);
|
|
|
|
TEST_RELEASE(_image);
|
|
|
|
TEST_RELEASE(_menu);
|
|
|
|
TEST_RELEASE(_tool_tip);
|
|
|
|
|
|
|
|
[super dealloc];
|
|
|
|
}
|
|
|
|
|
2008-01-07 14:33:58 +00:00
|
|
|
- (BOOL) isSelected
|
|
|
|
{
|
|
|
|
return _selected;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) setSelected: (BOOL)flag
|
|
|
|
{
|
|
|
|
_selected = flag;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL) isEnabled
|
|
|
|
{
|
|
|
|
return _enabled;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) setEnabled: (BOOL)flag
|
|
|
|
{
|
|
|
|
_enabled = flag;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSMenu *) menu
|
|
|
|
{
|
|
|
|
return _menu;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) setMenu: (NSMenu *)menu
|
|
|
|
{
|
2008-01-07 17:22:49 +00:00
|
|
|
ASSIGN(_menu, menu);
|
2008-01-07 14:33:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (NSString *) label
|
|
|
|
{
|
|
|
|
return _label;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) setLabel: (NSString *)label
|
|
|
|
{
|
|
|
|
ASSIGN(_label, label);
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSString *) toolTip
|
|
|
|
{
|
|
|
|
return _tool_tip;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) setToolTip: (NSString *)toolTip
|
|
|
|
{
|
|
|
|
ASSIGN(_tool_tip, toolTip);
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSImage *) image
|
|
|
|
{
|
|
|
|
return _image;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) setImage: (NSImage *)image
|
|
|
|
{
|
|
|
|
ASSIGN(_image, image);
|
|
|
|
}
|
|
|
|
|
2010-03-23 21:26:24 +00:00
|
|
|
- (NSInteger) tag
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
return _tag;
|
|
|
|
}
|
|
|
|
|
2010-03-23 21:26:24 +00:00
|
|
|
- (void) setTag: (NSInteger)tag
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
_tag = tag;
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (CGFloat) width
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
return _width;
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setWidth: (CGFloat)width
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
_width = width;
|
|
|
|
}
|
2008-01-07 17:22:49 +00:00
|
|
|
|
2008-01-09 03:37:59 +00:00
|
|
|
- (NSRect) frame
|
|
|
|
{
|
|
|
|
return _frame;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) setFrame: (NSRect)frame
|
|
|
|
{
|
|
|
|
_frame = frame;
|
|
|
|
}
|
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
- (void) encodeWithCoder:(NSCoder *) aCoder
|
|
|
|
{
|
|
|
|
if ([aCoder allowsKeyedCoding])
|
|
|
|
{
|
|
|
|
if (_label != nil)
|
|
|
|
[aCoder encodeObject: _label forKey: @"NSSegmentItemLabel"];
|
|
|
|
if (_image != nil)
|
|
|
|
[aCoder encodeObject: _image forKey: @"NSSegmentItemImage"];
|
|
|
|
if (_menu != nil)
|
|
|
|
[aCoder encodeObject: _menu forKey: @"NSSegmentItemMenu"];
|
|
|
|
if (_enabled)
|
|
|
|
[aCoder encodeBool: YES forKey: @"NSSegmentItemEnabled"];
|
|
|
|
else
|
|
|
|
[aCoder encodeBool: YES forKey: @"NSSegmentItemDisabled"];
|
|
|
|
if (_selected)
|
|
|
|
[aCoder encodeBool: YES forKey: @"NSSegmentItemSelected"];
|
|
|
|
if (_width != 0.0)
|
|
|
|
[aCoder encodeFloat: _width forKey: @"NSSegmentItemWidth"];
|
|
|
|
if (_tag != 0)
|
|
|
|
[aCoder encodeInt: _tag forKey: @"NSSegmentItemTag"];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2008-01-08 14:43:12 +00:00
|
|
|
[aCoder encodeObject: _label];
|
|
|
|
[aCoder encodeObject: _image];
|
|
|
|
[aCoder encodeObject: _menu];
|
|
|
|
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &_enabled];
|
|
|
|
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &_selected];
|
2013-02-17 16:53:48 +00:00
|
|
|
[aCoder encodeValueOfObjCType: @encode(CGFloat) at: &_width];
|
|
|
|
[aCoder encodeValueOfObjCType: @encode(NSInteger) at: &_tag];
|
2008-01-07 17:22:49 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (id) initWithCoder: (NSCoder *)aDecoder
|
|
|
|
{
|
2008-01-08 14:43:12 +00:00
|
|
|
if ([aDecoder allowsKeyedCoding])
|
2008-01-07 17:22:49 +00:00
|
|
|
{
|
|
|
|
if ([aDecoder containsValueForKey: @"NSSegmentItemLabel"])
|
|
|
|
[self setLabel: [aDecoder decodeObjectForKey: @"NSSegmentItemLabel"]];
|
|
|
|
if ([aDecoder containsValueForKey: @"NSSegmentItemImage"])
|
|
|
|
[self setImage: [aDecoder decodeObjectForKey: @"NSSegmentItemImage"]];
|
|
|
|
if ([aDecoder containsValueForKey: @"NSSegmentItemMenu"])
|
|
|
|
[self setMenu: [aDecoder decodeObjectForKey: @"NSSegmentItemMenu"]];
|
|
|
|
if ([aDecoder containsValueForKey: @"NSSegmentItemEnabled"])
|
|
|
|
_enabled = [aDecoder decodeBoolForKey: @"NSSegmentItemEnabled"];
|
|
|
|
else if ([aDecoder containsValueForKey: @"NSSegmentItemDisabled"])
|
|
|
|
_enabled = ![aDecoder decodeBoolForKey: @"NSSegmentItemDisabled"];
|
|
|
|
else
|
|
|
|
_enabled = YES;
|
|
|
|
if ([aDecoder containsValueForKey: @"NSSegmentItemSelected"])
|
|
|
|
_selected = [aDecoder decodeBoolForKey: @"NSSegmentItemSelected"];
|
|
|
|
if ([aDecoder containsValueForKey: @"NSSegmentItemWidth"])
|
|
|
|
_width = [aDecoder decodeFloatForKey: @"NSSegmentItemWidth"];
|
|
|
|
if ([aDecoder containsValueForKey: @"NSSegmentItemTag"])
|
2008-01-08 14:43:12 +00:00
|
|
|
_tag = [aDecoder decodeIntForKey: @"NSSegmentItemTag"];
|
2008-01-07 17:22:49 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2008-01-08 14:43:12 +00:00
|
|
|
ASSIGN(_label,[aDecoder decodeObject]);
|
|
|
|
ASSIGN(_image,[aDecoder decodeObject]);
|
|
|
|
ASSIGN(_menu, [aDecoder decodeObject]);
|
|
|
|
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_enabled];
|
|
|
|
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_selected];
|
2013-02-17 16:53:48 +00:00
|
|
|
[aDecoder decodeValueOfObjCType: @encode(CGFloat) at: &_width];
|
|
|
|
[aDecoder decodeValueOfObjCType: @encode(NSInteger) at: &_tag];
|
2008-01-07 17:22:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2008-01-07 14:33:58 +00:00
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation NSSegmentedCell
|
|
|
|
|
2008-02-17 01:45:17 +00:00
|
|
|
- (id) init
|
|
|
|
{
|
|
|
|
self = [super initTextCell: @""];
|
|
|
|
if (!self)
|
|
|
|
return nil;
|
|
|
|
|
|
|
|
_segmentCellFlags._tracking_mode = NSSegmentSwitchTrackingSelectOne;
|
|
|
|
_items = [[NSMutableArray alloc] initWithCapacity: 2];
|
|
|
|
_selected_segment = -1;
|
|
|
|
[self setAlignment: NSCenterTextAlignment];
|
|
|
|
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
- (id) initImageCell: (NSImage*)anImage
|
|
|
|
{
|
|
|
|
self = [super initImageCell: anImage];
|
|
|
|
if (!self)
|
|
|
|
return nil;
|
2008-01-08 14:43:12 +00:00
|
|
|
|
2008-02-17 01:45:17 +00:00
|
|
|
_segmentCellFlags._tracking_mode = NSSegmentSwitchTrackingSelectOne;
|
2008-01-07 17:22:49 +00:00
|
|
|
_items = [[NSMutableArray alloc] initWithCapacity: 2];
|
|
|
|
_selected_segment = -1;
|
2008-01-08 14:43:12 +00:00
|
|
|
[self setAlignment: NSCenterTextAlignment];
|
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (id) initTextCell: (NSString*)aString
|
|
|
|
{
|
|
|
|
self = [super initTextCell: aString];
|
|
|
|
if (!self)
|
|
|
|
return nil;
|
2008-01-08 14:43:12 +00:00
|
|
|
|
2008-02-17 01:45:17 +00:00
|
|
|
_segmentCellFlags._tracking_mode = NSSegmentSwitchTrackingSelectOne;
|
2008-01-07 17:22:49 +00:00
|
|
|
_items = [[NSMutableArray alloc] initWithCapacity: 2];
|
|
|
|
_selected_segment = -1;
|
2008-01-08 14:43:12 +00:00
|
|
|
[self setAlignment: NSCenterTextAlignment];
|
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2023-11-20 21:43:49 +00:00
|
|
|
- (id) copyWithZone: (NSZone *)zone
|
2008-01-07 17:22:49 +00:00
|
|
|
{
|
|
|
|
NSSegmentedCell *c = (NSSegmentedCell *)[super copyWithZone: zone];
|
2008-01-08 14:43:12 +00:00
|
|
|
|
|
|
|
if (c)
|
|
|
|
{
|
2008-01-07 17:22:49 +00:00
|
|
|
// FIXME: Need a deep copy here
|
|
|
|
c->_items = [_items copyWithZone: zone];
|
|
|
|
}
|
2008-01-08 14:43:12 +00:00
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) dealloc
|
|
|
|
{
|
|
|
|
TEST_RELEASE(_items);
|
|
|
|
[super dealloc];
|
|
|
|
}
|
|
|
|
|
2008-01-07 14:33:58 +00:00
|
|
|
// Specifying number of segments...
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setSegmentCount: (NSInteger)count
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
2013-02-16 00:08:33 +00:00
|
|
|
NSInteger size;
|
2008-01-07 17:22:49 +00:00
|
|
|
|
|
|
|
if ((count < 0) || (count > 2048))
|
|
|
|
{
|
|
|
|
[NSException raise: NSRangeException
|
|
|
|
format: @"Illegal segment count."];
|
|
|
|
}
|
2008-01-08 14:43:12 +00:00
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
size = [_items count];
|
2008-01-08 14:43:12 +00:00
|
|
|
if (count < size)
|
|
|
|
[_items removeObjectsInRange: NSMakeRange(count, size - count)];
|
|
|
|
|
|
|
|
while (count-- > size)
|
|
|
|
{
|
2008-01-07 17:22:49 +00:00
|
|
|
NSSegmentItem *item = [[NSSegmentItem alloc] init];
|
|
|
|
[_items addObject: item];
|
|
|
|
RELEASE(item);
|
2008-01-08 14:43:12 +00:00
|
|
|
}
|
2008-01-07 14:33:58 +00:00
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (NSInteger) segmentCount
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
return [_items count];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Specifying selected segment...
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setSelectedSegment: (NSInteger)segment
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
2008-01-07 17:22:49 +00:00
|
|
|
[self setSelected: YES forSegment: segment];
|
2008-01-07 14:33:58 +00:00
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setSelected: (BOOL)flag forSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
NSSegmentItem *segment = [_items objectAtIndex: seg];
|
2008-01-09 03:37:59 +00:00
|
|
|
NSSegmentItem *previous = nil;
|
2008-01-07 17:22:49 +00:00
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
if (_selected_segment != -1)
|
2008-01-09 03:37:59 +00:00
|
|
|
{
|
2008-01-14 14:37:51 +00:00
|
|
|
previous = [_items objectAtIndex: _selected_segment];
|
2008-01-18 19:40:24 +00:00
|
|
|
if(_segmentCellFlags._tracking_mode == NSSegmentSwitchTrackingSelectOne)
|
|
|
|
{
|
|
|
|
[previous setSelected: NO];
|
|
|
|
}
|
2008-01-09 03:37:59 +00:00
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
if ([segment isEnabled])
|
2008-01-09 03:37:59 +00:00
|
|
|
{
|
|
|
|
[segment setSelected: flag];
|
|
|
|
if (flag)
|
2008-01-14 14:19:21 +00:00
|
|
|
{
|
|
|
|
_selected_segment = seg;
|
|
|
|
}
|
2008-01-09 03:37:59 +00:00
|
|
|
else if (seg == _selected_segment)
|
2008-01-14 14:19:21 +00:00
|
|
|
{
|
|
|
|
_selected_segment = -1;
|
|
|
|
}
|
2008-01-09 03:37:59 +00:00
|
|
|
}
|
2008-01-07 14:33:58 +00:00
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (NSInteger) selectedSegment
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
return _selected_segment;
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) selectSegmentWithTag: (NSInteger)tag
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
NSEnumerator *en = [_items objectEnumerator];
|
|
|
|
id o = nil;
|
2013-02-16 00:08:33 +00:00
|
|
|
NSInteger segment = 0;
|
2008-01-07 14:33:58 +00:00
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
while ((o = [en nextObject]) != nil)
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
if([o tag] == tag)
|
2008-01-07 17:22:49 +00:00
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
2008-01-07 14:33:58 +00:00
|
|
|
segment++;
|
|
|
|
}
|
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
[self setSelected: YES forSegment: segment];
|
2008-01-07 14:33:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void) makeNextSegmentKey
|
|
|
|
{
|
2013-02-16 00:08:33 +00:00
|
|
|
NSInteger next;
|
2008-01-07 17:22:49 +00:00
|
|
|
|
|
|
|
if (_selected_segment < [_items count])
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
2008-01-07 17:22:49 +00:00
|
|
|
next = _selected_segment + 1;
|
2008-01-07 14:33:58 +00:00
|
|
|
}
|
2008-01-07 17:22:49 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
next = 0;
|
|
|
|
}
|
|
|
|
[self setSelected: NO forSegment: _selected_segment];
|
|
|
|
[self setSelected: YES forSegment: next];
|
2008-01-07 14:33:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void) makePreviousSegmentKey
|
|
|
|
{
|
2013-02-16 00:08:33 +00:00
|
|
|
NSInteger prev;
|
2008-01-07 17:22:49 +00:00
|
|
|
|
|
|
|
if (_selected_segment > 0)
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
2008-01-07 17:22:49 +00:00
|
|
|
prev = _selected_segment - 1;
|
2008-01-07 14:33:58 +00:00
|
|
|
}
|
2008-01-07 17:22:49 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
prev = 0;
|
|
|
|
}
|
|
|
|
[self setSelected: NO forSegment: _selected_segment];
|
|
|
|
[self setSelected: YES forSegment: prev];
|
2008-01-07 14:33:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Specify tracking mode...
|
|
|
|
- (void) setTrackingMode: (NSSegmentSwitchTracking)mode
|
|
|
|
{
|
|
|
|
_segmentCellFlags._tracking_mode = mode;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSSegmentSwitchTracking) trackingMode
|
|
|
|
{
|
|
|
|
return _segmentCellFlags._tracking_mode;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Working with individual segments...
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setWidth: (CGFloat)width forSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
[segment setWidth: width];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (CGFloat) widthForSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment width];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setImage: (NSImage *)image forSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
[segment setImage: image];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (NSImage *) imageForSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment image];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setLabel: (NSString *)label forSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
[segment setLabel: label];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (NSString *) labelForSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment label];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (BOOL) isSelectedForSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment isSelected];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setEnabled: (BOOL)flag forSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment setEnabled: flag];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (BOOL) isEnabledForSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment isEnabled];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setMenu: (NSMenu *)menu forSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment setMenu: menu];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (NSMenu *) menuForSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment menu];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setToolTip: (NSString *) toolTip forSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment setToolTip: toolTip];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (NSString *) toolTipForSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment toolTip];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setTag: (NSInteger)tag forSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment setTag: tag];
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (NSInteger) tagForSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: seg];
|
|
|
|
return [segment tag];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Drawing custom content
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) drawSegment: (NSInteger)seg
|
2008-01-07 14:33:58 +00:00
|
|
|
inFrame: (NSRect)frame
|
|
|
|
withView: (NSView *)view
|
|
|
|
{
|
2008-01-08 14:43:12 +00:00
|
|
|
id segment = [_items objectAtIndex: seg];
|
2015-09-20 21:16:33 +00:00
|
|
|
NSString *label = [self labelForSegment: seg];
|
|
|
|
NSImage *segmentImage = [self imageForSegment: seg];
|
2008-01-18 19:40:24 +00:00
|
|
|
GSThemeControlState state = GSThemeNormalState;
|
2010-01-29 03:11:43 +00:00
|
|
|
BOOL roundedLeft = NO;
|
|
|
|
BOOL roundedRight = NO;
|
2008-01-18 19:40:24 +00:00
|
|
|
|
2008-01-09 03:37:59 +00:00
|
|
|
[segment setFrame: frame];
|
2008-01-08 14:43:12 +00:00
|
|
|
|
2015-09-20 21:16:33 +00:00
|
|
|
if ([segment isSelected])
|
2008-01-08 14:43:12 +00:00
|
|
|
{
|
2008-01-18 19:40:24 +00:00
|
|
|
state = GSThemeSelectedState;
|
2008-01-08 14:43:12 +00:00
|
|
|
}
|
|
|
|
|
2010-01-29 03:11:43 +00:00
|
|
|
if (seg == 0)
|
2015-09-20 21:16:33 +00:00
|
|
|
{
|
|
|
|
roundedLeft = YES;
|
|
|
|
}
|
2008-01-18 19:40:24 +00:00
|
|
|
|
2010-01-29 03:11:43 +00:00
|
|
|
if (seg == ([_items count] - 1))
|
2015-09-20 21:16:33 +00:00
|
|
|
{
|
|
|
|
roundedRight = YES;
|
|
|
|
}
|
2010-01-29 03:11:43 +00:00
|
|
|
|
|
|
|
[[GSTheme theme] drawSegmentedControlSegment: self
|
|
|
|
withFrame: frame
|
|
|
|
inView: [self controlView]
|
|
|
|
style: [self segmentStyle]
|
|
|
|
state: state
|
|
|
|
roundedLeft: roundedLeft
|
|
|
|
roundedRight: roundedRight];
|
2015-09-20 21:16:33 +00:00
|
|
|
if (label)
|
|
|
|
{
|
|
|
|
NSSize textSize = [label sizeWithAttributes: [self _nonAutoreleasedTypingAttributes]];
|
|
|
|
NSRect textFrame = frame;
|
|
|
|
CGFloat x_offset = (frame.size.width - textSize.width) / 2;
|
|
|
|
|
|
|
|
textFrame.origin.x += x_offset;
|
|
|
|
textFrame.size.width -= x_offset;
|
|
|
|
[self _drawText: label inFrame: textFrame];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (segmentImage)
|
|
|
|
{
|
|
|
|
NSSize size = [segmentImage size];
|
|
|
|
NSPoint position;
|
|
|
|
NSRect destinationRect;
|
|
|
|
|
|
|
|
position.x = MAX(NSMidX(frame) - (size.width/2.), 0.);
|
|
|
|
position.y = MAX(NSMidY(frame) - (size.height/2.), 0.);
|
|
|
|
destinationRect = NSMakeRect(position.x, position.y, size.width, size.height);
|
|
|
|
|
2015-10-18 16:25:53 +00:00
|
|
|
if (nil != view)
|
|
|
|
{
|
|
|
|
destinationRect = [view centerScanRect: destinationRect];
|
|
|
|
}
|
|
|
|
|
2015-09-20 21:16:33 +00:00
|
|
|
[segmentImage drawInRect: destinationRect
|
|
|
|
fromRect: NSZeroRect
|
|
|
|
operation: NSCompositeSourceOver
|
|
|
|
fraction: 1.0];
|
|
|
|
}
|
2008-01-07 14:33:58 +00:00
|
|
|
}
|
2008-01-07 17:22:49 +00:00
|
|
|
|
|
|
|
- (void) drawInteriorWithFrame: (NSRect)cellFrame
|
|
|
|
inView: (NSView*)controlView
|
|
|
|
{
|
2013-02-16 00:08:33 +00:00
|
|
|
NSInteger i;
|
|
|
|
NSUInteger count = [_items count];
|
2008-01-08 14:43:12 +00:00
|
|
|
NSRect frame = cellFrame;
|
|
|
|
NSRect controlFrame = [controlView frame];
|
2008-01-07 17:22:49 +00:00
|
|
|
|
2008-01-08 14:43:12 +00:00
|
|
|
for (i = 0; i < count;i++)
|
|
|
|
{
|
2008-01-07 17:22:49 +00:00
|
|
|
frame.size.width = [[_items objectAtIndex: i] width];
|
2008-01-08 14:43:12 +00:00
|
|
|
if(frame.size.width == 0.0)
|
|
|
|
{
|
|
|
|
frame.size.width = (controlFrame.size.width - frame.origin.x) / (count - i);
|
|
|
|
}
|
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
[self drawSegment: i inFrame: frame withView: controlView];
|
|
|
|
frame.origin.x += frame.size.width;
|
|
|
|
if (frame.origin.x >= cellFrame.size.width)
|
|
|
|
break;
|
2008-01-08 14:43:12 +00:00
|
|
|
}
|
2008-01-07 17:22:49 +00:00
|
|
|
}
|
|
|
|
|
2010-01-29 03:11:43 +00:00
|
|
|
// Setting the style of the segments
|
2013-02-16 00:08:33 +00:00
|
|
|
- (void) setSegmentStyle: (NSSegmentStyle)style
|
2010-01-29 03:11:43 +00:00
|
|
|
{
|
|
|
|
_segmentCellFlags._style = style;
|
|
|
|
}
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
- (NSSegmentStyle) segmentStyle
|
2010-01-29 03:11:43 +00:00
|
|
|
{
|
|
|
|
return _segmentCellFlags._style;
|
|
|
|
}
|
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
- (void) encodeWithCoder: (NSCoder*)aCoder
|
|
|
|
{
|
|
|
|
[super encodeWithCoder: aCoder];
|
|
|
|
|
|
|
|
if ([aCoder allowsKeyedCoding])
|
|
|
|
{
|
|
|
|
[aCoder encodeObject: _items forKey: @"NSSegmentImages"];
|
|
|
|
if (_selected_segment != -1)
|
|
|
|
[aCoder encodeInt: _selected_segment forKey: @"NSSelectedSegment"];
|
2010-01-29 03:11:43 +00:00
|
|
|
[aCoder encodeInt: _segmentCellFlags._style forKey: @"NSSegmentStyle"];
|
2008-01-07 17:22:49 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-01-29 03:11:43 +00:00
|
|
|
int style;
|
2008-01-08 14:43:12 +00:00
|
|
|
[aCoder encodeObject: _items];
|
2013-02-17 16:53:48 +00:00
|
|
|
[aCoder encodeValueOfObjCType: @encode(NSInteger) at: &_selected_segment];
|
2010-01-29 03:11:43 +00:00
|
|
|
style = _segmentCellFlags._style;
|
|
|
|
[aCoder encodeValueOfObjCType: @encode(int) at: &style];
|
2008-01-07 17:22:49 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (id) initWithCoder: (NSCoder*)aDecoder
|
|
|
|
{
|
|
|
|
self = [super initWithCoder: aDecoder];
|
|
|
|
if (!self)
|
|
|
|
return nil;
|
|
|
|
|
|
|
|
if ([aDecoder allowsKeyedCoding])
|
|
|
|
{
|
2010-04-15 19:46:59 +00:00
|
|
|
NSUInteger i;
|
|
|
|
|
|
|
|
_selected_segment = -1;
|
2011-06-14 22:51:28 +00:00
|
|
|
_segmentCellFlags._tracking_mode = NSSegmentSwitchTrackingSelectOne;
|
2008-01-07 17:22:49 +00:00
|
|
|
if ([aDecoder containsValueForKey: @"NSSegmentImages"])
|
|
|
|
ASSIGN(_items, [aDecoder decodeObjectForKey: @"NSSegmentImages"]);
|
2010-04-15 19:46:59 +00:00
|
|
|
else
|
|
|
|
_items = [[NSMutableArray alloc] initWithCapacity: 2];
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
for (i = 0; i < [_items count]; i++)
|
2010-04-15 19:46:59 +00:00
|
|
|
{
|
|
|
|
if ([self isSelectedForSegment: i])
|
|
|
|
_selected_segment = i;
|
|
|
|
}
|
|
|
|
|
2008-01-07 17:22:49 +00:00
|
|
|
if ([aDecoder containsValueForKey: @"NSSelectedSegment"])
|
2011-06-14 22:51:28 +00:00
|
|
|
{
|
|
|
|
_selected_segment = [aDecoder decodeIntForKey: @"NSSelectedSegment"];
|
|
|
|
if (_selected_segment != -1)
|
|
|
|
[self setSelectedSegment: _selected_segment];
|
|
|
|
}
|
2010-04-15 19:46:59 +00:00
|
|
|
|
2010-01-29 03:11:43 +00:00
|
|
|
_segmentCellFlags._style = [aDecoder decodeIntForKey: @"NSSegmentStyle"];
|
2008-01-07 17:22:49 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-01-29 03:11:43 +00:00
|
|
|
int style;
|
2011-06-14 22:51:28 +00:00
|
|
|
|
|
|
|
_segmentCellFlags._tracking_mode = NSSegmentSwitchTrackingSelectOne;
|
2008-01-08 14:43:12 +00:00
|
|
|
ASSIGN(_items,[aDecoder decodeObject]);
|
2013-02-17 16:53:48 +00:00
|
|
|
[aDecoder decodeValueOfObjCType: @encode(NSInteger) at: &_selected_segment];
|
2010-04-15 19:46:59 +00:00
|
|
|
if (_selected_segment != -1)
|
|
|
|
[self setSelectedSegment: _selected_segment];
|
2010-01-29 03:11:43 +00:00
|
|
|
[aDecoder decodeValueOfObjCType: @encode(int) at: &style];
|
|
|
|
_segmentCellFlags._style = style;
|
2008-01-07 17:22:49 +00:00
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2018-02-27 22:32:11 +00:00
|
|
|
- (BOOL) startTrackingAt: (NSPoint)startPoint inView: (NSView*)controlView
|
|
|
|
{
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL) continueTracking: (NSPoint)lastPoint
|
|
|
|
at: (NSPoint)currentPoint
|
|
|
|
inView: (NSView*)controlView
|
|
|
|
{
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
|
2008-01-18 19:40:24 +00:00
|
|
|
- (void) stopTracking: (NSPoint)lastPoint
|
|
|
|
at: (NSPoint)stopPoint
|
|
|
|
inView: (NSView*)controlView
|
|
|
|
mouseIsUp: (BOOL)flag
|
2008-01-09 03:37:59 +00:00
|
|
|
{
|
2013-02-16 00:08:33 +00:00
|
|
|
NSInteger count = [self segmentCount];
|
|
|
|
NSInteger i = 0;
|
2008-01-09 03:37:59 +00:00
|
|
|
|
2008-01-18 19:40:24 +00:00
|
|
|
[super stopTracking: lastPoint
|
|
|
|
at: stopPoint
|
|
|
|
inView: controlView
|
|
|
|
mouseIsUp: (BOOL)flag];
|
|
|
|
|
2013-02-16 00:08:33 +00:00
|
|
|
for (i = 0; i < count; i++)
|
2008-01-09 03:37:59 +00:00
|
|
|
{
|
|
|
|
id segment = [_items objectAtIndex: i];
|
|
|
|
NSRect frame = [segment frame];
|
2008-01-18 19:40:24 +00:00
|
|
|
if(NSPointInRect(lastPoint,frame))
|
2008-01-09 03:37:59 +00:00
|
|
|
{
|
|
|
|
[self setSelectedSegment: i];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-01-07 14:33:58 +00:00
|
|
|
@end
|