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