📄 pagequery2.cpp
字号:
//////////////////////////////////////////////////////
//
// NRDB Pro - Spatial database and mapping application
//
// Copyright (c) 1989-2004 Richard D. Alexander
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// NRDB Pro is part of the Natural Resources Database Project
//
// Homepage: http://www.nrdb.co.uk/
// Users' Forum: http://nrdb.mypalawan.info/
//
#include "stdafx.h"
#include <strstrea.h>
#include "nrdb.h"
#include "sheetquery.h"
#include "PageQuery2.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPageQuery2 property page
IMPLEMENT_DYNCREATE(CPageQuery2, CPropertyPage)
CPageQuery2::CPageQuery2(CQuery* pQuery, CQuery* pQueryPrev, int nType) :
CPropertyPage(CPageQuery2::IDD)
{
m_pQuery = pQuery;
m_pQueryPrev = pQueryPrev;
m_nType = nType;
//{{AFX_DATA_INIT(CPageQuery2)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CPageQuery2::CPageQuery2()
{
}
CPageQuery2::~CPageQuery2()
{
}
void CPageQuery2::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPageQuery2)
DDX_Control(pDX, IDC_TO, m_eTo);
DDX_Control(pDX, IDC_FROM, m_eFrom);
DDX_Control(pDX, IDC_DATES, m_cbDates);
DDX_Control(pDX, IDC_VALUE, m_eValue);
DDX_Control(pDX, IDC_LBCOND, m_lbCond);
DDX_Control(pDX, IDC_COND, m_cbCond);
DDX_Control(pDX, IDC_ATTR, m_cbAttr);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPageQuery2, CPropertyPage)
//{{AFX_MSG_MAP(CPageQuery2)
ON_CBN_SELCHANGE(IDC_DATES, OnSelchangeDates)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_DELETE, OnDelete)
ON_LBN_SELCHANGE(IDC_LBCOND, OnSelChangeCond)
ON_CBN_SELCHANGE(IDC_ATTR, OnSelChangeAttr)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPageQuery2 message handlers
BOOL CPageQuery2::OnInitDialog()
{
CPropertyPage::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
///////////////////////////////////////////////////////////////////////////////
BOOL CPageQuery2::OnSetActive()
{
CString sDate;
// Intialise
m_cbDates.ResetContent();
for (int i = 0; m_pQuery->m_aQueryDates[i].m_nID != -1; i++)
{
CQueryDate& rQueryDate = m_pQuery->m_aQueryDates[i];
int index = m_cbDates.AddStringX(rQueryDate.m_psDescription,
rQueryDate.m_nID);
if (rQueryDate.m_nID == m_pQuery->GetDateCond())
{
m_cbDates.SetCurSel(index);
}
};
OnSelchangeDates();
if (m_eFrom.IsWindowEnabled())
{
m_pQuery->GetStartDate().DateAsString(sDate);
m_eFrom.SetWindowText(sDate);
m_pQuery->GetEndDate().DateAsString(sDate);
m_eTo.SetWindowText(sDate);
}
CString sFType;
// Fill list of numeric attributes
m_cbAttr.ResetContent();
// Retrieve currently selected sort elements
CQueryElement* pElement = m_pQuery;
while (pElement != NULL)
{
// Determine the feature type name
if (pElement->GetDataType() == BDFTYPE)
{
sFType = CQuery::StripBrackets(pElement->GetDesc());
}
// Add Numeric Elements to list
if (pElement->GetDataType() == BDNUMBER
|| pElement->GetDataType() == BDTEXT
|| (pElement->GetDataType() == BDLONGTEXT && BDGetVersion(BDHandle()) >= 3)
|| pElement->GetDataType() == BDLINK
)
{
int index = m_cbAttr.AddString(sFType + " - " + pElement->GetDesc());
m_cbAttr.SetItemDataPtr(index, pElement);
}
pElement = pElement->GetNextQuery();
}
m_cbAttr.SetCurSel(0);
// Add conditions to list
OnSelChangeAttr();
// Restore list of existing conditions
UpdateList();
return CPropertyPage::OnSetActive();
}
/////////////////////////////////////////////////////////////////////////////
//
// Set the attributes corresponding to the currently selected datatype
//
void CPageQuery2::OnSelChangeAttr()
{
m_cbCond.ResetContent();
int index = m_cbAttr.GetCurSel();
if (index != CB_ERR)
{
CQueryElement *pElement = (CQueryElement*)m_cbAttr.GetItemDataPtr(index);
// Numeric conditions
if (pElement->GetDataType() == BDNUMBER)
{
m_cbCond.AddStringX(BDString(IDS_EQUALTO), CQueryElement::equal);
m_cbCond.AddStringX(BDString(IDS_NOEQUALTO), CQueryElement::notequal);
m_cbCond.AddStringX(BDString(IDS_GREATERTHAN_Q), CQueryElement::greater);
m_cbCond.AddStringX(BDString(IDS_GREATEROREQUAL), CQueryElement::greaterequal);
m_cbCond.AddStringX(BDString(IDS_LESSTHAN_Q), CQueryElement::less);
m_cbCond.AddStringX(BDString(IDS_LESSTHANOREQUAL), CQueryElement::lessequal);
}
// memo fields are text only in database version 3
else if ((pElement->GetDataType() == BDLONGTEXT && BDGetVersion(BDHandle()) >= 3)
|| pElement->GetDataType() == BDTEXT || pElement->GetDataType() == BDLINK)
{
m_cbCond.AddStringX(BDString(IDS_EQUALTO), CQueryElement::equal);
m_cbCond.AddStringX(BDString(IDS_NOEQUALTO), CQueryElement::notequal);
m_cbCond.AddStringX(BDString(IDS_CONTAINS), CQueryElement::contains);
m_cbCond.AddStringX(BDString(IDS_NOTCONTAINS), CQueryElement::notcontains);
if (pElement->GetDataType() != BDLINK)
{
m_cbCond.AddStringX(BDString(IDS_LIKE), CQueryElement::like);
};
}
};
m_cbCond.SetCurSel(0);
}
/////////////////////////////////////////////////////////////////////////////
void CPageQuery2::OnSelchangeDates()
{
long lCond;
m_cbDates.GetItemDataX(lCond);
BOOL bRange = (lCond == CQuery::FirstDateRange || lCond == CQuery::LastDateRange ||
lCond == CQuery::AllDatesRange);
BOOL bFrom = (lCond == CQuery::AllDatesAfter || lCond == CQuery::AllDatesBefore);
m_eFrom.EnableWindow(bRange || bFrom);
m_eTo.EnableWindow(bRange);
GetDlgItem(IDS_TO)->EnableWindow(bRange);
}
///////////////////////////////////////////////////////////////////////////////
void CPageQuery2::UpdateList()
{
CString s;
// Produce list of existing conditions
m_lbCond.ResetContent();
CQueryElement* pElement = m_pQuery;
while (pElement != NULL)
{
if (pElement->GetCond() != CQueryElement::none)
{
s = pElement->GetDesc();
// Condition
switch (pElement->GetCond())
{
case CQueryElement::equal : s += " = "; break;
case CQueryElement::notequal : s += " <> "; break;
case CQueryElement::greater : s += " > "; break;
case CQueryElement::greaterequal : s += " >= "; break;
case CQueryElement::less : s += " < "; break;
case CQueryElement::lessequal : s += " >= "; break;
case CQueryElement::contains : s += " " + BDString(IDS_CONTAINS) + " "; break;
case CQueryElement::notcontains : s += " " + BDString(IDS_NOTCONTAINS) + " "; break;
case CQueryElement::like : s += " " + BDString(IDS_LIKE) + " "; break;
}
// Numeric value
if (pElement->GetDataType() == BDNUMBER)
{
strstream str;
str.precision(10);
str << pElement->GetCondValue() << ends;
s += str.str();
str.rdbuf()->freeze(0);
}
// String value
else if (pElement->GetDataType() == BDTEXT ||
pElement->GetDataType() == BDLONGTEXT ||
pElement->GetDataType() == BDLINK)
{
s += "'" + CString(pElement->GetCondValueStr()) + "'";
}
int index = m_lbCond.AddString(s);
m_lbCond.SetItemDataPtr(index, pElement);
}
pElement = pElement->GetNextQuery();
};
OnSelChangeCond();
}
///////////////////////////////////////////////////////////////////////////////
BOOL CPageQuery2::OnKillActive()
{
long lCond;
CString sFrom, sTo;
CDateTime dtFrom, dtTo;
BOOL bOK = TRUE;
m_cbDates.GetItemDataX(lCond);
// Retrieve dates
if (m_eFrom.IsWindowEnabled())
{
m_eFrom.GetWindowText(sFrom);
bOK = dtFrom.StringAsDate(sFrom);
};
if (bOK && m_eTo.IsWindowEnabled())
{
m_eTo.GetWindowText(sTo);
bOK = dtTo.StringAsDate(sTo);
}
if (bOK && dtFrom.IsValid() && dtFrom.IsValid() && m_eTo.IsWindowEnabled())
{
bOK = dtFrom <= dtTo;
}
if (!bOK)
{
AfxMessageBox(BDString(IDS_DATEFORMAT));
return 0;
};
// Save values
if (bOK)
{
m_pQuery->SetStartDate(dtFrom);
m_pQuery->SetEndDate(dtTo);
m_pQuery->SetDateCond(lCond);
};
// Save the query as the default for the next time the dialog is used
if (bOK)
{
return CPropertyPage::OnKillActive();
}
return FALSE;
};
///////////////////////////////////////////////////////////////////////////////
//
// Retrieve condition and add it to the list
//
void CPageQuery2::OnAdd()
{
double dValue;
CString sValue;
// Retrieve attribute and condition
int index = m_cbAttr.GetCurSel();
int iCond = m_cbCond.GetCurSel();
if (index != CB_ERR && iCond != CB_ERR)
{
CQueryElement* pElement = (CQueryElement*)m_cbAttr.GetItemDataPtr(index);
int nCond = m_cbCond.GetItemData(iCond);
// Numeric conditions
if (pElement->GetDataType() == BDNUMBER)
{
// Get numeric value
if (m_eValue.GetValue(dValue))
{
pElement->SetCond(nCond);
pElement->SetCondValue(dValue);
UpdateList();
}
}
// Text conditions
else if (pElement->GetDataType() == BDTEXT || pElement->GetDataType() == BDLONGTEXT ||
pElement->GetDataType() == BDLINK)
{
if (m_eValue.GetValue(sValue))
{
pElement->SetCond(nCond);
pElement->SetCondValueStr(sValue);
UpdateList();
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
void CPageQuery2::OnDelete()
{
int index = m_lbCond.GetCurSel();
if (index != LB_ERR)
{
CQueryElement *pElement = (CQueryElement*)m_lbCond.GetItemDataPtr(index);
pElement->SetCond(CQueryElement::none);
pElement->SetCondValue(0);
UpdateList();
}
}
///////////////////////////////////////////////////////////////////////////////
//
// Update the controls to display the latest selection
//
void CPageQuery2::OnSelChangeCond()
{
int index = m_lbCond.GetCurSel();
if (index != LB_ERR)
{
CQueryElement *pElement = (CQueryElement*)m_lbCond.GetItemDataPtr(index);
// Search for the attribute
for (int i = 0; i < m_cbAttr.GetCount(); i++)
{
CQueryElement* pElementL = (CQueryElement*)m_cbAttr.GetItemDataPtr(i);
if (pElementL == pElement)
{
m_cbAttr.SetCurSel(i);
break;
}
}
// Find the condition
for (i = 0; i < m_cbCond.GetCount(); i++)
{
if (pElement->GetCond() == (int)m_cbCond.GetItemData(i))
{
m_cbCond.SetCurSel(i);
break;
};
}
// Set the numerical value
if (pElement->GetDataType() == BDNUMBER)
{
strstream str;
str.precision(10);
str << pElement->GetCondValue() << ends;
m_eValue.SetWindowText(str.str());
str.rdbuf()->freeze(0);
}
else if (pElement->GetDataType() == BDTEXT ||
pElement->GetDataType() == BDLONGTEXT ||
pElement->GetDataType() == BDLINK)
{
m_eValue.SetWindowText(pElement->GetCondValueStr());
}
}
}
///////////////////////////////////////////////////////////////////////////////
void CPageQuery2::OnOK()
{
*m_pQueryPrev = *m_pQuery;
CPropertyPage::OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -