/** * Copyright (C) 2010 Peter Karich <jetwick_@_pannous_._info> * * 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 de.jetwick.ui; import de.jetwick.ui.util.DefaultFocusBehaviour; import de.jetwick.ui.util.MyAutoCompleteTextField; import de.jetwick.util.Helper; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.apache.wicket.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxFallbackLink; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteSettings; import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.Radio; import org.apache.wicket.markup.html.form.RadioGroup; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; /** * * @author Peter Karich, peat_hal 'at' users 'dot' sourceforge 'dot' net */ public class SearchBox extends Panel { public static final String ALL = "all", USER = "user", FRIENDS = "friends"; public static final List<String> SEARCHTYPES = Arrays.asList(ALL, FRIENDS, USER); private Integer selectedIndex; private String query; private String userName; private AutoCompleteTextField queryTF; private final Form form; private Model<String> oneUserLink = new Model<String>(""); private Model<String> oneUserLabel = new Model<String>(""); // for test public SearchBox(String id) { this(id, null, null, false); } public void setSearchType(String type) { if (type != null) selectedIndex = SEARCHTYPES.indexOf(type); else selectedIndex = 0; } public SearchBox(String id, final String loggedInUser, String searchTypeAsStr, boolean showSpacer) { super(id); setSearchType(searchTypeAsStr); add(new WebMarkupContainer("userTwitter") { @Override public boolean isVisible() { return !getUserName().isEmpty(); } }.add(new ExternalLink("userTwitterLink", oneUserLink, oneUserLabel)). add(new AjaxFallbackLink("userTwitterLinkRemove") { @Override public void onClick(AjaxRequestTarget target) { setSearchType(ALL); setResponsePage(TweetSearchPage.class, getParams(query, selectedIndex, null, loggedInUser)); } })); final RadioGroup rg = new RadioGroup("searchTypes", new PropertyModel(this, "selectedIndex")); final Button buttonRight = new Button("submitbutton") { @Override public void onSubmit() { setResponsePage(TweetSearchPage.class, getParams(query, selectedIndex, userName, loggedInUser)); } }; final Button bttnLeft = new Button("submitbuttonleft") { @Override public void onSubmit() { buttonRight.onSubmit(); } }; form = new Form("searchform") { @Override public void onSubmit() { buttonRight.onSubmit(); } }; form.add(new BookmarkablePageLink("homelink", TweetSearchPage.class)); // buttonRight.add(new EffectBehavior(new BounceEffect())); form.add(buttonRight); form.add(bttnLeft); form.setMarkupId("queryform"); add(form); AutoCompleteSettings config = new AutoCompleteSettings().setUseHideShowCoveredIEFix(false); config.setThrottleDelay(200); // connect the form's textfield with the java property queryTF = new MyAutoCompleteTextField("textField", new PropertyModel(this, "query"), config) { @Override protected Iterator getChoices(String input) { return SearchBox.this.getQueryChoices(input).iterator(); } @Override protected void onSelectionChange(AjaxRequestTarget target, String newValue) { SearchBox.this.onSelectionChange(target, newValue); } }; queryTF.add(new DefaultFocusBehaviour()); // autosubmit when user selects choice -> problem: the user text will be submitted although it should be cleared before submit // queryTF.add(new AjaxFormSubmitBehavior(form, "onchange") { // // @Override // protected void onSubmit(AjaxRequestTarget target) { // } // // @Override // protected void onError(AjaxRequestTarget target) { // } // }); queryTF.setMarkupId("querybox"); form.add(queryTF); MyAutoCompleteTextField userTF = new MyAutoCompleteTextField("userTextField", new PropertyModel(this, "userName"), config) { @Override protected Iterator getChoices(String input) { return SearchBox.this.getUserChoices(input).iterator(); } @Override protected void onSelectionChange(AjaxRequestTarget target, String newValue) { //"Not supported yet." } }; userTF.setMarkupId("userbox"); rg.add(new Radio("0", new Model(0)).setMarkupId("sbnone")); rg.add(new Radio("1", new Model(1)).setMarkupId("sbfriends")); rg.add(new Radio("2", new Model(2)).setMarkupId("sbuser")); rg.add(userTF); if (showSpacer) form.add(new AttributeAppender("class", new Model("not-logged-in-spacer"), " ")); form.add(rg); // Model hrefModel = new Model() { // // @Override // public Serializable getObject() { // String paramStr = ""; // String txt = ""; // // if (userName != null && !userName.isEmpty()) { // paramStr += "user=" + userName; // txt += "@" + userName + " "; // } // // if (query != null && !query.isEmpty()) { // if (!paramStr.isEmpty()) { // paramStr += "&"; // txt += "and "; // } // // paramStr += "q=" + query; // txt += query + " "; // } // // if (!paramStr.isEmpty()) // paramStr = "?" + paramStr; // // if (!txt.isEmpty()) // txt = "about " + txt; // else // txt = "about any topic at "; // // return Helper.toTwitterStatus(Helper.twitterUrlEncode("News " + txt // + "http://jetwick.com/" + paramStr)); // } // }; // form.add(new ExternalLink("tweetQuery", hrefModel)); } public void init(String q, String u) { query = q; userName = u; if (getUserName().isEmpty()) { oneUserLabel.setObject(""); oneUserLink.setObject(""); } else { oneUserLabel.setObject(Helper.TURL + "/" + getUserName()); oneUserLink.setObject(Helper.TURL + "/" + getUserName()); } } public String getUserName() { if (userName == null) userName = ""; return userName; } public String getQuery() { if (query == null) query = ""; return query; } protected void onSelectionChange(AjaxRequestTarget target, String str) { } protected Collection<String> getQueryChoices(String input) { throw new RuntimeException(); } protected Collection<String> getUserChoices(String input) { throw new RuntimeException(); } public PageParameters getParams(String tmpQuery, Integer tmpSelectedIndex, String tmpUserName, String tmpLoginUser) { PageParameters params = new PageParameters(); if (tmpQuery != null && !tmpQuery.isEmpty()) params.add("q", tmpQuery); if(tmpSelectedIndex == null) tmpSelectedIndex = 0; params.add("search", SEARCHTYPES.get(tmpSelectedIndex)); if (tmpSelectedIndex == 0) { if (tmpUserName != null) params.add("user", tmpUserName); } else if (tmpSelectedIndex == 2) { params.add("user", tmpUserName); } else if (tmpSelectedIndex == 1) { // params.add("user", tmpLoginUser); } return params; } }