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