// Copyright 2015 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. #ifndef CHROME_BROWSER_UI_LIBGTK2UI_SELECT_FILE_DIALOG_IMPL_GTK2_H_ #define CHROME_BROWSER_UI_LIBGTK2UI_SELECT_FILE_DIALOG_IMPL_GTK2_H_ #include "base/macros.h" #include "chrome/browser/ui/libgtk2ui/gtk2_signal.h" #include "chrome/browser/ui/libgtk2ui/gtk2_util.h" #include "chrome/browser/ui/libgtk2ui/select_file_dialog_impl.h" namespace libgtk2ui { // Implementation of SelectFileDialog that shows a Gtk common dialog for // choosing a file or folder. This acts as a modal dialog. class SelectFileDialogImplGTK : public SelectFileDialogImpl, public aura::WindowObserver { public: SelectFileDialogImplGTK(Listener* listener, ui::SelectFilePolicy* policy); protected: ~SelectFileDialogImplGTK() override; // BaseShellDialog implementation: bool IsRunning(gfx::NativeWindow parent_window) const override; // SelectFileDialog implementation. // |params| is user data we pass back via the Listener interface. void SelectFileImpl(Type type, const base::string16& title, const base::FilePath& default_path, const FileTypeInfo* file_types, int file_type_index, const base::FilePath::StringType& default_extension, gfx::NativeWindow owning_window, void* params) override; private: friend class FilePicker; bool HasMultipleFileTypeChoicesImpl() override; // Overridden from aura::WindowObserver: void OnWindowDestroying(aura::Window* window) override; // Add the filters from |file_types_| to |chooser|. void AddFilters(GtkFileChooser* chooser); // Notifies the listener that a single file was chosen. void FileSelected(GtkWidget* dialog, const base::FilePath& path); // Notifies the listener that multiple files were chosen. void MultiFilesSelected(GtkWidget* dialog, const std::vector& files); // Notifies the listener that no file was chosen (the action was canceled). // Dialog is passed so we can find that |params| pointer that was passed to // us when we were told to show the dialog. void FileNotSelected(GtkWidget* dialog); GtkWidget* CreateSelectFolderDialog( Type type, const std::string& title, const base::FilePath& default_path, gfx::NativeWindow parent); GtkWidget* CreateFileOpenDialog(const std::string& title, const base::FilePath& default_path, gfx::NativeWindow parent); GtkWidget* CreateMultiFileOpenDialog(const std::string& title, const base::FilePath& default_path, gfx::NativeWindow parent); GtkWidget* CreateSaveAsDialog(const std::string& title, const base::FilePath& default_path, gfx::NativeWindow parent); // Removes and returns the |params| associated with |dialog| from // |params_map_|. void* PopParamsForDialog(GtkWidget* dialog); // Take care of internal data structures when a file dialog is destroyed. void FileDialogDestroyed(GtkWidget* dialog); // Check whether response_id corresponds to the user cancelling/closing the // dialog. Used as a helper for the below callbacks. bool IsCancelResponse(gint response_id); // Common function for OnSelectSingleFileDialogResponse and // OnSelectSingleFolderDialogResponse. void SelectSingleFileHelper(GtkWidget* dialog, gint response_id, bool allow_folder); // Common function for CreateFileOpenDialog and CreateMultiFileOpenDialog. GtkWidget* CreateFileOpenHelper(const std::string& title, const base::FilePath& default_path, gfx::NativeWindow parent); // Callback for when the user responds to a Save As or Open File dialog. CHROMEGTK_CALLBACK_1(SelectFileDialogImplGTK, void, OnSelectSingleFileDialogResponse, int); // Callback for when the user responds to a Select Folder dialog. CHROMEGTK_CALLBACK_1(SelectFileDialogImplGTK, void, OnSelectSingleFolderDialogResponse, int); // Callback for when the user responds to a Open Multiple Files dialog. CHROMEGTK_CALLBACK_1(SelectFileDialogImplGTK, void, OnSelectMultiFileDialogResponse, int); // Callback for when the file chooser gets destroyed. CHROMEGTK_CALLBACK_0(SelectFileDialogImplGTK, void, OnFileChooserDestroy); // Callback for when we update the preview for the selection. CHROMEGTK_CALLBACK_0(SelectFileDialogImplGTK, void, OnUpdatePreview); // A map from dialog windows to the |params| user data associated with them. std::map params_map_; // The GtkImage widget for showing previews of selected images. GtkWidget* preview_; // All our dialogs. std::set dialogs_; // The set of all parent windows for which we are currently running dialogs. std::set parents_; DISALLOW_COPY_AND_ASSIGN(SelectFileDialogImplGTK); }; } // namespace libgtk2ui #endif // CHROME_BROWSER_UI_LIBGTK2UI_SELECT_FILE_DIALOG_IMPL_GTK2_H_