Beispiel #1
0
        AddEdgeColorAttributesToDConnectorMotif
        (
            ExcelTemplateGroupInfo oGroup,
            Boolean bEdgeColorColumnAutoFilled,
            AutoFillColorColumnResults oEdgeColorResults,
            ColorColumnAutoFillUserSettings oEdgeColorDetails,
            Dictionary <Int32, Object> oEdgeColorSourceDictionary,
            ReadWorkbookContext oReadWorkbookContext,
            CollapsedGroupAttributes oCollapsedGroupAttributes,
            Int32 iAnchorVertices
        )
        {
            Debug.Assert(oGroup != null);
            Debug.Assert(oEdgeColorResults != null);
            Debug.Assert(oReadWorkbookContext != null);
            Debug.Assert(oCollapsedGroupAttributes != null);
            Debug.Assert(iAnchorVertices >= 0);

            // If the edge color column was autofilled, get the average color for
            // the edges incident to the D-connector motif's first anchor, then its
            // second anchor, and so on.  Otherwise, don't do anything.

            if (!bEdgeColorColumnAutoFilled)
            {
                return;
            }

            for (Int32 iAnchorVertexIndex = 0;
                 iAnchorVertexIndex < iAnchorVertices;
                 iAnchorVertexIndex++)
            {
                Color oAverageColor;

                if (TableColumnMapper.TryMapAverageColor(

                        GetRowIDsToAverageForEdges(oGroup,
                                                   oCollapsedGroupAttributes, iAnchorVertexIndex),

                        oEdgeColorSourceDictionary,
                        oEdgeColorResults.SourceCalculationNumber1,
                        oEdgeColorResults.SourceCalculationNumber2,
                        oEdgeColorResults.DestinationColor1,
                        oEdgeColorResults.DestinationColor2,
                        oEdgeColorDetails.UseLogs,
                        out oAverageColor)
                    )
                {
                    oCollapsedGroupAttributes.Add(

                        CollapsedGroupAttributeKeys.GetAnchorVertexEdgeColorKey(
                            iAnchorVertexIndex),

                        oReadWorkbookContext.ColorConverter2.GraphToWorkbook(
                            oAverageColor)
                        );
                }
            }
        }
        ConvertFrom
        (
            ITypeDescriptorContext context,
            CultureInfo culture,
            Object value
        )
        {
            Debug.Assert(value != null);
            Debug.Assert(value is String);
            AssertValid();

            ColorColumnAutoFillUserSettings oColorColumnAutoFillUserSettings =
                new ColorColumnAutoFillUserSettings();

            ColorConverter oColorConverter = new ColorConverter();

            String [] asStrings = ((String)value).Split(new Char[] { '\t' });

            Debug.Assert(asStrings.Length >= 7);

            oColorColumnAutoFillUserSettings.UseSourceNumber1 =
                Boolean.Parse(asStrings[0]);

            oColorColumnAutoFillUserSettings.UseSourceNumber2 =
                Boolean.Parse(asStrings[1]);

            oColorColumnAutoFillUserSettings.SourceNumber1 =
                MathUtil.ParseCultureInvariantDouble(asStrings[2]);

            oColorColumnAutoFillUserSettings.SourceNumber2 =
                MathUtil.ParseCultureInvariantDouble(asStrings[3]);

            oColorColumnAutoFillUserSettings.DestinationColor1 =
                (Color)oColorConverter.ConvertFromInvariantString(asStrings[4]);

            oColorColumnAutoFillUserSettings.DestinationColor2 =
                (Color)oColorConverter.ConvertFromInvariantString(asStrings[5]);

            oColorColumnAutoFillUserSettings.IgnoreOutliers =
                Boolean.Parse(asStrings[6]);

            // The UseLogs property wasn't added until NodeXL version 1.0.1.92.

            oColorColumnAutoFillUserSettings.UseLogs =
                (asStrings.Length > 7) ? Boolean.Parse(asStrings[7]) : false;

            // The SourceColumnContainsNumbers property wasn't added until NodeXL
            // version 1.0.1.153.

            oColorColumnAutoFillUserSettings.SourceColumnContainsNumbers =
                (asStrings.Length > 8) ? Boolean.Parse(asStrings[8]) : true;

            return(oColorColumnAutoFillUserSettings);
        }
