package org.signalml.app.view.common.components.panels; import java.util.ArrayList; import java.util.List; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.GroupLayout.ParallelGroup; public abstract class LabeledComponentsPanel extends AbstractPanel { private List<ComponentWithLabel> components; public LabeledComponentsPanel() { super(); createInterface(); } public LabeledComponentsPanel(String label) { super(label); createInterface(); } protected List<ComponentWithLabel> getComponentsWithLabels() { if (components == null) components = createComponents(); return components; } protected abstract List<ComponentWithLabel> createComponents(); protected abstract int getNumberOfColumns(); protected int getNumberOfRows() { return (int) Math.ceil(((double) getComponentsWithLabels().size()) / getNumberOfColumns()); } private List<ComponentWithLabel> getComponentsWithLabelsForColumn(int column) { List<ComponentWithLabel> columnComponents = new ArrayList<ComponentWithLabel>(); for (int rowNumber = 0; rowNumber < getNumberOfRows(); rowNumber++) { int index = column * getNumberOfRows() + rowNumber; columnComponents.add(components.get(index)); } return columnComponents; } private List<ComponentWithLabel> getComponentsWithLabelsForRow(int rowNumber) { List<ComponentWithLabel> columnComponents = new ArrayList<ComponentWithLabel>(); for (int columnNumber = 0; columnNumber < getNumberOfColumns(); columnNumber++) { int componentIndex = columnNumber * getNumberOfRows() + rowNumber; columnComponents.add(components.get(componentIndex)); } return columnComponents; } protected void createInterface() { GroupLayout layout = new GroupLayout(this); this.setLayout(layout); layout.setAutoCreateContainerGaps(false); layout.setAutoCreateGaps(true); //hgroup GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup(); for (int columnNumber = 0; columnNumber < getNumberOfColumns(); columnNumber++) { ParallelGroup labelsParallelGroup = layout.createParallelGroup(); ParallelGroup componentsParallelGroup = layout.createParallelGroup(); for (ComponentWithLabel componentWithLabel: getComponentsWithLabelsForColumn(columnNumber)) { labelsParallelGroup.addComponent(componentWithLabel.getLabel()); componentsParallelGroup.addComponent(componentWithLabel.getComponent()); } hGroup.addGroup(labelsParallelGroup); hGroup.addGroup(componentsParallelGroup); } layout.setHorizontalGroup(hGroup); //vgroup GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup(); for (int rowNumber = 0; rowNumber < getNumberOfRows(); rowNumber++) { ParallelGroup parallelGroup = layout.createParallelGroup(Alignment.BASELINE); for (ComponentWithLabel componentWithLabel: getComponentsWithLabelsForRow(rowNumber)) { parallelGroup.addComponent(componentWithLabel.getLabel()); parallelGroup.addComponent(componentWithLabel.getComponent()); } vGroup.addGroup(parallelGroup); } layout.setVerticalGroup(vGroup); } }