* Bug #13907 fixed - avoids the gray background on the right panel of the palette...
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / palette / view / ModifiedFlowLayout.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Clement DAVID
4  * Copyright (C) 2015 - Marcos CARDINOT
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.xcos.palette.view;
15
16 import java.awt.Component;
17 import java.awt.Container;
18 import java.awt.Dimension;
19 import java.awt.FlowLayout;
20 import java.awt.Insets;
21
22 // CHECKSTYLE:OFF
23 /**
24  * A modified version of FlowLayout that allows containers using this Layout to
25  * behave in a reasonable manner when placed inside a JScrollPane
26  *
27  * @author Babu Kalakrishnan
28  * @see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5082531
29  * @see http ://www.javakb.com/Uwe/Forum.aspx/java-gui/1904/Flowlayout-JPanel-
30  *      and-JScrollPane-Scrolling-vertically-impossible
31  */
32 @SuppressWarnings(value = { "serial" })
33 public class ModifiedFlowLayout extends FlowLayout {
34     public ModifiedFlowLayout() {
35         super();
36     }
37
38     public ModifiedFlowLayout(int align) {
39         super(align);
40     }
41
42     public ModifiedFlowLayout(int align, int hgap, int vgap) {
43         super(align, hgap, vgap);
44     }
45
46     @Override
47     public Dimension minimumLayoutSize(Container target) {
48         return computeSize(target, false);
49     }
50
51     @Override
52     public Dimension preferredLayoutSize(Container target) {
53         return computeSize(target, true);
54     }
55
56     private Dimension computeSize(Container target, boolean minimum) {
57         synchronized (target.getTreeLock()) {
58             int hgap = getHgap();
59             int vgap = getVgap();
60             int w = target.getWidth();
61
62             // Let this behave like a regular FlowLayout (single row)
63             // if the container hasn't been assigned any size yet
64             if (w == 0) {
65                 w = Integer.MAX_VALUE;
66             }
67
68             Insets insets = target.getInsets();
69             if (insets == null) {
70                 insets = new Insets(0, 0, 0, 0);
71             }
72             int reqdWidth = 0;
73
74             int maxwidth = w - (insets.left + insets.right + hgap * 2);
75             int n = target.getComponentCount();
76             int x = 0;
77             int y = insets.top;
78             int rowHeight = 0;
79
80             for (int i = 0; i < n; i++) {
81                 Component c = target.getComponent(i);
82                 if (c.isVisible()) {
83                     Dimension d = minimum ? c.getMinimumSize()
84                                           : c.getPreferredSize();
85                     if ((x == 0) || ((x + d.width) <= maxwidth)) {
86                         if (x > 0) {
87                             x += hgap;
88                         }
89                         x += d.width;
90                         rowHeight = Math.max(rowHeight, d.height);
91                     } else {
92                         x = d.width;
93                         y += vgap + rowHeight;
94                         rowHeight = d.height;
95                     }
96                     reqdWidth = Math.max(reqdWidth, x);
97                 }
98             }
99             y += rowHeight;
100
101             // fill up the empty space
102             int emptySpace = target.getParent().getParent().getHeight() - y;
103             emptySpace = emptySpace < 0 ? 0 : emptySpace;
104             y += emptySpace - 2;
105
106             return new Dimension(reqdWidth + insets.left + insets.right, y);
107         }
108     }
109 }
110 // CHECKSTYLE:ON