#if !defined(AFX_CHANGEASSEMBLYDLG_H__8AAB01CF_E7A9_4008_852E_F72C4DF70E9A__INCLUDED_)
#define AFX_CHANGEASSEMBLYDLG_H__8AAB01CF_E7A9_4008_852E_F72C4DF70E9A__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ChangeAssemblyDlg.h : header file
//

#include "ResizableDialog.h"

#include "resource.h"
#include "apl_gui.h"
#include "CommonChangeClasses.h"
#include "apl_api.h"

class CChangeParamDlg;
/////////////////////////////////////////////////////////////////////////////
// CChangeAssemblyDlg dialog

class CChangeAssemblyDlg : public CResizableDialog
{
// Construction
public:
	CChangeAssemblyDlg(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
	//{{AFX_DATA(CChangeAssemblyDlg)
	enum { IDD = IDD_CHANGE_ASSEMBLY_DLG };
	CEdit			m_sn;				// эдит-бокс "серийный номер"
	CDateTimeCtrl	m_dateCtrl;			// контрол выбора даты
	CComboBox		m_contCtrl;			// выбор контекста

	CaplButton		m_itemPropBtn;		// кнопка "Св-ва"
	CaplButton		m_itemClearBtn;		// кнопка "Очистить"
	CaplButton		m_itemDeleteBtn;	// кнопка "Удалить"
	CaplButton		m_itemChngBtn;		// кнопка "Изменить"
	CaplButton		m_itemAddBtn;		// кнопка "Добавить"
	CaplButton		m_selectBtn;		// кнопка "Выбрать"
	CaplButton		m_refreshBtn;		// кнопка "Перестроить"
	CaplButton		m_cancelBtn;		// "Отмена"
	CaplButton		m_okBtn;			// "ОК"
	CaplButton		m_setEffBtn;		// "Условие"

	CSortListCtrl	m_whereUsedList;	// где используется
	CSortListCtrl	m_itemsList;		// состав

	CString			m_sProductId;		// обозначение
	CString			m_sProductName;		// наименование
	CString			m_sProductVer;		// версия

	int				m_iCont;			// контекст
	BOOL			m_bSNSelected;		// выбран ли фильтр по серийному номеру
	BOOL			m_bDateSelected;	// выбран ли фильтр по дате
	COleDateTime	m_oleDate;			// собственно сама дата фильтра
	CString			m_sSN;				// серийный номер фильтра
	BOOL			m_bNotShow;
	//}}AFX_DATA


	/*	режим диалога
		0 - изменение структуры диалога
		1 - изменение материала
		2 - изменения изделия по всей БД
	*/
	long			m_mode;
	CaplAPI*		m_api;
	
	CaplInstance*	m_change;

	CaplInstance*	m_psc;		// созданное изменение
	CPSCItemInfo	m_pscInfo;	// новое изменение

	aplExtent *m_items;			// то, что уже создано в изменении

	CArray<CPSCItemInfo, CPSCItemInfo> *m_newItems; //новые элементы
	CArray<CPSCItemInfo, CPSCItemInfo> m_newestItems; //:)) новейшие элементы

	aplExtent*		m_delItems;		// удаленные элементы

	aplExtent		m_contexts;		// массив контекстов

	CaplInstance*	m_assPdf;		// сборка
	
	// для сборки 
	aplExtent		m_extPdfs;		// состав на один уровень
	aplExtent		m_extRels;		// связи
	aplRealArray	m_extCounts;	// кол-во
	aplExtent		m_extUnits;		// ед.изм.

	CImageList m_imageList;
	CImageList m_chngImageList;
	CImageList m_btnImageList;
	
	CaplInstance*	m_curItem;	// текущий выбранный итем в списке "Состав на один уровень"
	int				m_index;	// индекс текущего итема

	CaplInstance*	m_curPSC;
	CPSCItemInfo*	m_curPSCInfo;
	
	// правила применяемости для новых элементов
	CString m_sEffType;		// тип правила применяемости
	CString m_sStartCond;	// начало правила применяемости
	CString m_sEndCond;		// конец правила применяемости

	bool m_bReadOnly; // режим "только чтение"

	CFont m_FontStrikeOut;		// зачёркнутый системный шрифт

	bool m_bFilteredByDate;		// фильтровать по дате
	bool m_bFilteredBySN;		// фильтровать по серийному номеру
	bool m_bFilteredByContext;	// фильтровать по контексту

	struct sWhereUsedListItem
	{
		CaplInstance*	m_iRel;		// связка
		bool			m_bActive;	// активно ли данное изделие в составе
	};

	CaplTAggr <sWhereUsedListItem*, sWhereUsedListItem*,
				APLAGGR_LIST | APLAGGR_AUTOKILLREF> m_WhereUsedItems;

	struct sAssemblyListItem
	{
		CaplInstance*	m_iRel;		// связка
		COLORREF		m_Color;	// цвет, которым помечать итем
		bool			m_bActive;	// активно ли данное изделие в составе
		
		sAssemblyListItem()
		{
			m_Color		= ::GetSysColor(COLOR_WINDOWTEXT);
			m_bActive	= true;
		}
	};

	CaplTAggr <sAssemblyListItem*, sAssemblyListItem*,
				APLAGGR_LIST | APLAGGR_AUTOKILLREF> m_AssemblyItems;
	

	void SetAnchors();

	/** Проверяет связку на прохождение правила применяемости по дате
		rel - связка (NAUO)
		date - проверяемая дата
	*/
	bool IsPrdEffByDate(CaplInstance* rel, COleDateTime date);

	/** Проверяет связку на прохождение правила применяемости по текущей дате
		rel - связка (NAUO)
		date - проверяемая дата
	*/
	bool IsPrdEffByCurDate(CaplInstance* rel);
	
	/** Проверяет связку на прохождение правила применяемости по серийному номеру
		rel - связка (NAUO)
		sn - проверяемый серийный номер
	*/
	bool IsPrdEffBySN(CaplInstance* rel, const TCHAR* sn);

	/** Загружает системный шрифт и делает его зачёркнутым.
		Используется в списке "Где используется" для помечания
		не активности изделия в составе.
	*/
	void LoadSystemStrikeOutFont();


	void FillWhereUsedList();

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CChangeAssemblyDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:

	// Заполняет список "Состав на один уровень"
	bool FillAssemblyData();

	CString PrintEffectivityInString(CString type, CString start, CString end);

	void InsertText(int num, int iNexInd, CaplInstance* newPdf, double dCount, CaplInstance* unit, 
		CString sPos, CString sPosNum, CString sEffType, CString sStart, CString sEnd, CString sPrior= _T(""));
	
	bool FindItem(CChangeParamDlg *dlg, bool bDelete= false);

	// Generated message map functions
	//{{AFX_MSG(CChangeAssemblyDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnChg2AssSelect();
	afx_msg void OnChg2AssRefresh();
	afx_msg void OnItemchangedChangeItemsList(NMHDR* pNMHDR, LRESULT* pResult);
	virtual void OnOK();
	virtual void OnCancel();
	afx_msg void OnChg2Prop();
	afx_msg void OnChg2SetEff();
	afx_msg void OnChg2Clear();
	afx_msg void OnChg2ItemChange();
	afx_msg void OnChg2ItemDelete();
	afx_msg void OnChg2SnCheck();
	afx_msg void OnChg2DateCheck();
	afx_msg void OnCloseupChg2ContextCombo();
	afx_msg void OnDatetimechangeChg2DateCtrl(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnChangeChg2SnCtrl();
	afx_msg void OnDblclkListWhereUsed(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnDblclkChangeItemsList(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnChg2ItemAdd();
	afx_msg void OnDestroy();
	//}}AFX_MSG

	afx_msg void OnCustomdrawAssemblyItemsList ( NMHDR* pNMHDR, LRESULT* pResult );
	afx_msg void OnCustomdrawAssemblyWhereUsedItemsList( NMHDR* pNMHDR, LRESULT* pResult );
	afx_msg void OnAssemblyListHeaderClicked(NMHDR* pNMHDR, LRESULT* pResult);
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_CHANGEASSEMBLYDLG_H__8AAB01CF_E7A9_4008_852E_F72C4DF70E9A__INCLUDED_)
