package project.client.gadgets; import java.util.Iterator; import java.util.List; import project.client.ServletRpc; import project.client.persistence.Message; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.KeyboardListener; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class GadgetSearchPage extends Composite implements ClickListener { private static final String STYLE_MAIN = "search"; private static final String STYLE_PANEL = "hPanel"; private static final String STYLE_LABEL = "label"; private static final String STYLE_TEXTBOX = "textbox"; private static final String STYLE_BUTTON_OK = "btnOk"; private static final String STYLE_CONTENT_PANEL = "contentPanel"; private static final String STYLE_NO_MESSAGE = "noMessage"; private static final String STYLE_NO_MESSAGE_HTML = "html"; private Panel mainPanel; private TextBox m_tbSearch; private Panel contentPanel; private Button m_btnOk; private CheckBox m_chkUserRelevance; public GadgetSearchPage () { mainPanel = new VerticalPanel (); mainPanel.setStyleName(STYLE_MAIN); this.initWidget(mainPanel); Panel hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); Label lbl = new Label ("Type in your search here "); lbl.addStyleName(STYLE_LABEL); hPanel.add(lbl); m_tbSearch = new TextBox (); m_tbSearch.addStyleName(STYLE_TEXTBOX); m_tbSearch.addKeyboardListener(new KeyboardListener () { public void onKeyUp (Widget w, char code, int modifiers) { if (code == KEY_ENTER) { m_btnOk.click(); } } public void onKeyDown (Widget w, char code, int modifiers) { } public void onKeyPress (Widget w, char code, int modifiers) { } }); hPanel.add(m_tbSearch); // // m_btnOk = new Button ("Search"); m_btnOk.addStyleName(STYLE_BUTTON_OK); m_btnOk.addClickListener(this); hPanel.add(m_btnOk); mainPanel.add(hPanel); hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); m_chkUserRelevance = new CheckBox ("Apply user relevance when searching"); hPanel.add(m_chkUserRelevance); mainPanel.add(hPanel); contentPanel = new VerticalPanel (); contentPanel.addStyleName(STYLE_CONTENT_PANEL); mainPanel.add(contentPanel); } public void onClick(Widget arg0) { final GadgetSearchPage searcher = this; contentPanel.clear(); contentPanel.add(this.getSearchingPanel()); if (arg0.equals(m_btnOk)) { if (m_tbSearch.getText().length() == 0) { Window.alert("Query is empty"); return; } if (m_tbSearch.getText().startsWith("similar:")) { // // look for similar messages // String msgId = m_tbSearch.getText().substring(m_tbSearch.getText().indexOf(':') + 1); ServletRpc.getRpcInterface().getSimilarMessages(Integer.parseInt(msgId), 10, new AsyncCallback<List<Message>> () { public void onSuccess (List<Message> result) { contentPanel.clear(); if (result == null || result.size() == 0) { contentPanel.add(getNoMessagePanel()); return; } Iterator<Message> i = result.iterator(); while (i.hasNext()) { Message msg = i.next(); contentPanel.add(new GadgetMessage (searcher, msg)); } } public void onFailure (Throwable t) { Window.alert("Exception : " + t.getMessage()); } }); } else if (m_tbSearch.getText().startsWith("thread:")) { // // look for the thread // String threadName = m_tbSearch.getText().substring(m_tbSearch.getText().indexOf(':') + 1); ServletRpc.getRpcInterface().searchForThread(threadName, new AsyncCallback<List<Message>> () { public void onSuccess (List<Message> result) { contentPanel.clear(); if (result == null || result.size() == 0) { contentPanel.add(getNoMessagePanel()); return; } Iterator<Message> i = result.iterator(); while (i.hasNext()) { Message msg = i.next(); contentPanel.add(new GadgetMessage (searcher, msg)); } } public void onFailure (Throwable t) { Window.alert("Exception : " + t.getMessage()); } }); } else { String[] tokens = m_tbSearch.getText().split(" "); if (tokens.length == 0) { // this is weird, it should never happen // Window.alert("Query is empty (after tokenization)"); return; } ServletRpc.getRpcInterface().search(tokens, 10, m_chkUserRelevance.isChecked(), new AsyncCallback<List<Message>> () { public void onSuccess (List<Message> result) { contentPanel.clear(); if (result == null || result.size() == 0) { contentPanel.add(getNoMessagePanel()); return; } Iterator<Message> i = result.iterator(); while (i.hasNext()) { Message msg = i.next(); contentPanel.add(new GadgetMessage (searcher, msg)); } } public void onFailure (Throwable t) { Window.alert("Exception : " + t.getMessage()); } }); } } } public void search (String text) { m_tbSearch.setText(text); m_btnOk.click(); } private Panel getNoMessagePanel () { Panel pnl = new VerticalPanel (); pnl.setStyleName(STYLE_NO_MESSAGE); HTML html = new HTML ("Unfortunately, <b>no message</b> matched your query!"); html.addStyleName(STYLE_NO_MESSAGE_HTML); pnl.add(html); return pnl; } private Panel getSearchingPanel () { Panel pnl = new VerticalPanel (); pnl.setStyleName(STYLE_NO_MESSAGE); HTML html = new HTML ("<i>Searching ...</i>"); html.addStyleName(STYLE_NO_MESSAGE_HTML); pnl.add(html); return pnl; } }