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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
---
title: HorizontalSplitPanel and VerticalSplitPanel
order: 8
layout: page
---
[[layout.splitpanel]]
= HorizontalSplitPanel and VerticalSplitPanel
ifdef::web[]
[.sampler]
image:{live-demo-image}[alt="Live Demo", link="http://demo.vaadin.com/sampler/#ui/structure/"]
endif::web[]
((("[classname]#HorizontalSplitPanel#", id="term.layout.splitpanel.horizontal", range="startofrange")))
((("[classname]#VerticalSplitPanel#", id="term.layout.splitpanel.vertical", range="startofrange")))
[classname]#HorizontalSplitPanel# and [classname]#VerticalSplitPanel# are a
two-component containers that divide the available space into two areas to
accomodate the two components. [classname]#HorizontalSplitPanel# makes the split
horizontally with a vertical splitter bar, and [classname]#VerticalSplitPanel#
vertically with a horizontal splitter bar. The user can drag the bar to adjust
its position.
You can set the two components with the [methodname]#setFirstComponent()# and
[methodname]#setSecondComponent()# methods, or with the regular
[methodname]#addComponent()# method.
// TODO replace Tree with something else in the example code and screenshot
[source, java]
----
// Have a panel to put stuff in
Panel panel = new Panel("Split Panels Inside This Panel");
// Have a horizontal split panel as its content
HorizontalSplitPanel hsplit = new HorizontalSplitPanel();
panel.setContent(hsplit);
// Put a component in the left panel
Tree tree = new Tree("Menu", TreeExample.createTreeContent());
hsplit.setFirstComponent(tree);
// Put a vertical split panel in the right panel
VerticalSplitPanel vsplit = new VerticalSplitPanel();
hsplit.setSecondComponent(vsplit);
// Put other components in the right panel
vsplit.addComponent(new Label("Here's the upper panel"));
vsplit.addComponent(new Label("Here's the lower panel"));
----
The result is shown in <<figure.splitpanel.basic>>. Observe that the tree is cut
horizontally as it can not fit in the layout. If its height exceeds the height
of the panel, a vertical scroll bar will appear automatically. If horizontal
scroll bar is necessary, you could put the content in a [classname]#Panel#,
which can have scroll bars in both directions.
[[figure.splitpanel.basic]]
.[classname]#HorizontalSplitPanel# and [classname]#VerticalSplitPanel#
image::img/splitpanel-example1.png[width=60%, scaledwidth=80%]
You can set the split position with [methodname]#setSplitPosition()#. It accepts
any units defined in the [classname]#Sizeable# interface, with percentual size
relative to the size of the component.
[source, java]
----
// Have a horizontal split panel
HorizontalSplitPanel hsplit = new HorizontalSplitPanel();
hsplit.setFirstComponent(new Label("75% wide panel"));
hsplit.setSecondComponent(new Label("25% wide panel"));
// Set the position of the splitter as percentage
hsplit.setSplitPosition(75, Sizeable.UNITS_PERCENTAGE);
----
Another version of the [methodname]#setSplitPosition()# method allows leaving
out the unit, using the same unit as previously. The method also has versions
take take a boolean parameter, [parameter]#reverse#, which allows defining the
size of the right or bottom panel instead of the left or top panel.
The split bar allows the user to adjust the split position by dragging the bar
with mouse. To lock the split bar, use [methodname]#setLocked(true)#. When
locked, the move handle in the middle of the bar is disabled.
[source, java]
----
// Lock the splitter
hsplit.setLocked(true);
----
Setting the split position programmatically and locking the split bar is
illustrated in <<figure.component.splitpanel.splitposition>>.
[[figure.component.splitpanel.splitposition]]
.A Layout With Nested SplitPanels
image::img/splitpanel-splitposition.png[width=50%, scaledwidth=70%]
Notice that the size of a split panel must not be undefined in the split
direction.
== CSS Style Rules
[source, css]
----
/* For a horizontal SplitPanel. */
.v-splitpanel-horizontal {}
.v-splitpanel-hsplitter {}
.v-splitpanel-hsplitter-locked {}
/* For a vertical SplitPanel. */
.v-splitpanel-vertical {}
.v-splitpanel-vsplitter {}
.v-splitpanel-vsplitter-locked {}
/* The two container panels. */
.v-splitpanel-first-container {} /* Top or left panel. */
.v-splitpanel-second-container {} /* Bottom or right panel. */
----
The entire split panel has the style [literal]#++v-splitpanel-horizontal++# or
[literal]#++v-splitpanel-vertical++#, depending on the panel direction. The
split bar or __splitter__ between the two content panels has either the
[literal]#++...-splitter++# or [literal]#++...-splitter-locked++# style,
depending on whether its position is locked or not.
(((range="endofrange", startref="term.layout.splitpanel.horizontal")))
(((range="endofrange", startref="term.layout.splitpanel.vertical")))
|