1// Copyright (c) 2011 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// A dialog box that tells the user that we can't write to the specified user
6// data directory.  Provides the user a chance to pick a different directory.
7
8#ifndef CHROME_BROWSER_UI_VIEWS_USER_DATA_DIR_DIALOG_H_
9#define CHROME_BROWSER_UI_VIEWS_USER_DATA_DIR_DIALOG_H_
10#pragma once
11
12#include "base/basictypes.h"
13#include "base/message_loop.h"
14#include "chrome/browser/ui/shell_dialogs.h"
15#include "views/window/dialog_delegate.h"
16
17class FilePath;
18
19namespace views {
20class MessageBoxView;
21class Window;
22}
23
24class UserDataDirDialog : public views::DialogDelegate,
25                          public MessageLoopForUI::Dispatcher,
26                          public SelectFileDialog::Listener {
27 public:
28  // Creates and runs a user data directory picker dialog.  The method blocks
29  // while the dialog is showing.  If the user picks a directory, this method
30  // returns the chosen directory. |user_data_dir| is the value of the
31  // directory we were not able to use.
32  static FilePath RunUserDataDirDialog(const FilePath& user_data_dir);
33  virtual ~UserDataDirDialog();
34
35  FilePath user_data_dir() const { return user_data_dir_; }
36
37  // views::DialogDelegate Methods:
38  virtual std::wstring GetDialogButtonLabel(
39      MessageBoxFlags::DialogButton button) const;
40  virtual std::wstring GetWindowTitle() const;
41  virtual void DeleteDelegate();
42  virtual bool Accept();
43  virtual bool Cancel();
44
45  // views::WindowDelegate Methods:
46  virtual bool IsAlwaysOnTop() const { return false; }
47  virtual bool IsModal() const { return false; }
48  virtual views::View* GetContentsView();
49
50  // MessageLoop::Dispatcher Method:
51  virtual bool Dispatch(const MSG& msg);
52
53  // SelectFileDialog::Listener Methods:
54  virtual void FileSelected(const FilePath& path, int index, void* params);
55  virtual void FileSelectionCanceled(void* params);
56
57 private:
58  explicit UserDataDirDialog(const FilePath& user_data_dir);
59
60  // Empty until the user picks a directory.
61  FilePath user_data_dir_;
62
63  views::MessageBoxView* message_box_view_;
64  scoped_refptr<SelectFileDialog> select_file_dialog_;
65
66  // Used to keep track of whether or not to block the message loop (still
67  // waiting for the user to dismiss the dialog).
68  bool is_blocking_;
69
70  DISALLOW_COPY_AND_ASSIGN(UserDataDirDialog);
71};
72
73#endif  // CHROME_BROWSER_UI_VIEWS_USER_DATA_DIR_DIALOG_H_
74