/// <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;
            }
        }
Esempio n. 9
0
        /// <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);
        }