diff options
author | Yana Stamcheva <yana@jitsi.org> | 2012-08-30 10:56:36 +0000 |
---|---|---|
committer | Yana Stamcheva <yana@jitsi.org> | 2012-08-30 10:56:36 +0000 |
commit | 9931f4b8004a35f3d5cdfc2b408723d9201f340a (patch) | |
tree | 7de598ad7b54f51fef39a7de5fdaf1e672da4834 | |
parent | 325cea15eb5769a79aba5003442e1b1f957fa604 (diff) | |
download | jitsi-9931f4b8004a35f3d5cdfc2b408723d9201f340a.zip jitsi-9931f4b8004a35f3d5cdfc2b408723d9201f340a.tar.gz jitsi-9931f4b8004a35f3d5cdfc2b408723d9201f340a.tar.bz2 |
Making the contact list component available from outside the gui bundle.
78 files changed, 1375 insertions, 549 deletions
diff --git a/src/net/java/sip/communicator/impl/callhistory/CallHistorySourceContact.java b/src/net/java/sip/communicator/impl/callhistory/CallHistorySourceContact.java index 9144727..3fe42c5 100644 --- a/src/net/java/sip/communicator/impl/callhistory/CallHistorySourceContact.java +++ b/src/net/java/sip/communicator/impl/callhistory/CallHistorySourceContact.java @@ -349,4 +349,14 @@ public class CallHistorySourceContact return time; } + + /** + * Returns the status of the source contact. And null if such information + * is not available. + * @return the PresenceStatus representing the state of this source contact. + */ + public PresenceStatus getPresenceStatus() + { + return null; + } } diff --git a/src/net/java/sip/communicator/impl/contactlist/MetaContactListServiceImpl.java b/src/net/java/sip/communicator/impl/contactlist/MetaContactListServiceImpl.java index 3c38ec1..7188454 100644 --- a/src/net/java/sip/communicator/impl/contactlist/MetaContactListServiceImpl.java +++ b/src/net/java/sip/communicator/impl/contactlist/MetaContactListServiceImpl.java @@ -2492,6 +2492,8 @@ public class MetaContactListServiceImpl (byte[])evt.getNewValue()); } else if(ContactPropertyChangeEvent.PROPERTY_PERSISTENT_DATA + .equals(evt.getPropertyName()) + || ContactPropertyChangeEvent.PROPERTY_DISPLAY_DETAILS .equals(evt.getPropertyName())) { // if persistent data changed fire an event to store it diff --git a/src/net/java/sip/communicator/impl/gui/GuiActivator.java b/src/net/java/sip/communicator/impl/gui/GuiActivator.java index faebc73..026dd4a 100644 --- a/src/net/java/sip/communicator/impl/gui/GuiActivator.java +++ b/src/net/java/sip/communicator/impl/gui/GuiActivator.java @@ -689,9 +689,6 @@ public class GuiActivator implements BundleActivator */ public static List<ContactSourceService> getContactSources() { - if (contactSources != null) - return contactSources; - contactSources = new Vector<ContactSourceService>(); ServiceReference[] serRefs = null; diff --git a/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java b/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java index c7d1b8c..a7e98d9 100644 --- a/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java +++ b/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java @@ -31,6 +31,7 @@ import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.impl.gui.utils.Constants; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.gui.*; +import net.java.sip.communicator.service.gui.ContactList; import net.java.sip.communicator.service.gui.Container; import net.java.sip.communicator.service.gui.event.*; import net.java.sip.communicator.service.protocol.*; @@ -1512,4 +1513,14 @@ public class UIServiceImpl else throw new IllegalArgumentException("participants"); } + + /** + * Creates a contact list component. + * + * @return the created <tt>ContactList</tt> + */ + public ContactList createContactListComponent() + { + return new TreeContactList(); + } } diff --git a/src/net/java/sip/communicator/impl/gui/lookandfeel/ExtendedTreeUI.java b/src/net/java/sip/communicator/impl/gui/lookandfeel/ExtendedTreeUI.java new file mode 100644 index 0000000..8fb3cd3 --- /dev/null +++ b/src/net/java/sip/communicator/impl/gui/lookandfeel/ExtendedTreeUI.java @@ -0,0 +1,49 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.gui.lookandfeel; + +import java.awt.event.*; + +import javax.swing.tree.*; + +import net.java.sip.communicator.impl.gui.main.contactlist.*; +import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; +import net.java.sip.communicator.service.gui.*; +import net.java.sip.communicator.util.swing.plaf.*; + +/** + * The <tt>ExtendedTreeUI</tt> is an extended implementation of the + * <tt>SIPCommTreeUI</tt> specific for the gui implementation. + */ +public class ExtendedTreeUI + extends SIPCommTreeUI +{ + /** + * Do not select the <tt>ShowMoreContact</tt>. + * + * @param path the <tt>TreePath</tt> to select + * @param event the <tt>MouseEvent</tt> that provoked the select + */ + protected void selectPathForEvent(TreePath path, MouseEvent event) + { + Object lastComponent = path.getLastPathComponent(); + + // Open right button menu when right mouse is pressed. + if (lastComponent instanceof ContactNode) + { + UIContact uiContact + = ((ContactNode) lastComponent).getContactDescriptor(); + + if (!(uiContact instanceof ShowMoreContact)) + { + super.selectPathForEvent(path, event); + } + } + else + super.selectPathForEvent(path, event); + } +} diff --git a/src/net/java/sip/communicator/impl/gui/main/account/AccountRegSummaryPage.java b/src/net/java/sip/communicator/impl/gui/main/account/AccountRegSummaryPage.java index 0d107e7..1d3919f 100644 --- a/src/net/java/sip/communicator/impl/gui/main/account/AccountRegSummaryPage.java +++ b/src/net/java/sip/communicator/impl/gui/main/account/AccountRegSummaryPage.java @@ -24,7 +24,7 @@ import net.java.sip.communicator.util.swing.*; * @author Yana Stamcheva */ public class AccountRegSummaryPage - extends SCScrollPane + extends SIPCommScrollPane implements WizardPage { private final Logger logger = Logger.getLogger(AccountRegSummaryPage.class); diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallTransferHandler.java b/src/net/java/sip/communicator/impl/gui/main/call/CallTransferHandler.java index df54503..5f3f0cd 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/CallTransferHandler.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/CallTransferHandler.java @@ -15,6 +15,7 @@ import javax.swing.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.*; import net.java.sip.communicator.util.swing.*; diff --git a/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java b/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java index a2ade87..d5019eb 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java @@ -147,8 +147,9 @@ public class ChooseCallAccountPopupMenu for (Object o : telephonyObjects) { - if (o instanceof UIContactDetail) - this.addTelephonyContactItem((UIContactDetail) o, opSetClass); + if (o instanceof UIContactDetailImpl) + this.addTelephonyContactItem( + (UIContactDetailImpl) o, opSetClass); else if (o instanceof ChatTransport) this.addTelephonyChatTransportItem((ChatTransport) o, opSetClass); @@ -225,7 +226,7 @@ public class ChooseCallAccountPopupMenu * would be performed when an item is selected */ private void addTelephonyContactItem( - final UIContactDetail telephonyContact, + final UIContactDetailImpl telephonyContact, final Class<? extends OperationSet> opSetClass) { final ContactMenuItem contactItem @@ -473,9 +474,9 @@ public class ChooseCallAccountPopupMenu */ private static final long serialVersionUID = 0L; - private final UIContactDetail contact; + private final UIContactDetailImpl contact; - public ContactMenuItem(UIContactDetail contact) + public ContactMenuItem(UIContactDetailImpl contact) { this.contact = contact; diff --git a/src/net/java/sip/communicator/impl/gui/main/call/OneToOneCallPeerPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/OneToOneCallPeerPanel.java index 0add775..7242a22 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/OneToOneCallPeerPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/OneToOneCallPeerPanel.java @@ -15,7 +15,6 @@ import javax.swing.*; import javax.swing.text.*; import net.java.sip.communicator.impl.gui.*; -import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; @@ -503,7 +502,7 @@ public class OneToOneCallPeerPanel { if (image == null || image.length <= 0) { - TreeContactList.setSourceContactImage( + GuiActivator.getContactList().setSourceContactImage( peerName, photoLabel, 100, 100); } else diff --git a/src/net/java/sip/communicator/impl/gui/main/call/ReceivedCallDialog.java b/src/net/java/sip/communicator/impl/gui/main/call/ReceivedCallDialog.java index e97c2f5..81807bc 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/ReceivedCallDialog.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/ReceivedCallDialog.java @@ -129,7 +129,7 @@ public class ReceivedCallDialog { public void run() { - TreeContactList + GuiActivator.getContactList() .setSourceContactImage( peer.getAddress(), callLabel[0], 50, 50); diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java index ff6859a..fba0eee 100755 --- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java @@ -47,7 +47,7 @@ import net.java.sip.communicator.util.swing.SwingWorker; * @author Adam Netocny */ public class ChatConversationPanel - extends SCScrollPane + extends SIPCommScrollPane implements HyperlinkListener, MouseListener, ClipboardOwner, diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatTransferHandler.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatTransferHandler.java index b49a2c4..5e36b20 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatTransferHandler.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatTransferHandler.java @@ -19,6 +19,7 @@ import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; import net.java.sip.communicator.service.contactlist.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.*; import net.java.sip.communicator.util.swing.*; 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 855dd77..7cdb61f 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 @@ -71,7 +71,7 @@ public class ChatWritePanel private final ArrayList<ChatMenuListener> menuListeners = new ArrayList<ChatMenuListener>(); - private final SCScrollPane scrollPane = new SCScrollPane(); + private final SIPCommScrollPane scrollPane = new SIPCommScrollPane(); private ChatTransportSelectorBox transportSelectorBox; diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ContactPhotoPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/ContactPhotoPanel.java index 54c8ac6..1f5f1da 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/ContactPhotoPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/ContactPhotoPanel.java @@ -17,6 +17,7 @@ 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.util.*; +import net.java.sip.communicator.util.swing.*; /** * The photo label corresponding to the current chat. diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomMemberListPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomMemberListPanel.java index 25364e9..d3ef1b3 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomMemberListPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatRoomMemberListPanel.java @@ -11,11 +11,11 @@ import java.awt.event.*; import javax.swing.*; -import net.java.sip.communicator.impl.gui.customcontrols.*; import net.java.sip.communicator.impl.gui.main.chat.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.skin.*; +import net.java.sip.communicator.util.swing.*; /** * The <tt>ChatContactListPanel</tt> is the panel added on the right of the @@ -99,7 +99,7 @@ public class ChatRoomMemberListPanel } - JScrollPane contactsScrollPane = new SCScrollPane(); + JScrollPane contactsScrollPane = new SIPCommScrollPane(); contactsScrollPane.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); contactsScrollPane.setOpaque(false); diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/history/DatesPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/history/DatesPanel.java index 45d71f2..1f1595e 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/history/DatesPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/history/DatesPanel.java @@ -23,7 +23,7 @@ import net.java.sip.communicator.util.swing.*; * @author Lubomir Marinov */ public class DatesPanel - extends SCScrollPane + extends SIPCommScrollPane implements ListSelectionListener { private final JList datesList = new JList(); diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/toolBars/MainToolBar.java b/src/net/java/sip/communicator/impl/gui/main/chat/toolBars/MainToolBar.java index a2fa7f2..14faa61 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/toolBars/MainToolBar.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/toolBars/MainToolBar.java @@ -605,7 +605,7 @@ public class MainToolBar } UIContactDetail cd = - new UIContactDetail( + new UIContactDetailImpl( pnd.getNumber(), pnd.getNumber() + " (" + localizedType + ")", diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomListUI.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomListUI.java index 4ca0420..c9f4a9f 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomListUI.java +++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomListUI.java @@ -12,9 +12,9 @@ import java.awt.event.*; import javax.swing.*; import net.java.sip.communicator.impl.gui.*; -import net.java.sip.communicator.impl.gui.customcontrols.*; import net.java.sip.communicator.impl.gui.main.chat.*; import net.java.sip.communicator.impl.gui.main.chat.conference.*; +import net.java.sip.communicator.util.swing.*; /** * The <tt>ChatRoomsListPanel</tt> is the panel that contains the @@ -24,7 +24,7 @@ import net.java.sip.communicator.impl.gui.main.chat.conference.*; * @author Lubomir Marinov */ public class ChatRoomListUI - extends SCScrollPane + extends SIPCommScrollPane implements MouseListener, ChatRoomListChangeListener, AdHocChatRoomListChangeListener diff --git a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableUI.java b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableUI.java index 55f30df..fba6560 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableUI.java +++ b/src/net/java/sip/communicator/impl/gui/main/chatroomslist/ChatRoomTableUI.java @@ -30,7 +30,7 @@ import net.java.sip.communicator.util.swing.*; * @author Lyubomir Marinov */ public class ChatRoomTableUI - extends SCScrollPane + extends SIPCommScrollPane implements MouseListener { /** diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/CallHistoryFilter.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/CallHistoryFilter.java index 8ccf6aa..b688c21 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/CallHistoryFilter.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/CallHistoryFilter.java @@ -9,9 +9,9 @@ package net.java.sip.communicator.impl.gui.main.contactlist; import java.util.*; import net.java.sip.communicator.impl.gui.*; -import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; import net.java.sip.communicator.impl.gui.main.contactlist.notifsource.*; import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.gui.*; /** * The <tt>CallHistoryFilter</tt> is a filter over the history contact sources. @@ -36,11 +36,11 @@ public class CallHistoryFilter if (notificationSource != null) addMatching(notificationSource); - Collection<ExternalContactSource> contactSources - = TreeContactList.getContactSources(); + Collection<UIContactSource> contactSources + = GuiActivator.getContactList().getContactSources(); // Then add Call history contact source. - for (ExternalContactSource contactSource : contactSources) + for (UIContactSource contactSource : contactSources) { ContactSourceService sourceService = contactSource.getContactSourceService(); @@ -54,8 +54,8 @@ public class CallHistoryFilter filterQuery.addContactQuery(query); // Add first available results. - this.addMatching( query.getQueryResults(), - contactSource); + addMatching(query.getQueryResults(), + contactSource); // We know that this query should be finished here and we do not // expect any further results from it. @@ -109,7 +109,7 @@ public class CallHistoryFilter * we're adding */ private void addMatching( List<SourceContact> sourceContacts, - ExternalContactSource uiSource) + UIContactSource uiSource) { Iterator<SourceContact> contactsIter = sourceContacts.iterator(); diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ChooseUIContactDetailPopupMenu.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ChooseUIContactDetailPopupMenu.java index c1bbcd5..0568aa6 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ChooseUIContactDetailPopupMenu.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ChooseUIContactDetailPopupMenu.java @@ -16,6 +16,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.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.skin.*; import net.java.sip.communicator.util.swing.*; @@ -61,7 +62,8 @@ public class ChooseUIContactDetailPopupMenu for (UIContactDetail detail : contactDetails) { - this.addContactDetailItem(detail, action); + if (detail instanceof UIContactDetailImpl) + this.addContactDetailItem((UIContactDetailImpl) detail, action); } } @@ -91,7 +93,7 @@ public class ChooseUIContactDetailPopupMenu * would be performed when an item is selected */ private void addContactDetailItem( - final UIContactDetail contactDetail, + final UIContactDetailImpl contactDetail, final UIContactDetailAction contactDetailAction) { final ContactMenuItem contactItem @@ -168,9 +170,9 @@ public class ChooseUIContactDetailPopupMenu */ private static final long serialVersionUID = 0L; - private final UIContactDetail contact; + private final UIContactDetailImpl contact; - public ContactMenuItem(UIContactDetail contact) + public ContactMenuItem(UIContactDetailImpl contact) { this.contact = contact; diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java index 9243cb9..1707f6b 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPane.java @@ -14,7 +14,6 @@ import javax.swing.*; import javax.swing.Timer; import net.java.sip.communicator.impl.gui.*; -import net.java.sip.communicator.impl.gui.customcontrols.*; import net.java.sip.communicator.impl.gui.event.*; import net.java.sip.communicator.impl.gui.main.*; import net.java.sip.communicator.impl.gui.main.chat.*; @@ -22,6 +21,7 @@ import net.java.sip.communicator.service.contacteventhandler.*; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.gui.Container; +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.util.*; @@ -37,7 +37,7 @@ import org.osgi.framework.*; * @author Yana Stamcheva */ public class ContactListPane - extends SCScrollPane + extends SIPCommScrollPane implements MessageListener, TypingNotificationsListener, FileTransferListener, @@ -212,8 +212,17 @@ public class ContactListPane * Implements the ContactListListener.groupSelected method. * @param evt the <tt>ContactListEvent</tt> that notified us */ - public void groupClicked(ContactListEvent evt) - {} + public void groupClicked(ContactListEvent evt) {} + + /** + * We're not interested in group selection events here. + */ + public void groupSelected(ContactListEvent evt) {} + + /** + * We're not interested in contact selection events here. + */ + public void contactSelected(ContactListEvent evt) {} /** * When a message is received determines whether to open a new chat window diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListSourceFilter.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListSourceFilter.java index 0f71721..aecad64 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListSourceFilter.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListSourceFilter.java @@ -10,6 +10,7 @@ import java.util.*; import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.gui.*; /** * The <tt>ContactListSourceFilter</tt> is a <tt>ContactListFilter</tt> that @@ -17,7 +18,8 @@ import net.java.sip.communicator.service.contactsource.*; * * @author Yana Stamcheva */ -public interface ContactListSourceFilter extends ContactListFilter +public interface ContactListSourceFilter + extends ContactListFilter { /** * Applies this filter to the given <tt>contactSource</tt>. diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTransferHandler.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTransferHandler.java index e763466..21c4859 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTransferHandler.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTransferHandler.java @@ -17,6 +17,7 @@ import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.chat.*; import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; import net.java.sip.communicator.service.contactlist.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.util.*; import net.java.sip.communicator.util.swing.*; diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java index c6b6fe2..951cc1c 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeCellRenderer.java @@ -22,6 +22,7 @@ import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.ServerStoredDetails.FaxDetail; import net.java.sip.communicator.service.protocol.ServerStoredDetails.GenericDetail; @@ -182,7 +183,7 @@ public class ContactListTreeCellRenderer /** * The icon showing the contact status. */ - protected ImageIcon statusIcon = new ImageIcon(); + protected Icon statusIcon = new ImageIcon(); /** * Indicates if the current list cell is selected. @@ -372,7 +373,7 @@ public class ContactListTreeCellRenderer // Make appropriate adjustments for contact nodes and group nodes. if (value instanceof ContactNode) { - UIContact contact + UIContactImpl contact = ((ContactNode) value).getContactDescriptor(); String displayName = contact.getDisplayName(); @@ -387,10 +388,13 @@ public class ContactListTreeCellRenderer this.nameLabel.setText(displayName); - if(statusIcon != null && contactList.isContactActive(contact)) - statusIcon.setImage(msgReceivedImage); + if(statusIcon != null + && contactList.isContactActive(contact) + && statusIcon instanceof ImageIcon) + ((ImageIcon) statusIcon).setImage(msgReceivedImage); else statusIcon = contact.getStatusIcon(); + this.statusLabel.setIcon(statusIcon); this.nameLabel.setFont(this.getFont().deriveFont(Font.PLAIN)); @@ -400,7 +404,7 @@ public class ContactListTreeCellRenderer // Initializes status message components if the given meta contact // contains a status message. - this.initDisplayDetails(contact); + this.initDisplayDetails(contact.getDisplayDetails()); this.initButtonsPanel(contact); @@ -417,7 +421,7 @@ public class ContactListTreeCellRenderer avatarHeight = AVATAR_HEIGHT; } - ImageIcon avatar + Icon avatar = contact.getAvatar(isSelected, avatarWidth, avatarHeight); if (avatar != null) @@ -441,7 +445,7 @@ public class ContactListTreeCellRenderer } else if (value instanceof GroupNode) { - UIGroup groupItem + UIGroupImpl groupItem = ((GroupNode) value).getGroupDescriptor(); this.nameLabel.setText(groupItem.getDisplayName()); @@ -485,6 +489,7 @@ public class ContactListTreeCellRenderer + "/" + groupItem.countChildContacts()); } + this.initDisplayDetails(groupItem.getDisplayDetails()); this.setToolTipText(groupItem.getDescriptor().toString()); } @@ -579,21 +584,36 @@ public class ContactListTreeCellRenderer public Dimension getPreferredSize() { Dimension preferredSize = new Dimension(); + int preferredHeight; if (treeNode instanceof ContactNode) { UIContact contact = ((ContactNode) treeNode).getContactDescriptor(); - if (contact instanceof ShowMoreContact) + preferredHeight = contact.getPreferredHeight(); + + if (preferredHeight > 0) + preferredSize.height = preferredHeight; + else if (contact instanceof ShowMoreContact) preferredSize.height = 18; else if (isSelected) preferredSize.height = 70; else preferredSize.height = 30; } - else - preferredSize.height = 18; + else if (treeNode instanceof GroupNode) + { + UIGroup group + = ((GroupNode) treeNode).getGroupDescriptor(); + + preferredHeight = group.getPreferredHeight(); + + if (preferredHeight > 0) + preferredSize.height = preferredHeight; + else + preferredSize.height = 18; + } return preferredSize; } @@ -646,16 +666,13 @@ public class ContactListTreeCellRenderer /** * Initializes the display details component for the given * <tt>UIContact</tt>. - * @param contact the <tt>UIContact</tt>, for which we initialize the - * details component + * @param details the display details to show */ - private void initDisplayDetails(UIContact contact) + private void initDisplayDetails(String displayDetails) { remove(displayDetailsLabel); displayDetailsLabel.setText(""); - String displayDetails = contact.getDisplayDetails(); - if (displayDetails != null && displayDetails.length() > 0) { // Replace all occurrences of new line with slash. @@ -829,6 +846,7 @@ public class ContactListTreeCellRenderer this.add(callButton, constraints); callButton.setBounds(x, y, 28, 28); + callButton.setEnabled(telephonyContact != null || hasPhone); x += callButton.getWidth(); @@ -1415,7 +1433,7 @@ public class ContactListTreeCellRenderer phones.add(pnd.getNumber()); UIContactDetail cd = - new UIContactDetail( + new UIContactDetailImpl( pnd.getNumber(), pnd.getNumber() + " (" + localizedType + ")", diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeModel.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeModel.java index 579464c..41d6390 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeModel.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListTreeModel.java @@ -11,6 +11,8 @@ import java.lang.reflect.*; import javax.swing.*; import javax.swing.tree.*; +import net.java.sip.communicator.service.gui.*; + /** * The data model of the contact list. * @@ -40,7 +42,7 @@ public class ContactListTreeModel this.parentTree = tree; - RootUIGroup rootDescriptor = new RootUIGroup(); + UIGroupImpl rootDescriptor = new RootUIGroup(); rootGroupNode = new GroupNode(this, rootDescriptor); rootDescriptor.setGroupNode(rootGroupNode); @@ -157,7 +159,7 @@ public class ContactListTreeModel * The <tt>RootUIGroup</tt> is the root group in this contact list model. */ private static class RootUIGroup - implements UIGroup + extends UIGroupImpl { /** * The corresponding group node. diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactNode.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactNode.java index 7fc66d4..c756518 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactNode.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactNode.java @@ -8,6 +8,8 @@ package net.java.sip.communicator.impl.gui.main.contactlist; import javax.swing.tree.*; +import net.java.sip.communicator.service.gui.*; + /** * The <tt>ContactNode</tt> is a <tt>ContactListNode</tt> corresponding to a * given <tt>UIContact</tt>. @@ -31,21 +33,22 @@ public class ContactNode /** * Creates a <tt>ContactNode</tt> by specifying the corresponding * <tt>contact</tt>. - * @param contact the <tt>UIContact</tt> corresponding to this node + * @param contact the <tt>UIContactImpl</tt> corresponding to this node */ - public ContactNode(UIContact contact) + public ContactNode(UIContactImpl contact) { super(contact); this.contact = contact; } /** - * Returns the corresponding <tt>UIContact</tt>. - * @return the corresponding <tt>UIContact</tt> + * Returns the corresponding <tt>UIContactImpl</tt>. + * + * @return the corresponding <tt>UIContactImpl</tt> */ - public UIContact getContactDescriptor() + public UIContactImpl getContactDescriptor() { - return (UIContact) getUserObject(); + return (UIContactImpl) getUserObject(); } /** diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/DefaultContactList.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/DefaultContactList.java index 3ff9626..7113a6a 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/DefaultContactList.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/DefaultContactList.java @@ -16,10 +16,10 @@ import javax.swing.text.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.chat.*; import net.java.sip.communicator.impl.gui.main.chat.conference.*; -import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.skin.*; +import net.java.sip.communicator.util.swing.*; /** * DeafultContactlist used to display <code>JList</code>s with contacts. diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/DefaultTreeContactList.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/DefaultTreeContactList.java index b795c48..aebf844 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/DefaultTreeContactList.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/DefaultTreeContactList.java @@ -18,9 +18,10 @@ import net.java.sip.communicator.impl.gui.lookandfeel.*; import net.java.sip.communicator.impl.gui.main.*; import net.java.sip.communicator.impl.gui.main.chat.*; import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; -import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.contactlist.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.util.skin.*; +import net.java.sip.communicator.util.swing.*; /** * DeafultContactlist used to display <code>JList</code>s with contacts. @@ -47,7 +48,7 @@ public class DefaultTreeContactList static { UIManager.getDefaults().put(uiClassID, - SIPCommTreeUI.class.getName()); + ExtendedTreeUI.class.getName()); } /** diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/GroupNode.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/GroupNode.java index 11753db..2d053ae 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/GroupNode.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/GroupNode.java @@ -12,8 +12,9 @@ import javax.swing.*; import javax.swing.plaf.*; import javax.swing.tree.*; -import net.java.sip.communicator.impl.gui.lookandfeel.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.util.*; +import net.java.sip.communicator.util.swing.plaf.*; /** * The <tt>GroupNode</tt> is a <tt>ContactListNode</tt> corresponding to a @@ -39,7 +40,7 @@ public class GroupNode /** * The corresponding <tt>UIGroup</tt>. */ - private final UIGroup group; + private final UIGroupImpl group; /** * The <tt>ContactListNode</tt> <tt>Comparator</tt> used to sort the list of @@ -62,10 +63,10 @@ public class GroupNode * and the corresponding <tt>uiGroup</tt>. * * @param treeModel the parent tree model containing this group - * @param uiGroup the corresponding <tt>UIGroup</tt> + * @param uiGroup the corresponding <tt>UIGroupImpl</tt> */ public GroupNode( ContactListTreeModel treeModel, - UIGroup uiGroup) + UIGroupImpl uiGroup) { super(uiGroup, true); @@ -78,10 +79,10 @@ public class GroupNode /** * Creates a <tt>ContactNode</tt> for the given <tt>uiContact</tt> * and adds it to this group. - * @param uiContact the <tt>UIContact</tt> to add + * @param uiContact the <tt>UIContactImpl</tt> to add * @return the created <tt>ContactNode</tt> */ - public ContactNode addContact(UIContact uiContact) + public ContactNode addContact(UIContactImpl uiContact) { if (logger.isDebugEnabled()) logger.debug("Group node add contact: " @@ -107,11 +108,11 @@ public class GroupNode /** * Creates a <tt>ContactNode</tt> for the given <tt>uiContact</tt>, * adds it to this group and performs a sort at the end. - * @param uiContact the <tt>UIContact</tt> to add + * @param uiContact the <tt>UIContactImpl</tt> to add * @return the created <tt>ContactNode</tt> */ @SuppressWarnings("unchecked") - public ContactNode sortedAddContact(UIContact uiContact) + public ContactNode sortedAddContact(UIContactImpl uiContact) { if (logger.isDebugEnabled()) logger.debug("Group node sorted add contact: " @@ -136,9 +137,9 @@ public class GroupNode /** * Removes the node corresponding to the given <tt>uiContact</tt> from this * group. - * @param uiContact the <tt>UIContact</tt> to remove + * @param uiContact the <tt>UIContactImpl</tt> to remove */ - public void removeContact(UIContact uiContact) + public void removeContact(UIContactImpl uiContact) { final ContactNode contactNode = uiContact.getContactNode(); @@ -164,10 +165,10 @@ public class GroupNode /** * Creates a <tt>GroupNode</tt> for the given <tt>uiGroup</tt> and * adds it to this group. - * @param uiGroup the <tt>UIGroup</tt> to add + * @param uiGroup the <tt>UIGroupImpl</tt> to add * @return the created <tt>GroupNode</tt> */ - public GroupNode addContactGroup(UIGroup uiGroup) + public GroupNode addContactGroup(UIGroupImpl uiGroup) { int selectedIndex = getLeadSelectionRow(); @@ -189,9 +190,9 @@ public class GroupNode /** * Removes the node corresponding to the given <tt>uiGroup</tt> from this * group node. - * @param uiGroup the <tt>UIGroup</tt> to remove + * @param uiGroup the <tt>UIGroupImpl</tt> to remove */ - public void removeContactGroup(UIGroup uiGroup) + public void removeContactGroup(UIGroupImpl uiGroup) { GroupNode groupNode = uiGroup.getGroupNode(); @@ -216,11 +217,11 @@ public class GroupNode /** * Creates a <tt>GroupNode</tt> for the given <tt>uiGroup</tt>, * adds it to this group node and performs a sort at the end. - * @param uiGroup the <tt>UIGroup</tt> to add + * @param uiGroup the <tt>UIGroupImpl</tt> to add * @return the created <tt>GroupNode</tt> */ @SuppressWarnings("unchecked") - public GroupNode sortedAddContactGroup(UIGroup uiGroup) + public GroupNode sortedAddContactGroup(UIGroupImpl uiGroup) { GroupNode groupNode = new GroupNode(treeModel, uiGroup); @@ -243,9 +244,9 @@ public class GroupNode * Returns the <tt>UIGroup</tt> corresponding to this <tt>GroupNode</tt>. * @return the <tt>UIGroup</tt> corresponding to this <tt>GroupNode</tt> */ - public UIGroup getGroupDescriptor() + public UIGroupImpl getGroupDescriptor() { - return (UIGroup) getUserObject(); + return (UIGroupImpl) getUserObject(); } /** 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 7a21c08..9a543cb 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 @@ -26,6 +26,7 @@ import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.gui.Container; +import net.java.sip.communicator.service.gui.event.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.OperationSetExtendedAuthorizations.SubscriptionStatus; import net.java.sip.communicator.service.protocol.ServerStoredDetails.FaxDetail; @@ -1198,6 +1199,16 @@ public class MetaContactRightButtonMenu } /** + * We're not interested in group selection events here. + */ + public void groupSelected(ContactListEvent evt) {} + + /** + * We're not interested in contact selection events here. + */ + public void contactSelected(ContactListEvent evt) {} + + /** * Moves the previously chosen sub-contact in the given toMetaContact. * * @param toMetaContact the MetaContact, where to move the previously diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/MoveSubcontactMessageDialog.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/MoveSubcontactMessageDialog.java index 787efb9..2d95a87 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/MoveSubcontactMessageDialog.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/MoveSubcontactMessageDialog.java @@ -15,6 +15,7 @@ import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.customcontrols.*; import net.java.sip.communicator.impl.gui.main.*; import net.java.sip.communicator.impl.gui.utils.*; +import net.java.sip.communicator.service.gui.event.*; import net.java.sip.communicator.util.skin.*; import net.java.sip.communicator.util.swing.*; diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/PresenceFilter.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/PresenceFilter.java index 1393569..3bf255e 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/PresenceFilter.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/PresenceFilter.java @@ -12,6 +12,7 @@ import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.contactlist.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.*; diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchField.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchField.java index 931eed7..c97ad48 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchField.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchField.java @@ -13,6 +13,8 @@ import javax.swing.event.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.*; +import net.java.sip.communicator.service.gui.*; +import net.java.sip.communicator.service.gui.event.*; import net.java.sip.communicator.util.skin.*; import net.java.sip.communicator.util.swing.*; import net.java.sip.communicator.util.swing.event.*; diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchFilter.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchFilter.java index aa36661..202ae0c 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchFilter.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchFilter.java @@ -12,6 +12,7 @@ import java.util.regex.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.gui.*; /** * The <tt>SearchFilter</tt> is a <tt>ContactListFilter</tt> that filters the @@ -50,7 +51,7 @@ public class SearchFilter /** * The list of external contact sources to search in. */ - private Collection<ExternalContactSource> contactSources; + private Collection<UIContactSource> contactSources; /** * The type of the search source. One of the above defined DEFAUT_SOURCE or @@ -88,13 +89,14 @@ public class SearchFilter if (filterQuery.isCanceled()) return; - Iterator<ExternalContactSource> filterSources + Iterator<UIContactSource> filterSources = getContactSources().iterator(); // Then we apply the filter on all its contact sources. while (filterSources.hasNext()) { - final ExternalContactSource filterSource = filterSources.next(); + final UIContactSource filterSource + = filterSources.next(); // If we have stopped filtering in the mean time we return here. if (filterQuery.isCanceled()) @@ -115,7 +117,7 @@ public class SearchFilter * filter to * @return the <tt>ContactQuery</tt> that tracks this filter */ - public ContactQuery applyFilter(ExternalContactSource contactSource) + public ContactQuery applyFilter(UIContactSource contactSource) { ContactSourceService sourceService = contactSource.getContactSourceService(); @@ -236,8 +238,9 @@ public class SearchFilter { ContactSourceService contactSource = sourceContact.getContactSource(); - ExternalContactSource sourceUI - = TreeContactList.getContactSource(contactSource); + + UIContactSource sourceUI + = GuiActivator.getContactList().getContactSource(contactSource); if (sourceUI != null // ExtendedContactSourceService has already matched the @@ -252,7 +255,7 @@ public class SearchFilter true); } else - ExternalContactSource.removeUIContact(sourceContact); + sourceUI.removeUIContact(sourceContact); } /** @@ -266,14 +269,15 @@ public class SearchFilter switch(searchSourceType) { case DEFAULT_SOURCE: - contactSources = TreeContactList.getContactSources(); + contactSources + = GuiActivator.getContactList().getContactSources(); break; case HISTORY_SOURCE: { - Collection<ExternalContactSource> historySources - = new LinkedList<ExternalContactSource>(); - ExternalContactSource historySource - = TreeContactList.getContactSource( + Collection<UIContactSource> historySources + = new LinkedList<UIContactSource>(); + UIContactSource historySource + = GuiActivator.getContactList().getContactSource( ContactSourceService.CALL_HISTORY); historySources.add(historySource); @@ -289,10 +293,10 @@ public class SearchFilter * @return the list of <tt>ExternalContactSource</tt> this filter searches * in */ - public Collection<ExternalContactSource> getContactSources() + public Collection<UIContactSource> getContactSources() { if (contactSources == null) - contactSources = TreeContactList.getContactSources(); + contactSources = GuiActivator.getContactList().getContactSources(); return contactSources; } diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactList.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/SimpleContactList.java index ae2a392..15eeb86 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactList.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/SimpleContactList.java @@ -19,6 +19,7 @@ import net.java.sip.communicator.impl.gui.main.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.contactlist.event.*; +import net.java.sip.communicator.service.gui.event.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.systray.*; import net.java.sip.communicator.util.*; @@ -32,7 +33,7 @@ import net.java.sip.communicator.util.*; * @author Yana Stamcheva * @author Lubomir Marinov */ -public class ContactList +public class SimpleContactList extends DefaultContactList implements MetaContactListListener, MouseListener @@ -48,7 +49,7 @@ public class ContactList private static final String MODIFY_OPERATION = "ModifyOperation"; - private final Logger logger = Logger.getLogger(ContactList.class); + private final Logger logger = Logger.getLogger(SimpleContactList.class); private final MetaContactListService contactListService; @@ -91,7 +92,7 @@ public class ContactList * * @param mainFrame The main application window. */ - public ContactList(MainFrame mainFrame) + public SimpleContactList(MainFrame mainFrame) { this.mainFrame = mainFrame; diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java index e11ad77..545955c 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/TreeContactList.java @@ -23,6 +23,8 @@ import net.java.sip.communicator.impl.gui.main.contactlist.notifsource.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.contactsource.*; +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.util.*; import net.java.sip.communicator.util.Logger; @@ -38,11 +40,13 @@ import org.osgi.framework.*; */ public class TreeContactList extends DefaultTreeContactList - implements ContactQueryListener, + implements ContactList, + ContactQueryListener, MetaContactQueryListener, MouseListener, MouseMotionListener, - TreeExpansionListener + TreeExpansionListener, + TreeSelectionListener { /** * Serial version UID. @@ -63,7 +67,7 @@ public class TreeContactList /** * The right button menu. */ - private JPopupMenu rightButtonMenu; + private Component rightButtonMenu; /** * A list of all contacts that are currently "active". An "active" contact @@ -107,7 +111,7 @@ public class TreeContactList /** * The current filter. */ - private ContactListFilter currentFilter; + private ContactListFilter currentFilter = defaultFilter; /** * Indicates if the click on a group node has been already consumed. This @@ -120,12 +124,12 @@ public class TreeContactList */ private MouseListener[] originalMouseListeners; - private static final Collection<ExternalContactSource> contactSources - = new LinkedList<ExternalContactSource>(); + private final Collection<UIContactSource> + contactSources = new LinkedList<UIContactSource>(); private static NotificationContactSource notificationSource; - private FilterQuery currentFilterQuery; + private UIFilterQuery currentFilterQuery; private FilterThread filterThread; @@ -148,6 +152,7 @@ public class TreeContactList this.addMouseListener(this); this.addMouseMotionListener(this); this.addTreeExpansionListener(this); + this.addTreeSelectionListener(this); GuiActivator.getContactListService() .addMetaContactListListener(mclSource); @@ -176,8 +181,7 @@ public class TreeContactList ContactSourceService contactSource = sourceContact.getContactSource(); - ExternalContactSource sourceUI - = TreeContactList.getContactSource(contactSource); + UIContactSource sourceUI = getContactSource(contactSource); if (sourceUI == null) return; @@ -196,7 +200,7 @@ public class TreeContactList } else { - ExternalContactSource.removeUIContact(sourceContact); + sourceUI.removeUIContact(sourceContact); uiContact = null; } } @@ -213,14 +217,13 @@ public class TreeContactList ContactSourceService contactSource = sourceContact.getContactSource(); - ExternalContactSource sourceUI - = TreeContactList.getContactSource(contactSource); + UIContactSource sourceUI = getContactSource(contactSource); if (sourceUI == null) return; UIContact uiContact - = ExternalContactSource.getUIContact(sourceContact); + = sourceUI.getUIContact(sourceContact); if(uiContact == null) return; @@ -235,6 +238,35 @@ public class TreeContactList } /** + * Indicates that a contact has been updated after a search. + * @param event the <tt>ContactQueryEvent</tt> containing information + * about the updated <tt>SourceContact</tt> + */ + public void contactChanged(ContactChangedEvent event) + { + final SourceContact sourceContact = event.getContact(); + + ContactSourceService contactSource + = sourceContact.getContactSource(); + + UIContactSource sourceUI = getContactSource(contactSource); + + if (sourceUI == null) + return; + + UIContact uiContact + = sourceUI.getUIContact(sourceContact); + + if(uiContact == null || !(uiContact instanceof UIContactImpl)) + return; + + ContactNode contactNode = ((UIContactImpl) uiContact).getContactNode(); + + if (contactNode != null) + nodeChanged(contactNode); + } + + /** * Indicates that a <tt>MetaContact</tt> has been received for a search in * the <tt>MetaContactListService</tt>. * @param event the received <tt>MetaContactQueryEvent</tt> @@ -355,7 +387,7 @@ public class TreeContactList */ public void setActiveContact(MetaContact metaContact, boolean isActive) { - UIContact uiContact + UIContactImpl uiContact = MetaContactListSource.getUIContact(metaContact); if (uiContact == null) @@ -389,7 +421,7 @@ public class TreeContactList * @return <tt>true</tt> if the given <tt>metaContact</tt> has been * previously set to active, otherwise returns <tt>false</tt> */ - public boolean isContactActive(UIContact contact) + public boolean isContactActive(UIContactImpl contact) { ContactNode contactNode = contact.getContactNode(); @@ -423,30 +455,40 @@ public class TreeContactList return; } - GroupNode groupNode; + GroupNode groupNode = null; if (group == null) groupNode = treeModel.getRoot(); - else + else if (group instanceof UIGroupImpl) { - groupNode = group.getGroupNode(); + UIGroupImpl contactImpl = (UIGroupImpl) group; + + groupNode = contactImpl.getGroupNode(); if (groupNode == null) { GroupNode parentNode = treeModel.getRoot(); if (isGroupSorted) - groupNode = parentNode.sortedAddContactGroup(group); + groupNode = parentNode.sortedAddContactGroup(contactImpl); else - groupNode = parentNode.addContactGroup(group); + groupNode = parentNode.addContactGroup(contactImpl); } } + if (groupNode == null) + return; + contact.setParentGroup(groupNode.getGroupDescriptor()); + if (!(contact instanceof UIContactImpl)) + return; + + UIContactImpl contactImpl = (UIContactImpl) contact; + if (isContactSorted) - groupNode.sortedAddContact(contact); + groupNode.sortedAddContact(contactImpl); else - groupNode.addContact(contact); + groupNode.addContact(contactImpl); if ((!currentFilter.equals(presenceFilter) || !groupNode.isCollapsed())) @@ -526,7 +568,8 @@ public class TreeContactList * @param contact the <tt>UIContact</tt> to remove * @param removeEmptyGroup whether we should delete the group if is empty */ - public void removeContact(final UIContact contact, final boolean removeEmptyGroup) + public void removeContact( final UIContact contact, + final boolean removeEmptyGroup) { if (!SwingUtilities.isEventDispatchThread()) { @@ -540,7 +583,10 @@ public class TreeContactList return; } - UIGroup parentGroup = contact.getParentGroup(); + if (!(contact instanceof UIContactImpl)) + return; + + UIGroupImpl parentGroup = (UIGroupImpl) contact.getParentGroup(); if (parentGroup == null) return; @@ -551,7 +597,7 @@ public class TreeContactList if (parentGroupNode == null) return; - parentGroupNode.removeContact(contact); + parentGroupNode.removeContact((UIContactImpl) contact); // If the parent group is empty remove it. if (removeEmptyGroup && parentGroupNode.getChildCount() == 0) @@ -593,7 +639,10 @@ public class TreeContactList return; } - treeModel.nodeChanged(contact.getContactNode()); + if (!(contact instanceof UIContactImpl)) + return; + + treeModel.nodeChanged(((UIContactImpl) contact).getContactNode()); } /** @@ -616,16 +665,21 @@ public class TreeContactList return; } - GroupNode groupNode = group.getGroupNode(); - + if (!(group instanceof UIGroupImpl)) + return; + + UIGroupImpl groupImpl = (UIGroupImpl) group; + + GroupNode groupNode = groupImpl.getGroupNode(); + if(groupNode == null) { GroupNode parentNode = treeModel.getRoot(); if (isSorted) - parentNode.sortedAddContactGroup(group); + parentNode.sortedAddContactGroup(groupImpl); else - parentNode.addContactGroup(group); + parentNode.addContactGroup(groupImpl); } expandGroup(treeModel.getRoot()); @@ -649,7 +703,10 @@ public class TreeContactList return; } - UIGroup parentGroup = group.getParentGroup(); + if (!(group instanceof UIGroupImpl)) + return; + + UIGroupImpl parentGroup = (UIGroupImpl) group.getParentGroup(); GroupNode parentGroupNode; @@ -667,7 +724,7 @@ public class TreeContactList if (parentGroupNode == null) return; - parentGroupNode.removeContactGroup(group); + parentGroupNode.removeContactGroup((UIGroupImpl) group); // If the parent group is empty remove it. if (parentGroupNode.getChildCount() == 0) @@ -765,7 +822,7 @@ public class TreeContactList if (currentFilterQuery != null && !currentFilterQuery.isCanceled()) currentFilterQuery.cancel(); - currentFilterQuery = new FilterQuery(); + currentFilterQuery = new UIFilterQuery(); if (filterThread == null) { @@ -803,7 +860,7 @@ public class TreeContactList { while (true) { - FilterQuery filterQuery = currentFilterQuery; + UIFilterQuery filterQuery = currentFilterQuery; ContactListFilter filter = this.filter; treeModel.clear(); @@ -945,6 +1002,12 @@ public class TreeContactList case ContactListEvent.GROUP_CLICKED: listener.groupClicked(event); break; + case ContactListEvent.CONTACT_SELECTED: + listener.contactSelected(event); + break; + case ContactListEvent.GROUP_SELECTED: + listener.groupSelected(event); + break; default: logger.error("Unknown event type " + event.getEventID()); } @@ -1152,7 +1215,9 @@ public class TreeContactList SwingUtilities.convertPointToScreen(contactListPoint, this); - rightButtonMenu.setInvoker(this); + if (rightButtonMenu instanceof JPopupMenu) + ((JPopupMenu) rightButtonMenu).setInvoker(this); + rightButtonMenu.setLocation(contactListPoint.x, contactListPoint.y); rightButtonMenu.setVisible(true); } @@ -1443,7 +1508,7 @@ public class TreeContactList for (ContactSourceService contactSource : GuiActivator.getContactSources()) { - contactSources.add(new ExternalContactSource(contactSource)); + contactSources.add(new ExternalContactSource(contactSource, this)); } GuiActivator.bundleContext.addServiceListener( new ContactSourceServiceListener()); @@ -1453,7 +1518,7 @@ public class TreeContactList * Returns the list of registered contact sources to search in. * @return the list of registered contact sources to search in */ - public static Collection<ExternalContactSource> getContactSources() + public Collection<UIContactSource> getContactSources() { return contactSources; } @@ -1478,15 +1543,14 @@ public class TreeContactList * @return the <tt>ExternalContactSource</tt> corresponding to the given * <tt>ContactSourceService</tt> */ - public static ExternalContactSource getContactSource( - ContactSourceService contactSource) + public UIContactSource getContactSource(ContactSourceService contactSource) { - Iterator<ExternalContactSource> extSourcesIter + Iterator<UIContactSource> extSourcesIter = contactSources.iterator(); while (extSourcesIter.hasNext()) { - ExternalContactSource extSource = extSourcesIter.next(); + UIContactSource extSource = extSourcesIter.next(); if (extSource.getContactSourceService().equals(contactSource)) return extSource; @@ -1499,14 +1563,14 @@ public class TreeContactList * @param identifier the identifier we're looking for * @return the contact source with the given identifier */ - public static ExternalContactSource getContactSource(String identifier) + public UIContactSource getContactSource(String identifier) { - Iterator<ExternalContactSource> extSourcesIter + Iterator<UIContactSource> extSourcesIter = contactSources.iterator(); while (extSourcesIter.hasNext()) { - ExternalContactSource extSource = extSourcesIter.next(); + UIContactSource extSource = extSourcesIter.next(); if (extSource.getContactSourceService().getIdentifier() .equals(identifier)) @@ -1524,7 +1588,7 @@ public class TreeContactList * @param imgWidth the desired image width * @param imgHeight the desired image height */ - public static void setSourceContactImage( String contactString, + public void setSourceContactImage( String contactString, final JLabel label, final int imgWidth, final int imgHeight) @@ -1536,8 +1600,8 @@ public class TreeContactList Pattern filterPattern = Pattern.compile( "^" + Pattern.quote(contactString) + "$", Pattern.UNICODE_CASE); - Iterator<ExternalContactSource> contactSources - = TreeContactList.getContactSources().iterator(); + Iterator<UIContactSource> contactSources + = getContactSources().iterator(); final Vector<ContactQuery> loadedQueries = new Vector<ContactQuery>(); @@ -1589,6 +1653,14 @@ public class TreeContactList */ public void contactRemoved(ContactRemovedEvent event) {} + + /** + * Indicates that a contact has been updated after a search. + * @param event the <tt>ContactQueryEvent</tt> containing information + * about the updated <tt>SourceContact</tt> + */ + public void contactChanged(ContactChangedEvent event) + {} }); // If the image search has been canceled from one of the @@ -1792,12 +1864,13 @@ public class TreeContactList { case ServiceEvent.REGISTERED: ExternalContactSource contactSource - = new ExternalContactSource((ContactSourceService) service); + = new ExternalContactSource( + (ContactSourceService) service, TreeContactList.this); contactSources.add(contactSource); changed = true; break; case ServiceEvent.UNREGISTERING: - ExternalContactSource cSource + UIContactSource cSource = getContactSource((ContactSourceService) service); if (cSource != null) contactSources.remove(cSource); @@ -1887,4 +1960,124 @@ public class TreeContactList { return mclSource; } + + public Component getComponent() + { + return this; + } + + /** + * Selects the given <tt>UIContact</tt> in the contact list. + * + * @param uiContact the contact to select + */ + public void setSelectedContact(final UIContact uiContact) + { + if (!SwingUtilities.isEventDispatchThread()) + { + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + setSelectedContact(uiContact); + } + }); + return; + } + + if (!(uiContact instanceof UIContactImpl)) + return; + + setSelectionPath(new TreePath( + ((UIContactImpl) uiContact).getContactNode().getPath())); + } + + /** + * Selects the given <tt>UIGroup</tt> in the contact list. + * + * @param uiGroup the group to select + */ + public void setSelectedGroup(final UIGroup uiGroup) + { + if (!SwingUtilities.isEventDispatchThread()) + { + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + setSelectedGroup(uiGroup); + } + }); + return; + } + + if (!(uiGroup instanceof UIGroupImpl)) + return; + + setSelectionPath(new TreePath( + ((UIGroupImpl) uiGroup).getGroupNode().getPath())); + } + + /** + * Returns the currently selected <tt>UIContact</tt> if there's one. + * + * @return the currently selected <tt>UIContact</tt> if there's one. + */ + public UIContact getSelectedContact() + { + TreePath selectionPath = getSelectionPath(); + + if (selectionPath != null + && selectionPath.getLastPathComponent() instanceof ContactNode) + { + return ((ContactNode) selectionPath.getLastPathComponent()) + .getContactDescriptor(); + } + + return null; + } + + /** + * Returns the currently selected <tt>UIGroup</tt> if there's one. + * + * @return the currently selected <tt>UIGroup</tt> if there's one. + */ + public UIGroup getSelectedGroup() + { + TreePath selectionPath = getSelectionPath(); + + if (selectionPath != null + && selectionPath.getLastPathComponent() instanceof GroupNode) + { + return ((GroupNode) selectionPath.getLastPathComponent()) + .getGroupDescriptor(); + } + + return null; + } + + /** + * Indicates that a selection has occurred on the tree. + * + * @param e the <tt>TreeSelectionEvent</tt> that notified us of the change + */ + public void valueChanged(TreeSelectionEvent e) + { + UIGroup selectedGroup = getSelectedGroup(); + + if (selectedGroup != null) + { + fireContactListEvent( + selectedGroup, ContactListEvent.GROUP_SELECTED, 0); + } + else + { + UIContact selectedContact = getSelectedContact(); + if (selectedContact != null) + { + fireContactListEvent( + selectedContact, ContactListEvent.GROUP_SELECTED, 0); + } + } + } } diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactDetailImpl.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactDetailImpl.java new file mode 100644 index 0000000..71b3634 --- /dev/null +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactDetailImpl.java @@ -0,0 +1,83 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.gui.main.contactlist; + +import java.util.*; + +import javax.swing.*; + +import net.java.sip.communicator.service.gui.*; +import net.java.sip.communicator.service.protocol.*; + +/** + * The <tt>UIContactDetail</tt> implementation + * + * @author Yana Stamcheva + */ +public class UIContactDetailImpl + extends UIContactDetail +{ + /** + * The status icon of this contact detail. + */ + private ImageIcon statusIcon; + + /** + * Creates a <tt>UIContactDetailImpl</tt> by specifying the contact + * <tt>address</tt>, the <tt>displayName</tt> and <tt>preferredProvider</tt>. + * @param address the contact address + * @param displayName the contact display name + * @param category the category of the underlying contact detail + * @param labels the collection of labels associated with this detail + * @param statusIcon the status icon of this contact detail + * @param preferredProvider the preferred protocol provider + * @param preferredProtocol the preferred protocol if no protocol provider + * is set + * @param descriptor the underlying object that this class is wrapping + */ + public UIContactDetailImpl( + String address, + String displayName, + String category, + Collection<String> labels, + ImageIcon statusIcon, + ProtocolProviderService preferredProvider, + String preferredProtocol, + Object descriptor) + { + super(address, displayName, category, labels, preferredProvider, + preferredProtocol, descriptor); + + setStatusIcon(statusIcon); + } + + /** + * Sets the given status icon. + * + * @param statusIcon the status icon to set + */ + public void setStatusIcon(ImageIcon statusIcon) + { + this.statusIcon = statusIcon; + } + + /** + * Returns the status icon of this contact detail. + * + * @return the status icon of this contact detail + */ + public ImageIcon getStatusIcon() + { + return statusIcon; + } + + @Override + public PresenceStatus getPresenceStatus() + { + return null; + } +} diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactImpl.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactImpl.java new file mode 100644 index 0000000..bd15e4b --- /dev/null +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactImpl.java @@ -0,0 +1,56 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.gui.main.contactlist; + +import javax.swing.*; + +import net.java.sip.communicator.service.gui.*; + +public abstract class UIContactImpl + extends UIContact +{ + /** + * Returns the corresponding <tt>ContactNode</tt>. The <tt>ContactNode</tt> + * is the real node that is stored in the contact list component data model. + * + * @return the corresponding <tt>ContactNode</tt> + */ + public abstract ContactNode getContactNode(); + + /** + * Sets the given <tt>contactNode</tt>. The <tt>ContactNode</tt> + * is the real node that is stored in the contact list component data model. + * + * @param contactNode the <tt>ContactNode</tt> that corresponds to this + * <tt>UIGroup</tt> + */ + public abstract void setContactNode(ContactNode contactNode); + + /** + * Returns the general status icon of the given MetaContact. Detects the + * status using the priority status table. The priority is defined on + * the "availability" factor and here the most "available" status is + * returned. + * + * @return PresenceStatus The most "available" status from all + * sub-contact statuses. + */ + public abstract ImageIcon getStatusIcon(); + + /** + * Gets the avatar of a specific <tt>MetaContact</tt> in the form of an + * <tt>ImageIcon</tt> value. + * + * @param isSelected indicates if the contact is selected + * @param width the desired icon width + * @param height the desired icon height + * @return an <tt>ImageIcon</tt> which represents the avatar of the + * specified <tt>MetaContact</tt> + */ + public abstract ImageIcon getAvatar( + boolean isSelected, int width, int height); +} diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/FilterQuery.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/UIFilterQuery.java index 4ac17b9..441737d 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/FilterQuery.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/UIFilterQuery.java @@ -11,13 +11,16 @@ import java.util.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.gui.*; +import net.java.sip.communicator.service.gui.event.*; /** * The <tt>FilterQuery</tt> gives information about a current filtering. * * @author Yana Stamcheva */ -public class FilterQuery +public class UIFilterQuery + extends FilterQuery implements ContactQueryListener, MetaContactQueryListener { @@ -315,7 +318,8 @@ public class FilterQuery GuiActivator.getContactList().addContact( query, moreInfoContact, - TreeContactList.getContactSource(contactSource).getUIGroup(), + GuiActivator.getContactList() + .getContactSource(contactSource).getUIGroup(), false); } } @@ -338,6 +342,14 @@ public class FilterQuery public void contactRemoved(ContactRemovedEvent event) {} + /** + * Indicates that a contact has been updated after a search. + * @param event the <tt>ContactQueryEvent</tt> containing information + * about the updated <tt>SourceContact</tt> + */ + public void contactChanged(ContactChangedEvent event) + {} + public void metaContactReceived(MetaContactQueryEvent event) {} public void metaGroupReceived(MetaGroupQueryEvent event) {} diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIGroup.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/UIGroup.java deleted file mode 100644 index caa2cb9..0000000 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIGroup.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Jitsi, the OpenSource Java VoIP and Instant Messaging client. - * - * Distributable under LGPL license. - * See terms of license at gnu.org. - */ -package net.java.sip.communicator.impl.gui.main.contactlist; - -import javax.swing.*; - -/** - * The <tt>UIGroup</tt> represents the user interface contact list group. - * - * @author Yana Stamcheva - */ -public interface UIGroup -{ - /** - * Returns the descriptor of the group. This would be the underlying object - * that should provide all other necessary information for the group. - * - * @return the descriptor of the group - */ - public Object getDescriptor(); - - /** - * The display name of the group. The display name is the name to be shown - * in the contact list group row. - * - * @return the display name of the group - */ - public String getDisplayName(); - - /** - * Returns the index of this group in its source. In other words this is - * the descriptor index. - * - * @return the index of this group in its source - */ - public int getSourceIndex(); - - /** - * Returns the parent group. - * - * @return the parent group - */ - public UIGroup getParentGroup(); - - /** - * Indicates if the group is collapsed or expanded. - * - * @return <tt>true</tt> to indicate that the group is collapsed, - * <tt>false</tt> to indicate that it's expanded - */ - public boolean isGroupCollapsed(); - - /** - * Returns the count of online child contacts. - * - * @return the count of online child contacts - */ - public int countOnlineChildContacts(); - - /** - * Returns the child contacts count. - * - * @return child contacts count - */ - public int countChildContacts(); - - /** - * Returns the identifier of this group. - * - * @return the identifier of this group - */ - public String getId(); - - /** - * Returns the <tt>GroupNode</tt> corresponding to this <tt>UIGroup</tt>. - * The is the actual node used in the contact list component data model. - * - * @return the <tt>GroupNode</tt> corresponding to this <tt>UIGroup</tt> - */ - public GroupNode getGroupNode(); - - /** - * Sets the <tt>GroupNode</tt> corresponding to this <tt>UIGroup</tt>. - * - * @param groupNode the <tt>GroupNode</tt> to set. The is the actual - * node used in the contact list component data model. - */ - public void setGroupNode(GroupNode groupNode); - - /** - * Returns the right button menu for this group. - * - * @return the right button menu component for this group - */ - public JPopupMenu getRightButtonMenu(); -} diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIGroupImpl.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/UIGroupImpl.java new file mode 100644 index 0000000..92658c4 --- /dev/null +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/UIGroupImpl.java @@ -0,0 +1,23 @@ +package net.java.sip.communicator.impl.gui.main.contactlist; + +import net.java.sip.communicator.service.gui.*; + +public abstract class UIGroupImpl + extends UIGroup +{ + /** + * Returns the <tt>GroupNode</tt> corresponding to this <tt>UIGroup</tt>. + * The is the actual node used in the contact list component data model. + * + * @return the <tt>GroupNode</tt> corresponding to this <tt>UIGroup</tt> + */ + public abstract GroupNode getGroupNode(); + + /** + * Sets the <tt>GroupNode</tt> corresponding to this <tt>UIGroup</tt>. + * + * @param groupNode the <tt>GroupNode</tt> to set. The is the actual + * node used in the contact list component data model. + */ + public abstract void setGroupNode(GroupNode groupNode); +} diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ExternalContactSource.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ExternalContactSource.java index d60a214..805e00b 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ExternalContactSource.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ExternalContactSource.java @@ -7,11 +7,13 @@ package net.java.sip.communicator.impl.gui.main.contactlist.contactsource; import javax.swing.*; +import javax.swing.tree.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.service.contactsource.*; import net.java.sip.communicator.service.customcontactactions.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.swing.*; import org.osgi.framework.*; @@ -28,6 +30,7 @@ import java.util.List; * @author Yana Stamcheva */ public class ExternalContactSource + implements UIContactSource { /** * The data key of the SourceContactDescriptor object used to store a @@ -57,6 +60,8 @@ public class ExternalContactSource private static Map<ContactAction<SourceContact>, SIPCommButton> customActionButtons; + private final JTree contactListTree; + /** * Creates an <tt>ExternalContactSource</tt> based on the given * <tt>ContactSourceService</tt>. @@ -64,11 +69,13 @@ public class ExternalContactSource * @param contactSource the <tt>ContactSourceService</tt>, on which this * <tt>ExternalContactSource</tt> is based */ - public ExternalContactSource(ContactSourceService contactSource) + public ExternalContactSource( ContactSourceService contactSource, + JTree contactListTree) { this.contactSource = contactSource; + this.contactListTree = contactListTree; - sourceUIGroup = new SourceUIGroup(contactSource.getDisplayName()); + sourceUIGroup = new SourceUIGroup(contactSource.getDisplayName(), this); } /** @@ -116,7 +123,7 @@ public class ExternalContactSource * @param sourceContact the <tt>SourceContact</tt>, which corresponding UI * contact we would like to remove */ - public static void removeUIContact(SourceContact sourceContact) + public void removeUIContact(SourceContact sourceContact) { sourceContact.setData(UI_CONTACT_DATA_KEY, null); } @@ -129,7 +136,7 @@ public class ExternalContactSource * @return the <tt>UIContact</tt> corresponding to the given * <tt>MetaContact</tt> */ - public static UIContact getUIContact(SourceContact sourceContact) + public UIContact getUIContact(SourceContact sourceContact) { return (UIContact) sourceContact.getData(UI_CONTACT_DATA_KEY); } @@ -139,7 +146,7 @@ public class ExternalContactSource * * @return a list of all custom action buttons for this meta contact */ - public static Collection<SIPCommButton> getContactCustomActionButtons( + public Collection<SIPCommButton> getContactCustomActionButtons( final SourceContact sourceContact) { customActionContact = sourceContact; @@ -192,19 +199,14 @@ public class ExternalContactSource /** * Initializes custom action buttons for this contact source. */ - private static void initCustomActionButtons() + private void initCustomActionButtons() { customActionButtons = new LinkedHashMap <ContactAction<SourceContact>, SIPCommButton>(); - CustomContactActionsChangeListener changeListener - = new CustomContactActionsChangeListener(); - for (CustomContactActionsService<SourceContact> ccas : getContactActionsServices()) { - ccas.addCustomContactActionsListener(changeListener); - Iterator<ContactAction<SourceContact>> actionIterator = ccas.getCustomContactActions(); @@ -254,13 +256,15 @@ public class ExternalContactSource button.getY() + button.getHeight()); SwingUtilities.convertPointToScreen( - location, GuiActivator.getContactList()); + location, contactListTree); - location.y = location.y - + GuiActivator.getContactList() - .getPathBounds( - GuiActivator.getContactList() - .getSelectionPath()).y; + TreePath selectionPath + = contactListTree.getSelectionPath(); + + if (selectionPath != null) + location.y = location.y + + contactListTree.getPathBounds( + selectionPath).y; contactAction.actionPerformed( contactDetails.get(0), @@ -326,8 +330,8 @@ public class ExternalContactSource * <tt>ExternalContactSource</tt>. It takes the name of the source and * sets it as a group name. */ - private class SourceUIGroup - implements UIGroup + public class SourceUIGroup + extends UIGroupImpl { /** * The display name of the group. @@ -339,13 +343,22 @@ public class ExternalContactSource */ private GroupNode groupNode; + private ExternalContactSource parentUISource; + /** * Creates an instance of <tt>SourceUIGroup</tt>. * @param name the name of the group */ - public SourceUIGroup(String name) + public SourceUIGroup( String name, + ExternalContactSource parentUISource) { this.displayName = name; + this.parentUISource = parentUISource; + } + + public ExternalContactSource getParentUISource() + { + return parentUISource; } /** @@ -413,7 +426,7 @@ public class ExternalContactSource */ public Object getDescriptor() { - return displayName; + return contactSource; } /** @@ -454,29 +467,6 @@ public class ExternalContactSource } /** - * Listens for updates on actions and when received update the source contact. - */ - private static class CustomContactActionsChangeListener - implements CustomContactActionsListener - { - /** - * Update for custom action has occurred. - * @param event the event containing the source which was updated. - */ - public void updated(CustomContactActionsEvent event) - { - if(!(event.getSource() instanceof SourceContact)) - return; - - ContactNode contactNode - = getUIContact((SourceContact)event.getSource()).getContactNode(); - - if (contactNode != null) - GuiActivator.getContactList().nodeChanged(contactNode); - } - } - - /** * An implementation of <tt>UIContactDetail</tt> for a custom action. */ private static class UIContactDetailCustomAction diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java index 8a8d69a..82ea955 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaContactListSource.java @@ -21,6 +21,7 @@ import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.contactlist.event.*; import net.java.sip.communicator.service.customcontactactions.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; import net.java.sip.communicator.util.*; @@ -91,9 +92,9 @@ public class MetaContactListSource * @return the <tt>UIContact</tt> corresponding to the given * <tt>MetaContact</tt> */ - public static UIContact getUIContact(MetaContact metaContact) + public static UIContactImpl getUIContact(MetaContact metaContact) { - return (UIContact) metaContact.getData(UI_CONTACT_DATA_KEY); + return (UIContactImpl) metaContact.getData(UI_CONTACT_DATA_KEY); } /** @@ -101,12 +102,12 @@ public class MetaContactListSource * <tt>MetaContactGroup</tt>. * @param metaGroup the <tt>MetaContactGroup</tt>, which UI group we're * looking for - * @return the <tt>UIGroup</tt> corresponding to the given + * @return the <tt>UIGroupImpl</tt> corresponding to the given * <tt>MetaContactGroup</tt> */ - public static UIGroup getUIGroup(MetaContactGroup metaGroup) + public static UIGroupImpl getUIGroup(MetaContactGroup metaGroup) { - return (UIGroup) metaGroup.getData(UI_GROUP_DATA_KEY); + return (UIGroupImpl) metaGroup.getData(UI_GROUP_DATA_KEY); } /** @@ -126,7 +127,7 @@ public class MetaContactListSource * create an <tt>UIContact</tt> * @return an <tt>UIContact</tt> for the given <tt>metaContact</tt> */ - public static UIContact createUIContact(final MetaContact metaContact) + public static UIContactImpl createUIContact(final MetaContact metaContact) { final MetaUIContact descriptor = new MetaUIContact(metaContact); @@ -367,7 +368,7 @@ public class MetaContactListSource boolean uiContactCreated = false; - UIContact uiContact; + UIContactImpl uiContact; synchronized (metaContact) { @@ -439,7 +440,7 @@ public class MetaContactListSource public void childContactsReordered(MetaContactGroupEvent evt) { MetaContactGroup metaGroup = evt.getSourceMetaContactGroup(); - UIGroup uiGroup; + UIGroupImpl uiGroup; ContactListTreeModel treeModel = GuiActivator.getContactList().getTreeModel(); @@ -577,7 +578,7 @@ public class MetaContactListSource { final MetaContactGroup metaGroup = evt.getSourceMetaContactGroup(); - UIGroup uiGroup; + UIGroupImpl uiGroup; synchronized (metaGroup) { uiGroup = MetaContactListSource.getUIGroup(metaGroup); @@ -622,7 +623,7 @@ public class MetaContactListSource { MetaContact metaContact = evt.getSourceMetaContact(); - UIContact uiContact; + UIContactImpl uiContact; synchronized (metaContact) { uiContact = MetaContactListSource.getUIContact(metaContact); @@ -744,7 +745,7 @@ public class MetaContactListSource { MetaContact metaContact = evt.getSourceMetaContact(); - UIContact uiContact; + UIContactImpl uiContact; synchronized (metaContact) { uiContact = MetaContactListSource.getUIContact(metaContact); @@ -768,7 +769,7 @@ public class MetaContactListSource { MetaContact metaContact = evt.getSourceMetaContact(); - UIContact uiContact; + UIContactImpl uiContact; synchronized (metaContact) { uiContact = MetaContactListSource.getUIContact(metaContact); @@ -850,7 +851,7 @@ public class MetaContactListSource { MetaContact metaContact = evt.getNewParent(); - UIContact uiContact; + UIContactImpl uiContact; synchronized (metaContact) { uiContact = MetaContactListSource.getUIContact(metaContact); @@ -948,7 +949,7 @@ public class MetaContactListSource { final MetaContact oldParent = evt.getOldParent(); - UIContact oldUIContact; + UIContactImpl oldUIContact; synchronized (oldParent) { oldUIContact = MetaContactListSource.getUIContact(oldParent); @@ -1030,14 +1031,9 @@ public class MetaContactListSource customActionButtons = new LinkedHashMap<ContactAction<Contact>, SIPCommButton>(); - CustomContactActionsChangeListener changeListener - = new CustomContactActionsChangeListener(); - for (CustomContactActionsService<Contact> ccas : getContactActionsServices()) { - ccas.addCustomContactActionsListener(changeListener); - Iterator<ContactAction<Contact>> actionIterator = ccas.getCustomContactActions(); @@ -1105,45 +1101,6 @@ public class MetaContactListSource } /** - * Listens for updates on actions and when received update the contact. - */ - private static class CustomContactActionsChangeListener - implements CustomContactActionsListener - { - /** - * Update for custom action has occured. - * @param event the event containing the source which was updated. - */ - public void updated(CustomContactActionsEvent event) - { - if(!(event.getSource() instanceof Contact)) - return; - - MetaContact metaContact - = GuiActivator.getContactListService().findMetaContactByContact( - (Contact)event.getSource()); - - if (metaContact == null) - return; - - UIContact uiContact; - synchronized (metaContact) - { - uiContact = MetaContactListSource.getUIContact(metaContact); - } - - if (uiContact != null) - { - ContactNode contactNode - = uiContact.getContactNode(); - - if (contactNode != null) - GuiActivator.getContactList().nodeChanged(contactNode); - } - } - } - - /** * An implementation of <tt>UIContactDetail</tt> for a custom action. */ private static class UIContactDetailCustomAction diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaUIContact.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaUIContact.java index 1cf6c2f..bb4b2f5 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaUIContact.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaUIContact.java @@ -14,6 +14,7 @@ import net.java.sip.communicator.impl.gui.*; 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.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.OperationSetExtendedAuthorizations.SubscriptionStatus; @@ -34,7 +35,7 @@ import net.java.sip.communicator.util.swing.*; * @author Yana Stamcheva */ public class MetaUIContact - implements UIContact + extends UIContactImpl { /** * The key of the user data in <tt>MetaContact</tt> which specifies @@ -593,7 +594,8 @@ public class MetaUIContact * The implementation of the <tt>UIContactDetail</tt> interface for the * <tt>MetaContactListService</tt>. */ - private class MetaContactDetail extends UIContactDetail + private class MetaContactDetail + extends UIContactDetailImpl { /** * The underlying protocol contact. @@ -612,8 +614,7 @@ public class MetaUIContact contact.getDisplayName(), null, null, - new ImageIcon( - contact.getPresenceStatus().getStatusIcon()), + new ImageIcon(contact.getPresenceStatus().getStatusIcon()), contact.getProtocolProvider(), contact.getProtocolProvider().getProtocolName(), contact); diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaUIGroup.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaUIGroup.java index 536e7b2..2824d84 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaUIGroup.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/MetaUIGroup.java @@ -12,6 +12,7 @@ import net.java.sip.communicator.impl.gui.*; 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.gui.*; /** * The <tt>MetaUIGroup</tt> is the implementation of the UIGroup for the @@ -21,7 +22,7 @@ import net.java.sip.communicator.service.contactlist.*; * @author Yana Stamcheva */ public class MetaUIGroup - implements UIGroup + extends UIGroupImpl { /** * The <tt>MetaContactGroup</tt>, on which this UI group is based. diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ShowMoreContact.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ShowMoreContact.java index 904142b..d3ed3da 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ShowMoreContact.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/ShowMoreContact.java @@ -14,6 +14,8 @@ import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.contactsource.*; +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.util.swing.*; @@ -22,8 +24,8 @@ import net.java.sip.communicator.util.swing.*; * @author Yana Stamcheva */ public class ShowMoreContact - implements UIContact, - ContactListListener + extends UIContactImpl + implements ContactListListener { /** * The string associated with this contact. @@ -54,7 +56,7 @@ public class ShowMoreContact /** * The count of shown contacts corresponding to the underlying query. */ - private int shownResultsCount = FilterQuery.MAX_EXTERNAL_RESULT_COUNT; + private int shownResultsCount = UIFilterQuery.MAX_EXTERNAL_RESULT_COUNT; /** * Creates an instance of <tt>MoreInfoContact</tt>. @@ -262,7 +264,7 @@ public class ShowMoreContact = new ArrayList<SourceContact>(queryResults); int newCount - = shownResultsCount + FilterQuery.MAX_EXTERNAL_RESULT_COUNT; + = shownResultsCount + UIFilterQuery.MAX_EXTERNAL_RESULT_COUNT; int resultSize = contacts.size(); @@ -283,7 +285,7 @@ public class ShowMoreContact GuiActivator.getContactList().addContact( contactQuery, this, - TreeContactList.getContactSource( + GuiActivator.getContactList().getContactSource( contactQuery.getContactSource()).getUIGroup(), false); @@ -293,6 +295,16 @@ public class ShowMoreContact public void groupClicked(ContactListEvent evt) {} /** + * We're not interested in group selection events here. + */ + public void groupSelected(ContactListEvent evt) {} + + /** + * We're not interested in contact selection events here. + */ + public void contactSelected(ContactListEvent evt) {} + + /** * Returns all custom action buttons for this meta contact. * * @return a list of all custom action buttons for this meta contact diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/SourceUIContact.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/SourceUIContact.java index 0098beb..2bbd010 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/SourceUIContact.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/contactsource/SourceUIContact.java @@ -16,12 +16,11 @@ import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.contactsource.*; -import net.java.sip.communicator.service.customcontactactions.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.globalstatus.*; import net.java.sip.communicator.util.*; import net.java.sip.communicator.util.swing.*; -import org.osgi.framework.*; /** * The <tt>SourceUIContact</tt> is the implementation of the UIContact for the @@ -30,7 +29,7 @@ import org.osgi.framework.*; * @author Yana Stamcheva */ public class SourceUIContact - implements UIContact + extends UIContactImpl { /** * The corresponding <tt>SourceContact</tt>, on which this abstraction is @@ -46,7 +45,7 @@ public class SourceUIContact /** * The parent <tt>UIGroup</tt>. */ - private UIGroup uiGroup; + private ExternalContactSource.SourceUIGroup uiGroup; /** * The search strings for this <tt>UIContact</tt>. @@ -63,7 +62,7 @@ public class SourceUIContact * @param parentGroup the parent <tt>UIGroup</tt> */ public SourceUIContact( SourceContact contact, - UIGroup parentGroup) + ExternalContactSource.SourceUIGroup parentGroup) { this.sourceContact = contact; this.uiGroup = parentGroup; @@ -121,6 +120,11 @@ public class SourceUIContact */ public ImageIcon getStatusIcon() { + PresenceStatus status = sourceContact.getPresenceStatus(); + + if (status != null) + return new ImageIcon(Constants.getStatusIcon(status)); + return new ImageIcon(GlobalStatusEnum.OFFLINE.getStatusIcon()); } @@ -284,14 +288,15 @@ public class SourceUIContact { this.contactNode = contactNode; if (contactNode == null) - ExternalContactSource.removeUIContact(sourceContact); + uiGroup.getParentUISource().removeUIContact(sourceContact); } /** * The implementation of the <tt>UIContactDetail</tt> interface for the * external source <tt>ContactDetail</tt>s. */ - protected static class SourceContactDetail extends UIContactDetail + protected static class SourceContactDetail + extends UIContactDetailImpl { /** * Creates an instance of <tt>SourceContactDetail</tt> by specifying @@ -479,7 +484,7 @@ public class SourceUIContact public Collection<SIPCommButton> getContactCustomActionButtons() { if (sourceContact != null) - return ExternalContactSource + return uiGroup.getParentUISource() .getContactCustomActionButtons(sourceContact); return null; diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationContact.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationContact.java index 95aec4e..aab3c20 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationContact.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationContact.java @@ -14,6 +14,7 @@ import javax.swing.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.impl.gui.utils.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.OperationSetMessageWaiting.*; import net.java.sip.communicator.service.protocol.event.*; @@ -31,8 +32,8 @@ import org.jitsi.service.resources.*; * @author Yana Stamcheva */ public class NotificationContact - implements UIContact, - RegistrationStateChangeListener, + extends UIContact + implements RegistrationStateChangeListener, ProviderPresenceStatusListener { /** @@ -453,7 +454,7 @@ public class NotificationContact * external source <tt>ContactDetail</tt>s. */ private class MessageWaitingDetail - extends UIContactDetail + extends UIContactDetailImpl { /** * Creates an instance of <tt>SourceContactDetail</tt> by specifying diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationContactSource.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationContactSource.java index 5697fdb..efbe4d5 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationContactSource.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationContactSource.java @@ -18,6 +18,7 @@ import org.osgi.framework.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.service.customcontactactions.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.OperationSetMessageWaiting.MessageType; import net.java.sip.communicator.service.protocol.event.*; diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationGroup.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationGroup.java index 0df6e66..d566366 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationGroup.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/notifsource/NotificationGroup.java @@ -13,6 +13,7 @@ import javax.swing.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; @@ -24,7 +25,7 @@ import net.java.sip.communicator.service.protocol.event.*; * @author Yana Stamcheva */ public class NotificationGroup - implements UIGroup + extends UIGroup { /** * The type of the notification message, identifying this group. diff --git a/src/net/java/sip/communicator/impl/gui/utils/InviteContactTransferHandler.java b/src/net/java/sip/communicator/impl/gui/utils/InviteContactTransferHandler.java index 5d96bb2..e4be964 100644 --- a/src/net/java/sip/communicator/impl/gui/utils/InviteContactTransferHandler.java +++ b/src/net/java/sip/communicator/impl/gui/utils/InviteContactTransferHandler.java @@ -14,6 +14,7 @@ import javax.swing.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.service.contactlist.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.*; import net.java.sip.communicator.util.swing.*; diff --git a/src/net/java/sip/communicator/service/contactsource/ContactChangedEvent.java b/src/net/java/sip/communicator/service/contactsource/ContactChangedEvent.java new file mode 100644 index 0000000..ae88932 --- /dev/null +++ b/src/net/java/sip/communicator/service/contactsource/ContactChangedEvent.java @@ -0,0 +1,61 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.contactsource; + +import java.util.*; + +/** + * The <tt>ContactChangedEvent</tt> indicates that a + * <tt>SourceContact</tt> has been updated as a result of a + * <tt>ContactQuery</tt>. + * @author Yana Stamcheva + */ +public class ContactChangedEvent + extends EventObject +{ + /** + * Serial version UID. + */ + private static final long serialVersionUID = 0L; + + /** + * The contact that has been updated. + */ + private final SourceContact contact; + + /** + * Creates a <tt>ContactChangedEvent</tt> by specifying the contact search + * source and the updated <tt>searchContact</tt>. + * @param source the source that triggered this event + * @param contact the updated contact + */ + public ContactChangedEvent(ContactQuery source, + SourceContact contact) + { + super(source); + + this.contact = contact; + } + + /** + * Returns the <tt>ContactQuery</tt> that triggered this event. + * @return the <tt>ContactQuery</tt> that triggered this event + */ + public ContactQuery getQuerySource() + { + return (ContactQuery) source; + } + + /** + * Returns the updated contact. + * @return the updated contact + */ + public SourceContact getContact() + { + return contact; + } +} diff --git a/src/net/java/sip/communicator/service/contactsource/ContactQueryListener.java b/src/net/java/sip/communicator/service/contactsource/ContactQueryListener.java index 0610331..37e57c9 100644 --- a/src/net/java/sip/communicator/service/contactsource/ContactQueryListener.java +++ b/src/net/java/sip/communicator/service/contactsource/ContactQueryListener.java @@ -35,4 +35,11 @@ public interface ContactQueryListener * about the received <tt>SourceContact</tt> */ public void contactRemoved(ContactRemovedEvent event); + + /** + * Indicates that a contact has been updated after a search. + * @param event the <tt>ContactQueryEvent</tt> containing information + * about the updated <tt>SourceContact</tt> + */ + public void contactChanged(ContactChangedEvent event); } diff --git a/src/net/java/sip/communicator/service/contactsource/GenericSourceContact.java b/src/net/java/sip/communicator/service/contactsource/GenericSourceContact.java index ab382ee..4214c16 100644 --- a/src/net/java/sip/communicator/service/contactsource/GenericSourceContact.java +++ b/src/net/java/sip/communicator/service/contactsource/GenericSourceContact.java @@ -192,4 +192,14 @@ public class GenericSourceContact {
this.image = image;
}
+
+ /**
+ * Returns the status of the source contact. And null if such information
+ * is not available.
+ * @return the PresenceStatus representing the state of this source contact.
+ */
+ public PresenceStatus getPresenceStatus()
+ {
+ return null;
+ }
}
diff --git a/src/net/java/sip/communicator/service/contactsource/SourceContact.java b/src/net/java/sip/communicator/service/contactsource/SourceContact.java index d013d7f..99d9bdb 100644 --- a/src/net/java/sip/communicator/service/contactsource/SourceContact.java +++ b/src/net/java/sip/communicator/service/contactsource/SourceContact.java @@ -123,4 +123,11 @@ public interface SourceContact * specified <tt>key</tt> */ public void setData(Object key, Object value); + + /** + * Returns the status of the source contact. And null if such information + * is not available. + * @return the PresenceStatus representing the state of this source contact. + */ + public PresenceStatus getPresenceStatus(); } diff --git a/src/net/java/sip/communicator/service/customcontactactions/CustomContactActionsEvent.java b/src/net/java/sip/communicator/service/customcontactactions/CustomContactActionsEvent.java deleted file mode 100644 index aa7b104..0000000 --- a/src/net/java/sip/communicator/service/customcontactactions/CustomContactActionsEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Jitsi, the OpenSource Java VoIP and Instant Messaging client. - * - * Distributable under LGPL license. - * See terms of license at gnu.org. - */ -package net.java.sip.communicator.service.customcontactactions; - -import java.util.*; - -/** - * An event from custom actions. - * @author Damian Minkov - */ -public class CustomContactActionsEvent - extends EventObject -{ - /** - * Creates the event with source. - * @param source the source of the event. - */ - public CustomContactActionsEvent(Object source) - { - super(source); - } -} diff --git a/src/net/java/sip/communicator/service/customcontactactions/CustomContactActionsListener.java b/src/net/java/sip/communicator/service/customcontactactions/CustomContactActionsListener.java deleted file mode 100644 index e87dbad..0000000 --- a/src/net/java/sip/communicator/service/customcontactactions/CustomContactActionsListener.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Jitsi, the OpenSource Java VoIP and Instant Messaging client. - * - * Distributable under LGPL license. - * See terms of license at gnu.org. - */ -package net.java.sip.communicator.service.customcontactactions; - -/** - * Notifies for events coming from custom actions. - * @author Damian Minkov - */ -public interface CustomContactActionsListener -{ - /** - * Notifies that object has been updated. - * @param event the event containing the source which was updated. - */ - public void updated(CustomContactActionsEvent event); -} diff --git a/src/net/java/sip/communicator/service/customcontactactions/CustomContactActionsService.java b/src/net/java/sip/communicator/service/customcontactactions/CustomContactActionsService.java index 955ee5c..3aaf0ba 100644 --- a/src/net/java/sip/communicator/service/customcontactactions/CustomContactActionsService.java +++ b/src/net/java/sip/communicator/service/customcontactactions/CustomContactActionsService.java @@ -29,22 +29,4 @@ public interface CustomContactActionsService<T> * @return an iterator over a list of <tt>ContactAction</tt>s */ public Iterator<ContactAction<T>> getCustomContactActions(); - - /** - * Registers a CustomContactActionsListener with this service so that it gets - * notifications of various events. - * - * @param listener the <tt>CustomContactActionsListener</tt> to register. - */ - public void addCustomContactActionsListener( - CustomContactActionsListener listener); - - /** - * Unregisters <tt>listener</tt> so that it won't receive any further - * notifications. - * - * @param listener the <tt>CustomContactActionsListener</tt> to unregister. - */ - public void removeCustomContactActionsListener( - CustomContactActionsListener listener); } diff --git a/src/net/java/sip/communicator/service/gui/ContactList.java b/src/net/java/sip/communicator/service/gui/ContactList.java new file mode 100644 index 0000000..1a448ba --- /dev/null +++ b/src/net/java/sip/communicator/service/gui/ContactList.java @@ -0,0 +1,172 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.gui; + +import java.awt.*; +import java.util.*; + +import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.gui.event.*; + +/** + * The <tt>ContactList</tt> interface represents a contact list. All contact + * list components that need to be available as a service could implement + * this interface. + * + * @author Yana Stamcheva + */ +public interface ContactList +{ + /** + * Returns the actual component corresponding to the contact list. + * + * @return the actual component corresponding to the contact list + */ + public Component getComponent(); + + /** + * Returns the list of registered contact sources to search in. + * @return the list of registered contact sources to search in + */ + public Collection<UIContactSource> getContactSources(); + + /** + * Returns the <tt>ExternalContactSource</tt> corresponding to the given + * <tt>ContactSourceService</tt>. + * @param contactSource the <tt>ContactSourceService</tt>, which + * corresponding external source implementation we're looking for + * @return the <tt>ExternalContactSource</tt> corresponding to the given + * <tt>ContactSourceService</tt> + */ + public UIContactSource getContactSource(ContactSourceService contactSource); + + /** + * Adds the given group to this list. + * @param group the <tt>UIGroup</tt> to add + * @param isSorted indicates if the contact should be sorted regarding to + * the <tt>GroupNode</tt> policy + */ + public void addGroup(final UIGroup group, final boolean isSorted); + + /** + * Removes the given group and its children from the list. + * @param group the <tt>UIGroup</tt> to remove + */ + public void removeGroup(final UIGroup group); + + /** + * Adds the given <tt>contact</tt> to this list. + * @param contact the <tt>UIContact</tt> to add + * @param group the <tt>UIGroup</tt> to add to + * @param isContactSorted indicates if the contact should be sorted + * regarding to the <tt>GroupNode</tt> policy + * @param isGroupSorted indicates if the group should be sorted regarding to + * the <tt>GroupNode</tt> policy in case it doesn't exist and should be + * added + */ + public void addContact( final UIContact contact, + final UIGroup group, + final boolean isContactSorted, + final boolean isGroupSorted); + + /** + * Adds the given <tt>contact</tt> to this list. + * @param query the <tt>ContactQuery</tt> that adds the given contact + * @param contact the <tt>UIContact</tt> to add + * @param group the <tt>UIGroup</tt> to add to + * @param isSorted indicates if the contact should be sorted regarding to + * the <tt>GroupNode</tt> policy + */ + public void addContact(final ContactQuery query, + final UIContact contact, + final UIGroup group, + final boolean isSorted); + + /** + * Removes the node corresponding to the given <tt>MetaContact</tt> from + * this list. + * @param contact the <tt>UIContact</tt> to remove + * @param removeEmptyGroup whether we should delete the group if is empty + */ + public void removeContact( final UIContact contact, + final boolean removeEmptyGroup); + + /** + * Removes the node corresponding to the given <tt>MetaContact</tt> from + * this list. + * @param contact the <tt>UIContact</tt> to remove + */ + public void removeContact(UIContact contact); + + /** + * Returns the currently applied filter. + * @return the currently applied filter + */ + public ContactListFilter getCurrentFilter(); + + /** + * Applies the given <tt>filter</tt>. + * @param filter the <tt>ContactListFilter</tt> to apply. + * @return the filter query + */ + public FilterQuery applyFilter(ContactListFilter filter); + + /** + * Applies the default filter. + * @return the filter query that keeps track of the filtering results + */ + public FilterQuery applyDefaultFilter(); + + /** + * Returns the currently selected <tt>UIContact</tt> if there's one. + * + * @return the currently selected <tt>UIContact</tt> if there's one. + */ + public UIContact getSelectedContact(); + + /** + * Returns the currently selected <tt>UIGroup</tt> if there's one. + * + * @return the currently selected <tt>UIGroup</tt> if there's one. + */ + public UIGroup getSelectedGroup(); + + /** + * Selects the given <tt>UIContact</tt> in the contact list. + * + * @param uiContact the contact to select + */ + public void setSelectedContact(UIContact uiContact); + + /** + * Selects the given <tt>UIGroup</tt> in the contact list. + * + * @param uiGroup the group to select + */ + public void setSelectedGroup(UIGroup uiGroup); + + /** + * Adds a listener for <tt>ContactListEvent</tt>s. + * + * @param listener the listener to add + */ + public void addContactListListener(ContactListListener listener); + + /** + * Removes a listener previously added with <tt>addContactListListener</tt>. + * + * @param listener the listener to remove + */ + public void removeContactListListener(ContactListListener listener); + + /** + * Refreshes the given <tt>UIContact</tt>. + * + * @param uiContact the contact to refresh + */ + public void refreshContact(UIContact uiContact); +} diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListFilter.java b/src/net/java/sip/communicator/service/gui/ContactListFilter.java index 901be8f..328415f 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListFilter.java +++ b/src/net/java/sip/communicator/service/gui/ContactListFilter.java @@ -4,7 +4,7 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.main.contactlist; +package net.java.sip.communicator.service.gui; /** * The <tt>ContactListFilter</tt> is an interface meant to be implemented by diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListNode.java b/src/net/java/sip/communicator/service/gui/ContactListNode.java index eb12943..8d9ddaa 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListNode.java +++ b/src/net/java/sip/communicator/service/gui/ContactListNode.java @@ -4,7 +4,7 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.main.contactlist; +package net.java.sip.communicator.service.gui; /** * The <tt>ContactListNode</tt> represents a node in the contact list data diff --git a/src/net/java/sip/communicator/service/gui/FilterQuery.java b/src/net/java/sip/communicator/service/gui/FilterQuery.java new file mode 100644 index 0000000..7b2cda9 --- /dev/null +++ b/src/net/java/sip/communicator/service/gui/FilterQuery.java @@ -0,0 +1,84 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.gui; + +import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.gui.event.*; + +/** + * The <tt>FilterQuery</tt> gives information about a current filtering. + * + * @author Yana Stamcheva + */ +public abstract class FilterQuery +{ + /** + * A listener, which is notified when this query finishes. + */ + private FilterQueryListener filterQueryListener; + + /** + * Adds the given <tt>contactQuery</tt> to the list of filterQueries. + * @param contactQuery the <tt>ContactQuery</tt> to add + */ + public abstract void addContactQuery(Object contactQuery); + + /** + * Sets the <tt>isSucceeded</tt> property. + * @param isSucceeded indicates if this query has succeeded + */ + public abstract void setSucceeded(boolean isSucceeded); + + /** + * Indicates if this query has succeeded. + * @return <tt>true</tt> if this query has succeeded, <tt>false</tt> - + * otherwise + */ + public abstract boolean isSucceeded(); + + /** + * Indicates if this query is canceled. + * @return <tt>true</tt> if this query is canceled, <tt>false</tt> otherwise + */ + public abstract boolean isCanceled(); + + /** + * Cancels this filter query. + */ + public abstract void cancel(); + + /** + * Closes this query to indicate that no more contact sub-queries would be + * added to it. + */ + public abstract void close(); + + /** + * Sets the given <tt>FilterQueryListener</tt>. + * @param l the <tt>FilterQueryListener</tt> to set + */ + public void setQueryListener(FilterQueryListener l) + { + filterQueryListener = l; + } + + /** + * Removes the given query from this filter query, updates the related data + * and notifies interested parties if this was the last query to process. + * @param query the <tt>ContactQuery</tt> to remove. + */ + public abstract void removeQuery(ContactQuery query); + + /** + * Verifies if the given query is contained in this filter query. + * + * @param query the query we're looking for + * @return <tt>true</tt> if the given <tt>query</tt> is contained in this + * filter query, <tt>false</tt> - otherwise + */ + public abstract boolean containsQuery(Object query); +} diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContact.java b/src/net/java/sip/communicator/service/gui/UIContact.java index 770a2a4..774d65e 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContact.java +++ b/src/net/java/sip/communicator/service/gui/UIContact.java @@ -4,13 +4,12 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.main.contactlist; +package net.java.sip.communicator.service.gui; +import java.awt.*; import java.util.*; +import java.util.List; -import javax.swing.*; - -import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.swing.*; @@ -20,21 +19,21 @@ import net.java.sip.communicator.util.swing.*; * * @author Yana Stamcheva */ -public interface UIContact +public abstract class UIContact { /** * Returns the descriptor of this contact. * * @return the descriptor of this contact */ - public Object getDescriptor(); + public abstract Object getDescriptor(); /** * Returns the display name of this contact. * * @return the display name of this contact */ - public String getDisplayName(); + public abstract String getDisplayName(); /** * Returns the display details of this contact. These would be shown @@ -42,33 +41,14 @@ public interface UIContact * * @return the display details of this contact */ - public String getDisplayDetails(); + public abstract String getDisplayDetails(); /** * Returns the index of this contact in its source. * * @return the source index */ - public int getSourceIndex(); - - /** - * Returns the avatar of this contact. - * - * @param isSelected indicates if the contact is selected - * @param width the width of the avatar - * @param height the height of the avatar - * @return the avatar of this contact - */ - public ImageIcon getAvatar(boolean isSelected, int width, int height); - - /** - * Returns the status icon of this contact or null if no status is - * available. - * - * @return the status icon of this contact or null if no status is - * available - */ - public ImageIcon getStatusIcon(); + public abstract int getSourceIndex(); /** * Creates a tool tip for this contact. If such tooltip is @@ -76,21 +56,21 @@ public interface UIContact * * @return the tool tip for this contact descriptor */ - public ExtendedTooltip getToolTip(); + public abstract ExtendedTooltip getToolTip(); /** * Returns the right button menu component. * * @return the right button menu component */ - public JPopupMenu getRightButtonMenu(); + public abstract Component getRightButtonMenu(); /** * Returns the parent group. * * @return the parent group */ - public UIGroup getParentGroup(); + public abstract UIGroup getParentGroup(); /** * Sets the given <tt>UIGroup</tt> to be the parent group of this @@ -98,7 +78,7 @@ public interface UIContact * * @param parentGroup the parent <tt>UIGroup</tt> of this contact */ - public void setParentGroup(UIGroup parentGroup); + public abstract void setParentGroup(UIGroup parentGroup); /** * Returns an <tt>Iterator</tt> over a list of the search strings of this @@ -107,24 +87,7 @@ public interface UIContact * @return an <tt>Iterator</tt> over a list of the search strings of this * contact */ - public Iterator<String> getSearchStrings(); - - /** - * Returns the corresponding <tt>ContactNode</tt>. The <tt>ContactNode</tt> - * is the real node that is stored in the contact list component data model. - * - * @return the corresponding <tt>ContactNode</tt> - */ - public ContactNode getContactNode(); - - /** - * Sets the given <tt>contactNode</tt>. The <tt>ContactNode</tt> - * is the real node that is stored in the contact list component data model. - * - * @param contactNode the <tt>ContactNode</tt> that corresponds to this - * <tt>UIGroup</tt> - */ - public void setContactNode(ContactNode contactNode); + public abstract Iterator<String> getSearchStrings(); /** * Returns the default <tt>ContactDetail</tt> to use for any operations @@ -134,7 +97,7 @@ public interface UIContact * @return the default <tt>ContactDetail</tt> to use for any operations * depending to the given <tt>OperationSet</tt> class */ - public UIContactDetail getDefaultContactDetail( + public abstract UIContactDetail getDefaultContactDetail( Class<? extends OperationSet> opSetClass); /** @@ -145,7 +108,7 @@ public interface UIContact * @return a list of all <tt>UIContactDetail</tt>s corresponding to the * given <tt>OperationSet</tt> class */ - public List<UIContactDetail> getContactDetailsForOperationSet( + public abstract List<UIContactDetail> getContactDetailsForOperationSet( Class<? extends OperationSet> opSetClass); /** @@ -155,12 +118,22 @@ public interface UIContact * @return a list of all <tt>UIContactDetail</tt>s within this * <tt>UIContact</tt> */ - public List<UIContactDetail> getContactDetails(); + public abstract List<UIContactDetail> getContactDetails(); /** * Returns all custom action buttons for this notification contact. * * @return a list of all custom action buttons for this notification contact */ - public Collection<SIPCommButton> getContactCustomActionButtons(); + public abstract Collection<SIPCommButton> getContactCustomActionButtons(); + + /** + * Returns the preferred height of this group in the contact list. + * + * @return the preferred height of this group in the contact list + */ + public int getPreferredHeight() + { + return -1; + } } diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactDetail.java b/src/net/java/sip/communicator/service/gui/UIContactDetail.java index 3790f68..88f8a8e 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactDetail.java +++ b/src/net/java/sip/communicator/service/gui/UIContactDetail.java @@ -4,12 +4,10 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.main.contactlist; +package net.java.sip.communicator.service.gui; import java.util.*; -import javax.swing.*; - import net.java.sip.communicator.service.protocol.*; /** @@ -37,11 +35,6 @@ public abstract class UIContactDetail private final String displayName; /** - * The status icon of this contact detail. - */ - private final ImageIcon statusIcon; - - /** * The <tt>ProtocolProviderService</tt> corresponding to this detail. */ private final ProtocolProviderService protocolProvider; @@ -85,7 +78,6 @@ public abstract class UIContactDetail String displayName, String category, Collection<String> labels, - ImageIcon statusIcon, ProtocolProviderService preferredProvider, String preferredProtocol, Object descriptor) @@ -94,7 +86,6 @@ public abstract class UIContactDetail this.displayName = displayName; this.category = category; this.labels = labels; - this.statusIcon = statusIcon; this.protocolProvider = preferredProvider; this.preferredProtocol = preferredProtocol; this.descriptor = descriptor; @@ -147,16 +138,6 @@ public abstract class UIContactDetail } /** - * Returns the status icon of this contact detail. - * - * @return the status icon of this contact detail - */ - public ImageIcon getStatusIcon() - { - return statusIcon; - } - - /** * Returns the protocol provider preferred for contacting this detail for * the given <tt>OperationSet</tt> class. * @param opSetClass the <tt>OperationSet</tt> class for which we're looking diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactDetailAction.java b/src/net/java/sip/communicator/service/gui/UIContactDetailAction.java index fb20936..1286ee0 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/UIContactDetailAction.java +++ b/src/net/java/sip/communicator/service/gui/UIContactDetailAction.java @@ -4,7 +4,7 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.main.contactlist; +package net.java.sip.communicator.service.gui; /** * Defines an action for an <tt>UIContactDetail</tt>. diff --git a/src/net/java/sip/communicator/service/gui/UIContactSource.java b/src/net/java/sip/communicator/service/gui/UIContactSource.java new file mode 100644 index 0000000..f2b6028 --- /dev/null +++ b/src/net/java/sip/communicator/service/gui/UIContactSource.java @@ -0,0 +1,60 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.gui; + +import net.java.sip.communicator.service.contactsource.*; + +/** + * The user interface representation of a contact source. + * + * @author Yana Stamcheva + */ +public interface UIContactSource +{ + /** + * Returns the UI group for this contact source. There's only one group + * descriptor per external source. + * + * @return the group descriptor + */ + public UIGroup getUIGroup(); + + /** + * Returns the <tt>UIContact</tt> corresponding to the given + * <tt>sourceContact</tt>. + * + * @param sourceContact the <tt>SourceContact</tt>, for which we search a + * corresponding <tt>UIContact</tt> + * @return the <tt>UIContact</tt> corresponding to the given + * <tt>sourceContact</tt> + */ + public UIContact createUIContact(SourceContact sourceContact); + + /** + * Removes the <tt>UIContact</tt> from the given <tt>sourceContact</tt>. + * @param sourceContact the <tt>SourceContact</tt>, which corresponding UI + * contact we would like to remove + */ + public void removeUIContact(SourceContact sourceContact); + + /** + * Returns the <tt>UIContact</tt> corresponding to the given + * <tt>SourceContact</tt>. + * @param sourceContact the <tt>SourceContact</tt>, which corresponding UI + * contact we're looking for + * @return the <tt>UIContact</tt> corresponding to the given + * <tt>MetaContact</tt> + */ + public UIContact getUIContact(SourceContact sourceContact); + + /** + * Returns the corresponding <tt>ContactSourceService</tt>. + * + * @return the corresponding <tt>ContactSourceService</tt> + */ + public ContactSourceService getContactSourceService(); +} diff --git a/src/net/java/sip/communicator/service/gui/UIGroup.java b/src/net/java/sip/communicator/service/gui/UIGroup.java new file mode 100644 index 0000000..9bdfa07 --- /dev/null +++ b/src/net/java/sip/communicator/service/gui/UIGroup.java @@ -0,0 +1,137 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.gui; + +import java.awt.*; + +/** + * The <tt>UIGroup</tt> represents the user interface contact list group. + * + * @author Yana Stamcheva + */ +public abstract class UIGroup +{ + /** + * The preferred height of this group in the contact list. + */ + private int preferredGroupHeight = -1; + + /** + * The display details of this group. + */ + private String displayDetails = ""; + + /** + * Returns the descriptor of the group. This would be the underlying object + * that should provide all other necessary information for the group. + * + * @return the descriptor of the group + */ + public abstract Object getDescriptor(); + + /** + * The display name of the group. The display name is the name to be shown + * in the contact list group row. + * + * @return the display name of the group + */ + public abstract String getDisplayName(); + + /** + * Returns the display details of this contact. These would be shown + * whenever the contact is selected. The display details aren't obligatory, + * so we return an empty string. + * + * @return the display details of this contact + */ + public String getDisplayDetails() + { + return displayDetails; + } + + /** + * Sets the display details of this group. + * + * @return the display details of this group + */ + public void setDisplayDetails(String displayDetails) + { + this.displayDetails = displayDetails; + } + + /** + * Returns the index of this group in its source. In other words this is + * the descriptor index. + * + * @return the index of this group in its source + */ + public abstract int getSourceIndex(); + + /** + * Returns the parent group. + * + * @return the parent group + */ + public abstract UIGroup getParentGroup(); + + /** + * Indicates if the group is collapsed or expanded. + * + * @return <tt>true</tt> to indicate that the group is collapsed, + * <tt>false</tt> to indicate that it's expanded + */ + public abstract boolean isGroupCollapsed(); + + /** + * Returns the count of online child contacts. + * + * @return the count of online child contacts + */ + public abstract int countOnlineChildContacts(); + + /** + * Returns the child contacts count. + * + * @return child contacts count + */ + public abstract int countChildContacts(); + + /** + * Returns the identifier of this group. + * + * @return the identifier of this group + */ + public abstract String getId(); + + /** + * Returns the right button menu for this group. + * + * @return the right button menu component for this group + */ + public abstract Component getRightButtonMenu(); + + /** + * Returns the preferred height of this group in the contact list. + * + * @return the preferred height of this group in the contact list + */ + public int getPreferredHeight() + { + return preferredGroupHeight; + } + + /** + * Sets the preferred height of this group in the contact list. + * + * @param preferredHeight the preferred height of this group in the contact + * list + */ + public void setPreferredHeight(int preferredHeight) + { + this.preferredGroupHeight = preferredHeight; + } +} diff --git a/src/net/java/sip/communicator/service/gui/UIService.java b/src/net/java/sip/communicator/service/gui/UIService.java index 45f4dfd..add11c0 100644 --- a/src/net/java/sip/communicator/service/gui/UIService.java +++ b/src/net/java/sip/communicator/service/gui/UIService.java @@ -455,4 +455,11 @@ public interface UIService * participants to be included into the newly created <tt>Chat</tt> */ public void startChat(String[] participants); + + /** + * Creates a contact list component. + * + * @return the created <tt>ContactList</tt> + */ + public ContactList createContactListComponent(); } diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListEvent.java b/src/net/java/sip/communicator/service/gui/event/ContactListEvent.java index 8a8a9af..623788c 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListEvent.java +++ b/src/net/java/sip/communicator/service/gui/event/ContactListEvent.java @@ -4,10 +4,12 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.main.contactlist; +package net.java.sip.communicator.service.gui.event; import java.util.*; +import net.java.sip.communicator.service.gui.*; + /** * The <tt>ContactListEvent</tt> is triggered when a contact or a group is * clicked in the contact list. @@ -31,6 +33,18 @@ public class ContactListEvent public static final int GROUP_CLICKED = 2; /** + * Indicates that the ContactListEvent instance was triggered by + * selecting a contact in the contact list. + */ + public static final int CONTACT_SELECTED = 3; + + /** + * Indicates that the ContactListEvent instance was triggered by selecting + * a group in the contact list. + */ + public static final int GROUP_SELECTED = 4; + + /** * Indicated the number of click accompanying the event */ private int clickCount; diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListListener.java b/src/net/java/sip/communicator/service/gui/event/ContactListListener.java index e6f31e0..f6fa602 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListListener.java +++ b/src/net/java/sip/communicator/service/gui/event/ContactListListener.java @@ -4,7 +4,7 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.main.contactlist; +package net.java.sip.communicator.service.gui.event; import java.util.*; @@ -18,15 +18,33 @@ public interface ContactListListener extends EventListener { /** * Indicates that a group has been selected. + * * @param evt the <tt>ContactListEvent</tt> that has been triggered from * the user selection */ public void groupClicked(ContactListEvent evt); /** + * Indicates that a group has been selected. + * + * @param evt the <tt>ContactListEvent</tt> that has been triggered from + * the user selection + */ + public void groupSelected(ContactListEvent evt); + + /** * Indicates that a contact has been clicked. + * * @param evt the <tt>ContactListEvent</tt> that has been triggered from * the user click */ public void contactClicked(ContactListEvent evt); + + /** + * Indicates that a contact has been selected. + * + * @param evt the <tt>ContactListEvent</tt> that has been triggered from + * the user selection + */ + public void contactSelected(ContactListEvent evt); } diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/FilterQueryListener.java b/src/net/java/sip/communicator/service/gui/event/FilterQueryListener.java index cd4eaa3..1f7747f 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/FilterQueryListener.java +++ b/src/net/java/sip/communicator/service/gui/event/FilterQueryListener.java @@ -4,7 +4,9 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.main.contactlist; +package net.java.sip.communicator.service.gui.event; + +import net.java.sip.communicator.service.gui.*; /** * The <tt>FilterQueryListener</tt> is notified when a filter query finishes. diff --git a/src/net/java/sip/communicator/service/gui/gui.manifest.mf b/src/net/java/sip/communicator/service/gui/gui.manifest.mf index ea63780..0708371 100644 --- a/src/net/java/sip/communicator/service/gui/gui.manifest.mf +++ b/src/net/java/sip/communicator/service/gui/gui.manifest.mf @@ -5,7 +5,8 @@ Bundle-Vendor: jitsi.org Bundle-Version: 0.0.1 System-Bundle: yes Import-Package: org.osgi.framework, - org.jitsi.service.resources, net.java.sip.communicator.service.resources, + org.jitsi.service.resources, + net.java.sip.communicator.service.resources, net.java.sip.communicator.util Export-Package: net.java.sip.communicator.service.gui, net.java.sip.communicator.service.gui.event, diff --git a/src/net/java/sip/communicator/service/protocol/event/ContactPropertyChangeEvent.java b/src/net/java/sip/communicator/service/protocol/event/ContactPropertyChangeEvent.java index 6f324bc..f69caeb 100644 --- a/src/net/java/sip/communicator/service/protocol/event/ContactPropertyChangeEvent.java +++ b/src/net/java/sip/communicator/service/protocol/event/ContactPropertyChangeEvent.java @@ -36,6 +36,12 @@ public class ContactPropertyChangeEvent public static final String PROPERTY_PERSISTENT_DATA = "PersistentData"; /** + * Indicates that a change has occurred in the display details of the source + * contact. + */ + public static final String PROPERTY_DISPLAY_DETAILS = "DisplayDetails"; + + /** * Creates a ContactPropertyChangeEvent indicating that a change has * occurred for property <tt>propertyName</tt> in the <tt>source</tt> * contact and that its value has changed from <tt>oldValue</tt> to diff --git a/src/net/java/sip/communicator/impl/gui/utils/ExtendedTooltip.java b/src/net/java/sip/communicator/util/swing/ExtendedTooltip.java index 750806b..2c24646 100644 --- a/src/net/java/sip/communicator/impl/gui/utils/ExtendedTooltip.java +++ b/src/net/java/sip/communicator/util/swing/ExtendedTooltip.java @@ -4,7 +4,7 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.utils; +package net.java.sip.communicator.util.swing; import java.awt.*; import java.awt.event.*; @@ -14,7 +14,6 @@ import javax.swing.plaf.*; import javax.swing.plaf.metal.*; import net.java.sip.communicator.util.*; -import net.java.sip.communicator.util.swing.*; /** * The tooltip shown over a contact in the contact list. diff --git a/src/net/java/sip/communicator/impl/gui/customcontrols/SCScrollPane.java b/src/net/java/sip/communicator/util/swing/SIPCommScrollPane.java index d56dab5..84b73f8 100644 --- a/src/net/java/sip/communicator/impl/gui/customcontrols/SCScrollPane.java +++ b/src/net/java/sip/communicator/util/swing/SIPCommScrollPane.java @@ -4,7 +4,7 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.customcontrols; +package net.java.sip.communicator.util.swing; import java.awt.*; import java.awt.image.*; @@ -13,10 +13,8 @@ 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.*; import org.jitsi.util.*; @@ -29,7 +27,7 @@ import org.jitsi.util.*; * @author Yana Stamcheva * @author Adam Netocny */ -public class SCScrollPane +public class SIPCommScrollPane extends JScrollPane implements Skinnable { @@ -38,7 +36,7 @@ public class SCScrollPane /** * Creates an <tt>SCSCrollPane</tt>. */ - public SCScrollPane() + public SIPCommScrollPane() { this.setBorder(BorderFactory.createMatteBorder( 1, 0, 1, 0, Color.GRAY)); @@ -110,7 +108,7 @@ public class SCScrollPane { return Boolean.parseBoolean( - GuiActivator.getResources().getSettingsString(key)); + UtilActivator.getResources().getSettingsString(key)); } /** @@ -166,7 +164,7 @@ public class SCScrollPane if(getSettingsBoolean("impl.gui.IS_CONTACT_LIST_IMG_BG_ENABLED")) { bgImage = - ImageLoader.getImage(ImageLoader.MAIN_WINDOW_BACKGROUND); + UtilActivator.getImage("service.gui.MAIN_WINDOW_BACKGROUND"); if (getSettingsBoolean( "impl.gui.IS_CONTACT_LIST_TEXTURE_BG_ENABLED") @@ -182,7 +180,7 @@ public class SCScrollPane { texture = null; color = - new Color(GuiActivator.getResources().getColor( + new Color(UtilActivator.getResources().getColor( "service.gui.CONTACT_LIST_BACKGROUND")); } } diff --git a/src/net/java/sip/communicator/impl/gui/lookandfeel/SIPCommTreeUI.java b/src/net/java/sip/communicator/util/swing/plaf/SIPCommTreeUI.java index f67dc0c..7aff92f 100644 --- a/src/net/java/sip/communicator/impl/gui/lookandfeel/SIPCommTreeUI.java +++ b/src/net/java/sip/communicator/util/swing/plaf/SIPCommTreeUI.java @@ -4,9 +4,10 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.lookandfeel; +package net.java.sip.communicator.util.swing.plaf; import java.awt.*; +import java.awt.Container; import java.awt.event.*; import javax.swing.*; @@ -15,9 +16,6 @@ import javax.swing.plaf.*; import javax.swing.plaf.basic.*; import javax.swing.tree.*; -import net.java.sip.communicator.impl.gui.main.contactlist.*; -import net.java.sip.communicator.impl.gui.main.contactlist.contactsource.*; - /** * SIPCommTreeUI implementation. * @@ -188,21 +186,7 @@ public class SIPCommTreeUI */ protected void selectPathForEvent(TreePath path, MouseEvent event) { - Object lastComponent = path.getLastPathComponent(); - - // Open right button menu when right mouse is pressed. - if (lastComponent instanceof ContactNode) - { - UIContact uiContact - = ((ContactNode) lastComponent).getContactDescriptor(); - - if (!(uiContact instanceof ShowMoreContact)) - { - super.selectPathForEvent(path, event); - } - } - else - super.selectPathForEvent(path, event); + super.selectPathForEvent(path, event); } /** diff --git a/src/net/java/sip/communicator/util/util.manifest.mf b/src/net/java/sip/communicator/util/util.manifest.mf index 8f2c502..004bc74 100644 --- a/src/net/java/sip/communicator/util/util.manifest.mf +++ b/src/net/java/sip/communicator/util/util.manifest.mf @@ -20,6 +20,7 @@ Import-Package: com.sun.awt, javax.swing.text, javax.swing.text.html, javax.swing.text.html.parser, + javax.swing.tree, javax.xml.parsers, javax.xml.transform, javax.xml.transform.dom, |