Beispiel #3
0
        AddVertexColorAttributeToMotif
        (
            ExcelTemplateGroupInfo oGroup,
            String sType,
            Boolean bVertexColorColumnAutoFilled,
            AutoFillColorColumnResults oVertexColorResults,
            ColorColumnAutoFillUserSettings oVertexColorDetails,
            Dictionary <Int32, Object> oVertexColorSourceDictionary,
            ReadWorkbookContext oReadWorkbookContext,
            CollapsedGroupAttributes oCollapsedGroupAttributes
        )
        {
            Debug.Assert(oGroup != null);
            Debug.Assert(!String.IsNullOrEmpty(sType));
            Debug.Assert(oVertexColorResults != null);
            Debug.Assert(oReadWorkbookContext != null);
            Debug.Assert(oCollapsedGroupAttributes != null);

            Color oColor;

            // If the vertex color column was autofilled, get the average color
            // for the vertices in the motif.

            if (
                !bVertexColorColumnAutoFilled
                ||
                !TableColumnMapper.TryMapAverageColor(

                    GetRowIDsToAverageForVertexColor(oGroup,
                                                     oCollapsedGroupAttributes, sType),

                    oVertexColorSourceDictionary,
                    oVertexColorResults.SourceCalculationNumber1,
                    oVertexColorResults.SourceCalculationNumber2,
                    oVertexColorResults.DestinationColor1,
                    oVertexColorResults.DestinationColor2,
                    oVertexColorDetails.UseLogs,
                    out oColor)
                )
            {
                // Default to the color that was assigned to the group.

                oColor = oGroup.VertexColor;
            }

            oCollapsedGroupAttributes.Add(
                CollapsedGroupAttributeKeys.VertexColor,
                oReadWorkbookContext.ColorConverter2.GraphToWorkbook(oColor)
                );
        }
        ConvertTo
        (
            ITypeDescriptorContext context,
            CultureInfo culture,
            Object value,
            Type destinationType
        )
        {
            Debug.Assert(value != null);
            Debug.Assert(value is ColorColumnAutoFillUserSettings);
            Debug.Assert(destinationType == typeof(String));
            AssertValid();

            ColorColumnAutoFillUserSettings oColorColumnAutoFillUserSettings =
                (ColorColumnAutoFillUserSettings)value;

            ColorConverter oColorConverter = new ColorConverter();

            // Use a simple tab-delimited format.  Sample string:
            //
            // "false\tfalse\t0\t10\tRed\tGreen\tfalse\tfalse\ttrue"
            //
            // WARNING: If this format is changed, you must also change the
            // DefaultSettingValueAttribute for each property in the
            // AutoFillUserSettings class that is of type
            // ColorColumnAutoFillUserSettings.

            return(String.Format(CultureInfo.InvariantCulture,

                                 "{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}"
                                 ,
                                 oColorColumnAutoFillUserSettings.UseSourceNumber1,
                                 oColorColumnAutoFillUserSettings.UseSourceNumber2,
                                 oColorColumnAutoFillUserSettings.SourceNumber1,
                                 oColorColumnAutoFillUserSettings.SourceNumber2,

                                 oColorConverter.ConvertToInvariantString(
                                     oColorColumnAutoFillUserSettings.DestinationColor1),

                                 oColorConverter.ConvertToInvariantString(
                                     oColorColumnAutoFillUserSettings.DestinationColor2),

                                 oColorColumnAutoFillUserSettings.IgnoreOutliers,
                                 oColorColumnAutoFillUserSettings.UseLogs,
                                 oColorColumnAutoFillUserSettings.SourceColumnContainsNumbers
                                 ));
        }
        TryAutoFillColorColumn
        (
            ListObject oTable,
            String sSourceColumnName,
            String sDestinationColumnName,
            ColorColumnAutoFillUserSettings oDetails,
            out Boolean bSourceColumnContainsNumbers,
            out Double dSourceCalculationNumber1,
            out Double dSourceCalculationNumber2,
            out Int32 iDecimalPlaces,
            out ICollection <String> oCategoryNames
        )
        {
            Debug.Assert(oTable != null);
            Debug.Assert(!String.IsNullOrEmpty(sDestinationColumnName));
            Debug.Assert(oDetails != null);

            bSourceColumnContainsNumbers = oDetails.SourceColumnContainsNumbers;
            dSourceCalculationNumber1    = 0;
            dSourceCalculationNumber2    = 1;
            iDecimalPlaces = 0;
            oCategoryNames = null;

            if (String.IsNullOrEmpty(sSourceColumnName))
            {
                return(false);
            }

            if (bSourceColumnContainsNumbers)
            {
                return(TableColumnMapper.TryMapToColor(oTable,
                                                       sSourceColumnName, sDestinationColumnName,
                                                       oDetails.UseSourceNumber1, oDetails.UseSourceNumber2,
                                                       oDetails.SourceNumber1, oDetails.SourceNumber2,
                                                       oDetails.DestinationColor1, oDetails.DestinationColor2,
                                                       oDetails.IgnoreOutliers, oDetails.UseLogs,
                                                       out dSourceCalculationNumber1, out dSourceCalculationNumber2,
                                                       out iDecimalPlaces
                                                       ));
            }

            return(TableColumnMapper.TryMapToColor(oTable, sSourceColumnName,
                                                   sDestinationColumnName, out oCategoryNames));
        }
