15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file implements common select dialog functionality between GTK and KDE.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_LIBGTK2UI_SELECT_FILE_DIALOG_IMPL_H_
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_LIBGTK2UI_SELECT_FILE_DIALOG_IMPL_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/nix/xdg_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/shell_dialogs/select_file_dialog.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/shell_dialogs/select_file_policy.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace libgtk2ui {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shared implementation SelectFileDialog used by SelectFileDialogImplGTK
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SelectFileDialogImpl : public ui::SelectFileDialog {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Main factory method which returns correct type.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ui::SelectFileDialog* Create(Listener* listener,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::SelectFilePolicy* policy);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Factory method for creating a GTK-styled SelectFileDialogImpl
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static SelectFileDialogImpl* NewSelectFileDialogImplGTK(
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Listener* listener,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SelectFilePolicy* policy);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Factory method for creating a KDE-styled SelectFileDialogImpl
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static SelectFileDialogImpl* NewSelectFileDialogImplKDE(
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Listener* listener,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SelectFilePolicy* policy,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::nix::DesktopEnvironment desktop);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the SelectFileDialog class returned by
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NewSelectFileDialogImplKDE will actually work.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool CheckKDEDialogWorksOnUIThread();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BaseShellDialog implementation.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ListenerDestroyed() OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SelectFileDialogImpl(Listener* listener,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                ui::SelectFilePolicy* policy);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SelectFileDialogImpl();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SelectFileDialog implementation.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |params| is user data we pass back via the Listener interface.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SelectFileImpl(
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Type type,
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& title,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& default_path,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FileTypeInfo* file_types,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int file_type_index,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath::StringType& default_extension,
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::NativeWindow owning_window,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      void* params) = 0;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Wrapper for base::DirectoryExists() that allow access on the UI
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread. Use this only in the file dialog functions, where it's ok
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because the file dialog has to do many stats anyway. One more won't
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hurt too badly and it's likely already cached.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CallDirectoryExistsOnUIThread(const base::FilePath& path);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The file filters.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileTypeInfo file_types_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The index of the default selected file filter.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: This starts from 1, not 0.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t file_type_index_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The type of dialog we are showing the user.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Type type_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These two variables track where the user last saved a file or opened a
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // file so that we can display future dialogs with the same starting path.
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static base::FilePath* last_saved_path_;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static base::FilePath* last_opened_path_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SelectFileDialogImpl);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace libgtk2ui
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_LIBGTK2UI_SELECT_FILE_DIALOG_IMPL_H_
88