diff --git a/src/java/org/jivesoftware/spark/ui/conferences/GroupChatParticipantList.java b/src/java/org/jivesoftware/spark/ui/conferences/GroupChatParticipantList.java index 1d511f71..21d9cd79 100644 --- a/src/java/org/jivesoftware/spark/ui/conferences/GroupChatParticipantList.java +++ b/src/java/org/jivesoftware/spark/ui/conferences/GroupChatParticipantList.java @@ -47,6 +47,8 @@ import org.jivesoftware.spark.ui.rooms.ChatRoomImpl; import org.jivesoftware.spark.ui.rooms.GroupChatRoom; import org.jivesoftware.spark.util.ModelUtil; import org.jivesoftware.spark.util.log.Log; +import org.jivesoftware.sparkimpl.settings.local.LocalPreferences; +import org.jivesoftware.sparkimpl.settings.local.SettingsManager; import java.awt.Color; import java.awt.Component; @@ -95,6 +97,7 @@ public final class GroupChatParticipantList extends JPanel implements private final ImageTitlePanel agentInfoPanel; private ChatManager chatManager; private MultiUserChat chat; + private LocalPreferences _localPreferences = SettingsManager.getLocalPreferences(); private final Map userMap = new HashMap(); @@ -332,45 +335,77 @@ public final class GroupChatParticipantList extends JPanel implements return icon; } - private void addParticipant(String participantJID, Presence presence) { - // Remove reference to invitees - for (String displayName : invitees.keySet()) { - String jid = SparkManager.getUserManager().getJIDFromDisplayName( - displayName); + private void addParticipant(String participantJID, Presence presence) { + // Remove reference to invitees + for (String displayName : invitees.keySet()) { + String jid = SparkManager.getUserManager().getJIDFromDisplayName( + displayName); - Occupant occ = chat.getOccupant(participantJID); - if (occ != null) { - String actualJID = occ.getJid(); - if (actualJID.equals(jid)) { - removeUser(displayName); - } - } + Occupant occ = chat.getOccupant(participantJID); + if (occ != null) { + String actualJID = occ.getJid(); + if (actualJID.equals(jid)) { + removeUser(displayName); } + } + } - String nickname = StringUtils.parseResource(participantJID); + String nickname = StringUtils.parseResource(participantJID); + String userRole = chat.getOccupant(participantJID).getRole(); + + Icon icon = null; + if (_localPreferences.isShowingRoleIcons()) { + icon = getIconForRole(userRole); + } else { + icon = PresenceManager.getIconFromPresence(presence); + if (icon == null) { + icon = SparkRes.getImageIcon(SparkRes.GREEN_BALL); + } + } - if (!exists(nickname)) { - Icon icon; + if (!exists(nickname)) { + addUser(icon, nickname); + } else { + int index = getIndex(nickname); + if (index != -1) { + final JLabel userLabel = new JLabel(nickname, icon, + JLabel.HORIZONTAL); + model.setElementAt(userLabel, index); + } + } + } + + /** + * Returns corresponding Icons for each MUC-Role + * icons are:

+ * Moderator=Yellow

+ * Participant=Green

+ * Visitor=Blue

+ * N/A=Grey

+ * @param role + * @return {@link Icon} + */ + private Icon getIconForRole(String role) + { + Icon icon =null; - icon = PresenceManager.getIconFromPresence(presence); - if (icon == null) { - icon = SparkRes.getImageIcon(SparkRes.GREEN_BALL); - } - - addUser(icon, nickname); - } else { - Icon icon = PresenceManager.getIconFromPresence(presence); - if (icon == null) { - icon = SparkRes.getImageIcon(SparkRes.GREEN_BALL); - } - - int index = getIndex(nickname); - if (index != -1) { - final JLabel userLabel = new JLabel(nickname, icon, - JLabel.HORIZONTAL); - model.setElementAt(userLabel, index); - } + if (role.equalsIgnoreCase("participant")) + { + icon = SparkRes.getImageIcon(SparkRes.STAR_GREEN_IMAGE); } + else if(role.equalsIgnoreCase("moderator")) + { + icon = SparkRes.getImageIcon(SparkRes.STAR_YELLOW_IMAGE); + } + else if(role.equalsIgnoreCase("visitor")) + { + icon = SparkRes.getImageIcon(SparkRes.STAR_BLUE_IMAGE); + } + else + { + icon = SparkRes.getImageIcon(SparkRes.STAR_GREY_IMAGE); + } + return icon; } public void userHasLeft(ChatRoom room, String userid) { @@ -716,6 +751,7 @@ public final class GroupChatParticipantList extends JPanel implements } else { grantVoice(selectedUser); } + Collections.sort(users, labelComp); } }; @@ -757,6 +793,8 @@ public final class GroupChatParticipantList extends JPanel implements } else { revokeModerator(selectedUser); } + Collections.sort(users, labelComp); + } }; @@ -897,15 +935,51 @@ public final class GroupChatParticipantList extends JPanel implements } } - /** - * Sorts ContactItems. - */ - final Comparator labelComp = new Comparator() { - public int compare(JLabel item1, JLabel item2) { - return item1.getText().toLowerCase().compareTo( - item2.getText().toLowerCase()); - } - }; + /** + * Sorts ContactItems. + */ + final Comparator labelComp = new Comparator() { + + public int compare(JLabel item1, JLabel item2) { + if (_localPreferences.isShowingRoleIcons()) { + return compareWithRole(item1, item2); + } else { + return compareWithoutRole(item1.getText(), item2.getText()); + } + + } + + private int compareWithoutRole(String s1, String s2) { + return (s1.toLowerCase().compareTo(s2.toLowerCase()) * -1); + } + + private int compareWithRole(JLabel item1, JLabel item2) { + + char user1 = 'p'; + char user2 = 'p'; + + // append Room-JID to UserLabel + String jid1 = chat.getRoom() + "/" + item1.getText(); + String jid2 = chat.getRoom() + "/" + item2.getText(); + + user1 = chat.getOccupant(jid1).getRole().charAt(0); + user2 = chat.getOccupant(jid2).getRole().charAt(0); + + int result = 0; + if (user1 == user2) { + + result = compareWithoutRole(item1.getText(), item2.getText()); + + } else { + // m < p < v + if (user1 < user2) + result = -1; + if (user1 > user2) + result = 1; + } + return result; + } + }; /** * The JLabelIconRenderer is the an implementation of diff --git a/src/java/org/jivesoftware/sparkimpl/preference/groupchat/GroupChatPreference.java b/src/java/org/jivesoftware/sparkimpl/preference/groupchat/GroupChatPreference.java index f3d6c49e..be780ff1 100644 --- a/src/java/org/jivesoftware/sparkimpl/preference/groupchat/GroupChatPreference.java +++ b/src/java/org/jivesoftware/sparkimpl/preference/groupchat/GroupChatPreference.java @@ -73,11 +73,13 @@ public class GroupChatPreference implements Preference { boolean highlightMyText = localPreferences.isMucHighTextEnabled(); boolean highlightPopName = localPreferences.isMucHighToastEnabled(); boolean showjoinleavemessage = localPreferences.isShowJoinLeaveMessagesEnabled(); + boolean showroleicons = localPreferences.isShowingRoleIcons(); panel.setMucHighNameEnabled(highlightMyName); panel.setMucHighTextEnabled(highlightMyText); panel.setMuchHighToastEnabled(highlightPopName); panel.setShowJoinLeaveMessagesEnabled(showjoinleavemessage); + panel.setShowRoleIconInsteadStatusIcon(showroleicons); } }; @@ -92,6 +94,7 @@ public class GroupChatPreference implements Preference { pref.setMucHighTextEnabled(panel.isMucHighTextEnabled()); pref.setMuchHighToastEnabled(panel.isMucHighToastEnabled()); pref.setShowJoinLeaveMessagesEnabled(panel.isShowJoinLeaveMessagesEnabled()); + pref.setShowRoleIconInsteadStatusIcon(panel.isShowingRoleIcons()); SettingsManager.saveSettings(); } diff --git a/src/java/org/jivesoftware/sparkimpl/preference/groupchat/GroupChatPreferencePanel.java b/src/java/org/jivesoftware/sparkimpl/preference/groupchat/GroupChatPreferencePanel.java index 1c4578c5..e11f79b5 100644 --- a/src/java/org/jivesoftware/sparkimpl/preference/groupchat/GroupChatPreferencePanel.java +++ b/src/java/org/jivesoftware/sparkimpl/preference/groupchat/GroupChatPreferencePanel.java @@ -42,6 +42,7 @@ public class GroupChatPreferencePanel extends JPanel { private JCheckBox highlightMyText = new JCheckBox(); private JCheckBox highlightPopName = new JCheckBox(); private JCheckBox showjoinleavemessage = new JCheckBox(); + private JCheckBox showroleicons = new JCheckBox(); private JPanel gCPanel = new JPanel(); /** @@ -59,7 +60,8 @@ public class GroupChatPreferencePanel extends JPanel { ResourceUtils.resButton(highlightMyText , Res.getString("menuitem.add.groupchat.mytext")); ResourceUtils.resButton(highlightPopName , Res.getString("menuitem.add.groupchat.popname")); ResourceUtils.resButton(showjoinleavemessage , Res.getString("menuitem.add.groupchat.showjoinleavemessage")); - + ResourceUtils.resButton(showroleicons , Res.getString("menuitem.add.groupchat.showrolesinsteadofstatus")); + gCPanel.setBorder(BorderFactory.createTitledBorder(Res.getString("title.group.chat.settings"))); add(gCPanel); @@ -70,6 +72,7 @@ public class GroupChatPreferencePanel extends JPanel { gCPanel.add(highlightMyText , new GridBagConstraints(0, 1, 2, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); gCPanel.add(highlightPopName , new GridBagConstraints(0, 2, 2, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); gCPanel.add(showjoinleavemessage, new GridBagConstraints(0, 3, 2, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + gCPanel.add(showroleicons , new GridBagConstraints(0, 4, 2, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); } public void setMucHighNameEnabled(boolean mucNHigh) { @@ -88,6 +91,10 @@ public class GroupChatPreferencePanel extends JPanel { showjoinleavemessage.setSelected(mucPHigh); } + public void setShowRoleIconInsteadStatusIcon(boolean roleicons){ + showroleicons.setSelected(roleicons); + } + public boolean isShowJoinLeaveMessagesEnabled() { return showjoinleavemessage.isSelected(); } @@ -103,5 +110,10 @@ public class GroupChatPreferencePanel extends JPanel { public boolean isMucHighToastEnabled() { return highlightPopName.isSelected(); } + + public boolean isShowingRoleIcons() { + return showroleicons.isSelected(); + } + } diff --git a/src/java/org/jivesoftware/sparkimpl/settings/local/LocalPreferences.java b/src/java/org/jivesoftware/sparkimpl/settings/local/LocalPreferences.java index ff0b0cdc..96902479 100644 --- a/src/java/org/jivesoftware/sparkimpl/settings/local/LocalPreferences.java +++ b/src/java/org/jivesoftware/sparkimpl/settings/local/LocalPreferences.java @@ -661,6 +661,10 @@ public class LocalPreferences { return getBoolean("isMucHighToastOn", false); } + public boolean isShowingRoleIcons() { + return getBoolean("isShowingRoleIcons",false); + } + public boolean isShowJoinLeaveMessagesEnabled() { return getBoolean("isShowJoinLeaveMessagesOn", true); } @@ -680,6 +684,10 @@ public class LocalPreferences { public void setMuchHighToastEnabled(boolean setMucPHigh) { setBoolean("isMucHighToastOn", setMucPHigh); } + + public void setShowRoleIconInsteadStatusIcon(boolean roleicons){ + setBoolean("isShowingRoleIcons",roleicons); + } public void setSSOEnabled(boolean enabled) { setBoolean("ssoEnabled", enabled); diff --git a/src/resources/i18n/spark_i18n.properties b/src/resources/i18n/spark_i18n.properties index 1ae52b8e..f087d2e2 100644 --- a/src/resources/i18n/spark_i18n.properties +++ b/src/resources/i18n/spark_i18n.properties @@ -217,6 +217,7 @@ ## Added key: 'message.nickname.not.acceptable' ## Added key: 'button.login' ## Added key: 'administrator' +## Added key: 'menuitem.add.groupchat.showrolesinsteadofstatus' accept = Accept active = Active @@ -488,6 +489,7 @@ menuitem.add.groupchat.myname = Highlight my &name when someone says it menuitem.add.groupchat.mytext = &Highlight my text when I say something menuitem.add.groupchat.popname= Show &toast popup when someone says my name menuitem.add.groupchat.showjoinleavemessage = &Show join and leave messages +menuitem.add.groupchat.showrolesinsteadofstatus = Show chatroleicons instead of statusicons menuitem.always.on.top = Always on top menuitem.alert.when.online = Alert when user is available menuitem.ban = Ban diff --git a/src/resources/i18n/spark_i18n_de.properties b/src/resources/i18n/spark_i18n_de.properties index ecf4c7ce..302cbb85 100644 --- a/src/resources/i18n/spark_i18n_de.properties +++ b/src/resources/i18n/spark_i18n_de.properties @@ -115,6 +115,14 @@ ## Added key: 'title.group.chat.settings' ## Added key: 'menuitem.view.logs' ## Added key: 'title.appearance.preferences' +## 2.6.0 beta 1 +## Added key: 'menuitem.block.contact' +## Added key: 'menuitem.unblock.contact' +## Removed key: 'status.available' +## Added key: 'message.nickname.not.acceptable' +## Added key: 'button.login' +## Added key: 'administrator' +## Added key: 'menuitem.add.groupchat.showrolesinsteadofstatus' @@ -122,6 +130,7 @@ ok = Ok apply = Übernehmen +administrator = Administrator cancel = Abbrechen add = Hinzufügen use.default = Voreinstellungen laden @@ -177,6 +186,8 @@ button.update = &Update button.cancel = &Abbrechen button.decline = &Ablehnen button.join = &Beitreten +button.join.room = Ausgewähltem Raum beitreten +button.login = &Login button.save.for.future.use = &Speichern für die spätere Verwendung button.register = &Registrierung button.dial.number = &Nummer wählen @@ -215,6 +226,7 @@ checkbox.start.in.tray = Spark automatisch in der &Taskleiste starten checkbox.split.chat.window = &Fenster 'andocken' (benötigt Neustart von Spark) checkbox.tabs.on.top = &Chat tabs oben anzeigen (benötigt Neustart von Spark) checkbox.allow.buzz = "&Buzzer" Funktion aktivieren. +checkbox.tabs.externalize = Neue Chat Tabs öffnen in seperaten Fenstern checkbox.enable.emoticons = &Emoticons aktivieren checkbox.use.system.look.and.feel = System Look And &Feel verwenden (benötigt Neustart von Spark) checkbox.notify.user.comes.online = &Benachrichtigen, wenn ein User Online kommt @@ -357,6 +369,8 @@ message.close.other.chats = Alle anderen Chats schlie message.close.stale.chats = Inaktive Chats schließen message.last.message.received = Letzte Nachricht empfangen um {0} message.shared.group = Gemeinsame Gruppen +message.internalize.tab = Chatroom wieder in Tabliste einbinden +message.externalize.tab = Chatroom in externes Fenster auslagern message.is.shared.group = {0} ist eine gemeinsame Gruppe. message.delete.confirmation = {0} - Wirklich löschen? message.idle.for = Inaktiv seit {0} @@ -386,6 +400,7 @@ message.you.have.been.kicked = Sie wurden aus dem Raum ausgeladen. message.kicked.error = Sie haben nicht das Recht {0} aus dem Raum auszuladen. message.you.have.been.banned = Der Zugriff auf diesem Raum wurde Ihnen entzogen. message.nickname.in.use = Ausgewählter Name ist bereits in Benutzung. Bitte einen anderen Namen wählen. +message.nickname.not.acceptable = Das ändern von Spitzname ist nicht erlaubt! message.update.room.list = Aktualisiere Raumliste message.join.conference.room = Konferenz beitreten message.select.add.room.to.add = Bitte einen Raum wählen um ihn der Service-Liste hinzuzufügen. @@ -691,6 +706,8 @@ menuitem.remove = Entfernen menuitem.change.nickname = Angezeigten Namen ändern menuitem.block.user = Teilnehmer blockieren menuitem.unblock.user = Blockierung eines Teilnehmers aufheben +menuitem.block.contact = Kontakt blockieren +menuitem.unblock.contact = Blockierung eines Kontaktes aufheben menuitem.kick.user = Teilnehmer aus der Konferenz ausschließen menuitem.voice = Schreibrecht menuitem.revoke.voice = Schreibrecht entziehen @@ -729,6 +746,7 @@ menuitem.add.groupchat.myname = Meinen &Namen hervorheben, wenn ihn jemand schr menuitem.add.groupchat.mytext = Meinen &Text hervorheben, wenn ich etwas schreibe menuitem.add.groupchat.popname = &Zeige ein Popup, wenn jemand meinen Namen schreibt menuitem.add.groupchat.showjoinleavemessage = Zeige an wenn jemand den Raum betritt oder verlässt +menuitem.add.groupchat.showrolesinsteadofstatus = Zeige Chatrecht-Icons anstelle von Statusicons menuitem.show.offline.users = Zeige Offline User menuitem.expand.all.groups = Öffne alle Gruppen menuitem.collapse.all.groups = Schließe alle Gruppen