Index: chrome/browser/ui/views/select_file_dialog.cc |
diff --git a/chrome/browser/ui/views/select_file_dialog.cc b/chrome/browser/ui/views/select_file_dialog.cc |
deleted file mode 100644 |
index 288d2ed7fcc4e648bfcd042670f0a152ac4d06ff..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/views/select_file_dialog.cc |
+++ /dev/null |
@@ -1,487 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/ui/shell_dialogs.h" |
- |
-#include "base/bind.h" |
-#include "base/file_path.h" |
-#include "base/json/json_reader.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/string_util.h" |
-#include "base/sys_string_conversions.h" |
-#include "base/utf_string_conversions.h" |
-#include "base/values.h" |
-#include "chrome/browser/profiles/profile_manager.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_dialogs.h" |
-#include "chrome/browser/ui/browser_list.h" |
-#include "chrome/browser/ui/views/html_dialog_view.h" |
-#include "chrome/browser/ui/webui/html_dialog_ui.h" |
-#include "chrome/common/url_constants.h" |
-#include "content/browser/tab_contents/tab_contents.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "grit/generated_resources.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "views/window/non_client_view.h" |
- |
-using content::BrowserThread; |
- |
-namespace { |
- |
-const char kKeyNamePath[] = "path"; |
-const int kSaveCompletePageIndex = 2; |
- |
-} // namespace |
- |
-// Implementation of SelectFileDialog that shows an UI for choosing a file |
-// or folder. |
-class SelectFileDialogImpl : public SelectFileDialog { |
- public: |
- explicit SelectFileDialogImpl(Listener* listener); |
- |
- // BaseShellDialog implementation. |
- virtual bool IsRunning(gfx::NativeWindow parent_window) const; |
- virtual void ListenerDestroyed(); |
- |
- protected: |
- // SelectFileDialog implementation. |
- // |params| is user data we pass back via the Listener interface. |
- virtual void SelectFileImpl(Type type, |
- const string16& title, |
- const FilePath& default_path, |
- const FileTypeInfo* file_types, |
- int file_type_index, |
- const FilePath::StringType& default_extension, |
- gfx::NativeWindow owning_window, |
- void* params); |
- virtual bool HasMultipleFileTypeChoicesImpl(); |
- |
- private: |
- virtual ~SelectFileDialogImpl(); |
- |
- class FileBrowseDelegate : public HtmlDialogUIDelegate { |
- public: |
- FileBrowseDelegate(SelectFileDialogImpl* owner, |
- Type type, |
- const std::wstring& title, |
- const FilePath& default_path, |
- const FileTypeInfo* file_types, |
- int file_type_index, |
- const FilePath::StringType& default_extension, |
- gfx::NativeWindow parent, |
- void* params); |
- |
- // Owner of this FileBrowseDelegate. |
- scoped_refptr<SelectFileDialogImpl> owner_; |
- |
- // Parent window. |
- gfx::NativeWindow parent_; |
- |
- // The type of dialog we are showing the user. |
- Type type_; |
- |
- // The dialog title. |
- string16 title_; |
- |
- // Default path of the file dialog. |
- FilePath default_path_; |
- |
- // The file filters. |
- FileTypeInfo file_types_; |
- |
- // The index of the default selected file filter. |
- // Note: This starts from 1, not 0. |
- int file_type_index_; |
- |
- // Default extension to be added to file if user does not type one. |
- FilePath::StringType default_extension_; |
- |
- // Associated user data. |
- void* params_; |
- |
- private: |
- ~FileBrowseDelegate(); |
- |
- // Overridden from HtmlDialogUI::Delegate: |
- virtual bool IsDialogModal() const OVERRIDE; |
- virtual string16 GetDialogTitle() const OVERRIDE; |
- virtual GURL GetDialogContentURL() const OVERRIDE; |
- virtual void GetWebUIMessageHandlers( |
- std::vector<WebUIMessageHandler*>* handlers) const OVERRIDE; |
- virtual void GetDialogSize(gfx::Size* size) const OVERRIDE; |
- virtual std::string GetDialogArgs() const OVERRIDE; |
- virtual void OnDialogClosed(const std::string& json_retval) OVERRIDE; |
- virtual void OnCloseContents(TabContents* source, bool* out_close_dialog) |
- OVERRIDE { |
- } |
- virtual bool ShouldShowDialogTitle() const OVERRIDE { return true; } |
- virtual bool HandleContextMenu(const ContextMenuParams& params) OVERRIDE { |
- return true; |
- } |
- |
- DISALLOW_COPY_AND_ASSIGN(FileBrowseDelegate); |
- }; |
- |
- class FileBrowseDelegateHandler : public WebUIMessageHandler { |
- public: |
- explicit FileBrowseDelegateHandler(FileBrowseDelegate* delegate); |
- |
- // WebUIMessageHandler implementation. |
- virtual void RegisterMessages() OVERRIDE; |
- |
- // Callback for the "setDialogTitle" message. |
- void HandleSetDialogTitle(const ListValue* args); |
- |
- private: |
- FileBrowseDelegate* delegate_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FileBrowseDelegateHandler); |
- }; |
- |
- // Notification from FileBrowseDelegate when file browse UI is dismissed. |
- void OnDialogClosed(FileBrowseDelegate* delegate, const std::string& json); |
- |
- // The set of all parent windows for which we are currently running dialogs. |
- std::set<gfx::NativeWindow> parents_; |
- |
- // The set of all FileBrowseDelegate that we are currently running. |
- std::set<FileBrowseDelegate*> delegates_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SelectFileDialogImpl); |
-}; |
- |
-// static |
-SelectFileDialog* SelectFileDialog::Create(Listener* listener) { |
- DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
- return new SelectFileDialogImpl(listener); |
-} |
- |
-SelectFileDialogImpl::SelectFileDialogImpl(Listener* listener) |
- : SelectFileDialog(listener) { |
-} |
- |
-SelectFileDialogImpl::~SelectFileDialogImpl() { |
- // All dialogs should be dismissed by now. |
- DCHECK(parents_.empty() && delegates_.empty()); |
-} |
- |
-bool SelectFileDialogImpl::IsRunning(gfx::NativeWindow parent_window) const { |
- return parent_window && parents_.find(parent_window) != parents_.end(); |
-} |
- |
-void SelectFileDialogImpl::ListenerDestroyed() { |
- listener_ = NULL; |
-} |
- |
-void SelectFileDialogImpl::SelectFileImpl( |
- Type type, |
- const string16& title, |
- const FilePath& default_path, |
- const FileTypeInfo* file_types, |
- int file_type_index, |
- const FilePath::StringType& default_extension, |
- gfx::NativeWindow owning_window, |
- void* params) { |
- std::wstring title_string; |
- if (title.empty()) { |
- int string_id; |
- switch (type) { |
- case SELECT_FOLDER: |
- string_id = IDS_SELECT_FOLDER_DIALOG_TITLE; |
- break; |
- case SELECT_OPEN_FILE: |
- case SELECT_OPEN_MULTI_FILE: |
- string_id = IDS_OPEN_FILE_DIALOG_TITLE; |
- break; |
- case SELECT_SAVEAS_FILE: |
- string_id = IDS_SAVE_AS_DIALOG_TITLE; |
- break; |
- default: |
- NOTREACHED(); |
- return; |
- } |
- title_string = UTF16ToWide(l10n_util::GetStringUTF16(string_id)); |
- } else { |
- title_string = UTF16ToWide(title); |
- } |
- |
- if (owning_window) |
- parents_.insert(owning_window); |
- |
- FileBrowseDelegate* file_browse_delegate = new FileBrowseDelegate(this, |
- type, title_string, default_path, file_types, file_type_index, |
- default_extension, owning_window, params); |
- delegates_.insert(file_browse_delegate); |
- |
- Browser* browser = BrowserList::FindBrowserWithWindow(owning_window); |
- // As SelectFile may be invoked after a delay, it is entirely possible for |
- // it be invoked when no browser is around. Silently ignore this case. |
- if (browser) |
- browser->BrowserShowHtmlDialog(file_browse_delegate, owning_window); |
-} |
- |
-bool SelectFileDialogImpl::HasMultipleFileTypeChoicesImpl() { |
- return file_types_.extensions.size() > 1; |
-} |
- |
-void SelectFileDialogImpl::OnDialogClosed(FileBrowseDelegate* delegate, |
- const std::string& json) { |
- // Nothing to do if listener_ is gone. |
- |
- if (!listener_) |
- return; |
- |
- bool notification_fired = false; |
- |
- if (!json.empty()) { |
- scoped_ptr<Value> value(base::JSONReader::Read(json, false)); |
- if (!value.get() || !value->IsType(Value::TYPE_DICTIONARY)) { |
- // Bad json value returned. |
- NOTREACHED(); |
- } else { |
- const DictionaryValue* dict = static_cast<DictionaryValue*>(value.get()); |
- if (delegate->type_ == SELECT_OPEN_FILE || |
- delegate->type_ == SELECT_SAVEAS_FILE || |
- delegate->type_ == SELECT_FOLDER) { |
- std::string path_string; |
- if (dict->HasKey(kKeyNamePath) && |
- dict->GetString(kKeyNamePath, &path_string)) { |
-#if defined(OS_WIN) |
- FilePath path(base::SysUTF8ToWide(path_string)); |
-#else |
- FilePath path( |
- base::SysWideToNativeMB(base::SysUTF8ToWide(path_string))); |
-#endif |
- listener_-> |
- FileSelected(path, kSaveCompletePageIndex, delegate->params_); |
- notification_fired = true; |
- } |
- } else if (delegate->type_ == SELECT_OPEN_MULTI_FILE) { |
- ListValue* paths_value = NULL; |
- if (dict->HasKey(kKeyNamePath) && |
- dict->GetList(kKeyNamePath, &paths_value) && |
- paths_value) { |
- std::vector<FilePath> paths; |
- paths.reserve(paths_value->GetSize()); |
- for (size_t i = 0; i < paths_value->GetSize(); ++i) { |
- std::string path_string; |
- if (paths_value->GetString(i, &path_string) && |
- !path_string.empty()) { |
-#if defined(OS_WIN) |
- FilePath path(base::SysUTF8ToWide(path_string)); |
-#else |
- FilePath path( |
- base::SysWideToNativeMB(base::SysUTF8ToWide(path_string))); |
-#endif |
- paths.push_back(path); |
- } |
- } |
- |
- listener_->MultiFilesSelected(paths, delegate->params_); |
- notification_fired = true; |
- } |
- } else { |
- NOTREACHED(); |
- } |
- } |
- } |
- |
- // Always notify listener when dialog is dismissed. |
- if (!notification_fired) |
- listener_->FileSelectionCanceled(delegate->params_); |
- |
- parents_.erase(delegate->parent_); |
- delegates_.erase(delegate); |
-} |
- |
-SelectFileDialogImpl::FileBrowseDelegate::FileBrowseDelegate( |
- SelectFileDialogImpl* owner, |
- Type type, |
- const std::wstring& title, |
- const FilePath& default_path, |
- const FileTypeInfo* file_types, |
- int file_type_index, |
- const FilePath::StringType& default_extension, |
- gfx::NativeWindow parent, |
- void* params) |
- : owner_(owner), |
- parent_(parent), |
- type_(type), |
- title_(WideToUTF16Hack(title)), |
- default_path_(default_path), |
- file_type_index_(file_type_index), |
- default_extension_(default_extension), |
- params_(params) { |
- if (file_types) |
- file_types_ = *file_types; |
- else |
- file_types_.include_all_files = true; |
-} |
- |
-SelectFileDialogImpl::FileBrowseDelegate::~FileBrowseDelegate() { |
-} |
- |
-bool SelectFileDialogImpl::FileBrowseDelegate::IsDialogModal() const { |
- return true; |
-} |
- |
-string16 SelectFileDialogImpl::FileBrowseDelegate::GetDialogTitle() const { |
- return title_; |
-} |
- |
-GURL SelectFileDialogImpl::FileBrowseDelegate::GetDialogContentURL() const { |
-#if defined(USE_AURA) |
- // TODO(saintlou): The current SelectFileDialogImpl assumes chromeos==1 |
- std::string url_string; |
-#else |
- std::string url_string(chrome::kChromeUIFileBrowseURL); |
-#endif |
- return GURL(url_string); |
-} |
- |
-void SelectFileDialogImpl::FileBrowseDelegate::GetWebUIMessageHandlers( |
- std::vector<WebUIMessageHandler*>* handlers) const { |
- handlers->push_back(new FileBrowseDelegateHandler( |
- const_cast<FileBrowseDelegate*>(this))); |
- return; |
-} |
- |
-void SelectFileDialogImpl::FileBrowseDelegate::GetDialogSize( |
- gfx::Size* size) const { |
- size->SetSize(320, 240); |
-} |
- |
-std::string SelectFileDialogImpl::FileBrowseDelegate::GetDialogArgs() const { |
-#if defined(USE_AURA) |
- // TODO(saintlou): The current SelectFileDialogImpl does not seem to work |
- // when chromeos==0. |
- return std::string(); |
-#else |
- // SelectFile inputs as json. |
- // { |
- // "type" : "open", // (or "open_multiple", "save", "folder" |
- // "all_files" : true, |
- // "file_types" : { |
- // "exts" : [ ["htm", "html"], ["txt"] ], |
- // "desc" : [ "HTML files", "Text files" ], |
- // }, |
- // "file_type_index" : 1, // 1-based file type index. |
- // } |
- // See browser/ui/shell_dialogs.h for more details. |
- |
- std::string type_string; |
- switch (type_) { |
- case SELECT_FOLDER: |
- type_string = "folder"; |
- break; |
- case SELECT_OPEN_FILE: |
- type_string = "open"; |
- break; |
- case SELECT_OPEN_MULTI_FILE: |
- type_string = "open_multiple"; |
- break; |
- case SELECT_SAVEAS_FILE: |
- type_string = "save"; |
- break; |
- default: |
- NOTREACHED(); |
- return std::string(); |
- } |
- |
- std::string exts_list; |
- std::string desc_list; |
- for (size_t i = 0; i < file_types_.extensions.size(); ++i) { |
- DCHECK(!file_types_.extensions[i].empty()); |
- |
- std::string exts; |
- for (size_t j = 0; j < file_types_.extensions[i].size(); ++j) { |
- if (!exts.empty()) |
- exts.append(","); |
- base::StringAppendF(&exts, "\"%s\"", |
- file_types_.extensions[i][j].c_str()); |
- } |
- |
- if (!exts_list.empty()) |
- exts_list.append(","); |
- base::StringAppendF(&exts_list, "[%s]", exts.c_str()); |
- |
- std::string desc; |
- if (i < file_types_.extension_description_overrides.size()) { |
- desc = UTF16ToUTF8(file_types_.extension_description_overrides[i]); |
- } else { |
-#if defined(OS_WIN) |
- desc = WideToUTF8(file_types_.extensions[i][0]); |
-#elif defined(OS_POSIX) |
- desc = file_types_.extensions[i][0]; |
-#else |
- NOTIMPLEMENTED(); |
-#endif |
- } |
- |
- if (!desc_list.empty()) |
- desc_list.append(","); |
- base::StringAppendF(&desc_list, "\"%s\"", desc.c_str()); |
- } |
- |
- std::string filename = default_path_.BaseName().value(); |
- |
- return StringPrintf("{" |
- "\"type\":\"%s\"," |
- "\"all_files\":%s," |
- "\"current_file\":\"%s\"," |
- "\"file_types\":{\"exts\":[%s],\"desc\":[%s]}," |
- "\"file_type_index\":%d" |
- "}", |
- type_string.c_str(), |
- file_types_.include_all_files ? "true" : "false", |
- filename.c_str(), |
- exts_list.c_str(), |
- desc_list.c_str(), |
- file_type_index_); |
-#endif |
-} |
- |
-void SelectFileDialogImpl::FileBrowseDelegate::OnDialogClosed( |
- const std::string& json_retval) { |
- owner_->OnDialogClosed(this, json_retval); |
- delete this; |
- return; |
-} |
- |
-SelectFileDialogImpl::FileBrowseDelegateHandler::FileBrowseDelegateHandler( |
- FileBrowseDelegate* delegate) |
- : delegate_(delegate) { |
-} |
- |
-void SelectFileDialogImpl::FileBrowseDelegateHandler::RegisterMessages() { |
- web_ui_->RegisterMessageCallback("setDialogTitle", |
- base::Bind(&FileBrowseDelegateHandler::HandleSetDialogTitle, this)); |
-} |
- |
-void SelectFileDialogImpl::FileBrowseDelegateHandler::HandleSetDialogTitle( |
- const ListValue* args) { |
-#if !defined(USE_AURA) |
- // TODO(saintlou): The current SelectFileDialogImpl does not seem to work |
- // when chromeos==0. |
- std::wstring new_title = UTF16ToWideHack(ExtractStringValue(args)); |
- if (new_title != delegate_->title_) { |
- delegate_->title_ = new_title; |
- |
- // Notify the containing view about the title change. |
- // The current HtmlDialogUIDelegate and HtmlDialogView does not support |
- // dynamic title change. We hijacked the mechanism between HTMLDialogUI |
- // and HtmlDialogView to get the HtmlDialogView and forced it to update |
- // its title. |
- // TODO(xiyuan): Change this when the infrastructure is improved. |
- HtmlDialogUIDelegate** delegate = HtmlDialogUI::GetPropertyAccessor(). |
- GetProperty(web_ui_->tab_contents()->property_bag()); |
- HtmlDialogView* containing_view = static_cast<HtmlDialogView*>(*delegate); |
- DCHECK(containing_view); |
- |
- containing_view->GetWindow()->UpdateWindowTitle(); |
- containing_view->GetWindow()->non_client_view()->SchedulePaint(); |
- } |
-#endif |
-} |