/*
* Licensed to the Apache Software Foundation (ASF) Under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for Additional information regarding copyright ownership.
* The ASF licenses this file to You Under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed Under the License is distributed on an "AS Is" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations Under the License.
*/
namespace HH.WMS.Utils.NPOI.SS.Formula.Eval
{
using System;
using System.Text;
using HH.WMS.Utils.NPOI.HSSF.UserModel;
/**
* @author Amol S. Deshmukh < amolweb at ya hoo dot com >
*
*/
public class ErrorEval : ValueEval
{
// convenient access to namespace
private const HSSFErrorConstants EC = null;
/** #NULL! - Intersection of two cell ranges is empty */
public static ErrorEval NULL_INTERSECTION = new ErrorEval(HSSFErrorConstants.ERROR_NULL);
/** #DIV/0! - Division by zero */
public static ErrorEval DIV_ZERO = new ErrorEval(HSSFErrorConstants.ERROR_DIV_0);
/** #VALUE! - Wrong type of operand */
public static ErrorEval VALUE_INVALID = new ErrorEval(HSSFErrorConstants.ERROR_VALUE);
/** #REF! - Illegal or deleted cell reference */
public static ErrorEval REF_INVALID = new ErrorEval(HSSFErrorConstants.ERROR_REF);
/** #NAME? - Wrong function or range name */
public static ErrorEval NAME_INVALID = new ErrorEval(HSSFErrorConstants.ERROR_NAME);
/** #NUM! - Value range overflow */
public static ErrorEval NUM_ERROR = new ErrorEval(HSSFErrorConstants.ERROR_NUM);
/** #N/A - Argument or function not available */
public static ErrorEval NA = new ErrorEval(HSSFErrorConstants.ERROR_NA);
// POI internal error codes
private const int CIRCULAR_REF_ERROR_CODE = unchecked((int)0xFFFFFFC4);
private const int FUNCTION_NOT_IMPLEMENTED_CODE = unchecked((int)0xFFFFFFE2);
public static ErrorEval FUNCTION_NOT_IMPLEMENTED = new ErrorEval(FUNCTION_NOT_IMPLEMENTED_CODE);
// Note - Excel does not seem to represent this condition with an error code
public static ErrorEval CIRCULAR_REF_ERROR = new ErrorEval(CIRCULAR_REF_ERROR_CODE);
/**
* Translates an Excel internal error code into the corresponding POI ErrorEval instance
* @param errorCode
*/
public static ErrorEval ValueOf(int errorCode)
{
switch (errorCode)
{
case HSSFErrorConstants.ERROR_NULL: return NULL_INTERSECTION;
case HSSFErrorConstants.ERROR_DIV_0: return DIV_ZERO;
case HSSFErrorConstants.ERROR_VALUE: return VALUE_INVALID;
case HSSFErrorConstants.ERROR_REF: return REF_INVALID;
case HSSFErrorConstants.ERROR_NAME: return NAME_INVALID;
case HSSFErrorConstants.ERROR_NUM: return NUM_ERROR;
case HSSFErrorConstants.ERROR_NA: return NA;
// non-std errors (conditions modeled as errors by POI)
case CIRCULAR_REF_ERROR_CODE: return CIRCULAR_REF_ERROR;
case FUNCTION_NOT_IMPLEMENTED_CODE: return FUNCTION_NOT_IMPLEMENTED;
}
throw new Exception("Unexpected error code (" + errorCode + ")");
}
/**
* Converts error codes to text. Handles non-standard error codes OK.
* For debug/test purposes (and for formatting error messages).
* @return the String representation of the specified Excel error code.
*/
public static String GetText(int errorCode)
{
if (HSSFErrorConstants.IsValidCode(errorCode))
{
return HSSFErrorConstants.GetText(errorCode);
}
// It is desirable to make these (arbitrary) strings look clearly different from any other
// value expression that might appear in a formula. In Addition these error strings should
// look Unlike the standard Excel errors. Hence tilde ('~') was used.
switch (errorCode)
{
case CIRCULAR_REF_ERROR_CODE: return "~CIRCULAR~REF~";
case FUNCTION_NOT_IMPLEMENTED_CODE: return "~FUNCTION~NOT~IMPLEMENTED~";
}
return "~non~std~err(" + errorCode + ")~";
}
private int _errorCode;
/**
* @param errorCode an 8-bit value
*/
private ErrorEval(int errorCode)
{
_errorCode = errorCode;
}
public int ErrorCode
{
get{return _errorCode;}
}
public override String ToString()
{
StringBuilder sb = new StringBuilder(64);
sb.Append(GetType().Name).Append(" [");
sb.Append(GetText(_errorCode));
sb.Append("]");
return sb.ToString();
}
}
}