Index: chrome/browser/chromeos/compact_location_bar_view.cc |
=================================================================== |
--- chrome/browser/chromeos/compact_location_bar_view.cc (revision 38044) |
+++ chrome/browser/chromeos/compact_location_bar_view.cc (working copy) |
@@ -8,31 +8,41 @@ |
#include <algorithm> |
#include "app/l10n_util.h" |
+#include "app/drag_drop_types.h" |
#include "base/gfx/point.h" |
#include "chrome/app/chrome_dll_resource.h" |
+#include "chrome/browser/bookmarks/bookmark_drag_data.h" |
+#include "chrome/browser/bookmarks/bookmark_model.h" |
#include "chrome/browser/autocomplete/autocomplete_edit_view_gtk.h" |
#include "chrome/browser/browser_list.h" |
#include "chrome/browser/browser_theme_provider.h" |
#include "chrome/browser/chromeos/compact_location_bar_host.h" |
+#include "chrome/browser/metrics/user_metrics.h" |
#include "chrome/browser/profile.h" |
+#include "chrome/browser/tab_contents/tab_contents.h" |
#include "chrome/browser/view_ids.h" |
#include "chrome/browser/views/event_utils.h" |
#include "chrome/browser/views/frame/browser_view.h" |
+#include "chrome/browser/views/toolbar_star_toggle.h" |
#include "grit/chromium_strings.h" |
#include "grit/generated_resources.h" |
#include "grit/theme_resources.h" |
#include "views/background.h" |
#include "views/controls/button/image_button.h" |
#include "views/controls/native/native_view_host.h" |
+#include "views/drag_utils.h" |
#include "views/widget/widget.h" |
#include "views/window/window.h" |
namespace chromeos { |
+ |
const int kCompactLocationBarDefaultWidth = 700; |
+const int kWidgetsSeparatorWidth = 2; |
CompactLocationBarView::CompactLocationBarView(CompactLocationBarHost* host) |
: DropdownBarView(host), |
- reload_(NULL) { |
+ reload_(NULL), |
+ star_(NULL) { |
set_background(views::Background::CreateStandardPanelBackground()); |
SetFocusable(true); |
} |
@@ -98,7 +108,14 @@ |
location_entry_view_->set_focus_view(this); |
location_entry_view_->Attach(location_entry_->widget()); |
- // TODO(oshima): Add Star Button |
+ star_ = new ToolbarStarToggle(this); |
+ star_->SetDragController(this); |
+ star_->set_profile(browser()->profile()); |
+ star_->set_host_view(this); |
+ star_->set_bubble_positioner(this); |
+ star_->Init(); |
+ AddChildView(star_); |
+ |
location_entry_->Update(browser()->GetSelectedTabContents()); |
} |
@@ -109,9 +126,14 @@ |
if (!reload_) |
return gfx::Size(); // Not initialized yet, do nothing. |
- gfx::Size sz = reload_->GetPreferredSize(); |
+ gfx::Size reload_size = reload_->GetPreferredSize(); |
+ gfx::Size star_size = star_->GetPreferredSize(); |
+ gfx::Size location_size = location_entry_view_->GetPreferredSize(); |
- return gfx::Size(500, sz.height()); |
+ int max_height = std::max(reload_size.height(), |
+ std::max(star_size.height(), |
+ location_size.height())); |
+ return gfx::Size(500, max_height); |
} |
void CompactLocationBarView::Layout() { |
@@ -119,17 +141,22 @@ |
return; // Not initialized yet, do nothing. |
int cur_x = 0; |
+ gfx::Size reload_size = reload_->GetPreferredSize(); |
+ int reload_height = std::min(reload_size.height(), height()); |
+ reload_->SetBounds(cur_x, (height() - reload_height) / 2, |
+ reload_size.width(), reload_height); |
+ cur_x += reload_size.width() + kWidgetsSeparatorWidth; |
- gfx::Size sz = reload_->GetPreferredSize(); |
- reload_->SetBounds(cur_x, 0, sz.width(), sz.height()); |
- cur_x += sz.width(); |
+ gfx::Size star_size = star_->GetPreferredSize(); |
+ int star_height = std::min(star_size.height(), height()); |
+ star_->SetBounds(cur_x, (height() - star_height) / 2, |
+ star_size.width(), star_height); |
+ cur_x += star_size.width(); |
- cur_x += 2; |
- |
- // The location bar gets the rest of the space in the middle. |
- location_entry_view_->SetBounds(cur_x, 0, width() - cur_x * 2 - 2, height()); |
- |
- cur_x = width() - sz.width(); |
+ // The location bar is located exactly to the right of the star button and |
+ // takes all the space to the right except for small margin at the end. |
+ int location_width = width() - cur_x - kWidgetsSeparatorWidth; |
+ location_entry_view_->SetBounds(cur_x, 0, location_width, height()); |
} |
void CompactLocationBarView::Paint(gfx::Canvas* canvas) { |
@@ -198,4 +225,55 @@ |
return popup.AdjustToFit(GetWidget()->GetWindow()->GetBounds()); |
} |
+//////////////////////////////////////////////////////////////////////////////// |
+// views::DragController overrides: |
+void CompactLocationBarView::WriteDragData(views::View* sender, |
+ int press_x, |
+ int press_y, |
+ OSExchangeData* data) { |
+ DCHECK( |
+ GetDragOperations(sender, press_x, press_y) != DragDropTypes::DRAG_NONE); |
+ |
+ UserMetrics::RecordAction("CompactLocationBar_DragStar", |
+ browser()->profile()); |
+ |
+ // If there is a bookmark for the URL, add the bookmark drag data for it. We |
+ // do this to ensure the bookmark is moved, rather than creating an new |
+ // bookmark. |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ if (tab) { |
+ Profile* profile = browser()->profile(); |
+ if (profile && profile->GetBookmarkModel()) { |
+ const BookmarkNode* node = profile->GetBookmarkModel()-> |
+ GetMostRecentlyAddedNodeForURL(tab->GetURL()); |
+ if (node) { |
+ BookmarkDragData bookmark_data(node); |
+ bookmark_data.Write(profile, data); |
+ } |
+ } |
+ |
+ drag_utils::SetURLAndDragImage(tab->GetURL(), |
+ UTF16ToWideHack(tab->GetTitle()), |
+ tab->GetFavIcon(), |
+ data); |
+ } |
+} |
+ |
+int CompactLocationBarView::GetDragOperations(views::View* sender, |
+ int x, |
+ int y) { |
+ DCHECK(sender == star_); |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ if (!tab || !tab->ShouldDisplayURL() || !tab->GetURL().is_valid()) { |
+ return DragDropTypes::DRAG_NONE; |
+ } |
+ Profile* profile = browser()->profile(); |
+ if (profile && profile->GetBookmarkModel() && |
+ profile->GetBookmarkModel()->IsBookmarked(tab->GetURL())) { |
+ return DragDropTypes::DRAG_MOVE | DragDropTypes::DRAG_COPY | |
+ DragDropTypes::DRAG_LINK; |
+ } |
+ return DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_LINK; |
+} |
+ |
} // namespace chromeos |