diff --git a/src/chatty/gui/Channels.java b/src/chatty/gui/Channels.java index 911e17917..e62ad6438 100644 --- a/src/chatty/gui/Channels.java +++ b/src/chatty/gui/Channels.java @@ -199,6 +199,7 @@ private void addDefaultChannel() { */ private Channel createChannel(Room room, Channel.Type type) { Channel channel = new Channel(room,type,gui,styleManager, contextMenuListener); + channel.init(); channel.setUserlistWidth(defaultUserlistWidth, minUserlistWidth); channel.setMouseClickedListener(mouseClickedListener); channel.setScrollbarAlways(chatScrollbarAlaways); diff --git a/src/chatty/gui/MainGui.java b/src/chatty/gui/MainGui.java index 677a811f6..62a7004fd 100644 --- a/src/chatty/gui/MainGui.java +++ b/src/chatty/gui/MainGui.java @@ -1183,11 +1183,13 @@ private void updateConnectionDialog(String channelPreset) { connectionDialog.setAreChannelsOpen(channels.getChannelCount() > 0); } + private void setChannelInfoDialogChannel(Channel channel) { + channelInfoDialog.set(getStreamInfo(channel.getStreamName())); + } + private void updateChannelInfoDialog(StreamInfo info) { if (info == null) { - String stream = channels.getLastActiveChannel().getStreamName(); - info = getStreamInfo(stream); - channelInfoDialog.set(info); + setChannelInfoDialogChannel(channels.getLastActiveChannel()); } else { channelInfoDialog.update(info); } @@ -1682,25 +1684,19 @@ else if (cmd.equals("join")) { * Context menu event without any channel context, which means it just * uses the active one or performs some other action that doesn't * immediately require one. - * - * @param e */ @Override public void menuItemClicked(ActionEvent e) { + Debugging.println("cmchan", "[cm] tab: %s chan: %s lastchan: %s", + channels.getActiveTab(), channels.getActiveChannel(), channels.getLastActiveChannel()); + String cmd = e.getActionCommand(); - if (cmd.equals("channelInfo")) { - openChannelInfoDialog(); - } - else if (cmd.equals("channelAdmin")) { - openChannelAdminDialog(); - } - else if (cmd.equals("chatRules")) { - openChatRules(); - } - else if (cmd.equals("closeChannel")) { + if (cmd.equals("closeChannel")) { + // TabContextMenu client.closeChannel(channels.getActiveChannel().getChannel()); } else if (cmd.startsWith("closeAllTabs")) { + // TabContextMenu Collection chans = null; if (cmd.equals("closeAllTabsButCurrent")) { chans = channels.getTabsRelativeToCurrent(0); @@ -1717,33 +1713,62 @@ else if (cmd.startsWith("closeAllTabs")) { } } } - else if (cmd.equals("joinHostedChannel")) { - client.command(channels.getActiveChannel().getRoom(), "joinhosted"); - } - else if (cmd.equals("srcOpen")) { - client.speedruncom.openCurrentGame(channels.getActiveChannel()); - } else if (cmd.equals("popoutChannel")) { + // TabContextMenu channels.popoutActiveChannel(); } - else if (cmd.startsWith("command")) { - // TODO: Check getStreamName() - customCommand(channels.getActiveChannel().getRoom(), e, - Parameters.create(channels.getActiveChannel().getStreamName())); - } else if (cmd.startsWith("historyRange")) { int range = Integer.parseInt(cmd.substring("historyRange".length())); // Change here as well, because even if it's the same value, // update may be needed. This will make it update twice often. //updateHistoryRange(); client.settings.setLong("historyRange", range); - } else if (cmd.startsWith("toggleVerticalZoom")) { - boolean selected = ((JMenuItem)e.getSource()).isSelected(); + } + else if (cmd.startsWith("toggleVerticalZoom")) { + boolean selected = ((JMenuItem) e.getSource()).isSelected(); client.settings.setBoolean("historyVerticalZoom", selected); - } else { + } + else { nameBasedStuff(e, channels.getActiveChannel().getStreamName()); } } + + /** + * ChannelContextMenu, with Channel context. + */ + @Override + public void channelMenuItemClicked(ActionEvent e, Channel channel) { + Debugging.println("cmchan", "[channelcm] tab: %s chan: %s lastchan: %s", + channels.getActiveTab(), channels.getActiveChannel(), channels.getLastActiveChannel()); + + String cmd = e.getActionCommand(); + if (cmd.equals("channelInfo")) { + setChannelInfoDialogChannel(channel); + openChannelInfoDialog(); + } + else if (cmd.equals("channelAdmin")) { + openChannelAdminDialog(channel.getStreamName()); + } + else if (cmd.equals("chatRules")) { + openChatRules(channel.getChannel()); + } + else if (cmd.equals("closeChannel")) { + client.closeChannel(channel.getChannel()); + } + else if (cmd.equals("joinHostedChannel")) { + client.command(channel.getRoom(), "joinhosted"); + } + else if (cmd.equals("srcOpen")) { + client.speedruncom.openCurrentGame(channel); + } + else if (cmd.startsWith("command")) { + customCommand(channel.getRoom(), e, + Parameters.create(channel.getStreamName())); + } + else { + nameBasedStuff(e, channel.getStreamName()); + } + } @Override public void streamsMenuItemClicked(ActionEvent e, Collection streams) { @@ -1752,10 +1777,8 @@ public void streamsMenuItemClicked(ActionEvent e, Collection streams) { } /** - * Context menu event associated with a list of stream or channel names. - * - * @param e - * @param streams + * Context menu event associated with a list of stream or channel names, + * used in the channel favorites dialog. */ @Override public void roomsMenuItemClicked(ActionEvent e, Collection rooms) { @@ -1955,6 +1978,12 @@ private void streamStuff(ActionEvent e, Collection streams) { } else if (cmd.equals("copy") && !streams.isEmpty()) { MiscUtil.copyToClipboard(StringUtil.join(streams, ", ")); } else if (cmd.startsWith("command")) { + /** + * For example for Live Streams/Favorites context menu, so it + * makes sense to use the last active channel, since this might + * be triggered from a Chatty window that doesn't represent a + * single joined room. + */ customCommand(channels.getLastActiveChannel().getRoom(), e, Parameters.create(StringUtil.join(streams, " "))); } } @@ -2360,9 +2389,12 @@ private boolean closeDialog(JDialog dialog) { } private void openChannelAdminDialog() { + openChannelAdminDialog(channels.getActiveChannel().getStreamName()); + } + + private void openChannelAdminDialog(String stream) { windowStateManager.setWindowPosition(adminDialog, getActiveWindow()); updateTokenScopes(); - String stream = channels.getActiveChannel().getStreamName(); if (stream == null) { stream = client.settings.getString("username"); } diff --git a/src/chatty/gui/components/Channel.java b/src/chatty/gui/components/Channel.java index 8cbb9a7ab..0c8c6f9e4 100644 --- a/src/chatty/gui/components/Channel.java +++ b/src/chatty/gui/components/Channel.java @@ -35,7 +35,7 @@ * * @author tduva */ -public class Channel extends JPanel { +public final class Channel extends JPanel { public enum Type { NONE, CHANNEL, WHISPER, SPECIAL @@ -72,7 +72,6 @@ public Channel(final Room room, Type type, MainGui main, StyleManager styleManag text = new ChannelTextPane(main,styleManager); text.setContextMenuListener(contextMenuListener); - setTextPreferredSizeTemporarily(); west = new JScrollPane(text); @@ -113,7 +112,11 @@ public Channel(final Room room, Type type, MainGui main, StyleManager styleManag // Add components add(mainPane, BorderLayout.CENTER); add(input, BorderLayout.SOUTH); - + } + + public void init() { + text.setChannel(this); + input.requestFocusInWindow(); setStyles(); diff --git a/src/chatty/gui/components/FollowersDialog.java b/src/chatty/gui/components/FollowersDialog.java index 11914abdc..57b8677fb 100644 --- a/src/chatty/gui/components/FollowersDialog.java +++ b/src/chatty/gui/components/FollowersDialog.java @@ -6,7 +6,6 @@ import chatty.gui.GuiUtil; import chatty.gui.components.menus.ContextMenu; import chatty.gui.components.menus.ContextMenuListener; -import chatty.gui.components.menus.RoomsContextMenu; import chatty.gui.components.menus.StreamsContextMenu; import chatty.gui.components.settings.ListTableModel; import chatty.util.DateTime; diff --git a/src/chatty/gui/components/HighlightedMessages.java b/src/chatty/gui/components/HighlightedMessages.java index 1d4738ab1..4c15b1197 100644 --- a/src/chatty/gui/components/HighlightedMessages.java +++ b/src/chatty/gui/components/HighlightedMessages.java @@ -214,6 +214,11 @@ public void usericonMenuItemClicked(ActionEvent e, Usericon usericon) { public void roomsMenuItemClicked(ActionEvent e, Collection rooms) { contextMenuListener.roomsMenuItemClicked(e, rooms); } + + @Override + public void channelMenuItemClicked(ActionEvent e, Channel channel) { + contextMenuListener.channelMenuItemClicked(e, channel); + } } /** diff --git a/src/chatty/gui/components/StreamChat.java b/src/chatty/gui/components/StreamChat.java index 7b6fb32ea..4ca07d9e0 100644 --- a/src/chatty/gui/components/StreamChat.java +++ b/src/chatty/gui/components/StreamChat.java @@ -132,6 +132,11 @@ public void usericonMenuItemClicked(ActionEvent e, Usericon usericon) { public void roomsMenuItemClicked(ActionEvent e, Collection rooms) { contextMenuListener.roomsMenuItemClicked(e, rooms); } + + @Override + public void channelMenuItemClicked(ActionEvent e, Channel channel) { + contextMenuListener.channelMenuItemClicked(e, channel); + } } } diff --git a/src/chatty/gui/components/menus/ChannelContextMenu.java b/src/chatty/gui/components/menus/ChannelContextMenu.java index a5b0b1952..a8c4eb24c 100644 --- a/src/chatty/gui/components/menus/ChannelContextMenu.java +++ b/src/chatty/gui/components/menus/ChannelContextMenu.java @@ -1,6 +1,7 @@ package chatty.gui.components.menus; +import chatty.gui.components.Channel; import chatty.lang.Language; import java.awt.event.ActionEvent; @@ -16,8 +17,11 @@ public class ChannelContextMenu extends ContextMenu { private final ContextMenuListener listener; - public ChannelContextMenu(ContextMenuListener listener) { + private final Channel channel; + + public ChannelContextMenu(ContextMenuListener listener, Channel channel) { this.listener = listener; + this.channel = channel; addItem("channelInfo", Language.getString("menubar.dialog.channelInfo")); addItem("channelAdmin", Language.getString("menubar.dialog.channelAdmin")); @@ -46,7 +50,7 @@ public ChannelContextMenu(ContextMenuListener listener) { @Override public void actionPerformed(ActionEvent e) { if (listener != null) { - listener.menuItemClicked(e); + listener.channelMenuItemClicked(e, channel); } } diff --git a/src/chatty/gui/components/menus/ContextMenuAdapter.java b/src/chatty/gui/components/menus/ContextMenuAdapter.java index 0f14d7905..cb005a81c 100644 --- a/src/chatty/gui/components/menus/ContextMenuAdapter.java +++ b/src/chatty/gui/components/menus/ContextMenuAdapter.java @@ -3,13 +3,12 @@ import chatty.Room; import chatty.User; -import chatty.util.api.Emoticon; +import chatty.gui.components.Channel; import chatty.util.api.Emoticon.EmoticonImage; import chatty.util.api.StreamInfo; import chatty.util.api.usericons.Usericon; import java.awt.event.ActionEvent; import java.util.Collection; -import java.util.List; /** * @@ -53,5 +52,9 @@ public void usericonMenuItemClicked(ActionEvent e, Usericon usericon) { @Override public void roomsMenuItemClicked(ActionEvent e, Collection rooms) { } + + @Override + public void channelMenuItemClicked(ActionEvent e, Channel channel) { + } } diff --git a/src/chatty/gui/components/menus/ContextMenuListener.java b/src/chatty/gui/components/menus/ContextMenuListener.java index 1ea71a9c9..0428282e4 100644 --- a/src/chatty/gui/components/menus/ContextMenuListener.java +++ b/src/chatty/gui/components/menus/ContextMenuListener.java @@ -3,6 +3,7 @@ import chatty.Room; import chatty.User; +import chatty.gui.components.Channel; import chatty.util.api.Emoticon.EmoticonImage; import chatty.util.api.StreamInfo; import chatty.util.api.usericons.Usericon; @@ -18,6 +19,7 @@ public interface ContextMenuListener { public void urlMenuItemClicked(ActionEvent e, String url); public void menuItemClicked(ActionEvent e); public void roomsMenuItemClicked(ActionEvent e, Collection rooms); + public void channelMenuItemClicked(ActionEvent e, Channel channel); public void streamsMenuItemClicked(ActionEvent e, Collection streams); public void streamInfosMenuItemClicked(ActionEvent e, Collection streamInfos); public void emoteMenuItemClicked(ActionEvent e, EmoticonImage emote); diff --git a/src/chatty/gui/components/textpane/ChannelTextPane.java b/src/chatty/gui/components/textpane/ChannelTextPane.java index cc18e2400..344be7502 100644 --- a/src/chatty/gui/components/textpane/ChannelTextPane.java +++ b/src/chatty/gui/components/textpane/ChannelTextPane.java @@ -14,6 +14,7 @@ import chatty.gui.MainGui; import chatty.User; import chatty.gui.Highlighter.Match; +import chatty.gui.components.Channel; import chatty.util.api.usericons.Usericon; import chatty.gui.components.menus.ContextMenuListener; import chatty.gui.emoji.EmojiUtil; @@ -113,6 +114,7 @@ public class ChannelTextPane extends JTextPane implements LinkListener, Emoticon private static final Matcher urlMatcher = Helper.getUrlPattern().matcher(""); public MainGui main; + private Channel channel; protected LinkController linkController = new LinkController(); private static StyleServer styleServer; @@ -245,6 +247,11 @@ public void setMouseClickedListener(MouseClickedListener listener) { linkController.setMouseClickedListener(listener); } + public void setChannel(Channel channel) { + this.channel = channel; + linkController.setChannel(channel); + } + private void setHoveredUser(User user) { int mode = styles.getInt(Setting.HIGHLIGHT_HOVERED_USER); if (mode == SettingConstants.USER_HOVER_HL_OFF) { diff --git a/src/chatty/gui/components/textpane/LinkController.java b/src/chatty/gui/components/textpane/LinkController.java index 3635eed23..2df05bc78 100644 --- a/src/chatty/gui/components/textpane/LinkController.java +++ b/src/chatty/gui/components/textpane/LinkController.java @@ -6,6 +6,7 @@ import chatty.gui.LinkListener; import chatty.gui.MouseClickedListener; import chatty.gui.UserListener; +import chatty.gui.components.Channel; import chatty.gui.components.menus.ChannelContextMenu; import chatty.gui.components.menus.ContextMenu; import chatty.gui.components.menus.ContextMenuListener; @@ -82,6 +83,8 @@ public class LinkController extends MouseAdapter { private ContextMenu defaultContextMenu; + private Channel channel; + private MyPopup popup = new MyPopup(); private Element prevHoverElement; @@ -140,6 +143,10 @@ public void setDefaultContextMenu(ContextMenu contextMenu) { defaultContextMenu = contextMenu; contextMenu.addContextMenuListener(contextMenuListener); } + + public void setChannel(Channel channel) { + this.channel = channel; + } /** * Handles mouse presses. This is favourable to mouseClicked because it @@ -373,7 +380,7 @@ private void openContextMenu(MouseEvent e) { String url = getUrl(element); EmoticonImage emoteImage = getEmoticonImage(element); Usericon usericon = getUsericon(element); - JPopupMenu m; + JPopupMenu m = null; if (user != null) { m = new UserContextMenu(user, getMsgId(element), getAutoModMsgId(element), contextMenuListener); @@ -389,12 +396,16 @@ else if (usericon != null) { } else { if (defaultContextMenu == null) { - m = new ChannelContextMenu(contextMenuListener); + if (channel != null) { + m = new ChannelContextMenu(contextMenuListener, channel); + } } else { m = defaultContextMenu; } } - m.show(e.getComponent(), e.getX(), e.getY()); + if (m != null) { + m.show(e.getComponent(), e.getX(), e.getY()); + } popup.hide(); }