1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #ifndef nsFilePicker_h__
7 #define nsFilePicker_h__
8 
9 #include <gtk/gtk.h>
10 
11 #include "nsBaseFilePicker.h"
12 #include "nsString.h"
13 #include "nsTArray.h"
14 #include "nsCOMArray.h"
15 
16 class nsIWidget;
17 class nsIFile;
18 
19 class nsFilePicker : public nsBaseFilePicker {
20  public:
21   nsFilePicker();
22 
23   NS_DECL_ISUPPORTS
24 
25   // nsIFilePicker (less what's in nsBaseFilePicker)
26   NS_IMETHOD Open(nsIFilePickerShownCallback* aCallback) override;
27   NS_IMETHOD AppendFilters(int32_t aFilterMask) override;
28   NS_IMETHOD AppendFilter(const nsAString& aTitle,
29                           const nsAString& aFilter) override;
30   NS_IMETHOD SetDefaultString(const nsAString& aString) override;
31   NS_IMETHOD GetDefaultString(nsAString& aString) override;
32   NS_IMETHOD SetDefaultExtension(const nsAString& aExtension) override;
33   NS_IMETHOD GetDefaultExtension(nsAString& aExtension) override;
34   NS_IMETHOD GetFilterIndex(int32_t* aFilterIndex) override;
35   NS_IMETHOD SetFilterIndex(int32_t aFilterIndex) override;
36   NS_IMETHOD GetFile(nsIFile** aFile) override;
37   NS_IMETHOD GetFileURL(nsIURI** aFileURL) override;
38   NS_IMETHOD GetFiles(nsISimpleEnumerator** aFiles) override;
39 
40   // nsBaseFilePicker
41   virtual void InitNative(nsIWidget* aParent, const nsAString& aTitle) override;
42 
43   static void Shutdown();
44 
45  protected:
46   virtual ~nsFilePicker();
47 
48   nsresult Show(int16_t* aReturn) override;
49   void ReadValuesFromFileChooser(void* file_chooser);
50 
51   static void OnResponse(void* file_chooser, gint response_id,
52                          gpointer user_data);
53   static void OnDestroy(GtkWidget* file_chooser, gpointer user_data);
54   void Done(void* file_chooser, gint response_id);
55 
56   nsCOMPtr<nsIWidget> mParentWidget;
57   nsCOMPtr<nsIFilePickerShownCallback> mCallback;
58   nsCOMArray<nsIFile> mFiles;
59 
60   int16_t mSelectedType;
61   int16_t mResult;
62   bool mRunning;
63   bool mAllowURLs;
64   nsCString mFileURL;
65   nsString mTitle;
66   nsString mDefault;
67   nsString mDefaultExtension;
68 
69   nsTArray<nsCString> mFilters;
70   nsTArray<nsCString> mFilterNames;
71 
72  private:
73   static nsIFile* mPrevDisplayDirectory;
74 
75   void* GtkFileChooserNew(const gchar* title, GtkWindow* parent,
76                           GtkFileChooserAction action,
77                           const gchar* accept_label);
78   void GtkFileChooserShow(void* file_chooser);
79   void GtkFileChooserDestroy(void* file_chooser);
80   void GtkFileChooserSetModal(void* file_chooser, GtkWindow* parent_widget,
81                               gboolean modal);
82 
83   GtkFileChooserWidget* mFileChooserDelegate;
84   bool mUseNativeFileChooser;
85 };
86 
87 #endif
88