OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
6 #import "chrome/browser/ui/cocoa/translate/translate_infobar_base.h" | 6 #import "chrome/browser/ui/cocoa/translate/translate_infobar_base.h" |
7 | 7 |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/sys_string_conversions.h" | 10 #include "base/sys_string_conversions.h" |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 [item setTarget:target]; | 101 [item setTarget:target]; |
102 if (checked) | 102 if (checked) |
103 [item setState:NSOnState]; | 103 [item setState:NSOnState]; |
104 if (!enabled) | 104 if (!enabled) |
105 [item setEnabled:NO]; | 105 [item setEnabled:NO]; |
106 } | 106 } |
107 } | 107 } |
108 | 108 |
109 } // namespace TranslateInfoBarUtilities | 109 } // namespace TranslateInfoBarUtilities |
110 | 110 |
| 111 namespace { |
| 112 |
| 113 // Helper to close and disable popup menus when the infobar closes. |
| 114 // Disabling the popup button would cause a distracting visual change. |
| 115 void DisablePopUpMenu(NSMenu *menu) { |
| 116 // Remove the menu if visible. |
| 117 [menu cancelTracking]; |
| 118 |
| 119 // If the menu is re-opened, prevent queries to update items. |
| 120 [menu setDelegate:nil]; |
| 121 |
| 122 // Prevent target/action messages to the controller. |
| 123 for (NSMenuItem* item in [menu itemArray]) { |
| 124 [item setEnabled:NO]; |
| 125 [item setTarget:nil]; |
| 126 } |
| 127 } |
| 128 |
| 129 } // namespace |
| 130 |
111 // TranslateInfoBarDelegate views specific method: | 131 // TranslateInfoBarDelegate views specific method: |
112 InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) { | 132 InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) { |
113 TranslateInfoBarControllerBase* infobar_controller = NULL; | 133 TranslateInfoBarControllerBase* infobar_controller = NULL; |
114 switch (type_) { | 134 switch (type_) { |
115 case BEFORE_TRANSLATE: | 135 case BEFORE_TRANSLATE: |
116 infobar_controller = | 136 infobar_controller = |
117 [[BeforeTranslateInfobarController alloc] initWithDelegate:this | 137 [[BeforeTranslateInfobarController alloc] initWithDelegate:this |
118 owner:owner]; | 138 owner:owner]; |
119 break; | 139 break; |
120 case AFTER_TRANSLATE: | 140 case AFTER_TRANSLATE: |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 - (NSArray*)visibleControls { | 322 - (NSArray*)visibleControls { |
303 return [NSArray array]; | 323 return [NSArray array]; |
304 } | 324 } |
305 | 325 |
306 - (void)rebuildOptionsMenu:(BOOL)hideTitle { | 326 - (void)rebuildOptionsMenu:(BOOL)hideTitle { |
307 if (![self shouldShowOptionsPopUp]) | 327 if (![self shouldShowOptionsPopUp]) |
308 return; | 328 return; |
309 | 329 |
310 // The options model doesn't know how to handle state transitions, so rebuild | 330 // The options model doesn't know how to handle state transitions, so rebuild |
311 // it each time through here. | 331 // it each time through here. |
312 optionsMenuModel_.reset( | 332 optionsMenuModel_.reset(new OptionsMenuModel([self delegate])); |
313 new OptionsMenuModel([self delegate])); | |
314 | 333 |
315 [optionsPopUp_ removeAllItems]; | 334 [optionsPopUp_ removeAllItems]; |
316 // Set title. | 335 // Set title. |
317 NSString* optionsLabel = hideTitle ? @"" : | 336 NSString* optionsLabel = hideTitle ? @"" : |
318 l10n_util::GetNSString(IDS_TRANSLATE_INFOBAR_OPTIONS); | 337 l10n_util::GetNSString(IDS_TRANSLATE_INFOBAR_OPTIONS); |
319 [optionsPopUp_ addItemWithTitle:optionsLabel]; | 338 [optionsPopUp_ addItemWithTitle:optionsLabel]; |
320 | 339 |
321 // Populate options menu. | 340 // Populate options menu. |
322 NSMenu* optionsMenu = [optionsPopUp_ menu]; | 341 NSMenu* optionsMenu = [optionsPopUp_ menu]; |
323 [optionsMenu setAutoenablesItems:NO]; | 342 [optionsMenu setAutoenablesItems:NO]; |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
466 [[NSNotificationCenter defaultCenter] | 485 [[NSNotificationCenter defaultCenter] |
467 addObserver:self | 486 addObserver:self |
468 selector:@selector(didChangeFrame:) | 487 selector:@selector(didChangeFrame:) |
469 name:NSViewFrameDidChangeNotification | 488 name:NSViewFrameDidChangeNotification |
470 object:infoBarView_]; | 489 object:infoBarView_]; |
471 // Show and place GUI elements. | 490 // Show and place GUI elements. |
472 [self updateState]; | 491 [self updateState]; |
473 } | 492 } |
474 | 493 |
475 - (void)infobarWillClose { | 494 - (void)infobarWillClose { |
476 [[optionsPopUp_ menu] cancelTracking]; | 495 DisablePopUpMenu([fromLanguagePopUp_ menu]); |
| 496 DisablePopUpMenu([toLanguagePopUp_ menu]); |
| 497 DisablePopUpMenu([optionsPopUp_ menu]); |
477 [super infobarWillClose]; | 498 [super infobarWillClose]; |
478 } | 499 } |
479 | 500 |
480 - (void)adjustOptionsButtonSizeAndVisibilityForView:(NSView*)lastView { | 501 - (void)adjustOptionsButtonSizeAndVisibilityForView:(NSView*)lastView { |
481 [optionsPopUp_ setHidden:NO]; | 502 [optionsPopUp_ setHidden:NO]; |
482 [self rebuildOptionsMenu:NO]; | 503 [self rebuildOptionsMenu:NO]; |
483 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtBottom]; | 504 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtBottom]; |
484 [optionsPopUp_ sizeToFit]; | 505 [optionsPopUp_ sizeToFit]; |
485 | 506 |
486 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); | 507 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); |
487 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { | 508 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { |
488 [self rebuildOptionsMenu:YES]; | 509 [self rebuildOptionsMenu:YES]; |
489 NSRect oldFrame = [optionsPopUp_ frame]; | 510 NSRect oldFrame = [optionsPopUp_ frame]; |
490 oldFrame.size.width = NSHeight(oldFrame); | 511 oldFrame.size.width = NSHeight(oldFrame); |
491 [optionsPopUp_ setFrame:oldFrame]; | 512 [optionsPopUp_ setFrame:oldFrame]; |
492 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtCenter]; | 513 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtCenter]; |
493 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); | 514 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); |
494 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { | 515 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { |
495 [optionsPopUp_ setHidden:YES]; | 516 [optionsPopUp_ setHidden:YES]; |
496 } | 517 } |
497 } | 518 } |
498 } | 519 } |
499 | 520 |
500 // Called when "Translate" button is clicked. | 521 // Called when "Translate" button is clicked. |
501 - (IBAction)ok:(id)sender { | 522 - (IBAction)ok:(id)sender { |
| 523 // The delegate may be NULL if the infobar was closed. |
502 TranslateInfoBarDelegate* delegate = [self delegate]; | 524 TranslateInfoBarDelegate* delegate = [self delegate]; |
503 TranslateInfoBarDelegate::Type state = delegate->type(); | 525 if (delegate) { |
504 DCHECK(state == TranslateInfoBarDelegate::BEFORE_TRANSLATE || | 526 TranslateInfoBarDelegate::Type state = delegate->type(); |
505 state == TranslateInfoBarDelegate::TRANSLATION_ERROR); | 527 DCHECK(state == TranslateInfoBarDelegate::BEFORE_TRANSLATE || |
506 delegate->Translate(); | 528 state == TranslateInfoBarDelegate::TRANSLATION_ERROR); |
| 529 delegate->Translate(); |
| 530 } |
507 UMA_HISTOGRAM_COUNTS("Translate.Translate", 1); | 531 UMA_HISTOGRAM_COUNTS("Translate.Translate", 1); |
508 } | 532 } |
509 | 533 |
510 // Called when someone clicks on the "Nope" button. | 534 // Called when someone clicks on the "Nope" button. |
511 - (IBAction)cancel:(id)sender { | 535 - (IBAction)cancel:(id)sender { |
512 DCHECK( | 536 // The delegate may be NULL if the infobar was closed. |
513 [self delegate]->type() == TranslateInfoBarDelegate::BEFORE_TRANSLATE); | 537 TranslateInfoBarDelegate* delegate = [self delegate]; |
514 [self delegate]->TranslationDeclined(); | 538 if (delegate) { |
515 UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslate", 1); | 539 DCHECK(delegate->type() == TranslateInfoBarDelegate::BEFORE_TRANSLATE); |
| 540 delegate->TranslationDeclined(); |
| 541 UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslate", 1); |
| 542 } |
516 [super dismiss:nil]; | 543 [super dismiss:nil]; |
517 } | 544 } |
518 | 545 |
519 - (void)messageButtonPressed:(id)sender { | 546 - (void)messageButtonPressed:(id)sender { |
520 [self delegate]->MessageInfoBarButtonPressed(); | 547 // The delegate may be NULL if the infobar was closed. |
| 548 TranslateInfoBarDelegate* delegate = [self delegate]; |
| 549 if (delegate) |
| 550 delegate->MessageInfoBarButtonPressed(); |
521 } | 551 } |
522 | 552 |
523 - (IBAction)showOriginal:(id)sender { | 553 - (IBAction)showOriginal:(id)sender { |
524 [self delegate]->RevertTranslation(); | 554 // The delegate may be NULL if the infobar was closed. |
| 555 TranslateInfoBarDelegate* delegate = [self delegate]; |
| 556 if (delegate) |
| 557 delegate->RevertTranslation(); |
525 } | 558 } |
526 | 559 |
527 // Called when any of the language drop down menus are changed. | 560 // Called when any of the language drop down menus are changed. |
528 - (void)languageMenuChanged:(id)item { | 561 - (void)languageMenuChanged:(id)item { |
| 562 // The delegate may be NULL if the infobar was closed. |
| 563 if (![self delegate]) |
| 564 return; |
529 if ([item respondsToSelector:@selector(tag)]) { | 565 if ([item respondsToSelector:@selector(tag)]) { |
530 int cmd = [item tag]; | 566 int cmd = [item tag]; |
531 if (cmd >= IDC_TRANSLATE_TARGET_LANGUAGE_BASE) { | 567 if (cmd >= IDC_TRANSLATE_TARGET_LANGUAGE_BASE) { |
532 cmd -= IDC_TRANSLATE_TARGET_LANGUAGE_BASE; | 568 cmd -= IDC_TRANSLATE_TARGET_LANGUAGE_BASE; |
533 [self targetLanguageModified:cmd]; | 569 [self targetLanguageModified:cmd]; |
534 return; | 570 return; |
535 } else if (cmd >= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE) { | 571 } else if (cmd >= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE) { |
536 cmd -= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE; | 572 cmd -= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE; |
537 [self sourceLanguageModified:cmd]; | 573 [self sourceLanguageModified:cmd]; |
538 return; | 574 return; |
(...skipping 10 matching lines...) Expand all Loading... |
549 // "About Translate" can open a new tab). | 585 // "About Translate" can open a new tab). |
550 // Do not access member variables after this line! | 586 // Do not access member variables after this line! |
551 optionsMenuModel_->ExecuteCommand(cmd); | 587 optionsMenuModel_->ExecuteCommand(cmd); |
552 } else { | 588 } else { |
553 NOTREACHED(); | 589 NOTREACHED(); |
554 } | 590 } |
555 } | 591 } |
556 | 592 |
557 - (void)dealloc { | 593 - (void)dealloc { |
558 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 594 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
| 595 [showOriginalButton_ setTarget:nil]; |
| 596 [translateMessageButton_ setTarget:nil]; |
559 [super dealloc]; | 597 [super dealloc]; |
560 } | 598 } |
561 | 599 |
562 #pragma mark NSMenuDelegate | 600 #pragma mark NSMenuDelegate |
563 | 601 |
564 // Invoked by virtue of us being set as the delegate for the options menu. | 602 // Invoked by virtue of us being set as the delegate for the options menu. |
565 - (void)menuNeedsUpdate:(NSMenu *)menu { | 603 - (void)menuNeedsUpdate:(NSMenu *)menu { |
566 [self adjustOptionsButtonSizeAndVisibilityForView: | 604 [self adjustOptionsButtonSizeAndVisibilityForView: |
567 [[self visibleControls] lastObject]]; | 605 [[self visibleControls] lastObject]]; |
568 } | 606 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 return false; | 674 return false; |
637 } | 675 } |
638 previousControl = control; | 676 previousControl = control; |
639 } | 677 } |
640 | 678 |
641 return true; | 679 return true; |
642 } | 680 } |
643 | 681 |
644 @end // TranslateInfoBarControllerBase (TestingAPI) | 682 @end // TranslateInfoBarControllerBase (TestingAPI) |
645 | 683 |
OLD | NEW |