Index: chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm |
diff --git a/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm b/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm |
index 577da21c46945240cd981e26285ec200d6bea601..8415c129e87d3a2da11816abf2ad298b98564078 100644 |
--- a/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm |
+++ b/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm |
@@ -4,15 +4,112 @@ |
#import "chrome/browser/ui/cocoa/translate/translate_bubble_controller.h" |
+#include "base/mac/foundation_util.h" |
#include "base/mac/scoped_nsobject.h" |
+#include "base/strings/sys_string_conversions.h" |
#include "chrome/browser/translate/translate_ui_delegate.h" |
#import "chrome/browser/ui/cocoa/browser_window_controller.h" |
#import "chrome/browser/ui/cocoa/info_bubble_view.h" |
#import "chrome/browser/ui/cocoa/info_bubble_window.h" |
#import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" |
+#include "chrome/browser/ui/translate/language_combobox_model.h" |
#include "chrome/browser/ui/translate/translate_bubble_model_impl.h" |
-#import "ui/base/cocoa/flipped_view.h" |
+#include "content/public/browser/browser_context.h" |
+#include "grit/generated_resources.h" |
+#import "ui/base/cocoa/controls/hyperlink_button_cell.h" |
#import "ui/base/cocoa/window_size_constants.h" |
+#include "ui/base/l10n/l10n_util.h" |
+#include "ui/base/models/combobox_model.h" |
+ |
+// TODO(hajimehoshi): This class is almost same as that of views. Refactor them. |
+class TranslateDenialComboboxModel : public ui::ComboboxModel { |
+ public: |
+ explicit TranslateDenialComboboxModel( |
+ const base::string16& original_language_name) { |
+ // Dummy menu item, which is shown on the top of a NSPopUpButton. The top |
+ // text of the denial pop up menu should be IDS_TRANSLATE_BUBBLE_DENY, while |
+ // it is impossible to use it here because NSPopUpButtons' addItemWithTitle |
+ // removes a duplicated menu item. Instead, the title will be set later by |
+ // NSMenuItem's setTitle. |
+ items_.push_back(base::string16()); |
+ |
+ // Menu items in the drop down menu. |
+ items_.push_back(l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_DENY)); |
+ items_.push_back(l10n_util::GetStringFUTF16( |
+ IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_LANG, |
+ original_language_name)); |
+ items_.push_back(l10n_util::GetStringUTF16( |
+ IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_SITE)); |
+ } |
+ virtual ~TranslateDenialComboboxModel() {} |
+ |
+ private: |
+ // ComboboxModel: |
+ virtual int GetItemCount() const OVERRIDE { |
+ return items_.size(); |
+ } |
+ virtual base::string16 GetItemAt(int index) OVERRIDE { |
+ return items_[index]; |
+ } |
+ virtual bool IsItemSeparatorAt(int index) OVERRIDE { |
+ return false; |
+ } |
+ virtual int GetDefaultIndex() const OVERRIDE { |
+ return 0; |
+ } |
+ |
+ std::vector<base::string16> items_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TranslateDenialComboboxModel); |
+}; |
+ |
+const CGFloat kWindowWidth = 320; |
+ |
+// Padding between the window frame and content. |
+const CGFloat kFramePadding = 16; |
+ |
+const CGFloat kRelatedControlHorizontalSpacing = -2; |
+ |
+const CGFloat kRelatedControlVerticalSpacing = 4; |
+const CGFloat kUnrelatedControlVerticalSpacing = 20; |
+ |
+const CGFloat kContentWidth = kWindowWidth - 2 * kFramePadding; |
+ |
+@interface TranslateBubbleController() |
+ |
+- (void)performLayout; |
+- (NSView*)newBeforeTranslateView; |
+- (NSView*)newTranslatingView; |
+- (NSView*)newAfterTranslateView; |
+- (NSView*)newErrorView; |
+- (NSView*)newAdvancedView; |
+- (void)updateAdvancedView; |
+- (NSTextField*)addText:(NSString*)text |
+ toView:(NSView*)view; |
+- (NSButton*)addLinkButtonWithText:(NSString*)text |
+ action:(SEL)action |
+ toView:(NSView*)view; |
+- (NSButton*)addButton:(NSString*)title |
+ action:(SEL)action |
+ toView:(NSView*)view; |
+- (NSButton*)addCheckbox:(NSString*)title |
+ toView:(NSView*)view; |
+- (NSPopUpButton*)addPopUpButton:(ui::ComboboxModel*)model |
+ action:(SEL)action |
+ toView:(NSView*)view; |
+- (void)handleTranslateButtonPressed; |
+- (void)handleNopeButtonPressed; |
+- (void)handleDoneButtonPressed; |
+- (void)handleCancelButtonPressed; |
+- (void)handleShowOriginalButtonPressed; |
+- (void)handleAdvancedLinkButtonPressed; |
+- (void)handleDenialPopUpButtonNopeSelected; |
+- (void)handleDenialPopUpButtonNeverTranslateLanguageSelected; |
+- (void)handleDenialPopUpButtonNeverTranslateSiteSelected; |
+- (void)handleSourceLanguagePopUpButtonSelectedItemChanged:(id)sender; |
+- (void)handleTargetLanguagePopUpButtonSelectedItemChanged:(id)sender; |
+ |
+@end |
@implementation TranslateBubbleController |
@@ -39,6 +136,19 @@ |
translateExecuted_ = YES; |
} |
+ views_.reset([@{ |
+ @(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE): |
+ [self newBeforeTranslateView], |
+ @(TranslateBubbleModel::VIEW_STATE_TRANSLATING): |
+ [self newTranslatingView], |
+ @(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE): |
+ [self newAfterTranslateView], |
+ @(TranslateBubbleModel::VIEW_STATE_ERROR): |
+ [self newErrorView], |
+ @(TranslateBubbleModel::VIEW_STATE_ADVANCED): |
+ [self newAdvancedView], |
+ } retain]); |
+ |
[self performLayout]; |
} |
return self; |
@@ -46,6 +156,13 @@ |
@synthesize webContents = webContents_; |
+- (NSView*)currentView { |
+ NSNumber* key = @(model_->GetViewState()); |
+ NSView* view = [views_ objectForKey:key]; |
+ DCHECK(view); |
+ return view; |
+} |
+ |
- (const TranslateBubbleModel*)model { |
return model_.get(); |
} |
@@ -67,12 +184,483 @@ |
} |
- (void)switchToErrorView:(TranslateErrors::Type)errorType { |
- // TODO(hajimehoshi): Implement this. |
+ // FIXME: Implement this. |
} |
- (void)performLayout { |
- // TODO(hajimehoshi): Now this shows just an empty bubble. Implement this. |
- [[self window] display]; |
+ NSWindow* window = [self window]; |
+ [[window contentView] setSubviews:@[ [self currentView] ]]; |
+ |
+ CGFloat height = NSHeight([[self currentView] frame]) + |
+ 2 * kFramePadding + info_bubble::kBubbleArrowHeight; |
+ |
+ NSRect windowFrame = [window contentRectForFrameRect:[[self window] frame]]; |
+ NSRect newWindowFrame = [window frameRectForContentRect:NSMakeRect( |
+ NSMinX(windowFrame), NSMaxY(windowFrame) - height, kWindowWidth, height)]; |
+ [window setFrame:newWindowFrame |
+ display:YES |
+ animate:[[self window] isVisible]]; |
+} |
+ |
+- (NSView*)newBeforeTranslateView { |
+ NSRect contentFrame = NSMakeRect( |
+ kFramePadding, |
+ kFramePadding, |
+ kContentWidth, |
+ 0); |
+ NSView* view = [[NSView alloc] initWithFrame:contentFrame]; |
+ |
+ NSString* message = |
+ l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE); |
+ NSTextField* textLabel = [self addText:message |
+ toView:view]; |
+ message = l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_ADVANCED); |
+ NSButton* advancedLinkButton = |
+ [self addLinkButtonWithText:message |
+ action:@selector(handleAdvancedLinkButtonPressed) |
+ toView:view]; |
+ |
+ NSString* title = |
+ l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_ACCEPT); |
+ NSButton* translateButton = |
+ [self addButton:title |
+ action:@selector(handleTranslateButtonPressed) |
+ toView:view]; |
+ |
+ base::string16 originalLanguageName = |
+ model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex()); |
+ // TODO(hajimehoshi): When TranslateDenialComboboxModel is factored out as a |
+ // common model, ui::MenuModel will be used here. |
+ translateDenialComboboxModel_.reset( |
+ new TranslateDenialComboboxModel(originalLanguageName)); |
+ NSPopUpButton* denyPopUpButton = |
+ [self addPopUpButton:translateDenialComboboxModel_.get() |
+ action:nil |
+ toView:view]; |
+ [denyPopUpButton setPullsDown:YES]; |
+ [[denyPopUpButton itemAtIndex:1] setTarget:self]; |
+ [[denyPopUpButton itemAtIndex:1] |
+ setAction:@selector(handleDenialPopUpButtonNopeSelected)]; |
+ [[denyPopUpButton itemAtIndex:2] setTarget:self]; |
+ [[denyPopUpButton itemAtIndex:2] |
+ setAction:@selector(handleDenialPopUpButtonNeverTranslateLanguageSelected)]; |
+ [[denyPopUpButton itemAtIndex:3] setTarget:self]; |
+ [[denyPopUpButton itemAtIndex:3] |
+ setAction:@selector(handleDenialPopUpButtonNeverTranslateSiteSelected)]; |
+ |
+ title = base::SysUTF16ToNSString( |
+ l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_DENY)); |
+ [[denyPopUpButton itemAtIndex:0] setTitle:title]; |
+ |
+ // Adjust width for the first item. |
+ base::scoped_nsobject<NSMenu> originalMenu([[denyPopUpButton menu] copy]); |
+ [denyPopUpButton removeAllItems]; |
+ [denyPopUpButton addItemWithTitle:[[originalMenu itemAtIndex:0] title]]; |
+ [denyPopUpButton sizeToFit]; |
+ [denyPopUpButton setMenu:originalMenu]; |
+ |
+ // Layout |
+ CGFloat yPos = 0; |
+ |
+ [translateButton setFrameOrigin:NSMakePoint( |
+ kContentWidth - NSWidth([translateButton frame]), yPos)]; |
+ |
+ NSRect denyPopUpButtonFrame = [denyPopUpButton frame]; |
+ CGFloat diffY = [[denyPopUpButton cell] |
+ titleRectForBounds:[denyPopUpButton bounds]].origin.y; |
+ [denyPopUpButton setFrameOrigin:NSMakePoint( |
+ NSMinX([translateButton frame]) - denyPopUpButtonFrame.size.width |
+ - kRelatedControlHorizontalSpacing, |
+ yPos + diffY)]; |
+ |
+ yPos += NSHeight([translateButton frame]) + |
+ kUnrelatedControlVerticalSpacing; |
+ |
+ [textLabel setFrameOrigin:NSMakePoint(0, yPos)]; |
+ [advancedLinkButton setFrameOrigin:NSMakePoint( |
+ NSWidth([textLabel frame]), yPos)]; |
+ |
+ [view setFrameSize:NSMakeSize(kContentWidth, NSMaxY([textLabel frame]))]; |
+ |
+ return view; |
+} |
+ |
+- (NSView*)newTranslatingView { |
+ NSRect contentFrame = NSMakeRect( |
+ kFramePadding, |
+ kFramePadding, |
+ kContentWidth, |
+ 0); |
+ NSView* view = [[NSView alloc] initWithFrame:contentFrame]; |
+ |
+ NSString* message = |
+ l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_TRANSLATING); |
+ NSTextField* textLabel = [self addText:message |
+ toView:view]; |
+ NSString* title = |
+ l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_REVERT); |
+ NSButton* showOriginalButton = |
+ [self addButton:title |
+ action:@selector(handleShowOriginalButtonPressed) |
+ toView:view]; |
+ [showOriginalButton setEnabled:NO]; |
+ |
+ // Layout |
+ // TODO(hajimehoshi): Use l10n_util::VerticallyReflowGroup. |
+ CGFloat yPos = 0; |
+ |
+ [showOriginalButton setFrameOrigin:NSMakePoint( |
+ kContentWidth - NSWidth([showOriginalButton frame]), yPos)]; |
+ |
+ yPos += NSHeight([showOriginalButton frame]) + |
+ kUnrelatedControlVerticalSpacing; |
+ |
+ [textLabel setFrameOrigin:NSMakePoint(0, yPos)]; |
+ |
+ [view setFrameSize:NSMakeSize(kContentWidth, NSMaxY([textLabel frame]))]; |
+ |
+ return view; |
+} |
+ |
+- (NSView*)newAfterTranslateView { |
+ NSRect contentFrame = NSMakeRect( |
+ kFramePadding, |
+ kFramePadding, |
+ kContentWidth, |
+ 0); |
+ NSView* view = [[NSView alloc] initWithFrame:contentFrame]; |
+ |
+ NSString* message = |
+ l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_TRANSLATED); |
+ NSTextField* textLabel = [self addText:message |
+ toView:view]; |
+ message = l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_ADVANCED); |
+ NSButton* advancedLinkButton = |
+ [self addLinkButtonWithText:message |
+ action:@selector(handleAdvancedLinkButtonPressed) |
+ toView:view]; |
+ NSString* title = |
+ l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_REVERT); |
+ NSButton* showOriginalButton = |
+ [self addButton:title |
+ action:@selector(handleShowOriginalButtonPressed) |
+ toView:view]; |
+ |
+ // Layout |
+ CGFloat yPos = 0; |
+ |
+ [showOriginalButton setFrameOrigin:NSMakePoint( |
+ kContentWidth - NSWidth([showOriginalButton frame]), yPos)]; |
+ |
+ yPos += NSHeight([showOriginalButton frame]) + |
+ kUnrelatedControlVerticalSpacing; |
+ |
+ [textLabel setFrameOrigin:NSMakePoint(0, yPos)]; |
+ [advancedLinkButton setFrameOrigin:NSMakePoint( |
+ NSMaxX([textLabel frame]), yPos)]; |
+ |
+ [view setFrameSize:NSMakeSize(kContentWidth, NSMaxY([textLabel frame]))]; |
+ |
+ return view; |
+} |
+ |
+- (NSView*)newErrorView { |
+ NSRect contentFrame = NSMakeRect( |
+ kFramePadding, |
+ kFramePadding, |
+ kContentWidth, |
+ 0); |
+ NSView* view = [[NSView alloc] initWithFrame:contentFrame]; |
+ |
+ // TODO(hajimehoshi): Implement this. |
+ |
+ return view; |
+} |
+ |
+- (NSView*)newAdvancedView { |
+ NSRect contentFrame = NSMakeRect( |
+ kFramePadding, |
+ kFramePadding, |
+ kContentWidth, |
+ 0); |
+ NSView* view = [[NSView alloc] initWithFrame:contentFrame]; |
+ |
+ NSString* title = l10n_util::GetNSStringWithFixup( |
+ IDS_TRANSLATE_BUBBLE_PAGE_LANGUAGE); |
+ NSTextField* sourceLanguageLabel = [self addText:title |
+ toView:view]; |
+ title = l10n_util::GetNSStringWithFixup( |
+ IDS_TRANSLATE_BUBBLE_TRANSLATION_LANGUAGE); |
+ NSTextField* targetLanguageLabel = [self addText:title |
+ toView:view]; |
+ |
+ // combobox |
+ int sourceDefaultIndex = model_->GetOriginalLanguageIndex(); |
+ int targetDefaultIndex = model_->GetTargetLanguageIndex(); |
+ sourceLanguageComboboxModel_.reset( |
+ new LanguageComboboxModel(sourceDefaultIndex, model_.get())); |
+ targetLanguageComboboxModel_.reset( |
+ new LanguageComboboxModel(targetDefaultIndex, model_.get())); |
+ SEL action = @selector(handleSourceLanguagePopUpButtonSelectedItemChanged:); |
+ NSPopUpButton* sourcePopUpButton = |
+ [self addPopUpButton:sourceLanguageComboboxModel_.get() |
+ action:action |
+ toView:view]; |
+ action = @selector(handleTargetLanguagePopUpButtonSelectedItemChanged:); |
+ NSPopUpButton* targetPopUpButton = |
+ [self addPopUpButton:targetLanguageComboboxModel_.get() |
+ action:action |
+ toView:view]; |
+ |
+ // 'Always translate' checkbox |
+ BOOL isIncognitoWindow = webContents_ ? |
+ webContents_->GetBrowserContext()->IsOffTheRecord() : NO; |
+ if (!isIncognitoWindow) { |
+ NSString* title = |
+ l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_ALWAYS); |
+ alwaysTranslateCheckbox_ = [self addCheckbox:title |
+ toView:view]; |
+ } |
+ |
+ // Buttons |
+ advancedDoneButton_ = |
+ [self addButton:l10n_util::GetNSStringWithFixup(IDS_DONE) |
+ action:@selector(handleDoneButtonPressed) |
+ toView:view]; |
+ advancedCancelButton_ = |
+ [self addButton:l10n_util::GetNSStringWithFixup(IDS_CANCEL) |
+ action:@selector(handleCancelButtonPressed) |
+ toView:view]; |
+ |
+ // Layout |
+ CGFloat textLabelWidth = NSWidth([sourceLanguageLabel frame]); |
+ if (textLabelWidth < NSWidth([targetLanguageLabel frame])) |
+ textLabelWidth = NSWidth([targetLanguageLabel frame]); |
+ |
+ CGFloat yPos = 0; |
+ |
+ [advancedDoneButton_ setFrameOrigin:NSMakePoint(0, yPos)]; |
+ [advancedCancelButton_ setFrameOrigin:NSMakePoint(0, yPos)]; |
+ |
+ yPos += NSHeight([advancedDoneButton_ frame]) + |
+ kUnrelatedControlVerticalSpacing; |
+ |
+ if (alwaysTranslateCheckbox_) { |
+ [alwaysTranslateCheckbox_ setFrameOrigin:NSMakePoint(textLabelWidth, yPos)]; |
+ |
+ yPos += NSHeight([alwaysTranslateCheckbox_ frame]) + |
+ kRelatedControlVerticalSpacing; |
+ } |
+ |
+ CGFloat diffY = [[sourcePopUpButton cell] |
+ titleRectForBounds:[sourcePopUpButton bounds]].origin.y; |
+ |
+ [targetLanguageLabel setFrameOrigin:NSMakePoint( |
+ textLabelWidth - NSWidth([targetLanguageLabel frame]), yPos + diffY)]; |
+ |
+ NSRect frame = [targetPopUpButton frame]; |
+ frame.origin = NSMakePoint(textLabelWidth, yPos); |
+ frame.size.width = (kWindowWidth - 2 * kFramePadding) - textLabelWidth; |
+ [targetPopUpButton setFrame:frame]; |
+ |
+ yPos += NSHeight([targetPopUpButton frame]) + |
+ kRelatedControlVerticalSpacing; |
+ |
+ [sourceLanguageLabel setFrameOrigin:NSMakePoint( |
+ textLabelWidth - NSWidth([sourceLanguageLabel frame]), yPos + diffY)]; |
+ |
+ frame = [sourcePopUpButton frame]; |
+ frame.origin = NSMakePoint(textLabelWidth, yPos); |
+ frame.size.width = NSWidth([targetPopUpButton frame]); |
+ [sourcePopUpButton setFrame:frame]; |
+ |
+ [view setFrameSize:NSMakeSize(kContentWidth, |
+ NSMaxY([sourcePopUpButton frame]))]; |
+ |
+ [self updateAdvancedView]; |
+ |
+ return view; |
+} |
+ |
+- (void)updateAdvancedView { |
+ NSInteger state = model_->ShouldAlwaysTranslate() ? NSOnState : NSOffState; |
+ [alwaysTranslateCheckbox_ setState:state]; |
+ |
+ NSString* title; |
+ if (model_->IsPageTranslatedInCurrentLanguages()) |
+ title = l10n_util::GetNSStringWithFixup(IDS_DONE); |
+ else |
+ title = l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_ACCEPT); |
+ [advancedDoneButton_ setTitle:title]; |
+ [advancedDoneButton_ sizeToFit]; |
+ |
+ NSRect frame = [advancedDoneButton_ frame]; |
+ frame.origin.x = (kWindowWidth - 2 * kFramePadding) - NSWidth(frame); |
+ [advancedDoneButton_ setFrameOrigin:frame.origin]; |
+ |
+ frame = [advancedCancelButton_ frame]; |
+ frame.origin.x = NSMinX([advancedDoneButton_ frame]) - NSWidth(frame) |
+ - kRelatedControlHorizontalSpacing; |
+ [advancedCancelButton_ setFrameOrigin:frame.origin]; |
+} |
+ |
+- (NSTextField*)addText:(NSString*)text |
+ toView:(NSView*)view { |
+ base::scoped_nsobject<NSTextField> textField( |
+ [[NSTextField alloc] initWithFrame:NSZeroRect]); |
+ [textField setEditable:NO]; |
+ [textField setSelectable:YES]; |
+ [textField setDrawsBackground:NO]; |
+ [textField setBezeled:NO]; |
+ [textField setStringValue:text]; |
+ NSFont* font = [NSFont systemFontOfSize:[NSFont smallSystemFontSize]]; |
+ [textField setFont:font]; |
+ [textField setAutoresizingMask:NSViewWidthSizable]; |
+ [view addSubview:textField.get()]; |
+ |
+ [textField sizeToFit]; |
+ return textField.get(); |
+} |
+ |
+- (NSButton*)addLinkButtonWithText:(NSString*)text |
+ action:(SEL)action |
+ toView:(NSView*)view { |
+ base::scoped_nsobject<NSButton> button( |
+ [[HyperlinkButtonCell buttonWithString:text] retain]); |
+ |
+ [button setButtonType:NSMomentaryPushInButton]; |
+ [button setBezelStyle:NSRegularSquareBezelStyle]; |
+ [button setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
+ [button sizeToFit]; |
+ [button setTarget:self]; |
+ [button setAction:action]; |
+ |
+ [view addSubview:button.get()]; |
+ |
+ return button.get(); |
+} |
+ |
+- (NSButton*)addButton:(NSString*)title |
+ action:(SEL)action |
+ toView:(NSView*)view { |
+ base::scoped_nsobject<NSButton> button( |
+ [[NSButton alloc] initWithFrame:NSZeroRect]); |
+ [button setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
+ [button setTitle:title]; |
+ [button setBezelStyle:NSRoundedBezelStyle]; |
+ [[button cell] setControlSize:NSSmallControlSize]; |
+ [button sizeToFit]; |
+ [button setTarget:self]; |
+ [button setAction:action]; |
+ |
+ [view addSubview:button.get()]; |
+ |
+ return button.get(); |
+} |
+ |
+- (NSButton*)addCheckbox:(NSString*)title |
+ toView:(NSView*)view { |
+ base::scoped_nsobject<NSButton> button( |
+ [[NSButton alloc] initWithFrame:NSZeroRect]); |
+ [button setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
+ [button setTitle:title]; |
+ [[button cell] setControlSize:NSSmallControlSize]; |
+ [button setButtonType:NSSwitchButton]; |
+ [button sizeToFit]; |
+ |
+ [view addSubview:button.get()]; |
+ |
+ return button.get(); |
+} |
+ |
+- (NSPopUpButton*)addPopUpButton:(ui::ComboboxModel*)model |
+ action:(SEL)action |
+ toView:(NSView*)view { |
+ base::scoped_nsobject<NSPopUpButton> button( |
+ [[NSPopUpButton alloc] initWithFrame:NSZeroRect pullsDown:NO]); |
+ [button setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
+ [button setBordered:YES]; |
+ [[button cell] setControlSize:NSSmallControlSize]; |
+ [button setTarget:self]; |
+ [button setAction:action]; |
+ |
+ for (int i = 0; i < model->GetItemCount(); ++i) { |
+ if (model->IsItemSeparatorAt(i)) |
+ [[button menu] addItem:[NSMenuItem separatorItem]]; |
+ else |
+ [button addItemWithTitle:base::SysUTF16ToNSString(model->GetItemAt(i))]; |
+ } |
+ [button selectItemAtIndex:model->GetDefaultIndex()]; |
+ |
+ [button sizeToFit]; |
+ |
+ [view addSubview:button.get()]; |
+ |
+ return button.get(); |
+} |
+ |
+- (void)handleTranslateButtonPressed { |
+ translateExecuted_ = YES; |
+ model_->Translate(); |
+} |
+ |
+- (void)handleNopeButtonPressed { |
+ [self close]; |
+} |
+ |
+- (void)handleDoneButtonPressed { |
+ if (alwaysTranslateCheckbox_) { |
+ model_->SetAlwaysTranslate( |
+ [alwaysTranslateCheckbox_ state] == NSOnState); |
+ } |
+ if (model_->IsPageTranslatedInCurrentLanguages()) { |
+ model_->GoBackFromAdvanced(); |
+ [self performLayout]; |
+ } else { |
+ translateExecuted_ = true; |
+ model_->Translate(); |
+ [self switchView:TranslateBubbleModel::VIEW_STATE_TRANSLATING]; |
+ } |
+} |
+ |
+- (void)handleCancelButtonPressed { |
+ model_->GoBackFromAdvanced(); |
+ [self performLayout]; |
+} |
+ |
+- (void)handleShowOriginalButtonPressed { |
+ model_->RevertTranslation(); |
+ [self close]; |
+} |
+ |
+- (void)handleAdvancedLinkButtonPressed { |
+ [self switchView:TranslateBubbleModel::VIEW_STATE_ADVANCED]; |
+} |
+ |
+- (void)handleDenialPopUpButtonNopeSelected { |
+ [self close]; |
+} |
+ |
+- (void)handleDenialPopUpButtonNeverTranslateLanguageSelected { |
+ model_->SetNeverTranslateLanguage(true); |
+ [self close]; |
+} |
+ |
+- (void)handleDenialPopUpButtonNeverTranslateSiteSelected { |
+ model_->SetNeverTranslateSite(true); |
+ [self close]; |
+} |
+ |
+- (void)handleSourceLanguagePopUpButtonSelectedItemChanged:(id)sender { |
+ NSPopUpButton* button = base::mac::ObjCCastStrict<NSPopUpButton>(sender); |
+ model_->UpdateOriginalLanguageIndex([button indexOfSelectedItem]); |
+ [self updateAdvancedView]; |
+} |
+ |
+- (void)handleTargetLanguagePopUpButtonSelectedItemChanged:(id)sender { |
+ NSPopUpButton* button = base::mac::ObjCCastStrict<NSPopUpButton>(sender); |
+ model_->UpdateTargetLanguageIndex([button indexOfSelectedItem]); |
+ [self updateAdvancedView]; |
} |
@end |