/// <summary> /// Sends an item picked event. /// </summary> private void BrowseTV_DoubleClick(object sender, System.EventArgs e) { try { // check if current selection is valid. TreeNode node = BrowseTV.SelectedNode; if (node == null || !typeof(TsCHdaBrowseElement).IsInstanceOfType(node.Tag)) { return; } // check if selection is an item. TsCHdaBrowseElement element = (TsCHdaBrowseElement)node.Tag; if (element.IsItem) { if (ItemPicked != null) { ItemPicked(new OpcItem[] { element }); } } } catch (Exception exception) { MessageBox.Show(exception.Message); } }
/// <summary> /// Sends an item selected event. /// </summary> private void BrowseTV_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e) { try { // ignore event if no listeners. if (ItemSelected == null) { return; } // check if the current selection is an item. TsCHdaBrowseElement element = null; TreeNode node = BrowseTV.SelectedNode; if (node != null && typeof(TsCHdaBrowseElement).IsInstanceOfType(node.Tag)) { if (((TsCHdaBrowseElement)node.Tag).IsItem) { element = (TsCHdaBrowseElement)node.Tag; } } // fire the event. ItemSelected(element); } catch (Exception exception) { MessageBox.Show(exception.Message); } }
/// <summary> /// Causes an item selected event to be sent for the current node. /// </summary> private void PickMI_Click(object sender, System.EventArgs e) { try { // check if current selection is valid. TreeNode node = BrowseTV.SelectedNode; if (node == null || node.Tag == null || node.Tag.GetType() != typeof(TsCHdaBrowseElement)) { return; } // raise event if selected element is an item. TsCHdaBrowseElement element = (TsCHdaBrowseElement)node.Tag; if (element.IsItem) { if (ItemPicked != null) { ItemPicked(new OpcItem[] { element }); } } } catch (Exception exception) { MessageBox.Show(exception.Message); } }
/// <summary> /// Updates the state of context menus based on the current selection. /// </summary> private void BrowseTV_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { // ignore left button actions. if (e.Button != MouseButtons.Right) { return; } // selects the item that was right clicked on. TreeNode clickedNode = BrowseTV.GetNodeAt(e.X, e.Y); // no item clicked on - do nothing. if (clickedNode == null) { return; } // force selection to clicked node. BrowseTV.SelectedNode = clickedNode; // disable everything. PickMI.Enabled = false; PickChildrenMI.Enabled = false; EditFiltersMI.Enabled = false; RefreshMI.Enabled = false; // setup menu for browse element nodes. if (typeof(TsCHdaBrowseElement).IsInstanceOfType(clickedNode.Tag)) { TsCHdaBrowseElement element = (TsCHdaBrowseElement)clickedNode.Tag; PickMI.Enabled = element.IsItem; PickChildrenMI.Enabled = element.HasChildren; EditFiltersMI.Enabled = element.HasChildren; RefreshMI.Enabled = element.HasChildren; return; } // setup menu for server nodes. if (typeof(TsCHdaServer).IsInstanceOfType(clickedNode.Tag)) { PickMI.Enabled = false; PickChildrenMI.Enabled = true; EditFiltersMI.Enabled = true; RefreshMI.Enabled = true; return; } }
/// <summary> /// Causes an item selected event to be sent for each child of of the current node. /// </summary> private void PickChildrenMI_Click(object sender, System.EventArgs e) { try { // check if current selection is valid. TreeNode node = BrowseTV.SelectedNode; if (node == null || node.Nodes.Count == 0) { return; } // build list of items contained in the selected branch. ArrayList items = new ArrayList(); foreach (TreeNode child in node.Nodes) { if (typeof(TsCHdaBrowseElement).IsInstanceOfType(child.Tag)) { TsCHdaBrowseElement element = (TsCHdaBrowseElement)child.Tag; if (element.IsItem) { items.Add(element); } } } // raise event at least one child item was found. if (items.Count > 0) { if (ItemPicked != null) { ItemPicked((OpcItem[])items.ToArray(typeof(OpcItem))); } } } catch (Exception exception) { MessageBox.Show(exception.Message); } }
/// <summary> /// Called before a node is about to expand. /// </summary> private void BrowseTV_BeforeExpand(object sender, System.Windows.Forms.TreeViewCancelEventArgs e) { TreeNode node = e.Node; if (node == null || node.Tag == null) { return; } if (node.Tag.GetType() == typeof(TsCHdaBrowseElement)) { TsCHdaBrowseElement element = (TsCHdaBrowseElement)node.Tag; // fetch children if they have not already been fetched. if (element.HasChildren && node.Nodes.Count == 1 && node.Nodes[0].Tag == null) { Browse(node, element); } } }
/// <summary> /// Called when the browse filters have changed. /// </summary> private void OnBrowseFiltersChanged(int maxElements, TsCHdaBrowseFilter[] filters) { try { // release existing browser. if (m_browser != null) { m_browser.Dispose(); m_browser = null; } // create a new browser. OpcResult[] results = null; m_browser = m_server.CreateBrowser(filters, out results); // save maximum elements to return in a single call. m_maxElements = maxElements; // update chidren of selected node. TreeNode node = BrowseTV.SelectedNode; if (node != null) { TsCHdaBrowseElement branch = null; if (node.Tag != null && node.Tag.GetType() == typeof(TsCHdaBrowseElement)) { branch = (TsCHdaBrowseElement)node.Tag; } Browse(node, branch); } } catch (Exception e) { MessageBox.Show(e.Message); } }
/// <summary> /// Browses for child nodes and populates the tree. /// </summary> private void Browse(TreeNode parent, TsCHdaBrowseElement branch) { // clear existing children. parent.Nodes.Clear(); // browse for the children of the node. TsCHdaBrowseElement[] children = null; IOpcBrowsePosition position = null; do { // fetch next batch of elements from the server. try { if (position == null) { children = m_browser.Browse(branch, m_maxElements, out position); } else { children = m_browser.BrowseNext(m_maxElements, ref position); } } catch (Exception e) { MessageBox.Show(e.Message); break; } // nothing more to do. if (children == null) { break; } // create a tree node for each child. foreach (TsCHdaBrowseElement child in children) { // create new node. TreeNode node = new TreeNode(child.Name); // set node icon. if (child.IsItem) { node.ImageIndex = Resources.IMAGE_GREEN_SCROLL; node.SelectedImageIndex = Resources.IMAGE_GREEN_SCROLL; } else { node.ImageIndex = Resources.IMAGE_CLOSED_YELLOW_FOLDER; node.SelectedImageIndex = Resources.IMAGE_CLOSED_YELLOW_FOLDER; } // save element. node.Tag = child; // add dummy child node for branches. if (child.HasChildren) { node.Nodes.Add(new TreeNode()); } // add top level node to root node. parent.Nodes.Add(node); } // prompt use to continue browse operation. if (position != null) { if (MessageBox.Show("More items exist. Continue browsing?", "Browse Items", MessageBoxButtons.YesNo) == DialogResult.No) { break; } } }while (position != null); // release browse position object if browse halted. if (position != null) { position.Dispose(); position = null; } }
/// <summary> /// Fetches the element names and item ids for each element. /// </summary> private ArrayList FetchElements(EnumString enumerator, int maxElements, bool isBranch) { ArrayList elements = new ArrayList(); while (elements.Count < maxElements) { // fetch next batch of element names. int count = BLOCK_SIZE; if (elements.Count + count > maxElements) { count = maxElements - elements.Count; } string[] names = null; names = enumerator.Next(count); // check if no more elements found. if (names == null || names.Length == 0) { break; } // create new element objects. foreach (string name in names) { TsCHdaBrowseElement element = new TsCHdaBrowseElement(); element.Name = name; // lookup item id for element. try { string itemID = null; m_browser.GetItemID(name, out itemID); element.ItemName = itemID; element.ItemPath = null; element.HasChildren = isBranch; } catch { // ignore errors. } elements.Add(element); } } // validate items - this is necessary to set the IsItem flag correctly. OpcItemResult[] results = m_server.ValidateItems((OpcItem[])elements.ToArray(typeof(OpcItem))); if (results != null) { for (int ii = 0; ii < results.Length; ii++) { if (results[ii].Result.Succeeded()) { ((TsCHdaBrowseElement)elements[ii]).IsItem = true; } } } // return results. return(elements); }