31 BOOL _hasResizeControl;
32 BOOL _resizeControlIsLeftAligned;
38 var button = [[
CPButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)],
39 image = [[
CPTheme defaultTheme] valueForAttributeWithName:@"button-image-plus" forClass:[
CPButtonBar class]];
41 [button setBordered:NO];
42 [button setImage:image];
43 [button setImagePosition:CPImageOnly];
50 var button = [[
CPButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)],
51 image = [[
CPTheme defaultTheme] valueForAttributeWithName:@"button-image-minus" forClass:[
CPButtonBar class]];
53 [button setBordered:NO];
54 [button setImage:image];
55 [button setImagePosition:CPImageOnly];
60 + (id)actionPopupButton
62 var button = [[
CPPopUpButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)],
63 image = [[
CPTheme defaultTheme] valueForAttributeWithName:@"button-image-action" forClass:[
CPButtonBar class]];
65 [button addItemWithTitle:nil];
66 [[button lastItem] setImage:image];
67 [button setImagePosition:CPImageOnly];
68 [button setValue:CGInsetMake(0, 0, 0, 0) forThemeAttribute:"content-inset"];
70 [button setPullsDown:YES];
83 @"resize-control-inset": CGInsetMake(0.0, 0.0, 0.0, 0.0),
84 @"resize-control-size": CGSizeMakeZero(),
95 - (id)initWithFrame:(CGRect)aFrame
97 self = [
super initWithFrame:aFrame];
102 [
self setNeedsLayout];
110 var view = [
self superview],
117 var viewIndex = [[view subviews] indexOfObject:subview];
118 [view setButtonBar:self forDividerAtIndex:viewIndex];
124 view = [view superview];
128 - (void)setButtons:(CPArray)buttons
130 _buttons = [CPArray arrayWithArray:buttons];
132 for (var i = 0, count = [_buttons count]; i < count; i++)
133 [_buttons[i] setBordered:YES];
135 [
self setNeedsLayout];
140 return [CPArray arrayWithArray:_buttons];
143 - (void)setHasResizeControl:(BOOL)shouldHaveResizeControl
145 if (_hasResizeControl === shouldHaveResizeControl)
148 _hasResizeControl = !!shouldHaveResizeControl;
149 [
self setNeedsLayout];
152 - (BOOL)hasResizeControl
154 return _hasResizeControl;
157 - (void)setResizeControlIsLeftAligned:(BOOL)shouldBeLeftAligned
159 if (_resizeControlIsLeftAligned === shouldBeLeftAligned)
162 _resizeControlIsLeftAligned = !!shouldBeLeftAligned;
163 [
self setNeedsLayout];
166 - (BOOL)resizeControlIsLeftAligned
168 return _resizeControlIsLeftAligned;
171 - (CGRect)resizeControlFrame
173 var inset = [
self currentValueForThemeAttribute:@"resize-control-inset"],
174 size = [
self currentValueForThemeAttribute:@"resize-control-size"],
175 currentSize = [
self bounds],
176 leftOrigin = _resizeControlIsLeftAligned ? 0 : currentSize.size.width - size.
width - inset.right - inset.left;
178 return CGRectMake(leftOrigin, 0, size.width + inset.left + inset.right, size.height + inset.top + inset.bottom);
181 - (CGRect)rectForEphemeralSubviewNamed:(
CPString)aName
183 if (aName ===
"resize-control-view")
185 var inset = [
self currentValueForThemeAttribute:@"resize-control-inset"],
186 size = [
self currentValueForThemeAttribute:@"resize-control-size"],
187 currentSize = [
self bounds];
189 if (_resizeControlIsLeftAligned)
190 return CGRectMake(inset.left, inset.top, size.width, size.height);
192 return CGRectMake(currentSize.size.width - size.width - inset.right, inset.top, size.width, size.height);
195 return [
super rectForEphemeralSubviewNamed:aName];
200 if (aName ===
"resize-control-view")
201 return [[
CPView alloc] initWithFrame:CGRectMakeZero()];
203 return [
super createEphemeralSubviewNamed:aName];
206 - (void)layoutSubviews
208 [
self setBackgroundColor:[
self currentValueForThemeAttribute:@"bezel-color"]];
210 var normalColor = [
self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateNormal],
211 highlightedColor = [
self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateHighlighted],
212 disabledColor = [
self valueForThemeAttribute:@"button-bezel-color" inState:CPThemeStateDisabled],
213 textColor = [
self valueForThemeAttribute:@"button-text-color" inState:CPThemeStateNormal];
215 var buttonsNotHidden = [CPArray arrayWithArray:_buttons],
216 count = [buttonsNotHidden count];
219 if ([buttonsNotHidden[count] isHidden])
220 [buttonsNotHidden removeObject:buttonsNotHidden[count]];
222 var currentButtonOffset = _resizeControlIsLeftAligned ? CGRectGetMaxX([
self bounds]) + 1 : -1,
223 bounds = [self bounds],
224 height = CGRectGetHeight(bounds) - 1,
225 frameWidth = CGRectGetWidth(bounds),
226 resizeRect = _hasResizeControl ? [self rectForEphemeralSubviewNamed:"resize-control-view"] : CGRectMakeZero(),
227 resizeWidth = CGRectGetWidth(resizeRect),
228 availableWidth = frameWidth - resizeWidth - 1;
230 for (var i = 0, count = [buttonsNotHidden count]; i < count; i++)
232 var button = buttonsNotHidden[i],
235 if (availableWidth > width)
236 availableWidth -= width;
240 if (_resizeControlIsLeftAligned)
242 [button setFrame:CGRectMake(currentButtonOffset - width, 1, width, height)];
243 currentButtonOffset -= width - 1;
247 [button setFrame:CGRectMake(currentButtonOffset, 1, width, height)];
248 currentButtonOffset += width - 1;
251 [button setValue:normalColor forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal | CPThemeStateBordered];
252 [button setValue:highlightedColor forThemeAttribute:@"bezel-color" inState:CPThemeStateHighlighted | CPThemeStateBordered];
253 [button setValue:disabledColor forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled | CPThemeStateBordered];
254 [button setValue:textColor forThemeAttribute:@"text-color" inState:CPThemeStateBordered];
257 [button setValue:normalColor forThemeAttribute:@"bezel-color" inState:CPThemeStateNormal | CPThemeStateBordered | CPPopUpButtonStatePullsDown];
258 [button setValue:highlightedColor forThemeAttribute:@"bezel-color" inState:CPThemeStateHighlighted | CPThemeStateBordered | CPPopUpButtonStatePullsDown];
259 [button setValue:disabledColor forThemeAttribute:@"bezel-color" inState:CPThemeStateDisabled | CPThemeStateBordered | CPPopUpButtonStatePullsDown];
261 [
self addSubview:button];
264 if (_hasResizeControl)
266 var resizeControlView = [
self layoutEphemeralSubviewNamed:@"resize-control-view"
267 positioned:CPWindowAbove
268 relativeToEphemeralSubviewNamed:nil];
270 [resizeControlView setAutoresizingMask: _resizeControlIsLeftAligned ? CPViewMaxXMargin : CPViewMinXMargin];
271 [resizeControlView setBackgroundColor:[
self currentValueForThemeAttribute:@"resize-control-color"]];
275 - (void)setFrameSize:(CGSize)aSize
277 [
super setFrameSize:aSize];
278 [
self setNeedsLayout];
283 var CPButtonBarHasResizeControlKey =
@"CPButtonBarHasResizeControlKey",
284 CPButtonBarResizeControlIsLeftAlignedKey =
@"CPButtonBarResizeControlIsLeftAlignedKey",
285 CPButtonBarButtonsKey =
@"CPButtonBarButtonsKey";
287 @implementation CPButtonBar (CPCoding)
289 - (void)encodeWithCoder:(
CPCoder)aCoder
291 [
super encodeWithCoder:aCoder];
293 [aCoder encodeBool:_hasResizeControl forKey:CPButtonBarHasResizeControlKey];
294 [aCoder encodeBool:_resizeControlIsLeftAligned forKey:CPButtonBarResizeControlIsLeftAlignedKey];
295 [aCoder encodeObject:_buttons forKey:CPButtonBarButtonsKey];
298 - (id)initWithCoder:(
CPCoder)aCoder
300 if (
self = [super initWithCoder:aCoder])
302 _buttons = [aCoder decodeObjectForKey:CPButtonBarButtonsKey] || [];
303 _hasResizeControl = [aCoder decodeBoolForKey:CPButtonBarHasResizeControlKey];
304 _resizeControlIsLeftAligned = [aCoder decodeBoolForKey:CPButtonBarResizeControlIsLeftAlignedKey];