/******************************************************************************* Jimm - Mobile Messaging - J2ME ICQ clone Copyright (C) 2003-05 Jimm Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ******************************************************************************** File: src/jimm/Search.java Version: ###VERSION### Date: ###DATE### Author(s): Andreas Rossbacher *******************************************************************************/ package jimm.search; import jimm.Jimm; import jimmui.view.form.ControlStateListener; import jimmui.view.form.Form; import jimmui.view.form.FormListener; import jimmui.view.text.TextList; import jimmui.view.text.TextListModel; import java.util.Vector; import jimm.comm.*; import jimmui.view.*; import jimmui.view.base.Binder; import jimmui.view.base.CanvasEx; import jimmui.view.menu.*; import jimmui.view.text.TextListController; import jimm.util.*; import protocol.*; import protocol.icq.*; import protocol.mrim.*; public final class Search implements FormListener, TextListExCommands, ActionListener, ControlStateListener { final public static int UIN = 0; final public static int NICK = 1; final public static int FIRST_NAME = 2; final public static int LAST_NAME = 3; final public static int EMAIL = 4; final public static int CITY = 5; final public static int GENDER = 6; final public static int ONLY_ONLINE = 7; final public static int AGE = 8; final public static int LAST_INDEX = 9; /* Textboxes for adding */ private static final int USERID = 1000; private static final int GROUP = 1001; private static final int PROFILE = 1002; private static final int REQ_AUTH = 1020; private static final int MENU_ADD = 0; private static final int MENU_MESSAGE = 1; /* Forms for results and query */ private Form searchForm; private TextList screen; private Group group; private boolean waitResults = false; private String preferredNick; private Vector<UserInfo> results = new Vector<UserInfo>(); private Protocol protocol; private boolean icqFields; private byte type; private String[] searchParams = new String[Search.LAST_INDEX]; // #sijapp cond.if protocols_JABBER is "true" # private String xmppGate = null; // #sijapp cond.end # private int currentResultIndex; private static final String ageList = "-|13-17|18-22|23-29|30-39|40-49|50-59|60-"; private static final String[] ages = Util.explode(ageList, '|'); private static final byte TYPE_FULL = 0; private static final byte TYPE_LITE = 1; private int searchId; public int getSearchId() { return searchId; } public Search(Protocol protocol) { this.protocol = protocol; // #sijapp cond.if protocols_ICQ is "true" # icqFields = (protocol instanceof Icq); // #sijapp cond.else # icqFields = false; // #sijapp cond.end # preferredNick = null; } public void controlStateChanged(Form form, int id) { if (PROFILE == id) { String userid = searchForm.getTextFieldValue(USERID); if (StringUtils.isEmpty(userid)) { return; } // #sijapp cond.if protocols_JABBER is "true" # if ((null != xmppGate) && !userid.endsWith(xmppGate)) { userid = userid.replace('@', '%') + '@' + xmppGate; } // #sijapp cond.end # Contact contact = protocol.createTempContact(userid); if (null != contact) { protocol.showUserInfo(contact); } } } public void show() { type = TYPE_FULL; createSearchForm(); searchForm.show(); } public void show(String uin) { type = TYPE_LITE; setSearchParam(Search.UIN, uin); createSearchForm(); searchForm.show(); } private void showResults() { results.removeAllElements(); searchId = Util.uniqueValue(); waitResults = true; showWaitScreen(); protocol.searchUsers(this); } public final void putToGroup(Group group) { this.group = group; } private Vector getGroups() { Vector<Group> all = protocol.getGroupItems(); Vector<Group> groups = new Vector<Group>(); for (int i = 0; i < all.size(); ++i) { Group g = (Group)all.elementAt(i); if (g.hasMode(Group.MODE_NEW_CONTACTS)) { groups.addElement(g); } } return groups; } /* Add a result to the results vector */ public void addResult(UserInfo info) { results.addElement(info); } private UserInfo getCurrentResult() { return (UserInfo) results.elementAt(currentResultIndex); } private int getResultCount() { return results.size(); } // #sijapp cond.if protocols_JABBER is "true" # public void setXmppGate(String gate) { xmppGate = gate; } // #sijapp cond.end # public String getSearchParam(int param) { return searchParams[param]; } public void setSearchParam(int param, String value) { searchParams[param] = StringUtils.isEmpty(value) ? null : value; } public String[] getSearchParams() { return searchParams; } public void finished() { if (waitResults) { activate(); } waitResults = false; } public void canceled() { if (waitResults) { searchId = -1; searchForm.restore(); } waitResults = false; } private void addUserIdItem() { String userid = StringUtils.notNull(getSearchParam(UIN)); searchForm.addTextField(USERID, protocol.getUserIdName(), userid, 64); } private void createSearchForm() { /* Result Screen */ screen = new TextList(""); screen.getTextContent().setUpdateListener(this); /* Form */ searchForm = UIBuilder.createForm((TYPE_LITE == type) ? "add_user" : "search_user", "ok", "back", this); if (TYPE_LITE == type) { addUserIdItem(); // #sijapp cond.if protocols_JABBER is "true" # if (null != xmppGate) { searchForm.addString("transport", xmppGate); } // #sijapp cond.end # Vector groups = getGroups(); if (!groups.isEmpty()) { String[] list = new String[groups.size()]; int def = 0; for (int i = 0; i < groups.size(); ++i) { Group g = (Group) groups.elementAt(i); list[i] = g.getName(); if (g == group) { def = i; } } searchForm.addSelector(GROUP, "group", list, def); } boolean request_auth = true; // #sijapp cond.if protocols_MRIM is "true" # if (protocol instanceof Mrim) { request_auth = false; } // #sijapp cond.end # if (request_auth) { searchForm.addCheckBox(REQ_AUTH, "requauth", true); } searchForm.addLink(PROFILE, JLocale.getString("info")); searchForm.setControlStateListener(this); return; } searchForm.addCheckBox(Search.ONLY_ONLINE, "only_online", false); addUserIdItem(); searchForm.addTextField(Search.NICK, "nick", "", 64); searchForm.addTextField(Search.FIRST_NAME, "firstname", "", 64); searchForm.addTextField(Search.FIRST_NAME, "lastname", "", 64); searchForm.addTextField(Search.CITY, "city", "", 64); searchForm.addSelector(Search.GENDER, "gender", "female_male" + "|" + "female" + "|" + "male", 0); // #sijapp cond.if protocols_ICQ is "true" # if (icqFields) { searchForm.addTextField(Search.EMAIL, "email", "", 64); } // #sijapp cond.end # searchForm.addSelector(Search.AGE, "age", ageList, 0); } /* Activate search form */ private void activate() { drawResultScreen(); screen.restore(); } private void showWaitScreen() { screen.lock(); screen.setCaption(JLocale.getString("search_user")); screen.getContent().setAllToTop(); TextListModel model = new TextListModel(); model.setInfoMessage(JLocale.getString("wait")); screen.setController(new TextListController(null, MENU_ADD)); screen.setModel(model); screen.show(); } private void drawResultScreen() { int resultCount = getResultCount(); if (0 < resultCount) { screen.setCaption(JLocale.getString("results") + " " + (currentResultIndex + 1) + "/" + resultCount); screen.getContent().setAllToTop(); UserInfo userInfo = getCurrentResult(); userInfo.setSeachResultFlag(); userInfo.setProfileView(screen); userInfo.updateProfileView(); } else { /* Show a result entry */ screen.lock(); screen.setCaption(JLocale.getString("results") + " 0/0"); screen.getContent().setAllToTop(); TextListModel model = new TextListModel(); model.setInfoMessage(JLocale.getString("no_results")); screen.setModel(model); } MenuModel menu = new MenuModel(); if (0 < resultCount) { menu.addItem("add_to_list", MENU_ADD); menu.addItem("send_message", MENU_MESSAGE); } menu.setActionListener(new Binder(this)); screen.setController(new TextListController(menu, MENU_ADD)); } private void nextOrPrev(boolean next) { int size = getResultCount(); if (0 < size) { if (1 < size) { getCurrentResult().setProfileView(null); getCurrentResult().removeAvatar(); } currentResultIndex = ((next ? 1 : size - 1) + currentResultIndex) % size; } activate(); } public void onContentMove(TextListModel sender, int direction) { nextOrPrev(1 == direction); } public void formAction(Form form, boolean apply) { if (apply) { if (TYPE_FULL == type) { currentResultIndex = 0; setSearchParam(Search.UIN, searchForm.getTextFieldValue(USERID).trim()); setSearchParam(Search.NICK, searchForm.getTextFieldValue(Search.NICK)); setSearchParam(Search.FIRST_NAME, searchForm.getTextFieldValue(Search.FIRST_NAME)); setSearchParam(Search.LAST_NAME, searchForm.getTextFieldValue(Search.FIRST_NAME)); setSearchParam(Search.CITY, searchForm.getTextFieldValue(Search.CITY)); setSearchParam(Search.GENDER, Integer.toString(searchForm.getSelectorValue(Search.GENDER))); setSearchParam(Search.ONLY_ONLINE, searchForm.getCheckBoxValue(Search.ONLY_ONLINE) ? "1" : "0"); setSearchParam(Search.AGE, ages[searchForm.getSelectorValue(Search.AGE)]); // #sijapp cond.if protocols_ICQ is "true" # if (icqFields) { setSearchParam(Search.EMAIL, searchForm.getTextFieldValue(Search.EMAIL)); } // #sijapp cond.end # showResults(); } else if (TYPE_LITE == type) { String userid = searchForm.getTextFieldValue(USERID).trim(); userid = StringUtils.toLowerCase(userid); if (StringUtils.isEmpty(userid)) { return; } // #sijapp cond.if protocols_JABBER is "true" # if ((null != xmppGate) && !userid.endsWith(xmppGate)) { userid = userid.replace('@', '%') + '@' + xmppGate; } // #sijapp cond.end # Contact contact = protocol.createTempContact(userid); if (null != contact) { if (contact.isTemp()) { String g = null; if (!contact.isSingleUserContact()) { g = contact.getDefaultGroupName(); } if (null == g) { g = searchForm.getSelectorString(GROUP); } contact.setName(preferredNick); contact.setGroup(protocol.getGroup(g)); protocol.addContact(contact); if (searchForm.getCheckBoxValue(REQ_AUTH) && contact.isSingleUserContact()) { protocol.requestAuth(contact); } } Jimm.getJimm().getCL().activate(contact); } } } else { form.back(); } } private Contact createContact(UserInfo resultData) { String uin = StringUtils.toLowerCase(resultData.uin.trim()); // #sijapp cond.if protocols_JABBER is "true" # if ((null != xmppGate) && !uin.endsWith(xmppGate)) { uin = uin.replace('@', '%') + '@' + xmppGate; } // #sijapp cond.end # Contact contact = protocol.getItemByUID(uin); if (null == contact) { contact = protocol.createTempContact(uin); contact.setBooleanValue(Contact.CONTACT_NO_AUTH, true); protocol.addTempContact(contact); contact.setOfflineStatus(); contact.setName(resultData.getOptimalName()); } return contact; } public void action(CanvasEx canvas, int cmd) { switch (cmd) { case MENU_ADD: UserInfo info = getCurrentResult(); Search s = new Search(protocol); s.preferredNick = info.getOptimalName(); s.show(info.uin); break; case MENU_MESSAGE: UserInfo temp = getCurrentResult(); createContact(temp).activate(protocol); break; } } }