#if !defined(AFX_ATTRIBEDITDLG_H__F9F05A57_B4EE_4DD3_A003_DCD6FF0A374E__INCLUDED_)
#define AFX_ATTRIBEDITDLG_H__F9F05A57_B4EE_4DD3_A003_DCD6FF0A374E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// AttribEditDlg.h : header file
//

#include <vector>
#include <map>
#include <string>
#include <afx.h>
#include <afxcoll.h>
#include "DataRecipient.h"



#define ATT_BEHAVIOR_UPDATE_PERIOD 10

class CDashboardRecipient;
class CFileManagerDlg;

/////////////////////////////////////////////////////////////////////////////
// CAttribEditDlg dialog

class CAttribEditDlg : public CDialog, public CDataRecipient
{
// Construction
public:
	CAttribEditDlg(CWnd* pParent = NULL);   // standard constructor
    void setFileName(CString filename);
	void setAbortName(CString abortName);
	void setRecipient(CDashboardRecipient *recipient);
	void setCurrentBehavior(int curS, int curB, int misRunning);
	void setAttributeAck(bool type, bool success, short state, short priority, char* name);
	CString getCurrentNormal();
	CString getCurrentAbort();
	CString myIdent();
	static bool getMissionRunning();
	void beforeDestroy();

	void setFileManager(CFileManagerDlg* p)
	{ m_fm = p; };

// Dialog Data
	//{{AFX_DATA(CAttribEditDlg)
	enum { IDD = IDD_ATTRIBEDIT_DLG };
	CEdit	m_Status;
	CTreeCtrl	m_ChangeTree;
	CTreeCtrl	m_MyTree;
	CComboBox	m_combo;
	//}}AFX_DATA


// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAttribEditDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:

	//MMRecipient
	CDashboardRecipient* m_recipient;

	enum WhichChanges
	{
		KEEPOLD = 0,
		KEEPNEW
	};

	enum UpdateStatus
	{
		con_start = 0,
		uncon_start,
		con_stop,
		uncon_stop
	}; 

	enum MissionStatus
	{
		mission_none = 0,
		mission_initializing,
		mission_going
	} _missionStatus;
	
	UpdateStatus _upStatus;
	UpdateStatus _newStatus;

	int fileLparam;

	virtual BOOL OnInitDialog();

	void LoadFile(int i, CString fname);
	void WriteFile(int i, CString fname, WhichChanges w);
	void FillTree(int i, CString fname);
	CString ExtractData(CString nd);
	CString ExtractName(CString nd);
	void SaveAttribFile(int i);
	CString getShortName(CString s);
	bool ChangesNeedSaving(int snum);
	int StateAsParent(HTREEITEM h, int i);
	void AddStateToChange(int x);
	void PackageSend();
	void BlitzIcon();
	void WriteStatus();
	void Cleanup();
	int findAttIndexFromName(short state, short priority, CString name);

	CFileManagerDlg* m_fm;

	CString m_normalName;
	CString m_abortName;
	CString m_normalShort;
	CString m_abortShort;

	BOOL checkEditBuffer;
	HTREEITEM it_changeRoot;

	typedef struct Attribute{
		CString name;
		CString data;
		CString dataNew;
		BOOL dataDiffSaved;
		BOOL dataToSend;
	};

	typedef CArray<Attribute*, Attribute*> MyDualString;

	typedef struct AttToSend{
		short state;
		short priority;
		CString name;
		CString data;
	};

	typedef struct Behavior{
		CString name;
		short priority;
		MyDualString attributes;
	};	
	
	CArray<AttToSend*, AttToSend*> toSend;
	typedef CArray<Behavior*, Behavior*> BehaviorStack;
	
	//for now only two states so only two behaviorStacks

	BehaviorStack _behaviors[2];

	//CArray<Behavior*, Behavior*> _changedBehaviors;
	CStringArray _comments;

	// Generated message map functions
	//{{AFX_MSG(CAttribEditDlg)
	virtual void OnOK();
	afx_msg void OnItemexpandingTree1(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnSavesend();
	afx_msg void OnJustsave();
	afx_msg void OnKillchange();
	afx_msg void OnTimer(UINT nIDEvent);
	afx_msg void OnAddatt();
	afx_msg void OnSingleupdate();
	afx_msg void OnStartupdate();
	afx_msg void OnStopupdate();
	afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
	afx_msg void OnClose();
	afx_msg void OnJumpBehavior();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_ATTRIBEDITDLG_H__F9F05A57_B4EE_4DD3_A003_DCD6FF0A374E__INCLUDED_)
