| 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 | |
| 131 // TranslateInfoBarDelegate views specific method: | 111 // TranslateInfoBarDelegate views specific method: |
| 132 InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) { | 112 InfoBar* TranslateInfoBarDelegate::CreateInfoBar(TabContentsWrapper* owner) { |
| 133 TranslateInfoBarControllerBase* infobar_controller = NULL; | 113 TranslateInfoBarControllerBase* infobar_controller = NULL; |
| 134 switch (type_) { | 114 switch (type_) { |
| 135 case BEFORE_TRANSLATE: | 115 case BEFORE_TRANSLATE: |
| 136 infobar_controller = | 116 infobar_controller = |
| 137 [[BeforeTranslateInfobarController alloc] initWithDelegate:this | 117 [[BeforeTranslateInfobarController alloc] initWithDelegate:this |
| 138 owner:owner]; | 118 owner:owner]; |
| 139 break; | 119 break; |
| 140 case AFTER_TRANSLATE: | 120 case AFTER_TRANSLATE: |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 [[NSNotificationCenter defaultCenter] | 465 [[NSNotificationCenter defaultCenter] |
| 486 addObserver:self | 466 addObserver:self |
| 487 selector:@selector(didChangeFrame:) | 467 selector:@selector(didChangeFrame:) |
| 488 name:NSViewFrameDidChangeNotification | 468 name:NSViewFrameDidChangeNotification |
| 489 object:infoBarView_]; | 469 object:infoBarView_]; |
| 490 // Show and place GUI elements. | 470 // Show and place GUI elements. |
| 491 [self updateState]; | 471 [self updateState]; |
| 492 } | 472 } |
| 493 | 473 |
| 494 - (void)infobarWillClose { | 474 - (void)infobarWillClose { |
| 495 DisablePopUpMenu([fromLanguagePopUp_ menu]); | 475 [self disablePopUpMenu:[fromLanguagePopUp_ menu]]; |
| 496 DisablePopUpMenu([toLanguagePopUp_ menu]); | 476 [self disablePopUpMenu:[toLanguagePopUp_ menu]]; |
| 497 DisablePopUpMenu([optionsPopUp_ menu]); | 477 [self disablePopUpMenu:[optionsPopUp_ menu]]; |
| 498 [super infobarWillClose]; | 478 [super infobarWillClose]; |
| 499 } | 479 } |
| 500 | 480 |
| 501 - (void)adjustOptionsButtonSizeAndVisibilityForView:(NSView*)lastView { | 481 - (void)adjustOptionsButtonSizeAndVisibilityForView:(NSView*)lastView { |
| 502 [optionsPopUp_ setHidden:NO]; | 482 [optionsPopUp_ setHidden:NO]; |
| 503 [self rebuildOptionsMenu:NO]; | 483 [self rebuildOptionsMenu:NO]; |
| 504 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtBottom]; | 484 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtBottom]; |
| 505 [optionsPopUp_ sizeToFit]; | 485 [optionsPopUp_ sizeToFit]; |
| 506 | 486 |
| 507 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); | 487 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); |
| 508 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { | 488 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { |
| 509 [self rebuildOptionsMenu:YES]; | 489 [self rebuildOptionsMenu:YES]; |
| 510 NSRect oldFrame = [optionsPopUp_ frame]; | 490 NSRect oldFrame = [optionsPopUp_ frame]; |
| 511 oldFrame.size.width = NSHeight(oldFrame); | 491 oldFrame.size.width = NSHeight(oldFrame); |
| 512 [optionsPopUp_ setFrame:oldFrame]; | 492 [optionsPopUp_ setFrame:oldFrame]; |
| 513 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtCenter]; | 493 [[optionsPopUp_ cell] setArrowPosition:NSPopUpArrowAtCenter]; |
| 514 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); | 494 MoveControl(closeButton_, optionsPopUp_, spaceBetweenControls_, false); |
| 515 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { | 495 if (!VerifyControlOrderAndSpacing(lastView, optionsPopUp_)) { |
| 516 [optionsPopUp_ setHidden:YES]; | 496 [optionsPopUp_ setHidden:YES]; |
| 517 } | 497 } |
| 518 } | 498 } |
| 519 } | 499 } |
| 520 | 500 |
| 521 // Called when "Translate" button is clicked. | 501 // Called when "Translate" button is clicked. |
| 522 - (IBAction)ok:(id)sender { | 502 - (IBAction)ok:(id)sender { |
| 523 // The delegate may be NULL if the infobar was closed. | 503 if (![self isOwned]) |
| 504 return; |
| 524 TranslateInfoBarDelegate* delegate = [self delegate]; | 505 TranslateInfoBarDelegate* delegate = [self delegate]; |
| 525 if (delegate) { | 506 TranslateInfoBarDelegate::Type state = delegate->type(); |
| 526 TranslateInfoBarDelegate::Type state = delegate->type(); | 507 DCHECK(state == TranslateInfoBarDelegate::BEFORE_TRANSLATE || |
| 527 DCHECK(state == TranslateInfoBarDelegate::BEFORE_TRANSLATE || | 508 state == TranslateInfoBarDelegate::TRANSLATION_ERROR); |
| 528 state == TranslateInfoBarDelegate::TRANSLATION_ERROR); | 509 delegate->Translate(); |
| 529 delegate->Translate(); | |
| 530 } | |
| 531 UMA_HISTOGRAM_COUNTS("Translate.Translate", 1); | 510 UMA_HISTOGRAM_COUNTS("Translate.Translate", 1); |
| 532 } | 511 } |
| 533 | 512 |
| 534 // Called when someone clicks on the "Nope" button. | 513 // Called when someone clicks on the "Nope" button. |
| 535 - (IBAction)cancel:(id)sender { | 514 - (IBAction)cancel:(id)sender { |
| 536 // The delegate may be NULL if the infobar was closed. | 515 if (![self isOwned]) |
| 516 return; |
| 537 TranslateInfoBarDelegate* delegate = [self delegate]; | 517 TranslateInfoBarDelegate* delegate = [self delegate]; |
| 538 if (delegate) { | 518 DCHECK(delegate->type() == TranslateInfoBarDelegate::BEFORE_TRANSLATE); |
| 539 DCHECK(delegate->type() == TranslateInfoBarDelegate::BEFORE_TRANSLATE); | 519 delegate->TranslationDeclined(); |
| 540 delegate->TranslationDeclined(); | 520 UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslate", 1); |
| 541 UMA_HISTOGRAM_COUNTS("Translate.DeclineTranslate", 1); | 521 [super removeSelf]; |
| 542 } | |
| 543 [super dismiss:nil]; | |
| 544 } | 522 } |
| 545 | 523 |
| 546 - (void)messageButtonPressed:(id)sender { | 524 - (void)messageButtonPressed:(id)sender { |
| 547 // The delegate may be NULL if the infobar was closed. | 525 if (![self isOwned]) |
| 548 TranslateInfoBarDelegate* delegate = [self delegate]; | 526 return; |
| 549 if (delegate) | 527 [self delegate]->MessageInfoBarButtonPressed(); |
| 550 delegate->MessageInfoBarButtonPressed(); | |
| 551 } | 528 } |
| 552 | 529 |
| 553 - (IBAction)showOriginal:(id)sender { | 530 - (IBAction)showOriginal:(id)sender { |
| 554 // The delegate may be NULL if the infobar was closed. | 531 if (![self isOwned]) |
| 555 TranslateInfoBarDelegate* delegate = [self delegate]; | 532 return; |
| 556 if (delegate) | 533 [self delegate]->RevertTranslation(); |
| 557 delegate->RevertTranslation(); | |
| 558 } | 534 } |
| 559 | 535 |
| 560 // Called when any of the language drop down menus are changed. | 536 // Called when any of the language drop down menus are changed. |
| 561 - (void)languageMenuChanged:(id)item { | 537 - (void)languageMenuChanged:(id)item { |
| 562 // The delegate may be NULL if the infobar was closed. | 538 if (![self isOwned]) |
| 563 if (![self delegate]) | |
| 564 return; | 539 return; |
| 565 if ([item respondsToSelector:@selector(tag)]) { | 540 if ([item respondsToSelector:@selector(tag)]) { |
| 566 int cmd = [item tag]; | 541 int cmd = [item tag]; |
| 567 if (cmd >= IDC_TRANSLATE_TARGET_LANGUAGE_BASE) { | 542 if (cmd >= IDC_TRANSLATE_TARGET_LANGUAGE_BASE) { |
| 568 cmd -= IDC_TRANSLATE_TARGET_LANGUAGE_BASE; | 543 cmd -= IDC_TRANSLATE_TARGET_LANGUAGE_BASE; |
| 569 [self targetLanguageModified:cmd]; | 544 [self targetLanguageModified:cmd]; |
| 570 return; | 545 return; |
| 571 } else if (cmd >= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE) { | 546 } else if (cmd >= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE) { |
| 572 cmd -= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE; | 547 cmd -= IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE; |
| 573 [self sourceLanguageModified:cmd]; | 548 [self sourceLanguageModified:cmd]; |
| 574 return; | 549 return; |
| 575 } | 550 } |
| 576 } | 551 } |
| 577 NOTREACHED() << "Language menu was changed with a bad language ID"; | 552 NOTREACHED() << "Language menu was changed with a bad language ID"; |
| 578 } | 553 } |
| 579 | 554 |
| 580 // Called when the options menu is changed. | 555 // Called when the options menu is changed. |
| 581 - (void)optionsMenuChanged:(id)item { | 556 - (void)optionsMenuChanged:(id)item { |
| 557 if (![self isOwned]) |
| 558 return; |
| 582 if ([item respondsToSelector:@selector(tag)]) { | 559 if ([item respondsToSelector:@selector(tag)]) { |
| 583 int cmd = [item tag]; | 560 int cmd = [item tag]; |
| 584 // Danger Will Robinson! : This call can release the infobar (e.g. invoking | 561 // Danger Will Robinson! : This call can release the infobar (e.g. invoking |
| 585 // "About Translate" can open a new tab). | 562 // "About Translate" can open a new tab). |
| 586 // Do not access member variables after this line! | 563 // Do not access member variables after this line! |
| 587 optionsMenuModel_->ExecuteCommand(cmd); | 564 optionsMenuModel_->ExecuteCommand(cmd); |
| 588 } else { | 565 } else { |
| 589 NOTREACHED(); | 566 NOTREACHED(); |
| 590 } | 567 } |
| 591 } | 568 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 return false; | 651 return false; |
| 675 } | 652 } |
| 676 previousControl = control; | 653 previousControl = control; |
| 677 } | 654 } |
| 678 | 655 |
| 679 return true; | 656 return true; |
| 680 } | 657 } |
| 681 | 658 |
| 682 @end // TranslateInfoBarControllerBase (TestingAPI) | 659 @end // TranslateInfoBarControllerBase (TestingAPI) |
| 683 | 660 |
| OLD | NEW |