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 116