mirror of
https://github.com/igniterealtime/Spark.git
synced 2025-12-01 12:27:58 +00:00
Added simple my favorite contacts.
git-svn-id: http://svn.igniterealtime.org/svn/repos/spark/trunk@7455 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
@ -0,0 +1,301 @@
|
||||
/**
|
||||
* $Revision: $
|
||||
* $Date: $
|
||||
*
|
||||
* Copyright (C) 2006 Jive Software. All rights reserved.
|
||||
*
|
||||
* This software is published under the terms of the GNU Lesser Public License (LGPL),
|
||||
* a copy of which is included in this distribution.
|
||||
*/
|
||||
|
||||
package org.jivesoftware.sparkimpl.plugin.history;
|
||||
|
||||
import org.jivesoftware.resource.SparkRes;
|
||||
import org.jivesoftware.spark.SparkManager;
|
||||
import org.jivesoftware.spark.plugin.Plugin;
|
||||
import org.jivesoftware.spark.ui.ContactItem;
|
||||
import org.jivesoftware.spark.ui.ContactList;
|
||||
import org.jivesoftware.spark.util.GraphicUtils;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Font;
|
||||
import java.awt.Window;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.FocusListener;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.DefaultListModel;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.KeyStroke;
|
||||
import javax.swing.ListCellRenderer;
|
||||
|
||||
/**
|
||||
* Adds a simple feature to list your most "Popular" contacts. Popular contacts is basically who
|
||||
* you talk with the most.
|
||||
*/
|
||||
public class FavoriteContactsPlugin implements Plugin {
|
||||
|
||||
private File transcriptDir;
|
||||
|
||||
private final DefaultListModel model = new DefaultListModel();
|
||||
private JList contacts;
|
||||
private Window window;
|
||||
|
||||
private Map<JLabel, String> jidMap = new HashMap<JLabel, String>();
|
||||
|
||||
public void initialize() {
|
||||
transcriptDir = new File(SparkManager.getUserDirectory(), "transcripts");
|
||||
|
||||
contacts = new JList(model);
|
||||
contacts.setCellRenderer(new InternalRenderer());
|
||||
|
||||
window = new Window(SparkManager.getMainWindow());
|
||||
|
||||
|
||||
final JPanel mainPanel = new JPanel(new BorderLayout());
|
||||
final JLabel titleLabel = new JLabel("My Favorite Contacts");
|
||||
titleLabel.setFont(new Font("Dialog", Font.BOLD, 11));
|
||||
titleLabel.setHorizontalAlignment(JLabel.CENTER);
|
||||
mainPanel.add(titleLabel, BorderLayout.NORTH);
|
||||
mainPanel.add(contacts, BorderLayout.CENTER);
|
||||
mainPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
|
||||
|
||||
window.add(mainPanel);
|
||||
|
||||
// Add Listeners
|
||||
contacts.addMouseListener(new MouseAdapter() {
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
if (e.getClickCount() == 2) {
|
||||
final JLabel label = (JLabel)contacts.getSelectedValue();
|
||||
String user = jidMap.get(label);
|
||||
if (user != null) {
|
||||
final String contactUsername = SparkManager.getUserManager().getUserNicknameFromJID(user);
|
||||
SparkManager.getChatManager().activateChat(user, contactUsername);
|
||||
window.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
contacts.addKeyListener(new KeyAdapter() {
|
||||
public void keyReleased(KeyEvent e) {
|
||||
if (e.getKeyChar() == KeyEvent.VK_ENTER) {
|
||||
final JLabel label = (JLabel)contacts.getSelectedValue();
|
||||
String user = jidMap.get(label);
|
||||
if (user != null) {
|
||||
final String contactUsername = SparkManager.getUserManager().getUserNicknameFromJID(user);
|
||||
SparkManager.getChatManager().activateChat(user, contactUsername);
|
||||
window.dispose();
|
||||
}
|
||||
}
|
||||
else if (e.getKeyChar() == KeyEvent.VK_ESCAPE) {
|
||||
window.dispose();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
contacts.addFocusListener(new FocusListener() {
|
||||
public void focusGained(FocusEvent e) {
|
||||
|
||||
}
|
||||
|
||||
public void focusLost(FocusEvent e) {
|
||||
window.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
// Add Keymapping to ContactList
|
||||
SparkManager.getMainWindow().getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("control T"), "favoritePeople");
|
||||
SparkManager.getMainWindow().getRootPane().getActionMap().put("favoritePeople", new AbstractAction("favoritePeople") {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
// Show History Popup
|
||||
showPopup();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Displays your favorite contacts.
|
||||
*/
|
||||
private void showPopup() {
|
||||
// Get Transcript Directory
|
||||
if (!transcriptDir.exists()) {
|
||||
return;
|
||||
}
|
||||
|
||||
jidMap.clear();
|
||||
model.clear();
|
||||
|
||||
|
||||
final ContactList contactList = SparkManager.getWorkspace().getContactList();
|
||||
|
||||
for (final String user : getFavoriteContacts()) {
|
||||
ContactItem contactItem = contactList.getContactItemByJID(user);
|
||||
Icon icon = null;
|
||||
if (contactItem != null) {
|
||||
icon = contactItem.getIcon();
|
||||
if (icon == null) {
|
||||
icon = SparkRes.getImageIcon(SparkRes.CLEAR_BALL_ICON);
|
||||
}
|
||||
|
||||
JLabel label = new JLabel();
|
||||
label.setText(contactItem.getNickname());
|
||||
label.setIcon(icon);
|
||||
|
||||
model.addElement(label);
|
||||
jidMap.put(label, user);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
window.setSize(200, 200);
|
||||
GraphicUtils.centerWindowOnComponent(window, SparkManager.getMainWindow());
|
||||
|
||||
|
||||
if (model.size() > 0) {
|
||||
contacts.setSelectedIndex(0);
|
||||
}
|
||||
|
||||
window.setVisible(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a collection of your most popular contacts based on previous conversations.
|
||||
*
|
||||
* @return the collection of favorite people (jids)
|
||||
*/
|
||||
private Collection<String> getFavoriteContacts() {
|
||||
if (!transcriptDir.exists()) {
|
||||
return Collections.EMPTY_LIST;
|
||||
}
|
||||
|
||||
final File[] transcriptFiles = transcriptDir.listFiles(new FilenameFilter() {
|
||||
public boolean accept(File dir, String name) {
|
||||
if (!name.contains("_current") && !name.equals("conversations.xml")) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
final List<File> files = Arrays.asList(transcriptFiles);
|
||||
|
||||
Collections.sort(files, sizeComparator);
|
||||
|
||||
int size = files.size();
|
||||
if (size > 10) {
|
||||
size = 10;
|
||||
}
|
||||
|
||||
final List<String> jidList = new ArrayList<String>();
|
||||
for (int i = 0; i < size; i++) {
|
||||
File file = files.get(i);
|
||||
String jid = null;
|
||||
|
||||
final String fileName = file.getName();
|
||||
final int dot = fileName.lastIndexOf('.');
|
||||
jid = dot > 0 ? fileName.substring(0, dot) : fileName;
|
||||
|
||||
jidList.add(jid);
|
||||
}
|
||||
|
||||
return jidList;
|
||||
}
|
||||
|
||||
|
||||
public void shutdown() {
|
||||
|
||||
}
|
||||
|
||||
public boolean canShutDown() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void uninstall() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal handling of a JLabel Renderer.
|
||||
*/
|
||||
public class InternalRenderer extends JLabel implements ListCellRenderer {
|
||||
|
||||
/**
|
||||
* Construct Default Renderer.
|
||||
*/
|
||||
public InternalRenderer() {
|
||||
setOpaque(true);
|
||||
}
|
||||
|
||||
public Component getListCellRendererComponent(JList list,
|
||||
Object value,
|
||||
int index,
|
||||
boolean isSelected,
|
||||
boolean cellHasFocus) {
|
||||
if (isSelected) {
|
||||
setBackground(list.getSelectionBackground());
|
||||
setForeground(list.getSelectionForeground());
|
||||
}
|
||||
else {
|
||||
setBackground(list.getBackground());
|
||||
setForeground(list.getForeground());
|
||||
}
|
||||
|
||||
JLabel label = (JLabel)value;
|
||||
setText(label.getText());
|
||||
setIcon(label.getIcon());
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files by largest to smallest.
|
||||
*/
|
||||
final Comparator sizeComparator = new Comparator() {
|
||||
public int compare(Object o1, Object o2) {
|
||||
final File item1 = (File)o1;
|
||||
final File item2 = (File)o2;
|
||||
|
||||
long int1 = item1.length();
|
||||
long int2 = item2.length();
|
||||
|
||||
if (int1 == int2) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (int1 > int2) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (int1 < int2) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
@ -185,4 +185,13 @@
|
||||
<description>Adds simple extras to use with the Contact List.</description>
|
||||
<class>org.jivesoftware.sparkimpl.plugin.chat.ContactListAssistantPlugin</class>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<name>My Favorites</name>
|
||||
<version>1.0</version>
|
||||
<author>Derek DeMoro</author>
|
||||
<homePage>http://www.jivesoftware.com</homePage>
|
||||
<email>derek@jivesoftware.com</email>
|
||||
<description>Adds simple extras to show your most popular contacts.</description>
|
||||
<class>org.jivesoftware.sparkimpl.plugin.history.FavoriteContactsPlugin</class>
|
||||
</plugin>
|
||||
</plugins>
|
||||
|
||||
Reference in New Issue
Block a user