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