/// <summary>
        /// Adjust the Y coordinate of all the given nodes to match the Y coordinate of the confluence node.
        /// The operation will only be performed if there is only one confluence node. </summary>
        /// <returns> the number of nodes that were edited </returns>
        protected internal virtual int setNodeYToConfluenceY(IList <HydrologyNode> nodeList)
        {
            // First find the confluence node
            HydrologyNode confNode      = null;
            int           confNodeCount = 0;

            foreach (HydrologyNode node in nodeList)
            {
                if (node.getType() == HydrologyNode.NODE_TYPE_CONFLUENCE)
                {
                    confNode = node;
                    ++confNodeCount;
                }
            }
            int editCount = 0;

            if (confNodeCount == 1)
            {
                foreach (HydrologyNode node in nodeList)
                {
                    if (node != confNode)
                    {
                        // Set the coordinate...
                        node.setY(confNode.getY());
                        node.setDirty(true);
                        ++editCount;
                    }
                }
            }
            return(editCount);
        }
        /// <summary>
        /// Position the nodes evenly between the end nodes. </summary>
        /// <returns> the number of nodes that were edited </returns>
        protected internal virtual int positionNodesEvenlyBetweenEndNodes(IList <HydrologyNode> nodeList)
        {
            if (nodeList.Count < 3)
            {
                return(0);
            }
//JAVA TO C# CONVERTER WARNING: The .NET Type.FullName property will not always yield results identical to the Java Class.getName method:
            string routine = this.GetType().FullName + "positionNodesEvenlyBetweenEndNodes";
            // First make a copy of the list so that the sort does not change the original list
            IList <HydrologyNode> nodeListSorted = null;
            // Sort the list so that it is in the order from upstream to downstream
            int editCount = 0;

            try
            {
                nodeListSorted = sortNodesSequential(nodeList);
            }
            catch (Exception e)
            {
                // Likely not in a line
                Message.printWarning(1, routine, "Error positioning nodes (" + e + ").  Make sure that nodes are in a single reach with no branches.", this.__editorJFrame);
                Message.printWarning(3, routine, e);
                return(0);
            }
            HydrologyNode firstNode = nodeListSorted[0];
            HydrologyNode lastNode  = nodeListSorted[nodeListSorted.Count - 1];
            // Compute the delta between the first node and last node
            double dx = (lastNode.getX() - firstNode.getX()) / (nodeListSorted.Count - 1);
            double dy = (lastNode.getY() - firstNode.getY()) / (nodeListSorted.Count - 1);
            // Apply the delta to the middle nodes
            HydrologyNode node;

            for (int i = 1; i < nodeListSorted.Count - 1; i++)
            {
                node = nodeListSorted[i];
                node.setX(firstNode.getX() + dx * i);
                node.setY(firstNode.getY() + dy * i);
                node.setDirty(true);
                ++editCount;
            }
            return(editCount);
        }
        /// <summary>
        /// Responds to action performed events. </summary>
        /// <param name="e"> the ActionEvent that happened. </param>
        public virtual void actionPerformed(ActionEvent e)
        {
            string routine = "StateMod_RiverNetworkNode_JFrame.actionPerformed";

            if (Message.isDebugOn)
            {
                Message.printDebug(1, routine, "In actionPerformed: " + e.getActionCommand());
            }
            object source = e.getSource();

            if (source == __closeJButton)
            {
                saveCurrentRecord();
                int size = __riverNetworkNodesVector.Count;
                StateMod_RiverNetworkNode r = null;
                bool changed = false;
                for (int i = 0; i < size; i++)
                {
                    r = __riverNetworkNodesVector[i];
                    if (!changed && r.changed())
                    {
                        changed = true;
                    }
                    r.acceptChanges();
                }
                if (changed)
                {
                    __dataset.setDirty(StateMod_DataSet.COMP_RIVER_NETWORK, true);
                }
                if (__dataset_wm != null)
                {
                    __dataset_wm.closeWindow(StateMod_DataSet_WindowManager.WINDOW_RIVER_NETWORK);
                }
                else
                {
                    JGUIUtil.close(this);
                }
            }
            else if (source == __applyJButton)
            {
                saveCurrentRecord();
                int size = __riverNetworkNodesVector.Count;
                StateMod_RiverNetworkNode r = null;
                bool changed = false;
                for (int i = 0; i < size; i++)
                {
                    r = __riverNetworkNodesVector[i];
                    if (!changed && r.changed())
                    {
                        changed = true;
                    }
                    r.createBackup();
                }
                if (changed)
                {
                    __dataset.setDirty(StateMod_DataSet.COMP_RIVER_NETWORK, true);
                }
            }
            else if (source == __cancelJButton)
            {
                int size = __riverNetworkNodesVector.Count;
                StateMod_RiverNetworkNode r = null;
                for (int i = 0; i < size; i++)
                {
                    r = __riverNetworkNodesVector[i];
                    r.restoreOriginal();
                }
                if (__dataset_wm != null)
                {
                    __dataset_wm.closeWindow(StateMod_DataSet_WindowManager.WINDOW_RIVER_NETWORK);
                }
                else
                {
                    JGUIUtil.close(this);
                }
            }
            else if (source == __helpJButton)
            {
                // REVISIT HELP (JTS - 2003-08-18)
            }
            else if (source == __searchIDJRadioButton)
            {
                __searchName.setEditable(false);
                __searchID.setEditable(true);
            }
            else if (source == __searchNameJRadioButton)
            {
                __searchName.setEditable(true);
                __searchID.setEditable(false);
            }
            else if (source == __showOnMap_JButton)
            {
                GeoRecord geoRecord = getSelectedRiverNetworkNode().getGeoRecord();
                GRShape   shape     = geoRecord.getShape();
                __dataset_wm.showOnMap(getSelectedRiverNetworkNode(), "Node: " + getSelectedRiverNetworkNode().getID() + " - " + getSelectedRiverNetworkNode().getName(), new GRLimits(shape.xmin, shape.ymin, shape.xmax, shape.ymax), geoRecord.getLayer().getProjection());
            }
            else if (source == __showOnNetwork_JButton)
            {
                StateMod_Network_JFrame networkEditor = __dataset_wm.getNetworkEditor();
                if (networkEditor != null)
                {
                    HydrologyNode node = networkEditor.getNetworkJComponent().findNode(getSelectedRiverNetworkNode().getID(), false, false);
                    if (node != null)
                    {
                        __dataset_wm.showOnNetwork(getSelectedRiverNetworkNode(), "Node: " + getSelectedRiverNetworkNode().getID() + " - " + getSelectedRiverNetworkNode().getName(), new GRLimits(node.getX(), node.getY(), node.getX(), node.getY()));
                    }
                }
            }
            else if (source == __findNext)
            {
                searchWorksheet(__worksheet.getSelectedRow() + 1);
            }
            else if (source == __searchID || source == __searchName)
            {
                searchWorksheet(0);
            }
        }