| Index: views/controls/single_split_view.h
|
| ===================================================================
|
| --- views/controls/single_split_view.h (revision 71256)
|
| +++ views/controls/single_split_view.h (working copy)
|
| @@ -6,12 +6,16 @@
|
| #define VIEWS_CONTROLS_SINGLE_SPLIT_VIEW_H_
|
| #pragma once
|
|
|
| +#include "base/gtest_prod_util.h"
|
| #include "views/view.h"
|
|
|
| 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.
|
| +// Observer's SplitHandleMoved notification helps to monitor user initiated
|
| +// layout changes.
|
| class SingleSplitView : public views::View {
|
| public:
|
| enum Orientation {
|
| @@ -19,8 +23,22 @@
|
| VERTICAL_SPLIT
|
| };
|
|
|
| - SingleSplitView(View* leading, View* trailing, Orientation orientation);
|
| + class Observer {
|
| + public:
|
| + // Invoked when split handle is moved by the user. |source|'s divider_offset
|
| + // is already set to the new value, but Layout has not happened yet.
|
| + // Returns false if the layout has been handled by the observer, returns
|
| + // true if |source| should do it by itself.
|
| + virtual bool SplitHandleMoved(SingleSplitView* source) = 0;
|
| + protected:
|
| + virtual ~Observer() {}
|
| + };
|
|
|
| + SingleSplitView(View* leading,
|
| + View* trailing,
|
| + Orientation orientation,
|
| + Observer* observer);
|
| +
|
| virtual void DidChangeBounds(const gfx::Rect& previous,
|
| const gfx::Rect& current);
|
|
|
| @@ -36,10 +54,14 @@
|
| virtual gfx::NativeCursor GetCursorForPoint(Event::EventType event_type,
|
| const gfx::Point& p);
|
|
|
| + Orientation orientation() const {
|
| + return is_horizontal_ ? HORIZONTAL_SPLIT : VERTICAL_SPLIT;
|
| + }
|
| +
|
| 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,21 +70,42 @@
|
| resize_leading_on_bounds_change_ = resize;
|
| }
|
|
|
| + // Calculates ideal leading and trailing view bounds according to the given
|
| + // split view |bounds|, current divider offset and children visiblity.
|
| + // Does not change children view bounds.
|
| + void CalculateChildrenBounds(const gfx::Rect& bounds,
|
| + gfx::Rect* leading_bounds,
|
| + gfx::Rect* trailing_bounds) const;
|
| +
|
| protected:
|
| virtual bool OnMousePressed(const MouseEvent& event);
|
| virtual bool OnMouseDragged(const MouseEvent& event);
|
| virtual void OnMouseReleased(const MouseEvent& event, bool canceled);
|
|
|
| private:
|
| + // This test calls OnMouse* functions.
|
| + FRIEND_TEST_ALL_PREFIXES(SingleSplitViewTest, MouseDrag);
|
| +
|
| // Returns true if |x| or |y| is over the divider.
|
| bool IsPointInDivider(const gfx::Point& p);
|
|
|
| + // Calculates the new |divider_offset| based on the changes of split view
|
| + // bounds.
|
| + int CalculateDividerOffset(
|
| + int divider_offset,
|
| + const gfx::Rect& previous_bounds,
|
| + const gfx::Rect& new_bounds) const;
|
| +
|
| + // Returns divider offset within primary axis size range for given split
|
| + // view |bounds|.
|
| + int NormalizeDividerOffset(int divider_offset, const gfx::Rect& bounds) 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 +127,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);
|
| };
|
|
|
|
|