#pragma once

#include "McDbSymbolTable.h"

class McDbDimStyleTableRecord;
class McDbDimStyleTableIterator;

// -------------------------------------------------------------------------
// Summary:
// 		此类是McDbDimStyleTableRecords的符号表，表示图形数据库中的标注样式
// -------------------------------------------------------------------------
class ARXDLL McDbDimStyleTable : public McDbSymbolTable
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbDimStyleTable);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbDimStyleTable(void);

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbDimStyleTable(void);

	//typedef McDbDimStyleTableRecord RecordType;

	// -------------------------------------------------------------------------
	// Summary:
	// 		在DimStyleTable中搜索名为entryName的记录，如果找到，则按openMode方式打开，通过pRec返回
	// Parameters:
	// 		entryName			-	输入要搜索的记录名
	//		pRec				-	返回指向打开的记录
	//		openMode			-	输入打开记录的模式，可能的值为:McDb::kForRead,McDb::kForWrite
	//		openErasedRec		-	如果为true，则已删除的记录也可被打开
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getAt(const MCHAR* entryName,
		McDbDimStyleTableRecord*& pRec,
		McDb::OpenMode openMode,
		bool openErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		在DimStyleTable中搜索名为entryName的记录，如果找到，则在recordId中返回
	// Parameters:
	// 		entryName			-	输入要搜索的记录名
	//		recordId			-	返回找到的记录id
	//		openErasedRec		-	如果为true，则已删除的记录也可被打开
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getAt(const MCHAR* entryName,
		McDbObjectId& recordId,
		bool getErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		如果表中包含一个与name匹配的记录，则此函数返回true，否则返回false
	// Parameters:
	// 		name - 记录名
	// -------------------------------------------------------------------------
	bool              has  (const MCHAR* name) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		如果表中包含一个与id匹配的记录，则此函数返回true，否则返回false
	// Parameters:
	// 		id - 记录id
	// -------------------------------------------------------------------------
	bool              has  (McDbObjectId id) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		创建一个遍历符号表的遍历器,pIterator设为指向这个新创建的遍历器对象
	// Parameters:
	// 		pIterator	-	返回新创建的遍历器的指针
	//		atBeginning	-	表示从表的开始处或结束处开始遍历
	//		skipDeleted	-	是否跳过已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus newIterator(McDbDimStyleTableIterator*& pIterator,
		bool atBeginning = true,
		bool skipDeleted = true) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		向符号表中增一个新的记录
	// Parameters:
	// 		pRecord		-	输入要增加的记录的指针
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   add     (McDbDimStyleTableRecord* pRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		向符号表中增一个新的记录
	// Parameters:
	// 		recordId	-	返回新增加的记录id
	// 		pRecord		-	输入要增加的记录的指针
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   add     (McDbObjectId&  recordId,
		McDbDimStyleTableRecord* pRecord);
};




// -------------------------------------------------------------------------
// Summary:
// 		用来遍历标注样式符号表的遍历器
// -------------------------------------------------------------------------
class ARXDLL McDbDimStyleTableIterator : public McDbSymbolTableIterator
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数打开（以openMode模式）遍历器当前定位的记录，将pRecord设为指向打开的记录
	// Parameters:
	// 		pRecord				-	返回的记录指针
	//		openMode			-	打开方式
	//		openErasedRec		-	对象被删除了，是否也能成功打开
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getRecord(McDbDimStyleTableRecord*& pRecord,
		McDb::OpenMode openMode, bool openErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		把遍历器定位到id所在的位置
	// Parameters:
	// 		id - 记录id
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus seek(McDbObjectId id);

	// -------------------------------------------------------------------------
	// Summary:
	// 		把遍历器定位到pRecord指向的记录所在的位置
	// Parameters:
	// 		pRecord - 记录指针
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus seek(const McDbDimStyleTableRecord* pRecord);

	//:Ignore
	
protected:
	McDbDimStyleTableIterator(McDbSymbolTableIteratorImp* pImpIter);
	friend class McDbDimStyleTable;

	//:End Ignore
};


class McDbDimStyleTableRecordImp;


// -------------------------------------------------------------------------
// Summary:
// 		标注样式记录类型
// Remarks:	
// 		例如:
// 		<code>
// 				McDbObjectPointer<McDbDimStyleTableRecord>  spDimStyleRecord(acdbCurDwg()->dimstyle(),
// 																			 McDb::kForWrite);
// 				if(spDimStyleRecord.openStatus() == Mcad::eOk)
// 					spDimStyleRecord->setDimscale(100);
// 		</code>
// 		<code>
// 				#define MY_DIM_STYLE_NAME _T("TJ__MyDimStyle")
// 				McDbDatabase* pDatabse = acdbCurDwg();
// 				McDbDimStyleTablePointer spDimStyle(pDatabse,McDb::kForWrite);		if(spDimStyle.openStatus() != Mcad::eOk)			return;	
// 				McDbObjectId recId;
// 				if(spDimStyle->getAt(MY_DIM_STYLE_NAME,recId) == Mcad::eOk)
// 				{
// 					// 已经创建了MY_DIM_STYLE_NAME
// 					return;
// 				}
// 				McDbDimStyleTableRecord* pRecord = new McDbDimStyleTableRecord;
// 				pRecord->setName(MY_DIM_STYLE_NAME);
// 				pRecord->setDimscale(100);	// 修改标注的缩放比例.
// 				pRecord->setDimdec(1);		// 修改小数位精度.
// 				spDimStyle->add(pRecord);
// 				pDatabse->setDimstyle(pRecord->objectId() );
// 				pRecord->close();
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDbDimStyleTableRecord: public  McDbSymbolTableRecord
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbDimStyleTableRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbDimStyleTableRecord();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbDimStyleTableRecord();

	typedef McDbDimStyleTable TableType;

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注属性的整数类型变量值
	// Parameters:
	// 		iType	-	该属性的类形值
	// Returns:
	// 		返回整数类型变量值
	// Remarks:	
	// 		例如: 该函数实现代码如下:
	// 		<code>
	// 		int GetDimVarInt(int iType) const
	// 		{
	// 	#define GetDimVarIntCase(var,type)	\
	// 			case type:	\
	// 			return var;
	// 
	// 	#define GetDimVarBoolCase(var,type)	\
	// 			case type:	\
	// 			return (var ? 1 : 0);
	// 
	// 	#define GetDimVarColorCase(var,type)	\
	// 			case type:	\
	// 			return var.colorIndex();
	// 			switch(iType)
	// 			{
	// 				GetDimVarIntCase(m_dimadec,179);
	// 				GetDimVarBoolCase(m_dimalt ,170);
	// 				GetDimVarIntCase(m_dimaltd ,171);
	// 
	// 				GetDimVarIntCase(m_dimalttd,274);
	// 				GetDimVarIntCase(m_dimalttz,286);
	// 				GetDimVarIntCase(m_dimaltu ,273);
	// 				GetDimVarIntCase(m_dimaltz ,285);
	// 
	// 				GetDimVarIntCase(m_dimaunit,275);
	// 
	// 				GetDimVarColorCase(m_dimclrd ,176);
	// 				GetDimVarColorCase(m_dimclre ,177);
	// 				GetDimVarColorCase(m_dimclrt ,178);
	// 				GetDimVarIntCase(m_dimdec  ,271);
	// 
	// 				GetDimVarIntCase(m_dimfit  ,287);
	// 
	// 				GetDimVarIntCase(m_dimjust ,280);
	// 
	// 				GetDimVarBoolCase(m_dimlim  , 72);
	// 
	// 				GetDimVarBoolCase(m_dimsah  ,173);
	// 
	// 				GetDimVarBoolCase(m_dimsd1  ,281);
	// 				GetDimVarBoolCase(m_dimsd2  ,282);
	// 				GetDimVarBoolCase(m_dimse1  , 75);
	// 				GetDimVarBoolCase(m_dimse2  , 76);
	// 
	// 				GetDimVarBoolCase(m_dimsoxd ,175);
	// 
	// 				GetDimVarIntCase(m_dimtad , 77);
	// 				GetDimVarIntCase(m_dimtdec ,272);
	// 
	// 				GetDimVarBoolCase(m_dimtih  , 73);
	// 				GetDimVarBoolCase(m_dimtix  ,174);
	// 
	// 				GetDimVarBoolCase(m_dimtofl ,172);
	// 				GetDimVarBoolCase(m_dimtoh  , 74);
	// 				GetDimVarBoolCase(m_dimtol  , 71);
	// 				GetDimVarIntCase(m_dimtolj ,283);
	// 
	// 
	// 				GetDimVarIntCase(m_dimzin , 78);
	// 				GetDimVarIntCase(m_dimunit ,270);
	// 				GetDimVarBoolCase(m_dimupt  ,288);
	// 				GetDimVarIntCase(m_dimtzin  ,284);
	// 				GetDimVarIntCase(m_dimfrac ,276);
	// 				GetDimVarIntCase(m_dimlunit,277);
	// 				GetDimVarIntCase(m_dimatfit,289);
	// 				GetDimVarIntCase(m_dimtmove,279);
	// 				GetDimVarIntCase(m_dimazin, 79);
	//				GetDimVarBoolCase(m_dimfxlon ,290);
	// 			case 278:
	// 				return (int)(m_dimdsep);
	// 			case 371:
	// 				return (int)(m_dimlwd);
	// 			case 372:
	// 				return (int)(m_dimlwe);
	// 			default:
	// 				return 0;
	// 			}
	// 			return 0;
	// 		}
	// 		</code>
	// -------------------------------------------------------------------------
	int GetDimVarInt(int iType) const;
	
	// -------------------------------------------------------------------------
	// Summary:
	//      设置标注属性的整数类型变量值
	// Parameters:
	// 		iType	-	该属性的类形值
	//      iVal	-   设置的值
	// -------------------------------------------------------------------------
	void SetDimVarInt(int iType,int v);


	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注属性的实数类型变量值
	// Parameters:
	// 		iType	-	该属性的类型值
	// Returns:
	// 		返回实数类型变量值
	// Remarks:	
	// 		例如:   该函数实现代码如下:
	// 		<code>
	// 				mxreal GetDimVarDouble(int iType) const
	// 				{
	// 			#define GetDimVarDoubleCase(var,type)	\
	// 					case type:	\
	// 					return var;
	// 
	// 					switch(iType)
	// 					{
	// 						GetDimVarDoubleCase(m_dimaltf,143);
	// 						GetDimVarDoubleCase(m_dimasz , 41);
	// 						GetDimVarDoubleCase(m_dimcen ,141);
	// 						GetDimVarDoubleCase(m_dimdle , 46);
	// 						GetDimVarDoubleCase(m_dimdli , 43);
	// 						GetDimVarDoubleCase(m_dimexe , 44);
	// 						GetDimVarDoubleCase(m_dimexo , 42);
	// 
	// 						GetDimVarDoubleCase(m_dimgap ,147);
	// 						GetDimVarDoubleCase(m_dimlfac,144);
	// 						GetDimVarDoubleCase(m_dimrnd , 45);
	// 
	// 						GetDimVarDoubleCase(m_dimscale, 40);
	// 						GetDimVarDoubleCase(m_dimtfac,146);
	// 						GetDimVarDoubleCase(m_dimtm  , 48);
	// 						GetDimVarDoubleCase(m_dimtp  , 47);
	// 						GetDimVarDoubleCase(m_dimtsz ,142);
	// 						GetDimVarDoubleCase(m_dimtvp ,145);
	// 						GetDimVarDoubleCase(m_dimtxt ,140);
	// 						GetDimVarDoubleCase(m_dimaltrnd,148);
	//						GetDimVarDoubleCase(m_dimfxl,49);
	// 						////
	// 					default:
	// 						return 0.0;
	// 					}
	// 					return 0.0;
	// 				}
	// 		</code>
	// -------------------------------------------------------------------------
	mxreal GetDimVarDouble(int iType) const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置标注属性的实数类型变量值
	// Parameters:
	// 		iType	-	该属性的类形值
	//      dVal	-   设置的值
	// -------------------------------------------------------------------------
	void SetDimVarDouble(int iType,mxreal v);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注属性的字符串类型变量值
	// Parameters:
	// 		iType	-	该属性的类型值
	// Returns:
	// 		返回字符串类型变量值
	// Remarks:	
	// 		例如: 函数实现代码如下
	// 		<code>
	// 			MxString     GetDimVarString(int iType) const
	// 			{
	// 		#define GetDimVarStringCase(var,type)	\
	// 				case type:	\
	// 				return var;
	// 
	// 				switch(iType)
	// 				{
	// 					GetDimVarStringCase(m_dimapost,4);
	// 					GetDimVarStringCase(m_dimpost,3);
	// 				default:
	// 					return _T("");
	// 				}
	// 				return _T("");
	// 			}
	// 		</code>
	// -------------------------------------------------------------------------
	MxString GetDimVarString(int iType) const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置标注属性的字符串类型变量值
	// Parameters:
	// 		iType	-	该属性的类形值
	//      pszVal	-   设置的值
	// -------------------------------------------------------------------------
	void      SetDimVarString(int iType, LPCMSTR v);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注属性的对象id类型变量值
	// Parameters:
	// 		iType	-	该属性的类型值
	// Returns:
	// 		返回字对象id类型变量值
	// Remarks:	
	// 		例如: 函数实现代码如下
	// 		<code>
	// 				McDbObjectId GetDimVarObjectId(int iType) const
	// 				{
	// 			#define GetDimVarObjectIdCase(var,type)	\
	// 					case type:	\
	// 					return var;
	// 
	// 					switch(iType)
	// 					{
	// 						GetDimVarObjectIdCase(m_dimblk,  342);
	// 						GetDimVarObjectIdCase(m_dimblk1,  343);
	// 						GetDimVarObjectIdCase(m_dimblk2,  344);
	// 						GetDimVarObjectIdCase(m_dimldrblk,341);
	// 						GetDimVarObjectIdCase(m_dimtxsty,340);
	// 						GetDimVarObjectIdCase(m_dimltype,345);
	// 						GetDimVarObjectIdCase(m_dimltex1,346);
	// 						GetDimVarObjectIdCase(m_dimltex2,347);
	// 					default:
	// 						return McDbObjectId::kNull;
	// 					}
	// 					return McDbObjectId::kNull;
	// 				}
	// 		</code>
	// -------------------------------------------------------------------------
	McDbObjectId GetDimVarObjectId(int iType) const;


	// -------------------------------------------------------------------------
	// Summary:
	//      设置标注属性的对象id类型变量值
	// Parameters:
	// 		iType	-	该属性的类形值
	//      id		-   设置的值
	// -------------------------------------------------------------------------
	void SetDimVarObjectId(int iType,McDbObjectId v);

	//:Ignore
	
	int dimfit() const;
	int dimunit() const;

	Mcad::ErrorStatus setDimfit(int fit);
	Mcad::ErrorStatus setDimunit(int unit);

	void ReadSysVar(McDbDatabase* pDatabase);

	
	virtual Mcad::ErrorStatus dwgInFields (McDbDwgFiler* pFiler);
	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;




#undef DBDIMVAR_H
	#include "dbdimvar.h"

public:
	inline McDbDimStyleTableRecordImp* getDimStyleTableRecordImp() const {
		return (McDbDimStyleTableRecordImp*)m_pImp;
	}

	//:End Ignore
};
