/**
* $RCSfile: ,v $
* $Revision: $
* $Date: $
*
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.sparkimpl.search.users;
import org.jivesoftware.resource.Res;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smackx.Form;
import org.jivesoftware.smackx.ReportedData;
import org.jivesoftware.smackx.search.UserSearchManager;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.ui.DataFormUI;
import org.jivesoftware.spark.util.ResourceUtils;
import org.jivesoftware.spark.util.SwingWorker;
import org.jivesoftware.spark.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;
public class SearchForm extends JPanel {
private static final long serialVersionUID = -6935368899659597477L;
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(SparkManager.getConnection());
setLayout(new GridBagLayout());
// Load searchForm
try {
searchForm = searchManager.getSearchForm(service);
}
catch (XMPPException e) {
Log.error("Unable to load search services.", e);
JOptionPane.showMessageDialog(SparkManager.getMainWindow(), Res.getString("message.search.service.not.available"), Res.getString("title.notification"), JOptionPane.ERROR_MESSAGE);
return;
}
searchManager = new UserSearchManager(SparkManager.getConnection());
questionForm = new DataFormUI(searchForm);
questionForm.setBorder(BorderFactory.createTitledBorder(Res.getString("group.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));
// Add User DataForm
final JButton searchButton = new JButton();
ResourceUtils.resButton(searchButton, Res.getString("button.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() {
public void actionPerformed(ActionEvent e) {
performSearch();
}
});
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
String enterString = org.jivesoftware.spark.util.StringUtils.keyStroke2String(enter);
// Handle Left Arrow
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(enterString), "enter");
getActionMap().put("enter", new AbstractAction("enter") {
private static final long serialVersionUID = -7308854327447291219L;
public void actionPerformed(ActionEvent evt) {
performSearch();
}
});
// Add searchResults
searchResults = new UserSearchResults();
searchResults.setBorder(BorderFactory.createTitledBorder(Res.getString("group.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;
}
/**
* Starts a search based on the Answered form.
*/
public void performSearch() {
searchResults.clearTable();
SwingWorker worker = new SwingWorker() {
ReportedData data;
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;
}
public void finished() {
if (data != null) {
searchResults.showUsersFound(data);
searchResults.invalidate();
searchResults.validate();
searchResults.repaint();
}
else {
JOptionPane.showMessageDialog(searchResults, Res.getString("message.no.results.found"), Res.getString("title.notification"), JOptionPane.ERROR_MESSAGE);
}
}
};
worker.start();
}
}