// 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*);

  // Callback for when we update the preview for the selection. Only used on
  // GTK3.
  CHROMEG_CALLBACK_0(SelectFileDialogImplGTK,
                     void,
                     OnUpdatePreview,
                     GtkWidget*);

  // A map from dialog windows to the |params| user data associated with them.
  std::map<GtkWidget*, void*> params_map_;

  // Only used on GTK3 since GTK4 provides its own preview.
  // The GtkImage widget for showing previews of selected images.
  GtkWidget* preview_ = nullptr;

  // 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_
