1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4//
5// This file implements common select dialog functionality between GTK and KDE.
6
7#ifndef UI_SHELL_DIALOGS_GTK_SELECT_FILE_DIALOG_IMPL_H_
8#define UI_SHELL_DIALOGS_GTK_SELECT_FILE_DIALOG_IMPL_H_
9
10#include <set>
11
12#include "base/compiler_specific.h"
13#include "base/nix/xdg_util.h"
14#include "ui/shell_dialogs/select_file_dialog.h"
15
16namespace ui {
17
18// Shared implementation SelectFileDialog used by SelectFileDialogImplGTK
19class SelectFileDialogImpl : public SelectFileDialog {
20 public:
21  // Factory method for creating a GTK-styled SelectFileDialogImpl
22  static SelectFileDialogImpl* NewSelectFileDialogImplGTK(
23      Listener* listener,
24      ui::SelectFilePolicy* policy);
25  // Factory method for creating a KDE-styled SelectFileDialogImpl
26  static SelectFileDialogImpl* NewSelectFileDialogImplKDE(
27      Listener* listener,
28      ui::SelectFilePolicy* policy,
29      base::nix::DesktopEnvironment desktop);
30
31  // Returns true if the SelectFileDialog class returned by
32  // NewSelectFileDialogImplKDE will actually work.
33  static bool CheckKDEDialogWorksOnUIThread();
34
35  // BaseShellDialog implementation.
36  virtual bool IsRunning(gfx::NativeWindow parent_window) const OVERRIDE;
37  virtual void ListenerDestroyed() OVERRIDE;
38
39 protected:
40  explicit SelectFileDialogImpl(Listener* listener,
41                                ui::SelectFilePolicy* policy);
42  virtual ~SelectFileDialogImpl();
43
44  // SelectFileDialog implementation.
45  // |params| is user data we pass back via the Listener interface.
46  virtual void SelectFileImpl(
47      Type type,
48      const base::string16& title,
49      const base::FilePath& default_path,
50      const FileTypeInfo* file_types,
51      int file_type_index,
52      const base::FilePath::StringType& default_extension,
53      gfx::NativeWindow owning_window,
54      void* params) = 0;
55
56  // Wrapper for base::DirectoryExists() that allow access on the UI
57  // thread. Use this only in the file dialog functions, where it's ok
58  // because the file dialog has to do many stats anyway. One more won't
59  // hurt too badly and it's likely already cached.
60  bool CallDirectoryExistsOnUIThread(const base::FilePath& path);
61
62  // The file filters.
63  FileTypeInfo file_types_;
64
65  // The index of the default selected file filter.
66  // Note: This starts from 1, not 0.
67  size_t file_type_index_;
68
69  // The set of all parent windows for which we are currently running dialogs.
70  std::set<GtkWindow*> parents_;
71
72  // The type of dialog we are showing the user.
73  Type type_;
74
75  // These two variables track where the user last saved a file or opened a
76  // file so that we can display future dialogs with the same starting path.
77  static base::FilePath* last_saved_path_;
78  static base::FilePath* last_opened_path_;
79
80  DISALLOW_COPY_AND_ASSIGN(SelectFileDialogImpl);
81};
82
83SelectFileDialog* CreateLinuxSelectFileDialog(
84    SelectFileDialog::Listener* listener,
85    SelectFilePolicy* policy);
86
87}  // namespace ui
88
89#endif  // UI_SHELL_DIALOGS_GTK_SELECT_FILE_DIALOG_IMPL_H_
90