| // 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 UI_GTK_SELECT_FILE_DIALOG_IMPL_GTK_H_ |
| #define UI_GTK_SELECT_FILE_DIALOG_IMPL_GTK_H_ |
| |
| #include <map> |
| |
| #include "base/macros.h" |
| #include "ui/base/glib/glib_signal.h" |
| #include "ui/gtk/gtk_util.h" |
| #include "ui/gtk/select_file_dialog_impl.h" |
| |
| namespace gtk { |
| |
| // 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, |
| std::unique_ptr<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 std::u16string& 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<base::FilePath>& 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); |
| |
| // 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. |
| CHROMEG_CALLBACK_1(SelectFileDialogImplGTK, |
| void, |
| OnSelectSingleFileDialogResponse, |
| GtkWidget*, |
| int); |
| |
| // Callback for when the user responds to a Select Folder dialog. |
| CHROMEG_CALLBACK_1(SelectFileDialogImplGTK, |
| void, |
| OnSelectSingleFolderDialogResponse, |
| GtkWidget*, |
| int); |
| |
| // Callback for when the user responds to a Open Multiple Files dialog. |
| CHROMEG_CALLBACK_1(SelectFileDialogImplGTK, |
| void, |
| OnSelectMultiFileDialogResponse, |
| GtkWidget*, |
| int); |
| |
| // Callback for when the file chooser gets destroyed. |
| CHROMEG_CALLBACK_0(SelectFileDialogImplGTK, |
| void, |
| OnFileChooserDestroy, |
| GtkWidget*); |
| |
| #if BUILDFLAG(GTK_VERSION) < 4 |
| // Callback for when we update the preview for the selection. |
| CHROMEG_CALLBACK_0(SelectFileDialogImplGTK, |
| void, |
| OnUpdatePreview, |
| GtkWidget*); |
| #endif |
| |
| // A map from dialog windows to the |params| user data associated with them. |
| std::map<GtkWidget*, void*> params_map_; |
| |
| // GTK4 provides its own preview. |
| #if BUILDFLAG(GTK_VERSION) < 4 |
| // The GtkImage widget for showing previews of selected images. |
| GtkWidget* preview_ = nullptr; |
| #endif |
| |
| // Maps from dialogs to signal handler IDs. |
| std::map<GtkWidget*, unsigned long> dialogs_; |
| |
| // The set of all parent windows for which we are currently running dialogs. |
| std::set<aura::Window*> parents_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SelectFileDialogImplGTK); |
| }; |
| |
| } // namespace gtk |
| |
| #endif // UI_GTK_SELECT_FILE_DIALOG_IMPL_GTK_H_ |