tab_modal_confirm_dialog_views.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/views/tab_modal_confirm_dialog_views.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/browser_window.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/tab_modal_confirm_dialog_delegate.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_host.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/web_contents.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "grit/generated_resources.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/window_open_disposition.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/controls/message_box_view.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/layout/layout_constants.h"
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/views/widget/widget.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/window/dialog_client_view.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using web_modal::WebContentsModalDialogManager;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using web_modal::WebContentsModalDialogManagerDelegate;
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TabModalConfirmDialog* TabModalConfirmDialog::Create(
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TabModalConfirmDialogDelegate* delegate,
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::WebContents* web_contents) {
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return new TabModalConfirmDialogViews(
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      delegate, web_contents);
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// TabModalConfirmDialogViews, constructor & destructor:
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TabModalConfirmDialogViews::TabModalConfirmDialogViews(
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TabModalConfirmDialogDelegate* delegate,
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::WebContents* web_contents)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : delegate_(delegate),
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dialog_(NULL) {
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  views::MessageBoxView::InitParams init_params(delegate->GetDialogMessage());
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  init_params.inter_row_vertical_spacing =
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      views::kUnrelatedControlVerticalSpacing;
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  message_box_view_ = new views::MessageBoxView(init_params);
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::string16 link_text(delegate->GetLinkText());
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!link_text.empty())
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    message_box_view_->SetLink(link_text, this);
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebContentsModalDialogManager* web_contents_modal_dialog_manager =
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      WebContentsModalDialogManager::FromWebContents(web_contents);
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebContentsModalDialogManagerDelegate* modal_delegate =
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      web_contents_modal_dialog_manager->delegate();
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(modal_delegate);
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dialog_ = views::Widget::CreateWindowAsFramelessChild(
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      this, modal_delegate->GetWebContentsModalDialogHost()->GetHostView());
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  web_contents_modal_dialog_manager->ShowModalDialog(
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dialog_->GetNativeView());
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->set_close_delegate(this);
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TabModalConfirmDialogViews::~TabModalConfirmDialogViews() {
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TabModalConfirmDialogViews::AcceptTabModalDialog() {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetDialogClientView()->AcceptWindow();
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TabModalConfirmDialogViews::CancelTabModalDialog() {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GetDialogClientView()->CancelWindow();
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void TabModalConfirmDialogViews::CloseDialog() {
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dialog_->Close();
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//////////////////////////////////////////////////////////////////////////////
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// TabModalConfirmDialogViews, views::LinkListener implementation:
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void TabModalConfirmDialogViews::LinkClicked(views::Link* source,
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             int event_flags) {
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  delegate_->LinkClicked(ui::DispositionFromEventFlags(event_flags));
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TabModalConfirmDialogViews, views::DialogDelegate implementation:
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 TabModalConfirmDialogViews::GetWindowTitle() const {
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return delegate_->GetTitle();
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 TabModalConfirmDialogViews::GetDialogButtonLabel(
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ui::DialogButton button) const {
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (button == ui::DIALOG_BUTTON_OK)
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return delegate_->GetAcceptButtonTitle();
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (button == ui::DIALOG_BUTTON_CANCEL)
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return delegate_->GetCancelButtonTitle();
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return base::string16();
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool TabModalConfirmDialogViews::Cancel() {
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  delegate_->Cancel();
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return true;
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool TabModalConfirmDialogViews::Accept() {
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->Accept();
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return true;
112}
113
114bool TabModalConfirmDialogViews::Close() {
115  delegate_->Close();
116  return true;
117}
118
119///////////////////////////////////////////////////////////////////////////////
120// TabModalConfirmDialogViews, views::WidgetDelegate implementation:
121
122views::View* TabModalConfirmDialogViews::GetContentsView() {
123  return message_box_view_;
124}
125
126views::Widget* TabModalConfirmDialogViews::GetWidget() {
127  return message_box_view_->GetWidget();
128}
129
130const views::Widget* TabModalConfirmDialogViews::GetWidget() const {
131  return message_box_view_->GetWidget();
132}
133
134void TabModalConfirmDialogViews::DeleteDelegate() {
135  delete this;
136}
137
138ui::ModalType TabModalConfirmDialogViews::GetModalType() const {
139#if defined(USE_ASH)
140  return ui::MODAL_TYPE_CHILD;
141#else
142  return views::WidgetDelegate::GetModalType();
143#endif
144}
145