Home | History | Annotate | Download | only in location_bar
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_LOCATION_BAR_LAYOUT_H_
      6 #define CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_LOCATION_BAR_LAYOUT_H_
      7 
      8 #include "base/memory/scoped_vector.h"
      9 
     10 namespace gfx {
     11 class Rect;
     12 }
     13 
     14 namespace views {
     15 class View;
     16 }
     17 
     18 struct LocationBarDecoration;
     19 
     20 // Helper class used to layout a list of decorations inside the omnibox.
     21 class LocationBarLayout {
     22 
     23  public:
     24   enum Position {
     25     LEFT_EDGE = 0,
     26     RIGHT_EDGE,
     27   };
     28 
     29   LocationBarLayout(Position position, int item_edit_padding);
     30   virtual ~LocationBarLayout();
     31 
     32   // Add a decoration, specifying:
     33   // - The |y| position inside its parent;
     34   // - The |height| in pixel, 0 meaning the preferred height of the |view|;
     35   // - Whether the decoration should |auto_collapse| if there is no room for it;
     36   // - The |max_fraction| it can use within the omnibox, or 0 for non-resizable
     37   //   decorations;
     38   // - |edge_item_padding|, the padding between the omnibox edge and the item,
     39   //   if the item is the first one drawn;
     40   // - |item_padding|, the padding between the previous item and this one;
     41   // - |builtin_padding|, any padding directly built into the item;
     42   // - The |view| corresponding to this decoration, a weak pointer.
     43   // Note that |auto_collapse| can be true if and only if |max_fraction| is 0.
     44   void AddDecoration(int y,
     45                      int height,
     46                      bool auto_collapse,
     47                      double max_fraction,
     48                      int edge_item_padding,
     49                      int item_padding,
     50                      int builtin_padding,
     51                      views::View* view);
     52 
     53   // Add a non-resizable decoration with standard padding.
     54   void AddDecoration(int y, int height, int builtin_padding, views::View* view);
     55 
     56   // First pass of decoration layout process. Pass the full width of the
     57   // location bar in |entry_width|. This pass will adjust it to account for
     58   // non-collapsible and non-resizable decorations.
     59   void LayoutPass1(int* entry_width);
     60 
     61   // Second pass of decoration layout process. Pass the |entry_width| computed
     62   // by the first pass. This pass will adjust it to account for resizable
     63   // decorations.
     64   void LayoutPass2(int* entry_width);
     65 
     66   // Third and final pass of decoration layout process. Pass the |bounds|
     67   // corresponding to the entire space available in the location bar. This pass
     68   // will update it as decorations are laid out. |available_width| measures the
     69   // empty space within the location bar, taking the decorations and text into
     70   // account. |decorations| must always be ordered from the edge of the location
     71   // bar towards the middle.
     72   void LayoutPass3(gfx::Rect* bounds, int* available_width);
     73 
     74  private:
     75   typedef ScopedVector<LocationBarDecoration> Decorations;
     76 
     77   // LEFT_EDGE means decorations are added from left to right and stacked on
     78   // the left of the omnibox, RIGHT_EDGE means the opposite.
     79   Position position_;
     80 
     81   // The padding between the last decoration and the edit box.
     82   int item_edit_padding_;
     83 
     84   // The list of decorations to layout.
     85   Decorations decorations_;
     86 
     87   DISALLOW_COPY_AND_ASSIGN(LocationBarLayout);
     88 };
     89 
     90 #endif  // CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_LOCATION_BAR_LAYOUT_H_
     91