package org.multibit.viewsystem.swing.view.components; import org.multibit.Localiser; import org.multibit.viewsystem.swing.ColorAndFontConstants; import javax.swing.*; import java.awt.*; /** * Panel that has a title bar at the top. The panel always uses GridBagLayout * with the title in row 0. * * @author jim * */ public class MultiBitTitledPanel extends JPanel { private static final long serialVersionUID = 4532881356315823376L; public static final int LEFT_INDENT = 25; public static final int STENT_DELTA = 16; public static final int SEPARATION_BETWEEN_NAME_VALUE_PAIRS = 16; public static final int MAXIMUM_NUMBER_OF_COLUMNS = 10; public MultiBitTitledPanel(String title, ComponentOrientation componentOrientation) { setLayout(new GridBagLayout()); setOpaque(false); setComponentOrientation(componentOrientation); Font font = FontSizer.INSTANCE.getAdjustedDefaultFont(); setFont(font); FontMetrics fontMetrics = getFontMetrics(font); int preferredHeight = (int)(fontMetrics.getHeight() * 1.618); int spacerHeight = (int)(fontMetrics.getHeight() * 0.618); HorizontalGradientPanel titlePanel = new HorizontalGradientPanel(componentOrientation); titlePanel.setLayout(new GridBagLayout()); titlePanel.setComponentOrientation(componentOrientation); Font titleFont = FontSizer.INSTANCE.getAdjustedDefaultFontWithDelta(ColorAndFontConstants.MULTIBIT_LARGE_FONT_INCREASE); GridBagConstraints constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.NONE; constraints.gridx = 0; constraints.gridy = 0; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 0.05; constraints.weighty = 1; constraints.anchor = GridBagConstraints.LINE_START; titlePanel.add(MultiBitTitledPanel.getIndentPanel(preferredHeight), constraints); constraints.fill = GridBagConstraints.NONE; constraints.gridx = 1; constraints.gridy = 0; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 0.95; constraints.weighty = 1; constraints.anchor = GridBagConstraints.LINE_START; MultiBitLabel titleLabel = new MultiBitLabel(title, JLabel.LEFT); titleLabel.setFont(titleFont); titlePanel.add(titleLabel, constraints); JPanel fill1 = new JPanel(); fill1.setOpaque(false); constraints.fill = GridBagConstraints.BOTH; constraints.gridx = 2; constraints.gridy = 0; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 1000; constraints.weighty = 1; constraints.anchor = GridBagConstraints.LINE_END; titlePanel.add(fill1, constraints); GridBagConstraints constraints2 = new GridBagConstraints(); // Put a half height space above the title. JPanel spacer = new JPanel(); spacer.setOpaque(false); spacer.setMinimumSize(new Dimension(1, spacerHeight)); spacer.setPreferredSize(new Dimension(1, spacerHeight)); spacer.setMaximumSize(new Dimension(1, spacerHeight)); constraints2.fill = GridBagConstraints.BOTH; constraints2.gridx = 0; constraints2.gridy = 0; constraints2.gridwidth = 1; constraints2.gridheight = 1; constraints2.weightx = 0.01; constraints2.weighty = 0.01; constraints2.anchor = GridBagConstraints.CENTER; add(spacer, constraints2); constraints2.fill = GridBagConstraints.BOTH; constraints2.gridx = 0; constraints2.gridy = 1; constraints2.gridwidth = MAXIMUM_NUMBER_OF_COLUMNS; constraints2.gridheight = 1; constraints2.weightx = 1; constraints2.weighty = 0.1; constraints2.anchor = GridBagConstraints.ABOVE_BASELINE_LEADING; // Put the title in the second row. add(titlePanel, constraints2); // Put a half height space under the title. JPanel spacer2 = new JPanel(); spacer2.setOpaque(false); spacer2.setMinimumSize(new Dimension(1, spacerHeight)); spacer2.setPreferredSize(new Dimension(1, spacerHeight)); spacer2.setMaximumSize(new Dimension(1, spacerHeight)); constraints2.fill = GridBagConstraints.BOTH; constraints2.gridx = 0; constraints2.gridy = 2; constraints2.gridwidth = 1; constraints2.gridheight = 1; constraints2.weightx = 0.01; constraints2.weighty = 0.01; constraints2.anchor = GridBagConstraints.CENTER; add(spacer2, constraints2); } public static JPanel getIndentPanel(int height) { JPanel filler1 = new JPanel(); filler1.setOpaque(false); filler1.setMinimumSize(new Dimension(LEFT_INDENT, height)); filler1.setPreferredSize(new Dimension(LEFT_INDENT, height)); filler1.setMaximumSize(new Dimension(LEFT_INDENT, height)); return filler1; } public static MultiBitLabel addLeftJustifiedTextAtIndent(String text, int row, JPanel panel) { GridBagConstraints constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.BOTH; constraints.gridx = 0; constraints.gridy = row; constraints.weightx = 0.1; constraints.weighty = 0.05; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.anchor = GridBagConstraints.LINE_START; JPanel indent = MultiBitTitledPanel.getIndentPanel(1); panel.add(indent, constraints); MultiBitLabel label = new MultiBitLabel(text); label.setBorder(BorderFactory.createEmptyBorder(0, 0, 4, 0)); constraints.fill = GridBagConstraints.HORIZONTAL; constraints.gridx = 1; constraints.gridy = row; constraints.weightx = 0.6; constraints.weighty = 0.3; constraints.gridwidth = 3; constraints.anchor = GridBagConstraints.LINE_START; panel.add(label, constraints); JPanel filler0 = new JPanel(); filler0.setOpaque(false); constraints.fill = GridBagConstraints.BOTH; constraints.gridx = MAXIMUM_NUMBER_OF_COLUMNS - 1; constraints.gridy = row; constraints.weightx = 100; constraints.weighty = 1; constraints.gridwidth = 1; constraints.anchor = GridBagConstraints.LINE_END; panel.add(filler0, constraints); return label; } public static int calculateStentWidthForKeys(Localiser localiser, String[] keys, JPanel targetPanel) { Font font = FontSizer.INSTANCE.getAdjustedDefaultFont(); FontMetrics fontMetrics = targetPanel.getFontMetrics(font); int minimumWidth = 0; if (keys != null) { for (int i = 0; i < keys.length; i++) { minimumWidth = Math.max(minimumWidth, fontMetrics.stringWidth(localiser.getString(keys[i]))); } } minimumWidth += STENT_DELTA; return minimumWidth; } public static JPanel createStent(int stentWidth) { return createStent(stentWidth, 1); } public static JPanel createStent(int stentWidth, int stentHeight) { JPanel stentPanel = new JPanel(); stentPanel.setOpaque(false); //stentPanel.setBorder(BorderFactory.createLineBorder(Color.GREEN)); stentPanel.setMinimumSize(new Dimension(stentWidth, stentHeight)); stentPanel.setPreferredSize(new Dimension(stentWidth, stentHeight)); stentPanel.setMaximumSize(new Dimension(stentWidth, stentHeight)); return stentPanel; } }