diff options
author | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-23 23:00:17 +0000 |
---|---|---|
committer | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-23 23:00:17 +0000 |
commit | f9c773362c778437308629ff41d117a1a1cdda81 (patch) | |
tree | ef680b3fde7340a63f56b613cd5fa151e157a1cd /chrome/browser/input_window_dialog_win.cc | |
parent | c3c656369b267ecc86962085af5202764012c72d (diff) | |
download | chromium_src-f9c773362c778437308629ff41d117a1a1cdda81.zip chromium_src-f9c773362c778437308629ff41d117a1a1cdda81.tar.gz chromium_src-f9c773362c778437308629ff41d117a1a1cdda81.tar.bz2 |
Adds (non-working) folders and GTK dialogs.
- Folders can be created and edited in the bookmark bar. They
aren't drop targets nor do they popup a menu with their contents.
- Refactor the input window interface to be platform neutral
and use that in EditFolderController.
Review URL: http://codereview.chromium.org/87010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@14371 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/input_window_dialog_win.cc')
-rw-r--r-- | chrome/browser/input_window_dialog_win.cc | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/chrome/browser/input_window_dialog_win.cc b/chrome/browser/input_window_dialog_win.cc new file mode 100644 index 0000000..9d1fa2b --- /dev/null +++ b/chrome/browser/input_window_dialog_win.cc @@ -0,0 +1,234 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/input_window_dialog.h" + +#include "base/message_loop.h" +#include "base/task.h" +#include "chrome/browser/views/standard_layout.h" +#include "chrome/common/l10n_util.h" +#include "chrome/views/grid_layout.h" +#include "chrome/views/controls/label.h" +#include "chrome/views/controls/text_field.h" +#include "chrome/views/window/dialog_delegate.h" +#include "chrome/views/window/window.h" +#include "grit/generated_resources.h" + +// Width to make the text field, in pixels. +static const int kTextFieldWidth = 200; + +class ContentView; + +// The Windows implementation of the cross platform input dialog interface. +class WinInputWindowDialog : public InputWindowDialog { + public: + WinInputWindowDialog(HWND parent, + const std::wstring& window_title, + const std::wstring& label, + const std::wstring& contents, + Delegate* delegate); + virtual ~WinInputWindowDialog(); + + virtual void Show(); + virtual void Close(); + + const std::wstring& window_title() const { return window_title_; } + const std::wstring& label() const { return label_; } + const std::wstring& contents() const { return contents_; } + + InputWindowDialog::Delegate* delegate() { return delegate_.get(); } + + private: + // Our chrome views window. + views::Window* window_; + + // Strings to feed to the on screen window. + std::wstring window_title_; + std::wstring label_; + std::wstring contents_; + + // Our delegate. Consumes the window's output. + scoped_ptr<InputWindowDialog::Delegate> delegate_; +}; + +// ContentView, as the name implies, is the content view for the InputWindow. +// It registers accelerators that accept/cancel the input. +class ContentView : public views::View, + public views::DialogDelegate, + public views::TextField::Controller { + public: + explicit ContentView(WinInputWindowDialog* delegate) + : delegate_(delegate), + focus_grabber_factory_(this) { + DCHECK(delegate_); + } + + // views::DialogDelegate overrides: + virtual bool IsDialogButtonEnabled( + MessageBoxFlags::DialogButton button) const; + virtual bool Accept(); + virtual bool Cancel(); + virtual void DeleteDelegate(); + virtual std::wstring GetWindowTitle() const; + virtual bool IsModal() const { return true; } + virtual views::View* GetContentsView(); + + // views::TextField::Controller overrides: + virtual void ContentsChanged(views::TextField* sender, + const std::wstring& new_contents); + virtual bool HandleKeystroke(views::TextField*, UINT, TCHAR, UINT, UINT) { + return false; + } + + protected: + // views::View overrides: + virtual void ViewHierarchyChanged(bool is_add, views::View* parent, + views::View* child); + + private: + // Set up dialog controls and layout. + void InitControlLayout(); + + // Sets focus to the first focusable element within the dialog. + void FocusFirstFocusableControl(); + + // The TextField that the user can type into. + views::TextField* text_field_; + + // The delegate that the ContentView uses to communicate changes to the + // caller. + WinInputWindowDialog* delegate_; + + // Helps us set focus to the first TextField in the window. + ScopedRunnableMethodFactory<ContentView> focus_grabber_factory_; + + DISALLOW_COPY_AND_ASSIGN(ContentView); +}; + +/////////////////////////////////////////////////////////////////////////////// +// ContentView, views::DialogDelegate implementation: + +bool ContentView::IsDialogButtonEnabled( + MessageBoxFlags::DialogButton button) const { + if (button == MessageBoxFlags::DIALOGBUTTON_OK && + !delegate_->delegate()->IsValid(text_field_->GetText())) { + return false; + } + return true; +} + +bool ContentView::Accept() { + delegate_->delegate()->InputAccepted(text_field_->GetText()); + return true; +} + +bool ContentView::Cancel() { + delegate_->delegate()->InputCanceled(); + return true; +} + +void ContentView::DeleteDelegate() { + delete delegate_; +} + +std::wstring ContentView::GetWindowTitle() const { + return delegate_->window_title(); +} + +views::View* ContentView::GetContentsView() { + return this; +} + +/////////////////////////////////////////////////////////////////////////////// +// ContentView, views::TextField::Controller implementation: + +void ContentView::ContentsChanged(views::TextField* sender, + const std::wstring& new_contents) { + GetDialogClientView()->UpdateDialogButtons(); +} + +/////////////////////////////////////////////////////////////////////////////// +// ContentView, protected: + +void ContentView::ViewHierarchyChanged(bool is_add, + views::View* parent, + views::View* child) { + if (is_add && child == this) + InitControlLayout(); +} + +/////////////////////////////////////////////////////////////////////////////// +// ContentView, private: + +void ContentView::InitControlLayout() { + text_field_ = new views::TextField; + text_field_->SetText(delegate_->contents()); + text_field_->SetController(this); + + using views::ColumnSet; + using views::GridLayout; + + // TODO(sky): Vertical alignment should be baseline. + GridLayout* layout = CreatePanelGridLayout(this); + SetLayoutManager(layout); + + ColumnSet* c1 = layout->AddColumnSet(0); + c1->AddColumn(GridLayout::CENTER, GridLayout::CENTER, 0, + GridLayout::USE_PREF, 0, 0); + c1->AddPaddingColumn(0, kRelatedControlHorizontalSpacing); + c1->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1, + GridLayout::USE_PREF, kTextFieldWidth, kTextFieldWidth); + + layout->StartRow(0, 0); + views::Label* label = new views::Label(delegate_->label()); + layout->AddView(label); + layout->AddView(text_field_); + + MessageLoop::current()->PostTask(FROM_HERE, + focus_grabber_factory_.NewRunnableMethod( + &ContentView::FocusFirstFocusableControl)); +} + +void ContentView::FocusFirstFocusableControl() { + text_field_->SelectAll(); + text_field_->RequestFocus(); +} + +WinInputWindowDialog::WinInputWindowDialog(HWND parent, + const std::wstring& window_title, + const std::wstring& label, + const std::wstring& contents, + Delegate* delegate) + : window_title_(window_title), + label_(label), + contents_(contents), + delegate_(delegate) { + window_ = views::Window::CreateChromeWindow(parent, gfx::Rect(), + new ContentView(this)); + window_->GetClientView()->AsDialogClientView()->UpdateDialogButtons(); +} + +WinInputWindowDialog::~WinInputWindowDialog() { +} + +void WinInputWindowDialog::Show() { + window_->Show(); +} + +void WinInputWindowDialog::Close() { + window_->Close(); +} + +// static +InputWindowDialog* InputWindowDialog::Create(gfx::NativeWindow parent, + const std::wstring& window_title, + const std::wstring& label, + const std::wstring& contents, + Delegate* delegate) { + return new WinInputWindowDialog(parent, + window_title, + label, + contents, + delegate); +} |