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 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/views/infobars/translate_message_infobar.h" 6 7#include "chrome/browser/translate/translate_infobar_delegate.h" 8#include "ui/views/controls/button/label_button.h" 9#include "ui/views/controls/label.h" 10 11TranslateMessageInfoBar::TranslateMessageInfoBar( 12 InfoBarService* owner, 13 TranslateInfoBarDelegate* delegate) 14 : TranslateInfoBarBase(owner, delegate), 15 label_(NULL), 16 button_(NULL) { 17} 18 19TranslateMessageInfoBar::~TranslateMessageInfoBar() { 20} 21 22void TranslateMessageInfoBar::Layout() { 23 TranslateInfoBarBase::Layout(); 24 25 gfx::Size label_size = label_->GetPreferredSize(); 26 label_->SetBounds(StartX(), OffsetY(label_size), 27 std::min(label_size.width(), 28 std::max(0, EndX() - StartX() - ContentMinimumWidth())), 29 label_size.height()); 30 31 if (button_) { 32 gfx::Size button_size = button_->GetPreferredSize(); 33 button_->SetBounds(label_->bounds().right() + kButtonInLabelSpacing, 34 OffsetY(button_size), button_size.width(), button_size.height()); 35 } 36} 37 38void TranslateMessageInfoBar::ViewHierarchyChanged( 39 const ViewHierarchyChangedDetails& details) { 40 if (details.is_add && (details.child == this) && (label_ == NULL)) { 41 TranslateInfoBarDelegate* delegate = GetDelegate(); 42 label_ = CreateLabel(delegate->GetMessageInfoBarText()); 43 AddChildView(label_); 44 45 string16 button_text(delegate->GetMessageInfoBarButtonText()); 46 if (!button_text.empty()) { 47 button_ = CreateLabelButton(this, button_text, false); 48 AddChildView(button_); 49 } 50 } 51 52 // This must happen after adding all other children so InfoBarView can ensure 53 // the close button is the last child. 54 TranslateInfoBarBase::ViewHierarchyChanged(details); 55} 56 57void TranslateMessageInfoBar::ButtonPressed(views::Button* sender, 58 const ui::Event& event) { 59 if (!owner()) 60 return; // We're closing; don't call anything, it might access the owner. 61 if (sender == button_) 62 GetDelegate()->MessageInfoBarButtonPressed(); 63 else 64 TranslateInfoBarBase::ButtonPressed(sender, event); 65} 66 67int TranslateMessageInfoBar::ContentMinimumWidth() const { 68 return (button_ != NULL) ? 69 (button_->GetPreferredSize().width() + kButtonInLabelSpacing) : 0; 70} 71