// InstPropertyCtrl.h: interface for the CInstPropertyCtrl class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_INSTPROPERTYCTRL_H__1396C98A_B3E8_4A15_8203_DE80C078F64D__INCLUDED_)
#define AFX_INSTPROPERTYCTRL_H__1396C98A_B3E8_4A15_8203_DE80C078F64D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <apl_gui.h>
#include "apl_api.h"

class CInstPropertyCtrl;

#define ID_MENU_ADD2FOLDER 110 
#define ID_MENU_ADDALL2FOLDER 111 
#define ID_MENU_ADD2CATEGORY 112
#define ID_MENU_ADDALL2CATEGORY 113
#define ID_MENU_SAVE_SELECTED 115
#define ID_MENU_SAVE_ALL	 116
#define ID_MENU_SET_ACCESS_ALL 117
#define ID_MENU_SET_ACCESS_SELECTED 118
#define ID_MENU_ADD2CLASSIFIER 119
#define ID_MENU_ADDALL2CLASSIFIER 120
#define ID_MENU_MOVE2FOLDER 121 
#define ID_MENU_MOVEALL2FOLDER 122 
#define ID_MENU_MOVE2CLASSIFIER 123
#define ID_MENU_MOVEALL2CLASSIFIER 124
#define ID_MENU_EXP_STUCT_SEL_TO_ESI 125
#define ID_MENU_EXP_STUCT_ALL_TO_ESI 126

#define ID_MENU_COPY_DOCS_TO_CHANGE  127
#define ID_MENU_COPY_ALL_DOCS_TO_CHANGE 128
#define ID_MENU_CREATE_REFS_DOCS_TO_ITEM  129
#define ID_MENU_CREATE_REFS_ALL_DOCS_TO_ITEM 130

#define ID_MENU_DELETE 150
#define ID_MENU_DELETE_ALL 151
#define ID_MENU_ORDER 152
#define ID_MENU_DELETE_FROM_BD 153
#define ID_MENU_CHANGE_STATE 154


// если при чтении из реестра ширина столбца меньше MIN_WIDTH_COLUMN то она 
// заменяется на значение по умолчанию
#define MIN_WIDTH_COLUMN 10 
// ширина столбца по умолчанию
#define DEF_WIDTH_COLUMN 50
// если при чтении из реестра ширина столбца больше MAX_WIDTH_COLUMN то она 
// заменяется на значение по умолчанию
#define MAX_WIDTH_COLUMN 1000


#define CInstPropertyCtrl_ColumnsData _T("CInstPropertyCtrl_ColumnsData V 0.1\0x0")

///////////////////////////////////////////////////////////////////
// структуры для передачи данных из вызывающей функции в список
// поле next предназначено для организации цепочек (несколько инстансов в одной строке)

// 1. данные задаются как массив строк
struct SItemStringData
{
	SItemStringData(){m_inst=0;m_next=0;}
	CaplInstance* m_inst;
	CStringArray m_values;
	SItemStringData* m_next;
};

struct SMenuItemDescription
{
	SMenuItemDescription(UINT _id, CString _menu_text, bool _need_content=false, UINT _nFlags=0)
	{
		id=_id;menu_text=_menu_text,need_content=_need_content;nFlags=_nFlags;
	}
	UINT id;
	CString menu_text;
	bool need_content;
	UINT nFlags;
};

