diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm')
-rw-r--r-- | Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm b/Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm index 481e8c5..61713fc 100644 --- a/Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm +++ b/Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Apple Inc. All rights reserved. + * Copyright (C) 2010, 2011 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -23,13 +23,14 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -#include "WebPopupMenuProxyMac.h" +#import "config.h" +#import "WebPopupMenuProxyMac.h" -#include "PageClientImpl.h" -#include "PlatformPopupMenuData.h" -#include "WKView.h" -#include "WebPopupItem.h" -#include <WebKitSystemInterface.h> +#import "PageClientImpl.h" +#import "PlatformPopupMenuData.h" +#import "WKView.h" +#import "WebPopupItem.h" +#import <WebKitSystemInterface.h> using namespace WebCore; @@ -47,7 +48,7 @@ WebPopupMenuProxyMac::~WebPopupMenuProxyMac() [m_popup.get() setControlView:nil]; } -void WebPopupMenuProxyMac::populate(const Vector<WebPopupItem>& items) +void WebPopupMenuProxyMac::populate(const Vector<WebPopupItem>& items, TextDirection menuTextDirection) { if (m_popup) [m_popup.get() removeAllItems]; @@ -63,20 +64,38 @@ void WebPopupMenuProxyMac::populate(const Vector<WebPopupItem>& items) if (items[i].m_type == WebPopupItem::Seperator) [[m_popup.get() menu] addItem:[NSMenuItem separatorItem]]; else { - [m_popup.get() addItemWithTitle:nsStringFromWebCoreString(items[i].m_text)]; - NSMenuItem* menuItem = [m_popup.get() lastItem]; + [m_popup.get() addItemWithTitle:@""]; + NSMenuItem *menuItem = [m_popup.get() lastItem]; + + RetainPtr<NSMutableParagraphStyle> paragraphStyle(AdoptNS, [[NSParagraphStyle defaultParagraphStyle] mutableCopy]); + NSWritingDirection writingDirection = items[i].m_textDirection == LTR ? NSWritingDirectionLeftToRight : NSWritingDirectionRightToLeft; + [paragraphStyle.get() setBaseWritingDirection:writingDirection]; + [paragraphStyle.get() setAlignment:menuTextDirection == LTR ? NSLeftTextAlignment : NSRightTextAlignment]; + RetainPtr<NSMutableDictionary> attributes(AdoptNS, [[NSMutableDictionary alloc] initWithObjectsAndKeys: + paragraphStyle.get(), NSParagraphStyleAttributeName, + [m_popup.get() font], NSFontAttributeName, + nil]); + if (items[i].m_hasTextDirectionOverride) { + RetainPtr<NSNumber> writingDirectionValue(AdoptNS, [[NSNumber alloc] initWithInteger:writingDirection + NSTextWritingDirectionOverride]); + RetainPtr<NSArray> writingDirectionArray(AdoptNS, [[NSArray alloc] initWithObjects:writingDirectionValue.get(), nil]); + [attributes.get() setObject:writingDirectionArray.get() forKey:NSWritingDirectionAttributeName]; + } + RetainPtr<NSAttributedString> string(AdoptNS, [[NSAttributedString alloc] initWithString:nsStringFromWebCoreString(items[i].m_text) attributes:attributes.get()]); + + [menuItem setAttributedTitle:string.get()]; [menuItem setEnabled:items[i].m_isEnabled]; [menuItem setToolTip:nsStringFromWebCoreString(items[i].m_toolTip)]; } } } -void WebPopupMenuProxyMac::showPopupMenu(const IntRect& rect, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex) +void WebPopupMenuProxyMac::showPopupMenu(const IntRect& rect, TextDirection textDirection, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex) { - populate(items); + populate(items, textDirection); [m_popup.get() attachPopUpWithFrame:rect inView:m_webView]; [m_popup.get() selectItemAtIndex:selectedIndex]; + [m_popup.get() setUserInterfaceLayoutDirection:textDirection == LTR ? NSUserInterfaceLayoutDirectionLeftToRight : NSUserInterfaceLayoutDirectionRightToLeft]; NSMenu* menu = [m_popup.get() menu]; @@ -97,7 +116,8 @@ void WebPopupMenuProxyMac::showPopupMenu(const IntRect& rect, const Vector<WebPo [m_popup.get() dismissPopUp]; [dummyView.get() removeFromSuperview]; - m_client->valueChangedForPopupMenu(this, [m_popup.get() indexOfSelectedItem]); + if (m_client) + m_client->valueChangedForPopupMenu(this, [m_popup.get() indexOfSelectedItem]); } void WebPopupMenuProxyMac::hidePopupMenu() @@ -105,5 +125,4 @@ void WebPopupMenuProxyMac::hidePopupMenu() [m_popup.get() dismissPopUp]; } - } // namespace WebKit |