Index: chrome/browser/ui/views/location_bar/location_bar_layout.h |
diff --git a/chrome/browser/ui/views/location_bar/location_bar_layout.h b/chrome/browser/ui/views/location_bar/location_bar_layout.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ef2f1ee80bc2c395bf26990b5098190aba36ba8d |
--- /dev/null |
+++ b/chrome/browser/ui/views/location_bar/location_bar_layout.h |
@@ -0,0 +1,93 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_LOCATION_BAR_LAYOUT_H_ |
+#define CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_LOCATION_BAR_LAYOUT_H_ |
+ |
+#include "base/memory/scoped_vector.h" |
+ |
+namespace gfx { |
+class Rect; |
+} |
+ |
+namespace views { |
+class View; |
+} |
+ |
+struct LocationBarDecoration; |
+ |
+// Helper class used to layout a list of decorations inside the omnibox. |
+class LocationBarLayout { |
+ |
+ public: |
+ enum Position { |
+ LEFT_EDGE = 0, |
+ RIGHT_EDGE, |
+ }; |
+ |
+ LocationBarLayout(Position position, |
+ int item_edit_padding, |
+ int edge_edit_padding); |
+ virtual ~LocationBarLayout(); |
+ |
+ // Add a decoration, specifying: |
+ // - The |y| position inside its parent; |
+ // - The |height| in pixel, 0 meaning the preferred height of the |view|; |
+ // - Whether the decoration should |auto_collapse| if there is no room for it; |
+ // - The |max_fraction| it can use within the omnibox, or 0 for non-resizable |
+ // decorations; |
+ // - |edge_item_padding|, the padding between the omnibox edge and the item, |
+ // if the item is the first one drawn; |
+ // - |item_padding|, the padding between the previous item and this one; |
+ // - |builtin_padding|, any padding directly built into the item; |
+ // - The |view| corresponding to this decoration, a weak pointer. |
+ // Note that |auto_collapse| can be true if and only if |max_fraction| is 0. |
+ void AddDecoration(int y, |
+ int height, |
+ bool auto_collapse, |
+ double max_fraction, |
+ int edge_item_padding, |
+ int item_padding, |
+ int builtin_padding, |
+ views::View* view); |
+ |
+ // Add a non-resizable decoration with standard padding. |
+ void AddDecoration(int height, int builtin_padding, views::View* view); |
+ |
+ // 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. |
+ void LayoutPass1(int* entry_width); |
+ |
+ // 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. |
+ void LayoutPass2(int* entry_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 LayoutPass3(gfx::Rect* bounds, int* available_width); |
+ |
+ private: |
+ // LEFT_EDGE means decorations are added from left to right and stacked on |
+ // the left of the omnibox, RIGHT_EDGE means the opposite. |
+ Position position_; |
+ |
+ // The padding between the last decoration and the edit box. |
+ int item_edit_padding_; |
+ |
+ // The padding between the edge and the edit box, if there are no decorations. |
+ int edge_edit_padding_; |
+ |
+ // The list of decorations to layout. |
+ ScopedVector<LocationBarDecoration> decorations_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(LocationBarLayout); |
+}; |
+ |
+#endif // CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_LOCATION_BAR_LAYOUT_H_ |