⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pagequery2.cpp

📁 一个英国人写的GIS查看/编辑工具。支持标准的shapefile地图文件格式和coverage地图文件格式。同时可以编辑相应的dbf文件。
💻 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 + -