62 _CPPopoverWindow _popoverWindow;
63 int _implementedDelegateMethods;
68 #pragma mark Initialization
77 if (
self = [super init])
80 _appearance = CPPopoverAppearanceMinimal;
89 #pragma mark Getters / Setters
96 - (CGRect)positioningRect
98 if (![_popoverWindow isVisible])
99 return CGRectMakeZero();
101 return [_popoverWindow frame];
107 - (void)setPositioningRect:(CGRect)aRect
109 if (![_popoverWindow isVisible])
112 [_popoverWindow setFrame:aRect];
120 - (CGSize)contentSize
122 if (![_popoverWindow isVisible])
123 return CGRectMakeZero();
125 return [[_contentViewController view] frameSize];
133 - (void)setContentSize:(CGSize)aSize
135 [[_contentViewController view] setFrameSize:aSize];
145 return [_popoverWindow isVisible];
153 - (void)setAnimates:(BOOL)shouldAnimate
155 if (_animates == shouldAnimate)
158 _animates = shouldAnimate;
159 [_popoverWindow setAnimates:_animates];
170 - (void)setBehavior:(
int)aBehavior
172 if (_behavior == aBehavior)
175 _behavior = aBehavior;
179 - (void)setDelegate:(
id)aDelegate
181 if (_delegate === aDelegate)
184 _delegate = aDelegate;
185 _implementedDelegateMethods = 0;
187 if ([_delegate respondsToSelector:
@selector(popoverWillShow:)])
190 if ([_delegate respondsToSelector:
@selector(popoverDidShow:)])
193 if ([_delegate respondsToSelector:
@selector(popoverShouldClose:)])
196 if ([_delegate respondsToSelector:
@selector(popoverWillClose:)])
199 if ([_delegate respondsToSelector:
@selector(popoverDidClose:)])
204 #pragma mark Positioning
213 - (void)showRelativeToRect:(CGRect)positioningRect ofView:(
CPView)positioningView preferredEdge:(CPRectEdge)preferredEdge
215 if (!positioningView)
218 if (!_contentViewController)
222 if ([_popoverWindow isClosing])
226 [_delegate popoverWillShow:self];
230 _popoverWindow = [[_CPPopoverWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:[
self styleMaskForBehavior]];
233 [_popoverWindow setPlatformWindow:[[positioningView window] platformWindow]];
234 [_popoverWindow setAppearance:_appearance];
235 [_popoverWindow setAnimates:_animates];
236 [_popoverWindow setDelegate:self];
237 [_popoverWindow setMovableByWindowBackground:NO];
238 [_popoverWindow setFrame:[_popoverWindow frameRectForContentRect:[[_contentViewController view] frame]]];
239 [_popoverWindow setContentView:[_contentViewController view]];
240 [_popoverWindow positionRelativeToRect:positioningRect ofView:positioningView preferredEdge:preferredEdge];
243 [_delegate popoverDidShow:self];
246 - (unsigned)styleMaskForBehavior
264 if ([_popoverWindow isClosing] || ![
self isShown])
268 [_delegate popoverWillClose:self];
270 [_popoverWindow close];
285 - (IBAction)performClose:(
id)sender
287 if ([_popoverWindow isClosing])
291 if (![_delegate popoverShouldClose:
self])
299 #pragma mark Delegates
302 - (BOOL)popoverWindowShouldClose:(_CPPopoverWindow)aPopoverWindow
313 - (void)popoverWindowDidClose:(_CPPopoverWindow)aPopoverWindow
316 [_delegate popoverDidClose:self];
320 - (void)popoverWindowDidShow:(_CPPopoverWindow)aPopoverWindow
323 [_delegate popoverDidShow:self];
330 - (void)setBehaviour:(
int)aBehavior
332 _CPReportLenientDeprecation(
self, _cmd,
@selector(setBehavior:));
350 self = [
super initWithCoder:aCoder];
354 _appearance = [aCoder decodeIntForKey:CPPopoverAppearanceKey];
355 _animates = [aCoder decodeBoolForKey:CPPopoverAnimatesKey];
356 _contentViewController = [aCoder decodeObjectForKey:CPPopoverContentViewControllerKey];
357 [
self setDelegate:[aCoder decodeObjectForKey:CPPopoverDelegateKey]];
358 [
self setBehavior:[aCoder decodeIntForKey:CPPopoverBehaviorKey]];
365 [
super encodeWithCoder:aCoder];
367 [aCoder encodeInt:_appearance forKey:CPPopoverAppearanceKey];
368 [aCoder encodeBool:_animates forKey:CPPopoverAnimatesKey];
369 [aCoder encodeObject:_contentViewController forKey:CPPopoverContentViewControllerKey];
370 [aCoder encodeObject:_delegate forKey:CPPopoverDelegateKey];
371 [aCoder encodeInt:_behavior forKey:CPPopoverBehaviorKey];
383 return _contentViewController;
391 _contentViewController = aValue;
421 - (void)setAppearance:(
int)aValue
423 _appearance = aValue;