//*************************************************************************
        //  Constructor: GeneralUserSettingsDialog()
        //
        /// <summary>
        /// Initializes a new instance of the <see
        /// cref="GeneralUserSettingsDialog" /> class.
        /// </summary>
        ///
        /// <param name="generalUserSettings">
        /// The object being edited.
        /// </param>
        ///
        /// <param name="workbook">
        /// Workbook containing the graph data.
        /// </param>
        //*************************************************************************
        public GeneralUserSettingsDialog(
            GeneralUserSettings generalUserSettings,
            Microsoft.Office.Interop.Excel.Workbook workbook
            )
        {
            Debug.Assert(generalUserSettings != null);
            Debug.Assert(workbook != null);
            generalUserSettings.AssertValid();

            m_oGeneralUserSettings = generalUserSettings;
            m_oWorkbook = workbook;
            m_oAxisFont = m_oGeneralUserSettings.AxisFont;
            m_oLabelUserSettings = m_oGeneralUserSettings.LabelUserSettings;

            // Instantiate an object that saves and retrieves the position of this
            // dialog.  Note that the object automatically saves the settings when
            // the form closes.

            m_oGeneralUserSettingsDialogUserSettings =
            new GeneralUserSettingsDialogUserSettings(this);

            InitializeComponent();

            nudEdgeWidth.Minimum =
            (Decimal)EdgeWidthConverter.MinimumWidthWorkbook;

            nudEdgeWidth.Maximum =
            (Decimal)EdgeWidthConverter.MaximumWidthWorkbook;

            nudSelectedEdgeWidth.Minimum =
            (Decimal)EdgeWidthConverter.MinimumWidthWorkbook;

            nudSelectedEdgeWidth.Maximum =
            (Decimal)EdgeWidthConverter.MaximumWidthWorkbook;

            nudRelativeArrowSize.Minimum =
            (Decimal)EdgeDrawer.MinimumRelativeArrowSize;

            nudRelativeArrowSize.Maximum =
            (Decimal)EdgeDrawer.MaximumRelativeArrowSize;

            nudVertexRadius.Minimum = nudVertexImageSize.Minimum =
            (Decimal)VertexRadiusConverter.MinimumRadiusWorkbook;

            nudVertexRadius.Maximum = nudVertexImageSize.Maximum =
            (Decimal)VertexRadiusConverter.MaximumRadiusWorkbook;

            ( new VertexShapeConverter() ).PopulateComboBox(cbxVertexShape, false);

            nudVertexAlpha.Minimum = nudEdgeAlpha.Minimum =
            (Decimal)AlphaConverter.MinimumAlphaWorkbook;

            nudVertexAlpha.Maximum = nudEdgeAlpha.Maximum =
            (Decimal)AlphaConverter.MaximumAlphaWorkbook;

            DoDataExchange(false);

            AssertValid();
        }
        //*************************************************************************
        //  Method: DoDataExchange()
        //
        /// <summary>
        /// Transfers data between the dialog's fields and its controls.
        /// </summary>
        ///
        /// <param name="bFromControls">
        /// true to transfer data from the dialog's controls to its fields, false
        /// for the other direction.
        /// </param>
        ///
        /// <returns>
        /// true if the transfer was successful.
        /// </returns>
        //*************************************************************************
        protected Boolean DoDataExchange(
            Boolean bFromControls
            )
        {
            if (bFromControls)
            {
            Boolean bUseSpecifiedVertexImageSize =
                radUseSpecifiedVertexImageSize.Checked;

            Single fEdgeWidth, fSelectedEdgeWidth, fRelativeArrowSize,
                fVertexRadius, fVertexAlpha, fEdgeAlpha;

            Single fVertexImageSize = 0;

            if (
                !ValidateNumericUpDown(nudVertexRadius,
                    "a size for simple vertex shapes", out fVertexRadius)
                ||
                ( bUseSpecifiedVertexImageSize &&
                    !ValidateNumericUpDown(nudVertexImageSize,
                    "a size for vertex images", out fVertexImageSize) )
                ||
                !ValidateNumericUpDown(nudVertexAlpha, "a vertex opacity",
                    out fVertexAlpha)
                ||
                !ValidateNumericUpDown(nudEdgeWidth,
                    "a width for unselected edges", out fEdgeWidth)
                ||
                !ValidateNumericUpDown(nudEdgeAlpha, "an edge opacity",
                    out fEdgeAlpha)
                ||
                !ValidateNumericUpDown(nudRelativeArrowSize,
                    "an arrow size", out fRelativeArrowSize)
                ||
                !ValidateNumericUpDown(nudSelectedEdgeWidth,
                    "a width for selected edges", out fSelectedEdgeWidth)
                )
            {
                return (false);
            }

            m_oGeneralUserSettings.BackColor = usrBackColor.Color;
            m_oGeneralUserSettings.EdgeWidth = fEdgeWidth;
            m_oGeneralUserSettings.SelectedEdgeWidth = fSelectedEdgeWidth;
            m_oGeneralUserSettings.RelativeArrowSize = fRelativeArrowSize;
            m_oGeneralUserSettings.EdgeColor = usrEdgeColor.Color;
            m_oGeneralUserSettings.EdgeAlpha = fEdgeAlpha;

            m_oGeneralUserSettings.SelectedEdgeColor =
                usrSelectedEdgeColor.Color;

            m_oGeneralUserSettings.VertexShape =
                (VertexShape)cbxVertexShape.SelectedValue;

            m_oGeneralUserSettings.VertexRadius = fVertexRadius;

            m_oGeneralUserSettings.VertexImageSize =
                bUseSpecifiedVertexImageSize ? fVertexImageSize :
                new Nullable<Single>();

            m_oGeneralUserSettings.VertexColor = usrVertexColor.Color;
            m_oGeneralUserSettings.VertexAlpha = fVertexAlpha;

            m_oGeneralUserSettings.SelectedVertexColor =
                usrSelectedVertexColor.Color;

            m_oGeneralUserSettings.AutoSelect = chkAutoSelect.Checked;
            m_oGeneralUserSettings.AxisFont = m_oAxisFont;
            m_oGeneralUserSettings.LabelUserSettings = m_oLabelUserSettings;

            m_oGeneralUserSettings.AutoReadWorkbook =
                chkAutoReadWorkbook.Checked;
            }
            else
            {
            usrBackColor.Color = m_oGeneralUserSettings.BackColor;
            nudEdgeWidth.Value = (Decimal)m_oGeneralUserSettings.EdgeWidth;

            nudSelectedEdgeWidth.Value =
                (Decimal)m_oGeneralUserSettings.SelectedEdgeWidth;

            nudRelativeArrowSize.Value =
                (Decimal)m_oGeneralUserSettings.RelativeArrowSize;

            usrEdgeColor.Color = m_oGeneralUserSettings.EdgeColor;
            nudEdgeAlpha.Value = (Decimal)m_oGeneralUserSettings.EdgeAlpha;

            usrSelectedEdgeColor.Color =
                m_oGeneralUserSettings.SelectedEdgeColor;

            cbxVertexShape.SelectedValue = m_oGeneralUserSettings.VertexShape;

            nudVertexRadius.Value =
                (Decimal)m_oGeneralUserSettings.VertexRadius;

            Nullable<Single> oVertexImageSize =
                m_oGeneralUserSettings.VertexImageSize;

            if (oVertexImageSize.HasValue)
            {
                radUseSpecifiedVertexImageSize.Checked = true;
                nudVertexImageSize.Value = (Decimal)oVertexImageSize.Value;
            }
            else
            {
                radUseActualVertexImageSize.Checked = true;
            }

            usrVertexColor.Color = m_oGeneralUserSettings.VertexColor;
            nudVertexAlpha.Value = (Decimal)m_oGeneralUserSettings.VertexAlpha;

            usrSelectedVertexColor.Color =
                m_oGeneralUserSettings.SelectedVertexColor;

            chkAutoSelect.Checked = m_oGeneralUserSettings.AutoSelect;

            m_oAxisFont = m_oGeneralUserSettings.AxisFont;

            m_oLabelUserSettings =
                m_oGeneralUserSettings.LabelUserSettings.Copy();

            chkAutoReadWorkbook.Checked =
                m_oGeneralUserSettings.AutoReadWorkbook;

            EnableControls();
            }

            return (true);
        }