Files

504 lines
12 KiB
C++

// DlgSchedMarkers.cpp : implementation file
//
#include "stdafx.h"
#include "sp.h"
#include "DlgSchedMarkers.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgSchedMarkers dialog
CDlgSchedMarkers::CDlgSchedMarkers(CWnd* pParent /*=NULL*/)
: CDialog(CDlgSchedMarkers::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgSchedMarkers)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_pApp= (CSpApp*)AfxGetApp();
//Initialize recordset pointer
rs=m_pApp->rsPool->GetRS("CDlgSchedMarkers");
}
CDlgSchedMarkers::~CDlgSchedMarkers()
{
//delete rs;
m_pApp->rsPool->ReleaseRS(&rs->m_nID);
}
void CDlgSchedMarkers::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgSchedMarkers)
DDX_Control(pDX, IDC_BTNCOLOR, m_btnColor);
DDX_Control(pDX, IDC_BTNREFRESH, m_btnRefresh);
DDX_Control(pDX, IDC_BTNDONE, m_btnDone);
DDX_Control(pDX, IDC_BTNADD, m_btnAdd);
DDX_Control(pDX, IDC_LSTMARKERS, m_lsMarkers);
DDX_Control(pDX, IDC_LBLSAMPLE, m_lblSample);
DDX_Control(pDX, IDC_EDNOTES, m_edNotes);
DDX_Control(pDX, IDC_DTTSTART, m_dtStartTime);
DDX_Control(pDX, IDC_DTTEND, m_dtEndTime);
DDX_Control(pDX, IDC_DTSTART, m_dtStartDate);
DDX_Control(pDX, IDC_DTEND, m_dtEndDate);
DDX_Control(pDX, IDC_CBAPPLIESTO, m_cbAppliesTo);
DDX_Control(pDX, IDC_BTNDEL, m_btnDelete);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgSchedMarkers, CDialog)
//{{AFX_MSG_MAP(CDlgSchedMarkers)
ON_BN_CLICKED(IDC_BTNDONE, OnBtndone)
ON_LBN_SELCHANGE(IDC_LSTMARKERS, OnSelchangeLstmarkers)
ON_BN_CLICKED(IDC_BTNCOLOR, OnBtncolor)
ON_EN_KILLFOCUS(IDC_EDNOTES, OnKillfocusEdnotes)
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DTSTART, OnDatetimechangeDtstart)
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DTEND, OnDatetimechangeDtend)
ON_CBN_CLOSEUP(IDC_CBAPPLIESTO, OnCloseupCbappliesto)
ON_BN_CLICKED(IDC_BTNADD, OnBtnadd)
ON_NOTIFY(NM_KILLFOCUS, IDC_DTTSTART, OnKillfocusDttstart)
ON_NOTIFY(NM_KILLFOCUS, IDC_DTTEND, OnKillfocusDttend)
ON_BN_CLICKED(IDC_BTNREFRESH, OnBtnrefresh)
ON_BN_CLICKED(IDC_BTNDEL, OnBtndel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgSchedMarkers message handlers
BOOL CDlgSchedMarkers::OnInitDialog()
{
CDialog::OnInitDialog();
Security();
m_lblSample.SetFontBold(TRUE);
m_lblSample.SetFontSize(14);
m_lblSample.SetBkColor(RGB(128,128,128));
m_lGreen=m_lBlue=m_lRed=128;
m_lblSample.SetTextColor(RGB(0,0,0));
m_edNotes.SetLimitText(15);
FillAppliesToList();
FillMarkerList();
m_bAddMode=false;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDlgSchedMarkers::FillAppliesToList()
{
CString strData, strIndex;
long lData;
m_cbAppliesTo.Clear();
strData="< Office >";
strIndex="0";
m_cbAppliesTo.AddRow(strData,strIndex);
rs->QueryReadOnly("SELECT users.id, [last] & \", \" & [first] AS name "
"FROM users WHERE (((users.id)<>1) AND ((users.tech)=True) AND ((users.active)=True)) "
"ORDER BY [last] & \", \" & [first];");
if(!rs->IsEmpty())
{
do
{
rs->FetchField("name",&strData);
rs->FetchField("id",&lData);
strIndex.Format("%u",lData);
m_cbAppliesTo.AddRow(strData,strIndex);
}while(rs->MoveForward());
m_cbAppliesTo.Select("0");
}
}
void CDlgSchedMarkers::OnBtndone()
{
CDialog::OnOK();
}
void CDlgSchedMarkers::OnOK()
{}
//Fill list of items
void CDlgSchedMarkers::FillMarkerList()
{
long lData;
CString strIndex,strData,strNotes,strName;
COleDateTime dtStart,dtEnd;
m_lsMarkers.Clear();
EnableFields(false);
rs->QueryReadOnly(
"SELECT schedmarkers.id, schedmarkers.link, schedmarkers.startdate, schedmarkers.notes, "
"users.first, users.last "
"FROM schedmarkers LEFT JOIN users ON schedmarkers.link = users.id "
"ORDER BY schedmarkers.startdate DESC;");
if(!rs->IsEmpty())
{
EnableFields(true);
do{
rs->FetchField("id",&lData);
strIndex.Format("%u",lData);
rs->FetchField("startdate",&dtStart);
strNotes=dtStart.Format();
rs->FetchField("notes",&strData);
strNotes+="\t"+strData;
rs->FetchField("link",&lData);
if(lData==0)
{
strName="<Office>";
}
else
{
rs->FetchField("last",&strData);
strName=strData;
rs->FetchField("first",&strData);
strName+=", " + strData;
}
strNotes+=" - "+strName;
m_lsMarkers.AddRow(strNotes,strIndex);
}while(rs->MoveForward());
if(m_strSelectedItem.IsEmpty())
{
m_lsMarkers.SetCurSel(0);
m_lsMarkers.RebuildIndex();//<--------FIXES PROBLEM
m_strSelectedItem=m_lsMarkers.GetSelectedItem(0);//<-------problem
}
else
m_lsMarkers.Select(m_strSelectedItem,true);
//OnSelchangeLstmarkers();
FillFields();
}
}
void CDlgSchedMarkers::OnSelchangeLstmarkers()
{
CString q,strID,strNotes,strAppliesTo;
COleDateTime dtStart,dtEnd;
m_lsMarkers.RebuildIndex();//<--------FIXES PROBLEM
m_strSelectedItem=m_lsMarkers.GetSelectedItem(0);//<-------problem
FillFields();
}
void CDlgSchedMarkers::OnBtncolor()
{
CString q;
CColorDialog dlg(RGB(255,0,0),CC_SOLIDCOLOR/*|CC_PREVENTFULLOPEN*/);
if (dlg.DoModal() == IDOK)
{
COLORREF color = dlg.GetColor();
m_lRed=GetRValue(color);
m_lGreen=GetGValue(color);
m_lBlue=GetBValue(color);
m_lblSample.SetBkColor(RGB(m_lRed,m_lGreen,m_lBlue));
m_lblSample.SetTextColor(RGB(0,0,0));
}
SaveRecord(false);
}
//save new record or update existing record
void CDlgSchedMarkers::SaveRecord(bool bNew)
{
//only save or update a record if out of add mode
if(m_bAddMode) return;
CString q,strID,strNotes,strAppliesTo;
COleDateTime dtStart,dtEnd,dtTime,dtDate;
long lData;
/*m_lsMarkers.RebuildIndex();//<--------FIXES PROBLEM
strID=m_lsMarkers.GetSelectedItem(0);//<-------problem
*/
//get start date/time
m_dtStartTime.GetTime(dtTime);
m_dtStartDate.GetTime(dtDate);
dtStart.SetDateTime(dtDate.GetYear(),dtDate.GetMonth(),dtDate.GetDay(),dtTime.GetHour(),dtTime.GetMinute(),dtTime.GetSecond());
//get End date/time
m_dtEndTime.GetTime(dtTime);
m_dtEndDate.GetTime(dtDate);
dtEnd.SetDateTime(dtDate.GetYear(),dtDate.GetMonth(),dtDate.GetDay(),dtTime.GetHour(),dtTime.GetMinute(),dtTime.GetSecond());
//Get notes
m_edNotes.GetWindowText(strNotes);
if(strNotes.IsEmpty()) strNotes="??";
//Get link
strAppliesTo=m_cbAppliesTo.GetCurrentRowID();
//BUGBUG: on change of date schedule reverts to gray color
if(bNew)
{
q.Format(
"INSERT INTO schedmarkers ( link, startdate, enddate, notes, red, green, blue ) "
"SELECT %s, #%s#, #%s#, '%s', %u, %u, %u;",strAppliesTo,dtStart.Format(_T("%m/%d/%Y %H:%M:%S")),
dtEnd.Format(_T("%m/%d/%Y %H:%M:%S")),strNotes,m_lRed,m_lGreen,m_lBlue);
rs->Ex(q,&lData);
m_strSelectedItem.Format("%u",lData);
}
else
{
ASSERT(!m_strSelectedItem.IsEmpty());
strID=m_strSelectedItem;
q.Format(
"UPDATE schedmarkers SET schedmarkers.link = %s, schedmarkers.startdate = #%s#, "
"schedmarkers.enddate = #%s#, schedmarkers.notes = '%s', schedmarkers.red = %u, "
"schedmarkers.green = %u, schedmarkers.blue = %u "
"WHERE (((schedmarkers.id)=%s));",strAppliesTo,dtStart.Format(_T("%m/%d/%Y %H:%M:%S")),
dtEnd.Format(_T("%m/%d/%Y %H:%M:%S")),strNotes,m_lRed,m_lGreen,m_lBlue,strID);
#ifdef _DEBUG
//m_pApp->ShowStuff(q);
#endif
rs->Ex(q);
}
//force a delay to flush change before refilling list
rs->QueryReadOnly("SELECT * FROM defaults;");
rs->Close();
m_pApp->Delay(1);
}
void CDlgSchedMarkers::OnBtnadd()
{
COleDateTime dtData;
dtData=COleDateTime::GetCurrentTime();
if(m_bAddMode)
{
m_bAddMode=false;
m_btnAdd.SetWindowText("Add");
m_btnDone.ShowWindow(TRUE);
m_btnDelete.ShowWindow(TRUE);
m_btnRefresh.ShowWindow(TRUE);
SaveRecord(true);
m_strSelectedItem.Empty();
FillMarkerList();
}
else
{
EnableFields(true);
m_bAddMode=true;
m_btnAdd.SetWindowText("SAVE");
m_btnDone.ShowWindow(FALSE);
m_btnRefresh.ShowWindow(FALSE);
m_lblSample.SetBkColor(RGB(128,128,128));
m_lblSample.SetTextColor(RGB(0,0,0));
m_lGreen=m_lBlue=m_lRed=128;
m_btnDelete.ShowWindow(FALSE);
m_dtEndDate.SetTime(dtData);
m_dtStartDate.SetTime(dtData);
dtData.SetTime(0,0,0);
m_dtStartTime.SetTime(dtData);
dtData.SetTime(23,59,59);
m_dtEndTime.SetTime(dtData);
m_edNotes.SetWindowText("??");
}
}
void CDlgSchedMarkers::OnKillfocusDttstart(NMHDR* pNMHDR, LRESULT* pResult)
{
SaveRecord(false);
*pResult = 0;
}
void CDlgSchedMarkers::OnKillfocusDttend(NMHDR* pNMHDR, LRESULT* pResult)
{
SaveRecord(false);
*pResult = 0;
}
void CDlgSchedMarkers::OnKillfocusEdnotes()
{
SaveRecord(false);
}
void CDlgSchedMarkers::OnDatetimechangeDtstart(NMHDR* pNMHDR, LRESULT* pResult)
{
COleDateTime dtData;
if(m_bAddMode)//change stop date to start date when in add mode
{
m_dtStartDate.GetTime(dtData);
m_dtEndDate.SetTime(dtData);
}
SaveRecord(false);
*pResult = 0;
}
void CDlgSchedMarkers::OnDatetimechangeDtend(NMHDR* pNMHDR, LRESULT* pResult)
{
SaveRecord(false);
*pResult = 0;
}
void CDlgSchedMarkers::OnCloseupCbappliesto()
{
SaveRecord(false);
}
//refresh list
void CDlgSchedMarkers::OnBtnrefresh()
{
FillMarkerList();
}
void CDlgSchedMarkers::FillFields()
{
CString q,strNotes,strAppliesTo;
COleDateTime dtStart,dtEnd;
long lData;
ASSERT(!m_strSelectedItem.IsEmpty());
q.Format("SELECT schedmarkers.* "
"FROM schedmarkers "
"WHERE (((schedmarkers.id)=%s));",m_strSelectedItem);
rs->QueryReadOnly(q);
if(!rs->IsEmpty())
{
rs->FetchField("startdate",&dtStart);
rs->FetchField("enddate",&dtEnd);
rs->FetchField("notes",&strNotes);
rs->FetchField("red",&m_lRed);
rs->FetchField("green",&m_lGreen);
rs->FetchField("blue",&m_lBlue);
rs->FetchField("link",&lData);
m_dtStartDate.SetTime(dtStart);
m_dtStartTime.SetTime(dtStart);
m_dtEndDate.SetTime(dtEnd);
m_dtEndTime.SetTime(dtEnd);
m_edNotes.SetWindowText(strNotes);
m_lblSample.SetBkColor(RGB(m_lRed,m_lGreen,m_lBlue));
m_lblSample.SetTextColor(RGB(0,0,0));
m_cbAppliesTo.Select(lData);
}
}
void CDlgSchedMarkers::OnBtndel()
{
if(AfxMessageBox("Delete selected item?\r\nAre you sure?",MB_YESNO)==IDNO) return;
CString q;
q.Format("DELETE schedmarkers.*, schedmarkers.id "
"FROM schedmarkers "
"WHERE (((schedmarkers.id)=%s));",m_strSelectedItem);
rs->Ex(q);
rs->QueryReadOnly("SELECT * FROM defaults;");
rs->Close();
m_pApp->Delay(1);
m_strSelectedItem.Empty();
FillMarkerList();
}
//enable fields
void CDlgSchedMarkers::EnableFields(bool bEnable)
{
if(m_bReadOnly) return;
BOOL e= bEnable ? TRUE:FALSE;
m_btnDelete.EnableWindow(e);
m_dtEndDate.EnableWindow(e);
m_dtStartDate.EnableWindow(e);
m_cbAppliesTo.EnableWindow(e);
m_dtEndTime.EnableWindow(e);
m_dtStartTime.EnableWindow(e);
m_edNotes.EnableWindow(e);
m_btnColor.EnableWindow(e);
}
void CDlgSchedMarkers::Security()
{
m_bReadOnly=false;
int x=m_pApp->Allowed(RSCHEDMARKERS,true);
if(x==0)//no access allowed
{
m_pApp->SecurityWarning();
CDialog::OnCancel();
}
if(x==2)//read only
{
m_bReadOnly=true;
m_btnAdd.ShowWindow(FALSE);
m_btnDelete.ShowWindow(FALSE);
m_btnColor.EnableWindow(FALSE);
m_cbAppliesTo.EnableWindow(FALSE);
m_dtEndDate.EnableWindow(FALSE);
m_dtEndTime.EnableWindow(FALSE);
m_dtStartDate.EnableWindow(FALSE);
m_dtStartTime.EnableWindow(FALSE);
m_edNotes.EnableWindow(FALSE);
}
}