18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 22fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2006, 2008, 2010, 2011 Apple Inc. All rights reserved. 3db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "config.h" 22db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#import "PopupMenuMac.h" 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import "AXObjectCache.h" 25d0825bca7fe65beaee391d30da42e937db621564Steve Block#import "Chrome.h" 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "ChromeClient.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "EventHandler.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Frame.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "FrameView.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "HTMLNames.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "HTMLOptGroupElement.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "HTMLOptionElement.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "HTMLSelectElement.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Page.h" 35db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#import "PopupMenuClient.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "SimpleFontData.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebCoreSystemInterface.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 43db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPopupMenuMac::PopupMenuMac(PopupMenuClient* client) 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_popupClient(client) 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 48db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPopupMenuMac::~PopupMenuMac() 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_popup) 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_popup.get() setControlView:nil]; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 54db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid PopupMenuMac::clear() 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_popup) 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_popup.get() removeAllItems]; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 60db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid PopupMenuMac::populate() 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_popup) 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clear(); 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_popup = [[NSPopUpButtonCell alloc] initTextCell:@"" pullsDown:!client()->shouldPopOver()]; 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_popup.get() release]; // release here since the RetainPtr has retained the object already 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_popup.get() setUsesItemFromMenu:NO]; 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_popup.get() setAutoenablesItems:NO]; 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL messagesEnabled = [[m_popup.get() menu] menuChangedMessagesEnabled]; 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[m_popup.get() menu] setMenuChangedMessagesEnabled:NO]; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For pullDown menus the first item is hidden. 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!client()->shouldPopOver()) 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_popup.get() addItemWithTitle:@""]; 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block TextDirection menuTextDirection = client()->menuStyle().textDirection(); 802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [m_popup.get() setUserInterfaceLayoutDirection:menuTextDirection == LTR ? NSUserInterfaceLayoutDirectionLeftToRight : NSUserInterfaceLayoutDirectionRightToLeft]; 812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(client()); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int size = client()->listSize(); 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (int i = 0; i < size; i++) { 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (client()->itemIsSeparator(i)) 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[m_popup.get() menu] addItem:[NSMenuItem separatorItem]]; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PopupMenuStyle style = client()->itemStyle(i); 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableDictionary* attributes = [[NSMutableDictionary alloc] init]; 92d0825bca7fe65beaee391d30da42e937db621564Steve Block if (style.font() != Font()) { 93d0825bca7fe65beaee391d30da42e937db621564Steve Block NSFont *font = style.font().primaryFont()->getNSFont(); 94d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!font) { 95d0825bca7fe65beaee391d30da42e937db621564Steve Block CGFloat size = style.font().primaryFont()->platformData().size(); 96d0825bca7fe65beaee391d30da42e937db621564Steve Block font = style.font().weight() < FontWeightBold ? [NSFont systemFontOfSize:size] : [NSFont boldSystemFontOfSize:size]; 97d0825bca7fe65beaee391d30da42e937db621564Steve Block } 98d0825bca7fe65beaee391d30da42e937db621564Steve Block [attributes setObject:font forKey:NSFontAttributeName]; 99d0825bca7fe65beaee391d30da42e937db621564Steve Block } 1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<NSMutableParagraphStyle> paragraphStyle(AdoptNS, [[NSParagraphStyle defaultParagraphStyle] mutableCopy]); 1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [paragraphStyle.get() setAlignment:menuTextDirection == LTR ? NSLeftTextAlignment : NSRightTextAlignment]; 1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block NSWritingDirection writingDirection = style.textDirection() == LTR ? NSWritingDirectionLeftToRight : NSWritingDirectionRightToLeft; 1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [paragraphStyle.get() setBaseWritingDirection:writingDirection]; 1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (style.hasTextDirectionOverride()) { 1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<NSNumber> writingDirectionValue(AdoptNS, [[NSNumber alloc] initWithInteger:writingDirection + NSTextWritingDirectionOverride]); 1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<NSArray> writingDirectionArray(AdoptNS, [[NSArray alloc] initWithObjects:writingDirectionValue.get(), nil]); 1092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [attributes setObject:writingDirectionArray.get() forKey:NSWritingDirectionAttributeName]; 1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [attributes setObject:paragraphStyle.get() forKey:NSParagraphStyleAttributeName]; 1122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 1132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Add support for styling the foreground and background colors. 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Find a way to customize text color when an item is highlighted. 1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block NSAttributedString *string = [[NSAttributedString alloc] initWithString:client()->itemText(i) attributes:attributes]; 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [attributes release]; 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_popup.get() addItemWithTitle:@""]; 1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block NSMenuItem *menuItem = [m_popup.get() lastItem]; 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [menuItem setAttributedTitle:string]; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [menuItem setEnabled:client()->itemIsEnabled(i)]; 1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [menuItem setToolTip:client()->itemToolTip(i)]; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [string release]; 125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Allow the accessible text of the item to be overriden if necessary. 127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (AXObjectCache::accessibilityEnabled()) { 128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block NSString *accessibilityOverride = client()->itemAccessibilityText(i); 129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if ([accessibilityOverride length]) 130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [menuItem accessibilitySetOverrideValue:accessibilityOverride forAttribute:NSAccessibilityDescriptionAttribute]; 131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[m_popup.get() menu] setMenuChangedMessagesEnabled:messagesEnabled]; 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 138db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid PopupMenuMac::show(const IntRect& r, FrameView* v, int index) 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project populate(); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int numItems = [m_popup.get() numberOfItems]; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (numItems <= 0) { 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (client()) 144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block client()->popupDidHide(); 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(numItems > index); 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Workaround for crazy bug where a selected index of -1 for a menu with only 1 item will cause a blank menu. 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (index == -1 && numItems == 2 && !client()->shouldPopOver() && ![[m_popup.get() itemAtIndex:1] isEnabled]) 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project index = 0; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView* view = v->documentView(); 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_popup.get() attachPopUpWithFrame:r inView:view]; 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_popup.get() selectItemAtIndex:index]; 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMenu* menu = [m_popup.get() menu]; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSPoint location; 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSFont* font = client()->menuStyle().font().primaryFont()->getNSFont(); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // These values were borrowed from AppKit to match their placement of the menu. 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const int popOverHorizontalAdjust = -10; 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const int popUnderHorizontalAdjust = 6; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const int popUnderVerticalAdjust = 6; 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (client()->shouldPopOver()) { 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect titleFrame = [m_popup.get() titleRectForBounds:r]; 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (titleFrame.size.width <= 0 || titleFrame.size.height <= 0) 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project titleFrame = r; 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float vertOffset = roundf((NSMaxY(r) - NSMaxY(titleFrame)) + NSHeight(titleFrame)); 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Adjust for fonts other than the system font. 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSFont* defaultFont = [NSFont systemFontOfSize:[font pointSize]]; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project vertOffset += [font descender] - [defaultFont descender]; 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project vertOffset = fminf(NSHeight(r), vertOffset); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project location = NSMakePoint(NSMinX(r) + popOverHorizontalAdjust, NSMaxY(r) - vertOffset); 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project location = NSMakePoint(NSMinX(r) + popUnderHorizontalAdjust, NSMaxY(r) + popUnderVerticalAdjust); 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Save the current event that triggered the popup, so we can clean up our event 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // state after the NSMenu goes away. 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> frame = v->frame(); 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEvent* event = [frame->eventHandler()->currentNSEvent() retain]; 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 186db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block RefPtr<PopupMenuMac> protector(this); 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RetainPtr<NSView> dummyView(AdoptNS, [[NSView alloc] initWithFrame:r]); 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [view addSubview:dummyView.get()]; 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project location = [dummyView.get() convertPoint:location fromView:view]; 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = frame->page()) 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->chrome()->client()->willPopUpMenu(menu); 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wkPopupMenu(menu, location, roundf(NSWidth(r)), dummyView.get(), index, font); 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_popup.get() dismissPopUp]; 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [dummyView.get() removeFromSuperview]; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (client()) { 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int newIndex = [m_popup.get() indexOfSelectedItem]; 201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block client()->popupDidHide(); 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Adjust newIndex for hidden first item. 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!client()->shouldPopOver()) 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newIndex--; 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (index != newIndex && newIndex >= 0) 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project client()->valueChanged(newIndex); 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Give the frame a chance to fix up its event state, since the popup eats all the 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // events during tracking. 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frame->eventHandler()->sendFakeEventsAfterWidgetTracking(event); 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [event release]; 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 218db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid PopupMenuMac::hide() 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_popup.get() dismissPopUp]; 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 223db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid PopupMenuMac::updateFromElement() 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 227db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid PopupMenuMac::disconnectClient() 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 229db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block m_popupClient = 0; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 233