| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/shell_dialogs/select_file_dialog_win.h" | 5 #include "ui/shell_dialogs/select_file_dialog_win.h" |
| 6 | 6 |
| 7 #include <shlobj.h> | 7 #include <shlobj.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <set> | 10 #include <set> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
| 14 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
| 15 #include "base/i18n/case_conversion.h" | 15 #include "base/i18n/case_conversion.h" |
| 16 #include "base/message_loop/message_loop.h" | 16 #include "base/message_loop/message_loop.h" |
| 17 #include "base/message_loop/message_loop_proxy.h" | |
| 18 #include "base/threading/thread.h" | 17 #include "base/threading/thread.h" |
| 19 #include "base/tuple.h" | 18 #include "base/tuple.h" |
| 20 #include "base/win/registry.h" | 19 #include "base/win/registry.h" |
| 21 #include "base/win/scoped_comptr.h" | 20 #include "base/win/scoped_comptr.h" |
| 22 #include "base/win/shortcut.h" | 21 #include "base/win/shortcut.h" |
| 23 #include "ui/aura/window.h" | 22 #include "ui/aura/window.h" |
| 24 #include "ui/aura/window_event_dispatcher.h" | 23 #include "ui/aura/window_event_dispatcher.h" |
| 25 #include "ui/aura/window_tree_host.h" | 24 #include "ui/aura/window_tree_host.h" |
| 26 #include "ui/base/l10n/l10n_util.h" | 25 #include "ui/base/l10n/l10n_util.h" |
| 27 #include "ui/base/win/open_file_name_win.h" | 26 #include "ui/base/win/open_file_name_win.h" |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 const std::wstring& default_extension, | 193 const std::wstring& default_extension, |
| 195 RunState run_state, | 194 RunState run_state, |
| 196 HWND owner, | 195 HWND owner, |
| 197 void* params) | 196 void* params) |
| 198 : type(type), | 197 : type(type), |
| 199 title(title), | 198 title(title), |
| 200 default_path(default_path), | 199 default_path(default_path), |
| 201 file_type_index(file_type_index), | 200 file_type_index(file_type_index), |
| 202 default_extension(default_extension), | 201 default_extension(default_extension), |
| 203 run_state(run_state), | 202 run_state(run_state), |
| 204 ui_proxy(base::MessageLoopForUI::current()->message_loop_proxy()), | 203 ui_task_runner(base::MessageLoopForUI::current()->task_runner()), |
| 205 owner(owner), | 204 owner(owner), |
| 206 params(params) { | 205 params(params) { |
| 207 if (file_types) | 206 if (file_types) |
| 208 this->file_types = *file_types; | 207 this->file_types = *file_types; |
| 209 } | 208 } |
| 210 SelectFileDialog::Type type; | 209 SelectFileDialog::Type type; |
| 211 std::wstring title; | 210 std::wstring title; |
| 212 base::FilePath default_path; | 211 base::FilePath default_path; |
| 213 FileTypeInfo file_types; | 212 FileTypeInfo file_types; |
| 214 int file_type_index; | 213 int file_type_index; |
| 215 std::wstring default_extension; | 214 std::wstring default_extension; |
| 216 RunState run_state; | 215 RunState run_state; |
| 217 scoped_refptr<base::MessageLoopProxy> ui_proxy; | 216 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner; |
| 218 HWND owner; | 217 HWND owner; |
| 219 void* params; | 218 void* params; |
| 220 }; | 219 }; |
| 221 | 220 |
| 222 // Shows the file selection dialog modal to |owner| and calls the result | 221 // Shows the file selection dialog modal to |owner| and calls the result |
| 223 // back on the ui thread. Run on the dialog thread. | 222 // back on the ui thread. Run on the dialog thread. |
| 224 void ExecuteSelectFile(const ExecuteSelectParams& params); | 223 void ExecuteSelectFile(const ExecuteSelectParams& params); |
| 225 | 224 |
| 226 // Prompt the user for location to save a file. | 225 // Prompt the user for location to save a file. |
| 227 // Callers should provide the filter string, and also a filter index. | 226 // Callers should provide the filter string, and also a filter index. |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 if (success) | 434 if (success) |
| 436 path = base::FilePath(path_as_wstring); | 435 path = base::FilePath(path_as_wstring); |
| 437 DisableOwner(params.run_state.owner); | 436 DisableOwner(params.run_state.owner); |
| 438 } else if (params.type == SELECT_OPEN_FILE) { | 437 } else if (params.type == SELECT_OPEN_FILE) { |
| 439 success = RunOpenFileDialog(params.title, filter, | 438 success = RunOpenFileDialog(params.title, filter, |
| 440 params.run_state.owner, &path); | 439 params.run_state.owner, &path); |
| 441 } else if (params.type == SELECT_OPEN_MULTI_FILE) { | 440 } else if (params.type == SELECT_OPEN_MULTI_FILE) { |
| 442 std::vector<base::FilePath> paths; | 441 std::vector<base::FilePath> paths; |
| 443 if (RunOpenMultiFileDialog(params.title, filter, | 442 if (RunOpenMultiFileDialog(params.title, filter, |
| 444 params.run_state.owner, &paths)) { | 443 params.run_state.owner, &paths)) { |
| 445 params.ui_proxy->PostTask( | 444 params.ui_task_runner->PostTask( |
| 446 FROM_HERE, | 445 FROM_HERE, base::Bind(&SelectFileDialogImpl::MultiFilesSelected, this, |
| 447 base::Bind(&SelectFileDialogImpl::MultiFilesSelected, this, paths, | 446 paths, params.params, params.run_state)); |
| 448 params.params, params.run_state)); | |
| 449 return; | 447 return; |
| 450 } | 448 } |
| 451 } | 449 } |
| 452 | 450 |
| 453 if (success) { | 451 if (success) { |
| 454 params.ui_proxy->PostTask( | 452 params.ui_task_runner->PostTask( |
| 455 FROM_HERE, | 453 FROM_HERE, base::Bind(&SelectFileDialogImpl::FileSelected, this, path, |
| 456 base::Bind(&SelectFileDialogImpl::FileSelected, this, path, | 454 filter_index, params.params, params.run_state)); |
| 457 filter_index, params.params, params.run_state)); | |
| 458 } else { | 455 } else { |
| 459 params.ui_proxy->PostTask( | 456 params.ui_task_runner->PostTask( |
| 460 FROM_HERE, | 457 FROM_HERE, base::Bind(&SelectFileDialogImpl::FileNotSelected, this, |
| 461 base::Bind(&SelectFileDialogImpl::FileNotSelected, this, params.params, | 458 params.params, params.run_state)); |
| 462 params.run_state)); | |
| 463 } | 459 } |
| 464 } | 460 } |
| 465 | 461 |
| 466 bool SelectFileDialogImpl::SaveFileAsWithFilter( | 462 bool SelectFileDialogImpl::SaveFileAsWithFilter( |
| 467 HWND owner, | 463 HWND owner, |
| 468 const std::wstring& suggested_name, | 464 const std::wstring& suggested_name, |
| 469 const std::wstring& filter, | 465 const std::wstring& filter, |
| 470 const std::wstring& def_ext, | 466 const std::wstring& def_ext, |
| 471 bool ignore_suggested_ext, | 467 bool ignore_suggested_ext, |
| 472 unsigned* index, | 468 unsigned* index, |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 SelectFileDialog* CreateDefaultWinSelectFileDialog( | 762 SelectFileDialog* CreateDefaultWinSelectFileDialog( |
| 767 SelectFileDialog::Listener* listener, | 763 SelectFileDialog::Listener* listener, |
| 768 SelectFilePolicy* policy) { | 764 SelectFilePolicy* policy) { |
| 769 return CreateWinSelectFileDialog(listener, | 765 return CreateWinSelectFileDialog(listener, |
| 770 policy, | 766 policy, |
| 771 base::Bind(&CallBuiltinGetOpenFileName), | 767 base::Bind(&CallBuiltinGetOpenFileName), |
| 772 base::Bind(&CallBuiltinGetSaveFileName)); | 768 base::Bind(&CallBuiltinGetSaveFileName)); |
| 773 } | 769 } |
| 774 | 770 |
| 775 } // namespace ui | 771 } // namespace ui |
| OLD | NEW |