1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef UI_VIEWS_WINDOW_DIALOG_CLIENT_VIEW_H_ 6 #define UI_VIEWS_WINDOW_DIALOG_CLIENT_VIEW_H_ 7 8 #include "ui/base/ui_base_types.h" 9 #include "ui/views/controls/button/button.h" 10 #include "ui/views/focus/focus_manager.h" 11 #include "ui/views/window/client_view.h" 12 13 namespace views { 14 15 class DialogDelegate; 16 class LabelButton; 17 class Widget; 18 19 // DialogClientView provides adornments for a dialog's content view, including 20 // custom-labeled [OK] and [Cancel] buttons with [Enter] and [Esc] accelerators. 21 // The view also displays the delegate's extra view alongside the buttons and 22 // the delegate's footnote view below the buttons. The view appears like below. 23 // NOTE: The contents view is not inset on the top or side client view edges. 24 // +------------------------------+ 25 // | Contents View | 26 // +------------------------------+ 27 // | [Extra View] [OK] [Cancel] | 28 // | [ Footnote View ] | 29 // +------------------------------+ 30 class VIEWS_EXPORT DialogClientView : public ClientView, 31 public ButtonListener, 32 public FocusChangeListener { 33 public: 34 DialogClientView(Widget* widget, View* contents_view); 35 virtual ~DialogClientView(); 36 37 // Accept or Cancel the dialog. 38 void AcceptWindow(); 39 void CancelWindow(); 40 41 // Accessors in case the user wishes to adjust these buttons. 42 LabelButton* ok_button() const { return ok_button_; } 43 LabelButton* cancel_button() const { return cancel_button_; } 44 45 // Update the dialog buttons to match the dialog's delegate. 46 void UpdateDialogButtons(); 47 48 // ClientView implementation: 49 virtual bool CanClose() OVERRIDE; 50 virtual DialogClientView* AsDialogClientView() OVERRIDE; 51 virtual const DialogClientView* AsDialogClientView() const OVERRIDE; 52 53 // FocusChangeListener implementation: 54 virtual void OnWillChangeFocus(View* focused_before, 55 View* focused_now) OVERRIDE; 56 virtual void OnDidChangeFocus(View* focused_before, 57 View* focused_now) OVERRIDE; 58 59 // View implementation: 60 virtual gfx::Size GetPreferredSize() OVERRIDE; 61 virtual void Layout() OVERRIDE; 62 virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE; 63 virtual void ViewHierarchyChanged( 64 const ViewHierarchyChangedDetails& details) OVERRIDE; 65 virtual void NativeViewHierarchyChanged() OVERRIDE; 66 67 // ButtonListener implementation: 68 virtual void ButtonPressed(Button* sender, const ui::Event& event) OVERRIDE; 69 70 protected: 71 // For testing. 72 DialogClientView(View* contents_view); 73 74 // Returns the DialogDelegate for the window. Virtual for testing. 75 virtual DialogDelegate* GetDialogDelegate() const; 76 77 // Create and add the extra view, if supplied by the delegate. 78 void CreateExtraView(); 79 80 // Creates and adds the footnote view, if supplied by the delegate. 81 void CreateFootnoteView(); 82 83 // View implementation. 84 virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; 85 virtual void ChildVisibilityChanged(View* child) OVERRIDE; 86 87 private: 88 FRIEND_TEST_ALL_PREFIXES(DialogClientViewTest, FocusManager); 89 90 bool has_dialog_buttons() const { return ok_button_ || cancel_button_; } 91 92 // Create a dialog button of the appropriate type. 93 LabelButton* CreateDialogButton(ui::DialogButton type); 94 95 // Update |button|'s text and enabled state according to the delegate's state. 96 void UpdateButton(LabelButton* button, ui::DialogButton type); 97 98 // Returns the height of the row containing the buttons and the extra view. 99 int GetButtonsAndExtraViewRowHeight() const; 100 101 // Returns the insets for the buttons and extra view. 102 gfx::Insets GetButtonRowInsets() const; 103 104 // Closes the widget. 105 void Close(); 106 107 // The dialog buttons. 108 LabelButton* ok_button_; 109 LabelButton* cancel_button_; 110 111 // The button that is currently default; may be NULL. 112 LabelButton* default_button_; 113 114 // Observe |focus_manager_| to update the default button with focus changes. 115 FocusManager* focus_manager_; 116 117 // The extra view shown in the row of buttons; may be NULL. 118 View* extra_view_; 119 120 // The footnote view shown below the buttons; may be NULL. 121 View* footnote_view_; 122 123 // True if we've notified the delegate the window is closing and the delegate 124 // allosed the close. In some situations it's possible to get two closes (see 125 // http://crbug.com/71940). This is used to avoid notifying the delegate 126 // twice, which can have bad consequences. 127 bool notified_delegate_; 128 129 DISALLOW_COPY_AND_ASSIGN(DialogClientView); 130 }; 131 132 } // namespace views 133 134 #endif // UI_VIEWS_WINDOW_DIALOG_CLIENT_VIEW_H_ 135