Chromium Code Reviews| Index: views/controls/single_split_view.h |
| =================================================================== |
| --- views/controls/single_split_view.h (revision 70475) |
| +++ views/controls/single_split_view.h (working copy) |
| @@ -10,8 +10,15 @@ |
| namespace views { |
| -// SingleSplitView lays out two views horizontally. A splitter exists between |
| -// the two views that the user can drag around to resize the views. |
| +// SingleSplitView lays out two views next to each other, either horizontally |
| +// or vertically. A splitter exists between the two views that the user can |
| +// drag around to resize the views. |
| +// When non-NULL observer is provided at the construction time, SingleSplitView |
| +// expects the entity resizing the SingleSplitView itself to resize its children |
| +// views (CalculateChildrenBounds and ResizeChildren functions are handy for |
| +// this). Observer's SplitHandleMoved notification helps to handle user |
| +// initiated layout changes. |
| +// When observer is NULL, SingleSplitView resizes children views automatically. |
| class SingleSplitView : public views::View { |
| public: |
| enum Orientation { |
| @@ -19,8 +26,17 @@ |
| VERTICAL_SPLIT |
| }; |
| - SingleSplitView(View* leading, View* trailing, Orientation orientation); |
| + class Observer { |
| + public: |
| + // Invoked when split handle is moved by the user. |
| + virtual void SplitHandleMoved(SingleSplitView* source) = 0; |
| + protected: |
| + virtual ~Observer() {} |
| + }; |
| + SingleSplitView(View* leading, View* trailing, Orientation orientation, |
|
sky
2011/01/07 21:35:40
each arg on its own line.
Aleksey Shlyapnikov
2011/01/07 23:06:00
Done.
|
| + Observer* observer); |
| + |
| virtual void DidChangeBounds(const gfx::Rect& previous, |
| const gfx::Rect& current); |
| @@ -39,7 +55,7 @@ |
| void set_divider_offset(int divider_offset) { |
| divider_offset_ = divider_offset; |
| } |
| - int divider_offset() { return divider_offset_; } |
| + int divider_offset() const { return divider_offset_; } |
| // Sets whether the leading component is resized when the split views size |
| // changes. The default is true. A value of false results in the trailing |
| @@ -48,6 +64,16 @@ |
| resize_leading_on_bounds_change_ = resize; |
| } |
| + // Calculates ideal leading and trailing view bounds according to the current |
| + // split view bounds, divider offset and children visiblity. |
| + // Does not change children view bounds. |
| + void CalculateChildrenBounds(gfx::Rect* leading_bounds, |
| + gfx::Rect* trailing_bounds) const; |
| + |
| + // Resizes children views to the leading_bounds and trailing_bounds. |
| + void ResizeChildren(const gfx::Rect& leading_bounds, |
| + const gfx::Rect& trailing_bounds) const; |
| + |
| protected: |
| virtual bool OnMousePressed(const MouseEvent& event); |
| virtual bool OnMouseDragged(const MouseEvent& event); |
| @@ -57,12 +83,15 @@ |
| // Returns true if |x| or |y| is over the divider. |
| bool IsPointInDivider(const gfx::Point& p); |
| + // Returns divider offset within primary axis size range. |
| + int NormalizeDividerOffset(int divider_offset) const; |
| + |
| // Returns width in case of horizontal split and height otherwise. |
| - int GetPrimaryAxisSize() { |
| + int GetPrimaryAxisSize() const { |
| return GetPrimaryAxisSize(width(), height()); |
| } |
| - int GetPrimaryAxisSize(int h, int v) { |
| + int GetPrimaryAxisSize(int h, int v) const { |
| return is_horizontal_ ? h : v; |
| } |
| @@ -84,6 +113,9 @@ |
| bool resize_leading_on_bounds_change_; |
| + // Observer to notify about user initiated handle movements. Not own by us. |
| + Observer* observer_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(SingleSplitView); |
| }; |