| Index: chrome/browser/views/bookmark_bar_view.cc
|
| ===================================================================
|
| --- chrome/browser/views/bookmark_bar_view.cc (revision 2631)
|
| +++ chrome/browser/views/bookmark_bar_view.cc (working copy)
|
| @@ -143,6 +143,9 @@
|
| // Color of the instructional text.
|
| static const SkColor kInstructionsColor = SkColorSetRGB(128, 128, 142);
|
|
|
| +// Tag for the other button.
|
| +static const int kOtherFolderButtonTag = 1;
|
| +
|
| namespace {
|
|
|
| // Calculates the drop operation given the event and supported set of
|
| @@ -254,27 +257,27 @@
|
| virtual void Paint(ChromeCanvas *canvas) {
|
| ChromeViews::TextButton::Paint(canvas);
|
|
|
| + PaintAnimation(this, canvas, show_animation_->GetCurrentValue());
|
| + }
|
| +
|
| + static void PaintAnimation(ChromeViews::View* view,
|
| + ChromeCanvas* canvas,
|
| + double animation_value) {
|
| // Since we can't change the alpha of the button (it contains un-alphable
|
| // text), we paint the bar background over the front of the button. As the
|
| // bar background is a gradient, we have to paint the gradient at the
|
| // size of the parent (hence all the margin math below). We can't use
|
| // the parent's actual bounds because they differ from what is painted.
|
| SkPaint paint;
|
| - paint.setAlpha(static_cast<int>(
|
| - (1.0 - show_animation_->GetCurrentValue()) * 255));
|
| + paint.setAlpha(static_cast<int>((1.0 - animation_value) * 255));
|
| paint.setShader(gfx::CreateGradientShader(0,
|
| - height() + kTopMargin + kBottomMargin,
|
| + view->height() + kTopMargin + kBottomMargin,
|
| kTopBorderColor,
|
| kBackgroundColor))->safeUnref();
|
| - canvas->FillRectInt(0, -kTopMargin, width(),
|
| - height() + kTopMargin + kBottomMargin, paint);
|
| + canvas->FillRectInt(0, -kTopMargin, view->width(),
|
| + view->height() + kTopMargin + kBottomMargin, paint);
|
| }
|
|
|
| - virtual void AnimationProgressed(const Animation* animation) {
|
| - ChromeViews::TextButton::AnimationProgressed(animation);
|
| - SchedulePaint();
|
| - }
|
| -
|
| private:
|
| const GURL& url_;
|
| Profile* profile_;
|
| @@ -283,6 +286,45 @@
|
| DISALLOW_COPY_AND_ASSIGN(BookmarkButton);
|
| };
|
|
|
| +// BookmarkFolderButton -------------------------------------------------------
|
| +
|
| +// Buttons used for folders on the bookmark bar, including the 'other folders'
|
| +// button.
|
| +class BookmarkFolderButton : public ChromeViews::MenuButton {
|
| + public:
|
| + BookmarkFolderButton(const std::wstring& title,
|
| + ChromeViews::ViewMenuDelegate* menu_delegate,
|
| + bool show_menu_marker)
|
| + : MenuButton(title, menu_delegate, show_menu_marker) {
|
| + show_animation_.reset(new SlideAnimation(this));
|
| + if (BookmarkBarView::testing_) {
|
| + // For some reason during testing the events generated by animating
|
| + // throw off the test. So, don't animate while testing.
|
| + show_animation_->Reset(1);
|
| + } else {
|
| + show_animation_->Show();
|
| + }
|
| + }
|
| +
|
| + virtual bool IsTriggerableEvent(const ChromeViews::MouseEvent& e) {
|
| + // This is hard coded to avoid potential notification on left mouse down,
|
| + // which we want to show the menu.
|
| + return e.IsMiddleMouseButton();
|
| + }
|
| +
|
| + virtual void Paint(ChromeCanvas *canvas) {
|
| + ChromeViews::MenuButton::Paint(canvas, false);
|
| +
|
| + BookmarkButton::PaintAnimation(this, canvas,
|
| + show_animation_->GetCurrentValue());
|
| + }
|
| +
|
| + private:
|
| + scoped_ptr<SlideAnimation> show_animation_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(BookmarkFolderButton);
|
| +};
|
| +
|
| // DropInfo -------------------------------------------------------------------
|
|
|
| // Tracks drops on the BookmarkBarView.
|
| @@ -386,6 +428,7 @@
|
| MenuItemView* menu,
|
| int* next_menu_id) {
|
| DCHECK(!parent->GetChildCount() ||
|
| +
|
| start_child_index < parent->GetChildCount());
|
| for (int i = start_child_index; i < parent->GetChildCount(); ++i) {
|
| BookmarkNode* node = parent->GetChild(i);
|
| @@ -1127,10 +1170,11 @@
|
| }
|
|
|
| MenuButton* BookmarkBarView::CreateOtherBookmarkedButton() {
|
| - MenuButton* button = new MenuButton(
|
| + MenuButton* button = new BookmarkFolderButton(
|
| l10n_util::GetString(IDS_BOOMARK_BAR_OTHER_BOOKMARKED), this, false);
|
| button->SetIcon(GetGroupIcon());
|
| button->SetContextMenuController(this);
|
| + button->SetListener(this, kOtherFolderButtonTag);
|
| return button;
|
| }
|
|
|
| @@ -1371,14 +1415,25 @@
|
| }
|
|
|
| void BookmarkBarView::ButtonPressed(ChromeViews::BaseButton* sender) {
|
| - int index = GetChildIndex(sender);
|
| - DCHECK(index != -1);
|
| - BookmarkNode* node = model_->GetBookmarkBarNode()->GetChild(index);
|
| + BookmarkNode* node;
|
| + if (sender->GetTag() == kOtherFolderButtonTag) {
|
| + node = model_->other_node();
|
| + } else {
|
| + int index = GetChildIndex(sender);
|
| + DCHECK(index != -1);
|
| + node = model_->GetBookmarkBarNode()->GetChild(index);
|
| + }
|
| DCHECK(page_navigator_);
|
| - page_navigator_->OpenURL(
|
| - node->GetURL(),
|
| - event_utils::DispositionFromEventFlags(sender->mouse_event_flags()),
|
| - PageTransition::AUTO_BOOKMARK);
|
| + if (node->is_url()) {
|
| + page_navigator_->OpenURL(
|
| + node->GetURL(),
|
| + event_utils::DispositionFromEventFlags(sender->mouse_event_flags()),
|
| + PageTransition::AUTO_BOOKMARK);
|
| + } else {
|
| + BookmarkBarContextMenuController::OpenAll(
|
| + GetViewContainer()->GetHWND(), GetPageNavigator(), node,
|
| + event_utils::DispositionFromEventFlags(sender->mouse_event_flags()));
|
| + }
|
| UserMetrics::RecordAction(L"ClickedBookmarkBarURLButton", profile_);
|
| }
|
|
|
| @@ -1416,8 +1471,9 @@
|
| return button;
|
| } else {
|
| ChromeViews::MenuButton* button =
|
| - new ChromeViews::MenuButton(node->GetTitle(), this, false);
|
| + new BookmarkFolderButton(node->GetTitle(), this, false);
|
| button->SetIcon(GetGroupIcon());
|
| + button->SetListener(this, 0);
|
| ConfigureButton(node, button);
|
| return button;
|
| }
|
|
|