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

Side by Side Diff: views/window/dialog_client_view.cc

Issue 7054052: Move more from Window onto Widget. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 6 months 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « views/window/dialog_client_view.h ('k') | views/window/dialog_delegate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "views/window/dialog_client_view.h" 5 #include "views/window/dialog_client_view.h"
6 6
7 #if defined(OS_WIN) 7 #if defined(OS_WIN)
8 #include <windows.h> 8 #include <windows.h>
9 #include <uxtheme.h> 9 #include <uxtheme.h>
10 #include <vsstyle.h> 10 #include <vsstyle.h>
11 #else 11 #else
12 #include <gtk/gtk.h> 12 #include <gtk/gtk.h>
13 #endif 13 #endif
14 14
15 #include <algorithm> 15 #include <algorithm>
16 16
17 #include "base/utf_string_conversions.h" 17 #include "base/utf_string_conversions.h"
18 #include "grit/app_strings.h" 18 #include "grit/app_strings.h"
19 #include "ui/base/keycodes/keyboard_codes.h" 19 #include "ui/base/keycodes/keyboard_codes.h"
20 #include "ui/base/l10n/l10n_util.h" 20 #include "ui/base/l10n/l10n_util.h"
21 #include "ui/base/resource/resource_bundle.h" 21 #include "ui/base/resource/resource_bundle.h"
22 #include "ui/gfx/canvas_skia.h" 22 #include "ui/gfx/canvas_skia.h"
23 #include "ui/gfx/font.h" 23 #include "ui/gfx/font.h"
24 #include "views/controls/button/native_button.h" 24 #include "views/controls/button/native_button.h"
25 #include "views/layout/layout_constants.h" 25 #include "views/layout/layout_constants.h"
26 #include "views/widget/root_view.h" 26 #include "views/widget/root_view.h"
27 #include "views/widget/widget.h"
27 #include "views/window/dialog_delegate.h" 28 #include "views/window/dialog_delegate.h"
28 #include "views/window/window.h"
29 29
30 #if defined(OS_WIN) 30 #if defined(OS_WIN)
31 #include "ui/gfx/native_theme.h" 31 #include "ui/gfx/native_theme.h"
32 #else 32 #else
33 #include "ui/gfx/skia_utils_gtk.h" 33 #include "ui/gfx/skia_utils_gtk.h"
34 #include "views/widget/widget.h" 34 #include "views/widget/widget.h"
35 #include "views/window/hit_test.h" 35 #include "views/window/hit_test.h"
36 #endif 36 #endif
37 37
38 using ui::MessageBoxFlags; 38 using ui::MessageBoxFlags;
(...skipping 22 matching lines...) Expand all
61 #endif 61 #endif
62 62
63 // DialogButton ---------------------------------------------------------------- 63 // DialogButton ----------------------------------------------------------------
64 64
65 // DialogButtons is used for the ok/cancel buttons of the window. DialogButton 65 // DialogButtons is used for the ok/cancel buttons of the window. DialogButton
66 // forwards AcceleratorPressed to the delegate. 66 // forwards AcceleratorPressed to the delegate.
67 67
68 class DialogButton : public NativeButton { 68 class DialogButton : public NativeButton {
69 public: 69 public:
70 DialogButton(ButtonListener* listener, 70 DialogButton(ButtonListener* listener,
71 Window* owner, 71 Widget* owner,
72 MessageBoxFlags::DialogButton type, 72 MessageBoxFlags::DialogButton type,
73 const std::wstring& title, 73 const std::wstring& title,
74 bool is_default) 74 bool is_default)
75 : NativeButton(listener, title), 75 : NativeButton(listener, title),
76 owner_(owner), 76 owner_(owner),
77 type_(type) { 77 type_(type) {
78 SetIsDefault(is_default); 78 SetIsDefault(is_default);
79 } 79 }
80 80
81 // Overridden to forward to the delegate. 81 // Overridden to forward to the delegate.
82 virtual bool AcceleratorPressed(const Accelerator& accelerator) { 82 virtual bool AcceleratorPressed(const Accelerator& accelerator) {
83 if (!owner_->window_delegate()->AsDialogDelegate()-> 83 if (!owner_->widget_delegate()->AsDialogDelegate()->
84 AreAcceleratorsEnabled(type_)) { 84 AreAcceleratorsEnabled(type_)) {
85 return false; 85 return false;
86 } 86 }
87 return NativeButton::AcceleratorPressed(accelerator); 87 return NativeButton::AcceleratorPressed(accelerator);
88 } 88 }
89 89
90 private: 90 private:
91 Window* owner_; 91 Widget* owner_;
92 const MessageBoxFlags::DialogButton type_; 92 const MessageBoxFlags::DialogButton type_;
93 93
94 DISALLOW_COPY_AND_ASSIGN(DialogButton); 94 DISALLOW_COPY_AND_ASSIGN(DialogButton);
95 }; 95 };
96 96
97 } // namespace 97 } // namespace
98 98
99 // static 99 // static
100 gfx::Font* DialogClientView::dialog_button_font_ = NULL; 100 gfx::Font* DialogClientView::dialog_button_font_ = NULL;
101 static const int kDialogMinButtonWidth = 75; 101 static const int kDialogMinButtonWidth = 75;
102 static const int kDialogButtonLabelSpacing = 16; 102 static const int kDialogButtonLabelSpacing = 16;
103 static const int kDialogButtonContentSpacing = 5; 103 static const int kDialogButtonContentSpacing = 5;
104 104
105 // The group used by the buttons. This name is chosen voluntarily big not to 105 // The group used by the buttons. This name is chosen voluntarily big not to
106 // conflict with other groups that could be in the dialog content. 106 // conflict with other groups that could be in the dialog content.
107 static const int kButtonGroup = 6666; 107 static const int kButtonGroup = 6666;
108 108
109 /////////////////////////////////////////////////////////////////////////////// 109 ///////////////////////////////////////////////////////////////////////////////
110 // DialogClientView, public: 110 // DialogClientView, public:
111 111
112 DialogClientView::DialogClientView(Window* owner, View* contents_view) 112 DialogClientView::DialogClientView(Widget* owner, View* contents_view)
113 : ClientView(owner, contents_view), 113 : ClientView(owner, contents_view),
114 ok_button_(NULL), 114 ok_button_(NULL),
115 cancel_button_(NULL), 115 cancel_button_(NULL),
116 default_button_(NULL), 116 default_button_(NULL),
117 extra_view_(NULL), 117 extra_view_(NULL),
118 size_extra_view_height_to_buttons_(false), 118 size_extra_view_height_to_buttons_(false),
119 notified_delegate_(false), 119 notified_delegate_(false),
120 listening_to_focus_(false), 120 listening_to_focus_(false),
121 saved_focus_manager_(NULL), 121 saved_focus_manager_(NULL),
122 bottom_view_(NULL) { 122 bottom_view_(NULL) {
123 InitClass(); 123 InitClass();
124 } 124 }
125 125
126 DialogClientView::~DialogClientView() { 126 DialogClientView::~DialogClientView() {
127 } 127 }
128 128
129 void DialogClientView::ShowDialogButtons() { 129 void DialogClientView::ShowDialogButtons() {
130 DialogDelegate* dd = GetDialogDelegate(); 130 DialogDelegate* dd = GetDialogDelegate();
131 int buttons = dd->GetDialogButtons(); 131 int buttons = dd->GetDialogButtons();
132 if (buttons & MessageBoxFlags::DIALOGBUTTON_OK && !ok_button_) { 132 if (buttons & MessageBoxFlags::DIALOGBUTTON_OK && !ok_button_) {
133 std::wstring label = 133 std::wstring label =
134 dd->GetDialogButtonLabel(MessageBoxFlags::DIALOGBUTTON_OK); 134 dd->GetDialogButtonLabel(MessageBoxFlags::DIALOGBUTTON_OK);
135 if (label.empty()) 135 if (label.empty())
136 label = UTF16ToWide(l10n_util::GetStringUTF16(IDS_APP_OK)); 136 label = UTF16ToWide(l10n_util::GetStringUTF16(IDS_APP_OK));
137 bool is_default_button = 137 bool is_default_button =
138 (dd->GetDefaultDialogButton() & MessageBoxFlags::DIALOGBUTTON_OK) != 0; 138 (dd->GetDefaultDialogButton() & MessageBoxFlags::DIALOGBUTTON_OK) != 0;
139 ok_button_ = new DialogButton(this, window(), 139 ok_button_ = new DialogButton(this, GetWidget(),
140 MessageBoxFlags::DIALOGBUTTON_OK, label, 140 MessageBoxFlags::DIALOGBUTTON_OK, label,
141 is_default_button); 141 is_default_button);
142 ok_button_->SetGroup(kButtonGroup); 142 ok_button_->SetGroup(kButtonGroup);
143 if (is_default_button) 143 if (is_default_button)
144 default_button_ = ok_button_; 144 default_button_ = ok_button_;
145 if (!(buttons & MessageBoxFlags::DIALOGBUTTON_CANCEL)) 145 if (!(buttons & MessageBoxFlags::DIALOGBUTTON_CANCEL))
146 ok_button_->AddAccelerator(Accelerator(ui::VKEY_ESCAPE, 146 ok_button_->AddAccelerator(Accelerator(ui::VKEY_ESCAPE,
147 false, false, false)); 147 false, false, false));
148 AddChildView(ok_button_); 148 AddChildView(ok_button_);
149 } 149 }
150 if (buttons & MessageBoxFlags::DIALOGBUTTON_CANCEL && !cancel_button_) { 150 if (buttons & MessageBoxFlags::DIALOGBUTTON_CANCEL && !cancel_button_) {
151 std::wstring label = 151 std::wstring label =
152 dd->GetDialogButtonLabel(MessageBoxFlags::DIALOGBUTTON_CANCEL); 152 dd->GetDialogButtonLabel(MessageBoxFlags::DIALOGBUTTON_CANCEL);
153 if (label.empty()) { 153 if (label.empty()) {
154 if (buttons & MessageBoxFlags::DIALOGBUTTON_OK) { 154 if (buttons & MessageBoxFlags::DIALOGBUTTON_OK) {
155 label = UTF16ToWide(l10n_util::GetStringUTF16(IDS_APP_CANCEL)); 155 label = UTF16ToWide(l10n_util::GetStringUTF16(IDS_APP_CANCEL));
156 } else { 156 } else {
157 label = UTF16ToWide(l10n_util::GetStringUTF16(IDS_APP_CLOSE)); 157 label = UTF16ToWide(l10n_util::GetStringUTF16(IDS_APP_CLOSE));
158 } 158 }
159 } 159 }
160 bool is_default_button = 160 bool is_default_button =
161 (dd->GetDefaultDialogButton() & MessageBoxFlags::DIALOGBUTTON_CANCEL) 161 (dd->GetDefaultDialogButton() & MessageBoxFlags::DIALOGBUTTON_CANCEL)
162 != 0; 162 != 0;
163 cancel_button_ = new DialogButton(this, window(), 163 cancel_button_ = new DialogButton(this, GetWidget(),
164 MessageBoxFlags::DIALOGBUTTON_CANCEL, 164 MessageBoxFlags::DIALOGBUTTON_CANCEL,
165 label, is_default_button); 165 label, is_default_button);
166 cancel_button_->SetGroup(kButtonGroup); 166 cancel_button_->SetGroup(kButtonGroup);
167 cancel_button_->AddAccelerator(Accelerator(ui::VKEY_ESCAPE, 167 cancel_button_->AddAccelerator(Accelerator(ui::VKEY_ESCAPE,
168 false, false, false)); 168 false, false, false));
169 if (is_default_button) 169 if (is_default_button)
170 default_button_ = ok_button_; 170 default_button_ = ok_button_;
171 AddChildView(cancel_button_); 171 AddChildView(cancel_button_);
172 } 172 }
173 if (!buttons) { 173 if (!buttons) {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 int buttons = dd->GetDialogButtons(); 277 int buttons = dd->GetDialogButtons();
278 bool close = true; 278 bool close = true;
279 if (buttons & MessageBoxFlags::DIALOGBUTTON_CANCEL) 279 if (buttons & MessageBoxFlags::DIALOGBUTTON_CANCEL)
280 close = dd->Cancel(); 280 close = dd->Cancel();
281 else if (buttons & MessageBoxFlags::DIALOGBUTTON_OK) 281 else if (buttons & MessageBoxFlags::DIALOGBUTTON_OK)
282 close = dd->Accept(true); 282 close = dd->Accept(true);
283 notified_delegate_ = close; 283 notified_delegate_ = close;
284 return close; 284 return close;
285 } 285 }
286 286
287 void DialogClientView::WindowClosing() { 287 void DialogClientView::WidgetClosing() {
288 if (listening_to_focus_) { 288 if (listening_to_focus_) {
289 DCHECK(saved_focus_manager_); 289 DCHECK(saved_focus_manager_);
290 if (saved_focus_manager_) 290 if (saved_focus_manager_)
291 saved_focus_manager_->RemoveFocusChangeListener(this); 291 saved_focus_manager_->RemoveFocusChangeListener(this);
292 } 292 }
293 } 293 }
294 294
295 int DialogClientView::NonClientHitTest(const gfx::Point& point) { 295 int DialogClientView::NonClientHitTest(const gfx::Point& point) {
296 if (size_box_bounds_.Contains(point.x() - x(), point.y() - y())) 296 if (size_box_bounds_.Contains(point.x() - x(), point.y() - y()))
297 return HTBOTTOMRIGHT; 297 return HTBOTTOMRIGHT;
(...skipping 16 matching lines...) Expand all
314 GtkStyle* window_style = gtk_widget_get_style(widget); 314 GtkStyle* window_style = gtk_widget_get_style(widget);
315 canvas->FillRectInt(gfx::GdkColorToSkColor( 315 canvas->FillRectInt(gfx::GdkColorToSkColor(
316 window_style->bg[GTK_STATE_NORMAL]), 316 window_style->bg[GTK_STATE_NORMAL]),
317 0, 0, width(), height()); 317 0, 0, width(), height());
318 } 318 }
319 #endif 319 #endif
320 } 320 }
321 321
322 void DialogClientView::PaintChildren(gfx::Canvas* canvas) { 322 void DialogClientView::PaintChildren(gfx::Canvas* canvas) {
323 View::PaintChildren(canvas); 323 View::PaintChildren(canvas);
324 if (!window()->IsMaximized() && !window()->IsMinimized()) 324 if (!GetWidget()->IsMaximized() && !GetWidget()->IsMinimized())
325 PaintSizeBox(canvas); 325 PaintSizeBox(canvas);
326 } 326 }
327 327
328 void DialogClientView::Layout() { 328 void DialogClientView::Layout() {
329 if (has_dialog_buttons()) 329 if (has_dialog_buttons())
330 LayoutDialogButtons(); 330 LayoutDialogButtons();
331 if (bottom_view_) { 331 if (bottom_view_) {
332 gfx::Rect bounds = GetContentsBounds(); 332 gfx::Rect bounds = GetContentsBounds();
333 gfx::Size pref = bottom_view_->GetPreferredSize(); 333 gfx::Size pref = bottom_view_->GetPreferredSize();
334 bottom_view_->SetBounds(bounds.x(), 334 bottom_view_->SetBounds(bounds.x(),
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 CancelWindow(); 419 CancelWindow();
420 } else { 420 } else {
421 NOTREACHED(); 421 NOTREACHED();
422 } 422 }
423 } 423 }
424 424
425 //////////////////////////////////////////////////////////////////////////////// 425 ////////////////////////////////////////////////////////////////////////////////
426 // DialogClientView, private: 426 // DialogClientView, private:
427 427
428 void DialogClientView::PaintSizeBox(gfx::Canvas* canvas) { 428 void DialogClientView::PaintSizeBox(gfx::Canvas* canvas) {
429 if (window()->window_delegate()->CanResize() || 429 if (GetWidget()->widget_delegate()->CanResize() ||
430 window()->window_delegate()->CanMaximize()) { 430 GetWidget()->widget_delegate()->CanMaximize()) {
431 #if defined(OS_WIN) 431 #if defined(OS_WIN)
432 gfx::NativeTheme::ExtraParams extra; 432 gfx::NativeTheme::ExtraParams extra;
433 gfx::Size gripper_size = gfx::NativeTheme::instance()->GetPartSize( 433 gfx::Size gripper_size = gfx::NativeTheme::instance()->GetPartSize(
434 gfx::NativeTheme::kWindowResizeGripper, gfx::NativeTheme::kNormal, 434 gfx::NativeTheme::kWindowResizeGripper, gfx::NativeTheme::kNormal,
435 extra); 435 extra);
436 436
437 // TODO(beng): (http://b/1085509) In "classic" rendering mode, there isn't 437 // TODO(beng): (http://b/1085509) In "classic" rendering mode, there isn't
438 // a theme-supplied gripper. We should probably improvise 438 // a theme-supplied gripper. We should probably improvise
439 // something, which would also require changing |gripper_size| 439 // something, which would also require changing |gripper_size|
440 // to have different default values, too... 440 // to have different default values, too...
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 if (extra_view && !extra_view_) { 532 if (extra_view && !extra_view_) {
533 extra_view_ = extra_view; 533 extra_view_ = extra_view;
534 extra_view_->SetGroup(kButtonGroup); 534 extra_view_->SetGroup(kButtonGroup);
535 AddChildView(extra_view_); 535 AddChildView(extra_view_);
536 size_extra_view_height_to_buttons_ = 536 size_extra_view_height_to_buttons_ =
537 GetDialogDelegate()->GetSizeExtraViewHeightToButtons(); 537 GetDialogDelegate()->GetSizeExtraViewHeightToButtons();
538 } 538 }
539 } 539 }
540 540
541 DialogDelegate* DialogClientView::GetDialogDelegate() const { 541 DialogDelegate* DialogClientView::GetDialogDelegate() const {
542 return window()->window_delegate()->AsDialogDelegate(); 542 return GetWidget()->widget_delegate()->AsDialogDelegate();
543 } 543 }
544 544
545 void DialogClientView::Close() { 545 void DialogClientView::Close() {
546 window()->Close(); 546 GetWidget()->Close();
547 GetDialogDelegate()->OnClose(); 547 GetDialogDelegate()->OnClose();
548 } 548 }
549 549
550 void DialogClientView::UpdateFocusListener() { 550 void DialogClientView::UpdateFocusListener() {
551 FocusManager* focus_manager = GetFocusManager(); 551 FocusManager* focus_manager = GetFocusManager();
552 // Listen for focus change events so we can update the default button. 552 // Listen for focus change events so we can update the default button.
553 // focus_manager can be NULL when the dialog is created on un-shown view. 553 // focus_manager can be NULL when the dialog is created on un-shown view.
554 // We start listening for focus changes when the page is visible. 554 // We start listening for focus changes when the page is visible.
555 // Focus manager could also change if window host changes a parent. 555 // Focus manager could also change if window host changes a parent.
556 if (listening_to_focus_) { 556 if (listening_to_focus_) {
(...skipping 16 matching lines...) Expand all
573 void DialogClientView::InitClass() { 573 void DialogClientView::InitClass() {
574 static bool initialized = false; 574 static bool initialized = false;
575 if (!initialized) { 575 if (!initialized) {
576 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 576 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
577 dialog_button_font_ = new gfx::Font(rb.GetFont(ResourceBundle::BaseFont)); 577 dialog_button_font_ = new gfx::Font(rb.GetFont(ResourceBundle::BaseFont));
578 initialized = true; 578 initialized = true;
579 } 579 }
580 } 580 }
581 581
582 } // namespace views 582 } // namespace views
OLDNEW
« 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