package com.ts3client.ui; import com.ts3client.config.Bookmark; import com.ts3client.config.Bookmarks; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.KeyStroke; /** * The main window's menu bar: Connections, Bookmarks, Self, Tools and Help. * Talks to {@link MainFrame} only through {@link Listener}; the away/commander * item states are pushed in by {@link #refresh}, mirroring how {@link MainToolbar} * is kept in sync. */ final class MainMenuBar extends JMenuBar { interface Listener { void onConnect(); void onDisconnect(); void onCloseTab(); void onQuit(); void onToggleMic(); void onToggleSpeaker(); /** The plain toggle carries no message; "Set away status…" is where messages are chosen. */ void onAwayToggle(boolean away); void onAwayStatus(); void onCommanderToggle(boolean commander); void onChangeNickname(); void onShowIdentities(); void onShowSettings(); void onShowAbout(); void onConnectBookmark(Bookmark bookmark); void onAddCurrentServerBookmark(); void onManageBookmarks(); } private final Bookmarks bookmarks; private final Listener listener; private JMenu bookmarksMenu; private JCheckBoxMenuItem awayItem; private JMenuItem awayStatusItem; private JCheckBoxMenuItem commanderItem; MainMenuBar(Bookmarks bookmarks, Listener listener) { this.bookmarks = bookmarks; this.listener = listener; JMenu connections = new JMenu("Connections"); JMenuItem connect = new JMenuItem("Connect…", Icons.of("CONNECT")); connect.setAccelerator(KeyStroke.getKeyStroke("control S")); connect.addActionListener(e -> listener.onConnect()); JMenuItem disconnect = new JMenuItem("Disconnect", Icons.of("DISCONNECT")); disconnect.addActionListener(e -> listener.onDisconnect()); JMenuItem closeTab = new JMenuItem("Close tab", Icons.of("CLOSE_BUTTON")); closeTab.setAccelerator(KeyStroke.getKeyStroke("control W")); closeTab.addActionListener(e -> listener.onCloseTab()); JMenuItem quit = new JMenuItem("Quit", Icons.of("QUIT")); quit.addActionListener(e -> listener.onQuit()); connections.add(connect); connections.add(disconnect); connections.add(closeTab); connections.addSeparator(); connections.add(quit); bookmarksMenu = new JMenu("Bookmarks"); rebuildBookmarks(); JMenu self = new JMenu("Self"); JMenuItem mute = new JMenuItem("Toggle microphone", Icons.of("CAPTURE")); mute.addActionListener(e -> listener.onToggleMic()); JMenuItem deaf = new JMenuItem("Toggle speakers", Icons.of("PLAYBACK")); deaf.addActionListener(e -> listener.onToggleSpeaker()); awayItem = new JCheckBoxMenuItem("Away", Icons.of("AWAY"), false); awayItem.addActionListener(e -> listener.onAwayToggle(awayItem.isSelected())); awayStatusItem = new JMenuItem("Set away status…", Icons.of("EDIT")); awayStatusItem.addActionListener(e -> listener.onAwayStatus()); commanderItem = new JCheckBoxMenuItem("Channel commander", Icons.of("CHANNEL_COMMANDER"), false); commanderItem.addActionListener(e -> listener.onCommanderToggle(commanderItem.isSelected())); JMenuItem nick = new JMenuItem("Change nickname…", Icons.of("CHANGE_NICKNAME")); nick.addActionListener(e -> listener.onChangeNickname()); self.add(mute); self.add(deaf); self.addSeparator(); self.add(awayItem); self.add(awayStatusItem); self.add(commanderItem); self.addSeparator(); self.add(nick); JMenu tools = new JMenu("Tools"); JMenuItem identitiesItem = new JMenuItem("Identities…", Icons.of("IDENTITY_MANAGER")); identitiesItem.addActionListener(e -> listener.onShowIdentities()); JMenuItem options = new JMenuItem("Options…", Icons.of("SETTINGS")); options.addActionListener(e -> listener.onShowSettings()); tools.add(identitiesItem); tools.addSeparator(); tools.add(options); JMenu help = new JMenu("Help"); JMenuItem about = new JMenuItem("About", Icons.of("ABOUT")); about.addActionListener(e -> listener.onShowAbout()); help.add(about); add(connections); add(bookmarksMenu); add(self); add(tools); add(help); } /** Reflects the current tab's away/commander state on the menu items. */ void refresh(boolean connected, boolean away, boolean commander) { awayItem.setEnabled(connected); awayStatusItem.setEnabled(connected); commanderItem.setEnabled(connected); awayItem.setSelected(away); commanderItem.setSelected(commander); } /** Re-lists the saved bookmarks; called after they change (add, remove, manage…). */ void rebuildBookmarks() { bookmarksMenu.removeAll(); for (Bookmark b : bookmarks.all()) { JMenuItem item = new JMenuItem(b.displayName(), Icons.of("SERVER_GREEN")); item.addActionListener(e -> listener.onConnectBookmark(b)); bookmarksMenu.add(item); } if (!bookmarks.all().isEmpty()) bookmarksMenu.addSeparator(); JMenuItem addCurrent = new JMenuItem("Add current server…", Icons.of("BOOKMARK_ADD")); addCurrent.addActionListener(e -> listener.onAddCurrentServerBookmark()); JMenuItem manage = new JMenuItem("Manage bookmarks…", Icons.of("BOOKMARK_MANAGER")); manage.addActionListener(e -> listener.onManageBookmarks()); bookmarksMenu.add(addCurrent); bookmarksMenu.add(manage); } }