using System;
using System.Collections.Generic;
using System.Text;
using HH.WMS.Utils.NPOI.Util;
namespace HH.WMS.Utils.NPOI.HSSF.Record.AutoFilter
{
public enum DOPERComparisonCode:byte
{
Unknown=0,
Less=1,
Equal=2,
LessThan=3,
More=4,
NotEqual=5,
GreaterThan=6
}
public enum DOPERType:byte
{
FilterCondition=0,
RKNumber=0x02,
IEEENumber=0x04,
String = 0x06,
BooleanOrErrors=0x08,
MatchAllBlanks=0x0C,
MatchNoneBlank=0x0E
}
public enum DOPERErrorValue : byte
{
NULL=0, //#NULL!
DIV0=0x07, //#DIV/0!
VALUE=0x0F, //#VALUE!
REF=0x17, //#REF!
NAME=0x1D, //#NAME?
NUM=0x24, //#NUM!
NA=0x2A //N/A
}
///
/// DOPER Structure for AutoFilter record
///
/// author: Tony Qu
public class DOPERRecord : RecordBase
{
private DOPERType vt;
private byte grbitSgn;
private RKRecord _RK;
private double _IEEENumber;
private byte CCH;
private byte fError;
private byte bBoolErr;
public DOPERRecord()
{
}
public DOPERRecord(RecordInputStream in1)
{
vt=(DOPERType)in1.ReadByte();
switch (vt)
{
case DOPERType.RKNumber:
grbitSgn = (byte)in1.ReadByte();
_RK = new RKRecord(in1);
in1.ReadInt(); //reserved
break;
case DOPERType.IEEENumber:
grbitSgn = (byte)in1.ReadByte();
_IEEENumber = in1.ReadDouble();
break;
case DOPERType.String:
grbitSgn = (byte)in1.ReadByte();
in1.ReadInt(); //reserved
CCH = (byte)in1.ReadByte();
in1.ReadByte(); //reserved
in1.ReadShort(); //reserved
break;
case DOPERType.BooleanOrErrors:
grbitSgn = (byte)in1.ReadByte();
fError=(byte)in1.ReadByte();
bBoolErr=(byte)in1.ReadByte();
in1.ReadShort(); //reserved
in1.ReadInt(); //reserved
break;
default: //FilterCondition,MatchAllBlanks,MatchNoneBlank
grbitSgn = 0;
in1.ReadByte(); //reserved
in1.ReadLong(); //reserved
break;
}
}
public override int RecordSize
{
get
{
return 10;
}
}
public int Serialize(ILittleEndianOutput out1)
{
out1.WriteByte((byte)vt);
switch (vt)
{
case DOPERType.RKNumber:
out1.WriteByte(grbitSgn);
_RK.Serialize(out1);
out1.WriteInt(0); //reserved
break;
case DOPERType.IEEENumber:
out1.WriteByte(grbitSgn);
out1.WriteDouble(_IEEENumber);
break;
case DOPERType.String:
out1.WriteByte(grbitSgn);
out1.WriteInt(0); //reserved
out1.WriteByte(CCH);
out1.WriteByte(0); //reserved
out1.WriteShort(0); //reserved
break;
case DOPERType.BooleanOrErrors:
out1.WriteByte(grbitSgn);
out1.WriteByte(fError);
out1.WriteByte(bBoolErr);
out1.WriteShort(0); //reserved
out1.WriteInt(0); //reserved
break;
default: //FilterCondition,MatchAllBlanks,MatchNoneBlank
out1.WriteByte(0); //reserved
out1.WriteLong(0); //reserved
break;
}
return this.RecordSize;
}
public virtual Record CloneViaReserialise()
{
throw new NotImplementedException("Please implement it in subclass");
}
public override int Serialize(int offset, byte[] data)
{
LittleEndianByteArrayOutputStream out1 = new LittleEndianByteArrayOutputStream(data, offset,this.RecordSize);
int result=this.Serialize(out1);
if (out1.WriteIndex - offset != this.RecordSize)
{
throw new InvalidOperationException("Error in serialization of (" + this.GetType().Name + "): "
+ "Incorrect number of bytes written - expected "
+ this.RecordSize + " but got " + (out1.WriteIndex - offset));
}
return result;
}
public DOPERType DataType
{
get { return vt; }
set { vt = value; }
}
public DOPERComparisonCode ComparisonCode
{
get { return (DOPERComparisonCode)grbitSgn;}
set { grbitSgn = (byte)value; }
}
public Double IEEENumber
{
get { return _IEEENumber; }
set {
_IEEENumber = value;
vt = DOPERType.IEEENumber;
}
}
///
/// get or set the RK record
///
public RKRecord RK
{
get { return _RK; }
set {
_RK = value;
vt = DOPERType.RKNumber;
}
}
///
/// Gets or sets Length of the string (the string is stored in the rgch field that follows the DOPER structures)
///
public byte LengthOfString
{
get { return CCH; }
set {
if (value > 252)
throw new ArgumentOutOfRangeException("The length of string must be less than or equal to 252");
CCH = value;
vt = DOPERType.String;
}
}
///
/// Whether the bBoolErr field contains a Boolean value
///
public bool IsBooleanValue
{
get { return fError == 0; }
}
///
/// Whether the bBoolErr field contains a Error value
///
public bool IsErrorValue
{
get { return fError == 1; }
}
///
/// Get or sets the boolean value
///
public bool BooleanValue
{
get { return bBoolErr == 1; }
set {
bBoolErr = value ? (byte)1 : (byte)0;
fError = 0;
vt = DOPERType.BooleanOrErrors;
}
}
///
/// Get or sets the boolean value
///
public DOPERErrorValue ErrorValue
{
get {
return (DOPERErrorValue)bBoolErr;
}
set {
bBoolErr = (byte)value;
fError = 1;
vt = DOPERType.BooleanOrErrors;
}
}
}
}