package org.lobobrowser.security; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.SwingConstants; import javax.swing.border.EmptyBorder; import javax.swing.plaf.basic.BasicTabbedPaneUI; import org.lobobrowser.security.PermissionCellButton.ChangeListener; import org.lobobrowser.security.PermissionSystem.PermissionBoard; import org.lobobrowser.security.PermissionSystem.PermissionBoard.PermissionRow; import org.lobobrowser.security.PermissionSystem.PermissionBoard.PermissionRow.PermissionCell; import org.lobobrowser.ua.UserAgentContext.RequestKind; public class PermissionTable { public static JComponent makeTable(final PermissionSystem system, final String[] columnNames, final String[][] requestData) { final List<PermissionCellButton> buttons = new LinkedList<>(); final ChangeListener listener = () -> { buttons.stream().forEach(b -> b.update()); }; final JTabbedPane tabPane = new JTabbedPane(); tabPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); tabPane.setTabPlacement(SwingConstants.RIGHT); tabPane.setUI(new BasicTabbedPaneUI() { private static final int PADDING_Y = 16; private static final int PADDING_X = 16; @Override protected int calculateTabHeight(final int tabPlacement, final int tabIndex, final int fontHeight) { return super.calculateTabHeight(tabPlacement, tabIndex, fontHeight) + PADDING_Y; } @Override protected int calculateTabWidth(final int tabPlacement, final int tabIndex, final java.awt.FontMetrics metrics) { return super.calculateTabWidth(tabPlacement, tabIndex, metrics) + PADDING_X; } }); tabPane.setFocusable(false); system.getBoards().stream().forEachOrdered(board -> { final JPanel grid = makeBoardView(board, columnNames, requestData, buttons, listener); tabPane.add(board.hostPattern, grid); }); tabPane.setSelectedIndex(tabPane.getTabCount() - 1); return tabPane; } private static JPanel makeBoardView(final PermissionBoard board, final String[] columnNames, final String[][] requestData, final List<PermissionCellButton> buttons, final ChangeListener listener) { final JPanel grid = new JPanel(new GridBagLayout()); final GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.ipadx = 20; gbc.ipady = 4; gbc.insets = new Insets(1, 1, 1, 1); { final PermissionRow row = board.getHeaderRow(); addRowToGrid(grid, gbc, row, columnNames, listener, buttons); } { final List<Entry<String, PermissionRow>> rows = board.getRows(); for (int i = 0, numRows = board.getRowCount(); i < numRows; i++) { gbc.gridy = i + 1; final PermissionRow row = rows.get(i).getValue(); addRowToGrid(grid, gbc, row, requestData[i], listener, buttons); } } final JPanel wrapGrid = new JPanel(); wrapGrid.add(grid); wrapGrid.setBorder(new EmptyBorder(16, 16, 16, 16)); return wrapGrid; } private static void addRowToGrid(final JPanel grid, final GridBagConstraints gbc, final PermissionRow row, final String[] texts, final ChangeListener listener, final List<PermissionCellButton> buttons) { for (int j = 0, numCols = RequestKind.numKinds() + 1; j < numCols; j++) { PermissionCell cell; if (j == 0) { gbc.weightx = 1d; cell = row.getHostCell(); } else { gbc.weightx = 0d; cell = row.getRequestCell(j - 1); } final String text = texts[j].equals("0") ? " " : texts[j]; final PermissionCellButton button = new PermissionCellButton(cell, text, j == 0, listener); gbc.gridx = j; grid.add(button, gbc); buttons.add(button); } } }