// 2. данные задаются как список инстансов и маска отображаемых столбцов
// константы для маски отображаемых столбцов
// ВНИМАНИЕ! При добавлении новых констант увеличивайте счетчик под списком констант!
#define OBJ_COL_INSTANCE_ID	0
#define OBJ_COL_ID			1
#define OBJ_COL_NAME		2
#define OBJ_COL_DESCRIPT	3
#define OBJ_COL_VER			4
#define OBJ_COL_SERNUM		5
#define OBJ_COL_COUNT		6
#define OBJ_COL_UNIT		7
#define OBJ_COL_TYPE		8
#define OBJ_COL_SOURCE		9
#define OBJ_COL_STANDART	10
#define OBJ_COL_CODE_OBJ	11
#define OBJ_COL_CODE_VER	12
#define OBJ_COL_LNAME		13
#define OBJ_COL_FNAME		14
#define OBJ_COL_MNAME		15
#define OBJ_COL_STATE		16
#define OBJ_COL_ADD_TEXT	17
#define OBJ_COL_ID_INST		18
#define OBJ_COL_ID_LOT		19
#define OBJ_COL_INST_ID		20
#define OBJ_COL_BASE_UNIT	21
#define OBJ_COL_PASSWORD	22
#define OBJ_COL_USER_DIS	23
#define OBJ_COL_USER_RO		24
#define OBJ_COL_DOC_TYPE	25
#define OBJ_COL_USER_AR		26
#define OBJ_COL_CODE_1		27
#define OBJ_COL_CODE_2		28
#define OBJ_COL_REF_DOC_TYPE	29
#define OBJ_COL_REF_DOC_NUM		30
#define OBJ_COL_REF_DOC_DATE_DRAW	31
#define OBJ_COL_PERSON			32
#define OBJ_COL_REF_DOC_DATE_APPL	33
#define OBJ_COL_CHNG_CODE_PLNT	34
#define OBJ_COL_CHNG_CODE_ORG	35
#define OBJ_COL_CHNG_CODE_BASIS	36
#define OBJ_COL_CHNG_BASIS		37
#define OBJ_COL_CHNG_USAGE		38
#define OBJ_COL_CHNG_COMPL_NUM	39
#define OBJ_COL_CHNG_STOCK		40
#define OBJ_COL_CHNG_STOCK_INTR	41
#define OBJ_COL_CHNG_TO_DATE	42
#define OBJ_COL_CHNG_OTD_DATE	43
#define OBJ_COL_CHNG_CRIT_DATE	44
#define OBJ_COL_CHNG_DEIST_DATE	45
#define OBJ_COL_REF_ORG			46
#define OBJ_COL_REF_SECTOR		47
#define OBJ_COL_REF_STAGE		48
#define OBJ_COL_REF_DOC_DATE_DETECT		49
#define OBJ_COL_REF_DOC_DATE_REMOVAL	50
#define OBJ_COL_REF_EXT_VIEW			51
#define OBJ_COL_REF_MAIN_PDF			52
#define OBJ_COL_REF_MAIN_PI				53
#define OBJ_COL_REF_MAIN_FAILED_ITEM	54
#define OBJ_COL_REF_MAIN_FAILED_PART	55
#define OBJ_COL_REF_MAIN_CONDITIONS		56
#define OBJ_COL_REF_DOF					57
#define OBJ_COL_REF_FAULTREASON			58
#define OBJ_COL_REF_METHOD				59
#define OBJ_COL_REF_CONSEQUENCES		60
#define OBJ_COL_REF_CULPRIT				61
#define OBJ_COL_REF_MANIFESTATION		62
#define OBJ_COL_REF_MANIF_STR			63
#define OBJ_COL_ORG_INN					64
#define OBJ_COL_ORG_KPP					65
#define OBJ_COL_ORG_OGRN				66
#define OBJ_COL_ORG_OKPO				67
#define OBJ_COL_ORG_LEG_ADR				68
#define OBJ_COL_ORG_ACT_ADR				69
#define OBJ_COL_ORG_POST_ADR			70
#define OBJ_COL_ORG_PHONE				71
#define OBJ_COL_ORG_EMAIL				72
#define OBJ_COL_ORG_WEB					73
#define OBJ_COL_DOC_FILENAME			74
#define OBJ_COL_ADD_TEXT_2				75
#define OBJ_COL_MESS_FROM				76
#define OBJ_COL_MESS_TO					77
#define OBJ_COL_MESS_SUBJ				78
#define OBJ_COL_MESS_DATE				79
#define OBJ_COL_ACCESS_PAT				80
// #define OBJ_COL_ORG_				7
// #define OBJ_COL_ORG_				7
// #define OBJ_COL_ORG_				7
// #define OBJ_COL_ORG_				7
							
// Количество констант. При добавлении новых констант увеличивайте счетчик!
#define NUM_OBJ_COL			81

// количество возможных групп столбцов (например pdf-pi-bpi == 3)
#define MAX_GROUPS			3

// список ентией с масками отображения для каждой ентити
struct CLASS_DECL_APL_STEP_MGR SEntColumnsMask
{
	SEntColumnsMask(CaplEntity* entity,long mask);
	CaplEntity* m_entity;
	long m_mask;
};

