/// <summary> /// Searching a contact upwards the treeview /// </summary> /// <param name="node"></param> /// <param name="pattern"></param> private void FindPrevious(RosterNode node, string pattern) { if (node.PrevVisibleNode != null) { while ( (((RosterNode)node.PrevVisibleNode).NodeType == RosterNodeType.RootNode || ((RosterNode)node.PrevVisibleNode).NodeType == RosterNodeType.GroupNode) && node.PrevVisibleNode.Nodes.Count > 0 && !node.PrevVisibleNode.IsExpanded ) { node.PrevVisibleNode.Expand(); } node = node.PrevVisibleNode as RosterNode; if (node.NodeType == RosterNodeType.RosterNode && node.Text.ToLower().Contains(pattern.ToLower())) { treeView.SelectedNode = node; node.EnsureVisible(); treeView.Focus(); } else { FindPrevious(node, pattern); } } }
private void toolStripButtonFindPrevious_Click(object sender, EventArgs e) { RosterNode node = treeView.SelectedNode as RosterNode; if (node != null) { FindPrevious(node, this.toolStripTextBox.Text); } }
/// <summary> /// Override the Clone function to Clone() the inherited RosterNode. /// </summary> /// <returns>cloned object</returns> public override object Clone() { RosterNode n = base.Clone() as RosterNode; n.NodeType = this.NodeType; n.RosterItem = this.RosterItem; //n.Presence = this.Presence; return(n); }
private void toolStripButtonFindNext_Click(object sender, EventArgs e) { RosterNode node = treeView.SelectedNode as RosterNode; if (node == null) { node = this.treeView.Nodes[0] as RosterNode; } FindNext(node, this.toolStripTextBox.Text); }
private void treeView_AfterExpand(object sender, TreeViewEventArgs e) { RosterNode rn = e.Node as RosterNode; if (rn.NodeType == RosterNodeType.RootNode || rn.NodeType == RosterNodeType.GroupNode) { rn.ImageIndex = IMAGE_EXPAND; rn.SelectedImageIndex = IMAGE_EXPAND; } }
private void treeView_AfterCollapse(object sender, TreeViewEventArgs e) { RosterNode rn = e.Node as RosterNode; if (rn.NodeType == RosterNodeType.RootNode || rn.NodeType == RosterNodeType.GroupNode) { rn.ImageIndex = IMAGE_COLLAPSE; rn.SelectedImageIndex = IMAGE_COLLAPSE; } }
private RosterNode GetGroup(RosterNode node, string group) { foreach (RosterNode n in node.Nodes) { if (n.NodeType == RosterNodeType.GroupNode && n.Name == group) { return(n); } } return(null); }
/// <summary> /// Adds a Group /// </summary> /// <param name="group"></param> /// <returns></returns> private RosterNode AddGroup(string group, RosterNode rn) { RosterNode n = new RosterNode(); n.NodeType = RosterNodeType.GroupNode; n.Text = group; // The groupname is stored in the the Name property n.Name = group; n.ImageIndex = IMAGE_COLLAPSE; n.SelectedImageIndex = IMAGE_COLLAPSE; rn.Nodes.Add(n); return(n); }
public int Compare(object x, object y) { RosterNode nodeX = x as RosterNode; RosterNode nodeY = y as RosterNode; if (nodeX.NodeType == RosterNodeType.RootNode && nodeY.NodeType == RosterNodeType.RootNode) { // don't sort this nodes, // they should always be in the order we added them in the Init() function // od the Roster Tree Control return(0); } else { return(string.Compare(nodeX.Text, nodeY.Text, true)); } }
public void Clear() { m_Roster.Clear(); treeView.Nodes.Clear(); m_RootOnline = new RosterNode("Online"); m_RootOnline.NodeType = RosterNodeType.RootNode; m_RootOnline.SelectedImageIndex = IMAGE_COLLAPSE; m_RootOnline.ImageIndex = IMAGE_COLLAPSE; m_RootOffline = new RosterNode("Offline"); m_RootOffline.NodeType = RosterNodeType.RootNode; m_RootOffline.SelectedImageIndex = IMAGE_COLLAPSE; m_RootOffline.ImageIndex = IMAGE_COLLAPSE; treeView.Nodes.Add(m_RootOnline); treeView.Nodes.Add(m_RootOffline); }
private void treeView_MouseMove(object sender, MouseEventArgs e) { RosterNode rn = this.treeView.GetNodeAt(e.X, e.Y) as RosterNode; if (rn != null && rn.NodeType == RosterNodeType.RosterNode) { int currentNodeIndex = rn.Index; if (currentNodeIndex != oldNodeIndex) { // Node Changed tool.Active = false; oldNodeIndex = currentNodeIndex; if (rn.RosterItem != null) { if (m_Roster.ContainsKey(rn.RosterItem.Jid.Bare)) { tool.Tooltiptext = rn.RosterItem.Jid.ToString(); tool.Tooltiptext += "\r\nSubscription: " + rn.RosterItem.Subscription.ToString(); RosterData d = m_Roster[rn.RosterItem.Jid.Bare]; if (d != null) { foreach (PresenceData p in d.Presences.Values) { tool.Tooltiptext += "\r\n\r\n" + "Resource: " + p.Presence.From.Resource; if (p.Presence.Status != null) { tool.Tooltiptext += "\r\n" + "Status: " + p.Presence.Status; } } } tool.Active = true; } } } } }
/// <summary> /// Moves a Node from the online section to the offline section or vice versa /// </summary> /// <param name="rdata"></param> /// <param name="from"></param> /// <param name="to"></param> private void MoveRoster(RosterData rdata, RosterNode from, RosterNode to) { RosterNode groupNode; string groupName = rdata.Group; groupNode = GetGroup(to, groupName); if (groupNode == null) { groupNode = AddGroup(groupName, to); } RosterNode newNode = rdata.RosterNode.Clone() as RosterNode; groupNode.Nodes.Add(newNode); // Expand all groupes in the Online Node if (to == m_RootOnline) { groupNode.Expand(); m_RootOnline.Expand(); } TreeNode Parent = rdata.RosterNode.Parent; rdata.RosterNode.Remove(); rdata.RosterNode = null; rdata.RosterNode = newNode; if (m_HideEmptyGroups) { if (Parent.Nodes.Count == 0) { Parent.Remove(); } } }
public PresenceData(RosterNode node) { m_Node = node; }
public PresenceData(RosterNode node, Presence pres) { m_Node = node; m_Presence = pres; }
public RosterData(RosterNode node) { m_RosterNode = node; }
/// <summary> /// Searching a contact upwards the treeview /// </summary> /// <param name="node"></param> /// <param name="pattern"></param> private void FindPrevious(RosterNode node, string pattern) { if (node.PrevVisibleNode != null) { while ( (((RosterNode)node.PrevVisibleNode).NodeType == RosterNodeType.RootNode || ((RosterNode)node.PrevVisibleNode).NodeType == RosterNodeType.GroupNode) && node.PrevVisibleNode.Nodes.Count > 0 && !node.PrevVisibleNode.IsExpanded ) node.PrevVisibleNode.Expand(); node = node.PrevVisibleNode as RosterNode; if ( node.NodeType == RosterNodeType.RosterNode && node.Text.ToLower().Contains(pattern.ToLower()) ) { treeView.SelectedNode = node; node.EnsureVisible(); treeView.Focus(); } else FindPrevious(node, pattern); } }
public void SetPresence(Presence pres) { // Dont handle presence errors for now if (pres.Type == PresenceType.error) return; // We need a node all the time here RosterNode n; if (pres.Type == PresenceType.unavailable) { // The presence could also be a presence from a hroup chat. // So check here if its a presence from a rosterItem if (m_Roster.ContainsKey(pres.From.Bare)) { RosterData d = m_Roster[pres.From.Bare]; if (d != null) { if (d.Presences.ContainsKey(pres.From.ToString())) { PresenceData presData = d.Presences[pres.From.ToString()]; RosterNode parent = (RosterNode)presData.Node.Parent; presData.Node.Remove(); d.Presences.Remove(pres.From.ToString()); // Last Presence goes Offline if (d.Presences.Count == 0) { parent.ImageIndex = IMAGE_OFFLINE; parent.SelectedImageIndex = IMAGE_OFFLINE; // If Online Move it to the Offline Section if (GetRootFromLeaf(d.RosterNode) == m_RootOnline) { MoveRoster(d, m_RootOnline, m_RootOffline); } } } } } } else { // Online Presence // The presence could also be a presence from a hroup chat. // So check here if its a presence from a rosterItem if (m_Roster.ContainsKey(pres.From.Bare)) { RosterData d = m_Roster[pres.From.Bare]; // Check if the roster is in the online section, when not then move it from Offline to Online if (!d.Online) { MoveRoster(d, m_RootOffline, m_RootOnline); } if (d != null) { int img = (int)pres.Show; if (img == -1) img = IMAGE_ONLINE; if (d.Presences.ContainsKey(pres.From.ToString())) { // Presence for this item available PresenceData presData = (PresenceData)d.Presences[pres.From.ToString()]; presData.Node.SelectedImageIndex = img; presData.Node.ImageIndex = img; presData.Node.Presence = pres; presData.Node.Parent.SelectedImageIndex = img; presData.Node.Parent.ImageIndex = img; presData.Presence = pres; } else { // Presence not available yet, so add it n = new RosterNode(pres.From.Resource, RosterNodeType.ResourceNode); n.SelectedImageIndex = img; n.ImageIndex = img; n.Presence = pres; d.RosterNode.Nodes.Add(n); n.Parent.SelectedImageIndex = img; n.Parent.ImageIndex = img; n.Name = ((RosterNode)n.Parent).Name; d.Presences.Add(pres.From.ToString(), new PresenceData(n, pres)); } } } } }
private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e) { // colors that depend if the row is currently selected or not, // assign to a system brush so should not be disposed // not selected colors RosterNode node = e.Node as RosterNode; Brush brushBack = SystemBrushes.Window; Brush brushText = null; switch (node.NodeType) { case RosterNodeType.GroupNode: brushText = new SolidBrush(m_ColorGroup); break; case RosterNodeType.RootNode: brushText = new SolidBrush(m_ColorRoot); break; case RosterNodeType.ResourceNode: brushText = new SolidBrush(m_ColorResource); break; case RosterNodeType.RosterNode: brushText = new SolidBrush(m_ColorRoster); break; default: brushText = new SolidBrush(SystemColors.ControlText); break; } Font textFont; if (node.NodeType == RosterNodeType.GroupNode || node.NodeType == RosterNodeType.RootNode) { textFont = new Font(this.Font.FontFamily, this.Font.Size, FontStyle.Bold); } else { textFont = this.Font; } if ((e.State & TreeNodeStates.Selected) != 0) { if ((e.State & TreeNodeStates.Focused) != 0) { // selected and has focus brushBack = SystemBrushes.Highlight; brushText = SystemBrushes.HighlightText; } else { // selected and does not have focus brushBack = SystemBrushes.Control; } } SizeF textSize = e.Graphics.MeasureString(e.Node.Text, textFont); RectangleF rc = new RectangleF(e.Bounds.X, e.Bounds.Y, textSize.Width + 2, e.Bounds.Height); // draw node background e.Graphics.FillRectangle(brushBack, rc); if (rc.Width > 0 && rc.Height > 0) { rc = new RectangleF(e.Bounds.X, e.Bounds.Y + (int)(e.Bounds.Height - this.Font.Height) / 2, textSize.Width, e.Bounds.Height); e.Graphics.DrawString(e.Node.Text, textFont, brushText, rc); } }
private RosterNode GetGroup(RosterNode node, string group) { foreach (RosterNode n in node.Nodes) { if (n.NodeType == RosterNodeType.GroupNode && n.Name == group) return n; } return null; }
/// <summary> /// Adds a Group /// </summary> /// <param name="group"></param> /// <returns></returns> private RosterNode AddGroup(string group, RosterNode rn) { RosterNode n = new RosterNode(); n.NodeType = RosterNodeType.GroupNode; n.Text = group; // The groupname is stored in the the Name property n.Name = group; n.ImageIndex = IMAGE_COLLAPSE; n.SelectedImageIndex = IMAGE_COLLAPSE; rn.Nodes.Add(n); return n; }
public RosterNode AddRosterItem(agsXMPP.protocol.iq.roster.RosterItem ritem) { string nodeText = ritem.Name != null ? ritem.Name : ritem.Jid.ToString(); RosterNode node; if (!m_Roster.ContainsKey(ritem.Jid.ToString())) { node = new RosterNode(); node.Text = nodeText; node.RosterItem = ritem; node.NodeType = RosterNodeType.RosterNode; node.ImageIndex = IMAGE_OFFLINE; node.SelectedImageIndex = IMAGE_OFFLINE; string groupname; if (ritem.GetGroups().Count > 0) { Group g = (Group)ritem.GetGroups().Item(0); groupname = g.Name; } else { groupname = m_DefaultGroupName; } RosterNode group = GetGroup(m_RootOffline, groupname); if (group == null) group = AddGroup(groupname, m_RootOffline); group.Nodes.Add(node); //group.Text = group.Name + " (" + group.Nodes.Count.ToString() + ")"; m_Roster.Add(ritem.Jid.ToString(), new RosterData(node)); return node; } else { if (m_Roster[ritem.Jid.ToString()].Online) { // We upate a rosterItem which is online and has Presences // So store this Presences before we remove this item and add them to the // new Node again Presence[] pres = new Presence[m_Roster[ritem.Jid.ToString()].Presences.Count]; int i= 0; Dictionary<string, PresenceData>.Enumerator myEnum = m_Roster[ritem.Jid.ToString()].Presences.GetEnumerator(); while (myEnum.MoveNext()) { pres[i] = myEnum.Current.Value.Presence; i++; } RemoveRosterItem(ritem); node = AddRosterItem(ritem); foreach (Presence p in pres) { SetPresence(p); } return node; } else { RemoveRosterItem(ritem); return AddRosterItem(ritem); } } }
public RosterNode AddRosterItem(agsXMPP.protocol.iq.roster.RosterItem ritem) { string nodeText = ritem.Name != null ? ritem.Name : ritem.Jid.ToString(); RosterNode node; if (!m_Roster.ContainsKey(ritem.Jid.ToString())) { node = new RosterNode(); node.Text = nodeText; node.RosterItem = ritem; node.NodeType = RosterNodeType.RosterNode; node.ImageIndex = IMAGE_OFFLINE; node.SelectedImageIndex = IMAGE_OFFLINE; string groupname; if (ritem.GetGroups().Count > 0) { Group g = (Group)ritem.GetGroups().Item(0); groupname = g.Name; } else { groupname = m_DefaultGroupName; } RosterNode group = GetGroup(m_RootOffline, groupname); if (group == null) { group = AddGroup(groupname, m_RootOffline); } group.Nodes.Add(node); //group.Text = group.Name + " (" + group.Nodes.Count.ToString() + ")"; m_Roster.Add(ritem.Jid.ToString(), new RosterData(node)); return(node); } else { if (m_Roster[ritem.Jid.ToString()].Online) { // We upate a rosterItem which is online and has Presences // So store this Presences before we remove this item and add them to the // new Node again Presence[] pres = new Presence[m_Roster[ritem.Jid.ToString()].Presences.Count]; int i = 0; Dictionary <string, PresenceData> .Enumerator myEnum = m_Roster[ritem.Jid.ToString()].Presences.GetEnumerator(); while (myEnum.MoveNext()) { pres[i] = myEnum.Current.Value.Presence; i++; } RemoveRosterItem(ritem); node = AddRosterItem(ritem); foreach (Presence p in pres) { SetPresence(p); } return(node); } else { RemoveRosterItem(ritem); return(AddRosterItem(ritem)); } } }
/// <summary> /// Moves a Node from the online section to the offline section or vice versa /// </summary> /// <param name="rdata"></param> /// <param name="from"></param> /// <param name="to"></param> private void MoveRoster(RosterData rdata, RosterNode from, RosterNode to) { RosterNode groupNode; string groupName = rdata.Group; groupNode = GetGroup(to, groupName); if (groupNode == null) groupNode = AddGroup(groupName, to); RosterNode newNode = rdata.RosterNode.Clone() as RosterNode; groupNode.Nodes.Add(newNode); // Expand all groupes in the Online Node if (to == m_RootOnline) { groupNode.Expand(); m_RootOnline.Expand(); } TreeNode Parent = rdata.RosterNode.Parent; rdata.RosterNode.Remove(); rdata.RosterNode = null; rdata.RosterNode = newNode; if (m_HideEmptyGroups) { if (Parent.Nodes.Count == 0) Parent.Remove(); } }
public void SetPresence(Presence pres) { // Dont handle presence errors for now if (pres.Type == PresenceType.error) { return; } // We need a node all the time here RosterNode n; if (pres.Type == PresenceType.unavailable) { // The presence could also be a presence from a hroup chat. // So check here if its a presence from a rosterItem if (m_Roster.ContainsKey(pres.From.Bare)) { RosterData d = m_Roster[pres.From.Bare]; if (d != null) { if (d.Presences.ContainsKey(pres.From.ToString())) { PresenceData presData = d.Presences[pres.From.ToString()]; RosterNode parent = (RosterNode)presData.Node.Parent; presData.Node.Remove(); d.Presences.Remove(pres.From.ToString()); // Last Presence goes Offline if (d.Presences.Count == 0) { parent.ImageIndex = IMAGE_OFFLINE; parent.SelectedImageIndex = IMAGE_OFFLINE; // If Online Move it to the Offline Section if (GetRootFromLeaf(d.RosterNode) == m_RootOnline) { MoveRoster(d, m_RootOnline, m_RootOffline); } } } } } } else { // Online Presence // The presence could also be a presence from a hroup chat. // So check here if its a presence from a rosterItem if (m_Roster.ContainsKey(pres.From.Bare)) { RosterData d = m_Roster[pres.From.Bare]; // Check if the roster is in the online section, when not then move it from Offline to Online if (!d.Online) { MoveRoster(d, m_RootOffline, m_RootOnline); } if (d != null) { int img = (int)pres.Show; if (img == -1) { img = IMAGE_ONLINE; } if (d.Presences.ContainsKey(pres.From.ToString())) { // Presence for this item available PresenceData presData = (PresenceData)d.Presences[pres.From.ToString()]; presData.Node.SelectedImageIndex = img; presData.Node.ImageIndex = img; presData.Node.Presence = pres; presData.Node.Parent.SelectedImageIndex = img; presData.Node.Parent.ImageIndex = img; presData.Presence = pres; } else { // Presence not available yet, so add it n = new RosterNode(pres.From.Resource, RosterNodeType.ResourceNode); n.SelectedImageIndex = img; n.ImageIndex = img; n.Presence = pres; d.RosterNode.Nodes.Add(n); n.Parent.SelectedImageIndex = img; n.Parent.ImageIndex = img; n.Name = ((RosterNode)n.Parent).Name; d.Presences.Add(pres.From.ToString(), new PresenceData(n, pres)); } } } } }