/*
* ManageContactListForm.java
*
* Created on 10 Июнь 2007 г., 21:31
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package jimm.forms;
import java.util.Vector;
import jimm.Jimm;
import jimm.comm.StringUtils;
import jimm.search.*;
import jimmui.view.*;
import jimmui.view.form.ControlStateListener;
import jimmui.view.form.Form;
import jimmui.view.form.FormListener;
import jimmui.view.menu.*;
import jimm.util.*;
import protocol.*;
import protocol.mrim.Mrim;
import protocol.xmpp.Xmpp;
/**
*
* @author vladimir
*/
public final class ManageContactListForm implements SelectListener, FormListener, ControlStateListener {
private static final int ADD_CONTACT = 1;
private static final int SEARCH_CONTACT = 2;
private static final int ADD_GROUP = 3;
private static final int RENAME_GROUP = 4;
private static final int DEL_GROUP = 5;
private static final int RENAME_CONTACT = 6;
private static final int MOVE_CONTACT = 7;
private static final int ACCOUNT = 9;
private static final int GROUP = 10;
private static final int GROUP_NEW_NAME = 11;
private static final int CONTACT_NEW_NAME = 12;
private static final int CONTACT_USER_ID = 13;
private static final int REQ_AUTH = 14;
private static final int PROFILE_LINK = 15;
private Protocol protocol;
private Group group;
private Contact contact;
private int action;
// #sijapp cond.if protocols_JABBER is "true" #
private String xmppGate = null;
// #sijapp cond.end #
/** Creates a new instance of ManageContactListForm */
public ManageContactListForm(Protocol protocol) {
this(protocol, (Group)null);
}
public ManageContactListForm(Protocol protocol, Group group) {
this.protocol = protocol;
this.group = group;
}
public ManageContactListForm(Protocol protocol, Contact contact) {
this.protocol = protocol;
this.contact = contact;
}
public void showContactRename() {
action = RENAME_CONTACT;
Form form = UIBuilder.createForm("rename", "ok", "back", this);
addProtocol(form, false);
form.addString("contact", contact.getName());
form.addTextField(CONTACT_NEW_NAME, "new_name", contact.getName(), 64);
form.show();
}
public void showContactAdd() {
action = ADD_CONTACT;
Form form = UIBuilder.createForm("add", "ok", "back", this);
addProtocol(form, false);
form.addTextField(CONTACT_USER_ID, protocol.getUserIdName(),
null == contact ? "" : contact.getUserId(), 64);
addGroupSelector(form, getGroups(Group.MODE_NEW_CONTACTS));
boolean request_auth = true;
// #sijapp cond.if protocols_MRIM is "true" #
if (protocol instanceof Mrim) {
request_auth = false;
}
// #sijapp cond.end #
if (request_auth) {
form.addCheckBox(REQ_AUTH, "requauth", true);
}
form.show();
}
public void showContactMove() {
action = MOVE_CONTACT;
Form form = UIBuilder.createForm("move", "ok", "back", this);
addProtocol(form, false);
group = protocol.getGroupById(contact.getGroupId());
form.addString("contact", contact.getName());
addGroupSelector(form, getGroups(Group.MODE_NEW_CONTACTS));
form.addLink(PROFILE_LINK, JLocale.getString("info"));
form.setControlStateListener(this);
form.show();
}
public MenuModel getMenu() {
MenuModel manageCL = new MenuModel();
boolean canAdd = !protocol.getGroupItems().isEmpty()
&& ((null == group) || group.hasMode(Group.MODE_NEW_CONTACTS));
if (canAdd) {
manageCL.addItem("add_user", ADD_CONTACT);
// #sijapp cond.if protocols_JABBER is "true" #
if (!(protocol instanceof Xmpp)) {
manageCL.addItem("search_user", SEARCH_CONTACT);
}
// #sijapp cond.else #
manageCL.addItem("search_user", SEARCH_CONTACT);
// #sijapp cond.end #
}
manageCL.addItem("add_group", ADD_GROUP);
if (null != group) {
if (group.hasMode(Group.MODE_EDITABLE)) {
manageCL.addItem("rename_group", RENAME_GROUP);
}
if (group.isEmpty(protocol) && group.hasMode(Group.MODE_REMOVABLE)) {
manageCL.addItem("del_group", DEL_GROUP);
}
} else {
manageCL.addItem("rename_group", RENAME_GROUP);
manageCL.addItem("del_group", DEL_GROUP);
}
manageCL.setActionListener(this);
return manageCL;
}
public void select(Select select, MenuModel model, int cmd) {
action = cmd;
switch (cmd) {
case ADD_CONTACT: /* Add user */
showContactAdd();
break;
case SEARCH_CONTACT: /* Search for User */
Search searchUser = protocol.getSearchForm();
searchUser.putToGroup(group);
searchUser.show();
break;
case ADD_GROUP: /* Add group */ {
Form form = UIBuilder.createForm("add_group", "ok", "back", this);
addProtocol(form, true);
form.addTextField(GROUP_NEW_NAME, "new_group_name", "", 64);
form.show();
break;
}
case RENAME_GROUP: /* Rename group */ {
Form form = UIBuilder.createForm("rename_group", "ok", "back", this);
addProtocol(form, true);
addGroupSelector(form, getGroups(Group.MODE_EDITABLE));
form.addTextField(GROUP_NEW_NAME, "new_group_name", "", 64);
form.show();
break;
}
case DEL_GROUP: /* Delete group */ {
Form form = UIBuilder.createForm("del_group", "delete", "back", this);
addProtocol(form, true);
addGroupSelector(form, getGroups(Group.MODE_REMOVABLE));
form.show();
break;
}
}
}
private Vector getGroups(byte mode) {
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(mode)) {
if ((Group.MODE_REMOVABLE == mode) && !g.isEmpty(protocol)) continue;
groups.addElement(g);
}
}
return groups;
}
public void show() {
UIBuilder.createMenu(getMenu()).show();
}
public void formAction(Form form, boolean apply) {
if (!apply) {
Jimm.getJimm().getCL().activate();
return;
}
switch (action) {
case ADD_CONTACT: {
String userid = form.getTextFieldValue(CONTACT_USER_ID).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 = form.getSelectorString(GROUP);
}
contact.setGroup(protocol.getGroup(g));
protocol.addContact(contact);
if (form.getCheckBoxValue(REQ_AUTH) && contact.isSingleUserContact()) {
protocol.requestAuth(contact);
}
}
Jimm.getJimm().getCL().activate(contact);
}
break;
}
case RENAME_CONTACT: {
String newName = form.getTextFieldValue(CONTACT_NEW_NAME);
protocol.renameContact(contact, newName);
Jimm.getJimm().getCL().activate();
return;
}
case MOVE_CONTACT: {
String groupName = form.getSelectorString(GROUP);
Group group = protocol.getGroup(groupName);
if (group != protocol.getGroupById(contact.getGroupId())) {
protocol.moveContactTo(contact, group);
}
Jimm.getJimm().getCL().activate();
return;
}
}
if (!form.hasControl(GROUP)) {
Jimm.getJimm().getCL().activate();
return;
}
switch (action) {
case ADD_GROUP: {
String groupName = form.getTextFieldValue(GROUP_NEW_NAME);
boolean isExist = null != protocol.getGroup(groupName);
if (0 == groupName.length()) {
Jimm.getJimm().getCL().activate();
return;
}
if (isExist) {
form.addString(JLocale.getString("group_already_exist"));
} else {
protocol.addGroup(protocol.createGroup(groupName));
Jimm.getJimm().getCL().activate();
}
break;
}
case RENAME_GROUP: {
Vector groups = getGroups(Group.MODE_EDITABLE);
Group g = (Group) groups.elementAt(form.getSelectorValue(GROUP));
String oldGroupName = form.getSelectorString(GROUP);
String newGroupName = form.getTextFieldValue(GROUP_NEW_NAME);
boolean isExist = null != protocol.getGroup(newGroupName);
boolean isMyName = oldGroupName.equals(newGroupName);
if (!oldGroupName.equals(g.getName())) {
// invalid group
Jimm.getJimm().getCL().activate();
} else if (StringUtils.isEmpty(newGroupName)) {
Jimm.getJimm().getCL().activate();
} else if (isMyName) {
Jimm.getJimm().getCL().activate();
} else if (isExist) {
form.addString(JLocale.getString("group_already_exist"));
} else {
protocol.renameGroup(g, newGroupName);
Jimm.getJimm().getCL().activate();
}
break;
}
case DEL_GROUP: {
Vector groups = getGroups(Group.MODE_REMOVABLE);
Group g = (Group) groups.elementAt(form.getSelectorValue(GROUP));
String oldGroupName = form.getSelectorString(GROUP);
if (oldGroupName.equals(g.getName())) {
protocol.removeGroup(g);
}
Jimm.getJimm().getCL().activate();
break;
}
}
}
// #sijapp cond.if protocols_JABBER is "true" #
public void setXmppGate(String gate) {
xmppGate = gate;
}
// #sijapp cond.end #
private void addProtocol(Form form, boolean selectable) {
if (selectable) {
Vector protocols = getAccounts();
if (!protocols.isEmpty()) {
String[] list = new String[protocols.size()];
int def = 0;
for (int i = 0; i < protocols.size(); ++i) {
Protocol p = (Protocol) protocols.elementAt(i);
list[i] = p.getUserId();
if (p == protocol) {
def = i;
}
}
form.addSelector(ACCOUNT, "protocol", list, def);
} else {
form.addString(JLocale.getString("no_protocols_available"));
}
} else {
form.addString("protocol", protocol.getUserId());
}
}
private Vector getAccounts() {
return Jimm.getJimm().jimmModel.protocols;
}
private void addGroupSelector(Form form, Vector groups) {
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;
}
}
form.addSelector(GROUP, "group", list, def);
} else {
form.addString(JLocale.getString("no_groups_available"));
}
}
@Override
public void controlStateChanged(Form form, int id) {
if (PROFILE_LINK == id) {
String userId = form.getTextFieldValue(CONTACT_USER_ID);
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);
}
} else if (ACCOUNT == id) {
protocol = (Protocol) getAccounts().elementAt(form.getSelectorValue(ACCOUNT));
// todo update other components
}
}
}