1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_COCOA_TRACKING_AREA_H_
6#define CHROME_BROWSER_UI_COCOA_TRACKING_AREA_H_
7
8#import <AppKit/AppKit.h>
9
10#include "base/memory/scoped_nsobject.h"
11
12@class CrTrackingAreaOwnerProxy;
13
14// The CrTrackingArea can be used in place of an NSTrackingArea to shut off
15// messaging to the |owner| at a specific point in time.
16@interface CrTrackingArea : NSTrackingArea {
17 @private
18  scoped_nsobject<CrTrackingAreaOwnerProxy> ownerProxy_;
19}
20
21// Designated initializer. Forwards all arguments to the superclass, but wraps
22// |owner| in a proxy object.
23//
24// The |proxiedOwner:| paramater has been renamed due to an incompatiblity with
25// the 10.5 SDK. Since that SDK version declares |-[NSTrackingArea's init...]|'s
26// return type to be |NSTrackingArea*| rather than |id|, a more generalized type
27// can't be returned by the subclass. Until the project switches to the 10.6 SDK
28// (where Apple changed the return type to |id|), this ugly hack must exist.
29// TODO(rsesek): Remove this when feasabile.
30- (id)initWithRect:(NSRect)rect
31           options:(NSTrackingAreaOptions)options
32      proxiedOwner:(id)owner  // 10.5 SDK hack. Remove at some point.
33          userInfo:(NSDictionary*)userInfo;
34
35// Prevents any future messages from being delivered to the |owner|.
36- (void)clearOwner;
37
38// Watches |window| for its NSWindowWillCloseNotification and calls
39// |-clearOwner| when the notification is observed.
40- (void)clearOwnerWhenWindowWillClose:(NSWindow*)window;
41
42@end
43
44// Scoper //////////////////////////////////////////////////////////////////////
45
46// Use an instance of this class to call |-clearOwner| on the |tracking_area_|
47// when this goes out of scope.
48class ScopedCrTrackingArea {
49 public:
50  // Takes ownership of |tracking_area| without retaining it.
51  explicit ScopedCrTrackingArea(CrTrackingArea* tracking_area = nil);
52  ~ScopedCrTrackingArea();
53
54  // This will call |scoped_nsobject<>::reset()| to take ownership of the new
55  // tracking area.  Note that -clearOwner is NOT called on the existing
56  // tracking area.
57  void reset(CrTrackingArea* tracking_area = nil);
58
59  CrTrackingArea* get() const;
60
61 private:
62  scoped_nsobject<CrTrackingArea> tracking_area_;
63  DISALLOW_COPY_AND_ASSIGN(ScopedCrTrackingArea);
64};
65
66#endif  // CHROME_BROWSER_UI_COCOA_TRACKING_AREA_H_
67