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 CHROME_BROWSER_UI_VIEWS_EXTENSIONS_MEDIA_GALLERIES_DIALOG_VIEWS_H_ 6 #define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_MEDIA_GALLERIES_DIALOG_VIEWS_H_ 7 8 #include <map> 9 10 #include "base/compiler_specific.h" 11 #include "chrome/browser/media_galleries/media_galleries_dialog_controller.h" 12 #include "ui/views/context_menu_controller.h" 13 #include "ui/views/controls/button/button.h" 14 #include "ui/views/window/dialog_delegate.h" 15 16 namespace views { 17 class Checkbox; 18 class LabelButton; 19 class MenuRunner; 20 class Widget; 21 } 22 23 class MediaGalleryCheckboxView; 24 25 // The media galleries configuration view for Views. It will immediately show 26 // upon construction. 27 class MediaGalleriesDialogViews : public MediaGalleriesDialog, 28 public views::ButtonListener, 29 public views::ContextMenuController, 30 public views::DialogDelegate { 31 public: 32 explicit MediaGalleriesDialogViews( 33 MediaGalleriesDialogController* controller); 34 virtual ~MediaGalleriesDialogViews(); 35 36 // MediaGalleriesDialog implementation: 37 virtual void UpdateGalleries() OVERRIDE; 38 39 // views::DialogDelegate implementation: 40 virtual base::string16 GetWindowTitle() const OVERRIDE; 41 virtual void DeleteDelegate() OVERRIDE; 42 virtual views::Widget* GetWidget() OVERRIDE; 43 virtual const views::Widget* GetWidget() const OVERRIDE; 44 virtual views::View* GetContentsView() OVERRIDE; 45 virtual base::string16 GetDialogButtonLabel( 46 ui::DialogButton button) const OVERRIDE; 47 virtual bool IsDialogButtonEnabled(ui::DialogButton button) const OVERRIDE; 48 virtual ui::ModalType GetModalType() const OVERRIDE; 49 virtual views::View* CreateExtraView() OVERRIDE; 50 virtual bool Cancel() OVERRIDE; 51 virtual bool Accept() OVERRIDE; 52 53 // views::ButtonListener implementation: 54 virtual void ButtonPressed(views::Button* sender, 55 const ui::Event& event) OVERRIDE; 56 57 // views::ContextMenuController implementation: 58 virtual void ShowContextMenuForView(views::View* source, 59 const gfx::Point& point, 60 ui::MenuSourceType source_type) OVERRIDE; 61 62 private: 63 FRIEND_TEST_ALL_PREFIXES(MediaGalleriesDialogTest, InitializeCheckboxes); 64 FRIEND_TEST_ALL_PREFIXES(MediaGalleriesDialogTest, ToggleCheckboxes); 65 FRIEND_TEST_ALL_PREFIXES(MediaGalleriesDialogTest, UpdateAdds); 66 FRIEND_TEST_ALL_PREFIXES(MediaGalleriesDialogTest, ForgetDeletes); 67 68 typedef std::map<MediaGalleryPrefId, MediaGalleryCheckboxView*> CheckboxMap; 69 70 // MediaGalleriesDialog implementation: 71 virtual void AcceptDialogForTesting() OVERRIDE; 72 73 void InitChildViews(); 74 75 // Adds a checkbox or updates an existing checkbox. Returns true if a new one 76 // was added. 77 bool AddOrUpdateGallery( 78 const MediaGalleriesDialogController::Entry& gallery, 79 views::View* container, 80 int trailing_vertical_space); 81 82 void ShowContextMenu(const gfx::Point& point, 83 ui::MenuSourceType source_type, 84 MediaGalleryPrefId id); 85 86 // Whether |controller_| has a valid WebContents or not. 87 // In unit tests, it may not. 88 bool ControllerHasWebContents() const; 89 90 MediaGalleriesDialogController* controller_; 91 92 // The contents of the dialog. Owned by the view hierarchy, except in tests. 93 views::View* contents_; 94 95 // A map from gallery ID to views::Checkbox view. 96 CheckboxMap checkbox_map_; 97 98 // Pointer to the controller specific auxiliary button, NULL otherwise. 99 // Owned by parent in the dialog views tree. 100 views::LabelButton* auxiliary_button_; 101 102 // This tracks whether the confirm button can be clicked. It starts as false 103 // if no checkboxes are ticked. After there is any interaction, or some 104 // checkboxes start checked, this will be true. 105 bool confirm_available_; 106 107 // True if the user has pressed accept. 108 bool accepted_; 109 110 scoped_ptr<views::MenuRunner> context_menu_runner_; 111 112 DISALLOW_COPY_AND_ASSIGN(MediaGalleriesDialogViews); 113 }; 114 115 #endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_MEDIA_GALLERIES_DIALOG_VIEWS_H_ 116