package com.kostbot.zoodirector.ui; import com.google.common.base.Charsets; import com.google.common.io.Resources; import com.kostbot.zoodirector.config.ZooDirectorConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; import java.io.IOException; import java.net.URI; import java.util.Map; public class ZooDirectorFrame extends JFrame { private static final Logger logger = LoggerFactory.getLogger(ZooDirectorFrame.class); private static final String TITLE = "zoodirector"; private static final String WIKI_PATH_URL = "https://github.com/kostbot/zoodirector/wiki"; public static final Font FONT_MONOSPACED = new Font("Monospaced", Font.PLAIN, 11); public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; private JMenuBar menuBar; private final ZooDirectorConfig config; private ZooDirectorPanel zooDirectorPanel; private JMenu connectMenu; public ZooDirectorFrame(ZooDirectorConfig config) { super(TITLE); this.config = config; setupMenuBar(); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); this.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { if (zooDirectorPanel != null) { zooDirectorPanel.close(); } } }); this.setPreferredSize(new Dimension(config.getWindowWidth(), config.getWindowHeight())); this.pack(); } private class HtmlInfoDialog extends JFrame { HtmlInfoDialog(String title, String htmlResourcePath, int width, int height) { super(title); setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); String text = ""; try { text = Resources.toString(getClass().getResource(htmlResourcePath), Charsets.UTF_8); } catch (IOException e) { logger.error("failed to load {} resource {} content", title, htmlResourcePath); } JEditorPane content = new JEditorPane(); content.setContentType("text/html"); content.setEditable(false); content.setText(text); content.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { try { Desktop.getDesktop().browse(e.getURL().toURI()); } catch (Exception e1) { logger.error("failed opening link " + e.getURL(), e1); } } } }); // Ensure initial display show content from the top content.setCaretPosition(0); content.setBorder(BorderFactory.createEmptyBorder(5, 20, 10, 20)); JScrollPane scrollPane = new JScrollPane(content); add(scrollPane); setPreferredSize(new Dimension(width, height)); pack(); } } /** * Establish a new connection to a zookeeper cluster. * * @param connectionString * @param connectionRetryPeriod */ private void connect(String connectionString, int connectionRetryPeriod) { getContentPane().removeAll(); if (zooDirectorPanel != null) { zooDirectorPanel.close(); } zooDirectorPanel = new ZooDirectorPanel(connectionString, connectionRetryPeriod); setTitle(TITLE + " (" + connectionString + ")"); getContentPane().add(zooDirectorPanel); zooDirectorPanel.connect(); } private void loadConnectionMenu() { connectMenu.removeAll(); // TODO add shortcut to quick connect for adding an alias JMenuItem quickConnect = new JMenuItem("Quick Connect"); connectMenu.add(quickConnect); quickConnect.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String connectionString = (String) JOptionPane.showInputDialog( SwingUtilities.getRoot(menuBar), "Enter zookeeper connection string", "Quick Connect", JOptionPane.PLAIN_MESSAGE, null, null, "localhost:2181"); if (connectionString != null) { connect(connectionString, config.getConnectionRetryPeriod()); } } }); quickConnect.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK)); quickConnect.setMnemonic(KeyEvent.VK_Q); final Map<String, String> connectionAliases = config.getConnectionAliases(); if (connectionAliases.size() > 0) { connectMenu.addSeparator(); for (final String connectionAlias : connectionAliases.keySet()) { final String connectionString = connectionAliases.get(connectionAlias); JMenuItem menuItem = new JMenuItem(connectionAlias); menuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { connect(connectionString, config.getConnectionRetryPeriod()); } }); menuItem.setToolTipText(connectionString); connectMenu.add(menuItem); } } } /** * Create menu bar */ private void setupMenuBar() { menuBar = new JMenuBar(); connectMenu = new JMenu("Connect"); connectMenu.setMnemonic(KeyEvent.VK_C); menuBar.add(connectMenu); loadConnectionMenu(); // Settings Menu JMenu settingsMenu = new JMenu("Settings"); settingsMenu.setMnemonic(KeyEvent.VK_S); // Edit JMenuItem editSettingsMenuItem = new JMenuItem("Edit"); editSettingsMenuItem.setMnemonic(KeyEvent.VK_E); editSettingsMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_DOWN_MASK)); editSettingsMenuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ZooDirectorConfigEditor configEditor = new ZooDirectorConfigEditor((JFrame) SwingUtilities.getRoot(zooDirectorPanel), config, zooDirectorPanel == null ? null : zooDirectorPanel.getConnectionString()); configEditor.setLocationRelativeTo(SwingUtilities.getRoot(zooDirectorPanel)); configEditor.setVisible(true); configEditor.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { loadConnectionMenu(); } }); } }); settingsMenu.add(editSettingsMenuItem); menuBar.add(settingsMenu); // Help Menu JMenu helpMenu = new JMenu("Help"); helpMenu.setMnemonic(KeyEvent.VK_H); // About final JFrame aboutDialog = new HtmlInfoDialog("About", "/about.html", 400, 225); JMenuItem aboutMenuItem = new JMenuItem("About"); aboutMenuItem.setMnemonic(KeyEvent.VK_A); aboutMenuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { aboutDialog.setLocationRelativeTo(SwingUtilities.getRoot(zooDirectorPanel)); aboutDialog.setVisible(true); } }); helpMenu.add(aboutMenuItem); JMenuItem commandUsageMenuItem = new JMenuItem("Wiki"); commandUsageMenuItem.setMnemonic(KeyEvent.VK_W); commandUsageMenuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { Desktop.getDesktop().browse(new URI(WIKI_PATH_URL)); } catch (Exception e1) { logger.error("failed to redirect to help page"); } } }); helpMenu.add(commandUsageMenuItem); menuBar.add(helpMenu); this.setJMenuBar(menuBar); } }