OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "chrome/browser/ui/cocoa/translate/translate_bubble_controller.h" | 5 #import "chrome/browser/ui/cocoa/translate/translate_bubble_controller.h" |
6 | 6 |
| 7 #include "base/mac/foundation_util.h" |
7 #include "base/mac/scoped_nsobject.h" | 8 #include "base/mac/scoped_nsobject.h" |
| 9 #include "base/strings/sys_string_conversions.h" |
8 #include "chrome/browser/translate/translate_ui_delegate.h" | 10 #include "chrome/browser/translate/translate_ui_delegate.h" |
9 #import "chrome/browser/ui/cocoa/browser_window_controller.h" | 11 #import "chrome/browser/ui/cocoa/browser_window_controller.h" |
10 #import "chrome/browser/ui/cocoa/info_bubble_view.h" | 12 #import "chrome/browser/ui/cocoa/info_bubble_view.h" |
11 #import "chrome/browser/ui/cocoa/info_bubble_window.h" | 13 #import "chrome/browser/ui/cocoa/info_bubble_window.h" |
12 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" | 14 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" |
| 15 #include "chrome/browser/ui/translate/language_combobox_model.h" |
13 #include "chrome/browser/ui/translate/translate_bubble_model_impl.h" | 16 #include "chrome/browser/ui/translate/translate_bubble_model_impl.h" |
14 #import "ui/base/cocoa/flipped_view.h" | 17 #include "content/public/browser/browser_context.h" |
| 18 #include "grit/generated_resources.h" |
| 19 #import "ui/base/cocoa/controls/hyperlink_button_cell.h" |
15 #import "ui/base/cocoa/window_size_constants.h" | 20 #import "ui/base/cocoa/window_size_constants.h" |
| 21 #include "ui/base/l10n/l10n_util.h" |
| 22 #include "ui/base/models/combobox_model.h" |
| 23 |
| 24 // TODO(hajimehoshi): This class is almost same as that of views. Refactor them. |
| 25 class TranslateDenialComboboxModel : public ui::ComboboxModel { |
| 26 public: |
| 27 explicit TranslateDenialComboboxModel( |
| 28 const base::string16& original_language_name) { |
| 29 // Dummy menu item, which is shown on the top of a NSPopUpButton. The top |
| 30 // text of the denial pop up menu should be IDS_TRANSLATE_BUBBLE_DENY, while |
| 31 // it is impossible to use it here because NSPopUpButtons' addItemWithTitle |
| 32 // removes a duplicated menu item. Instead, the title will be set later by |
| 33 // NSMenuItem's setTitle. |
| 34 items_.push_back(base::string16()); |
| 35 |
| 36 // Menu items in the drop down menu. |
| 37 items_.push_back(l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_DENY)); |
| 38 items_.push_back(l10n_util::GetStringFUTF16( |
| 39 IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_LANG, |
| 40 original_language_name)); |
| 41 items_.push_back(l10n_util::GetStringUTF16( |
| 42 IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_SITE)); |
| 43 } |
| 44 virtual ~TranslateDenialComboboxModel() {} |
| 45 |
| 46 private: |
| 47 // ComboboxModel: |
| 48 virtual int GetItemCount() const OVERRIDE { |
| 49 return items_.size(); |
| 50 } |
| 51 virtual base::string16 GetItemAt(int index) OVERRIDE { |
| 52 return items_[index]; |
| 53 } |
| 54 virtual bool IsItemSeparatorAt(int index) OVERRIDE { |
| 55 return false; |
| 56 } |
| 57 virtual int GetDefaultIndex() const OVERRIDE { |
| 58 return 0; |
| 59 } |
| 60 |
| 61 std::vector<base::string16> items_; |
| 62 |
| 63 DISALLOW_COPY_AND_ASSIGN(TranslateDenialComboboxModel); |
| 64 }; |
| 65 |
| 66 const CGFloat kWindowWidth = 320; |
| 67 |
| 68 // Padding between the window frame and content. |
| 69 const CGFloat kFramePadding = 16; |
| 70 |
| 71 const CGFloat kRelatedControlHorizontalSpacing = -2; |
| 72 |
| 73 const CGFloat kRelatedControlVerticalSpacing = 4; |
| 74 const CGFloat kUnrelatedControlVerticalSpacing = 20; |
| 75 |
| 76 const CGFloat kContentWidth = kWindowWidth - 2 * kFramePadding; |
| 77 |
| 78 @interface TranslateBubbleController() |
| 79 |
| 80 - (void)performLayout; |
| 81 - (NSView*)newBeforeTranslateView; |
| 82 - (NSView*)newTranslatingView; |
| 83 - (NSView*)newAfterTranslateView; |
| 84 - (NSView*)newErrorView; |
| 85 - (NSView*)newAdvancedView; |
| 86 - (void)updateAdvancedView; |
| 87 - (NSTextField*)addText:(NSString*)text |
| 88 toView:(NSView*)view; |
| 89 - (NSButton*)addLinkButtonWithText:(NSString*)text |
| 90 action:(SEL)action |
| 91 toView:(NSView*)view; |
| 92 - (NSButton*)addButton:(NSString*)title |
| 93 action:(SEL)action |
| 94 toView:(NSView*)view; |
| 95 - (NSButton*)addCheckbox:(NSString*)title |
| 96 toView:(NSView*)view; |
| 97 - (NSPopUpButton*)addPopUpButton:(ui::ComboboxModel*)model |
| 98 action:(SEL)action |
| 99 toView:(NSView*)view; |
| 100 - (void)handleTranslateButtonPressed; |
| 101 - (void)handleNopeButtonPressed; |
| 102 - (void)handleDoneButtonPressed; |
| 103 - (void)handleCancelButtonPressed; |
| 104 - (void)handleShowOriginalButtonPressed; |
| 105 - (void)handleAdvancedLinkButtonPressed; |
| 106 - (void)handleDenialPopUpButtonNopeSelected; |
| 107 - (void)handleDenialPopUpButtonNeverTranslateLanguageSelected; |
| 108 - (void)handleDenialPopUpButtonNeverTranslateSiteSelected; |
| 109 - (void)handleSourceLanguagePopUpButtonSelectedItemChanged:(id)sender; |
| 110 - (void)handleTargetLanguagePopUpButtonSelectedItemChanged:(id)sender; |
| 111 |
| 112 @end |
16 | 113 |
17 @implementation TranslateBubbleController | 114 @implementation TranslateBubbleController |
18 | 115 |
19 - (id)initWithParentWindow:(BrowserWindowController*)controller | 116 - (id)initWithParentWindow:(BrowserWindowController*)controller |
20 model:(scoped_ptr<TranslateBubbleModel>)model | 117 model:(scoped_ptr<TranslateBubbleModel>)model |
21 webContents:(content::WebContents*)webContents { | 118 webContents:(content::WebContents*)webContents { |
22 NSWindow* parentWindow = [controller window]; | 119 NSWindow* parentWindow = [controller window]; |
23 | 120 |
24 // Use an arbitrary size; it will be changed in performLayout. | 121 // Use an arbitrary size; it will be changed in performLayout. |
25 NSRect contentRect = ui::kWindowSizeDeterminedLater; | 122 NSRect contentRect = ui::kWindowSizeDeterminedLater; |
26 base::scoped_nsobject<InfoBubbleWindow> window( | 123 base::scoped_nsobject<InfoBubbleWindow> window( |
27 [[InfoBubbleWindow alloc] initWithContentRect:contentRect | 124 [[InfoBubbleWindow alloc] initWithContentRect:contentRect |
28 styleMask:NSBorderlessWindowMask | 125 styleMask:NSBorderlessWindowMask |
29 backing:NSBackingStoreBuffered | 126 backing:NSBackingStoreBuffered |
30 defer:NO]); | 127 defer:NO]); |
31 | 128 |
32 if ((self = [super initWithWindow:window | 129 if ((self = [super initWithWindow:window |
33 parentWindow:parentWindow | 130 parentWindow:parentWindow |
34 anchoredAt:NSZeroPoint])) { | 131 anchoredAt:NSZeroPoint])) { |
35 webContents_ = webContents; | 132 webContents_ = webContents; |
36 model_ = model.Pass(); | 133 model_ = model.Pass(); |
37 if (model_->GetViewState() != | 134 if (model_->GetViewState() != |
38 TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE) { | 135 TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE) { |
39 translateExecuted_ = YES; | 136 translateExecuted_ = YES; |
40 } | 137 } |
41 | 138 |
| 139 views_.reset([@{ |
| 140 @(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE): |
| 141 [self newBeforeTranslateView], |
| 142 @(TranslateBubbleModel::VIEW_STATE_TRANSLATING): |
| 143 [self newTranslatingView], |
| 144 @(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE): |
| 145 [self newAfterTranslateView], |
| 146 @(TranslateBubbleModel::VIEW_STATE_ERROR): |
| 147 [self newErrorView], |
| 148 @(TranslateBubbleModel::VIEW_STATE_ADVANCED): |
| 149 [self newAdvancedView], |
| 150 } retain]); |
| 151 |
42 [self performLayout]; | 152 [self performLayout]; |
43 } | 153 } |
44 return self; | 154 return self; |
45 } | 155 } |
46 | 156 |
47 @synthesize webContents = webContents_; | 157 @synthesize webContents = webContents_; |
48 | 158 |
| 159 - (NSView*)currentView { |
| 160 NSNumber* key = @(model_->GetViewState()); |
| 161 NSView* view = [views_ objectForKey:key]; |
| 162 DCHECK(view); |
| 163 return view; |
| 164 } |
| 165 |
49 - (const TranslateBubbleModel*)model { | 166 - (const TranslateBubbleModel*)model { |
50 return model_.get(); | 167 return model_.get(); |
51 } | 168 } |
52 | 169 |
53 - (void)showWindow:(id)sender { | 170 - (void)showWindow:(id)sender { |
54 BrowserWindowController* controller = [[self parentWindow] windowController]; | 171 BrowserWindowController* controller = [[self parentWindow] windowController]; |
55 NSPoint anchorPoint = [[controller toolbarController] translateBubblePoint]; | 172 NSPoint anchorPoint = [[controller toolbarController] translateBubblePoint]; |
56 anchorPoint = [[self parentWindow] convertBaseToScreen:anchorPoint]; | 173 anchorPoint = [[self parentWindow] convertBaseToScreen:anchorPoint]; |
57 [self setAnchorPoint:anchorPoint]; | 174 [self setAnchorPoint:anchorPoint]; |
58 [super showWindow:sender]; | 175 [super showWindow:sender]; |
59 } | 176 } |
60 | 177 |
61 - (void)switchView:(TranslateBubbleModel::ViewState)viewState { | 178 - (void)switchView:(TranslateBubbleModel::ViewState)viewState { |
62 if (model_->GetViewState() == viewState) | 179 if (model_->GetViewState() == viewState) |
63 return; | 180 return; |
64 | 181 |
65 model_->SetViewState(viewState); | 182 model_->SetViewState(viewState); |
66 [self performLayout]; | 183 [self performLayout]; |
67 } | 184 } |
68 | 185 |
69 - (void)switchToErrorView:(TranslateErrors::Type)errorType { | 186 - (void)switchToErrorView:(TranslateErrors::Type)errorType { |
| 187 // FIXME: Implement this. |
| 188 } |
| 189 |
| 190 - (void)performLayout { |
| 191 NSWindow* window = [self window]; |
| 192 [[window contentView] setSubviews:@[ [self currentView] ]]; |
| 193 |
| 194 CGFloat height = NSHeight([[self currentView] frame]) + |
| 195 2 * kFramePadding + info_bubble::kBubbleArrowHeight; |
| 196 |
| 197 NSRect windowFrame = [window contentRectForFrameRect:[[self window] frame]]; |
| 198 NSRect newWindowFrame = [window frameRectForContentRect:NSMakeRect( |
| 199 NSMinX(windowFrame), NSMaxY(windowFrame) - height, kWindowWidth, height)]; |
| 200 [window setFrame:newWindowFrame |
| 201 display:YES |
| 202 animate:[[self window] isVisible]]; |
| 203 } |
| 204 |
| 205 - (NSView*)newBeforeTranslateView { |
| 206 NSRect contentFrame = NSMakeRect( |
| 207 kFramePadding, |
| 208 kFramePadding, |
| 209 kContentWidth, |
| 210 0); |
| 211 NSView* view = [[NSView alloc] initWithFrame:contentFrame]; |
| 212 |
| 213 NSString* message = |
| 214 l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE); |
| 215 NSTextField* textLabel = [self addText:message |
| 216 toView:view]; |
| 217 message = l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_ADVANCED); |
| 218 NSButton* advancedLinkButton = |
| 219 [self addLinkButtonWithText:message |
| 220 action:@selector(handleAdvancedLinkButtonPressed) |
| 221 toView:view]; |
| 222 |
| 223 NSString* title = |
| 224 l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_ACCEPT); |
| 225 NSButton* translateButton = |
| 226 [self addButton:title |
| 227 action:@selector(handleTranslateButtonPressed) |
| 228 toView:view]; |
| 229 |
| 230 base::string16 originalLanguageName = |
| 231 model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex()); |
| 232 // TODO(hajimehoshi): When TranslateDenialComboboxModel is factored out as a |
| 233 // common model, ui::MenuModel will be used here. |
| 234 translateDenialComboboxModel_.reset( |
| 235 new TranslateDenialComboboxModel(originalLanguageName)); |
| 236 NSPopUpButton* denyPopUpButton = |
| 237 [self addPopUpButton:translateDenialComboboxModel_.get() |
| 238 action:nil |
| 239 toView:view]; |
| 240 [denyPopUpButton setPullsDown:YES]; |
| 241 [[denyPopUpButton itemAtIndex:1] setTarget:self]; |
| 242 [[denyPopUpButton itemAtIndex:1] |
| 243 setAction:@selector(handleDenialPopUpButtonNopeSelected)]; |
| 244 [[denyPopUpButton itemAtIndex:2] setTarget:self]; |
| 245 [[denyPopUpButton itemAtIndex:2] |
| 246 setAction:@selector(handleDenialPopUpButtonNeverTranslateLanguageSelected)]; |
| 247 [[denyPopUpButton itemAtIndex:3] setTarget:self]; |
| 248 [[denyPopUpButton itemAtIndex:3] |
| 249 setAction:@selector(handleDenialPopUpButtonNeverTranslateSiteSelected)]; |
| 250 |
| 251 title = base::SysUTF16ToNSString( |
| 252 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_DENY)); |
| 253 [[denyPopUpButton itemAtIndex:0] setTitle:title]; |
| 254 |
| 255 // Adjust width for the first item. |
| 256 base::scoped_nsobject<NSMenu> originalMenu([[denyPopUpButton menu] copy]); |
| 257 [denyPopUpButton removeAllItems]; |
| 258 [denyPopUpButton addItemWithTitle:[[originalMenu itemAtIndex:0] title]]; |
| 259 [denyPopUpButton sizeToFit]; |
| 260 [denyPopUpButton setMenu:originalMenu]; |
| 261 |
| 262 // Layout |
| 263 CGFloat yPos = 0; |
| 264 |
| 265 [translateButton setFrameOrigin:NSMakePoint( |
| 266 kContentWidth - NSWidth([translateButton frame]), yPos)]; |
| 267 |
| 268 NSRect denyPopUpButtonFrame = [denyPopUpButton frame]; |
| 269 CGFloat diffY = [[denyPopUpButton cell] |
| 270 titleRectForBounds:[denyPopUpButton bounds]].origin.y; |
| 271 [denyPopUpButton setFrameOrigin:NSMakePoint( |
| 272 NSMinX([translateButton frame]) - denyPopUpButtonFrame.size.width |
| 273 - kRelatedControlHorizontalSpacing, |
| 274 yPos + diffY)]; |
| 275 |
| 276 yPos += NSHeight([translateButton frame]) + |
| 277 kUnrelatedControlVerticalSpacing; |
| 278 |
| 279 [textLabel setFrameOrigin:NSMakePoint(0, yPos)]; |
| 280 [advancedLinkButton setFrameOrigin:NSMakePoint( |
| 281 NSWidth([textLabel frame]), yPos)]; |
| 282 |
| 283 [view setFrameSize:NSMakeSize(kContentWidth, NSMaxY([textLabel frame]))]; |
| 284 |
| 285 return view; |
| 286 } |
| 287 |
| 288 - (NSView*)newTranslatingView { |
| 289 NSRect contentFrame = NSMakeRect( |
| 290 kFramePadding, |
| 291 kFramePadding, |
| 292 kContentWidth, |
| 293 0); |
| 294 NSView* view = [[NSView alloc] initWithFrame:contentFrame]; |
| 295 |
| 296 NSString* message = |
| 297 l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_TRANSLATING); |
| 298 NSTextField* textLabel = [self addText:message |
| 299 toView:view]; |
| 300 NSString* title = |
| 301 l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_REVERT); |
| 302 NSButton* showOriginalButton = |
| 303 [self addButton:title |
| 304 action:@selector(handleShowOriginalButtonPressed) |
| 305 toView:view]; |
| 306 [showOriginalButton setEnabled:NO]; |
| 307 |
| 308 // Layout |
| 309 // TODO(hajimehoshi): Use l10n_util::VerticallyReflowGroup. |
| 310 CGFloat yPos = 0; |
| 311 |
| 312 [showOriginalButton setFrameOrigin:NSMakePoint( |
| 313 kContentWidth - NSWidth([showOriginalButton frame]), yPos)]; |
| 314 |
| 315 yPos += NSHeight([showOriginalButton frame]) + |
| 316 kUnrelatedControlVerticalSpacing; |
| 317 |
| 318 [textLabel setFrameOrigin:NSMakePoint(0, yPos)]; |
| 319 |
| 320 [view setFrameSize:NSMakeSize(kContentWidth, NSMaxY([textLabel frame]))]; |
| 321 |
| 322 return view; |
| 323 } |
| 324 |
| 325 - (NSView*)newAfterTranslateView { |
| 326 NSRect contentFrame = NSMakeRect( |
| 327 kFramePadding, |
| 328 kFramePadding, |
| 329 kContentWidth, |
| 330 0); |
| 331 NSView* view = [[NSView alloc] initWithFrame:contentFrame]; |
| 332 |
| 333 NSString* message = |
| 334 l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_TRANSLATED); |
| 335 NSTextField* textLabel = [self addText:message |
| 336 toView:view]; |
| 337 message = l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_ADVANCED); |
| 338 NSButton* advancedLinkButton = |
| 339 [self addLinkButtonWithText:message |
| 340 action:@selector(handleAdvancedLinkButtonPressed) |
| 341 toView:view]; |
| 342 NSString* title = |
| 343 l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_REVERT); |
| 344 NSButton* showOriginalButton = |
| 345 [self addButton:title |
| 346 action:@selector(handleShowOriginalButtonPressed) |
| 347 toView:view]; |
| 348 |
| 349 // Layout |
| 350 CGFloat yPos = 0; |
| 351 |
| 352 [showOriginalButton setFrameOrigin:NSMakePoint( |
| 353 kContentWidth - NSWidth([showOriginalButton frame]), yPos)]; |
| 354 |
| 355 yPos += NSHeight([showOriginalButton frame]) + |
| 356 kUnrelatedControlVerticalSpacing; |
| 357 |
| 358 [textLabel setFrameOrigin:NSMakePoint(0, yPos)]; |
| 359 [advancedLinkButton setFrameOrigin:NSMakePoint( |
| 360 NSMaxX([textLabel frame]), yPos)]; |
| 361 |
| 362 [view setFrameSize:NSMakeSize(kContentWidth, NSMaxY([textLabel frame]))]; |
| 363 |
| 364 return view; |
| 365 } |
| 366 |
| 367 - (NSView*)newErrorView { |
| 368 NSRect contentFrame = NSMakeRect( |
| 369 kFramePadding, |
| 370 kFramePadding, |
| 371 kContentWidth, |
| 372 0); |
| 373 NSView* view = [[NSView alloc] initWithFrame:contentFrame]; |
| 374 |
70 // TODO(hajimehoshi): Implement this. | 375 // TODO(hajimehoshi): Implement this. |
71 } | 376 |
72 | 377 return view; |
73 - (void)performLayout { | 378 } |
74 // TODO(hajimehoshi): Now this shows just an empty bubble. Implement this. | 379 |
75 [[self window] display]; | 380 - (NSView*)newAdvancedView { |
| 381 NSRect contentFrame = NSMakeRect( |
| 382 kFramePadding, |
| 383 kFramePadding, |
| 384 kContentWidth, |
| 385 0); |
| 386 NSView* view = [[NSView alloc] initWithFrame:contentFrame]; |
| 387 |
| 388 NSString* title = l10n_util::GetNSStringWithFixup( |
| 389 IDS_TRANSLATE_BUBBLE_PAGE_LANGUAGE); |
| 390 NSTextField* sourceLanguageLabel = [self addText:title |
| 391 toView:view]; |
| 392 title = l10n_util::GetNSStringWithFixup( |
| 393 IDS_TRANSLATE_BUBBLE_TRANSLATION_LANGUAGE); |
| 394 NSTextField* targetLanguageLabel = [self addText:title |
| 395 toView:view]; |
| 396 |
| 397 // combobox |
| 398 int sourceDefaultIndex = model_->GetOriginalLanguageIndex(); |
| 399 int targetDefaultIndex = model_->GetTargetLanguageIndex(); |
| 400 sourceLanguageComboboxModel_.reset( |
| 401 new LanguageComboboxModel(sourceDefaultIndex, model_.get())); |
| 402 targetLanguageComboboxModel_.reset( |
| 403 new LanguageComboboxModel(targetDefaultIndex, model_.get())); |
| 404 SEL action = @selector(handleSourceLanguagePopUpButtonSelectedItemChanged:); |
| 405 NSPopUpButton* sourcePopUpButton = |
| 406 [self addPopUpButton:sourceLanguageComboboxModel_.get() |
| 407 action:action |
| 408 toView:view]; |
| 409 action = @selector(handleTargetLanguagePopUpButtonSelectedItemChanged:); |
| 410 NSPopUpButton* targetPopUpButton = |
| 411 [self addPopUpButton:targetLanguageComboboxModel_.get() |
| 412 action:action |
| 413 toView:view]; |
| 414 |
| 415 // 'Always translate' checkbox |
| 416 BOOL isIncognitoWindow = webContents_ ? |
| 417 webContents_->GetBrowserContext()->IsOffTheRecord() : NO; |
| 418 if (!isIncognitoWindow) { |
| 419 NSString* title = |
| 420 l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_ALWAYS); |
| 421 alwaysTranslateCheckbox_ = [self addCheckbox:title |
| 422 toView:view]; |
| 423 } |
| 424 |
| 425 // Buttons |
| 426 advancedDoneButton_ = |
| 427 [self addButton:l10n_util::GetNSStringWithFixup(IDS_DONE) |
| 428 action:@selector(handleDoneButtonPressed) |
| 429 toView:view]; |
| 430 advancedCancelButton_ = |
| 431 [self addButton:l10n_util::GetNSStringWithFixup(IDS_CANCEL) |
| 432 action:@selector(handleCancelButtonPressed) |
| 433 toView:view]; |
| 434 |
| 435 // Layout |
| 436 CGFloat textLabelWidth = NSWidth([sourceLanguageLabel frame]); |
| 437 if (textLabelWidth < NSWidth([targetLanguageLabel frame])) |
| 438 textLabelWidth = NSWidth([targetLanguageLabel frame]); |
| 439 |
| 440 CGFloat yPos = 0; |
| 441 |
| 442 [advancedDoneButton_ setFrameOrigin:NSMakePoint(0, yPos)]; |
| 443 [advancedCancelButton_ setFrameOrigin:NSMakePoint(0, yPos)]; |
| 444 |
| 445 yPos += NSHeight([advancedDoneButton_ frame]) + |
| 446 kUnrelatedControlVerticalSpacing; |
| 447 |
| 448 if (alwaysTranslateCheckbox_) { |
| 449 [alwaysTranslateCheckbox_ setFrameOrigin:NSMakePoint(textLabelWidth, yPos)]; |
| 450 |
| 451 yPos += NSHeight([alwaysTranslateCheckbox_ frame]) + |
| 452 kRelatedControlVerticalSpacing; |
| 453 } |
| 454 |
| 455 CGFloat diffY = [[sourcePopUpButton cell] |
| 456 titleRectForBounds:[sourcePopUpButton bounds]].origin.y; |
| 457 |
| 458 [targetLanguageLabel setFrameOrigin:NSMakePoint( |
| 459 textLabelWidth - NSWidth([targetLanguageLabel frame]), yPos + diffY)]; |
| 460 |
| 461 NSRect frame = [targetPopUpButton frame]; |
| 462 frame.origin = NSMakePoint(textLabelWidth, yPos); |
| 463 frame.size.width = (kWindowWidth - 2 * kFramePadding) - textLabelWidth; |
| 464 [targetPopUpButton setFrame:frame]; |
| 465 |
| 466 yPos += NSHeight([targetPopUpButton frame]) + |
| 467 kRelatedControlVerticalSpacing; |
| 468 |
| 469 [sourceLanguageLabel setFrameOrigin:NSMakePoint( |
| 470 textLabelWidth - NSWidth([sourceLanguageLabel frame]), yPos + diffY)]; |
| 471 |
| 472 frame = [sourcePopUpButton frame]; |
| 473 frame.origin = NSMakePoint(textLabelWidth, yPos); |
| 474 frame.size.width = NSWidth([targetPopUpButton frame]); |
| 475 [sourcePopUpButton setFrame:frame]; |
| 476 |
| 477 [view setFrameSize:NSMakeSize(kContentWidth, |
| 478 NSMaxY([sourcePopUpButton frame]))]; |
| 479 |
| 480 [self updateAdvancedView]; |
| 481 |
| 482 return view; |
| 483 } |
| 484 |
| 485 - (void)updateAdvancedView { |
| 486 NSInteger state = model_->ShouldAlwaysTranslate() ? NSOnState : NSOffState; |
| 487 [alwaysTranslateCheckbox_ setState:state]; |
| 488 |
| 489 NSString* title; |
| 490 if (model_->IsPageTranslatedInCurrentLanguages()) |
| 491 title = l10n_util::GetNSStringWithFixup(IDS_DONE); |
| 492 else |
| 493 title = l10n_util::GetNSStringWithFixup(IDS_TRANSLATE_BUBBLE_ACCEPT); |
| 494 [advancedDoneButton_ setTitle:title]; |
| 495 [advancedDoneButton_ sizeToFit]; |
| 496 |
| 497 NSRect frame = [advancedDoneButton_ frame]; |
| 498 frame.origin.x = (kWindowWidth - 2 * kFramePadding) - NSWidth(frame); |
| 499 [advancedDoneButton_ setFrameOrigin:frame.origin]; |
| 500 |
| 501 frame = [advancedCancelButton_ frame]; |
| 502 frame.origin.x = NSMinX([advancedDoneButton_ frame]) - NSWidth(frame) |
| 503 - kRelatedControlHorizontalSpacing; |
| 504 [advancedCancelButton_ setFrameOrigin:frame.origin]; |
| 505 } |
| 506 |
| 507 - (NSTextField*)addText:(NSString*)text |
| 508 toView:(NSView*)view { |
| 509 base::scoped_nsobject<NSTextField> textField( |
| 510 [[NSTextField alloc] initWithFrame:NSZeroRect]); |
| 511 [textField setEditable:NO]; |
| 512 [textField setSelectable:YES]; |
| 513 [textField setDrawsBackground:NO]; |
| 514 [textField setBezeled:NO]; |
| 515 [textField setStringValue:text]; |
| 516 NSFont* font = [NSFont systemFontOfSize:[NSFont smallSystemFontSize]]; |
| 517 [textField setFont:font]; |
| 518 [textField setAutoresizingMask:NSViewWidthSizable]; |
| 519 [view addSubview:textField.get()]; |
| 520 |
| 521 [textField sizeToFit]; |
| 522 return textField.get(); |
| 523 } |
| 524 |
| 525 - (NSButton*)addLinkButtonWithText:(NSString*)text |
| 526 action:(SEL)action |
| 527 toView:(NSView*)view { |
| 528 base::scoped_nsobject<NSButton> button( |
| 529 [[HyperlinkButtonCell buttonWithString:text] retain]); |
| 530 |
| 531 [button setButtonType:NSMomentaryPushInButton]; |
| 532 [button setBezelStyle:NSRegularSquareBezelStyle]; |
| 533 [button setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
| 534 [button sizeToFit]; |
| 535 [button setTarget:self]; |
| 536 [button setAction:action]; |
| 537 |
| 538 [view addSubview:button.get()]; |
| 539 |
| 540 return button.get(); |
| 541 } |
| 542 |
| 543 - (NSButton*)addButton:(NSString*)title |
| 544 action:(SEL)action |
| 545 toView:(NSView*)view { |
| 546 base::scoped_nsobject<NSButton> button( |
| 547 [[NSButton alloc] initWithFrame:NSZeroRect]); |
| 548 [button setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
| 549 [button setTitle:title]; |
| 550 [button setBezelStyle:NSRoundedBezelStyle]; |
| 551 [[button cell] setControlSize:NSSmallControlSize]; |
| 552 [button sizeToFit]; |
| 553 [button setTarget:self]; |
| 554 [button setAction:action]; |
| 555 |
| 556 [view addSubview:button.get()]; |
| 557 |
| 558 return button.get(); |
| 559 } |
| 560 |
| 561 - (NSButton*)addCheckbox:(NSString*)title |
| 562 toView:(NSView*)view { |
| 563 base::scoped_nsobject<NSButton> button( |
| 564 [[NSButton alloc] initWithFrame:NSZeroRect]); |
| 565 [button setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
| 566 [button setTitle:title]; |
| 567 [[button cell] setControlSize:NSSmallControlSize]; |
| 568 [button setButtonType:NSSwitchButton]; |
| 569 [button sizeToFit]; |
| 570 |
| 571 [view addSubview:button.get()]; |
| 572 |
| 573 return button.get(); |
| 574 } |
| 575 |
| 576 - (NSPopUpButton*)addPopUpButton:(ui::ComboboxModel*)model |
| 577 action:(SEL)action |
| 578 toView:(NSView*)view { |
| 579 base::scoped_nsobject<NSPopUpButton> button( |
| 580 [[NSPopUpButton alloc] initWithFrame:NSZeroRect pullsDown:NO]); |
| 581 [button setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
| 582 [button setBordered:YES]; |
| 583 [[button cell] setControlSize:NSSmallControlSize]; |
| 584 [button setTarget:self]; |
| 585 [button setAction:action]; |
| 586 |
| 587 for (int i = 0; i < model->GetItemCount(); ++i) { |
| 588 if (model->IsItemSeparatorAt(i)) |
| 589 [[button menu] addItem:[NSMenuItem separatorItem]]; |
| 590 else |
| 591 [button addItemWithTitle:base::SysUTF16ToNSString(model->GetItemAt(i))]; |
| 592 } |
| 593 [button selectItemAtIndex:model->GetDefaultIndex()]; |
| 594 |
| 595 [button sizeToFit]; |
| 596 |
| 597 [view addSubview:button.get()]; |
| 598 |
| 599 return button.get(); |
| 600 } |
| 601 |
| 602 - (void)handleTranslateButtonPressed { |
| 603 translateExecuted_ = YES; |
| 604 model_->Translate(); |
| 605 } |
| 606 |
| 607 - (void)handleNopeButtonPressed { |
| 608 [self close]; |
| 609 } |
| 610 |
| 611 - (void)handleDoneButtonPressed { |
| 612 if (alwaysTranslateCheckbox_) { |
| 613 model_->SetAlwaysTranslate( |
| 614 [alwaysTranslateCheckbox_ state] == NSOnState); |
| 615 } |
| 616 if (model_->IsPageTranslatedInCurrentLanguages()) { |
| 617 model_->GoBackFromAdvanced(); |
| 618 [self performLayout]; |
| 619 } else { |
| 620 translateExecuted_ = true; |
| 621 model_->Translate(); |
| 622 [self switchView:TranslateBubbleModel::VIEW_STATE_TRANSLATING]; |
| 623 } |
| 624 } |
| 625 |
| 626 - (void)handleCancelButtonPressed { |
| 627 model_->GoBackFromAdvanced(); |
| 628 [self performLayout]; |
| 629 } |
| 630 |
| 631 - (void)handleShowOriginalButtonPressed { |
| 632 model_->RevertTranslation(); |
| 633 [self close]; |
| 634 } |
| 635 |
| 636 - (void)handleAdvancedLinkButtonPressed { |
| 637 [self switchView:TranslateBubbleModel::VIEW_STATE_ADVANCED]; |
| 638 } |
| 639 |
| 640 - (void)handleDenialPopUpButtonNopeSelected { |
| 641 [self close]; |
| 642 } |
| 643 |
| 644 - (void)handleDenialPopUpButtonNeverTranslateLanguageSelected { |
| 645 model_->SetNeverTranslateLanguage(true); |
| 646 [self close]; |
| 647 } |
| 648 |
| 649 - (void)handleDenialPopUpButtonNeverTranslateSiteSelected { |
| 650 model_->SetNeverTranslateSite(true); |
| 651 [self close]; |
| 652 } |
| 653 |
| 654 - (void)handleSourceLanguagePopUpButtonSelectedItemChanged:(id)sender { |
| 655 NSPopUpButton* button = base::mac::ObjCCastStrict<NSPopUpButton>(sender); |
| 656 model_->UpdateOriginalLanguageIndex([button indexOfSelectedItem]); |
| 657 [self updateAdvancedView]; |
| 658 } |
| 659 |
| 660 - (void)handleTargetLanguagePopUpButtonSelectedItemChanged:(id)sender { |
| 661 NSPopUpButton* button = base::mac::ObjCCastStrict<NSPopUpButton>(sender); |
| 662 model_->UpdateTargetLanguageIndex([button indexOfSelectedItem]); |
| 663 [self updateAdvancedView]; |
76 } | 664 } |
77 | 665 |
78 @end | 666 @end |
OLD | NEW |