From efce3299dd06528367f90b64d2cf8d33cc28077c Mon Sep 17 00:00:00 2001 From: Damian Minkov Date: Tue, 27 Mar 2012 11:57:52 +0000 Subject: [PATCH] Fixes memory leak on macosx. --- .../impl/gui/customcontrols/SCScrollPane.java | 37 +++++++++ .../AccountRegWizardContainerImpl.java | 8 ++ .../impl/gui/main/chat/ChatPanel.java | 1 + .../impl/gui/main/chat/ChatWritePanel.java | 2 + .../gui/main/chat/history/HistoryWindow.java | 3 + .../chatroomslist/ChatRoomListDialog.java | 5 +- .../chatroomslist/ChatRoomTableDialog.java | 1 + .../MetaContactRightButtonMenu.java | 77 ++++++++++--------- 8 files changed, 98 insertions(+), 36 deletions(-) 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