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 66 // ButtonListener implementation: 67 virtual void ButtonPressed(Button* sender, const ui::Event& event) OVERRIDE; 68 69 protected: 70 // For testing. 71 DialogClientView(View* contents_view); 72 73 // Returns the DialogDelegate for the window. Virtual for testing. 74 virtual DialogDelegate* GetDialogDelegate() const; 75 76 // Create and add the extra view, if supplied by the delegate. 77 void CreateExtraView(); 78 79 // Creates and adds the footnote view, if supplied by the delegate. 80 void CreateFootnoteView(); 81 82 // View implementation. 83 virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; 84 virtual void ChildVisibilityChanged(View* child) OVERRIDE; 85 86 private: 87 bool has_dialog_buttons() const { return ok_button_ || cancel_button_; } 88 89 // Create a dialog button of the appropriate type. 90 LabelButton* CreateDialogButton(ui::DialogButton type); 91 92 // Update |button|'s text and enabled state according to the delegate's state. 93 void UpdateButton(LabelButton* button, ui::DialogButton type); 94 95 // Returns the height of the row containing the buttons and the extra view. 96 int GetButtonsAndExtraViewRowHeight() const; 97 98 // Returns the insets for the buttons and extra view. 99 gfx::Insets GetButtonRowInsets() const; 100 101 // Closes the widget. 102 void Close(); 103 104 // The dialog buttons. 105 LabelButton* ok_button_; 106 LabelButton* cancel_button_; 107 108 // The button that is currently default; may be NULL. 109 LabelButton* default_button_; 110 111 // Observe |focus_manager_| to update the default button with focus changes. 112 FocusManager* focus_manager_; 113 114 // The extra view shown in the row of buttons; may be NULL. 115 View* extra_view_; 116 117 // The footnote view shown below the buttons; may be NULL. 118 View* footnote_view_; 119 120 // True if we've notified the delegate the window is closing and the delegate 121 // allosed the close. In some situations it's possible to get two closes (see 122 // http://crbug.com/71940). This is used to avoid notifying the delegate 123 // twice, which can have bad consequences. 124 bool notified_delegate_; 125 126 DISALLOW_COPY_AND_ASSIGN(DialogClientView); 127 }; 128 129 } // namespace views 130 131 #endif // UI_VIEWS_WINDOW_DIALOG_CLIENT_VIEW_H_ 132