1/*
2 * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23package com.sun.swingset3.demos.splitpane;
24
25import java.awt.BorderLayout;
26import java.awt.Color;
27import java.awt.Dimension;
28import java.awt.GridBagConstraints;
29import java.awt.GridBagLayout;
30import java.awt.Insets;
31import java.awt.event.ActionEvent;
32import java.awt.event.ActionListener;
33import javax.swing.*;
34import javax.swing.event.ChangeEvent;
35import javax.swing.event.ChangeListener;
36
37import com.sun.swingset3.DemoProperties;
38import com.sun.swingset3.demos.ResourceManager;
39
40/**
41 * Split Pane demo
42 *
43 * @version 1.12 11/17/05
44 * @author Scott Violet
45 * @author Jeff Dinkins
46 */
47@DemoProperties(
48        value = "JSplitPane Demo",
49        category = "Containers",
50        description = "Demonstrates JSplitPane, a container which lays out two components in an adjustable split view (horizontal or vertical)",
51        sourceFiles = {
52            "com/sun/swingset3/demos/splitpane/SplitPaneDemo.java",
53            "com/sun/swingset3/demos/ResourceManager.java",
54            "com/sun/swingset3/demos/splitpane/resources/SplitPaneDemo.properties",
55            "com/sun/swingset3/demos/splitpane/resources/images/day.jpg",
56            "com/sun/swingset3/demos/splitpane/resources/images/night.jpg",
57            "com/sun/swingset3/demos/splitpane/resources/images/SplitPaneDemo.gif"
58        }
59)
60public class SplitPaneDemo extends JPanel {
61
62    private static final ResourceManager resourceManager = new ResourceManager(SplitPaneDemo.class);
63    public static final String VERTICAL_SPLIT = resourceManager.getString("SplitPaneDemo.vert_split");
64    public static final String HORIZONTAL_SPLIT = resourceManager.getString("SplitPaneDemo.horz_split");
65    public static final String ONE_TOUCH_EXPANDABLE = resourceManager.getString("SplitPaneDemo.one_touch_expandable");
66    public static final String SECOND_COMPONENT_MIN_SIZE = resourceManager.getString("SplitPaneDemo.second_component_min_size");
67    public static final String FIRST_COMPONENT_MIN_SIZE = resourceManager.getString("SplitPaneDemo.first_component_min_size");
68    public static final String DIVIDER_SIZE = resourceManager.getString("SplitPaneDemo.divider_size");
69    public static final String DEMO_TITLE = SplitPaneDemo.class.getAnnotation(DemoProperties.class).value();
70
71    private static final Insets insets = new Insets(4, 8, 4, 8);
72
73    private final JSplitPane splitPane;
74    private final JLabel day;
75    private final JLabel night;
76
77    private JPanel controlPanel;
78    private GridBagLayout gridbag;
79    private GridBagConstraints c;
80
81    /**
82     * main method allows us to run as a standalone demo.
83     *
84     * @param args
85     */
86    public static void main(String[] args) {
87        JFrame frame = new JFrame(DEMO_TITLE);
88
89        frame.getContentPane().add(new SplitPaneDemo());
90        frame.setPreferredSize(new Dimension(800, 600));
91        frame.pack();
92        frame.setLocationRelativeTo(null);
93        frame.setVisible(true);
94    }
95
96    /**
97     * SplitPaneDemo Constructor
98     */
99    public SplitPaneDemo() {
100        setLayout(new BorderLayout());
101
102        //<snip>Create horizontal SplitPane with day and night
103        day = new JLabel(resourceManager.createImageIcon("day.jpg",
104                resourceManager.getString("SplitPaneDemo.day")));
105        night = new JLabel(resourceManager.createImageIcon("night.jpg",
106                resourceManager.getString("SplitPaneDemo.night")));
107
108        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, day, night);
109        //</snip>
110
111        //<snip>Turn on continuous layout
112        splitPane.setContinuousLayout(true);
113        //</snip>
114
115        //<snip>Turn on one-touch expansion
116        splitPane.setOneTouchExpandable(true);
117        //</snip>
118
119        //<snip>Set divider location
120        splitPane.setDividerLocation(200);
121        //</snip>
122
123        //<snip>Set minimum size for each child
124        day.setMinimumSize(new Dimension(20, 20));
125        night.setMinimumSize(new Dimension(20, 20));
126        //</snip>
127
128        add(splitPane, BorderLayout.CENTER);
129        setBackground(Color.black);
130
131        add(createSplitPaneControls(), BorderLayout.SOUTH);
132    }
133
134    /**
135     * Creates controls to alter the JSplitPane.
136     *
137     * @return
138     */
139    protected final JPanel createSplitPaneControls() {
140
141        gridbag = new GridBagLayout();
142        c = new GridBagConstraints();
143        controlPanel = new JPanel(gridbag);
144
145        //<snip>Create radio box to edit splitpane orientation
146        Box box = Box.createHorizontalBox();
147        ButtonGroup group = new ButtonGroup();
148
149        OrientationListener orientationListener = new OrientationListener();
150
151        JRadioButton button = new JRadioButton(VERTICAL_SPLIT);
152        button.setActionCommand("vertical");
153        button.addActionListener(orientationListener);
154        group.add(button);
155        box.add(button);
156
157        button = new JRadioButton(HORIZONTAL_SPLIT);
158        button.setActionCommand("horizontal");
159        button.setSelected(true);
160        button.addActionListener(orientationListener);
161        group.add(button);
162        box.add(button);
163        //</snip>
164
165        addToGridbag(box, 0, 0, 1, 1,
166                GridBagConstraints.NONE, GridBagConstraints.WEST);
167
168        //<snip>Create checkbox to edit continuous layout
169        JCheckBox checkBox = new JCheckBox(resourceManager.getString("SplitPaneDemo.cont_layout"));
170        checkBox.setSelected(true);
171
172        checkBox.addChangeListener((ChangeEvent e) -> {
173            splitPane.setContinuousLayout(
174                    ((JCheckBox) e.getSource()).isSelected());
175        });
176        //</snip>
177
178        c.gridy++;
179        addToGridbag(checkBox, 0, 1, 1, 1,
180                GridBagConstraints.NONE, GridBagConstraints.WEST);
181
182        //<snip>Create checkbox to edit one-touch-expandable
183        checkBox = new JCheckBox(ONE_TOUCH_EXPANDABLE);
184        checkBox.setSelected(true);
185
186        checkBox.addChangeListener((ChangeEvent e) -> {
187            splitPane.setOneTouchExpandable(
188                    ((JCheckBox) e.getSource()).isSelected());
189        });
190        //</snip>
191
192        addToGridbag(checkBox, 0, 2, 1, 1,
193                GridBagConstraints.NONE, GridBagConstraints.WEST);
194
195        JSeparator separator = new JSeparator(JSeparator.VERTICAL);
196        addToGridbag(separator, 1, 0, 1, 3,
197                GridBagConstraints.VERTICAL, GridBagConstraints.CENTER);
198
199        //<snip>Create spinner to edit divider size
200        final JSpinner spinner = new JSpinner(
201                new SpinnerNumberModel(splitPane.getDividerSize(), 5, 50, 2));
202
203        spinner.addChangeListener((ChangeEvent event) -> {
204            SpinnerNumberModel model = (SpinnerNumberModel) spinner.getModel();
205            splitPane.setDividerSize(model.getNumber().intValue());
206        });
207        //</snip>
208
209        JLabel label = new JLabel(DIVIDER_SIZE);
210        label.setLabelFor(spinner);
211        addToGridbag(label, 2, 0, 1, 1,
212                GridBagConstraints.NONE, GridBagConstraints.EAST);
213        addToGridbag(spinner, 3, 0, 1, 1,
214                GridBagConstraints.NONE, GridBagConstraints.WEST);
215
216        //<snip>Create spinners to edit day & night's minimum sizes
217        JSpinner minSizeSpinner = new JSpinner(
218                new SpinnerNumberModel(day.getMinimumSize().width, 0, 300, 10));
219
220        minSizeSpinner.addChangeListener(new MinimumSizeListener(day));
221        //</snip>
222
223        label = new JLabel(FIRST_COMPONENT_MIN_SIZE);
224        label.setLabelFor(minSizeSpinner);
225        addToGridbag(label, 2, 1, 1, 1,
226                GridBagConstraints.NONE, GridBagConstraints.EAST);
227        addToGridbag(minSizeSpinner, 3, 1, 1, 1,
228                GridBagConstraints.NONE, GridBagConstraints.WEST);
229
230        //<snip>Create spinners to edit day & night's minimum sizes
231        minSizeSpinner = new JSpinner(
232                new SpinnerNumberModel(night.getMinimumSize().width, 0, 300, 10));
233
234        minSizeSpinner.addChangeListener(new MinimumSizeListener(night));
235        //</snip>
236
237        label = new JLabel(SECOND_COMPONENT_MIN_SIZE);
238        label.setLabelFor(minSizeSpinner);
239        addToGridbag(label, 2, 2, 1, 1,
240                GridBagConstraints.NONE, GridBagConstraints.EAST);
241        addToGridbag(minSizeSpinner, 3, 2, 1, 1,
242                GridBagConstraints.NONE, GridBagConstraints.WEST);
243
244        return controlPanel;
245    }
246
247    protected void addToGridbag(JComponent child, int gx, int gy,
248            int gwidth, int gheight, int fill, int anchor) {
249        c.insets = insets;
250        c.gridx = gx;
251        c.gridy = gy;
252        c.gridwidth = gwidth;
253        c.gridheight = gheight;
254        c.fill = fill;
255        c.anchor = anchor;
256        gridbag.addLayoutComponent(child, c);
257        controlPanel.add(child);
258
259    }
260
261    //<snip>Create radio box to edit splitpane orientation
262    private class OrientationListener implements ActionListener {
263
264        @Override
265        public void actionPerformed(ActionEvent event) {
266            splitPane.setOrientation(event.getActionCommand().equals("vertical")
267                    ? JSplitPane.VERTICAL_SPLIT : JSplitPane.HORIZONTAL_SPLIT);
268        }
269
270    }
271    //</snip>
272
273    //<snip>Create spinners to edit day & night's minimum sizes
274    public class MinimumSizeListener implements ChangeListener {
275
276        private final JComponent component;
277
278        public MinimumSizeListener(JComponent c) {
279            this.component = c;
280        }
281
282        @Override
283        public void stateChanged(ChangeEvent event) {
284            JSpinner spinner = (JSpinner) event.getSource();
285            SpinnerNumberModel model = (SpinnerNumberModel) spinner.getModel();
286            int min = model.getNumber().intValue();
287            component.setMinimumSize(new Dimension(min, min));
288        }
289    }
290    //</snip>
291}
292