package jimmui.model.roster;
import jimmui.view.roster.ContactListModel;
import jimmui.view.roster.items.GroupBranch;
import jimmui.view.roster.items.ProtocolBranch;
import jimmui.updater.RosterUpdater;
import jimm.comm.Util;
import jimm.util.JLocale;
import jimmui.view.roster.items.TreeNode;
import protocol.Group;
import protocol.Protocol;
import protocol.Roster;
import java.util.Vector;
/**
* Created with IntelliJ IDEA.
* <p/>
* Date: 12.03.13 19:56
*
* @author vladimir
*/
public class GroupContactModel extends ContactListModel {
private Vector<GroupBranch> groups = new Vector<GroupBranch>();
private GroupBranch notInListGroup;
public GroupContactModel() {
// Not In List Group
notInListGroup = new GroupBranch(JLocale.getString("group_not_in_list"));
notInListGroup.setMode(Group.MODE_NONE);
}
public void buildFlatItems(Vector<TreeNode> items) {
// build
Vector groups = this.groups;
for (int groupIndex = 0; groupIndex < groups.size(); ++groupIndex) {
rebuildGroup((GroupBranch)groups.elementAt(groupIndex), !hideOffline, items);
}
rebuildGroup(notInListGroup, false, items);
}
public void updateOrder(RosterUpdater.Update u) {
switch (u.event) {
case RosterUpdater.Update.PROTOCOL_UPDATE:
Vector groups = u.protocol.getGroupItems();
for (int i = 0; i < groups.size(); ++i) {
u.group = (Group) groups.elementAt(i);
GroupBranch gb = getGroupNode(u);
gb.updateGroupData();
gb.sort();
}
u.group = null;
break;
case RosterUpdater.Update.UPDATE:
GroupBranch groupBranch = getGroupNode(u);
groupBranch.updateGroupData();
groupBranch.sort();
break;
}
}
public void removeGroup(RosterUpdater.Update u) {
boolean used = (null == u.group);
if (!used) {
for (int i = 0; i < getProtocolCount(); ++i) {
Protocol p = getProtocol(i);
if ((u.protocol != p) && (null != p.getGroup(u.group.getName()))) {
used = true;
break;
}
}
}
if (used) {
updateGroupContent(getGroupNode(u));
} else {
groups.removeElement(getGroupNode(u));
}
}
public void addGroup(RosterUpdater.Update u) {
GroupBranch gb = getGroupNode(u);
if (null == gb) {
gb = createGroup(u.group);
groups.addElement(gb);
Util.addAll(gb.getContacts(), u.protocol.getContacts(u.group));
} else {
updateGroupContent(gb);
}
gb.updateGroupData();
gb.sort();
Util.sort(groups);
}
private void updateGroupContent(GroupBranch groupBranch) {
boolean notInList = groupBranch == notInListGroup;
Vector groupContacts = groupBranch.getContacts();
groupContacts.removeAllElements();
for (int i = 0; i < getProtocolCount(); ++i) {
Protocol p = getProtocol(i);
Group g = notInList ? null : p.getGroup(groupBranch.getName());
if (notInList || (null != g)) {
Util.addAll(groupContacts, p.getContacts(g));
}
}
}
public GroupBranch getGroupNode(RosterUpdater.Update u) {
if (null == u.group) {
return notInListGroup;
}
String name = u.group.getName();
GroupBranch g;
for (int i = 0; i < groups.size(); ++i) {
g = (GroupBranch) groups.elementAt(i);
if (name.equals(g.getName())) {
return g;
}
}
return null;
}
public ProtocolBranch getProtocolNode(RosterUpdater.Update u) {
return null;
}
@Override
public boolean hasGroups() {
return true;
}
public void updateProtocol(Protocol protocol, Roster oldRoster) {
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);
Util.sort(groups);
}
}