mirror of https://github.com/sipwise/jitsi.git
A new custom contact action service allowing to represent more actions for a contact entry in the contact list.
parent
3301f2a10d
commit
8992d147b7
@ -0,0 +1,233 @@
|
||||
/*
|
||||
* 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.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.awt.image.*;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import net.java.sip.communicator.impl.gui.*;
|
||||
import net.java.sip.communicator.impl.gui.utils.*;
|
||||
import net.java.sip.communicator.service.protocol.*;
|
||||
import net.java.sip.communicator.util.skin.*;
|
||||
import net.java.sip.communicator.util.swing.*;
|
||||
|
||||
/**
|
||||
* The <tt>ChooseCallAccountDialog</tt> is the dialog shown when calling a
|
||||
* contact in order to let the user choose the account he'd prefer to use in
|
||||
* order to call this contact.
|
||||
*
|
||||
* @author Yana Stamcheva
|
||||
* @author Adam Netocny
|
||||
*/
|
||||
public class ChooseUIContactDetailPopupMenu
|
||||
extends SIPCommPopupMenu
|
||||
implements Skinnable
|
||||
{
|
||||
/**
|
||||
* Serial version UID.
|
||||
*/
|
||||
private static final long serialVersionUID = 0L;
|
||||
|
||||
/**
|
||||
* The invoker component.
|
||||
*/
|
||||
private final JComponent invoker;
|
||||
|
||||
/**
|
||||
* Creates this dialog by specifying a list of telephony contacts to choose
|
||||
* from.
|
||||
*
|
||||
* @param invoker the invoker of this pop up
|
||||
* @param telephonyObjects the list of telephony contacts to select through
|
||||
* @param opSetClass the operation class, which indicates what action would
|
||||
* be performed if an item is selected from the list
|
||||
*/
|
||||
public ChooseUIContactDetailPopupMenu(JComponent invoker,
|
||||
List<UIContactDetail> contactDetails,
|
||||
UIContactDetailAction action)
|
||||
{
|
||||
this.invoker = invoker;
|
||||
this.init(GuiActivator.getResources()
|
||||
.getI18NString("service.gui.CHOOSE_CONTACT"));
|
||||
|
||||
for (UIContactDetail detail : contactDetails)
|
||||
{
|
||||
this.addContactDetailItem(detail, action);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes and add some common components.
|
||||
*
|
||||
* @param infoString the string we'd like to show on the top of this
|
||||
* popup menu
|
||||
*/
|
||||
private void init(String infoString)
|
||||
{
|
||||
setInvoker(invoker);
|
||||
|
||||
this.add(createInfoLabel(infoString));
|
||||
|
||||
this.addSeparator();
|
||||
|
||||
this.setFocusable(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the given <tt>telephonyContact</tt> to the list of available
|
||||
* telephony contact.
|
||||
*
|
||||
* @param telephonyContact the telephony contact to add
|
||||
* @param opSetClass the operation set class, that indicates the action that
|
||||
* would be performed when an item is selected
|
||||
*/
|
||||
private void addContactDetailItem(
|
||||
final UIContactDetail contactDetail,
|
||||
final UIContactDetailAction contactDetailAction)
|
||||
{
|
||||
final ContactMenuItem contactItem
|
||||
= new ContactMenuItem(contactDetail);
|
||||
|
||||
contactItem.addActionListener(new ActionListener()
|
||||
{
|
||||
public void actionPerformed(ActionEvent e)
|
||||
{
|
||||
contactDetailAction.actionPerformed(contactDetail);
|
||||
|
||||
ChooseUIContactDetailPopupMenu.this.setVisible(false);
|
||||
}
|
||||
});
|
||||
|
||||
add(contactItem);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the dialog at the given location.
|
||||
*
|
||||
* @param x the x coordinate
|
||||
* @param y the y coordinate
|
||||
*/
|
||||
public void showPopupMenu(int x, int y)
|
||||
{
|
||||
setLocation(x, y);
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows this popup menu regarding to its invoker location.
|
||||
*/
|
||||
public void showPopupMenu()
|
||||
{
|
||||
Point location = new Point(invoker.getX(),
|
||||
invoker.getY() + invoker.getHeight());
|
||||
|
||||
SwingUtilities
|
||||
.convertPointToScreen(location, invoker.getParent());
|
||||
setLocation(location);
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the info label.
|
||||
*
|
||||
* @param infoString the string we'd like to show on the top of this
|
||||
* popup menu
|
||||
* @return the created info label
|
||||
*/
|
||||
private Component createInfoLabel(String infoString)
|
||||
{
|
||||
JMenuItem infoLabel = new JMenuItem();
|
||||
|
||||
infoLabel.setEnabled(false);
|
||||
infoLabel.setFocusable(false);
|
||||
|
||||
infoLabel.setText("<html><b>" + infoString + "</b></html>");
|
||||
|
||||
return infoLabel;
|
||||
}
|
||||
|
||||
/**
|
||||
* A custom menu item corresponding to a specific protocol <tt>Contact</tt>.
|
||||
*/
|
||||
private class ContactMenuItem
|
||||
extends JMenuItem
|
||||
implements Skinnable
|
||||
{
|
||||
/**
|
||||
* Serial version UID.
|
||||
*/
|
||||
private static final long serialVersionUID = 0L;
|
||||
|
||||
private final UIContactDetail contact;
|
||||
|
||||
public ContactMenuItem(UIContactDetail contact)
|
||||
{
|
||||
this.contact = contact;
|
||||
|
||||
String itemName = "<html>";
|
||||
Iterator<String> labels = contact.getLabels();
|
||||
|
||||
if (labels != null && labels.hasNext())
|
||||
while (labels.hasNext())
|
||||
itemName += "<b style=\"color: gray\">"
|
||||
+ labels.next().toLowerCase() + "</b> ";
|
||||
|
||||
itemName += contact.getAddress() + "</html>";
|
||||
|
||||
this.setText(itemName);
|
||||
loadSkin();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reloads contact icon.
|
||||
*/
|
||||
public void loadSkin()
|
||||
{
|
||||
ImageIcon contactIcon = contact.getStatusIcon();
|
||||
|
||||
if (contactIcon == null)
|
||||
{
|
||||
PresenceStatus status = contact.getPresenceStatus();
|
||||
|
||||
BufferedImage statusIcon = null;
|
||||
if (status != null)
|
||||
statusIcon = Constants.getStatusIcon(status);
|
||||
|
||||
if (statusIcon != null)
|
||||
contactIcon = ImageLoader.getIndexedProtocolIcon(
|
||||
statusIcon,
|
||||
contact.getPreferredProtocolProvider(null));
|
||||
}
|
||||
|
||||
if (contactIcon != null)
|
||||
this.setIcon(ImageLoader.getIndexedProtocolIcon(
|
||||
contactIcon.getImage(),
|
||||
contact.getPreferredProtocolProvider(null)));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reloads all menu items.
|
||||
*/
|
||||
public void loadSkin()
|
||||
{
|
||||
Component[] components = getComponents();
|
||||
for(Component component : components)
|
||||
{
|
||||
if(component instanceof Skinnable)
|
||||
{
|
||||
Skinnable skinnableComponent = (Skinnable) component;
|
||||
skinnableComponent.loadSkin();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* Defines an action for an <tt>UIContactDetail</tt>.
|
||||
*
|
||||
* @author Yana Stamcheva
|
||||
*/
|
||||
public interface UIContactDetailAction
|
||||
{
|
||||
/**
|
||||
* Indicates this action is executed for the given <tt>UIContactDetail</tt>.
|
||||
*
|
||||
* @param contactDetail the <tt>UIContactDetail</tt> for which this action
|
||||
* is performed
|
||||
*/
|
||||
public void actionPerformed (UIContactDetail contactDetail);
|
||||
}
|
||||
@ -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.service.customcontactactions;
|
||||
|
||||
import net.java.sip.communicator.service.protocol.*;
|
||||
|
||||
/**
|
||||
* A custom contact action, used to define an action that can be represented in
|
||||
* the contact list entry in the user interface.
|
||||
*
|
||||
* @author Damian Minkov
|
||||
* @author Yana Stamcheva
|
||||
*/
|
||||
public interface ContactAction<T>
|
||||
{
|
||||
/**
|
||||
* Invoked when an action occurs.
|
||||
*
|
||||
* @param actionSource the source of the action
|
||||
*/
|
||||
public void actionPerformed(T actionSource)
|
||||
throws OperationFailedException;
|
||||
|
||||
/**
|
||||
* The icon used by the UI to visualise this action.
|
||||
* @return the button icon.
|
||||
*/
|
||||
public byte[] getIcon();
|
||||
|
||||
/**
|
||||
* The icon used by the UI to visualise this action.
|
||||
* @return the button icon.
|
||||
*/
|
||||
public byte[] getPressedIcon();
|
||||
|
||||
/**
|
||||
* Indicates if this action is visible for the given <tt>actionSource</tt>.
|
||||
*
|
||||
* @param actionSource the action source for which we're verifying the
|
||||
* action.
|
||||
* @return <tt>true</tt> if the action should be visible for the given
|
||||
* <tt>actionSource</tt>, <tt>false</tt> - otherwise
|
||||
*/
|
||||
public boolean isVisible(T actionSource);
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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.*;
|
||||
|
||||
/**
|
||||
* The <tt>CustomContactActionsService</tt> can be used to define a set of
|
||||
* custom actions for a contact list entry.
|
||||
*
|
||||
* @author Damian Minkov
|
||||
*/
|
||||
public interface CustomContactActionsService<T>
|
||||
{
|
||||
/**
|
||||
* Returns the template class that this service has been initialized with
|
||||
*
|
||||
* @return the template class
|
||||
*/
|
||||
public Class<T> getContactSourceClass();
|
||||
|
||||
/**
|
||||
* Returns all custom actions defined by this service.
|
||||
*
|
||||
* @return an iterator over a list of <tt>ContactAction</tt>s
|
||||
*/
|
||||
public Iterator<ContactAction<T>> getCustomContactActions();
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
Bundle-Name: Custom Contact Actions
|
||||
Bundle-Description: Custom Contact Actions
|
||||
Bundle-Vendor: jitsi.org
|
||||
Bundle-Version: 0.0.1
|
||||
System-Bundle: yes
|
||||
Import-Package: net.java.sip.communicator.service.protocol
|
||||
Export-Package: net.java.sip.communicator.service.customcontactactions
|
||||
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* 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.protocol;
|
||||
|
||||
/**
|
||||
* A notification message that is used to deliver notifications for an waiting
|
||||
* server message.
|
||||
*
|
||||
* @see MessageWaitingListener, MessageWaitingEvent
|
||||
*
|
||||
* @author Yana Stamcheva
|
||||
*/
|
||||
public class NotificationMessage
|
||||
{
|
||||
/**
|
||||
* The contact from which the message is coming.
|
||||
*/
|
||||
private final String fromContact;
|
||||
|
||||
/**
|
||||
* The name of the group of messages to which this message belongs,
|
||||
* if there's any.
|
||||
*/
|
||||
private final String messageGroup;
|
||||
|
||||
/**
|
||||
* Additional details related to the message.
|
||||
*/
|
||||
private final String messageDetails;
|
||||
|
||||
/**
|
||||
* The text of the message.
|
||||
*/
|
||||
private final String messageText;
|
||||
|
||||
/**
|
||||
* Creates an instance of <tt>NotificationMessage</tt> by specifying the
|
||||
* name of the contact from which the message is, the message group, any
|
||||
* additional details and the message actual text.
|
||||
*
|
||||
* @param fromContact the contact from which the message is coming
|
||||
* @param messageGroup the name of the group of messages to which this
|
||||
* message belongs
|
||||
* @param messageDetails additional details related to the message
|
||||
* @param messageText the text of the message
|
||||
*/
|
||||
public NotificationMessage( String fromContact,
|
||||
String messageGroup,
|
||||
String messageDetails,
|
||||
String messageText)
|
||||
{
|
||||
this.fromContact = fromContact;
|
||||
this.messageGroup = messageGroup;
|
||||
this.messageDetails = messageDetails;
|
||||
this.messageText = messageText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the contact from which the message is coming
|
||||
*
|
||||
* @return the contact from which the message is coming
|
||||
*/
|
||||
public String getFromContact()
|
||||
{
|
||||
return fromContact;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the group of messages to which this
|
||||
* message belongs.
|
||||
*
|
||||
* @return the name of the group of messages to which this
|
||||
* message belongs
|
||||
*/
|
||||
public String getMessageGroup()
|
||||
{
|
||||
return messageGroup;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the additional details related to the message
|
||||
*
|
||||
* @return the additional details related to the message
|
||||
*/
|
||||
public String getMessageDetails()
|
||||
{
|
||||
return messageDetails;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text of the message
|
||||
*
|
||||
* @return the text of the message
|
||||
*/
|
||||
public String getMessageText()
|
||||
{
|
||||
return messageText;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue