Changeset 33602 in osm for applications/editors/josm/plugins/geochat/src/geochat/ChatPaneManager.java
- Timestamp:
- 2017-09-14T23:12:25+02:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/geochat/src/geochat/ChatPaneManager.java
r33545 r33602 32 32 */ 33 33 class ChatPaneManager { 34 private static final String PUBLIC_PANE = "Public Pane";35 36 private GeoChatPanel panel;37 private JTabbedPane tabs;38 private Map<String, ChatPane> chatPanes;39 private boolean collapsed;40 41 ChatPaneManager(GeoChatPanel panel, JTabbedPane tabs) {42 this.panel = panel;43 this.tabs = tabs;44 this.collapsed = panel.isDialogInCollapsedView();45 chatPanes = new HashMap<>();46 createChatPane(null);47 tabs.addChangeListener(new ChangeListener() {48 @Override49 public void stateChanged(ChangeEvent e) {50 updateActiveTabStatus();51 }52 });53 }54 55 public void setCollapsed(boolean collapsed) {56 this.collapsed = collapsed;57 updateActiveTabStatus();58 }59 60 public boolean hasUser(String user) {61 return chatPanes.containsKey(user == null ? PUBLIC_PANE : user);62 }63 64 public Component getPublicChatComponent() {65 return chatPanes.get(PUBLIC_PANE).component;66 }67 68 public int getNotifyLevel() {69 int alarm = 0;70 for (ChatPane entry : chatPanes.values()) {71 if (entry.notify > alarm)72 alarm = entry.notify;73 }74 return alarm;75 }76 77 public void updateActiveTabStatus() {78 if (tabs.getSelectedIndex() >= 0)79 ((ChatTabTitleComponent) tabs.getTabComponentAt(tabs.getSelectedIndex())).updateAlarm();80 }81 82 public void notify(String user, int alarmLevel) {83 if (alarmLevel <= 0 || !hasUser(user))84 return;85 ChatPane entry = chatPanes.get(user == null ? PUBLIC_PANE : user);86 entry.notify = alarmLevel;87 int idx = tabs.indexOfComponent(entry.component);88 if (idx >= 0)89 ((ChatTabTitleComponent) tabs.getTabComponentAt(idx)).updateAlarm();90 }91 92 public static int MESSAGE_TYPE_DEFAULT = 0;93 public static int MESSAGE_TYPE_INFORMATION = 1;94 public static int MESSAGE_TYPE_ATTENTION = 2;95 private static Color COLOR_ATTENTION = new Color(0, 0, 192);96 97 private void addLineToChatPane(String userName, String line, final int messageType) {98 if (line.length() == 0)99 return;100 if (!chatPanes.containsKey(userName))101 createChatPane(userName);102 final String nline = line.startsWith("\n") ? line : "\n" + line;103 final JTextPane thepane = chatPanes.get(userName).pane;104 GuiHelper.runInEDT(new Runnable() {105 @Override106 public void run() {107 Document doc = thepane.getDocument();108 try {109 SimpleAttributeSet attrs = null;110 if (messageType != MESSAGE_TYPE_DEFAULT) {111 attrs = new SimpleAttributeSet();112 if (messageType == MESSAGE_TYPE_INFORMATION)113 StyleConstants.setItalic(attrs, true);114 else if (messageType == MESSAGE_TYPE_ATTENTION)115 StyleConstants.setForeground(attrs, COLOR_ATTENTION);116 }117 doc.insertString(doc.getLength(), nline, attrs);118 } catch (BadLocationException ex) {119 Logging.warn(ex);120 }121 thepane.setCaretPosition(doc.getLength());122 }123 });124 }125 126 public void addLineToChatPane(String userName, String line) {127 addLineToChatPane(userName, line, MESSAGE_TYPE_DEFAULT);128 }129 130 public void addLineToPublic(String line) {131 addLineToChatPane(PUBLIC_PANE, line);132 }133 134 public void addLineToPublic(String line, int messageType) {135 addLineToChatPane(PUBLIC_PANE, line, messageType);136 }137 138 public void clearPublicChatPane() {139 chatPanes.get(PUBLIC_PANE).pane.setText("");140 }141 142 public void clearChatPane(String userName) {143 if (userName == null || userName.equals(PUBLIC_PANE))144 clearPublicChatPane();145 else146 chatPanes.get(userName).pane.setText("");147 }148 149 public void clearActiveChatPane() {150 clearChatPane(getActiveChatPane());151 }152 153 public ChatPane createChatPane(String userName) {154 JTextPane chatPane = new JTextPane();155 chatPane.setEditable(false);156 Font font = chatPane.getFont();157 float size = Main.pref.getInteger("geochat.fontsize", -1);158 if (size < 6)159 size += font.getSize2D();160 chatPane.setFont(font.deriveFont(size));161 // DefaultCaret caret = (DefaultCaret)chatPane.getCaret(); // does not work162 // caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);163 JScrollPane scrollPane = new JScrollPane(chatPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);164 chatPane.addMouseListener(new GeoChatPopupAdapter(panel));165 166 ChatPane entry = new ChatPane();167 entry.pane = chatPane;168 entry.component = scrollPane;169 entry.notify = 0;170 entry.userName = userName;171 entry.isPublic = userName == null;172 chatPanes.put(userName == null ? PUBLIC_PANE : userName, entry);173 174 tabs.addTab(null, scrollPane);175 tabs.setTabComponentAt(tabs.getTabCount() - 1, new ChatTabTitleComponent(entry));176 tabs.setSelectedComponent(scrollPane);177 return entry;178 }179 180 /**181 * Returns key in chatPanes hash map for the currently active182 * chat pane, or null in case of an error.183 */184 public String getActiveChatPane() {185 Component c = tabs.getSelectedComponent();186 if (c == null)187 return null;188 for (String user : chatPanes.keySet()) {189 if (c.equals(chatPanes.get(user).component))190 return user;191 }192 return null;193 }194 195 public String getRecipient() {196 String user = getActiveChatPane();197 return user == null || user.equals(PUBLIC_PANE) ? null : user;198 }199 200 public void closeChatPane(String user) {201 if (user == null || user.equals(PUBLIC_PANE) || !chatPanes.containsKey(user))202 return;203 tabs.remove(chatPanes.get(user).component);204 chatPanes.remove(user);205 }206 207 public void closeSelectedPrivatePane() {208 String pane = getRecipient();209 if (pane != null)210 closeChatPane(pane);211 }212 213 public void closePrivateChatPanes() {214 List<String> entries = new ArrayList<>(chatPanes.keySet());215 for (String user : entries) {216 if (!user.equals(PUBLIC_PANE))217 closeChatPane(user);218 }219 }220 221 public boolean hasSelectedText() {222 String user = getActiveChatPane();223 if (user != null) {224 JTextPane pane = chatPanes.get(user).pane;225 return pane.getSelectedText() != null;226 }227 return false;228 }229 230 public void copySelectedText() {231 String user = getActiveChatPane();232 if (user != null)233 chatPanes.get(user).pane.copy();234 }235 236 private class ChatTabTitleComponent extends JLabel {237 private ChatPane entry;238 239 ChatTabTitleComponent(ChatPane entry) {240 super(entry.isPublic ? tr("Public") : entry.userName);241 this.entry = entry;242 }243 244 private Font normalFont;245 private Font boldFont;246 247 public void updateAlarm() {248 if (normalFont == null) {249 // prepare cached fonts250 normalFont = getFont().deriveFont(Font.PLAIN);251 boldFont = getFont().deriveFont(Font.BOLD);252 }253 if (entry.notify > 0 && !collapsed && tabs.getSelectedIndex() == tabs.indexOfComponent(entry.component))254 entry.notify = 0;255 setFont(entry.notify > 0 ? boldFont : normalFont);256 panel.updateTitleAlarm();257 }258 }259 260 class ChatPane {261 public String userName;262 public boolean isPublic;263 public JTextPane pane;264 public JScrollPane component;265 public int notify;266 267 }34 private static final String PUBLIC_PANE = "Public Pane"; 35 36 private GeoChatPanel panel; 37 private JTabbedPane tabs; 38 private Map<String, ChatPane> chatPanes; 39 private boolean collapsed; 40 41 ChatPaneManager(GeoChatPanel panel, JTabbedPane tabs) { 42 this.panel = panel; 43 this.tabs = tabs; 44 this.collapsed = panel.isDialogInCollapsedView(); 45 chatPanes = new HashMap<>(); 46 createChatPane(null); 47 tabs.addChangeListener(new ChangeListener() { 48 @Override 49 public void stateChanged(ChangeEvent e) { 50 updateActiveTabStatus(); 51 } 52 }); 53 } 54 55 public void setCollapsed(boolean collapsed) { 56 this.collapsed = collapsed; 57 updateActiveTabStatus(); 58 } 59 60 public boolean hasUser(String user) { 61 return chatPanes.containsKey(user == null ? PUBLIC_PANE : user); 62 } 63 64 public Component getPublicChatComponent() { 65 return chatPanes.get(PUBLIC_PANE).component; 66 } 67 68 public int getNotifyLevel() { 69 int alarm = 0; 70 for (ChatPane entry : chatPanes.values()) { 71 if (entry.notify > alarm) 72 alarm = entry.notify; 73 } 74 return alarm; 75 } 76 77 public void updateActiveTabStatus() { 78 if (tabs.getSelectedIndex() >= 0) 79 ((ChatTabTitleComponent) tabs.getTabComponentAt(tabs.getSelectedIndex())).updateAlarm(); 80 } 81 82 public void notify(String user, int alarmLevel) { 83 if (alarmLevel <= 0 || !hasUser(user)) 84 return; 85 ChatPane entry = chatPanes.get(user == null ? PUBLIC_PANE : user); 86 entry.notify = alarmLevel; 87 int idx = tabs.indexOfComponent(entry.component); 88 if (idx >= 0) 89 ((ChatTabTitleComponent) tabs.getTabComponentAt(idx)).updateAlarm(); 90 } 91 92 public static int MESSAGE_TYPE_DEFAULT = 0; 93 public static int MESSAGE_TYPE_INFORMATION = 1; 94 public static int MESSAGE_TYPE_ATTENTION = 2; 95 private static Color COLOR_ATTENTION = new Color(0, 0, 192); 96 97 private void addLineToChatPane(String userName, String line, final int messageType) { 98 if (line.length() == 0) 99 return; 100 if (!chatPanes.containsKey(userName)) 101 createChatPane(userName); 102 final String nline = line.startsWith("\n") ? line : "\n" + line; 103 final JTextPane thepane = chatPanes.get(userName).pane; 104 GuiHelper.runInEDT(new Runnable() { 105 @Override 106 public void run() { 107 Document doc = thepane.getDocument(); 108 try { 109 SimpleAttributeSet attrs = null; 110 if (messageType != MESSAGE_TYPE_DEFAULT) { 111 attrs = new SimpleAttributeSet(); 112 if (messageType == MESSAGE_TYPE_INFORMATION) 113 StyleConstants.setItalic(attrs, true); 114 else if (messageType == MESSAGE_TYPE_ATTENTION) 115 StyleConstants.setForeground(attrs, COLOR_ATTENTION); 116 } 117 doc.insertString(doc.getLength(), nline, attrs); 118 } catch (BadLocationException ex) { 119 Logging.warn(ex); 120 } 121 thepane.setCaretPosition(doc.getLength()); 122 } 123 }); 124 } 125 126 public void addLineToChatPane(String userName, String line) { 127 addLineToChatPane(userName, line, MESSAGE_TYPE_DEFAULT); 128 } 129 130 public void addLineToPublic(String line) { 131 addLineToChatPane(PUBLIC_PANE, line); 132 } 133 134 public void addLineToPublic(String line, int messageType) { 135 addLineToChatPane(PUBLIC_PANE, line, messageType); 136 } 137 138 public void clearPublicChatPane() { 139 chatPanes.get(PUBLIC_PANE).pane.setText(""); 140 } 141 142 public void clearChatPane(String userName) { 143 if (userName == null || userName.equals(PUBLIC_PANE)) 144 clearPublicChatPane(); 145 else 146 chatPanes.get(userName).pane.setText(""); 147 } 148 149 public void clearActiveChatPane() { 150 clearChatPane(getActiveChatPane()); 151 } 152 153 public ChatPane createChatPane(String userName) { 154 JTextPane chatPane = new JTextPane(); 155 chatPane.setEditable(false); 156 Font font = chatPane.getFont(); 157 float size = Main.pref.getInteger("geochat.fontsize", -1); 158 if (size < 6) 159 size += font.getSize2D(); 160 chatPane.setFont(font.deriveFont(size)); 161 // DefaultCaret caret = (DefaultCaret)chatPane.getCaret(); // does not work 162 // caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); 163 JScrollPane scrollPane = new JScrollPane(chatPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 164 chatPane.addMouseListener(new GeoChatPopupAdapter(panel)); 165 166 ChatPane entry = new ChatPane(); 167 entry.pane = chatPane; 168 entry.component = scrollPane; 169 entry.notify = 0; 170 entry.userName = userName; 171 entry.isPublic = userName == null; 172 chatPanes.put(userName == null ? PUBLIC_PANE : userName, entry); 173 174 tabs.addTab(null, scrollPane); 175 tabs.setTabComponentAt(tabs.getTabCount() - 1, new ChatTabTitleComponent(entry)); 176 tabs.setSelectedComponent(scrollPane); 177 return entry; 178 } 179 180 /** 181 * Returns key in chatPanes hash map for the currently active 182 * chat pane, or null in case of an error. 183 */ 184 public String getActiveChatPane() { 185 Component c = tabs.getSelectedComponent(); 186 if (c == null) 187 return null; 188 for (String user : chatPanes.keySet()) { 189 if (c.equals(chatPanes.get(user).component)) 190 return user; 191 } 192 return null; 193 } 194 195 public String getRecipient() { 196 String user = getActiveChatPane(); 197 return user == null || user.equals(PUBLIC_PANE) ? null : user; 198 } 199 200 public void closeChatPane(String user) { 201 if (user == null || user.equals(PUBLIC_PANE) || !chatPanes.containsKey(user)) 202 return; 203 tabs.remove(chatPanes.get(user).component); 204 chatPanes.remove(user); 205 } 206 207 public void closeSelectedPrivatePane() { 208 String pane = getRecipient(); 209 if (pane != null) 210 closeChatPane(pane); 211 } 212 213 public void closePrivateChatPanes() { 214 List<String> entries = new ArrayList<>(chatPanes.keySet()); 215 for (String user : entries) { 216 if (!user.equals(PUBLIC_PANE)) 217 closeChatPane(user); 218 } 219 } 220 221 public boolean hasSelectedText() { 222 String user = getActiveChatPane(); 223 if (user != null) { 224 JTextPane pane = chatPanes.get(user).pane; 225 return pane.getSelectedText() != null; 226 } 227 return false; 228 } 229 230 public void copySelectedText() { 231 String user = getActiveChatPane(); 232 if (user != null) 233 chatPanes.get(user).pane.copy(); 234 } 235 236 private class ChatTabTitleComponent extends JLabel { 237 private ChatPane entry; 238 239 ChatTabTitleComponent(ChatPane entry) { 240 super(entry.isPublic ? tr("Public") : entry.userName); 241 this.entry = entry; 242 } 243 244 private Font normalFont; 245 private Font boldFont; 246 247 public void updateAlarm() { 248 if (normalFont == null) { 249 // prepare cached fonts 250 normalFont = getFont().deriveFont(Font.PLAIN); 251 boldFont = getFont().deriveFont(Font.BOLD); 252 } 253 if (entry.notify > 0 && !collapsed && tabs.getSelectedIndex() == tabs.indexOfComponent(entry.component)) 254 entry.notify = 0; 255 setFont(entry.notify > 0 ? boldFont : normalFont); 256 panel.updateTitleAlarm(); 257 } 258 } 259 260 static class ChatPane { 261 public String userName; 262 public boolean isPublic; 263 public JTextPane pane; 264 public JScrollPane component; 265 public int notify; 266 267 } 268 268 }
Note:
See TracChangeset
for help on using the changeset viewer.
