TryMapToColor
(
ListObject table,
String sourceColumnName,
String destinationColumnName,
Boolean useSourceNumber1,
Boolean useSourceNumber2,
Double sourceNumber1,
Double sourceNumber2,
Color destinationColor1,
Color destinationColor2,
Boolean ignoreOutliers,
Boolean useLogs,
out Double sourceCalculationNumber1,
out Double sourceCalculationNumber2,
out Int32 decimalPlaces
)
{
Debug.Assert(table != null);
Debug.Assert( !String.IsNullOrEmpty(sourceColumnName) );
Debug.Assert( !String.IsNullOrEmpty(destinationColumnName) );
Debug.Assert(!useLogs || !useSourceNumber1 || sourceNumber1 > 0);
Debug.Assert(!useLogs || !useSourceNumber2 || sourceNumber2 > 0);
sourceCalculationNumber1 = sourceCalculationNumber2 = Double.MinValue;
decimalPlaces = Int32.MinValue;
Range oVisibleSourceRange, oVisibleDestinationRange;
if ( !TryGetVisibleSourceAndDestination(table, sourceColumnName,
destinationColumnName, out oVisibleSourceRange,
out oVisibleDestinationRange) )
{
return (false);
}
// Get the source calculation range, which is the range of source
// numbers used in calculating the mapping of source numbers to
// destination numbers.
if ( !TryGetSourceCalculationRange(oVisibleSourceRange,
useSourceNumber1, useSourceNumber2, sourceNumber1, sourceNumber2,
ignoreOutliers, useLogs, out sourceCalculationNumber1,
out sourceCalculationNumber2) )
{
return (false);
}
// Create an object that maps a range of numbers to a range of colors.
Double dSourceCalculationNumberWithLog1 =
GetLogIfRequested(sourceCalculationNumber1, useLogs);
Double dSourceCalculationNumberWithLog2 =
GetLogIfRequested(sourceCalculationNumber2, useLogs);
ColorGradientMapper oColorGradientMapper = GetColorGradientMapper(
dSourceCalculationNumberWithLog1, dSourceCalculationNumberWithLog2,
destinationColor1, destinationColor2);
ColorConverter2 oColorConverter2 = new ColorConverter2();
// Loop through the areas.
Int32 iAreas = oVisibleSourceRange.Areas.Count;
Debug.Assert(iAreas == oVisibleDestinationRange.Areas.Count);
for (Int32 iArea = 1; iArea <= iAreas; iArea++)
{
Range oSourceArea = oVisibleSourceRange.Areas[iArea];
Range oDestinationArea = oVisibleDestinationRange.Areas[iArea];
Debug.Assert(oSourceArea.Rows.Count ==
oDestinationArea.Rows.Count);
Object [,] aoSourceAreaValues =
ExcelUtil.GetRangeValues(oSourceArea);
Object [,] aoDestinationAreaValues =
ExcelUtil.GetRangeValues(oDestinationArea);
Int32 iRows = oSourceArea.Rows.Count;
for (Int32 iRow = 1; iRow <= iRows; iRow++)
{
// If the source cell doesn't contain a number, skip it.
Double dSourceNumber;
if ( !TryGetNumber( aoSourceAreaValues[iRow, 1], useLogs,
out dSourceNumber) )
{
continue;
}
dSourceNumber = GetLogIfRequested(dSourceNumber, useLogs);
Color oDestinationColor =
oColorGradientMapper.ColorMetricToColor(dSourceNumber);
// Write the color in a format that is understood by
// ColorConverter2.WorkbookToGraph(), which is what
// WorksheetReaderBase uses.
aoDestinationAreaValues[iRow, 1] =
oColorConverter2.GraphToWorkbook(oDestinationColor);
}
oDestinationArea.set_Value(Missing.Value, aoDestinationAreaValues);
}
decimalPlaces = GetDecimalPlaces(table, sourceColumnName);
return (true);
}