package org.chartsy.chatsy.chatimpl.search.users;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smackx.Form;
import org.jivesoftware.smackx.ReportedData;
import org.jivesoftware.smackx.search.UserSearchManager;
import org.chartsy.chatsy.chat.ChatsyManager;
import org.chartsy.chatsy.chat.ui.DataFormUI;
import org.chartsy.chatsy.chat.util.SwingWorker;
import org.chartsy.chatsy.chat.util.log.Log;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import org.chartsy.chatsy.chat.util.StringUtils;
public class SearchForm extends JPanel
{
private UserSearchResults searchResults;
private DataFormUI questionForm;
private UserSearchManager searchManager;
private String serviceName;
private Form searchForm;
public SearchForm(String service)
{
this.serviceName = service;
searchManager = new UserSearchManager(ChatsyManager.getConnection());
setLayout(new GridBagLayout());
try
{
searchForm = searchManager.getSearchForm(service);
}
catch (XMPPException e)
{
Log.error("Unable to load search services.", e);
JOptionPane.showMessageDialog(
ChatsyManager.getMainWindow(),
"Unable to contact search service",
"Notification",
JOptionPane.ERROR_MESSAGE);
return;
}
searchManager = new UserSearchManager(ChatsyManager.getConnection());
questionForm = new DataFormUI(searchForm);
questionForm.setBorder(BorderFactory.createTitledBorder("Search Form"));
add(questionForm, new GridBagConstraints(0, 0, 3, 1, 1.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.BOTH,
new Insets(5, 5, 5, 5), 0, 0));
final JButton searchButton = new JButton("Search");
add(searchButton, new GridBagConstraints(0, 1, 3, 1, 1.0, 0.0,
GridBagConstraints.EAST, GridBagConstraints.NONE,
new Insets(5, 5, 5, 5), 0, 0));
searchButton.addActionListener(new ActionListener()
{
@Override public void actionPerformed(ActionEvent e)
{
performSearch();
}
});
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
String enterString = StringUtils.keyStroke2String(enter);
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(enterString), "enter");
getActionMap().put("enter", new AbstractAction("enter")
{
@Override public void actionPerformed(ActionEvent evt)
{
performSearch();
}
});
searchResults = new UserSearchResults();
searchResults.setBorder(BorderFactory.createTitledBorder("Search Results"));
add(searchResults, new GridBagConstraints(0, 2, 2, 1, 1.0, 1.0,
GridBagConstraints.WEST, GridBagConstraints.BOTH,
new Insets(5, 5, 5, 5), 0, 0));
}
public DataFormUI getQuestionForm()
{
return questionForm;
}
public Form getSearchForm()
{
return searchForm;
}
public void performSearch()
{
searchResults.clearTable();
SwingWorker worker = new SwingWorker()
{
ReportedData data;
@Override public Object construct()
{
try
{
Form answerForm = questionForm.getFilledForm();
data = searchManager.getSearchResults(answerForm, serviceName);
}
catch (XMPPException e)
{
Log.error("Unable to load search service.", e);
}
return data;
}
@Override public void finished()
{
if (data != null)
{
searchResults.showUsersFound(data);
searchResults.invalidate();
searchResults.validate();
searchResults.repaint();
}
else
{
JOptionPane.showMessageDialog(
searchResults,
"No search results were returned by the server",
"Notification",
JOptionPane.ERROR_MESSAGE);
}
}
};
worker.start();
}
}