172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/input_window_dialog.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/compiler_specific.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/task.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "grit/generated_resources.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/label.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/textfield/textfield.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/textfield/textfield_controller.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/grid_layout.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/layout_constants.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/window/dialog_delegate.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/window/window.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Width to make the text field, in pixels.
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const int kTextfieldWidth = 200;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ContentView;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The Windows implementation of the cross platform input dialog interface.
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WinInputWindowDialog : public InputWindowDialog {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WinInputWindowDialog(HWND parent,
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const std::wstring& window_title,
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const std::wstring& label,
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const std::wstring& contents,
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       Delegate* delegate);
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~WinInputWindowDialog();
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Show();
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Close();
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::wstring& window_title() const { return window_title_; }
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::wstring& label() const { return label_; }
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::wstring& contents() const { return contents_; }
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InputWindowDialog::Delegate* delegate() { return delegate_.get(); }
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Our chrome views window.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Window* window_;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Strings to feed to the on screen window.
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring window_title_;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring label_;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring contents_;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Our delegate. Consumes the window's output.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<InputWindowDialog::Delegate> delegate_;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ContentView, as the name implies, is the content view for the InputWindow.
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// It registers accelerators that accept/cancel the input.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ContentView : public views::View,
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    public views::DialogDelegate,
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    public views::TextfieldController {
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit ContentView(WinInputWindowDialog* delegate)
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : delegate_(delegate),
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ALLOW_THIS_IN_INITIALIZER_LIST(focus_grabber_factory_(this)) {
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(delegate_);
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // views::DialogDelegate:
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool IsDialogButtonEnabled(
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      MessageBoxFlags::DialogButton button) const;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool Accept();
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool Cancel();
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DeleteDelegate();
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual std::wstring GetWindowTitle() const;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool IsModal() const { return true; }
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual views::View* GetContentsView();
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // views::TextfieldController:
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ContentsChanged(views::Textfield* sender,
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               const std::wstring& new_contents);
813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual bool HandleKeyEvent(views::Textfield*,
823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                              const views::KeyEvent&) {
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // views::View:
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ViewHierarchyChanged(bool is_add,
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    views::View* parent,
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    views::View* child);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set up dialog controls and layout.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InitControlLayout();
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets focus to the first focusable element within the dialog.
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void FocusFirstFocusableControl();
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The Textfield that the user can type into.
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Textfield* text_field_;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The delegate that the ContentView uses to communicate changes to the
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // caller.
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WinInputWindowDialog* delegate_;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helps us set focus to the first Textfield in the window.
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedRunnableMethodFactory<ContentView> focus_grabber_factory_;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ContentView);
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ContentView, views::DialogDelegate implementation:
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ContentView::IsDialogButtonEnabled(
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageBoxFlags::DialogButton button) const {
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (button == MessageBoxFlags::DIALOGBUTTON_OK &&
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      !delegate_->delegate()->IsValid(text_field_->text())) {
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ContentView::Accept() {
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->delegate()->InputAccepted(text_field_->text());
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ContentView::Cancel() {
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->delegate()->InputCanceled();
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ContentView::DeleteDelegate() {
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete delegate_;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::wstring ContentView::GetWindowTitle() const {
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return delegate_->window_title();
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::View* ContentView::GetContentsView() {
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return this;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// ContentView, views::TextfieldController implementation:
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ContentView::ContentsChanged(views::Textfield* sender,
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const std::wstring& new_contents) {
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GetDialogClientView()->UpdateDialogButtons();
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ContentView, protected:
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ContentView::ViewHierarchyChanged(bool is_add,
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       views::View* parent,
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       views::View* child) {
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (is_add && child == this)
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    InitControlLayout();
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ContentView, private:
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ContentView::InitControlLayout() {
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  text_field_ = new views::Textfield;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  text_field_->SetText(delegate_->contents());
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  text_field_->SetController(this);
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  using views::ColumnSet;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  using views::GridLayout;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(sky): Vertical alignment should be baseline.
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GridLayout* layout = GridLayout::CreatePanel(this);
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetLayoutManager(layout);
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ColumnSet* c1 = layout->AddColumnSet(0);
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  c1->AddColumn(GridLayout::CENTER, GridLayout::CENTER, 0,
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                GridLayout::USE_PREF, 0, 0);
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  c1->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  c1->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1,
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                GridLayout::USE_PREF, kTextfieldWidth, kTextfieldWidth);
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  layout->StartRow(0, 0);
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Label* label = new views::Label(delegate_->label());
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  layout->AddView(label);
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  layout->AddView(text_field_);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->PostTask(FROM_HERE,
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      focus_grabber_factory_.NewRunnableMethod(
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          &ContentView::FocusFirstFocusableControl));
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ContentView::FocusFirstFocusableControl() {
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  text_field_->SelectAll();
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  text_field_->RequestFocus();
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWinInputWindowDialog::WinInputWindowDialog(HWND parent,
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           const std::wstring& window_title,
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           const std::wstring& label,
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           const std::wstring& contents,
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           Delegate* delegate)
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : window_title_(window_title),
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      label_(label),
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      contents_(contents),
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delegate_(delegate) {
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window_ = views::Window::CreateChromeWindow(parent, gfx::Rect(),
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                              new ContentView(this));
212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  window_->client_view()->AsDialogClientView()->UpdateDialogButtons();
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWinInputWindowDialog::~WinInputWindowDialog() {
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WinInputWindowDialog::Show() {
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window_->Show();
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WinInputWindowDialog::Close() {
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  window_->CloseWindow();
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochInputWindowDialog* InputWindowDialog::Create(HWND parent,
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             const std::wstring& window_title,
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             const std::wstring& label,
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             const std::wstring& contents,
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             Delegate* delegate) {
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new WinInputWindowDialog(parent,
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  window_title,
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  label,
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  contents,
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  delegate);
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
238