- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / user_data_dir_dialog_view.cc
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/user_data_dir_dialog_view.h"
6
7 #include "base/logging.h"
8 #include "base/run_loop.h"
9 #include "chrome/browser/ui/chrome_select_file_policy.h"
10 #include "chrome/browser/ui/user_data_dir_dialog.h"
11 #include "grit/chromium_strings.h"
12 #include "grit/generated_resources.h"
13 #include "ui/base/l10n/l10n_util.h"
14 #include "ui/views/controls/message_box_view.h"
15 #include "ui/views/widget/widget.h"
16
17 UserDataDirDialogView::UserDataDirDialogView(
18     const base::FilePath& user_data_dir)
19     : select_file_dialog_(ui::SelectFileDialog::Create(
20           this, new ChromeSelectFilePolicy(NULL))),
21       is_blocking_(true) {
22   const int kDialogWidth = 400;
23   views::MessageBoxView::InitParams params(
24       l10n_util::GetStringFUTF16(IDS_CANT_WRITE_USER_DIRECTORY_SUMMARY,
25                                  user_data_dir.LossyDisplayName()));
26   params.message_width = kDialogWidth;
27   message_box_view_ = new views::MessageBoxView(params);
28 }
29
30 UserDataDirDialogView::~UserDataDirDialogView() {
31   select_file_dialog_->ListenerDestroyed();
32 }
33
34 string16 UserDataDirDialogView::GetDialogButtonLabel(
35     ui::DialogButton button) const {
36   switch (button) {
37     case ui::DIALOG_BUTTON_OK:
38       return l10n_util::GetStringUTF16(
39           IDS_CANT_WRITE_USER_DIRECTORY_CHOOSE_DIRECTORY_BUTTON);
40     case ui::DIALOG_BUTTON_CANCEL:
41       return l10n_util::GetStringUTF16(
42           IDS_CANT_WRITE_USER_DIRECTORY_EXIT_BUTTON);
43     default:
44       NOTREACHED();
45   }
46   return string16();
47 }
48
49 string16 UserDataDirDialogView::GetWindowTitle() const {
50   return l10n_util::GetStringUTF16(IDS_CANT_WRITE_USER_DIRECTORY_TITLE);
51 }
52
53 void UserDataDirDialogView::DeleteDelegate() {
54   delete this;
55 }
56
57 bool UserDataDirDialogView::Accept() {
58   // Directory picker.
59   HWND owning_hwnd =
60       GetAncestor(message_box_view_->GetWidget()->GetNativeView(), GA_ROOT);
61   select_file_dialog_->SelectFile(
62       ui::SelectFileDialog::SELECT_FOLDER,
63       l10n_util::GetStringUTF16(
64           IDS_CANT_WRITE_USER_DIRECTORY_CHOOSE_DIRECTORY_BUTTON),
65       base::FilePath(), NULL, 0, base::FilePath::StringType(), owning_hwnd,
66       NULL);
67   return false;
68 }
69
70 bool UserDataDirDialogView::Cancel() {
71   is_blocking_ = false;
72   return true;
73 }
74
75 views::View* UserDataDirDialogView::GetContentsView() {
76   return message_box_view_;
77 }
78
79 views::Widget* UserDataDirDialogView::GetWidget() {
80   return message_box_view_->GetWidget();
81 }
82
83 const views::Widget* UserDataDirDialogView::GetWidget() const {
84   return message_box_view_->GetWidget();
85 }
86
87 bool UserDataDirDialogView::Dispatch(const base::NativeEvent& msg) {
88   TranslateMessage(&msg);
89   DispatchMessage(&msg);
90   return is_blocking_;
91 }
92
93 void UserDataDirDialogView::FileSelected(const base::FilePath& path,
94                                          int index,
95                                          void* params) {
96   user_data_dir_ = path;
97   is_blocking_ = false;
98 }
99
100 void UserDataDirDialogView::FileSelectionCanceled(void* params) {
101 }
102
103 namespace chrome {
104
105 base::FilePath ShowUserDataDirDialog(const base::FilePath& user_data_dir) {
106   DCHECK_EQ(base::MessageLoop::TYPE_UI, base::MessageLoop::current()->type());
107   // When the window closes, it will delete itself.
108   UserDataDirDialogView* dialog = new UserDataDirDialogView(user_data_dir);
109   views::DialogDelegate::CreateDialogWidget(dialog, NULL, NULL)->Show();
110   base::RunLoop run_loop(dialog);
111   run_loop.Run();
112   return dialog->user_data_dir();
113 }
114
115 }  // namespace chrome