package jimmui.model.roster;
import jimm.comm.Util;
import jimmui.view.roster.ContactListModel;
import jimmui.view.roster.items.GroupBranch;
import jimmui.view.roster.items.ProtocolBranch;
import jimmui.updater.RosterUpdater;
import jimmui.view.roster.items.TreeNode;
import protocol.Group;
import protocol.Protocol;
import protocol.Roster;
import java.util.Hashtable;
import java.util.Vector;
/**
* Created with IntelliJ IDEA.
* <p/>
* Date: 20.06.13 21:00
*
* @author vladimir
*/
public class ProtocolGroupContactModel extends ContactListModel {
private Hashtable<Protocol, ProtocolBranch> protos = new Hashtable<Protocol, ProtocolBranch>();
public void buildFlatItems(Vector<TreeNode> items) {
final int count = getProtocolCount();
for (int i = 0; i < count; ++i) {
Protocol p = getProtocol(i);
ProtocolBranch root = (ProtocolBranch) protos.get(p);
items.addElement(root);
if (!root.isExpanded()) continue;
synchronized (p.getRosterLockObject()) {
Vector groups = root.getGroups();
for (int groupIndex = 0; groupIndex < groups.size(); ++groupIndex) {
rebuildGroup((GroupBranch)groups.elementAt(groupIndex), !hideOffline, items);
}
rebuildGroup(root.getNotInListGroup(), false, items);
}
}
}
public void updateOrder(RosterUpdater.Update u) {
switch (u.event) {
case RosterUpdater.Update.PROTOCOL_UPDATE:
Vector groups = getProtocolNode(u).getGroups();
for (int i = 0; i < groups.size(); ++i) {
GroupBranch gb = (GroupBranch) groups.elementAt(i);
gb.updateGroupData();
gb.sort();
}
break;
case RosterUpdater.Update.UPDATE:
GroupBranch groupBranch = getGroupNode(u);
groupBranch.updateGroupData();
groupBranch.sort();
break;
}
}
public void removeGroup(RosterUpdater.Update u) {
getProtocolNode(u).removeGroup(u.group);
}
public void addGroup(RosterUpdater.Update u) {
GroupBranch groupBranch = getGroupNode(u);
if (null == groupBranch) {
groupBranch = createGroup(u.group);
getProtocolNode(u).getGroups().addElement(groupBranch);
}
Vector groupItems = groupBranch.getContacts();
groupItems.removeAllElements();
Util.addAll(groupItems, u.protocol.getContacts(u.group));
groupBranch.updateGroupData();
groupBranch.sort();
}
public GroupBranch getGroupNode(RosterUpdater.Update u) {
return getProtocolNode(u).getGroupNode(u.group);
}
public ProtocolBranch getProtocolNode(RosterUpdater.Update u) {
return (ProtocolBranch) protos.get(u.protocol);
}
@Override
public boolean hasGroups() {
return true;
}
public void updateProtocol(Protocol protocol, Roster oldRoster) {
ProtocolBranch protocolBranch = new ProtocolBranch(protocol);
protos.put(protocol, protocolBranch);
RosterUpdater.Update u = new RosterUpdater.Update(protocol, null, null, RosterUpdater.Update.GROUP_REMOVE);
if (null != oldRoster) {
for (int i = 0; i < oldRoster.groups.size(); ++i) {
u.group = (Group) oldRoster.groups.elementAt(i);
removeGroup(u);
}
u.group = null;
removeGroup(u);
}
u.event = RosterUpdater.Update.GROUP_ADD;
Vector inGroups = protocol.getGroupItems();
for (int i = 0; i < inGroups.size(); ++i) {
u.group = (Group) inGroups.elementAt(i);
addGroup(u);
}
u.group = null;
addGroup(u);
}
}