// елемент списка инстансов; для каждого задана количество и единица измерения
struct CLASS_DECL_APL_STEP_MGR SItemColumnData
{
	SItemColumnData(CaplInstance* inst,double count=-1,CaplInstance* unit=0,CString add_text=_T(""), CString add_text_2=_T(""));
	~SItemColumnData();
	CaplInstance* m_inst;
	double m_count;
	CaplInstance* m_unit;
	CString m_add_text;
	CString m_add_text_2;
	SItemColumnData* m_next;
};

///////////////////////////////////////////////////////////////////
// Структуры для внутреннего употребления 
// задание возможных столбцов для каждого возможного типа инстанса
// описание столбца (два атрибута - например name у pdf)
struct CLASS_DECL_APL_STEP_MGR SColumnDescr
{
	SColumnDescr();
	// константа - тип имени столбца в
	DWORD m_type_column;
	//int m_index;
	CaplAttr* m_attr1;
	CaplAttr* m_attr2;
	CaplAttr* m_attr3;
	bool m_is_date;
	// реальный номер столбца в группе столбцов
	int m_real_position[MAX_GROUPS];
};

// список возможных столбцов для ентити
struct CLASS_DECL_APL_STEP_MGR SEntityColumns
{
	SEntityColumns(CaplEntity* entity,CString name/*,CInstPropertyCtrl* parent*/);
	CaplEntity* m_entity;// ентити определяет тип объекта
	CaplEntity* m_real_entity; // если ентити равна нулю - сюда записывается подтип реально отривсованного объекта - для ускорения поиска
	CString m_name;
	CaplTAggr<SColumnDescr*,SColumnDescr*,APLAGGR_AUTOKILLREF> m_list_columns;
	bool m_all_visible;
	CUIntArray m_list_avail_columns;
	bool Add(DWORD type_column,CaplAttr* attr1,CaplAttr* attr2=0,CaplAttr* attr3=0,bool is_date=false);
};

///////////////////////////////////////////////////////////////
// Класс - таблица
// Внимание! Если информация о выбранных столбцах и характеристиках хранится в
// бинарном буфере - буфер надо задавать до вызова фунции SetData
// То есть сначала должен идти вызов SetColumnData, а потом SetData
class CLASS_DECL_APL_STEP_MGR CInstPropertyCtrl : public CSortListCtrl  
{
public:
	friend SEntityColumns;
	CInstPropertyCtrl();

	virtual ~CInstPropertyCtrl();
	BOOL CreateFromStatic(UINT nID, CWnd* pParent,UINT additional_param=0,bool internal_icons=false);
	BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID,bool internal_icons=false);
	bool SetData(CStringArray &Columns,
		CaplTAggr<SItemStringData*,SItemStringData*,APLAGGR_LIST_OR_AUTOKILLREF> &Items,
		int multiplicity=1);
	// параметр EntMask не используется; функция оставлена для совместимости
	bool SetData(CaplTAggr<SEntColumnsMask*,SEntColumnsMask*,APLAGGR_LIST_OR_AUTOKILLREF> &EntMask,
		CaplTAggr<SItemColumnData*,SItemColumnData*,APLAGGR_LIST_OR_AUTOKILLREF> &Items,
		int multiplicity=1);
	bool SetData(
		CaplTAggr<SItemColumnData*,SItemColumnData*,APLAGGR_LIST_OR_AUTOKILLREF> &Items,
		int multiplicity=1);

	// Заполняет таблицу значениями из массива данных. Если draw_inst_start==-1 - то
	// перед заполнением очищаются все внутренние буферы и переменные. Если 
	// draw_inst_start>=0, то внутренние переменные не очищаются, и перерисовываются (или 
	// добавляются новые) значения для строк начиная с draw_inst_start и заканчивая 
	// draw_inst_start+draw_inst_size. Если draw_inst_size==-1 то перерисовываются значения 
	// до конца массива данных
	bool FillTable(bool talk_about_empty=true,int draw_inst_start=-1,int draw_inst_size=-1);

	// Определяет наличие характеристик для данных из входного буфера; заполняет внутренний 
	// буфер их значениями; при этом характеристики загружаются с сервера
	// Если draw_inst_start==-1 и установлен флаг m_ReReadCharact[num_group] - то
	// перед заполнением очищаются все внутренние буферы и переменные и все значения всех
	// характеристик для всех данных перечитываются из БД. Если draw_inst_start>=0, то 
	// внутренние переменные не очищаются, и загружаются из БД значения для строк начиная с 
	// draw_inst_start и заканчивая draw_inst_start+draw_inst_size. Если draw_inst_size==-1 
	// то обновляются значения до конца массива данных
	// Если draw_inst_start!=-1 и предварительно была вызвана функция SetCharacterysticFromExt,
	// то обновляются (добавляются) значения только для характеристик заданных в этой функции
	// остальные характеристики игнорируются
	bool SelectCharacterysticSet(int num_group=0,bool is_dlg=true,int draw_inst_start=-1,int draw_inst_size=-1,bool forsed_reread =false);

	// Устанавливает список пар "характеристика-тип характеристики", значения которых должны
	// отображаться в таблице. Загружает с сервера БД значения этих характеристик и 
	// отрисовывает их в таблице
	bool SetCharacterysticFromExt(aplExtent &chars_and_type,int num_group=0,bool forsed_reread =false,bool load_from_bd=true);
	
	bool SelectColumnsOrder(int num_group);

	bool GetSelectedElements(CUIntArray &ext_out);
	bool SetSelectedElement(int pos);
	bool SetSelectedElements(CUIntArray &ext_in);
	void SaveColumnWidths();
