1/*
2 * Copyright (c) 2007, 2015, 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 */
23
24/*
25 * @test
26 * @bug 4856008 7025987
27 * @summary Tests border insets
28 * @author Sergey Malenkov
29 * @modules java.desktop/com.sun.java.swing.plaf.motif
30 *          java.desktop/com.sun.java.swing.plaf.windows
31 *          java.desktop/sun.swing.plaf.synth
32 */
33
34import com.sun.java.swing.plaf.motif.MotifBorders;
35import com.sun.java.swing.plaf.windows.WindowsBorders;
36
37import java.awt.Color;
38import java.awt.Font;
39import java.awt.Insets;
40
41import javax.swing.ActionMap;
42import javax.swing.JComponent;
43import javax.swing.JFileChooser;
44import javax.swing.JLabel;
45import javax.swing.JPopupMenu;
46import javax.swing.JToggleButton;
47import javax.swing.JToolBar;
48import javax.swing.border.AbstractBorder;
49import javax.swing.border.BevelBorder;
50import javax.swing.border.Border;
51import javax.swing.border.CompoundBorder;
52import javax.swing.border.EmptyBorder;
53import javax.swing.border.EtchedBorder;
54import javax.swing.border.LineBorder;
55import javax.swing.border.MatteBorder;
56import javax.swing.border.SoftBevelBorder;
57import javax.swing.border.TitledBorder;
58import javax.swing.plaf.ActionMapUIResource;
59import javax.swing.plaf.BorderUIResource;
60import javax.swing.plaf.synth.SynthLookAndFeel;
61import javax.swing.plaf.basic.BasicBorders;
62import javax.swing.plaf.basic.BasicToolBarUI;
63import javax.swing.plaf.metal.MetalBorders;
64import javax.swing.plaf.metal.MetalComboBoxEditor;
65import javax.swing.plaf.nimbus.NimbusLookAndFeel;
66
67import sun.swing.plaf.synth.SynthFileChooserUI;
68
69public class Test4856008 {
70    private static final JLabel LABEL = new JLabel();
71    private static final JPopupMenu POPUP = new JPopupMenu();
72    private static final JToolBar TOOLBAR = new JToolBar();
73
74    private static final Border[] BORDERS = {
75            new MotifBorders.BevelBorder(true, Color.BLACK, Color.WHITE),
76            new MotifBorders.ButtonBorder(Color.CYAN, Color.MAGENTA, Color.YELLOW, Color.BLACK),
77            new MotifBorders.FocusBorder(Color.BLACK, Color.WHITE),
78            new MotifBorders.FrameBorder(LABEL),
79            new MotifBorders.MenuBarBorder(Color.CYAN, Color.MAGENTA, Color.YELLOW, Color.BLACK),
80            new MotifBorders.MotifPopupMenuBorder(new Font(null, Font.PLAIN, 10), Color.CYAN, Color.MAGENTA, Color.YELLOW, Color.BLACK),
81            new MotifBorders.ToggleButtonBorder(Color.CYAN, Color.MAGENTA, Color.YELLOW, Color.BLACK),
82
83            new WindowsBorders.ProgressBarBorder(Color.BLACK, Color.WHITE),
84            new WindowsBorders.ToolBarBorder(Color.BLACK, Color.WHITE),
85            //- WindowsInternalFrameUI.XPBorder is not accessible: check it visually
86            //? WindowsTableHeaderUI.IconBorder is not accessible: check it visually
87            //- XPStyle.XPEmptyBorder is not accessible: check it visually
88            //- XPStyle.XPFillBorder is not accessible: check it visually
89            //- XPStyle.XPImageBorder is not accessible: check it visually
90
91            new BevelBorder(BevelBorder.RAISED),
92            new CompoundBorder(),
93            new EmptyBorder(1, 2, 3, 4),
94            new EtchedBorder(),
95            new LineBorder(Color.BLACK, 2, true),
96            new MatteBorder(1, 2, 3, 4, Color.BLACK),
97            new SoftBevelBorder(BevelBorder.LOWERED),
98            new TitledBorder("4856008"),
99
100            new BorderUIResource(new EmptyBorder(1, 2, 3, 4)),
101
102            new BasicBorders.ButtonBorder(Color.CYAN, Color.MAGENTA, Color.YELLOW, Color.BLACK),
103            new BasicBorders.FieldBorder(Color.CYAN, Color.MAGENTA, Color.YELLOW, Color.BLACK),
104            new BasicBorders.MarginBorder(),
105            new BasicBorders.MenuBarBorder(Color.BLACK, Color.WHITE),
106            new BasicBorders.RadioButtonBorder(Color.CYAN, Color.MAGENTA, Color.YELLOW, Color.BLACK),
107            //+ BasicBorders.RolloverMarginBorder:
108            new ToolBar().getRolloverMarginBorder(),
109            new BasicBorders.SplitPaneBorder(Color.BLACK, Color.WHITE),
110            //+ BasicBorders.SplitPaneDividerBorder:
111            BasicBorders.getSplitPaneDividerBorder(),
112            new BasicBorders.ToggleButtonBorder(Color.CYAN, Color.MAGENTA, Color.YELLOW, Color.BLACK),
113
114            new MetalBorders.ButtonBorder(),
115            //- MetalBorders.DialogBorder is not accessible: check it visually
116            new MetalBorders.Flush3DBorder(),
117            //- MetalBorders.FrameBorder is not accessible: check it visually
118            new MetalBorders.InternalFrameBorder(),
119            new MetalBorders.MenuBarBorder(),
120            new MetalBorders.MenuItemBorder(),
121            new MetalBorders.OptionDialogBorder(),
122            new MetalBorders.PaletteBorder(),
123            new MetalBorders.PopupMenuBorder(),
124            //- MetalBorders.RolloverMarginBorder is not accessible: check it visually
125            new MetalBorders.ScrollPaneBorder(),
126            new MetalBorders.TableHeaderBorder(),
127            new MetalBorders.ToolBarBorder(),
128            //+ MetalComboBoxEditor.EditorBorder:
129            new MetalEditor().getEditorBorder(),
130
131            //- SynthBorder is not accessible: check it visually
132            //- SynthScrollPaneUI.ViewportBorder is not accessible: check it visually
133
134            //? CSSBorder is not accessible: check it visually
135            //? CommentView.CommentBorder is not accessible: check it visually
136            //- HiddenTagView.EndTagBorder is not accessible: check it visually
137            //- HiddenTagView.StartTagBorder is not accessible: check it visually
138
139            //+ SynthFileChooserUI.UIBorder:
140            new SynthFileChooser().getUIBorder(),
141
142            //+ LoweredBorder:
143            new NimbusLookAndFeel().getDefaults().getBorder("TitledBorder.border"),
144    };
145
146    public static void main(String[] args) {
147        for (Border border : BORDERS) {
148            System.out.println(border.getClass());
149            test(border, border.getBorderInsets(getComponent(border)));
150            if (border instanceof AbstractBorder) {
151                test((AbstractBorder) border);
152            }
153        }
154    }
155
156    private static void test(AbstractBorder border) {
157        Insets insets = new Insets(0, 0, 0, 0);
158        if (insets != border.getBorderInsets(getComponent(border), insets)) {
159            throw new Error("both instances are differ for " + border.getClass());
160        }
161        test(border, insets);
162    }
163
164    private static void test(Border border, Insets insets) {
165        Insets result = border.getBorderInsets(getComponent(border));
166        if (insets == result) {
167            throw new Error("both instances are the same for " + border.getClass());
168        }
169        if (!insets.equals(result)) {
170            throw new Error("both insets are not equal for " + border.getClass());
171        }
172    }
173
174    private static JComponent getComponent(Border border) {
175        Class type = border.getClass();
176        if (type.equals(MotifBorders.MotifPopupMenuBorder.class)) {
177            return POPUP;
178        }
179        if (type.equals(WindowsBorders.ToolBarBorder.class)) {
180            return TOOLBAR;
181        }
182        if (type.equals(MetalBorders.ToolBarBorder.class)) {
183            return TOOLBAR;
184        }
185        return LABEL;
186    }
187
188    // This class is used to get the instance of BasicBorders.RolloverMarginBorder
189    private static class ToolBar extends BasicToolBarUI {
190        private Border getRolloverMarginBorder() {
191            JToggleButton button = new JToggleButton();
192            CompoundBorder border = (CompoundBorder) getNonRolloverBorder(button);
193            return border.getInsideBorder();
194        }
195    }
196
197    // This class is used to get the instance of MetalComboBoxEditor.EditorBorder
198    private static class MetalEditor extends MetalComboBoxEditor {
199        private Border getEditorBorder() {
200            return editor.getBorder();
201        }
202    }
203
204    // This class is used to get the instance of SynthFileChooserUI.UIBorder
205    private static class SynthFileChooser extends SynthFileChooserUI {
206        private static final JFileChooser CHOOSER = new JFileChooser();
207        private String name;
208
209        private SynthFileChooser() {
210            super(CHOOSER);
211        }
212
213        private Border getUIBorder() {
214            new SynthLookAndFeel().initialize();
215            CHOOSER.setBorder(null);
216            installDefaults(CHOOSER);
217            return CHOOSER.getBorder();
218        }
219
220        @Override
221        protected ActionMap createActionMap() {
222            return new ActionMapUIResource();
223        }
224
225        @Override
226        public String getFileName() {
227            return this.name;
228        }
229
230        @Override
231        public void setFileName(String name) {
232            this.name = name;
233        }
234    }
235}
236