Changeset 33602 in osm for applications/editors/josm/plugins/geochat/src/geochat/ChatPaneManager.java
- Timestamp:
- 2017-09-14T23:12:25+02:00 (8 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 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.