• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2009 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#include "chrome/browser/ui/cocoa/base_view.h"
6
7NSString* kViewDidBecomeFirstResponder =
8    @"Chromium.kViewDidBecomeFirstResponder";
9NSString* kSelectionDirection = @"Chromium.kSelectionDirection";
10
11@implementation BaseView
12
13- (id)initWithFrame:(NSRect)frame {
14  self = [super initWithFrame:frame];
15  if (self) {
16    trackingArea_ =
17        [[NSTrackingArea alloc] initWithRect:frame
18                                     options:NSTrackingMouseMoved |
19                                             NSTrackingMouseEnteredAndExited |
20                                             NSTrackingActiveInActiveApp |
21                                             NSTrackingInVisibleRect
22                                       owner:self
23                                    userInfo:nil];
24    [self addTrackingArea:trackingArea_];
25  }
26  return self;
27}
28
29- (void)dealloc {
30  [self removeTrackingArea:trackingArea_];
31  [trackingArea_ release];
32
33  [super dealloc];
34}
35
36- (void)mouseEvent:(NSEvent *)theEvent {
37  // This method left intentionally blank.
38}
39
40- (void)keyEvent:(NSEvent *)theEvent {
41  // This method left intentionally blank.
42}
43
44- (void)mouseDown:(NSEvent *)theEvent {
45  dragging_ = YES;
46  [self mouseEvent:theEvent];
47}
48
49- (void)rightMouseDown:(NSEvent *)theEvent {
50  [self mouseEvent:theEvent];
51}
52
53- (void)otherMouseDown:(NSEvent *)theEvent {
54  [self mouseEvent:theEvent];
55}
56
57- (void)mouseUp:(NSEvent *)theEvent {
58  [self mouseEvent:theEvent];
59
60  dragging_ = NO;
61  if (pendingExitEvent_.get()) {
62    NSEvent* exitEvent =
63        [NSEvent enterExitEventWithType:NSMouseExited
64                               location:[theEvent locationInWindow]
65                          modifierFlags:[theEvent modifierFlags]
66                              timestamp:[theEvent timestamp]
67                           windowNumber:[theEvent windowNumber]
68                                context:[theEvent context]
69                            eventNumber:[pendingExitEvent_.get() eventNumber]
70                         trackingNumber:[pendingExitEvent_.get() trackingNumber]
71                               userData:[pendingExitEvent_.get() userData]];
72    [self mouseEvent:exitEvent];
73    pendingExitEvent_.reset();
74  }
75}
76
77- (void)rightMouseUp:(NSEvent *)theEvent {
78  [self mouseEvent:theEvent];
79}
80
81- (void)otherMouseUp:(NSEvent *)theEvent {
82  [self mouseEvent:theEvent];
83}
84
85- (void)mouseMoved:(NSEvent *)theEvent {
86  [self mouseEvent:theEvent];
87}
88
89- (void)mouseDragged:(NSEvent *)theEvent {
90  [self mouseEvent:theEvent];
91}
92
93- (void)rightMouseDragged:(NSEvent *)theEvent {
94  [self mouseEvent:theEvent];
95}
96
97- (void)otherMouseDragged:(NSEvent *)theEvent {
98  [self mouseEvent:theEvent];
99}
100
101- (void)mouseEntered:(NSEvent *)theEvent {
102  if (pendingExitEvent_.get()) {
103    pendingExitEvent_.reset();
104    return;
105  }
106
107  [self mouseEvent:theEvent];
108}
109
110- (void)mouseExited:(NSEvent *)theEvent {
111  // The tracking area will send an exit event even during a drag, which isn't
112  // how the event flow for drags should work. This stores the exit event, and
113  // sends it when the drag completes instead.
114  if (dragging_) {
115    pendingExitEvent_.reset([theEvent retain]);
116    return;
117  }
118
119  [self mouseEvent:theEvent];
120}
121
122- (void)keyDown:(NSEvent *)theEvent {
123  [self keyEvent:theEvent];
124}
125
126- (void)keyUp:(NSEvent *)theEvent {
127  [self keyEvent:theEvent];
128}
129
130- (void)flagsChanged:(NSEvent *)theEvent {
131  [self keyEvent:theEvent];
132}
133
134- (gfx::Rect)flipNSRectToRect:(NSRect)rect {
135  gfx::Rect new_rect(NSRectToCGRect(rect));
136  new_rect.set_y([self bounds].size.height - new_rect.y() - new_rect.height());
137  return new_rect;
138}
139
140- (NSRect)flipRectToNSRect:(gfx::Rect)rect {
141  NSRect new_rect(NSRectFromCGRect(rect.ToCGRect()));
142  new_rect.origin.y =
143      [self bounds].size.height - new_rect.origin.y - new_rect.size.height;
144  return new_rect;
145}
146
147@end
148