package jimmui.updater;
import jimm.Jimm;
import jimmui.model.chat.ChatModel;
import jimmui.model.roster.*;
import jimm.Options;
import jimm.comm.Util;
import jimmui.view.roster.ContactListModel;
import protocol.Contact;
import protocol.Group;
import protocol.Protocol;
import protocol.Roster;
import java.util.Vector;
/**
* Created with IntelliJ IDEA.
* <p/>
* Date: 28.06.13 19:38
*
* @author vladimir
*/
public class RosterUpdater {
private Vector<Update> updateQueue = new Vector<Update>();
private ContactListModel chatModel = new ChatsModel();
private ContactListModel model;
private Contact currentContact;
public void addGroup(Protocol protocol, Group group) {
if (model.hasProtocol(protocol)) {
model.addGroup(new Update(protocol, group, null, Update.GROUP_ADD));
}
}
public void unregisterChat(ChatModel item) {
update(item.getContact());
}
public void registerChat(ChatModel item) {
update(item.getContact());
}
public void updateProtocol(Protocol protocol, Roster oldRoster) {
if (model.hasProtocol(protocol)) {
synchronized (protocol.getRosterLockObject()) {
model.updateProtocol(protocol, oldRoster);
}
update();
}
}
public void removeGroup(Protocol protocol, Group group) {
if (model.hasProtocol(protocol)) {
synchronized (protocol.getRosterLockObject()) {
model.removeGroup(new Update(protocol, group, null, Update.GROUP_REMOVE));
}
update();
}
}
public void update() {
Jimm.getJimm().getCL().getManager().update();
}
public void update(Protocol protocol) {
if (model.hasProtocol(protocol)) {
update();
}
}
public void update(Group group) {
update();
}
private void update(Contact contact) {
update();
}
public void repaint() {
Jimm.getJimm().getCL().getManager().invalidate();
}
public void typing(Protocol protocol, Contact item) {
if (model.hasProtocol(protocol)) {
// TODO: if contact visible only
Jimm.getJimm().getCL().getManager().invalidate();
}
}
public void setOffline(Protocol protocol) {
if (model.hasProtocol(protocol)) {
synchronized (protocol.getRosterLockObject()) {
putIntoQueue(new Update(protocol, null, null, Update.PROTOCOL_UPDATE));
}
update();
}
}
public void removeFromGroup(Protocol protocol, Group g, Contact c) {
if (model.hasProtocol(protocol)) {
model.removeFromGroup(new Update(protocol, g, c, Update.REMOVE));
update(c);
}
}
public void updateContact(Protocol protocol, Group group, Contact contact) {
if (model.hasProtocol(protocol)) {
synchronized (protocol.getRosterLockObject()) {
putIntoQueue(new Update(protocol, group, contact, Update.UPDATE));
}
update(contact);
}
}
public void addContactToGroup(Protocol protocol, Group group, Contact contact) {
if (model.hasProtocol(protocol)) {
model.addToGroup(new Update(protocol, group, contact, Update.ADD));
updateContact(protocol, group, contact);
}
}
public void collapseAll() {
try {
int count = model.getProtocolCount();
for (int i = 0; i < count; ++i) {
Protocol p = model.getProtocol(i);
Vector groups = p.getGroupItems();
for (int groupIndex = 0; groupIndex < groups.size(); ++groupIndex) {
model.getGroupNode(new Update(p, (Group)groups.elementAt(groupIndex), null, Update.EXPAND)).setExpandFlag(false);
}
model.getGroupNode(new Update(p, null, null, Update.EXPAND)).setExpandFlag(false);
}
} catch (Exception e) {
// no groups mode
}
Jimm.getJimm().getCL().getManager().getContent().setTopByOffset(0);
Jimm.getJimm().getCL().getManager().getContent().setCurrentItemIndex(0);
update();
}
public void putIntoQueue(Update u) {
if (-1 == Util.getIndex(updateQueue, u)) {
updateQueue.addElement(u);
}
}
public void updateTree() {
while (!updateQueue.isEmpty()) {
Update update = (Update)updateQueue.firstElement();
updateQueue.removeElementAt(0);
model.updateOrder(update);
}
}
public ContactListModel createModel() {
if (!Options.getBoolean(Options.OPTION_USER_ACCOUNTS)) {
if (Options.getBoolean(Options.OPTION_USER_GROUPS)) {
model = new GroupContactModel();
} else {
model = new ContactModel();
}
} else {
if (Options.getBoolean(Options.OPTION_USER_GROUPS)) {
model = new ProtocolGroupContactModel();
} else {
model = new ProtocolContactModel();
}
}
return model;
}
public ContactListModel getModel() {
return model;
}
public ContactListModel getChatModel() {
return chatModel;
}
public void addProtocols(Vector<Protocol> protocols) {
model.addProtocols(protocols);
chatModel.addProtocols(protocols);
}
public void updateConnectionStatus() {
// #sijapp cond.if modules_ANDROID is "true" #
ru.net.jimm.JimmActivity.getInstance().service.updateConnectionState();
// #sijapp cond.end #
}
public void setCurrentContact(Contact currentContact) {
this.currentContact = currentContact;
}
public Contact getCurrentContact() {
return currentContact;
}
public void updateModel() {
for (int i = 0; i < model.getProtocolCount(); ++i) {
Protocol p = model.getProtocol(i);
synchronized (p.getRosterLockObject()) {
model.updateProtocol(p, null);
}
}
}
public static class Update {
public Protocol protocol;
public Group group;
public Contact contact;
public byte event;
public static final byte UPDATE = 1;
public static final byte PROTOCOL_UPDATE = 2;
public static final byte ADD = 3;
public static final byte GROUP_ADD = 4;
public static final byte REMOVE = 5;
public static final byte GROUP_REMOVE = 6;
public static final byte EXPAND = 7;
public Update(Protocol protocol, Group group, Contact contact, byte event) {
this.protocol = protocol;
this.group = group;
this.contact = contact;
this.event = event;
}
}
}