Mailbox support for texture layers.
[chromium-blink-merge.git] / ui / base / dialogs / select_file_dialog.cc
blobac88cc4052b253cd840258dbe7705caf68a50afe
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.
5 #include "ui/base/dialogs/select_file_dialog.h"
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/message_loop.h"
10 #include "build/build_config.h"
11 #include "ui/base/dialogs/selected_file_info.h"
12 #include "ui/base/dialogs/select_file_dialog_factory.h"
13 #include "ui/base/dialogs/select_file_policy.h"
14 #include "ui/base/l10n/l10n_util.h"
15 #include "ui/base/linux_ui.h"
17 #if defined(OS_WIN)
18 #include "ui/base/dialogs/select_file_dialog_win.h"
19 #elif defined(OS_MACOSX)
20 #include "ui/base/dialogs/select_file_dialog_mac.h"
21 #elif defined(TOOLKIT_GTK)
22 #include "ui/base/dialogs/gtk/select_file_dialog_impl.h"
23 #elif defined(OS_ANDROID)
24 #include "ui/base/dialogs/select_file_dialog_android.h"
25 #endif
27 namespace {
29 // Optional dialog factory. Leaked.
30 ui::SelectFileDialogFactory* dialog_factory_ = NULL;
32 } // namespace
34 namespace ui {
36 SelectFileDialog::FileTypeInfo::FileTypeInfo()
37 : include_all_files(false),
38 support_gdata(false) {}
40 SelectFileDialog::FileTypeInfo::~FileTypeInfo() {}
42 void SelectFileDialog::Listener::FileSelectedWithExtraInfo(
43 const ui::SelectedFileInfo& file,
44 int index,
45 void* params) {
46 // Most of the dialogs need actual local path, so default to it.
47 FileSelected(file.local_path, index, params);
50 void SelectFileDialog::Listener::MultiFilesSelectedWithExtraInfo(
51 const std::vector<ui::SelectedFileInfo>& files,
52 void* params) {
53 std::vector<FilePath> file_paths;
54 for (size_t i = 0; i < files.size(); ++i)
55 file_paths.push_back(files[i].local_path);
57 MultiFilesSelected(file_paths, params);
60 // static
61 void SelectFileDialog::SetFactory(ui::SelectFileDialogFactory* factory) {
62 delete dialog_factory_;
63 dialog_factory_ = factory;
66 // static
67 SelectFileDialog* SelectFileDialog::Create(Listener* listener,
68 ui::SelectFilePolicy* policy) {
69 if (dialog_factory_) {
70 SelectFileDialog* dialog = dialog_factory_->Create(listener, policy);
71 if (dialog)
72 return dialog;
75 #if defined(USE_AURA) && !defined(USE_ASH) && defined(OS_LINUX)
76 const ui::LinuxUI* linux_ui = ui::LinuxUI::instance();
77 if (linux_ui)
78 return linux_ui->CreateSelectFileDialog(listener, policy);
79 #endif
81 #if defined(OS_WIN) && !defined(USE_AURA)
82 // TODO(port): The windows people need this to work in aura, too.
83 return CreateWinSelectFileDialog(listener, policy);
84 #elif defined(OS_MACOSX) && !defined(USE_AURA)
85 return CreateMacSelectFileDialog(listener, policy);
86 #elif defined(TOOLKIT_GTK)
87 return CreateLinuxSelectFileDialog(listener, policy);
88 #elif defined(OS_ANDROID)
89 return CreateAndroidSelectFileDialog(listener, policy);
90 #endif
92 return NULL;
95 void SelectFileDialog::SelectFile(Type type,
96 const string16& title,
97 const FilePath& default_path,
98 const FileTypeInfo* file_types,
99 int file_type_index,
100 const FilePath::StringType& default_extension,
101 gfx::NativeWindow owning_window,
102 void* params) {
103 DCHECK(listener_);
105 if (select_file_policy_.get() &&
106 !select_file_policy_->CanOpenSelectFileDialog()) {
107 select_file_policy_->SelectFileDenied();
109 // Inform the listener that no file was selected.
110 // Post a task rather than calling FileSelectionCanceled directly to ensure
111 // that the listener is called asynchronously.
112 MessageLoop::current()->PostTask(
113 FROM_HERE, base::Bind(&SelectFileDialog::CancelFileSelection, this,
114 params));
115 return;
118 // Call the platform specific implementation of the file selection dialog.
119 SelectFileImpl(type, title, default_path, file_types, file_type_index,
120 default_extension, owning_window, params);
123 bool SelectFileDialog::HasMultipleFileTypeChoices() {
124 return HasMultipleFileTypeChoicesImpl();
127 SelectFileDialog::SelectFileDialog(Listener* listener,
128 ui::SelectFilePolicy* policy)
129 : listener_(listener),
130 select_file_policy_(policy) {
131 DCHECK(listener_);
134 SelectFileDialog::~SelectFileDialog() {}
136 void SelectFileDialog::CancelFileSelection(void* params) {
137 if (listener_)
138 listener_->FileSelectionCanceled(params);
141 } // namespace ui