//D 	bool SetGlobalMask(long Mask,int num_group);
//D 	long GetGlobalMask(int num_group){return m_AllColumnsMask[num_group];};
	void VisibleColumnAdd(int num_group,DWORD column);
	void VisibleColumnRemove(int num_group,DWORD column);
	bool IsVisibleDefault(){return m_columns_def;};
	inline bool IsVisibleColumn(int num_group,DWORD column);


	bool SetAdditionalColumnName(LPCTSTR add_column_name, LPCTSTR add_column_name_2 = _T(""));

	bool SetColumnData(CaplDataBuf &dbuf);
	bool GetColumnData(CaplDataBuf &dbuf);

	SItemColumnData* GetItemColumnData(int nItem);
	SItemStringData* GetItemStringData(int nItem);

	// Если задана эта ентити - то в таблице будет показаны только объекты указанного типа, 
	// и для них будут отобюражены только атрибуты из списка m_filter_attrs
	// первоначальная сортировка по столбцу sorting_field
	CaplEntity* m_filter_entity;
	CaplTAggr <CaplAttr*,CaplAttr*,APLAGGR_UNIQUE|APLAGGR_LIST>	m_filter_attrs;
	CaplAttr* m_sorting_field;

	// Добавляет в массив данных новое значение, отрисовывает его в таблице (в нижней строке)
	// загружает и отображает для него характеристики
	int	AddItem(SItemColumnData *pItem,bool redraw=true);
	
	// По столбцу и строке таблицы определяет: instance, отображаемую в данной строке (с учетом группы);
	// номер instance в массиве данных (параметр pos_in_data)
	// если столбец относится к характеристикам- характеристику и тип характеристики, 
	// отображаемых в этом столбце; если задано значение характеристики - возвращает и его.
	// Если не удается определить инстанс (клик вне поля и т.п.) возвращает false
	// Если равны нулю все три параметра charact,type и char_val - поиск характеристики не производится, 
	// после успешного поиска instance возвращает true. Если равен нулю какой-либо из этих параметров 
	// (при одном или двух ненулевых остальных)- возвращает false.
	// Если все параметры  charact,type и char_val заданы, а столбец не относится к характеристикам - в 
	// них возвращаются нули, функция возвращает true. Если столбец относится к характеристикам но
	// значение характеристики не задано - в char_val возвращается 0, функция возвращает true
	bool GetCharacteristicByRC(int row, int col, CaplInstance **base_inst, int &pos_in_data, CaplInstance **charact, CaplInstance **type,CaplInstance **char_val,int &_num_group);

	// При выборе атрибута инстанса (в будущем будет открывать диалог свойств инстанса)
	// При выборе значения характеристики показывает свойства значения характеристики. 
	// Если значение не существует - показывает диалог создания значния характеристки
	// После редактирования свойств (создания значения) обновляет таблицу
	// Возвращает true если были сделаны изменения или false если изменений не было
	bool EditCell(int row, int col);

	// задает параметры стандартного контекстного меню
	// для автоматической отработки стандартного меню больше ничего не нужно
	void SetContexMenuMode(	bool context_menu_processed=false,bool context_menu_save2file=false,
		bool context_menu_save2folder=false,bool context_menu_save2categ=false,bool context_menu_set_access=false);

	// вызывает контекстное меню со стандартной частью и с дополнениями
	// обработка стандартных команд идет внутри, если же выбрано меню из дополнительной части -
	// вовзращает ID команды
	UINT ProcessContextMenu(CPoint pos ,bool context_menu_save2file=false,
		bool context_menu_save2folder=false,bool context_menu_save2categ=false,
		CaplTAggr<SMenuItemDescription*,SMenuItemDescription*,APLAGGR_AUTOKILLREF> *additional_menu=0,
		bool context_menu_set_access=false,bool context_menu_save2classifier=false, aplExtent* removed=0);
	
	// Устанавливает или снимает режим диалога отображения ресурсов. В этом режиме 
	// для экземпляров изделий в столбце "обозначение" выводится информация об версии изделия,
	// а обозначение экземпляра выводится в отдельном столбце
	void SetResourceMode(bool res_mode){m_res_dlg_mode=res_mode;};

	void SetPropertiesForm(CaplInstance* form){m_properties_form=form;}


	// save_all режим отработки выделенных строк: false - если выделено,
	//	то сохранять только выделенные строки, если ничего не выделено - то сохранить всю таблицу;
	// true - всегда сохранять всю таблицу
	void SaveToFile(bool save_all);
	void SaveToFileAll();
	void SaveToFileSel();

	CaplAPI *m_api;
	CaplInstance* m_base_inst;
	// имя файла для сохранения данных
	CString m_def_file_name;
	bool m_create_assoc_doc;

	// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CInstPropertyCtrl)
