33 BOOL _hasResizeControl;
34 BOOL _resizeControlIsLeftAligned;
40 var button = [[
CPButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)],
43 [button setBordered:NO];
44 [button setImage:image];
45 [button setImagePosition:CPImageOnly];
52 var button = [[
CPButton alloc] initWithFrame:CGRectMake(0, 0, 35, 25)],
55 [button setBordered:NO];
56 [button setImage:image];
57 [button setImagePosition:CPImageOnly];
62 + (id)actionPopupButton
67 [button addItemWithTitle:nil];
68 [[button lastItem] setImage:image];
69 [button setImagePosition:CPImageOnly];
70 [button setValue:CGInsetMake(0, 0, 0, 0) forThemeAttribute:"content-inset"];
72 [button setPullsDown:YES];
85 @"resize-control-inset": CGInsetMake(0.0, 0.0, 0.0, 0.0),
86 @"resize-control-size": CGSizeMakeZero(),
97 - (id)initWithFrame:(CGRect)aFrame
119 var viewIndex = [[view subviews] indexOfObject:subview];
120 [view setButtonBar:self forDividerAtIndex:viewIndex];
126 view = [view superview];
130 - (void)setButtons:(CPArray)buttons
132 for (var i = [_buttons count] - 1; i >= 0; i--)
134 [_buttons[i] removeFromSuperview];
135 [_buttons[i] removeObserver:self forKeyPath:@"hidden"];
139 _buttons = [CPArray arrayWithArray:buttons];
141 for (var i = [_buttons count] - 1; i >= 0; i--)
143 [_buttons[i] addObserver:self forKeyPath:@"hidden" options:CPKeyValueObservingOptionNew | CPKeyValueObservingOptionOld context:nil];
144 [_buttons[i] setBordered:YES];
152 return [CPArray arrayWithArray:_buttons];
155 - (void)setHasResizeControl:(BOOL)shouldHaveResizeControl
157 if (_hasResizeControl === shouldHaveResizeControl)
160 _hasResizeControl = !!shouldHaveResizeControl;
164 - (BOOL)hasResizeControl
166 return _hasResizeControl;
169 - (void)setResizeControlIsLeftAligned:(BOOL)shouldBeLeftAligned
171 if (_resizeControlIsLeftAligned === shouldBeLeftAligned)
174 _resizeControlIsLeftAligned = !!shouldBeLeftAligned;
178 - (BOOL)resizeControlIsLeftAligned
180 return _resizeControlIsLeftAligned;
183 - (CGRect)resizeControlFrame
187 currentSize = [
self bounds],
188 leftOrigin = _resizeControlIsLeftAligned ? 0 : currentSize.size.width - size.width - inset.right - inset.left;
190 return CGRectMake(leftOrigin, 0, size.width + inset.left + inset.right, size.height + inset.top + inset.bottom);
193 - (CGRect)rectForEphemeralSubviewNamed:(
CPString)aName
195 if (aName ===
"resize-control-view")
199 currentSize = [
self bounds];
201 if (_resizeControlIsLeftAligned)
202 return CGRectMake(inset.left, inset.top, size.width, size.height);
204 return CGRectMake(currentSize.size.width - size.width - inset.right, inset.top, size.width, size.height);
212 if (aName ===
"resize-control-view")
213 return [[
CPView alloc] initWithFrame:CGRectMakeZero()];
218 - (void)layoutSubviews
227 var buttonsNotHidden = [CPArray arrayWithArray:_buttons],
228 count = [buttonsNotHidden count];
232 var button = buttonsNotHidden[count];
236 [button removeFromSuperview];
237 [buttonsNotHidden removeObject:button];
241 var currentButtonOffset = _resizeControlIsLeftAligned ? CGRectGetMaxX([
self bounds]) + 1 : -1,
243 height = CGRectGetHeight(
bounds) - 1,
244 frameWidth = CGRectGetWidth(
bounds),
246 resizeWidth = CGRectGetWidth(resizeRect),
247 availableWidth = frameWidth - resizeWidth - 1;
249 for (var i = 0, count = [buttonsNotHidden count]; i < count; i++)
251 var button = buttonsNotHidden[i],
254 if (availableWidth > width)
255 availableWidth -=
width;
259 if (_resizeControlIsLeftAligned)
261 [button setFrame:CGRectMake(currentButtonOffset - width, 1, width, height)];
262 currentButtonOffset -= width - 1;
266 [button setFrame:CGRectMake(currentButtonOffset, 1, width, height)];
267 currentButtonOffset += width - 1;
270 [button setValue:normalColor forThemeAttribute:@"bezel-color" inState:[CPThemeStateNormal, CPThemeStateBordered]];
271 [button setValue:highlightedColor forThemeAttribute:@"bezel-color" inState:[CPThemeStateHighlighted, CPThemeStateBordered, ]];
272 [button setValue:disabledColor forThemeAttribute:@"bezel-color" inState:[CPThemeStateDisabled, CPThemeStateBordered]];
273 [button setValue:textColor forThemeAttribute:@"text-color" inState:CPThemeStateBordered];
276 [button setValue:normalColor forThemeAttribute:@"bezel-color" inState:[CPThemeStateNormal, CPThemeStateBordered, CPPopUpButtonStatePullsDown]];
277 [button setValue:highlightedColor forThemeAttribute:@"bezel-color" inState:[CPThemeStateHighlighted, CPThemeStateBordered, CPPopUpButtonStatePullsDown]];
278 [button setValue:disabledColor forThemeAttribute:@"bezel-color" inState:[CPThemeStateDisabled, CPThemeStateBordered, CPPopUpButtonStatePullsDown]];
283 if (_hasResizeControl)
289 [resizeControlView setAutoresizingMask: _resizeControlIsLeftAligned ? CPViewMaxXMargin : CPViewMinXMargin];
294 - (void)observeValueForKeyPath:(
CPString)keyPath ofObject:(
id)object change:(
CPDictionary)change context:(
id)context
302 - (void)setFrameSize:(CGSize)aSize
320 [aCoder encodeBool:_hasResizeControl forKey:CPButtonBarHasResizeControlKey];
321 [aCoder encodeBool:_resizeControlIsLeftAligned forKey:CPButtonBarResizeControlIsLeftAlignedKey];
322 [aCoder encodeObject:_buttons forKey:CPButtonBarButtonsKey];
327 if (
self = [super initWithCoder:aCoder])
329 _buttons = [aCoder decodeObjectForKey:CPButtonBarButtonsKey] || [];
330 _hasResizeControl = [aCoder decodeBoolForKey:CPButtonBarHasResizeControlKey];
331 _resizeControlIsLeftAligned = [aCoder decodeBoolForKey:CPButtonBarResizeControlIsLeftAlignedKey];