mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-08-25 21:17:03 +00:00
Previously, the default size of a CPCheckBox created with the constructor method checkBoxWithTitle did not take in account the size of the checkBox view. Now when calculating the size of the control, it will firstly calculate the size of the title and then add the size of the checkBox view and the offset. Fixes #2281
166 lines
4.1 KiB
Plaintext
166 lines
4.1 KiB
Plaintext
/*
|
|
* CPCheckBox.j
|
|
* AppKit
|
|
*
|
|
* Created by Francisco Tolmasky.
|
|
* Copyright 2009, 280 North, Inc.
|
|
*
|
|
* This 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.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This 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 this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
@import "CPButton.j"
|
|
|
|
|
|
CPCheckBoxImageOffset = 4.0;
|
|
|
|
@implementation CPCheckBox : CPButton
|
|
{
|
|
}
|
|
|
|
+ (id)checkBoxWithTitle:(CPString)aTitle theme:(CPTheme)aTheme
|
|
{
|
|
return [self buttonWithTitle:aTitle theme:aTheme];
|
|
}
|
|
|
|
+ (id)checkBoxWithTitle:(CPString)aTitle
|
|
{
|
|
return [self buttonWithTitle:aTitle];
|
|
}
|
|
|
|
+ (CPString)defaultThemeClass
|
|
{
|
|
return @"check-box";
|
|
}
|
|
|
|
+ (Class)_binderClassForBinding:(CPString)aBinding
|
|
{
|
|
if (aBinding === CPValueBinding)
|
|
return [_CPCheckBoxValueBinder class];
|
|
|
|
return [super _binderClassForBinding:aBinding];
|
|
}
|
|
|
|
- (id)initWithFrame:(CGRect)aFrame
|
|
{
|
|
self = [super initWithFrame:aFrame];
|
|
|
|
if (self)
|
|
{
|
|
[self setHighlightsBy:CPContentsCellMask];
|
|
[self setShowsStateBy:CPContentsCellMask];
|
|
|
|
// Defaults?
|
|
[self setImagePosition:CPImageLeft];
|
|
[self setAlignment:CPLeftTextAlignment];
|
|
|
|
[self setBordered:NO];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)takeStateFromKeyPath:(CPString)aKeyPath ofObjects:(CPArray)objects
|
|
{
|
|
var count = objects.length,
|
|
value = [objects[0] valueForKeyPath:aKeyPath] ? CPOnState : CPOffState;
|
|
|
|
[self setAllowsMixedState:NO];
|
|
[self setState:value];
|
|
|
|
while (count-- > 1)
|
|
{
|
|
if (value !== ([objects[count] valueForKeyPath:aKeyPath] ? CPOnState : CPOffState))
|
|
{
|
|
[self setAllowsMixedState:YES];
|
|
[self setState:CPMixedState];
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)takeValueFromKeyPath:(CPString)aKeyPath ofObjects:(CPArray)objects
|
|
{
|
|
[self takeStateFromKeyPath:aKeyPath ofObjects:objects];
|
|
}
|
|
|
|
- (CPImage)image
|
|
{
|
|
return [self currentValueForThemeAttribute:@"image"];
|
|
}
|
|
|
|
- (CPImage)alternateImage
|
|
{
|
|
return [self currentValueForThemeAttribute:@"image"];
|
|
}
|
|
|
|
- (BOOL)startTrackingAt:(CGPoint)aPoint
|
|
{
|
|
var startedTracking = [super startTrackingAt:aPoint];
|
|
[self highlight:YES];
|
|
return startedTracking;
|
|
}
|
|
|
|
|
|
#pragma mark -
|
|
#pragma mark Override methods from CPButton
|
|
|
|
- (CGSize)_minimumFrameSize
|
|
{
|
|
var size = [super _minimumFrameSize],
|
|
contentView = [self ephemeralSubviewNamed:@"content-view"];
|
|
|
|
if (!contentView && [[self title] length])
|
|
{
|
|
var minSize = [self currentValueForThemeAttribute:@"min-size"],
|
|
maxSize = [self currentValueForThemeAttribute:@"max-size"];
|
|
|
|
// Here we always add the min size to the control which is the size of the view of the checkBox
|
|
size.width += minSize.width + CPCheckBoxImageOffset;
|
|
|
|
if (maxSize.width >= 0.0)
|
|
size.width = MIN(size.width, maxSize.width);
|
|
}
|
|
|
|
return size;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation _CPCheckBoxValueBinder : CPBinder
|
|
{
|
|
}
|
|
|
|
- (void)_updatePlaceholdersWithOptions:(CPDictionary)options
|
|
{
|
|
[super _updatePlaceholdersWithOptions:options];
|
|
|
|
[self _setPlaceholder:CPMixedState forMarker:CPMultipleValuesMarker isDefault:YES];
|
|
[self _setPlaceholder:CPOffState forMarker:CPNoSelectionMarker isDefault:YES];
|
|
[self _setPlaceholder:CPOffState forMarker:CPNotApplicableMarker isDefault:YES];
|
|
[self _setPlaceholder:CPOffState forMarker:CPNullMarker isDefault:YES];
|
|
}
|
|
|
|
- (void)setPlaceholderValue:(id)aValue withMarker:(CPString)aMarker forBinding:(CPString)aBinding
|
|
{
|
|
[_source setAllowsMixedState:(aValue === CPMixedState)];
|
|
[_source setState:aValue];
|
|
}
|
|
|
|
- (void)setValue:(id)aValue forBinding:(CPString)aBinding
|
|
{
|
|
[_source setState:aValue];
|
|
}
|
|
|
|
@end
|