package org.chartsy.chatsy.chatimpl.search.users;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.ReportedData;
import org.chartsy.chatsy.chat.ChatManager;
import org.chartsy.chatsy.chat.ChatsyManager;
import org.chartsy.chatsy.chat.component.Table;
import org.chartsy.chatsy.chat.ui.ChatContainer;
import org.chartsy.chatsy.chat.ui.ChatRoom;
import org.chartsy.chatsy.chat.ui.RosterDialog;
import org.chartsy.chatsy.chat.util.ModelUtil;
import org.chartsy.chatsy.chat.util.log.Log;
import org.chartsy.chatsy.chatimpl.profile.VCardManager;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableColumn;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class UserSearchResults extends JPanel
{
private UsersInfoTable resultsTable;
public UserSearchResults()
{
setLayout(new BorderLayout());
}
public void showUsersFound(ReportedData data)
{
List<String> columnList = new ArrayList<String>();
Iterator columns = data.getColumns();
while (columns.hasNext())
{
ReportedData.Column column = (ReportedData.Column)columns.next();
String label = column.getLabel();
columnList.add(label);
}
if (resultsTable == null)
{
resultsTable = new UsersInfoTable(columnList.toArray(new String[columnList.size()]));
final JScrollPane scrollPane = new JScrollPane(resultsTable);
scrollPane.getViewport().setBackground(Color.white);
add(scrollPane, BorderLayout.CENTER);
resultsTable.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
if (e.getClickCount() == 2)
{
int row = resultsTable.getSelectedRow();
openChatRoom(row);
}
}
public void mouseReleased(MouseEvent e)
{
checkPopup(e);
}
public void mousePressed(MouseEvent e)
{
checkPopup(e);
}
});
}
else
{
resultsTable.clearTable();
}
Iterator rows = data.getRows();
List<String> modelList;
while (rows.hasNext())
{
modelList = new ArrayList<String>();
ReportedData.Row row = (ReportedData.Row)rows.next();
for (int i = 0; i < resultsTable.getColumnCount(); i++)
{
String tableValue = (String)resultsTable.getTableHeader().getColumnModel().getColumn(i).getHeaderValue();
Iterator columnIterator = data.getColumns();
while (columnIterator.hasNext())
{
ReportedData.Column column = (ReportedData.Column)columnIterator.next();
if (column.getLabel().equals(tableValue))
{
tableValue = column.getVariable();
break;
}
}
String modelValue = getFirstValue(row, tableValue);
modelList.add(modelValue);
}
resultsTable.getTableModel().addRow(modelList.toArray());
}
}
private void checkPopup(MouseEvent e)
{
if (!e.isPopupTrigger())
return;
final int row = resultsTable.rowAtPoint(e.getPoint());
final JPopupMenu menu = new JPopupMenu();
Action addContactAction = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
RosterDialog dialog = new RosterDialog();
String jid = (String)resultsTable.getValueAt(row, 0);
TableColumn column = null;
try
{
column = resultsTable.getColumn("Username");
}
catch (Exception ex)
{
try
{
column = resultsTable.getColumn("nick");
}
catch (Exception e1)
{
}
}
if (column != null)
{
int col = column.getModelIndex();
String nickname = (String)resultsTable.getValueAt(row, col);
if (!ModelUtil.hasLength(nickname))
nickname = StringUtils.parseName(jid);
dialog.setDefaultNickname(nickname);
}
dialog.setDefaultJID(jid);
dialog.showRosterDialog();
}
};
Action chatAction = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
openChatRoom(row);
}
};
Action profileAction = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
VCardManager vcardSupport = ChatsyManager.getVCardManager();
String jid = (String)resultsTable.getValueAt(row, 0);
vcardSupport.viewProfile(jid, resultsTable);
}
};
final JMenuItem addAsContact = new JMenuItem(addContactAction);
addContactAction.putValue(Action.NAME, "Add as contact");
menu.add(addAsContact);
final JMenuItem chatMenu = new JMenuItem(chatAction);
chatAction.putValue(Action.NAME, "Start Chat");
menu.add(chatMenu);
final JMenuItem viewProfileMenu = new JMenuItem(profileAction);
profileAction.putValue(Action.NAME, "View profile");
menu.add(viewProfileMenu);
menu.show(resultsTable, e.getX(), e.getY());
}
private final class UsersInfoTable extends Table
{
UsersInfoTable(String[] headers)
{
super(headers);
getColumnModel().setColumnMargin(0);
setSelectionBackground(Table.SELECTION_COLOR);
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setRowSelectionAllowed(true);
}
}
public String getFirstValue(ReportedData.Row row, String key)
{
try
{
final Iterator rows = row.getValues(key);
while (rows.hasNext())
return (String)rows.next();
}
catch (Exception e)
{
Log.error("Error retrieving the first value.", e);
}
return null;
}
private void openChatRoom(int row)
{
String jid = (String)resultsTable.getValueAt(row, 0);
String nickname = StringUtils.parseName(jid);
TableColumn column;
try
{
column = resultsTable.getColumn("nick");
int col = column.getModelIndex();
nickname = (String)resultsTable.getValueAt(row, col);
if (!ModelUtil.hasLength(nickname))
nickname = StringUtils.parseName(jid);
}
catch (Exception e1)
{
}
ChatManager chatManager = ChatsyManager.getChatManager();
ChatRoom chatRoom = chatManager.createChatRoom(jid, nickname, nickname);
ChatContainer chatRooms = chatManager.getChatContainer();
chatRooms.activateChatRoom(chatRoom);
}
public void clearTable()
{
if (resultsTable != null)
resultsTable.clearTable();
}
}