Upstream version 11.40.271.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / toolbar / toolbar_button_cocoa.mm
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 #import "chrome/browser/ui/cocoa/toolbar/toolbar_button_cocoa.h"
6
7 @implementation ToolbarButton
8
9 @synthesize handleMiddleClick = handleMiddleClick_;
10
11 - (void)otherMouseDown:(NSEvent*)theEvent {
12   if (![self shouldHandleEvent:theEvent]) {
13     [super otherMouseDown:theEvent];
14     return;
15   }
16
17   NSEvent* nextEvent = theEvent;
18   BOOL isInside;
19
20   // Loop until middle button is released. Also, the mouse cursor is outside of
21   // the button, the button should not be highlighted.
22   do {
23     NSPoint mouseLoc = [self convertPoint:[nextEvent locationInWindow]
24                                  fromView:nil];
25     isInside = [self mouse:mouseLoc inRect:[self bounds]];
26     [self highlight:isInside];
27     [self setState:isInside ? NSOnState : NSOffState];
28
29     NSUInteger mask = NSOtherMouseDraggedMask | NSOtherMouseUpMask;
30     nextEvent = [[self window] nextEventMatchingMask:mask];
31   } while (!([nextEvent buttonNumber] == 2 &&
32              [nextEvent type] == NSOtherMouseUp));
33
34   // Discard the events before the middle button up event.
35   // If we don't discard it, the events will be re-processed later.
36   [[self window] discardEventsMatchingMask:NSAnyEventMask
37                                beforeEvent:nextEvent];
38
39   [self highlight:NO];
40   [self setState:NSOffState];
41   if (isInside)
42     [self sendAction:[self action] to:[self target]];
43 }
44
45 - (BOOL)shouldHandleEvent:(NSEvent*)theEvent {
46   // |buttonNumber| is the mouse button whose action triggered theEvent.
47   // 2 corresponds to the middle mouse button.
48   return handleMiddleClick_ && [theEvent buttonNumber] == 2;
49 }
50
51 @end