blob: b5710670a1fe8304513132e576edae9e5cccc183 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
// Copyright (c) 2010 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 VIEWS_CONTROLS_SINGLE_SPLIT_VIEW_H_
#define VIEWS_CONTROLS_SINGLE_SPLIT_VIEW_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.
class SingleSplitView : public views::View {
public:
enum Orientation {
HORIZONTAL_SPLIT,
VERTICAL_SPLIT
};
SingleSplitView(View* leading, View* trailing, Orientation orientation);
virtual void DidChangeBounds(const gfx::Rect& previous,
const gfx::Rect& current);
virtual void Layout();
virtual bool GetAccessibleRole(AccessibilityTypes::Role* role);
// SingleSplitView's preferred size is the sum of the preferred widths
// and the max of the heights.
virtual gfx::Size GetPreferredSize();
// Overriden to return a resize cursor when over the divider.
virtual gfx::NativeCursor GetCursorForPoint(Event::EventType event_type,
const gfx::Point& p);
void set_divider_offset(int divider_offset) {
divider_offset_ = divider_offset;
}
int divider_offset() { 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
// component resizing on a bounds change.
void set_resize_leading_on_bounds_change(bool resize) {
resize_leading_on_bounds_change_ = resize;
}
protected:
virtual bool OnMousePressed(const MouseEvent& event);
virtual bool OnMouseDragged(const MouseEvent& event);
virtual void OnMouseReleased(const MouseEvent& event, bool canceled);
private:
// Returns true if |x| or |y| is over the divider.
bool IsPointInDivider(const gfx::Point& p);
// Returns width in case of horizontal split and height otherwise.
int GetPrimaryAxisSize() {
return GetPrimaryAxisSize(width(), height());
}
int GetPrimaryAxisSize(int h, int v) {
return is_horizontal_ ? h : v;
}
// Used to track drag info.
struct DragInfo {
// The initial coordinate of the mouse when the user started the drag.
int initial_mouse_offset;
// The initial position of the divider when the user started the drag.
int initial_divider_offset;
};
DragInfo drag_info_;
// Orientation of the split view.
bool is_horizontal_;
// Position of the divider.
int divider_offset_;
bool resize_leading_on_bounds_change_;
DISALLOW_COPY_AND_ASSIGN(SingleSplitView);
};
} // namespace views
#endif // VIEWS_CONTROLS_SINGLE_SPLIT_VIEW_H_
|