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