protected:
	//}}AFX_VIRTUAL
	void PrintVal(CaplValue &val, CString &buf, SColumnDescr* column);


protected:
	// при определении столбцов, допустимых для данной entity храненит значение полсденего
	// набора - для убыстрения заполнения однотипных инстансов
	SEntityColumns* m_LastEntityColumn;
	// если данные заданы массивом instance-ов, то к ним может прилагаться комментарий 
	// (дополнительный столбец). Это имя дополнительного столбца
	CString m_add_column_name;
	CString m_add_column_name_2;
	// Данные о ширине и порядке следования столбцов атрибутов и характеристик
	CaplDataBuf* m_column_data;

	// если данные заданы в виде массива строк - массив заголовков столбцов
	CStringArray m_ColumnsHeader;
	// реальное количество групп столбцов (должно быть <=MAX_GROUPS)
	int m_multiplicity;
	// данные - если данные заданы в виде массива строк
	CaplTAggr<SItemStringData*,SItemStringData*,APLAGGR_LIST_OR_AUTOKILLREF> *m_Items_String;
	// данные - если данные заданы в виде массива инстансов (возможно, в несколько уровней)
	CaplTAggr<SItemColumnData*,SItemColumnData*,APLAGGR_LIST_OR_AUTOKILLREF> *m_Items_Columns;
	// маска отображаемых entity (не используется в текущей версии)
	//CaplTAggr<SEntColumnsMask*,SEntColumnsMask*,APLAGGR_LIST_OR_AUTOKILLREF> *m_EntColumnsMask;
	
	// маска отображаемых столбцов (множество тех, что видны в диалоге "выбрать столбцы")
	//long m_AllColumnsMask[MAX_GROUPS];
	// список отображаемых столбцов; в out - порядковый номер
	int m_AllVisibleColumns[MAX_GROUPS][NUM_OBJ_COL];
	bool m_columns_def;

	// таблица номеров столбцов в группах
	int m_real_position[MAX_GROUPS][NUM_OBJ_COL];
	// порядок столбцов в группах. Д.б. от 0 до NUM_OBJ_COL
	int m_order[MAX_GROUPS][NUM_OBJ_COL];
	// ширина столбцов по группам.
	int m_column_width[MAX_GROUPS][NUM_OBJ_COL];
	// первый свободный столбец после группы
	int m_first_free_column[MAX_GROUPS];
	// первый столбец, используемый группой
	int m_first_used_column[MAX_GROUPS];
	// столбец с иконкой группы
	int m_icon_column[MAX_GROUPS];
	// надо ли отображать столбец с иконками для этой группы
	bool m_enable_icon_column[MAX_GROUPS];
	// ширина столбца по умолчанию (если определить из других источников невозможно)
	//int m_my_width;
	// отработка контекстного меню своими силами
	bool m_context_menu_processed;
	// в меню есть команды "Сохранить в файл"
	bool m_context_menu_save2file;
	// в меню есть команды "Сохранить в папку"
	bool m_context_menu_save2folder;
	// в меню есть команды "Сохранить в категорию"
	bool m_context_menu_save2categ;
	// в меню есть команды "Назначить доступ"
	bool m_context_menu_set_access;

	// надо ли при заполнении таблицы перечитывать из БД список доступных 
	// характеристик (для каждой группы) и их значений
	bool m_ReReadCharact[MAX_GROUPS];
	// была ли таблица заполнена данными
	bool m_TableFull;
	// были ли данными о характеристиках прочитаны из буфера
	bool m_ReadyCharacteristicColumn;
	// надо ли при загрузке значений характеристик из БД искать новые характеристики
	bool m_FindNewCharacteristic;

	// Установлен ли режим диалога отображения ресурсов. В этом режиме 
	// для экземпляров изделий в столбце "обозначение" выводится информация об версии изделия,
	// а обозначение экземпляра выводится в отдельном столбце
	bool m_res_dlg_mode;

	// список характеристик (->apl_characteristic) в комбинации с типами характеристик 
	// (assignment_type->apl_characteristic_assignment_type) доступных для inst в списке 
	CaplTAggr<CaplCharacteristicManager::SCharType*,CaplCharacteristicManager::SCharType*,
		APLAGGR_AUTOKILLREF> m_characts_and_types [MAX_GROUPS];
	// список строковых массивов (1)имен характеристик в комбинации с (2)именами типов характеристик 
	// и (3)именами единиц измерения
	CaplTAggr<CStringArray*,CStringArray*,APLAGGR_LIST_OR_AUTOKILLREF> m_names_characts_and_types [MAX_GROUPS];
	// true если характеристика числовая, false если иное
	CArray<bool,bool> m_is_characts_number [MAX_GROUPS];
	// true если характеристика типа даты, false если иное
	CArray<bool,bool> m_is_characts_date [MAX_GROUPS];

	// для каждого inst из входного списка - массив строковых значений характеристик
	CaplTAggr<CStringArray*,CStringArray*,APLAGGR_LIST_OR_AUTOKILLREF> m_charact_values_array[MAX_GROUPS];

	// массив индексов характеристик из m_characts_and_types в том порядке, в котором
	// столбцы с их значениями должны быть на экране
	CUIntArray m_SelectedCharMask[MAX_GROUPS];
	// массив индексов атрибутов инстансов в том порядке, в котором
	// столбцы с их значениями должны быть на экране
	CUIntArray m_ColumnsInsertedInstances[MAX_GROUPS];

	// для каждой entity хранит значения атрибутов (CaplAttr) которые надо 
	// взять для получения типовых столбцов
	CaplTAggr<SEntityColumns*,SEntityColumns*,APLAGGR_LIST_OR_AUTOKILLREF> m_AvailableColumns;

	// если не равно нулю - то при двойном клике свойства объекта показываются в указанной форме
	// автоматически сбрасывается при установке новых данных!
	CaplInstance* m_properties_form;
	
	void ClearView();
	bool ReadCoumnWidth();
	void InitAvailableColumns();
	CString Type2Name(DWORD type);
	int Type2Order(DWORD type,int num_group);
	int Type2WidthCol(DWORD type,int num_group);
	SEntityColumns* GetInstColumns(CaplInstance * inst);
//D		long GetEntityMask(CaplEntity* ent);
	void SetTypeRealPos(DWORD type,int position,int num_group);
	void Renumerate();
	int GetInstIcon(CaplInstance *inst);
//D 	static int Type2Index(long type);
//D 	long Index2Type(int index);	
	// отображает характеристики согласно буферам, заполненным
	// фукнциями SetCharacterysticFromExt или SelectCharacterysticSet
	bool FillCharacteristik(int num_group);

	//{{AFX_MSG(CSortListCtrl)
	afx_msg void OnContextMenu( CWnd* pWnd, CPoint pos  );
	//}}AFX_MSG

};

#endif // !defined(AFX_INSTPROPERTYCTRL_H__1396C98A_B3E8_4A15_8203_DE80C078F64D__INCLUDED_)