Beispiel #6
0
        //*************************************************************************
        //  Constructor: ColorColumnAutoFillUserSettingsDialog()
        //
        /// <summary>
        /// Initializes a new instance of the <see
        /// cref="ColorColumnAutoFillUserSettingsDialog" /> class.
        /// </summary>
        ///
        /// <param name="colorColumnAutoFillUserSettings">
        /// Object to edit.
        /// </param>
        ///
        /// <param name="dialogCaption">
        /// Dialog caption.
        /// </param>
        //*************************************************************************

        public ColorColumnAutoFillUserSettingsDialog
        (
            ColorColumnAutoFillUserSettings colorColumnAutoFillUserSettings,
            String dialogCaption
        )
        {
            Debug.Assert(colorColumnAutoFillUserSettings != null);
            Debug.Assert(!String.IsNullOrEmpty(dialogCaption));

            InitializeComponent();

            m_oColorColumnAutoFillUserSettings = colorColumnAutoFillUserSettings;

            // 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_oColorColumnAutoFillUserSettingsDialogUserSettings =
                new ColorColumnAutoFillUserSettingsDialogUserSettings(this);

            this.Text = dialogCaption;

            // The label that explains categories, which is shown only when
            // "Categories" is selected in the cbxSourceColumnContainsNumbers
            // ComboBox, is shown in the wrong place in the designer to make it
            // readable.  Move it to its correct location.

            lblSourceColumnContainsCategories.Location = new Point(12, 70);

            cbxSourceColumnContainsNumbers.PopulateWithObjectsAndText(
                false, "Categories", true, "Numbers"
                );

            lnkOutliersAndLogs.Tag = AutoFillWorkbookDialog.OutliersAndLogsMessage;

            DoDataExchange(false);

            UpdateColorGradient();

            AssertValid();
        }
    //*************************************************************************
    //  Constructor: ColorColumnAutoFillUserSettingsDialog()
    //
    /// <summary>
    /// Initializes a new instance of the <see
    /// cref="ColorColumnAutoFillUserSettingsDialog" /> class.
    /// </summary>
    ///
    /// <param name="colorColumnAutoFillUserSettings">
    /// Object to edit.
    /// </param>
    ///
    /// <param name="dialogCaption">
    /// Dialog caption.
    /// </param>
    //*************************************************************************

    public ColorColumnAutoFillUserSettingsDialog
    (
        ColorColumnAutoFillUserSettings colorColumnAutoFillUserSettings,
        String dialogCaption
    )
    {
        Debug.Assert(colorColumnAutoFillUserSettings != null);
        Debug.Assert( !String.IsNullOrEmpty(dialogCaption) );

        InitializeComponent();

        m_oColorColumnAutoFillUserSettings = colorColumnAutoFillUserSettings;

        // 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_oColorColumnAutoFillUserSettingsDialogUserSettings =
            new ColorColumnAutoFillUserSettingsDialogUserSettings(this);

        this.Text = dialogCaption;

        // The label that explains categories, which is shown only when
        // "Categories" is selected in the cbxSourceColumnContainsNumbers
        // ComboBox, is shown in the wrong place in the designer to make it
        // readable.  Move it to its correct location.

        lblSourceColumnContainsCategories.Location = new Point(12, 70);

        cbxSourceColumnContainsNumbers.PopulateWithObjectsAndText(
            false, "Categories", true, "Numbers"
            );

        lnkOutliersAndLogs.Tag = AutoFillWorkbookDialog.OutliersAndLogsMessage;

        DoDataExchange(false);

        UpdateColorGradient();

        AssertValid();
    }
