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 |