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 9714e3c17e304bd4319f045a765b344e1fc84bdb..e428ebc5e95883de1ab4e39aeef6bbfad9cc76b1 100644 |
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc |
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc |
@@ -9,6 +9,7 @@ |
#include "base/command_line.h" |
#include "base/i18n/rtl.h" |
+#include "base/memory/scoped_vector.h" |
#include "base/stl_util.h" |
#include "base/utf_string_conversions.h" |
#include "chrome/app/chrome_command_ids.h" |
@@ -120,6 +121,187 @@ const int kDesktopScriptBadgeEdgeItemPadding = kDesktopScriptBadgeItemPadding; |
const int kTouchItemPadding = 8; |
const int kTouchEdgeItemPadding = kTouchItemPadding; |
+// Description of a decoration to be added inside the location bar, either to |
+// the left or to the right. |
+struct LocationBarDecoration { |
Peter Kasting
2012/12/21 19:17:01
Consider defining all this code in a separate .h/.
beaudoin
2013/01/03 03:30:45
Done. (Although it's still a local struct, but now
|
+ LocationBarDecoration(int y, |
+ int height, |
+ bool auto_collapse, |
+ double max_fraction, |
+ int edge_item_padding, |
+ int item_padding, |
+ int builtin_padding, |
+ views::View* view) |
+ : y(y), |
+ height(height), |
+ auto_collapse(auto_collapse), |
+ max_fraction(max_fraction), |
+ edge_item_padding(edge_item_padding), |
+ item_padding(item_padding), |
+ builtin_padding(builtin_padding), |
+ view(view), |
+ computed_width(0) { |
+ DCHECK(!auto_collapse || max_fraction == 0.0); |
+ DCHECK(max_fraction >= 0.0); |
+ } |
+ |
+ // Simpler constructor for regular decorations. |
+ LocationBarDecoration(int height, int builtin_padding, views::View* view) |
+ : y(LocationBarView::kVerticalEdgeThickness), |
+ height(height), |
+ auto_collapse(false), |
+ max_fraction(0), |
+ edge_item_padding(LocationBarView::GetEdgeItemPadding()), |
+ item_padding(LocationBarView::GetItemPadding()), |
+ builtin_padding(builtin_padding), |
+ view(view), |
+ computed_width(0) { |
+ DCHECK(!auto_collapse || max_fraction == 0.0); |
+ DCHECK(max_fraction >= 0.0); |
+ } |
+ |
+ // The y position of the view inside its parent. |
+ int y; |
+ |
+ // If 0, will use the preferred height of the view. |
+ int height; |
+ |
+ // True means that, if there is not enough available space in the location |
+ // bar, the view will reduce its width either to its minimal width or to zero |
+ // (making it invisible), whichever fits. If true, |max_faction| must be 0. |
+ bool auto_collapse; |
+ |
+ // Used for resizeable decorations, indicates the maximum fraction of the |
+ // location bar that can be taken by this decoration, 0 for non-resizable |
+ // decorations. If non-zero, |auto_collapse| must be false. |
+ double max_fraction; |
+ |
+ // Padding to use if the decoration is the first element next to the edge. |
+ int edge_item_padding; |
+ |
+ // Padding to use if the decoration follows another decoration. |
+ int item_padding; |
+ |
+ // Padding built into the decoration and that should be removed, on |
+ // both sides, during layout. |
+ int builtin_padding; |
+ |
+ views::View* view; |
+ |
+ // The width computed by the layout process. |
+ double computed_width; |
+}; |
+ |
+// First pass of decoration layout process. Pass the full width of the location |
+// bar in |entry_width|. This pass will adjust it to account for |
+// non-collapsible and non-resizable decorations. |decorations| must always be |
+// ordered from the edge of the location bar towards the middle. |
+void LayoutDecorationsPass1( |
+ ScopedVector<LocationBarDecoration>& decorations, |
Peter Kasting
2012/12/21 19:17:01
Instead of some non-scoped functions that each tak
beaudoin
2013/01/03 03:30:45
New LocationBarLayout class: Done.
However I did
|
+ int item_edit_padding, |
+ int edge_edit_padding, |
+ int* entry_width) { |
+ |
+ bool first_item = true; |
+ bool at_least_one_visible = false; |
+ for (ScopedVector<LocationBarDecoration>::iterator it(decorations.begin()); |
+ it != decorations.end(); ++it) { |
+ // Autocollapsing decorations are ignored in this pass. |
+ if (!(*it)->auto_collapse) { |
+ at_least_one_visible = true; |
+ *entry_width -= -2 * (*it)->builtin_padding + |
+ (first_item ? (*it)->edge_item_padding : (*it)->item_padding); |
+ } |
+ first_item = false; |
+ // Resizing decorations are ignored in this pass. |
+ if (!(*it)->auto_collapse && (*it)->max_fraction == 0.0) { |
+ (*it)->computed_width = (*it)->view->GetPreferredSize().width(); |
+ *entry_width -= (*it)->computed_width; |
+ } |
+ } |
+ *entry_width -= at_least_one_visible ? item_edit_padding : edge_edit_padding; |
+} |
+ |
+// Second pass of decoration layout process. Pass the |entry_width| computed |
+// by the first pass. This pass will adjust it to account for resizable |
+// decorations. |decorations| must always be ordered from the edge of the |
+// location bar towards the middle. |
+void LayoutDecorationsPass2( |
+ ScopedVector<LocationBarDecoration>& decorations, |
+ int *entry_width) { |
+ |
+ for (ScopedVector<LocationBarDecoration>::iterator it(decorations.begin()); |
+ it != decorations.end(); ++it) { |
+ if ((*it)->max_fraction > 0.0) { |
+ int max_width = static_cast<int>(*entry_width * (*it)->max_fraction); |
+ (*it)->computed_width = std::min((*it)->view->GetPreferredSize().width(), |
+ std::max((*it)->view->GetMinimumSize().width(), max_width)); |
+ *entry_width -= (*it)->computed_width; |
+ } |
+ } |
+} |
+ |
+// Third and final pass of decoration layout process. Pass the |bounds| |
+// corresponding to the entire space available in the location bar. This pass |
+// will update it as decorations are laid out. |available_width| measures the |
+// empty space within the location bar, taking the decorations and text into |
+// account. |decorations| must always be ordered from the edge of the location |
+// bar towards the middle. |
+void LayoutDecorationsPass3( |
+ ScopedVector<LocationBarDecoration>& decorations, |
+ int item_edit_padding, |
+ int edge_edit_padding, |
+ bool left, |
+ gfx::Rect* bounds, |
+ int* available_width) { |
+ bool first_visible = true; |
+ for (ScopedVector<LocationBarDecoration>::iterator it(decorations.begin()); |
+ it != decorations.end(); ++it) { |
+ // Collapse decorations if needed. |
+ if ((*it)->auto_collapse) { |
+ int padding = -2 * (*it)->builtin_padding + |
+ (first_visible ? (*it)->edge_item_padding : (*it)->item_padding); |
+ // Try preferred size, if it fails try minimum size, if it fails collapse. |
+ (*it)->computed_width = (*it)->view->GetPreferredSize().width(); |
+ if ((*it)->computed_width + padding > *available_width) |
+ (*it)->computed_width = (*it)->view->GetMinimumSize().width(); |
+ if ((*it)->computed_width + padding > *available_width) { |
+ (*it)->computed_width = 0; |
+ (*it)->view->SetVisible(false); |
+ } else { |
+ (*it)->view->SetVisible(true); |
+ (*available_width) -= (*it)->computed_width + padding; |
+ } |
+ } else { |
+ (*it)->view->SetVisible(true); |
+ } |
+ // Layout visible decorations. |
+ if ((*it)->view->visible()) { |
+ int padding = -(*it)->builtin_padding + |
+ (first_visible ? (*it)->edge_item_padding : (*it)->item_padding); |
+ first_visible = false; |
+ int x; |
+ if (left) |
+ x = bounds->x() + padding; |
+ else |
+ x = bounds->x() + bounds->width() - padding - (*it)->computed_width; |
+ int height = (*it)->height == 0 ? |
+ (*it)->view->GetPreferredSize().height() : (*it)->height; |
+ (*it)->view->SetBounds(x, (*it)->y, (*it)->computed_width, height); |
+ bounds->set_width(bounds->width() - padding - (*it)->computed_width + |
+ (*it)->builtin_padding); |
+ if (left) { |
+ bounds->set_x(bounds->x() + padding + (*it)->computed_width - |
+ (*it)->builtin_padding); |
+ } |
+ } |
+ } |
+ int final_padding = first_visible ? edge_edit_padding : item_edit_padding; |
+ bounds->set_width(bounds->width() - final_padding); |
+ if (left) |
+ bounds->set_x(bounds->x() + final_padding); |
+} |
+ |
} // namespace |
// static |
@@ -640,8 +822,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 +840,26 @@ void LocationBarView::Layout() { |
const int kEdgeEditPadding = GetEdgeItemPadding() - kEditInternalSpace; |
const int kBubbleVerticalPadding = (mode_ == POPUP) ? |
-1 : kBubbleHorizontalPadding; |
+ const double kMaxBubbleFraction = 0.5; |
Peter Kasting
2012/12/21 19:17:01
Nit: Add comment about this
beaudoin
2013/01/03 03:30:45
Done.
|
+ const int kBubbleLocationY = kVerticalEdgeThickness + kBubbleVerticalPadding; |
+ |
+ ScopedVector<LocationBarDecoration> left_decorations; |
+ ScopedVector<LocationBarDecoration> right_decorations; |
- // 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; |
+ 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) { |
+ // Autocollapsible bubble decoration. |
+ left_decorations.push_back(new LocationBarDecoration( |
+ 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 +877,94 @@ 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()); |
+ // Bubble decoration that can use a maximum fraction of the width. |
+ left_decorations.push_back(new LocationBarDecoration( |
+ kBubbleLocationY, 0, false, kMaxBubbleFraction, |
+ kBubbleHorizontalPadding, GetItemPadding(), 0, ev_bubble_view_)); |
+ } else { |
+ left_decorations.push_back(new LocationBarDecoration( |
+ 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.push_back(new LocationBarDecoration( |
+ 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.push_back(new LocationBarDecoration( |
+ 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.push_back(new LocationBarDecoration( |
+ 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.push_back(new LocationBarDecoration( |
+ 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.push_back(new LocationBarDecoration( |
+ 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.push_back(new LocationBarDecoration(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(); |
+ // Bubble decoration. |
Peter Kasting
2012/12/21 19:17:01
Comment is too brief. Why are these "bubble decor
beaudoin
2013/01/03 03:30:45
Actually, comment is not really needed, dropped it
|
+ right_decorations.push_back(new LocationBarDecoration( |
+ 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.push_back(new LocationBarDecoration( |
+ 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) { |
+ // Collapsible regular decoration |
Peter Kasting
2012/12/21 19:17:01
Nit: Trailing period. Comment is also pretty brie
beaudoin
2013/01/03 03:30:45
Comment dropped.
|
+ right_decorations.push_back(new LocationBarDecoration( |
+ 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; // Starts with full width and update it. |
Peter Kasting
2012/12/21 19:17:01
Nit: Grammar. Comment doesn't add much anyway.
beaudoin
2013/01/03 03:30:45
Comment dropped.
|
+ LayoutDecorationsPass1(left_decorations, kItemEditPadding, kEdgeEditPadding, |
+ &entry_width); |
+ LayoutDecorationsPass1(right_decorations, kItemEditPadding, kEdgeEditPadding, |
+ &entry_width); |
+ LayoutDecorationsPass2(left_decorations, &entry_width); |
+ LayoutDecorationsPass2(right_decorations, &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); |
+ LayoutDecorationsPass3(left_decorations, kItemEditPadding, kEdgeEditPadding, |
+ true, &location_bounds, &available_width); |
+ LayoutDecorationsPass3(right_decorations, kItemEditPadding, kEdgeEditPadding, |
+ false, &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 +972,16 @@ 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); |
@@ -929,7 +993,7 @@ void LocationBarView::Layout() { |
location_needed_width++; |
#endif |
location_bounds.set_width(std::min(location_needed_width, |
Peter Kasting
2012/12/21 19:17:01
Nit: Put this on next line so the args line up
beaudoin
2013/01/03 03:30:45
Done.
|
- entry_width - suggested_text_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 +1194,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) { |