1// Copyright (c) 2012 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/confirm_bubble_views.h" 6 7#include "chrome/browser/ui/confirm_bubble.h" 8#include "chrome/browser/ui/confirm_bubble_model.h" 9#include "chrome/browser/ui/views/constrained_window_views.h" 10#include "ui/views/controls/label.h" 11#include "ui/views/controls/link.h" 12#include "ui/views/layout/grid_layout.h" 13#include "ui/views/layout/layout_constants.h" 14#include "ui/views/widget/widget.h" 15 16ConfirmBubbleViews::ConfirmBubbleViews(ConfirmBubbleModel* model) 17 : model_(model), 18 link_(NULL) { 19 views::GridLayout* layout = views::GridLayout::CreatePanel(this); 20 SetLayoutManager(layout); 21 22 // Use a fixed maximum message width, so longer messages will wrap. 23 const int kMaxMessageWidth = 400; 24 views::ColumnSet* cs = layout->AddColumnSet(0); 25 cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0, 26 views::GridLayout::FIXED, kMaxMessageWidth, false); 27 28 // Add the message label. 29 views::Label* label = new views::Label(model_->GetMessageText()); 30 DCHECK(!label->text().empty()); 31 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 32 label->SetMultiLine(true); 33 label->SizeToFit(kMaxMessageWidth); 34 layout->StartRow(0, 0); 35 layout->AddView(label); 36 37 // Initialize the link. 38 link_ = new views::Link(model_->GetLinkText()); 39 link_->set_listener(this); 40 link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 41} 42 43ConfirmBubbleViews::~ConfirmBubbleViews() { 44} 45 46string16 ConfirmBubbleViews::GetDialogButtonLabel( 47 ui::DialogButton button) const { 48 switch (button) { 49 case ui::DIALOG_BUTTON_OK: 50 return model_->GetButtonLabel(ConfirmBubbleModel::BUTTON_OK); 51 case ui::DIALOG_BUTTON_CANCEL: 52 return model_->GetButtonLabel(ConfirmBubbleModel::BUTTON_CANCEL); 53 default: 54 NOTREACHED(); 55 return DialogDelegateView::GetDialogButtonLabel(button); 56 } 57} 58 59bool ConfirmBubbleViews::IsDialogButtonEnabled(ui::DialogButton button) const { 60 switch (button) { 61 case ui::DIALOG_BUTTON_OK: 62 return !!(model_->GetButtons() & ConfirmBubbleModel::BUTTON_OK); 63 case ui::DIALOG_BUTTON_CANCEL: 64 return !!(model_->GetButtons() & ConfirmBubbleModel::BUTTON_CANCEL); 65 default: 66 NOTREACHED(); 67 return false; 68 } 69} 70 71views::View* ConfirmBubbleViews::CreateExtraView() { 72 return link_; 73} 74 75bool ConfirmBubbleViews::Cancel() { 76 model_->Cancel(); 77 return true; 78} 79 80bool ConfirmBubbleViews::Accept() { 81 model_->Accept(); 82 return true; 83} 84 85ui::ModalType ConfirmBubbleViews::GetModalType() const { 86 return ui::MODAL_TYPE_WINDOW; 87} 88 89string16 ConfirmBubbleViews::GetWindowTitle() const { 90 return model_->GetTitle(); 91} 92 93void ConfirmBubbleViews::LinkClicked(views::Link* source, int event_flags) { 94 if (source == link_) { 95 model_->LinkClicked(); 96 GetWidget()->Close(); 97 } 98} 99 100namespace chrome { 101 102void ShowConfirmBubble(gfx::NativeView view, 103 const gfx::Point& origin, 104 ConfirmBubbleModel* model) { 105 CreateBrowserModalDialogViews(new ConfirmBubbleViews(model), view)->Show(); 106} 107 108} // namespace chrome 109