Index: chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc |
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc |
index b9a76af440ae24e28cb295edae34d97aa609e3c0..dead6739e88802ef0fb3d3846fab3d6e9cd39b76 100644 |
--- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc |
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc |
@@ -14,7 +14,6 @@ |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_list.h" |
-#include "chrome/browser/ui/views/bubble/bubble.h" |
#include "chrome/common/chrome_notification_types.h" |
#include "content/browser/user_metrics.h" |
#include "content/public/browser/notification_service.h" |
@@ -23,20 +22,14 @@ |
#include "ui/base/keycodes/keyboard_codes.h" |
#include "ui/base/l10n/l10n_util.h" |
#include "ui/base/resource/resource_bundle.h" |
-#include "ui/gfx/canvas.h" |
#include "views/controls/button/text_button.h" |
#include "views/controls/label.h" |
#include "views/controls/link.h" |
#include "views/controls/textfield/textfield.h" |
#include "views/events/event.h" |
-#include "views/focus/focus_manager.h" |
#include "views/layout/grid_layout.h" |
#include "views/layout/layout_constants.h" |
-#include "views/window/client_view.h" |
- |
-#if defined(TOOLKIT_USES_GTK) |
-#include "views/widget/native_widget_gtk.h" |
-#endif |
+#include "views/widget/widget.h" |
using views::ColumnSet; |
using views::GridLayout; |
@@ -50,18 +43,18 @@ static const int kTitlePadding = 4; |
// of the field's left edge. |
static const int kMinimumFieldSize = 180; |
+// TODO(msw): Get color from theme/window color. |
+static const SkColor kColor = SK_ColorWHITE; |
+ |
// Declared in browser_dialogs.h so callers don't have to depend on our header. |
namespace browser { |
-void ShowBookmarkBubbleView(views::Widget* parent, |
- const gfx::Rect& bounds, |
- BubbleDelegate* delegate, |
+void ShowBookmarkBubbleView(views::View* anchor_view, |
Profile* profile, |
const GURL& url, |
bool newly_bookmarked) { |
- BookmarkBubbleView::Show(parent, bounds, delegate, profile, url, |
- newly_bookmarked); |
+ BookmarkBubbleView::ShowBubble(anchor_view, profile, url, newly_bookmarked); |
} |
void HideBookmarkBubbleView() { |
@@ -79,30 +72,20 @@ bool IsBookmarkBubbleViewShowing() { |
BookmarkBubbleView* BookmarkBubbleView::bookmark_bubble_ = NULL; |
// static |
-void BookmarkBubbleView::Show(views::Widget* parent, |
- const gfx::Rect& bounds, |
- BubbleDelegate* delegate, |
- Profile* profile, |
- const GURL& url, |
- bool newly_bookmarked) { |
+void BookmarkBubbleView::ShowBubble(views::View* anchor_view, |
+ Profile* profile, |
+ const GURL& url, |
+ bool newly_bookmarked) { |
if (IsShowing()) |
return; |
- bookmark_bubble_ = new BookmarkBubbleView(delegate, profile, url, |
- newly_bookmarked); |
- Bubble* bubble = Bubble::Show( |
- parent, bounds, views::BubbleBorder::TOP_RIGHT, |
- views::BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR, bookmark_bubble_, |
- bookmark_bubble_); |
- // |bubble_| can be set to NULL in BubbleClosing when we close the bubble |
- // asynchronously. However, that can happen during the Show call above if the |
- // window loses activation while we are getting to ready to show the bubble, |
- // so we must check to make sure we still have a valid bubble before |
- // proceeding. |
- if (!bookmark_bubble_) |
- return; |
- bookmark_bubble_->set_bubble(bubble); |
- bubble->SizeToContents(); |
+ bookmark_bubble_ = |
+ new BookmarkBubbleView(anchor_view, profile, url, newly_bookmarked); |
+ views::BubbleDelegateView::CreateBubble(bookmark_bubble_); |
+ bookmark_bubble_->Show(); |
+ // Select the entire title textfield contents when the bubble is first shown. |
+ bookmark_bubble_->title_tf_->SelectAll(); |
+ |
GURL url_ptr(url); |
content::NotificationService::current()->Notify( |
chrome::NOTIFICATION_BOOKMARK_BUBBLE_SHOWN, |
@@ -117,7 +100,7 @@ bool BookmarkBubbleView::IsShowing() { |
void BookmarkBubbleView::Hide() { |
if (IsShowing()) |
- bookmark_bubble_->Close(); |
+ bookmark_bubble_->GetWidget()->Close(); |
} |
BookmarkBubbleView::~BookmarkBubbleView() { |
@@ -131,54 +114,47 @@ BookmarkBubbleView::~BookmarkBubbleView() { |
} |
} |
-void BookmarkBubbleView::BubbleShown() { |
- DCHECK(GetWidget()); |
- GetFocusManager()->RegisterAccelerator( |
- views::Accelerator(ui::VKEY_RETURN, false, false, false), this); |
+views::View* BookmarkBubbleView::GetInitiallyFocusedView() { |
+ return title_tf_; |
+} |
- title_tf_->RequestFocus(); |
- title_tf_->SelectAll(); |
+gfx::Point BookmarkBubbleView::GetAnchorPoint() { |
+ // Compensate for some built-in padding in the star image. |
+ return BubbleDelegateView::GetAnchorPoint().Subtract(gfx::Point(0, 5)); |
} |
-bool BookmarkBubbleView::AcceleratorPressed( |
- const views::Accelerator& accelerator) { |
- if (accelerator.key_code() != ui::VKEY_RETURN) |
- return false; |
+void BookmarkBubbleView::WindowClosing() { |
+ // We have to reset |bubble_| here, not in our destructor, because we'll be |
+ // destroyed asynchronously and the shown state will be checked before then. |
+ DCHECK(bookmark_bubble_ == this); |
+ bookmark_bubble_ = NULL; |
- if (edit_button_->HasFocus()) |
- HandleButtonPressed(edit_button_); |
- else |
- HandleButtonPressed(close_button_); |
- return true; |
-} |
+ content::NotificationService::current()->Notify( |
+ chrome::NOTIFICATION_BOOKMARK_BUBBLE_HIDDEN, |
+ content::Source<Profile>(profile_->GetOriginalProfile()), |
+ content::NotificationService::NoDetails()); |
+ } |
-void BookmarkBubbleView::ViewHierarchyChanged(bool is_add, |
- views::View* parent, |
- views::View* child) { |
- if (is_add && child == this) |
- Init(); |
-} |
+bool BookmarkBubbleView::AcceleratorPressed( |
+ const views::Accelerator& accelerator) { |
+ if (accelerator.key_code() == ui::VKEY_RETURN) { |
+ if (edit_button_->HasFocus()) |
+ HandleButtonPressed(edit_button_); |
+ else |
+ HandleButtonPressed(close_button_); |
+ return true; |
+ } else if (accelerator.key_code() == ui::VKEY_ESCAPE) { |
+ remove_bookmark_ = newly_bookmarked_; |
+ apply_edits_ = false; |
+ } |
-BookmarkBubbleView::BookmarkBubbleView(BubbleDelegate* delegate, |
- Profile* profile, |
- const GURL& url, |
- bool newly_bookmarked) |
- : delegate_(delegate), |
- profile_(profile), |
- url_(url), |
- newly_bookmarked_(newly_bookmarked), |
- parent_model_( |
- profile_->GetBookmarkModel(), |
- profile_->GetBookmarkModel()->GetMostRecentlyAddedNodeForURL(url)), |
- remove_bookmark_(false), |
- apply_edits_(true) { |
+ return BubbleDelegateView::AcceleratorPressed(accelerator); |
} |
void BookmarkBubbleView::Init() { |
remove_link_ = new views::Link(l10n_util::GetStringUTF16( |
IDS_BOOKMARK_BUBBLE_REMOVE_BOOKMARK)); |
remove_link_->set_listener(this); |
- remove_link_->SetBackgroundColor(Bubble::kBackgroundColor); |
edit_button_ = new views::NativeTextButton( |
this, l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_OPTIONS)); |
@@ -189,7 +165,6 @@ void BookmarkBubbleView::Init() { |
views::Label* combobox_label = new views::Label( |
l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_FOLDER_TEXT)); |
- combobox_label->SetBackgroundColor(Bubble::kBackgroundColor); |
parent_combobox_ = new views::Combobox(&parent_model_); |
parent_combobox_->SetSelectedItem(parent_model_.node_parent_index()); |
@@ -202,7 +177,6 @@ void BookmarkBubbleView::Init() { |
IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARK)); |
title_label->SetFont( |
ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::MediumFont)); |
- title_label->SetBackgroundColor(Bubble::kBackgroundColor); |
title_label->SetEnabledColor(SkColorSetRGB(6, 45, 117)); |
GridLayout* layout = new GridLayout(this); |
@@ -245,7 +219,6 @@ void BookmarkBubbleView::Init() { |
layout->StartRow(0, 2); |
views::Label* label = new views::Label( |
l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_TITLE_TEXT)); |
- label->SetBackgroundColor(Bubble::kBackgroundColor); |
layout->AddView(label); |
title_tf_ = new views::Textfield(); |
title_tf_->SetText(GetTitle()); |
@@ -261,6 +234,23 @@ void BookmarkBubbleView::Init() { |
layout->StartRow(0, 3); |
layout->AddView(edit_button_); |
layout->AddView(close_button_); |
+ |
+ AddAccelerator(views::Accelerator(ui::VKEY_RETURN, 0)); |
+} |
+ |
+BookmarkBubbleView::BookmarkBubbleView(views::View* anchor_view, |
+ Profile* profile, |
+ const GURL& url, |
+ bool newly_bookmarked) |
+ : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT, kColor), |
+ profile_(profile), |
+ url_(url), |
+ newly_bookmarked_(newly_bookmarked), |
+ parent_model_( |
+ profile_->GetBookmarkModel(), |
+ profile_->GetBookmarkModel()->GetMostRecentlyAddedNodeForURL(url)), |
+ remove_bookmark_(false), |
+ apply_edits_(true) { |
} |
string16 BookmarkBubbleView::GetTitle() { |
@@ -286,9 +276,7 @@ void BookmarkBubbleView::LinkClicked(views::Link* source, int event_flags) { |
// Set this so we remove the bookmark after the window closes. |
remove_bookmark_ = true; |
apply_edits_ = false; |
- |
- bubble_->set_fade_away_on_close(true); |
- Close(); |
+ StartFade(false); |
} |
void BookmarkBubbleView::ItemChanged(views::Combobox* combobox, |
@@ -297,97 +285,32 @@ void BookmarkBubbleView::ItemChanged(views::Combobox* combobox, |
if (new_index + 1 == parent_model_.GetItemCount()) { |
UserMetrics::RecordAction( |
UserMetricsAction("BookmarkBubble_EditFromCombobox")); |
- |
ShowEditor(); |
- return; |
} |
} |
-void BookmarkBubbleView::BubbleClosing(Bubble* bubble, |
- bool closed_by_escape) { |
- if (closed_by_escape) { |
- remove_bookmark_ = newly_bookmarked_; |
- apply_edits_ = false; |
- } |
- |
- // We have to reset |bubble_| here, not in our destructor, because we'll be |
- // destroyed asynchronously and the shown state will be checked before then. |
- DCHECK(bookmark_bubble_ == this); |
- bookmark_bubble_ = NULL; |
- |
- if (delegate_) |
- delegate_->BubbleClosing(bubble, closed_by_escape); |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_BOOKMARK_BUBBLE_HIDDEN, |
- content::Source<Profile>(profile_->GetOriginalProfile()), |
- content::NotificationService::NoDetails()); |
-} |
- |
-bool BookmarkBubbleView::CloseOnEscape() { |
- return delegate_ ? delegate_->CloseOnEscape() : true; |
-} |
- |
-bool BookmarkBubbleView::FadeInOnShow() { |
- return false; |
-} |
- |
-string16 BookmarkBubbleView::GetAccessibleName() { |
- return l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_ADD_BOOKMARK); |
-} |
- |
-void BookmarkBubbleView::Close() { |
- ApplyEdits(); |
- GetWidget()->Close(); |
-} |
- |
void BookmarkBubbleView::HandleButtonPressed(views::Button* sender) { |
if (sender == edit_button_) { |
UserMetrics::RecordAction(UserMetricsAction("BookmarkBubble_Edit")); |
- bubble_->set_fade_away_on_close(true); |
ShowEditor(); |
} else { |
- DCHECK(sender == close_button_); |
- bubble_->set_fade_away_on_close(true); |
- Close(); |
+ DCHECK_EQ(sender, close_button_); |
+ StartFade(false); |
} |
- // WARNING: we've most likely been deleted when CloseWindow returns. |
} |
void BookmarkBubbleView::ShowEditor() { |
const BookmarkNode* node = |
profile_->GetBookmarkModel()->GetMostRecentlyAddedNodeForURL(url_); |
+ views::Widget* parent = anchor_view()->GetWidget(); |
+ Profile* profile = profile_; |
+ ApplyEdits(); |
+ GetWidget()->Close(); |
-#if defined(USE_AURA) |
- NOTIMPLEMENTED(); |
- gfx::NativeView parent = NULL; |
-#elif defined(OS_WIN) |
- // Parent the editor to our root ancestor (not the root we're in, as that |
- // is the info bubble and will close shortly). |
- HWND parent = GetAncestor(GetWidget()->GetNativeView(), GA_ROOTOWNER); |
- |
- // We're about to show the bookmark editor. When the bookmark editor closes |
- // we want the browser to become active. NativeWidgetWin::Hide() does a hide |
- // in a such way that activation isn't changed, which means when we close |
- // Windows gets confused as to who it should give active status to. We |
- // explicitly hide the bookmark bubble window in such a way that activation |
- // status changes. That way, when the editor closes, activation is properly |
- // restored to the browser. |
- ShowWindow(GetWidget()->GetNativeView(), SW_HIDE); |
-#elif defined(TOOLKIT_USES_GTK) |
- gfx::NativeWindow parent = GTK_WINDOW( |
- static_cast<views::NativeWidgetGtk*>(GetWidget()->native_widget())-> |
- GetTransientParent()); |
-#endif |
- |
- // Even though we just hid the window, we need to invoke Close to schedule |
- // the delete and all that. |
- Close(); |
- |
- if (node) { |
- BookmarkEditor::Show(parent, profile_, |
+ if (node) |
+ BookmarkEditor::Show(parent->GetNativeWindow(), profile, |
BookmarkEditor::EditDetails::EditNode(node), |
BookmarkEditor::SHOW_TREE); |
- } |
} |
void BookmarkBubbleView::ApplyEdits() { |
@@ -404,8 +327,7 @@ void BookmarkBubbleView::ApplyEdits() { |
UserMetricsAction("BookmarkBubble_ChangeTitleInBubble")); |
} |
// Last index means 'Choose another folder...' |
- if (parent_combobox_->selected_item() < |
- parent_model_.GetItemCount() - 1) { |
+ if (parent_combobox_->selected_item() < parent_model_.GetItemCount() - 1) { |
const BookmarkNode* new_parent = |
parent_model_.GetNodeAt(parent_combobox_->selected_item()); |
if (new_parent != node->parent()) { |