// ZonesDlg.cpp : implementation file // #include "stdafx.h" #include "sp.h" #include "ZonesDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //memory leak debugging help #define _CRTDBG_MAP_ALLOC #include #include ///////////////////////////////////////////////////////////////////////////// // CZonesDlg dialog CZonesDlg::CZonesDlg(CWnd* pParent /*=NULL*/) : CDialog(CZonesDlg::IDD, pParent) { //{{AFX_DATA_INIT(CZonesDlg) //}}AFX_DATA_INIT m_pApp= (CSpApp*)AfxGetApp(); //Initialize recordset pointer rs=m_pApp->rsPool->GetRS("CZonesDlg"); } CZonesDlg::~CZonesDlg() { m_pApp->rsPool->ReleaseRS(&rs->m_nID); } void CZonesDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CZonesDlg) DDX_Control(pDX, IDC_ZONE_LIST_LABEL, m_lblZoneList); DDX_Control(pDX, IDC_ZONE_NAME, m_edZoneName); DDX_Control(pDX, IDC_ZONE_DESCRIPTION, m_edZoneDescription); DDX_Control(pDX, IDC_ZONE_COMBO, m_cbZoneList); DDX_Control(pDX, IDC_ZONE_DELETE, m_btnZoneDelete); DDX_Control(pDX, IDC_ZONE_ADD, m_btnZoneAdd); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CZonesDlg, CDialog) //{{AFX_MSG_MAP(CZonesDlg) ON_BN_CLICKED(IDC_ZONE_DELETE, OnZoneDelete) ON_BN_CLICKED(IDC_ZONE_ADD, OnZoneAdd) ON_CBN_CLOSEUP(IDC_ZONE_COMBO, OnCloseupZoneCombo) ON_EN_KILLFOCUS(IDC_ZONE_DESCRIPTION, OnKillfocusZoneDescription) ON_EN_KILLFOCUS(IDC_ZONE_NAME, OnKillfocusZoneName) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CZonesDlg message handlers void CZonesDlg::OnZoneDelete() { CString q,strData; q.Format("SELECT * FROM clients WHERE (czone = %s );",m_cbZoneList.GetCurrentRowID()); rs->Query(q); if(rs->IsEmpty())//no clients in that zone { q.Format("DELETE zones.*, zones.id FROM zones WHERE (((zones.id)=%s));",m_cbZoneList.GetCurrentRowID()); if(AfxMessageBox("Are you sure?",MB_YESNO)==IDYES) { rs->Ex(q); //a deleted zone can't be selected m_strSelectedZone=""; } } else { q="DATA INTEGRITY PROTECTION:\r\nYou cannot delete this zone because\r\nthe following clients are set to use it:\r\n"; //fill combo box with available zones rs->MoveFirst(); rs->FetchField("company",&strData); q=q+strData+"\r\n"; while(rs->MoveForward()) { rs->FetchField("company",&strData); q=q+strData+"\r\n"; } AfxMessageBox(q); } FillZoneList(); } void CZonesDlg::OnZoneAdd() { CString q,name,info; if(m_bAddMode) { m_bAddMode=false; m_cbZoneList.ShowWindow(TRUE); m_lblZoneList.ShowWindow(TRUE); m_btnZoneAdd.SetWindowText("Add"); m_btnZoneDelete.ShowWindow(TRUE); m_edZoneDescription.GetWindowText(info); m_edZoneName.GetWindowText(name); if(name.IsEmpty()) { AfxMessageBox("You must enter a zone name"); } else { q.Format("INSERT INTO zones ( name, zoneinfo ) SELECT \"%s\", \"%s\";",name,info); rs->Ex(q); rs->Close(); //rs->AddNewRecord(); //rs->UpdateField("name",&name); //rs->UpdateField("zoneinfo",&info); } FillZoneList(); } else//not add mode { DisableAll(false); m_cbZoneList.ShowWindow(FALSE); m_lblZoneList.ShowWindow(FALSE); m_btnZoneAdd.SetWindowText("SAVE"); m_btnZoneDelete.ShowWindow(FALSE); m_edZoneDescription.SetWindowText(""); m_edZoneName.SetWindowText(""); m_edZoneName.SetFocus(); m_bAddMode=true; } } BOOL CZonesDlg::OnInitDialog() { CDialog::OnInitDialog(); m_edZoneName.SetLimitText(50); m_edZoneDescription.SetLimitText(255); FillZoneList(); m_bAddMode=false; Security(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } bool CZonesDlg::FillZoneList() { CString strData; CString strIndex; long lData; m_cbZoneList.Clear(); rs->Query("SELECT zones.* FROM zones ORDER BY zones.name;"); if(!rs->IsEmpty()) { //fill combo box with available zones rs->MoveFirst(); rs->FetchField("name",&strData); rs->FetchField("id",&lData); strIndex.Format("%u",lData); m_cbZoneList.AddRow(strData,strIndex); while(rs->MoveForward()) { rs->FetchField("name",&strData); rs->FetchField("id",&lData); strIndex.Format("%u",lData); m_cbZoneList.AddRow(strData,strIndex); } //pretend user has selected so that other fields get filled in if(m_strSelectedZone.IsEmpty()) //first time in { m_cbZoneList.SetCurSel(0); m_strSelectedZone=m_cbZoneList.GetCurrentRowID(); } else//something valid was selected before so stick with it m_cbZoneList.Select(m_strSelectedZone); OnCloseupZoneCombo(); } else DisableAll(true); return true; } void CZonesDlg::OnCloseupZoneCombo() { //user has made a selection, update the visible list CString q; CString strData; q.Format("SELECT zones.* FROM zones WHERE (((zones.id)=%s));",m_cbZoneList.GetCurrentRowID()); rs->Query(q); if(!rs->IsEmpty()) { rs->FetchField("name",&strData); m_edZoneName.SetWindowText(strData); rs->FetchField("zoneinfo",&strData); m_edZoneDescription.SetWindowText(strData); } //save current selection so that updates and changes //will still show what was last selected m_strSelectedZone=m_cbZoneList.GetCurrentRowID(); } void CZonesDlg::OnKillfocusZoneDescription() { if(!m_bAddMode) { SaveField(&m_edZoneDescription,"zoneinfo",true); FillZoneList(); } } void CZonesDlg::OnKillfocusZoneName() { if(!m_bAddMode) { SaveField(&m_edZoneName,"name",false); FillZoneList(); } } bool CZonesDlg::SaveField(CEdit *edControl,CString fldname,bool AllowEmpty) { CString str; //do nothing if not changed if(edControl->GetModify()!=TRUE) return true; edControl->GetWindowText(str); //dont save empty fields if not allowed to if(!AllowEmpty) { if(str.IsEmpty()) { edControl->Undo(); return false; } } rs->UpdateField(fldname,&str); rs->SaveRecord(); return true; } void CZonesDlg::DisableAll(bool disable) { if(m_bReadOnly) return; BOOL e=disable ? FALSE:TRUE; m_btnZoneDelete.EnableWindow(e); m_cbZoneList.EnableWindow(e); m_edZoneDescription.EnableWindow(e); m_edZoneName.EnableWindow(e); } void CZonesDlg::Security() { m_bReadOnly=false; int x=m_pApp->Allowed(RZONES,true); if(x==0)//no access allowed { m_pApp->SecurityWarning(); CDialog::OnCancel(); } if(x==2)//read only { m_bReadOnly=true; m_btnZoneAdd.ShowWindow(FALSE); m_btnZoneDelete.ShowWindow(FALSE); m_edZoneDescription.SetReadOnly(TRUE); m_edZoneName.SetReadOnly(TRUE); } }