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