Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Unified Diff: views/window/dialog_client_view.cc

Issue 8552005: views: Move views/window/ to ui/views/window directory. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « views/window/dialog_client_view.h ('k') | views/window/dialog_delegate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/window/dialog_client_view.cc
diff --git a/views/window/dialog_client_view.cc b/views/window/dialog_client_view.cc
deleted file mode 100644
index f0abe6f5a662e09cc19fec3ff419d4c10d04aa84..0000000000000000000000000000000000000000
--- a/views/window/dialog_client_view.cc
+++ /dev/null
@@ -1,591 +0,0 @@
-// Copyright (c) 2011 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 "views/window/dialog_client_view.h"
-
-#include "build/build_config.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#include <uxtheme.h>
-#include <vsstyle.h>
-#elif defined(TOOLKIT_USES_GTK)
-#include <gtk/gtk.h>
-#endif
-
-#include <algorithm>
-
-#include "base/utf_string_conversions.h"
-#include "grit/ui_strings.h"
-#include "ui/base/hit_test.h"
-#include "ui/base/keycodes/keyboard_codes.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/canvas_skia.h"
-#include "ui/gfx/font.h"
-#include "views/controls/button/text_button.h"
-#include "views/layout/layout_constants.h"
-#include "views/widget/root_view.h"
-#include "views/widget/widget.h"
-#include "views/window/dialog_delegate.h"
-
-#if defined(OS_WIN)
-#include "ui/gfx/native_theme.h"
-#else
-#include "ui/gfx/skia_utils_gtk.h"
-#endif
-
-namespace views {
-namespace {
-
-// Updates any of the standard buttons according to the delegate.
-void UpdateButtonHelper(NativeTextButton* button_view,
- DialogDelegate* delegate,
- ui::DialogButton button) {
- string16 label = delegate->GetDialogButtonLabel(button);
- if (!label.empty())
- button_view->SetText(label);
- button_view->SetEnabled(delegate->IsDialogButtonEnabled(button));
- button_view->SetVisible(delegate->IsDialogButtonVisible(button));
-}
-
-#if defined(OS_WIN)
-void FillViewWithSysColor(gfx::Canvas* canvas, View* view, COLORREF color) {
- SkColor sk_color =
- SkColorSetRGB(GetRValue(color), GetGValue(color), GetBValue(color));
- canvas->FillRect(sk_color, view->GetLocalBounds());
-}
-#endif
-
-// DialogButton ----------------------------------------------------------------
-
-// DialogButtons is used for the ok/cancel buttons of the window. DialogButton
-// forwards AcceleratorPressed to the delegate.
-
-class DialogButton : public NativeTextButton {
- public:
- DialogButton(ButtonListener* listener,
- Widget* owner,
- ui::DialogButton type,
- const string16& title,
- bool is_default)
- : NativeTextButton(listener, title),
- owner_(owner),
- type_(type) {
- SetIsDefault(is_default);
- }
-
- // Overridden to forward to the delegate.
- virtual bool AcceleratorPressed(const Accelerator& accelerator) {
- if (!owner_->widget_delegate()->AsDialogDelegate()->
- AreAcceleratorsEnabled(type_)) {
- return false;
- }
- return NativeTextButton::AcceleratorPressed(accelerator);
- }
-
- private:
- Widget* owner_;
- const ui::DialogButton type_;
-
- DISALLOW_COPY_AND_ASSIGN(DialogButton);
-};
-
-} // namespace
-
-// static
-gfx::Font* DialogClientView::dialog_button_font_ = NULL;
-static const int kDialogMinButtonWidth = 75;
-static const int kDialogButtonLabelSpacing = 16;
-static const int kDialogButtonContentSpacing = 5;
-
-// The group used by the buttons. This name is chosen voluntarily big not to
-// conflict with other groups that could be in the dialog content.
-static const int kButtonGroup = 6666;
-
-///////////////////////////////////////////////////////////////////////////////
-// DialogClientView, public:
-
-DialogClientView::DialogClientView(Widget* owner, View* contents_view)
- : ClientView(owner, contents_view),
- ok_button_(NULL),
- cancel_button_(NULL),
- default_button_(NULL),
- extra_view_(NULL),
- size_extra_view_height_to_buttons_(false),
- notified_delegate_(false),
- listening_to_focus_(false),
- saved_focus_manager_(NULL),
- bottom_view_(NULL) {
- InitClass();
-}
-
-DialogClientView::~DialogClientView() {
-}
-
-void DialogClientView::ShowDialogButtons() {
- DialogDelegate* dd = GetDialogDelegate();
- int buttons = dd->GetDialogButtons();
- if (buttons & ui::DIALOG_BUTTON_OK && !ok_button_) {
- string16 label = dd->GetDialogButtonLabel(ui::DIALOG_BUTTON_OK);
- if (label.empty())
- label = l10n_util::GetStringUTF16(IDS_APP_OK);
- bool is_default_button =
- (dd->GetDefaultDialogButton() & ui::DIALOG_BUTTON_OK) != 0;
- ok_button_ = new DialogButton(this,
- GetWidget(),
- ui::DIALOG_BUTTON_OK,
- label,
- is_default_button);
- ok_button_->SetGroup(kButtonGroup);
- if (is_default_button)
- default_button_ = ok_button_;
- if (!(buttons & ui::DIALOG_BUTTON_CANCEL))
- ok_button_->AddAccelerator(Accelerator(ui::VKEY_ESCAPE,
- false, false, false));
- AddChildView(ok_button_);
- }
- if (buttons & ui::DIALOG_BUTTON_CANCEL && !cancel_button_) {
- string16 label =
- dd->GetDialogButtonLabel(ui::DIALOG_BUTTON_CANCEL);
- if (label.empty()) {
- if (buttons & ui::DIALOG_BUTTON_OK) {
- label = l10n_util::GetStringUTF16(IDS_APP_CANCEL);
- } else {
- label = l10n_util::GetStringUTF16(IDS_APP_CLOSE);
- }
- }
- bool is_default_button =
- (dd->GetDefaultDialogButton() & ui::DIALOG_BUTTON_CANCEL)
- != 0;
- cancel_button_ = new DialogButton(this,
- GetWidget(),
- ui::DIALOG_BUTTON_CANCEL,
- label,
- is_default_button);
- cancel_button_->SetGroup(kButtonGroup);
- cancel_button_->AddAccelerator(Accelerator(ui::VKEY_ESCAPE,
- false, false, false));
- if (is_default_button)
- default_button_ = ok_button_;
- AddChildView(cancel_button_);
- }
- if (!buttons) {
- // Register the escape key as an accelerator which will close the window
- // if there are no dialog buttons.
- AddAccelerator(Accelerator(ui::VKEY_ESCAPE, false, false, false));
- }
-}
-
-void DialogClientView::SetDefaultButton(NativeTextButton* new_default_button) {
- if (default_button_ && default_button_ != new_default_button) {
- default_button_->SetIsDefault(false);
- default_button_ = NULL;
- }
-
- if (new_default_button) {
- default_button_ = new_default_button;
- default_button_->SetIsDefault(true);
- }
-}
-
-void DialogClientView::OnWillChangeFocus(View* focused_before,
- View* focused_now) {
- NativeTextButton* new_default_button = NULL;
- if (focused_now &&
- focused_now->GetClassName() == NativeTextButton::kViewClassName) {
- new_default_button = static_cast<NativeTextButton*>(focused_now);
- } else {
- // The focused view is not a button, get the default button from the
- // delegate.
- DialogDelegate* dd = GetDialogDelegate();
- if ((dd->GetDefaultDialogButton() & ui::DIALOG_BUTTON_OK) != 0)
- new_default_button = ok_button_;
- if ((dd->GetDefaultDialogButton() & ui::DIALOG_BUTTON_CANCEL)
- != 0)
- new_default_button = cancel_button_;
- }
- SetDefaultButton(new_default_button);
-}
-
-void DialogClientView::OnDidChangeFocus(View* focused_before,
- View* focused_now) {
-}
-
-// Changing dialog labels will change button widths.
-void DialogClientView::UpdateDialogButtons() {
- DialogDelegate* dd = GetDialogDelegate();
- int buttons = dd->GetDialogButtons();
-
- if (buttons & ui::DIALOG_BUTTON_OK)
- UpdateButtonHelper(ok_button_, dd, ui::DIALOG_BUTTON_OK);
-
- if (buttons & ui::DIALOG_BUTTON_CANCEL) {
- UpdateButtonHelper(cancel_button_, dd, ui::DIALOG_BUTTON_CANCEL);
- }
-
- LayoutDialogButtons();
- SchedulePaint();
-}
-
-void DialogClientView::AcceptWindow() {
- if (notified_delegate_) {
- // Only notify the delegate once. See comment in header above
- // notified_delegate_ for details.
- return;
- }
- if (GetDialogDelegate()->Accept(false)) {
- notified_delegate_ = true;
- Close();
- }
-}
-
-void DialogClientView::CancelWindow() {
- // Call the standard Close handler, which checks with the delegate before
- // proceeding. This checking _isn't_ done here, but in the WM_CLOSE handler,
- // so that the close box on the window also shares this code path.
- Close();
-}
-
-void DialogClientView::SetBottomView(View* bottom_view) {
- if (bottom_view_) {
- RemoveChildView(bottom_view_);
- delete bottom_view_;
- }
- bottom_view_ = bottom_view;
- if (bottom_view_)
- AddChildView(bottom_view_);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// DialogClientView, View overrides:
-
-void DialogClientView::NativeViewHierarchyChanged(
- bool attached,
- gfx::NativeView native_view,
- internal::RootView* root_view) {
- if (attached) {
- UpdateFocusListener();
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// DialogClientView, ClientView overrides:
-
-bool DialogClientView::CanClose() {
- if (notified_delegate_)
- return true;
-
- DialogDelegate* dd = GetDialogDelegate();
- int buttons = dd->GetDialogButtons();
- bool close = true;
- if (buttons & ui::DIALOG_BUTTON_CANCEL)
- close = dd->Cancel();
- else if (buttons & ui::DIALOG_BUTTON_OK)
- close = dd->Accept(true);
- notified_delegate_ = close;
- return close;
-}
-
-void DialogClientView::WidgetClosing() {
- if (listening_to_focus_) {
- DCHECK(saved_focus_manager_);
- if (saved_focus_manager_)
- saved_focus_manager_->RemoveFocusChangeListener(this);
- }
-}
-
-int DialogClientView::NonClientHitTest(const gfx::Point& point) {
- if (size_box_bounds_.Contains(point.x() - x(), point.y() - y()))
- return HTBOTTOMRIGHT;
- return ClientView::NonClientHitTest(point);
-}
-
-DialogClientView* DialogClientView::AsDialogClientView() {
- return this;
-}
-
-const DialogClientView* DialogClientView::AsDialogClientView() const {
- return this;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// DialogClientView, View overrides:
-
-void DialogClientView::OnPaint(gfx::Canvas* canvas) {
-#if defined(OS_WIN)
- FillViewWithSysColor(canvas, this, GetSysColor(COLOR_3DFACE));
-#elif defined(USE_WAYLAND) || defined(USE_AURA)
- SkColor sk_color = SkColorSetARGB(200, 255, 255, 255);
- canvas->FillRect(sk_color, GetLocalBounds());
-#else
- GtkWidget* widget = GetWidget()->GetNativeView();
- if (GTK_IS_WINDOW(widget)) {
- GtkStyle* window_style = gtk_widget_get_style(widget);
- canvas->FillRect(gfx::GdkColorToSkColor(window_style->bg[GTK_STATE_NORMAL]),
- GetLocalBounds());
- }
-#endif
-}
-
-void DialogClientView::PaintChildren(gfx::Canvas* canvas) {
- View::PaintChildren(canvas);
- if (!GetWidget()->IsMaximized() && !GetWidget()->IsMinimized())
- PaintSizeBox(canvas);
-}
-
-void DialogClientView::Layout() {
- if (has_dialog_buttons())
- LayoutDialogButtons();
- if (bottom_view_) {
- gfx::Rect bounds = GetContentsBounds();
- gfx::Size pref = bottom_view_->GetPreferredSize();
- bottom_view_->SetBounds(bounds.x(),
- bounds.bottom() - pref.height() - kButtonVEdgeMargin,
- bounds.width(), pref.height());
- }
- LayoutContentsView();
-}
-
-void DialogClientView::ViewHierarchyChanged(bool is_add, View* parent,
- View* child) {
- if (is_add && child == this) {
- // Can only add and update the dialog buttons _after_ they are added to the
- // view hierarchy since they are native controls and require the
- // Container's HWND.
- ShowDialogButtons();
- ClientView::ViewHierarchyChanged(is_add, parent, child);
-
- UpdateFocusListener();
-
- // The "extra view" must be created and installed after the contents view
- // has been inserted into the view hierarchy.
- CreateExtraView();
- UpdateDialogButtons();
- Layout();
- }
-}
-
-gfx::Size DialogClientView::GetPreferredSize() {
- gfx::Size prefsize = contents_view()->GetPreferredSize();
- int button_height = 0;
- if (has_dialog_buttons()) {
- if (cancel_button_)
- button_height = cancel_button_->height();
- else
- button_height = ok_button_->height();
- // Account for padding above and below the button.
- button_height += kDialogButtonContentSpacing + kButtonVEdgeMargin;
-
- // Make sure the view is sized to the buttons's width if they are wider than
- // the contents.
- int width = 0;
- if (cancel_button_)
- width += GetButtonWidth(ui::DIALOG_BUTTON_CANCEL);
- if (ok_button_) {
- width += GetButtonWidth(ui::DIALOG_BUTTON_OK);
- if (cancel_button_)
- width += kRelatedButtonHSpacing;
- }
- if (extra_view_) {
- width += extra_view_->GetPreferredSize().width();
- if (cancel_button_ || ok_button_)
- width += kRelatedButtonHSpacing;
- }
- if (width > 0) {
- width += 2 * kButtonHEdgeMargin;
- prefsize.set_width(std::max(prefsize.width(), width));
- }
- }
- if (bottom_view_) {
- gfx::Size bottom_pref = bottom_view_->GetPreferredSize();
- prefsize.Enlarge(0, bottom_pref.height() + kButtonVEdgeMargin);
- }
- prefsize.Enlarge(0, button_height);
- return prefsize;
-}
-
-bool DialogClientView::AcceleratorPressed(const Accelerator& accelerator) {
- // We only expect Escape key.
- DCHECK(accelerator.key_code() == ui::VKEY_ESCAPE);
- Close();
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// DialogClientView, ButtonListener implementation:
-
-void DialogClientView::ButtonPressed(
- Button* sender, const views::Event& event) {
- // We NULL check the delegate here since the buttons can receive WM_COMMAND
- // messages even after they (and the window containing us) are destroyed.
- if (!GetDialogDelegate())
- return;
-
- if (sender == ok_button_) {
- AcceptWindow();
- } else if (sender == cancel_button_) {
- CancelWindow();
- } else {
- NOTREACHED();
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// DialogClientView, private:
-
-void DialogClientView::PaintSizeBox(gfx::Canvas* canvas) {
- if (GetWidget()->widget_delegate()->CanResize() ||
- GetWidget()->widget_delegate()->CanMaximize()) {
-#if defined(OS_WIN)
- gfx::NativeTheme::ExtraParams extra;
- gfx::Size gripper_size = gfx::NativeTheme::instance()->GetPartSize(
- gfx::NativeTheme::kWindowResizeGripper, gfx::NativeTheme::kNormal,
- extra);
-
- // TODO(beng): (http://b/1085509) In "classic" rendering mode, there isn't
- // a theme-supplied gripper. We should probably improvise
- // something, which would also require changing |gripper_size|
- // to have different default values, too...
- size_box_bounds_ = GetContentsBounds();
- size_box_bounds_.set_x(size_box_bounds_.right() - gripper_size.width());
- size_box_bounds_.set_y(size_box_bounds_.bottom() - gripper_size.height());
-
- gfx::NativeTheme::instance()->Paint(canvas->GetSkCanvas(),
- gfx::NativeTheme::kWindowResizeGripper,
- gfx::NativeTheme::kNormal,
- size_box_bounds_,
- extra);
-#else
- NOTIMPLEMENTED();
- // TODO(port): paint size box
-#endif
- }
-}
-
-int DialogClientView::GetButtonWidth(int button) const {
- DialogDelegate* dd = GetDialogDelegate();
- string16 button_label = dd->GetDialogButtonLabel(
- static_cast<ui::DialogButton>(button));
- int string_width = dialog_button_font_->GetStringWidth(button_label);
- return std::max(string_width + kDialogButtonLabelSpacing,
- kDialogMinButtonWidth);
-}
-
-int DialogClientView::GetButtonsHeight() const {
- if (has_dialog_buttons()) {
- if (cancel_button_)
- return cancel_button_->height() + kDialogButtonContentSpacing;
- return ok_button_->height() + kDialogButtonContentSpacing;
- }
- return 0;
-}
-
-void DialogClientView::LayoutDialogButtons() {
- gfx::Rect lb = GetContentsBounds();
- gfx::Rect extra_bounds;
- int bottom_y = lb.bottom() - kButtonVEdgeMargin;
- int button_height = 0;
- if (bottom_view_) {
- gfx::Size bottom_pref = bottom_view_->GetPreferredSize();
- bottom_y -= bottom_pref.height() + kButtonVEdgeMargin + kButtonVEdgeMargin;
- }
- if (cancel_button_) {
- gfx::Size ps = cancel_button_->GetPreferredSize();
- int button_width = std::max(
- GetButtonWidth(ui::DIALOG_BUTTON_CANCEL), ps.width());
- int button_x = lb.right() - button_width - kButtonHEdgeMargin;
- int button_y = bottom_y - ps.height();
- cancel_button_->SetBounds(button_x, button_y, button_width, ps.height());
- // The extra view bounds are dependent on this button.
- extra_bounds.set_width(std::max(0, cancel_button_->x()));
- extra_bounds.set_y(cancel_button_->y());
- button_height = std::max(button_height, ps.height());
- }
- if (ok_button_) {
- gfx::Size ps = ok_button_->GetPreferredSize();
- int button_width = std::max(
- GetButtonWidth(ui::DIALOG_BUTTON_OK), ps.width());
- int ok_button_right = lb.right() - kButtonHEdgeMargin;
- if (cancel_button_)
- ok_button_right = cancel_button_->x() - kRelatedButtonHSpacing;
- int button_x = ok_button_right - button_width;
- int button_y = bottom_y - ps.height();
- ok_button_->SetBounds(button_x, button_y, ok_button_right - button_x,
- ps.height());
- // The extra view bounds are dependent on this button.
- extra_bounds.set_width(std::max(0, ok_button_->x()));
- extra_bounds.set_y(ok_button_->y());
- button_height = std::max(button_height, ps.height());
- }
- if (extra_view_) {
- gfx::Size ps = extra_view_->GetPreferredSize();
- extra_bounds.set_x(lb.x() + kButtonHEdgeMargin);
- int height = size_extra_view_height_to_buttons_ ?
- std::max(ps.height(), button_height) : ps.height();
- extra_bounds.set_height(height);
- extra_view_->SetBoundsRect(extra_bounds);
- }
-}
-
-void DialogClientView::LayoutContentsView() {
- gfx::Rect lb = GetContentsBounds();
- lb.set_height(std::max(0, lb.height() - GetButtonsHeight()));
- contents_view()->SetBoundsRect(lb);
- contents_view()->Layout();
-}
-
-void DialogClientView::CreateExtraView() {
- View* extra_view = GetDialogDelegate()->GetExtraView();
- if (extra_view && !extra_view_) {
- extra_view_ = extra_view;
- extra_view_->SetGroup(kButtonGroup);
- AddChildView(extra_view_);
- size_extra_view_height_to_buttons_ =
- GetDialogDelegate()->GetSizeExtraViewHeightToButtons();
- }
-}
-
-DialogDelegate* DialogClientView::GetDialogDelegate() const {
- return GetWidget()->widget_delegate()->AsDialogDelegate();
-}
-
-void DialogClientView::Close() {
- GetWidget()->Close();
- GetDialogDelegate()->OnClose();
-}
-
-void DialogClientView::UpdateFocusListener() {
- FocusManager* focus_manager = GetFocusManager();
- // Listen for focus change events so we can update the default button.
- // focus_manager can be NULL when the dialog is created on un-shown view.
- // We start listening for focus changes when the page is visible.
- // Focus manager could also change if window host changes a parent.
- if (listening_to_focus_) {
- if (saved_focus_manager_ == focus_manager)
- return;
- DCHECK(saved_focus_manager_);
- if (saved_focus_manager_)
- saved_focus_manager_->RemoveFocusChangeListener(this);
- listening_to_focus_ = false;
- }
- saved_focus_manager_ = focus_manager;
- // Listen for focus change events so we can update the default button.
- if (focus_manager) {
- focus_manager->AddFocusChangeListener(this);
- listening_to_focus_ = true;
- }
-}
-
-// static
-void DialogClientView::InitClass() {
- static bool initialized = false;
- if (!initialized) {
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- dialog_button_font_ = new gfx::Font(rb.GetFont(ResourceBundle::BaseFont));
- initialized = true;
- }
-}
-
-} // namespace views
« no previous file with comments | « views/window/dialog_client_view.h ('k') | views/window/dialog_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698