Beispiel #8
0
        AddCollapsedGroupAttributesInternal
        (
            Microsoft.Office.Interop.Excel.Workbook oWorkbook,
            ReadWorkbookContext oReadWorkbookContext,
            ListObject oEdgeTable,
            ListObject oVertexTable,
            GroupInfo[] aoGroups
        )
        {
            Debug.Assert(oWorkbook != null);
            Debug.Assert(oReadWorkbookContext != null);
            Debug.Assert(oEdgeTable != null);
            Debug.Assert(oVertexTable != null);
            Debug.Assert(aoGroups != null);
            Debug.Assert(aoGroups.Length > 0);

            // Check whether relevant columns have been autofilled using numerical
            // source columns.

            PerWorkbookSettings oPerWorkbookSettings =
                new PerWorkbookSettings(oWorkbook);

            AutoFillColorColumnResults oVertexColorResults =
                oPerWorkbookSettings.AutoFillWorkbookResults.VertexColorResults;

            Boolean bVertexColorColumnAutoFilled =
                oVertexColorResults.ColumnAutoFilled &&
                !oVertexColorResults.ColumnAutoFilledWithCategories;

            AutoFillColorColumnResults oEdgeColorResults =
                oPerWorkbookSettings.AutoFillWorkbookResults.EdgeColorResults;

            Boolean bEdgeColorColumnAutoFilled =
                oEdgeColorResults.ColumnAutoFilled &&
                !oEdgeColorResults.ColumnAutoFilledWithCategories;

            AutoFillNumericRangeColumnResults oEdgeWidthResults =
                oPerWorkbookSettings.AutoFillWorkbookResults.EdgeWidthResults;

            Boolean bEdgeWidthColumnAutoFilled =
                oEdgeWidthResults.ColumnAutoFilled;

            // Some user settings for autofill may be needed.
            //
            // Note: This is a design bug.  The user's current settings should not
            // be required; everything needed here should come from the autofill
            // results.  The long-term fix is to add a UseLogs property to the
            // AutoFillColorColumnResults class.

            AutoFillUserSettings oAutoFillUserSettings =
                new AutoFillUserSettings();

            ColorColumnAutoFillUserSettings oVertexColorDetails =
                oAutoFillUserSettings.VertexColorDetails;

            ColorColumnAutoFillUserSettings oEdgeColorDetails =
                oAutoFillUserSettings.EdgeColorDetails;

            NumericRangeColumnAutoFillUserSettings oEdgeWidthDetails =
                oAutoFillUserSettings.EdgeWidthDetails;

            // The key is the row ID for each visible row in the vertex table and
            // the value is value of the source column cell in that row that was
            // used to autofill the vertex color column, if it was autofilled.

            Dictionary <Int32, Object> oVertexColorSourceDictionary =
                bVertexColorColumnAutoFilled ?

                GetRowIDDictionary(oVertexTable,
                                   oVertexColorResults.SourceColumnName)
            :
                null;

            // Ditto for edge colors and edge widths.

            Dictionary <Int32, Object> oEdgeColorSourceDictionary =
                bEdgeColorColumnAutoFilled ?

                GetRowIDDictionary(oEdgeTable, oEdgeColorResults.SourceColumnName)
            :
                null;

            Dictionary <Int32, Object> oEdgeWidthSourceDictionary =
                bEdgeWidthColumnAutoFilled ?

                GetRowIDDictionary(oEdgeTable, oEdgeWidthResults.SourceColumnName)
            :
                null;

            // Only motifs need to have attributes added to them.

            foreach (ExcelTemplateGroupInfo oGroup in aoGroups.Where(
                         oGroup => oGroup.CollapsedAttributes != null))
            {
                CollapsedGroupAttributes oCollapsedGroupAttributes =
                    CollapsedGroupAttributes.FromString(
                        oGroup.CollapsedAttributes);

                String sType = oCollapsedGroupAttributes.GetGroupType();

                if (
                    sType == CollapsedGroupAttributeValues.FanMotifType
                    ||
                    sType == CollapsedGroupAttributeValues.DConnectorMotifType
                    ||
                    sType == CollapsedGroupAttributeValues.CliqueMotifType
                    )
                {
                    AddVertexColorAttributeToMotif(oGroup, sType,
                                                   bVertexColorColumnAutoFilled, oVertexColorResults,
                                                   oVertexColorDetails, oVertexColorSourceDictionary,
                                                   oReadWorkbookContext, oCollapsedGroupAttributes);
                }

                if (sType == CollapsedGroupAttributeValues.DConnectorMotifType)
                {
                    Int32 iAnchorVertices;

                    if (oCollapsedGroupAttributes.TryGetValue(
                            CollapsedGroupAttributeKeys.AnchorVertices,
                            out iAnchorVertices))
                    {
                        AddEdgeColorAttributesToDConnectorMotif(oGroup,
                                                                bEdgeColorColumnAutoFilled, oEdgeColorResults,
                                                                oEdgeColorDetails, oEdgeColorSourceDictionary,
                                                                oReadWorkbookContext, oCollapsedGroupAttributes,
                                                                iAnchorVertices);

                        AddEdgeWidthAttributesToDConnectorMotif(oGroup,
                                                                bEdgeWidthColumnAutoFilled, oEdgeWidthResults,
                                                                oEdgeWidthDetails, oEdgeWidthSourceDictionary,
                                                                oReadWorkbookContext, oCollapsedGroupAttributes,
                                                                iAnchorVertices);
                    }
                }

                oGroup.CollapsedAttributes = oCollapsedGroupAttributes.ToString();
            }
        }
    ConvertFrom
    (
        ITypeDescriptorContext context,
        CultureInfo culture,
        Object value
    )
    {
        Debug.Assert(value != null);
        Debug.Assert(value is String);
        AssertValid();

        ColorColumnAutoFillUserSettings oColorColumnAutoFillUserSettings =
            new ColorColumnAutoFillUserSettings();

        ColorConverter oColorConverter = new ColorConverter();

        String [] asStrings = ( (String)value ).Split( new Char[] {'\t'} );

        Debug.Assert(asStrings.Length >= 7);

        oColorColumnAutoFillUserSettings.UseSourceNumber1 =
            Boolean.Parse( asStrings[0] );

        oColorColumnAutoFillUserSettings.UseSourceNumber2 =
            Boolean.Parse( asStrings[1] );

        oColorColumnAutoFillUserSettings.SourceNumber1 =
            MathUtil.ParseCultureInvariantDouble( asStrings[2] );

        oColorColumnAutoFillUserSettings.SourceNumber2 =
            MathUtil.ParseCultureInvariantDouble(asStrings[3]);

        oColorColumnAutoFillUserSettings.DestinationColor1 =
            (Color)oColorConverter.ConvertFromInvariantString( asStrings[4] );

        oColorColumnAutoFillUserSettings.DestinationColor2 =
            (Color)oColorConverter.ConvertFromInvariantString( asStrings[5] );

        oColorColumnAutoFillUserSettings.IgnoreOutliers =
            Boolean.Parse( asStrings[6] );

        // The UseLogs property wasn't added until NodeXL version 1.0.1.92.

        oColorColumnAutoFillUserSettings.UseLogs =
            (asStrings.Length > 7) ? Boolean.Parse( asStrings[7] ) : false;

        // The SourceColumnContainsNumbers property wasn't added until NodeXL
        // version 1.0.1.153.

        oColorColumnAutoFillUserSettings.SourceColumnContainsNumbers =
            (asStrings.Length > 8) ? Boolean.Parse( asStrings[8] ) : true;

        return (oColorColumnAutoFillUserSettings);
    }
    AddEdgeColorAttributesToDConnectorMotif
    (
        ExcelTemplateGroupInfo oGroup,
        Boolean bEdgeColorColumnAutoFilled,
        AutoFillColorColumnResults oEdgeColorResults,
        ColorColumnAutoFillUserSettings oEdgeColorDetails,
        Dictionary<Int32, Object> oEdgeColorSourceDictionary,
        ReadWorkbookContext oReadWorkbookContext,
        CollapsedGroupAttributes oCollapsedGroupAttributes,
        Int32 iAnchorVertices
    )
    {
        Debug.Assert(oGroup != null);
        Debug.Assert(oEdgeColorResults != null);
        Debug.Assert(oReadWorkbookContext != null);
        Debug.Assert(oCollapsedGroupAttributes != null);
        Debug.Assert(iAnchorVertices >= 0);

        // If the edge color column was autofilled, get the average color for
        // the edges incident to the D-connector motif's first anchor, then its
        // second anchor, and so on.  Otherwise, don't do anything.

        if (!bEdgeColorColumnAutoFilled)
        {
            return;
        }

        for (Int32 iAnchorVertexIndex = 0;
            iAnchorVertexIndex < iAnchorVertices;
            iAnchorVertexIndex++)
        {
            Color oAverageColor;

            if ( TableColumnMapper.TryMapAverageColor(

                    GetRowIDsToAverageForEdges(oGroup,
                        oCollapsedGroupAttributes, iAnchorVertexIndex),

                    oEdgeColorSourceDictionary,
                    oEdgeColorResults.SourceCalculationNumber1,
                    oEdgeColorResults.SourceCalculationNumber2,
                    oEdgeColorResults.DestinationColor1,
                    oEdgeColorResults.DestinationColor2,
                    oEdgeColorDetails.UseLogs,
                    out oAverageColor)
                )
            {
                oCollapsedGroupAttributes.Add(

                    CollapsedGroupAttributeKeys.GetAnchorVertexEdgeColorKey(
                        iAnchorVertexIndex),

                    oReadWorkbookContext.ColorConverter2.GraphToWorkbook(
                        oAverageColor)
                    );
            }
        }
    }
    AddVertexColorAttributeToMotif
    (
        ExcelTemplateGroupInfo oGroup,
        String sType,
        Boolean bVertexColorColumnAutoFilled,
        AutoFillColorColumnResults oVertexColorResults,
        ColorColumnAutoFillUserSettings oVertexColorDetails,
        Dictionary<Int32, Object> oVertexColorSourceDictionary,
        ReadWorkbookContext oReadWorkbookContext,
        CollapsedGroupAttributes oCollapsedGroupAttributes
    )
    {
        Debug.Assert(oGroup != null);
        Debug.Assert( !String.IsNullOrEmpty(sType) );
        Debug.Assert(oVertexColorResults != null);
        Debug.Assert(oReadWorkbookContext != null);
        Debug.Assert(oCollapsedGroupAttributes != null);

        Color oColor;

        // If the vertex color column was autofilled, get the average color
        // for the vertices in the motif.

        if (
            !bVertexColorColumnAutoFilled
            ||
            !TableColumnMapper.TryMapAverageColor(

                GetRowIDsToAverageForVertexColor(oGroup,
                    oCollapsedGroupAttributes, sType),

                oVertexColorSourceDictionary,
                oVertexColorResults.SourceCalculationNumber1,
                oVertexColorResults.SourceCalculationNumber2,
                oVertexColorResults.DestinationColor1,
                oVertexColorResults.DestinationColor2,
                oVertexColorDetails.UseLogs,
                out oColor)
            )
        {
            // Default to the color that was assigned to the group.

            oColor = oGroup.VertexColor;
        }

        oCollapsedGroupAttributes.Add(
            CollapsedGroupAttributeKeys.VertexColor,
            oReadWorkbookContext.ColorConverter2.GraphToWorkbook(oColor)
            );
    }
    TryAutoFillColorColumn
    (
        ListObject oTable,
        String sSourceColumnName,
        String sDestinationColumnName,
        ColorColumnAutoFillUserSettings oDetails,
        out Boolean bSourceColumnContainsNumbers,
        out Double dSourceCalculationNumber1,
        out Double dSourceCalculationNumber2,
        out Int32 iDecimalPlaces,
        out ICollection<String> oCategoryNames
    )
    {
        Debug.Assert(oTable != null);
        Debug.Assert( !String.IsNullOrEmpty(sDestinationColumnName) );
        Debug.Assert(oDetails != null);

        bSourceColumnContainsNumbers = oDetails.SourceColumnContainsNumbers;
        dSourceCalculationNumber1 = 0;
        dSourceCalculationNumber2 = 1;
        iDecimalPlaces = 0;
        oCategoryNames = null;

        if ( String.IsNullOrEmpty(sSourceColumnName) )
        {
            return (false);
        }

        if (bSourceColumnContainsNumbers)
        {
            return ( TableColumnMapper.TryMapToColor(oTable,
                sSourceColumnName, sDestinationColumnName,
                oDetails.UseSourceNumber1, oDetails.UseSourceNumber2,
                oDetails.SourceNumber1, oDetails.SourceNumber2,
                oDetails.DestinationColor1, oDetails.DestinationColor2,
                oDetails.IgnoreOutliers, oDetails.UseLogs,
                out dSourceCalculationNumber1, out dSourceCalculationNumber2,
                out iDecimalPlaces
                ) );
        }

        return ( TableColumnMapper.TryMapToColor(oTable, sSourceColumnName,
            sDestinationColumnName, out oCategoryNames) );
    }