wangting
2024-09-27 a3e87f78ee262ca9bb7d9b0c997639d5f3295890
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
135
136
137
package com.vci.client.uif.engine.client.tableArea;  
   
import java.awt.*;  
import javax.swing.JScrollPane;  
import javax.swing.SwingUtilities;  
   
public class WrapLayout extends FlowLayout  
{  
   
    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = -2889903805757648006L;
 
    public WrapLayout()  
    {  
        super();  
    }  
   
    public WrapLayout(int align)  
    {  
        super(align);  
    }  
    public WrapLayout(int align, int hgap, int vgap)  
    {  
        super(align, hgap, vgap);  
    }  
   
    public Dimension preferredLayoutSize(Container target)  
    {  
        return layoutSize(target, true);  
    }  
   
    public Dimension minimumLayoutSize(Container target)  
    {  
        Dimension minimum = layoutSize(target, false);  
        minimum.width -= (getHgap() + 1);  
        return minimum;  
    }  
   
    private Dimension layoutSize(Container target, boolean preferred)  
    {  
    synchronized (target.getTreeLock())  
    {  
        //  Each row must fit with the width allocated to the containter.  
        //  When the container width = 0, the preferred width of the container  
        //  has not yet been calculated so lets ask for the maximum.  
   
        int targetWidth = target.getSize().width;  
   
        if (targetWidth == 0)  
            targetWidth = Integer.MAX_VALUE;  
   
        int hgap = getHgap();  
        int vgap = getVgap();  
        Insets insets = target.getInsets();  
        int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2);  
        int maxWidth = targetWidth - horizontalInsetsAndGap;  
   
        //  Fit components into the allowed width  
   
        Dimension dim = new Dimension(0, 0);  
        int rowWidth = 0;  
        int rowHeight = 0;  
   
        int nmembers = target.getComponentCount();  
   
        for (int i = 0; i < nmembers; i++)  
        {  
            Component m = target.getComponent(i);  
   
            if (m.isVisible())  
            {  
                Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize();  
   
                //  Can't add the component to current row. Start a new row.  
   
                if (rowWidth + d.width > maxWidth)  
                {  
                    addRow(dim, rowWidth, rowHeight);  
                    rowWidth = 0;  
                    rowHeight = 0;  
                }  
   
                //  Add a horizontal gap for all components after the first  
   
                if (rowWidth != 0)  
                {  
                    rowWidth += hgap;  
                }  
   
                rowWidth += d.width;  
                rowHeight = Math.max(rowHeight, d.height);  
            }  
        }  
   
        addRow(dim, rowWidth, rowHeight);  
   
        dim.width += horizontalInsetsAndGap;  
        dim.height += insets.top + insets.bottom + vgap * 2;  
   
        //  When using a scroll pane or the DecoratedLookAndFeel we need to  
        //  make sure the preferred size is less than the size of the  
        //  target containter so shrinking the container size works  
        //  correctly. Removing the horizontal gap is an easy way to do this.  
   
        Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target);  
   
        if (scrollPane != null)  
        {  
            dim.width -= (hgap + 1);  
        }  
   
        return dim;  
    }  
    }  
   
    /*  
     *  A new row has been completed. Use the dimensions of this row  
     *  to update the preferred size for the container.  
     *  
     *  @param dim update the width and height when appropriate  
     *  @param rowWidth the width of the row to add  
     *  @param rowHeight the height of the row to add  
     */  
    private void addRow(Dimension dim, int rowWidth, int rowHeight)  
    {  
        dim.width = Math.max(dim.width, rowWidth);  
   
        if (dim.height > 0)  
        {  
            dim.height += getVgap();  
        }  
   
        dim.height += rowHeight;  
    }  
}