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

Side by Side Diff: chrome/browser/ui/views/browser_actions_container.cc

Issue 10533086: Action box menu (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Action box menu Created 8 years, 4 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 "chrome/browser/ui/views/browser_actions_container.h" 5 #include "chrome/browser/ui/views/browser_actions_container.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "chrome/browser/extensions/extension_service.h" 8 #include "chrome/browser/extensions/extension_service.h"
9 #include "chrome/browser/prefs/pref_service.h" 9 #include "chrome/browser/prefs/pref_service.h"
10 #include "chrome/browser/profiles/profile.h" 10 #include "chrome/browser/profiles/profile.h"
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 // TODO(mpcomplete): remove this after users are upgraded to 5.0. 121 // TODO(mpcomplete): remove this after users are upgraded to 5.0.
122 int predefined_width = 122 int predefined_width =
123 profile_->GetPrefs()->GetInteger(prefs::kBrowserActionContainerWidth); 123 profile_->GetPrefs()->GetInteger(prefs::kBrowserActionContainerWidth);
124 if (predefined_width != 0) 124 if (predefined_width != 0)
125 model_->SetVisibleIconCount(WidthToIconCount(predefined_width)); 125 model_->SetVisibleIconCount(WidthToIconCount(predefined_width));
126 } 126 }
127 if (model_ && model_->extensions_initialized()) 127 if (model_ && model_->extensions_initialized())
128 SetContainerWidth(); 128 SetContainerWidth();
129 } 129 }
130 130
131 int BrowserActionsContainer::GetCurrentTabId() const {
132 TabContents* tab = chrome::GetActiveTabContents(browser_);
133 return tab ? tab->restore_tab_helper()->session_id().id() : -1;
134 }
135
136 BrowserActionView* BrowserActionsContainer::GetBrowserActionView( 131 BrowserActionView* BrowserActionsContainer::GetBrowserActionView(
137 ExtensionAction* action) { 132 ExtensionAction* action) {
138 for (BrowserActionViews::iterator i(browser_action_views_.begin()); 133 for (BrowserActionViews::iterator i(browser_action_views_.begin());
139 i != browser_action_views_.end(); ++i) { 134 i != browser_action_views_.end(); ++i) {
140 if ((*i)->button()->browser_action() == action) 135 if ((*i)->button()->browser_action() == action)
141 return *i; 136 return *i;
142 } 137 }
143 return NULL; 138 return NULL;
144 } 139 }
145 140
146 void BrowserActionsContainer::RefreshBrowserActionViews() { 141 void BrowserActionsContainer::RefreshBrowserActionViews() {
147 for (size_t i = 0; i < browser_action_views_.size(); ++i) 142 for (size_t i = 0; i < browser_action_views_.size(); ++i)
148 browser_action_views_[i]->button()->UpdateState(); 143 browser_action_views_[i]->button()->UpdateState();
149 } 144 }
150 145
151 void BrowserActionsContainer::CreateBrowserActionViews() { 146 void BrowserActionsContainer::CreateBrowserActionViews() {
152 DCHECK(browser_action_views_.empty()); 147 DCHECK(browser_action_views_.empty());
153 if (!model_) 148 if (!model_)
154 return; 149 return;
155 150
156 for (extensions::ExtensionList::iterator i(model_->begin()); 151 const extensions::ExtensionList& toolbar_items = model_->toolbar_items();
157 i != model_->end(); ++i) { 152 for (extensions::ExtensionList::const_iterator i(toolbar_items.begin());
153 i != toolbar_items.end(); ++i) {
158 if (!ShouldDisplayBrowserAction(*i)) 154 if (!ShouldDisplayBrowserAction(*i))
159 continue; 155 continue;
160 156
161 BrowserActionView* view = new BrowserActionView(*i, this); 157 BrowserActionView* view = new BrowserActionView(*i, browser_, this);
162 browser_action_views_.push_back(view); 158 browser_action_views_.push_back(view);
163 AddChildView(view); 159 AddChildView(view);
164 } 160 }
165 } 161 }
166 162
167 void BrowserActionsContainer::DeleteBrowserActionViews() { 163 void BrowserActionsContainer::DeleteBrowserActionViews() {
168 HidePopup(); 164 HidePopup();
169 STLDeleteElements(&browser_action_views_); 165 STLDeleteElements(&browser_action_views_);
170 } 166 }
171 167
172 void BrowserActionsContainer::OnBrowserActionVisibilityChanged() {
173 SetVisible(!browser_action_views_.empty());
174 owner_view_->Layout();
175 owner_view_->SchedulePaint();
176 }
177
178 size_t BrowserActionsContainer::VisibleBrowserActions() const { 168 size_t BrowserActionsContainer::VisibleBrowserActions() const {
179 size_t visible_actions = 0; 169 size_t visible_actions = 0;
180 for (size_t i = 0; i < browser_action_views_.size(); ++i) { 170 for (size_t i = 0; i < browser_action_views_.size(); ++i) {
181 if (browser_action_views_[i]->visible()) 171 if (browser_action_views_[i]->visible())
182 ++visible_actions; 172 ++visible_actions;
183 } 173 }
184 return visible_actions; 174 return visible_actions;
185 } 175 }
186 176
187 void BrowserActionsContainer::OnBrowserActionExecuted(
188 BrowserActionButton* button) {
189 const Extension* extension = button->extension();
190 GURL popup_url;
191 switch (model_->ExecuteBrowserAction(extension, browser_, &popup_url)) {
192 case ExtensionToolbarModel::ACTION_NONE:
193 break;
194 case ExtensionToolbarModel::ACTION_SHOW_POPUP:
195 ShowPopup(button, popup_url);
196 break;
197 }
198 }
199
200 gfx::Size BrowserActionsContainer::GetPreferredSize() { 177 gfx::Size BrowserActionsContainer::GetPreferredSize() {
201 if (browser_action_views_.empty()) 178 if (browser_action_views_.empty())
202 return gfx::Size(ToolbarView::kStandardSpacing, 0); 179 return gfx::Size(ToolbarView::kStandardSpacing, 0);
203 180
204 // We calculate the size of the view by taking the current width and 181 // We calculate the size of the view by taking the current width and
205 // subtracting resize_amount_ (the latter represents how far the user is 182 // subtracting resize_amount_ (the latter represents how far the user is
206 // resizing the view or, if animating the snapping, how far to animate it). 183 // resizing the view or, if animating the snapping, how far to animate it).
207 // But we also clamp it to a minimum size and the maximum size, so that the 184 // But we also clamp it to a minimum size and the maximum size, so that the
208 // container can never shrink too far or take up more space than it needs. In 185 // container can never shrink too far or take up more space than it needs. In
209 // other words: ContainerMinSize() < width() - resize < ClampTo(MAX). 186 // other words: ContainerMinSize() < width() - resize < ClampTo(MAX).
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 void BrowserActionsContainer::GetAccessibleState( 358 void BrowserActionsContainer::GetAccessibleState(
382 ui::AccessibleViewState* state) { 359 ui::AccessibleViewState* state) {
383 state->role = ui::AccessibilityTypes::ROLE_GROUPING; 360 state->role = ui::AccessibilityTypes::ROLE_GROUPING;
384 state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_EXTENSIONS); 361 state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_EXTENSIONS);
385 } 362 }
386 363
387 void BrowserActionsContainer::OnMenuButtonClicked(views::View* source, 364 void BrowserActionsContainer::OnMenuButtonClicked(views::View* source,
388 const gfx::Point& point) { 365 const gfx::Point& point) {
389 if (source == chevron_) { 366 if (source == chevron_) {
390 overflow_menu_ = new BrowserActionOverflowMenuController( 367 overflow_menu_ = new BrowserActionOverflowMenuController(
391 this, chevron_, browser_action_views_, VisibleBrowserActions()); 368 this, browser_, chevron_, browser_action_views_,
369 VisibleBrowserActions());
392 overflow_menu_->set_observer(this); 370 overflow_menu_->set_observer(this);
393 overflow_menu_->RunMenu(GetWidget(), false); 371 overflow_menu_->RunMenu(GetWidget(), false);
394 } 372 }
395 } 373 }
396 374
397 void BrowserActionsContainer::WriteDragDataForView(View* sender, 375 void BrowserActionsContainer::WriteDragDataForView(View* sender,
398 const gfx::Point& press_pt, 376 const gfx::Point& press_pt,
399 OSExchangeData* data) { 377 OSExchangeData* data) {
400 DCHECK(data); 378 DCHECK(data);
401 379
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 DCHECK_EQ(popup_->GetWidget(), widget); 449 DCHECK_EQ(popup_->GetWidget(), widget);
472 popup_->GetWidget()->RemoveObserver(this); 450 popup_->GetWidget()->RemoveObserver(this);
473 popup_ = NULL; 451 popup_ = NULL;
474 // |popup_button_| is NULL if the extension has been removed. 452 // |popup_button_| is NULL if the extension has been removed.
475 if (popup_button_) { 453 if (popup_button_) {
476 popup_button_->SetButtonNotPushed(); 454 popup_button_->SetButtonNotPushed();
477 popup_button_ = NULL; 455 popup_button_ = NULL;
478 } 456 }
479 } 457 }
480 458
459 int BrowserActionsContainer::GetCurrentTabId() const {
460 TabContents* tab = chrome::GetActiveTabContents(browser_);
461 return tab ? tab->restore_tab_helper()->session_id().id() : -1;
462 }
463
464 void BrowserActionsContainer::OnBrowserActionExecuted(
465 BrowserActionButton* button) {
466 const Extension* extension = button->extension();
467 GURL popup_url;
468 if (model_->ExecuteBrowserAction(extension, browser_, &popup_url) ==
469 ExtensionToolbarModel::ACTION_SHOW_POPUP)
470 ShowPopup(button, popup_url);
471 }
472
473 void BrowserActionsContainer::OnBrowserActionVisibilityChanged() {
474 SetVisible(!browser_action_views_.empty());
475 owner_view_->Layout();
476 owner_view_->SchedulePaint();
477 }
478
479 gfx::Point BrowserActionsContainer::GetViewContentOffset() const {
480 return gfx::Point(0, ToolbarView::kVertSpacing);
481 }
482
481 void BrowserActionsContainer::MoveBrowserAction(const std::string& extension_id, 483 void BrowserActionsContainer::MoveBrowserAction(const std::string& extension_id,
482 size_t new_index) { 484 size_t new_index) {
483 ExtensionService* service = profile_->GetExtensionService(); 485 ExtensionService* service = profile_->GetExtensionService();
484 if (service) { 486 if (service) {
485 const Extension* extension = service->GetExtensionById(extension_id, false); 487 const Extension* extension = service->GetExtensionById(extension_id, false);
486 model_->MoveBrowserAction(extension, new_index); 488 model_->MoveBrowserAction(extension, new_index);
487 SchedulePaint(); 489 SchedulePaint();
488 } 490 }
489 } 491 }
490 492
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 CloseOverflowMenu(); 589 CloseOverflowMenu();
588 590
589 if (!ShouldDisplayBrowserAction(extension)) 591 if (!ShouldDisplayBrowserAction(extension))
590 return; 592 return;
591 593
592 size_t visible_actions = VisibleBrowserActions(); 594 size_t visible_actions = VisibleBrowserActions();
593 595
594 // Add the new browser action to the vector and the view hierarchy. 596 // Add the new browser action to the vector and the view hierarchy.
595 if (profile_->IsOffTheRecord()) 597 if (profile_->IsOffTheRecord())
596 index = model_->OriginalIndexToIncognito(index); 598 index = model_->OriginalIndexToIncognito(index);
597 BrowserActionView* view = new BrowserActionView(extension, this); 599 BrowserActionView* view = new BrowserActionView(extension, browser_, this);
598 browser_action_views_.insert(browser_action_views_.begin() + index, view); 600 browser_action_views_.insert(browser_action_views_.begin() + index, view);
599 AddChildViewAt(view, index); 601 AddChildViewAt(view, index);
600 602
601 // If we are still initializing the container, don't bother animating. 603 // If we are still initializing the container, don't bother animating.
602 if (!model_->extensions_initialized()) 604 if (!model_->extensions_initialized())
603 return; 605 return;
604 606
605 // Enlarge the container if it was already at maximum size and we're not in 607 // Enlarge the container if it was already at maximum size and we're not in
606 // the middle of upgrading. 608 // the middle of upgrading.
607 if ((model_->GetVisibleIconCount() < 0) && 609 if ((model_->GetVisibleIconCount() < 0) &&
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 void BrowserActionsContainer::LoadImages() { 675 void BrowserActionsContainer::LoadImages() {
674 ui::ThemeProvider* tp = GetThemeProvider(); 676 ui::ThemeProvider* tp = GetThemeProvider();
675 chevron_->SetIcon(*tp->GetBitmapNamed(IDR_BROWSER_ACTIONS_OVERFLOW)); 677 chevron_->SetIcon(*tp->GetBitmapNamed(IDR_BROWSER_ACTIONS_OVERFLOW));
676 chevron_->SetHoverIcon(*tp->GetBitmapNamed(IDR_BROWSER_ACTIONS_OVERFLOW_H)); 678 chevron_->SetHoverIcon(*tp->GetBitmapNamed(IDR_BROWSER_ACTIONS_OVERFLOW_H));
677 chevron_->SetPushedIcon(*tp->GetBitmapNamed(IDR_BROWSER_ACTIONS_OVERFLOW_P)); 679 chevron_->SetPushedIcon(*tp->GetBitmapNamed(IDR_BROWSER_ACTIONS_OVERFLOW_P));
678 } 680 }
679 681
680 void BrowserActionsContainer::SetContainerWidth() { 682 void BrowserActionsContainer::SetContainerWidth() {
681 int visible_actions = model_->GetVisibleIconCount(); 683 int visible_actions = model_->GetVisibleIconCount();
682 if (visible_actions < 0) // All icons should be visible. 684 if (visible_actions < 0) // All icons should be visible.
683 visible_actions = model_->size(); 685 visible_actions = model_->toolbar_items().size();
684 chevron_->SetVisible(static_cast<size_t>(visible_actions) < model_->size()); 686 chevron_->SetVisible(
687 static_cast<size_t>(visible_actions) < model_->toolbar_items().size());
685 container_width_ = IconCountToWidth(visible_actions, chevron_->visible()); 688 container_width_ = IconCountToWidth(visible_actions, chevron_->visible());
686 } 689 }
687 690
688 void BrowserActionsContainer::CloseOverflowMenu() { 691 void BrowserActionsContainer::CloseOverflowMenu() {
689 if (overflow_menu_) 692 if (overflow_menu_)
690 overflow_menu_->CancelMenu(); 693 overflow_menu_->CancelMenu();
691 } 694 }
692 695
693 void BrowserActionsContainer::StopShowFolderDropMenuTimer() { 696 void BrowserActionsContainer::StopShowFolderDropMenuTimer() {
694 show_menu_task_factory_.InvalidateWeakPtrs(); 697 show_menu_task_factory_.InvalidateWeakPtrs();
695 } 698 }
696 699
697 void BrowserActionsContainer::StartShowFolderDropMenuTimer() { 700 void BrowserActionsContainer::StartShowFolderDropMenuTimer() {
698 MessageLoop::current()->PostDelayedTask( 701 MessageLoop::current()->PostDelayedTask(
699 FROM_HERE, 702 FROM_HERE,
700 base::Bind(&BrowserActionsContainer::ShowDropFolder, 703 base::Bind(&BrowserActionsContainer::ShowDropFolder,
701 show_menu_task_factory_.GetWeakPtr()), 704 show_menu_task_factory_.GetWeakPtr()),
702 base::TimeDelta::FromMilliseconds(views::GetMenuShowDelay())); 705 base::TimeDelta::FromMilliseconds(views::GetMenuShowDelay()));
703 } 706 }
704 707
705 void BrowserActionsContainer::ShowDropFolder() { 708 void BrowserActionsContainer::ShowDropFolder() {
706 DCHECK(!overflow_menu_); 709 DCHECK(!overflow_menu_);
707 SetDropIndicator(-1); 710 SetDropIndicator(-1);
708 overflow_menu_ = new BrowserActionOverflowMenuController( 711 overflow_menu_ = new BrowserActionOverflowMenuController(
709 this, chevron_, browser_action_views_, VisibleBrowserActions()); 712 this, browser_, chevron_, browser_action_views_, VisibleBrowserActions());
710 overflow_menu_->set_observer(this); 713 overflow_menu_->set_observer(this);
711 overflow_menu_->RunMenu(GetWidget(), true); 714 overflow_menu_->RunMenu(GetWidget(), true);
712 } 715 }
713 716
714 void BrowserActionsContainer::SetDropIndicator(int x_pos) { 717 void BrowserActionsContainer::SetDropIndicator(int x_pos) {
715 if (drop_indicator_position_ != x_pos) { 718 if (drop_indicator_position_ != x_pos) {
716 drop_indicator_position_ = x_pos; 719 drop_indicator_position_ = x_pos;
717 SchedulePaint(); 720 SchedulePaint();
718 } 721 }
719 } 722 }
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 views::BubbleBorder::ArrowLocation arrow_location = base::i18n::IsRTL() ? 810 views::BubbleBorder::ArrowLocation arrow_location = base::i18n::IsRTL() ?
808 views::BubbleBorder::TOP_LEFT : views::BubbleBorder::TOP_RIGHT; 811 views::BubbleBorder::TOP_LEFT : views::BubbleBorder::TOP_RIGHT;
809 popup_ = ExtensionPopup::ShowPopup(popup_url, 812 popup_ = ExtensionPopup::ShowPopup(popup_url,
810 browser_, 813 browser_,
811 reference_view, 814 reference_view,
812 arrow_location); 815 arrow_location);
813 popup_->GetWidget()->AddObserver(this); 816 popup_->GetWidget()->AddObserver(this);
814 popup_button_ = button; 817 popup_button_ = button;
815 popup_button_->SetButtonPushed(); 818 popup_button_->SetButtonPushed();
816 } 819 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698