diff --git a/src/net/java/sip/communicator/impl/gui/customcontrols/SCScrollPane.java b/src/net/java/sip/communicator/impl/gui/customcontrols/SCScrollPane.java
index 17e7120ea..932030bcb 100644
--- a/src/net/java/sip/communicator/impl/gui/customcontrols/SCScrollPane.java
+++ b/src/net/java/sip/communicator/impl/gui/customcontrols/SCScrollPane.java
@@ -8,11 +8,14 @@
import java.awt.*;
import java.awt.image.*;
+import java.beans.*;
+import java.lang.reflect.*;
import javax.swing.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.utils.*;
+import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.skin.*;
import net.java.sip.communicator.util.swing.*;
@@ -190,4 +193,38 @@ public void loadSkin()
}
}
}
+
+ /**
+ * Cleanup.
+ */
+ public void dispose()
+ {
+ if(OSUtils.IS_MAC)
+ {
+ // Apple introduced a memory leak in JViewport class -
+ // they add a PropertyChangeListeners to the CToolkit
+ try
+ {
+ PropertyChangeListener[] pcl =Toolkit.getDefaultToolkit()
+ .getPropertyChangeListeners("apple.awt.contentScaleFactor");
+
+ for(PropertyChangeListener pc : pcl)
+ {
+ // find the reference to the object created the listener
+ Field f = pc.getClass().getDeclaredField("this$0");
+ f.setAccessible(true);
+ // if we are the parent cleanup
+ if(f.get(pc).equals(this.getViewport()))
+ {
+ Toolkit.getDefaultToolkit()
+ .removePropertyChangeListener(
+ "apple.awt.contentScaleFactor", pc);
+ break;
+ }
+ }
+ }
+ catch(Throwable t)
+ {}
+ }
+ }
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/account/AccountRegWizardContainerImpl.java b/src/net/java/sip/communicator/impl/gui/main/account/AccountRegWizardContainerImpl.java
index 86ba7138f..78026b4da 100644
--- a/src/net/java/sip/communicator/impl/gui/main/account/AccountRegWizardContainerImpl.java
+++ b/src/net/java/sip/communicator/impl/gui/main/account/AccountRegWizardContainerImpl.java
@@ -319,4 +319,12 @@ public void serviceChanged(ServiceEvent event)
break;
}
}
+
+ /**
+ * Implements the SIPCommDialog close method.
+ */
+ protected void close(boolean isEscaped)
+ {
+ summaryPage.dispose();
+ }
}
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 c6921b463..bbc1283f5 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
@@ -324,6 +324,7 @@ public void dispose()
{
writeMessagePanel.dispose();
chatSession.dispose();
+ conversationPanel.dispose();
}
/**
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatWritePanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatWritePanel.java
index 57fd401c0..7b1514303 100755
--- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatWritePanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatWritePanel.java
@@ -365,6 +365,8 @@ public void dispose()
stoppedTypingTimer.removeActionListener(this);
if (typingState != OperationSetTypingNotifications.STATE_STOPPED)
stopTypingTimer();
+
+ scrollPane.dispose();
}
/**
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/history/HistoryWindow.java b/src/net/java/sip/communicator/impl/gui/main/chat/history/HistoryWindow.java
index 6e0a72493..6f6a87257 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/history/HistoryWindow.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/history/HistoryWindow.java
@@ -747,6 +747,9 @@ else if(historyMenu.isPopupMenuVisible())
GuiActivator.getUIService().getHistoryWindowManager()
.removeHistoryWindowForContact(historyContact);
+ datesPanel.dispose();
+ chatConvPanel.dispose();
+
this.dispose();
}
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomListDialog.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomListDialog.java
index c1b7c4715..940a9b458 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomListDialog.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomListDialog.java
@@ -56,6 +56,8 @@ public class ChatRoomListDialog
*/
private static ChatRoomListDialog chatRoomListDialog;
+ private ChatRoomListUI chatRoomsListUI;
+
/**
* Shows a ChatRoomListDialog creating it first if necessary.
* The shown instance is shared in order to prevent displaying multiple
@@ -110,7 +112,7 @@ public ChatRoomListDialog(MainFrame parentWindow)
*/
private void init()
{
- ChatRoomListUI chatRoomsListUI = new ChatRoomListUI(this);
+ chatRoomsListUI = new ChatRoomListUI(this);
JButton createChatRoomButton = new JButton(
GuiActivator.getResources()
@@ -167,6 +169,7 @@ else if (buttonName.equals(JOIN_CHAT_ROOM))
@Override
protected void close(boolean isEscaped)
{
+ chatRoomsListUI.dispose();
this.dispose();
}
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java
index a90a2c89d..226c60dd6 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableDialog.java
@@ -502,6 +502,7 @@ else if(sourceButton.equals(cancelButton))
@Override
protected void close(boolean isEscaped)
{
+ chatRoomsTableUI.dispose();
chatRoomTableDialog = null;
dispose();
diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/MetaContactRightButtonMenu.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/MetaContactRightButtonMenu.java
index bd7348aff..635571831 100644
--- a/src/net/java/sip/communicator/impl/gui/main/contactlist/MetaContactRightButtonMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/MetaContactRightButtonMenu.java
@@ -408,49 +408,56 @@ private void init()
if(infoOpSet != null)
{
- details = infoOpSet.getAllDetailsForContact(contact);
-
- while(details.hasNext())
+ try
{
- GenericDetail d = details.next();
- if(d instanceof PhoneNumberDetail &&
- !(d instanceof PagerDetail) &&
- !(d instanceof FaxDetail))
+ details = infoOpSet.getAllDetailsForContact(contact);
+
+ while(details.hasNext())
{
- PhoneNumberDetail pnd = (PhoneNumberDetail)d;
- if(pnd.getNumber() != null &&
- pnd.getNumber().length() > 0)
+ GenericDetail d = details.next();
+ if(d instanceof PhoneNumberDetail &&
+ !(d instanceof PagerDetail) &&
+ !(d instanceof FaxDetail))
{
- String localizedType = null;
-
- if(d instanceof WorkPhoneDetail)
- {
- localizedType =
- GuiActivator.getResources().
- getI18NString(
- "service.gui.WORK_PHONE");
- }
- else if(d instanceof MobilePhoneDetail)
+ PhoneNumberDetail pnd = (PhoneNumberDetail)d;
+ if(pnd.getNumber() != null &&
+ pnd.getNumber().length() > 0)
{
- localizedType =
- GuiActivator.getResources().
- getI18NString(
- "service.gui.MOBILE_PHONE");
+ String localizedType;
+
+ if(d instanceof WorkPhoneDetail)
+ {
+ localizedType =
+ GuiActivator.getResources().
+ getI18NString(
+ "service.gui.WORK_PHONE");
+ }
+ else if(d instanceof MobilePhoneDetail)
+ {
+ localizedType =
+ GuiActivator.getResources().
+ getI18NString(
+ "service.gui.MOBILE_PHONE");
+ }
+ else
+ {
+ localizedType =
+ GuiActivator.getResources().
+ getI18NString(
+ "service.gui.PHONE");
+ }
+
+ phones.add(pnd.getNumber()
+ + " (" + localizedType + ")");
+ hasPhones = true;
}
- else
- {
- localizedType =
- GuiActivator.getResources().
- getI18NString(
- "service.gui.PHONE");
- }
-
- phones.add(pnd.getNumber()
- + " (" + localizedType + ")");
- hasPhones = true;
}
}
}
+ catch(Throwable t)
+ {
+ logger.error("Error obtaining server stored contact info");
+ }
}
// add all the contacts that support telephony to the call menu