diff --git a/src/net/java/sip/communicator/impl/gui/GuiActivator.java b/src/net/java/sip/communicator/impl/gui/GuiActivator.java
index b80e8ac2d..0a7f18d4c 100644
--- a/src/net/java/sip/communicator/impl/gui/GuiActivator.java
+++ b/src/net/java/sip/communicator/impl/gui/GuiActivator.java
@@ -18,6 +18,7 @@
import net.java.sip.communicator.service.msghistory.*;
import net.java.sip.communicator.service.notification.*;
import net.java.sip.communicator.service.protocol.*;
+import net.java.sip.communicator.service.systray.*;
import net.java.sip.communicator.util.*;
import org.osgi.framework.*;
@@ -49,6 +50,8 @@ public class GuiActivator implements BundleActivator
private static BrowserLauncherService browserLauncherService;
private static NotificationService notificationService;
+
+ private static SystrayService systrayService;
private static Map providerFactoriesMap = new Hashtable();
@@ -271,10 +274,30 @@ public static BrowserLauncherService getBrowserLauncher() {
* Returns the current implementation of the UIService.
* @return the current implementation of the UIService
*/
- public static UIServiceImpl getUIService() {
+ public static UIServiceImpl getUIService()
+ {
return uiService;
}
+ /**
+ * Returns the SystrayService obtained from the bundle context.
+ *
+ * @return the SystrayService obtained from the bundle context
+ */
+ public static SystrayService getSystrayService()
+ {
+ if (systrayService == null)
+ {
+ ServiceReference serviceReference = bundleContext
+ .getServiceReference(SystrayService.class.getName());
+
+ systrayService = (SystrayService) bundleContext
+ .getService(serviceReference);
+ }
+
+ return systrayService;
+ }
+
/**
* Returns the NotificationService obtained from the bundle context.
*
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java
index 869f5ab73..97c4177bb 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatPanel.java
@@ -551,7 +551,9 @@ public void propertyChange(PropertyChangeEvent evt)
.getContactListPanel().getContactList();
ContactListModel clistModel
= (ContactListModel) clist.getModel();
-
+
+ // Remove the envelope from the contact when the chat has
+ // gained the focus.
if(clistModel.isContactActive(selectedMetaContact))
{
clistModel.removeActiveContact(selectedMetaContact);
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindow.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindow.java
index 54dae30fb..011195ce1 100755
--- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindow.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindow.java
@@ -569,39 +569,44 @@ protected void close(boolean isEscaped)
{
ChatPanel chatPanel = getCurrentChatPanel();
- if(isEscaped) {
+ if(isEscaped)
+ {
ChatRightButtonMenu chatRightMenu = getCurrentChatPanel()
.getChatConversationPanel().getRightButtonMenu();
WritePanelRightButtonMenu writePanelRightMenu = getCurrentChatPanel()
.getChatWritePanel().getRightButtonMenu();
- SIPCommMenu selectedMenu = menusPanel.getMainMenuBar().getSelectedMenu();
+ SIPCommMenu selectedMenu
+ = menusPanel.getMainMenuBar().getSelectedMenu();
//SIPCommMenu contactMenu = getCurrentChatPanel()
// .getProtoContactSelectorBox().getMenu();
MenuSelectionManager menuSelectionManager
= MenuSelectionManager.defaultManager();
- if (chatRightMenu.isVisible()) {
+ if (chatRightMenu.isVisible())
+ {
chatRightMenu.setVisible(false);
}
- else if (writePanelRightMenu.isVisible()) {
-
+ else if (writePanelRightMenu.isVisible())
+ {
writePanelRightMenu.setVisible(false);
}
else if (selectedMenu != null
//|| contactMenu.isPopupMenuVisible()
- || menusPanel.getMainToolBar().hasSelectedMenus()) {
-
+ || menusPanel.getMainToolBar().hasSelectedMenus())
+ {
menuSelectionManager.clearSelectedPath();
}
- else {
+ else
+ {
mainFrame.getChatWindowManager().closeChat(chatPanel);
}
}
- else {
+ else
+ {
mainFrame.getChatWindowManager().closeWindow();
}
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindowManager.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindowManager.java
index 1f271a10b..e0f9a6e60 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindowManager.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatWindowManager.java
@@ -15,6 +15,7 @@
import net.java.sip.communicator.impl.gui.i18n.*;
import net.java.sip.communicator.impl.gui.main.*;
import net.java.sip.communicator.impl.gui.main.chat.conference.*;
+import net.java.sip.communicator.impl.gui.main.contactlist.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.service.contactlist.*;
import net.java.sip.communicator.service.protocol.*;
@@ -248,13 +249,7 @@ public void closeWindow()
if (answer == JOptionPane.OK_OPTION)
{
- chatWindow.removeAllChats();
- chatWindow.dispose();
-
- synchronized (chats)
- {
- chats.clear();
- }
+ this.disposeChatWindow();
}
}
else if (System.currentTimeMillis() - chatWindow
@@ -269,24 +264,12 @@ else if (System.currentTimeMillis() - chatWindow
if (answer == JOptionPane.OK_OPTION)
{
- chatWindow.removeAllChats();
- chatWindow.dispose();
-
- synchronized (chats)
- {
- chats.clear();
- }
+ this.disposeChatWindow();
}
}
else
{
- chatWindow.removeAllChats();
- chatWindow.dispose();
-
- synchronized (chats)
- {
- chats.clear();
- }
+ this.disposeChatWindow();
}
}
}
@@ -647,4 +630,29 @@ private ChatPanel getChat(Object key)
return (ChatPanel) chats.get(key);
}
}
+
+ /**
+ * Disposes the chat window.
+ */
+ private void disposeChatWindow()
+ {
+ chatWindow.removeAllChats();
+ chatWindow.dispose();
+
+ synchronized (chats)
+ {
+ chats.clear();
+ }
+
+ ContactList clist
+ = chatWindow.getMainFrame()
+ .getContactListPanel().getContactList();
+ ContactListModel clistModel
+ = (ContactListModel) clist.getModel();
+
+ // Remove the envelope from the all active contacts in the contact list.
+ clistModel.removeAllActiveContacts();
+
+ clist.refreshAll();
+ }
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactList.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactList.java
index daeb66e1c..7e62fdfe4 100644
--- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactList.java
+++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactList.java
@@ -1210,6 +1210,14 @@ public void refreshContact(MetaContact contact)
}
}
}
+
+ /**
+ * Refreshes the whole contact list.
+ */
+ public void refreshAll()
+ {
+ this.modifyGroup(contactList.getRoot());
+ }
/**
* Adds the given contact to the contact list.
diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListModel.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListModel.java
index 485187adf..35dff5718 100644
--- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListModel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListModel.java
@@ -15,6 +15,7 @@
import javax.swing.*;
+import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.service.contactlist.*;
import net.java.sip.communicator.service.protocol.*;
@@ -601,6 +602,13 @@ public void addActiveContact(MetaContact metaContact)
{
synchronized (activeContacts)
{
+ if(activeContacts.size() == 0)
+ {
+ GuiActivator.getSystrayService().setSystrayIcon(
+ ImageLoader.getImageInBytes(
+ ImageLoader.SYSTRAY_ENVELOPE_ICON));
+ }
+
this.activeContacts.add(metaContact);
}
}
@@ -615,6 +623,27 @@ public void removeActiveContact(MetaContact metaContact)
synchronized (activeContacts)
{
this.activeContacts.remove(metaContact);
+
+ if(activeContacts.size() == 0)
+ GuiActivator.getSystrayService().setSystrayIcon(
+ ImageLoader.getImageInBytes(ImageLoader.SYSTRAY_ICON));
+ }
+ }
+
+ /**
+ * Removes all contacts from the list of active contacts.
+ */
+ public void removeAllActiveContacts()
+ {
+ synchronized (activeContacts)
+ {
+ if(activeContacts.size() > 0)
+ {
+ this.activeContacts.removeAllElements();
+
+ GuiActivator.getSystrayService().setSystrayIcon(
+ ImageLoader.getImageInBytes(ImageLoader.SYSTRAY_ICON));
+ }
}
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java
index 632f70c7b..c5f9393ac 100755
--- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java
@@ -14,6 +14,7 @@
import javax.swing.*;
import javax.swing.Timer;
+import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.i18n.*;
import net.java.sip.communicator.impl.gui.main.*;
import net.java.sip.communicator.impl.gui.main.chat.*;
@@ -214,12 +215,13 @@ public void messageReceived(MessageReceivedEvent evt)
if(metaContact != null)
{
- // Show an envelope on the sender contact in the contact list.
+ // Show an envelope on the sender contact in the contact list and
+ // in the systray.
ContactListModel clistModel
= (ContactListModel) contactList.getModel();
clistModel.addActiveContact(metaContact);
- contactList.refreshContact(metaContact);
+ contactList.refreshContact(metaContact);
// Obtain the corresponding chat panel.
ChatPanel chatPanel = chatWindowManager.getContactChat(
diff --git a/src/net/java/sip/communicator/impl/gui/resources/common/systrayEnvelopeIcon.png b/src/net/java/sip/communicator/impl/gui/resources/common/systrayEnvelopeIcon.png
new file mode 100644
index 000000000..fb014f1a9
Binary files /dev/null and b/src/net/java/sip/communicator/impl/gui/resources/common/systrayEnvelopeIcon.png differ
diff --git a/src/net/java/sip/communicator/impl/gui/resources/common/systrayIcon.png b/src/net/java/sip/communicator/impl/gui/resources/common/systrayIcon.png
new file mode 100644
index 000000000..85bc142a4
Binary files /dev/null and b/src/net/java/sip/communicator/impl/gui/resources/common/systrayIcon.png differ
diff --git a/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf b/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf
index 166566266..eb91eeb1c 100644
--- a/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf
+++ b/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf
@@ -22,6 +22,7 @@ Import-Package: org.osgi.framework,
net.java.sip.communicator.service.callhistory.event,
net.java.sip.communicator.service.browserlauncher,
net.java.sip.communicator.service.notification,
+ net.java.sip.communicator.service.systray,
javax.swing,
javax.swing.event,
javax.swing.table,
diff --git a/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java b/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java
index 977446d17..21c5a617a 100644
--- a/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java
+++ b/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java
@@ -536,6 +536,17 @@ public class ImageLoader {
public static final ImageID MESSAGE_RECEIVED_ICON
= new ImageID("MESSAGE_RECEIVED_ICON");
+ /**
+ * The image used to set to the systray when a new message is received.
+ */
+ public static final ImageID SYSTRAY_ICON
+ = new ImageID("SYSTRAY_ICON");
+
+ /**
+ * The image used to set to the systray when a new message is received.
+ */
+ public static final ImageID SYSTRAY_ENVELOPE_ICON
+ = new ImageID("SYSTRAY_ENVELOPE_ICON");
// ///////////////////// Edit Text Toolbar icons //////////////////////////
diff --git a/src/net/java/sip/communicator/impl/gui/utils/images.properties b/src/net/java/sip/communicator/impl/gui/utils/images.properties
index f579b0309..9b70fc90e 100644
--- a/src/net/java/sip/communicator/impl/gui/utils/images.properties
+++ b/src/net/java/sip/communicator/impl/gui/utils/images.properties
@@ -200,4 +200,7 @@ CHAT_SERVER_16x16_ICON=net/java/sip/communicator/impl/gui/resources/common/multi
MESSAGE_RECEIVED_ICON=net/java/sip/communicator/impl/gui/resources/common/envelope.png
-REASON_DIALOG_ICON=net/java/sip/communicator/impl/gui/resources/common/reasonDialogIcon.png
\ No newline at end of file
+REASON_DIALOG_ICON=net/java/sip/communicator/impl/gui/resources/common/reasonDialogIcon.png
+
+SYSTRAY_ICON=net/java/sip/communicator/impl/gui/resources/common/systrayIcon.png
+SYSTRAY_ENVELOPE_ICON=net/java/sip/communicator/impl/gui/resources/common/systrayEnvelopeIcon.png
\ No newline at end of file
diff --git a/src/net/java/sip/communicator/impl/systray/jdic/SystrayServiceJdicImpl.java b/src/net/java/sip/communicator/impl/systray/jdic/SystrayServiceJdicImpl.java
index 218185b82..882b73fc4 100644
--- a/src/net/java/sip/communicator/impl/systray/jdic/SystrayServiceJdicImpl.java
+++ b/src/net/java/sip/communicator/impl/systray/jdic/SystrayServiceJdicImpl.java
@@ -18,7 +18,6 @@
import net.java.sip.communicator.impl.systray.*;
import net.java.sip.communicator.service.configuration.*;
import net.java.sip.communicator.service.gui.*;
-import net.java.sip.communicator.service.gui.event.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.event.*;
import net.java.sip.communicator.service.systray.*;
@@ -36,8 +35,7 @@
* @author Yana Stamcheva
*/
public class SystrayServiceJdicImpl
- implements SystrayService,
- ChatFocusListener
+ implements SystrayService
{
/**
* The systray.
@@ -307,6 +305,12 @@ public void removePopupMessageListener(SystrayPopupMessageListener listener)
}
}
+ /**
+ * Notifies all interested listeners that a SystrayPopupMessageEvent
+ * has occured
+ *
+ * @param sourceObject the source of this event
+ */
private void firePopupMessageEvent(Object sourceObject)
{
SystrayPopupMessageEvent evt
@@ -329,16 +333,12 @@ private void firePopupMessageEvent(Object sourceObject)
}
}
- public void chatFocusGained(ChatFocusEvent event)
- {
- Chat chat = event.getChat();
-
- chat.removeChatFocusListener(this);
-
- this.trayIcon.setIcon(logoIcon);
- }
-
- public void chatFocusLost(ChatFocusEvent event)
+ /**
+ * Sets a new systray icon.
+ * @param image the icon to set.
+ */
+ public void setSystrayIcon(byte[] image)
{
+ this.trayIcon.setIcon(new ImageIcon(image));
}
}
diff --git a/src/net/java/sip/communicator/service/systray/SystrayService.java b/src/net/java/sip/communicator/service/systray/SystrayService.java
index 544b654fa..f00c2d00d 100644
--- a/src/net/java/sip/communicator/service/systray/SystrayService.java
+++ b/src/net/java/sip/communicator/service/systray/SystrayService.java
@@ -62,4 +62,11 @@ public void showPopupMessage(String title,
* @param listener the listener to remove
*/
public void removePopupMessageListener(SystrayPopupMessageListener listener);
+
+ /**
+ * Sets a new icon to the systray.
+ *
+ * @param image the image to set
+ */
+ public void setSystrayIcon(byte[] image);
}