package com.revolsys.swing.layout; import java.awt.Component; import java.awt.Container; import java.awt.LayoutManager; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.GroupLayout.Group; import javax.swing.GroupLayout.ParallelGroup; import javax.swing.GroupLayout.SequentialGroup; import javax.swing.JPanel; import javax.swing.LayoutStyle; public class GroupLayouts { public static GroupLayout getLayout(final Container container, final boolean containerGaps) { LayoutManager layout = container.getLayout(); if (!(layout instanceof GroupLayout)) { layout = new GroupLayout(container); container.setLayout(layout); } final GroupLayout groupLayout = (GroupLayout)layout; groupLayout.setAutoCreateContainerGaps(containerGaps); groupLayout.setAutoCreateGaps(true); groupLayout.setLayoutStyle(BaseLayoutStyle.INSTANCE); return groupLayout; } public static void makeColumns(final Container container, final boolean containerGaps) { final GroupLayout groupLayout = getLayout(container, containerGaps); makeColumns(container, groupLayout, container.getComponentCount()); } public static void makeColumns(final Container container, final GroupLayout groupLayout, final int columnCount) { final int componentCount = container.getComponentCount(); final int numRows = (int)Math.ceil(componentCount / (double)columnCount); final SequentialGroup horizontalGroup = groupLayout.createSequentialGroup(); groupLayout.setHorizontalGroup(horizontalGroup); for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { final ParallelGroup columnGroup = groupLayout.createParallelGroup(Alignment.LEADING); horizontalGroup.addGroup(columnGroup); for (int rowIndex = 0; rowIndex < numRows; rowIndex++) { final int componentIndex = rowIndex * columnCount + columnIndex; if (componentIndex < componentCount) { final Component component = container.getComponent(componentIndex); columnGroup.addComponent(component, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE); } } } final SequentialGroup verticalGroup = groupLayout.createSequentialGroup(); groupLayout.setVerticalGroup(verticalGroup); for (int rowIndex = 0; rowIndex < numRows; rowIndex++) { final ParallelGroup rowGroup = groupLayout.createParallelGroup(Alignment.BASELINE); verticalGroup.addGroup(rowGroup); for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { final int componentIndex = rowIndex * columnCount + columnIndex; if (componentIndex < componentCount) { final Component component = container.getComponent(componentIndex); rowGroup.addComponent(component, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE); } } } } public static void makeColumns(final Container container, final int columnCount, final boolean containerGaps) { final GroupLayout groupLayout = getLayout(container, containerGaps); makeColumns(container, groupLayout, columnCount); } public static void makeColumns(final Container container, final int columnCount, final boolean containerGaps, final boolean gaps) { final GroupLayout groupLayout = getLayout(container, containerGaps); groupLayout.setAutoCreateContainerGaps(containerGaps); groupLayout.setAutoCreateGaps(gaps); groupLayout.setLayoutStyle(LayoutStyle.getInstance()); makeColumns(container, groupLayout, columnCount); } public static void makeColumns(final LayoutStyle layoutStyle, final Container container, final int columnCount) { final GroupLayout groupLayout = getLayout(container, true); groupLayout.setAutoCreateContainerGaps(false); groupLayout.setAutoCreateGaps(true); groupLayout.setLayoutStyle(layoutStyle); makeColumns(container, groupLayout, columnCount); } public static JPanel panelColumns(final Component... components) { final JPanel panel = new JPanel(); panel.setOpaque(false); for (final Component component : components) { panel.add(component); } makeColumns(panel, components.length, false, true); return panel; } public static ParallelGroup parallel(final GroupLayout layout, final Alignment alignment, final Object... elements) { final ParallelGroup group = layout.createParallelGroup(alignment); for (final Object element : elements) { if (element instanceof Component) { final Component component = (Component)element; group.addComponent(component); } else if (element instanceof Group) { final Group childGroup = (Group)element; group.addGroup(childGroup); } } return group; } public static ParallelGroup parallel(final GroupLayout layout, final Object... elements) { final ParallelGroup group = layout.createParallelGroup(); for (final Object element : elements) { if (element instanceof Component) { final Component component = (Component)element; group.addComponent(component); } else if (element instanceof Group) { final Group childGroup = (Group)element; group.addGroup(childGroup); } } return group; } public static SequentialGroup sequential(final GroupLayout layout, final Object... elements) { final SequentialGroup group = layout.createSequentialGroup(); for (final Object element : elements) { if (element instanceof Component) { final Component component = (Component)element; group.addComponent(component); } else if (element instanceof Group) { final Group childGroup = (Group)element; group.addGroup(childGroup); } } return group; } }