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

Unified Diff: chrome/browser/ui/views/location_bar/location_bar_view.cc

Issue 11648024: Clean-up positioning and spacing in chrome/browser/ui/views/location_bar/location_bar_view.cc (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Removed executable bit. Created 7 years, 12 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/views/location_bar/location_bar_view.h ('k') | chrome/chrome_browser_ui.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/location_bar/location_bar_view.cc
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc
index 03d3ee3c42444b8ef21b9d3269c4faa37da07cc4..c923a07aa062ead570208f23c5ab2fa9f84aeb8a 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -39,6 +39,7 @@
#include "chrome/browser/ui/views/location_bar/content_setting_image_view.h"
#include "chrome/browser/ui/views/location_bar/ev_bubble_view.h"
#include "chrome/browser/ui/views/location_bar/keyword_hint_view.h"
+#include "chrome/browser/ui/views/location_bar/location_bar_layout.h"
#include "chrome/browser/ui/views/location_bar/location_icon_view.h"
#include "chrome/browser/ui/views/location_bar/open_pdf_in_reader_view.h"
#include "chrome/browser/ui/views/location_bar/page_action_image_view.h"
@@ -640,8 +641,6 @@ void LocationBarView::Layout() {
// TODO(jhawkins): Remove once crbug.com/101994 is fixed.
CHECK(location_icon_view_);
- // TODO(sky): baseline layout.
- int location_y = kVerticalEdgeThickness;
// In some cases (e.g. fullscreen mode) we may have 0 height. We still want
// to position our child views in this case, because other things may be
// positioned relative to them (e.g. the "bookmark added" bubble if the user
@@ -660,96 +659,29 @@ void LocationBarView::Layout() {
const int kEdgeEditPadding = GetEdgeItemPadding() - kEditInternalSpace;
const int kBubbleVerticalPadding = (mode_ == POPUP) ?
-1 : kBubbleHorizontalPadding;
+ // The largest fraction of the omnibox that can be taken by resizable
+ // bubble decorations such as the EV_SECURE decoration.
+ const double kMaxBubbleFraction = 0.5;
+ const int kBubbleLocationY = kVerticalEdgeThickness + kBubbleVerticalPadding;
- // Start by reserving the padding at the right edge.
- int entry_width = width() - kEdgeThickness;
- // No need for edge item padding with action box as it fills
- // all the area on the right.
- if (!action_box_button_view_)
- entry_width -= GetEdgeItemPadding();
-
- // |location_icon_view_| is visible except when |ev_bubble_view_| or
- // |selected_keyword_view_| are visible.
- int location_icon_width = 0;
- int ev_bubble_width = 0;
+ LocationBarLayout left_decorations(LocationBarLayout::LEFT_EDGE,
+ kItemEditPadding, kEdgeEditPadding);
+ LocationBarLayout right_decorations(LocationBarLayout::RIGHT_EDGE,
+ kItemEditPadding, kEdgeEditPadding);
+
+ selected_keyword_view_->SetVisible(false);
location_icon_view_->SetVisible(false);
ev_bubble_view_->SetVisible(false);
+ keyword_hint_view_->SetVisible(false);
const string16 keyword(location_entry_->model()->keyword());
const bool is_keyword_hint(location_entry_->model()->is_keyword_hint());
const bool show_selected_keyword = !keyword.empty() && !is_keyword_hint;
- if (show_selected_keyword) {
- // Assume the keyword might be hidden.
- entry_width -= (kEdgeThickness + kEdgeEditPadding);
- } else if (model_->GetSecurityLevel() == ToolbarModel::EV_SECURE) {
- ev_bubble_view_->SetVisible(true);
- ev_bubble_view_->SetLabel(model_->GetEVCertName());
- ev_bubble_width = ev_bubble_view_->GetPreferredSize().width();
- // We'll adjust this width and take it out of |entry_width| below.
- } else {
- location_icon_view_->SetVisible(true);
- location_icon_width = location_icon_view_->GetPreferredSize().width();
- entry_width -= (kEdgeThickness + GetEdgeItemPadding() +
- location_icon_width + kItemEditPadding);
- }
-
- if (action_box_button_view_) {
- action_box_button_view_->SetVisible(true);
- entry_width -= action_box_button_view_->width() + GetItemPadding();
- }
- if (star_view_ && star_view_->visible())
- entry_width -= star_view_->GetPreferredSize().width() + GetItemPadding();
-
- if (script_bubble_icon_view_ && script_bubble_icon_view_->visible()) {
- entry_width -= script_bubble_icon_view_->GetPreferredSize().width() +
- GetItemPadding();
- }
-
- if (open_pdf_in_reader_view_ && open_pdf_in_reader_view_->visible()) {
- entry_width -= open_pdf_in_reader_view_->GetPreferredSize().width() +
- GetItemPadding();
- }
- for (PageActionViews::const_iterator i(page_action_views_.begin());
- i != page_action_views_.end(); ++i) {
- if ((*i)->visible())
- entry_width -= ((*i)->GetPreferredSize().width() + GetItemPadding());
- }
- if (zoom_view_->visible())
- entry_width -= zoom_view_->GetPreferredSize().width() + GetItemPadding();
- for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
- i != content_setting_views_.end(); ++i) {
- if ((*i)->visible())
- entry_width -= ((*i)->GetPreferredSize().width() + GetItemPadding());
- }
- if (web_intents_button_view_->visible()) {
- entry_width -= web_intents_button_view_->GetPreferredSize().width() +
- GetItemPadding();
- }
- // The gap between the edit and whatever is to its right is shortened.
- entry_width += kEditInternalSpace;
-
- // Size the EV bubble after taking star/page actions/content settings out of
- // |entry_width| so we won't take too much space.
- if (ev_bubble_width) {
- // Try to elide the bubble to be no larger than half the total available
- // space, but never elide it any smaller than 150 px.
- static const int kMinElidedBubbleWidth = 150;
- static const double kMaxBubbleFraction = 0.5;
- const int total_padding =
- kEdgeThickness + kBubbleHorizontalPadding + kItemEditPadding;
- ev_bubble_width = std::min(ev_bubble_width, std::max(kMinElidedBubbleWidth,
- static_cast<int>((entry_width - total_padding) * kMaxBubbleFraction)));
- entry_width -= (total_padding + ev_bubble_width);
- }
-
- const int max_edit_width = location_entry_->GetMaxEditWidth(entry_width);
- if (max_edit_width < 0)
- return;
-
const bool show_keyword_hint = !keyword.empty() && is_keyword_hint;
- selected_keyword_view_->SetVisible(show_selected_keyword);
- keyword_hint_view_->SetVisible(show_keyword_hint);
if (show_selected_keyword) {
+ left_decorations.AddDecoration(
+ kBubbleLocationY, 0, true, 0, kBubbleHorizontalPadding,
+ GetItemPadding(), 0, selected_keyword_view_);
if (selected_keyword_view_->keyword() != keyword) {
selected_keyword_view_->SetKeyword(keyword);
const TemplateURL* template_url =
@@ -767,140 +699,86 @@ void LocationBarView::Layout() {
selected_keyword_view_->set_is_extension_icon(false);
}
}
- } else if (show_keyword_hint) {
- if (keyword_hint_view_->keyword() != keyword)
- keyword_hint_view_->SetKeyword(keyword);
+ } else if (model_->GetSecurityLevel() == ToolbarModel::EV_SECURE) {
+ ev_bubble_view_->SetLabel(model_->GetEVCertName());
+ left_decorations.AddDecoration(
+ kBubbleLocationY, 0, false, kMaxBubbleFraction,
+ kBubbleHorizontalPadding, GetItemPadding(), 0, ev_bubble_view_);
+ } else {
+ left_decorations.AddDecoration(
+ location_height, location_icon_view_->GetBuiltInHorizontalPadding(),
+ location_icon_view_);
}
- // Lay out items to the right of the edit field.
- int offset = width() - kEdgeThickness;
if (action_box_button_view_) {
- offset -= action_box_button_view_->width();
- action_box_button_view_->SetPosition(
- gfx::Point(offset,
- kVerticalEdgeThickness -
- ActionBoxButtonView::kBorderOverlap));
- offset -= GetItemPadding();
- } else {
- offset -= GetEdgeItemPadding();
+ right_decorations.AddDecoration(
+ kVerticalEdgeThickness - ActionBoxButtonView::kBorderOverlap, 0, false,
+ 0, 0, 0, 0, action_box_button_view_);
}
-
if (star_view_ && star_view_->visible()) {
- offset += star_view_->GetBuiltInHorizontalPadding();
- int star_width = star_view_->GetPreferredSize().width();
- offset -= star_width;
- star_view_->SetBounds(offset, location_y, star_width, location_height);
- offset -= GetItemPadding() - star_view_->GetBuiltInHorizontalPadding();
+ right_decorations.AddDecoration(
+ location_height, star_view_->GetBuiltInHorizontalPadding(),
+ star_view_);
}
-
if (script_bubble_icon_view_ && script_bubble_icon_view_->visible()) {
- offset += script_bubble_icon_view_->GetBuiltInHorizontalPadding();
- int width = script_bubble_icon_view_->GetPreferredSize().width();
- offset -= width;
- script_bubble_icon_view_->SetBounds(
- offset, location_y, width, location_height);
- offset -= GetItemPadding() -
- script_bubble_icon_view_->GetBuiltInHorizontalPadding();
+ right_decorations.AddDecoration(
+ location_height,
+ script_bubble_icon_view_->GetBuiltInHorizontalPadding(),
+ script_bubble_icon_view_);
}
-
if (open_pdf_in_reader_view_ && open_pdf_in_reader_view_->visible()) {
- offset += open_pdf_in_reader_view_->GetBuiltInHorizontalPadding();
- int icon_width = open_pdf_in_reader_view_->GetPreferredSize().width();
- offset -= icon_width;
- open_pdf_in_reader_view_->SetBounds(offset, location_y,
- icon_width, location_height);
- offset -= GetItemPadding() -
- open_pdf_in_reader_view_->GetBuiltInHorizontalPadding();
+ right_decorations.AddDecoration(
+ location_height,
+ open_pdf_in_reader_view_->GetBuiltInHorizontalPadding(),
+ open_pdf_in_reader_view_);
}
-
for (PageActionViews::const_iterator i(page_action_views_.begin());
i != page_action_views_.end(); ++i) {
if ((*i)->visible()) {
- offset += (*i)->GetBuiltInHorizontalPadding();
- int page_action_width = (*i)->GetPreferredSize().width();
- offset -= page_action_width;
- (*i)->SetBounds(offset, location_y, page_action_width, location_height);
- offset -= GetItemPadding() - (*i)->GetBuiltInHorizontalPadding();
+ right_decorations.AddDecoration(
+ location_height, (*i)->GetBuiltInHorizontalPadding(), (*i));
}
}
-
- if (zoom_view_->visible()) {
- int zoom_width = zoom_view_->GetPreferredSize().width();
- offset -= zoom_width;
- zoom_view_->SetBounds(offset, location_y, zoom_width, location_height);
- offset -= GetItemPadding();
- }
-
- // We use a reverse_iterator here because we're laying out the views from
- // right to left but in the vector they're ordered left to right.
+ if (zoom_view_->visible())
+ right_decorations.AddDecoration(location_height, 0, zoom_view_);
for (ContentSettingViews::const_reverse_iterator
i(content_setting_views_.rbegin()); i != content_setting_views_.rend();
++i) {
if ((*i)->visible()) {
- offset += (*i)->GetBuiltInHorizontalPadding();
- int content_blocked_width = (*i)->GetPreferredSize().width();
- offset -= content_blocked_width;
- (*i)->SetBounds(offset, location_y + kBubbleVerticalPadding,
- content_blocked_width, (*i)->GetPreferredSize().height());
- offset -= GetItemPadding() - (*i)->GetBuiltInHorizontalPadding();
+ right_decorations.AddDecoration(
+ kBubbleLocationY, 0, false, 0, GetEdgeItemPadding(), GetItemPadding(),
+ (*i)->GetBuiltInHorizontalPadding(), (*i));
}
}
-
- // Now the web intents button.
if (web_intents_button_view_->visible()) {
- offset += web_intents_button_view_->GetBuiltInHorizontalPadding();
- int width = web_intents_button_view_->GetPreferredSize().width();
- offset -= width;
- web_intents_button_view_->SetBounds(
- offset, location_y + kBubbleVerticalPadding, width,
- web_intents_button_view_->GetPreferredSize().height());
- offset -= GetItemPadding() -
- web_intents_button_view_->GetBuiltInHorizontalPadding();
+ right_decorations.AddDecoration(
+ kBubbleLocationY, 0, false, 0, GetEdgeItemPadding(), GetItemPadding(),
+ web_intents_button_view_->GetBuiltInHorizontalPadding(),
+ web_intents_button_view_);
}
-
- // Now lay out items to the left of the edit field.
- if (location_icon_view_->visible()) {
- location_icon_view_->SetBounds(
- kEdgeThickness + GetEdgeItemPadding() -
- location_icon_view_->GetBuiltInHorizontalPadding(),
- location_y, location_icon_width, location_height);
- offset = location_icon_view_->bounds().right() + kItemEditPadding -
- location_icon_view_->GetBuiltInHorizontalPadding();
- } else if (ev_bubble_view_->visible()) {
- ev_bubble_view_->SetBounds(kEdgeThickness + kBubbleHorizontalPadding,
- location_y + kBubbleVerticalPadding, ev_bubble_width,
- ev_bubble_view_->GetPreferredSize().height());
- offset = ev_bubble_view_->bounds().right() + kItemEditPadding;
- } else {
- offset = kEdgeThickness +
- (show_selected_keyword ? kBubbleHorizontalPadding : kEdgeEditPadding);
+ if (show_keyword_hint) {
+ right_decorations.AddDecoration(
+ kVerticalEdgeThickness, 0, true, 0, GetEdgeItemPadding(),
+ GetItemPadding(), 0, keyword_hint_view_);
+ if (keyword_hint_view_->keyword() != keyword)
+ keyword_hint_view_->SetKeyword(keyword);
}
- // Now lay out the edit field and views that autocollapse to give it more
- // room.
- gfx::Rect location_bounds(offset, location_y, entry_width, location_height);
- if (show_selected_keyword) {
- selected_keyword_view_->SetBounds(0, location_y + kBubbleVerticalPadding,
- 0, selected_keyword_view_->GetPreferredSize().height());
- LayoutView(selected_keyword_view_, kItemEditPadding,
- AvailableWidth(max_edit_width), true, &location_bounds);
- location_bounds.set_x(selected_keyword_view_->visible() ?
- (offset + selected_keyword_view_->width() + kItemEditPadding) :
- (kEdgeThickness + kEdgeEditPadding));
- } else if (show_keyword_hint) {
- keyword_hint_view_->SetBounds(0, location_y, 0, location_height);
- // Tricky: |entry_width| has already been enlarged by |kEditInternalSpace|.
- // But if we add a trailing view, it needs to have that enlargement be to
- // its left. So we undo the enlargement, then include it in the padding for
- // the added view.
- location_bounds.Inset(0, 0, kEditInternalSpace, 0);
- LayoutView(keyword_hint_view_, kItemEditPadding,
- AvailableWidth(max_edit_width), false, &location_bounds);
- if (!keyword_hint_view_->visible()) {
- // Put back the enlargement that we undid above.
- location_bounds.Inset(0, 0, -kEditInternalSpace, 0);
- }
- }
+ // Perform layout.
+ int full_width = width() - 2 * kEdgeThickness;
+ int entry_width = full_width;
+ left_decorations.LayoutPass1(&entry_width);
+ right_decorations.LayoutPass1(&entry_width);
+ left_decorations.LayoutPass2(&entry_width);
+ right_decorations.LayoutPass2(&entry_width);
+
+ int available_width = entry_width - location_entry_->TextWidth();
+ // The bounds must be wide enough for all the decorations to fit.
+ gfx::Rect location_bounds(kEdgeThickness, kVerticalEdgeThickness,
+ std::max(full_width, full_width - entry_width),
+ location_height);
+ left_decorations.LayoutPass3(&location_bounds, &available_width);
+ right_decorations.LayoutPass3(&location_bounds, &available_width);
// Layout out the suggested text view right aligned to the location
// entry. Only show the suggested text if we can fit the text from one
@@ -908,16 +786,15 @@ void LocationBarView::Layout() {
// suggested text. If we can't it means either the suggested text is too big,
// or the user has scrolled.
- // TODO(sky): We could potentially combine this with the previous step to
- // force using minimum size if necessary, but currently the chance of showing
- // keyword hints and suggested text is minimal and we're not confident this
- // is the right approach for suggested text.
+ // TODO(sky): We could potentially adjust this to take into account suggested
+ // text to force using minimum size if necessary, but currently the chance of
+ // showing keyword hints and suggested text is minimal and we're not confident
+ // this is the right approach for suggested text.
if (suggested_text_view_) {
// TODO(sky): need to layout when the user changes caret position.
int suggested_text_width =
suggested_text_view_->GetPreferredSize().width();
- int vis_text_width = location_entry_->WidthOfTextAfterCursor();
- if (vis_text_width + suggested_text_width > entry_width) {
+ if (suggested_text_width > available_width) {
// Hide the suggested text if the user has scrolled or we can't fit all
// the suggested text.
suggested_text_view_->SetBounds(0, 0, 0, 0);
@@ -928,8 +805,9 @@ void LocationBarView::Layout() {
// the text ends up shifting to the left.
location_needed_width++;
#endif
- location_bounds.set_width(std::min(location_needed_width,
- entry_width - suggested_text_width));
+ location_bounds.set_width(
+ std::min(location_needed_width,
+ location_bounds.width() - suggested_text_width));
// TODO(sky): figure out why this needs the -1.
suggested_text_view_->SetBounds(location_bounds.right() - 1,
location_bounds.y(),
@@ -1130,29 +1008,6 @@ WebContents* LocationBarView::GetWebContents() const {
return delegate_->GetWebContents();
}
-int LocationBarView::AvailableWidth(int location_bar_width) {
- return location_bar_width - location_entry_->TextWidth();
-}
-
-void LocationBarView::LayoutView(views::View* view,
- int padding,
- int available_width,
- bool leading,
- gfx::Rect* bounds) {
- DCHECK(view && bounds);
- gfx::Size view_size = view->GetPreferredSize();
- if ((view_size.width() + padding) > available_width)
- view_size = view->GetMinimumSize();
- int desired_width = view_size.width() + padding;
- view->SetVisible(desired_width < bounds->width());
- if (view->visible()) {
- view->SetBounds(
- leading ? bounds->x() : (bounds->right() - view_size.width()),
- view->y(), view_size.width(), view->height());
- bounds->set_width(bounds->width() - desired_width);
- }
-}
-
void LocationBarView::RefreshContentSettingViews() {
for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
i != content_setting_views_.end(); ++i) {
« no previous file with comments | « chrome/browser/ui/views/location_bar/location_bar_view.h ('k') | chrome/chrome_browser_ui.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698