Ignore:
Timestamp:
2017-09-14T23:12:25+02:00 (8 years ago)
Author:
donvip
Message:

fix #josm15307 - update to JOSM 12743

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/geochat/src/geochat/ChatPaneManager.java

    r33545 r33602  
    3232 */
    3333class 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             @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     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        }
    268268}
Note: See TracChangeset for help on using the changeset viewer.