package org.mansart.mongocount.gui; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rsyntaxtextarea.SyntaxConstants; import org.fife.ui.rtextarea.RTextScrollPane; import org.mansart.mongocount.Configuration; import javax.swing.*; import javax.swing.plaf.basic.BasicComboBoxRenderer; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; final class ConfigurationDialog extends JDialog { private static final Color[] COLORS = new Color[] { Color.BLACK, Color.BLUE, Color.GREEN, Color.MAGENTA, Color.RED, Color.YELLOW }; private Configuration configuration = null; private JTextField hostField = new JTextField(); private JSpinner portField = new JSpinner(); private JTextField dbnameField = new JTextField(); private JTextField collnameField = new JTextField(); private RSyntaxTextArea queryField = new RSyntaxTextArea(); private JSpinner intervalField = new JSpinner(); private JComboBox<Color> colorField = new JComboBox<>(COLORS); private JButton cancelButton = new JButton("Cancel"); private JButton okButton = new JButton("OK"); public ConfigurationDialog(Configuration configuration, JComponent owner) { super((Frame) SwingUtilities.windowForComponent(owner), "Configuration", true); this.configuration = configuration; this.setupListeners(); this.setupGraphics(); } private void setupListeners() { this.addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { ConfigurationDialog.this.hostField.setText(ConfigurationDialog.this.configuration.getHost()); ConfigurationDialog.this.portField.setValue(ConfigurationDialog.this.configuration.getPort()); ConfigurationDialog.this.dbnameField.setText(ConfigurationDialog.this.configuration.getDbname()); ConfigurationDialog.this.collnameField.setText(ConfigurationDialog.this.configuration.getCollname()); ConfigurationDialog.this.queryField.setText(ConfigurationDialog.this.configuration.getQuery()); ConfigurationDialog.this.intervalField.setValue(ConfigurationDialog.this.configuration.getInterval()); } }); this.colorField.addActionListener(e -> { Color color = (Color) ConfigurationDialog.this.colorField.getSelectedItem(); ConfigurationDialog.this.colorField.setBackground(color); }); this.okButton.addActionListener(e -> { String host = ConfigurationDialog.this.hostField.getText(); int port = (Integer) ConfigurationDialog.this.portField.getValue(); String dbname = ConfigurationDialog.this.dbnameField.getText(); String collname = ConfigurationDialog.this.collnameField.getText(); String query = ConfigurationDialog.this.queryField.getText(); int interval = (Integer) ConfigurationDialog.this.intervalField.getValue(); Color color = (Color) ConfigurationDialog.this.colorField.getSelectedItem(); ConfigurationDialog.this.configuration.udpate(host, port, dbname, collname, query, interval, color); ConfigurationDialog.this.setVisible(false); }); this.cancelButton.addActionListener(e -> ConfigurationDialog.this.setVisible(false)); } private void setupGraphics() { this.setSize(450, 350); this.queryField.setRows(5); this.queryField.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JSON); this.queryField.setTabsEmulated(true); this.queryField.setTabSize(2); this.colorField.setRenderer(new ColorRenderer()); this.colorField.setSelectedItem(Color.RED); JLabel hostLabel = new JLabel("Host"); hostLabel.setHorizontalAlignment(JLabel.RIGHT); JLabel portLabel = new JLabel("Port"); portLabel.setHorizontalAlignment(JLabel.RIGHT); JLabel dbnameLabel = new JLabel("Database"); dbnameLabel.setHorizontalAlignment(JLabel.RIGHT); JLabel collnameLabel = new JLabel("Collection"); collnameLabel.setHorizontalAlignment(JLabel.RIGHT); JLabel queryLabel = new JLabel("Query"); queryLabel.setHorizontalAlignment(JLabel.RIGHT); JLabel intervalLabel = new JLabel("Interval"); intervalLabel.setHorizontalAlignment(JLabel.RIGHT); JLabel colorLabel = new JLabel("Color"); colorLabel.setHorizontalAlignment(JLabel.RIGHT); JPanel formPanel = new JPanel(new GridBagLayout()); GridBagConstraints constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.HORIZONTAL; double labelWeightx = 0.1; double controlWeightx = 0.9; Insets labelInsets = new Insets(0, 0, 0, 0); Insets controlInsets = new Insets(0, 5, 0, 5); int posy = -1; constraints.gridx = 0; constraints.gridy = ++posy; constraints.weightx = labelWeightx; constraints.insets = labelInsets; formPanel.add(hostLabel, constraints); constraints.gridx = 1; constraints.gridy = posy; constraints.weightx = controlWeightx; constraints.insets = controlInsets; formPanel.add(this.hostField, constraints); constraints.gridx = 0; constraints.gridy = ++posy; constraints.weightx = labelWeightx; constraints.insets = labelInsets; formPanel.add(portLabel, constraints); constraints.gridx = 1; constraints.gridy = posy; constraints.weightx = controlWeightx; constraints.insets = controlInsets; formPanel.add(this.portField, constraints); constraints.gridx = 0; constraints.gridy = ++posy; constraints.weightx = labelWeightx; constraints.insets = labelInsets; formPanel.add(dbnameLabel, constraints); constraints.gridx = 1; constraints.gridy = posy; constraints.weightx = controlWeightx; constraints.insets = controlInsets; formPanel.add(this.dbnameField, constraints); constraints.gridx = 0; constraints.gridy = ++posy; constraints.weightx = labelWeightx; constraints.insets = labelInsets; formPanel.add(collnameLabel, constraints); constraints.gridx = 1; constraints.gridy = posy; constraints.weightx = controlWeightx; constraints.insets = controlInsets; formPanel.add(this.collnameField, constraints); constraints.gridx = 0; constraints.gridy = ++posy; constraints.weightx = labelWeightx; constraints.insets = labelInsets; formPanel.add(queryLabel, constraints); constraints.gridx = 1; constraints.gridy = posy; constraints.weightx = controlWeightx; constraints.insets = controlInsets; formPanel.add(new RTextScrollPane(this.queryField), constraints); constraints.gridx = 0; constraints.gridy = ++posy; constraints.weightx = labelWeightx; constraints.insets = labelInsets; formPanel.add(intervalLabel, constraints); constraints.gridx = 1; constraints.gridy = posy; constraints.weightx = controlWeightx; constraints.insets = controlInsets; formPanel.add(this.intervalField, constraints); constraints.gridx = 0; constraints.gridy = ++posy; constraints.weightx = labelWeightx; constraints.insets = labelInsets; formPanel.add(colorLabel, constraints); constraints.gridx = 1; constraints.gridy = posy; constraints.weightx = controlWeightx; constraints.insets = controlInsets; formPanel.add(this.colorField, constraints); JPanel controlsPanel = new JPanel(new FlowLayout()); controlsPanel.add(this.cancelButton); controlsPanel.add(this.okButton); JPanel mainPanel = new JPanel(new BorderLayout()); mainPanel.add(formPanel, BorderLayout.CENTER); mainPanel.add(controlsPanel, BorderLayout.SOUTH); this.setContentPane(mainPanel); } private class ColorRenderer extends BasicComboBoxRenderer { @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); Color color = (Color) value; this.setText(""); this.setBackground(color); return this; } } }