home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / CPP / METAKIT.ZIP / EXAMPLES / CATFISH / FINDDLG.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-12-09  |  4.9 KB  |  183 lines

  1. //  finddlg.cpp  -  find dialog sample code
  2. //
  3. //  This is a part of the MetaKit library.
  4. //  Copyright (c) 1996 Meta Four Software.
  5. //  All rights reserved.
  6. /////////////////////////////////////////////////////////////////////////////
  7.  
  8. #include "stdafx.h"
  9. #include "catfish.h"
  10. #include "scandisk.h"
  11.  
  12. #ifdef _DEBUG
  13. #undef THIS_FILE
  14. static char BASED_CODE THIS_FILE[] = __FILE__;
  15. #endif
  16.  
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CMyEdit subclassed control
  19.  
  20. BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
  21.     //{{AFX_MSG_MAP(CMyEdit)
  22.     ON_WM_CHAR()
  23.     //}}AFX_MSG_MAP
  24. END_MESSAGE_MAP()
  25.  
  26. void CMyEdit::OnChar(UINT ch_, UINT rep_, UINT flags_)
  27. {
  28.         // only accept the characters which are allowed in a DOS filename
  29.     bool accept = ('A' <= ch_ && ch_ <= 'Z') ||
  30.                   ('a' <= ch_ && ch_ <= 'z') ||
  31.                   ('0' <= ch_ && ch_ <= '9') ||
  32.                   strchr("$%'+-@{}~`!#()&_", ch_) != 0;
  33.                   
  34.     if (accept || ch_ == VK_BACK || (ch_ == '.' && acceptDot))
  35.         CEdit::OnChar(ch_, rep_, flags_) ;
  36.     else
  37.         MessageBeep(0);
  38. }
  39.  
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CFindDialog dialog
  42.  
  43. CFindDialog::CFindDialog(CWnd* pParent /*=NULL*/)
  44.     : CDialog(CFindDialog::IDD, pParent), m_nameEditCtrl (true)
  45. {
  46.     //{{AFX_DATA_INIT(CFindDialog)
  47.     m_maxDate = "";
  48.     m_minDate = "";
  49.     m_nameEdit = "";
  50.     m_singleCat = FALSE;
  51.     m_minSize = "";
  52.     m_maxSize = "";
  53.     //}}AFX_DATA_INIT
  54.  
  55.     FixCriteria(); 
  56. }
  57.  
  58. void CFindDialog::DoDataExchange(CDataExchange* pDX)
  59. {
  60.     CDialog::DoDataExchange(pDX);
  61.     //{{AFX_DATA_MAP(CFindDialog)
  62.     DDX_Text(pDX, IDC_MAX_DATE, m_maxDate);
  63.     DDV_MaxChars(pDX, m_maxDate, 6);
  64.     DDX_Text(pDX, IDC_MIN_DATE, m_minDate);
  65.     DDV_MaxChars(pDX, m_minDate, 6);
  66.     DDX_Text(pDX, IDC_NAME_EDIT, m_nameEdit);
  67.     DDV_MaxChars(pDX, m_nameEdit, 15);
  68.     DDX_Check(pDX, IDC_SINGLE_CAT, m_singleCat);
  69.     DDX_Text(pDX, IDC_MIN_SIZE, m_minSize);
  70.     DDV_MaxChars(pDX, m_minSize, 6);
  71.     DDX_Text(pDX, IDC_MAX_SIZE, m_maxSize);
  72.     DDV_MaxChars(pDX, m_maxSize, 6);
  73.     //}}AFX_DATA_MAP
  74. }
  75.  
  76. BEGIN_MESSAGE_MAP(CFindDialog, CDialog)
  77.     //{{AFX_MSG_MAP(CFindDialog)
  78.     //}}AFX_MSG_MAP
  79. END_MESSAGE_MAP()
  80.  
  81.  
  82. /////////////////////////////////////////////////////////////////////////////
  83. // CFindDialog message handlers
  84.  
  85. BOOL CFindDialog::OnInitDialog()
  86. {
  87.     CenterWindow();
  88.     CDialog::OnInitDialog();
  89.     
  90.     m_nameEditCtrl.SubclassDlgItem(IDC_NAME_EDIT, this);
  91.     
  92.     CWnd* wnd = GetDlgItem(IDC_SINGLE_CAT);
  93.     ASSERT(wnd);
  94.     
  95.     wnd->SetWindowText("&Only search in '" + m_currCatName + "'");
  96.     
  97.     FixCriteria(); 
  98.     return TRUE;  // return TRUE  unless you set the focus to a control
  99. }
  100.  
  101. bool CFindDialog::Execute(const char* name)
  102. {
  103.     m_currCatName = name;
  104.     
  105.     if (DoModal() != IDOK)
  106.         return false;
  107.         
  108.     FixCriteria();
  109.     return true;    
  110. }
  111.  
  112.     static int ConvDate(const CString& s_, WORD default_ =0)
  113.     {
  114.         if (s_.GetLength() == 6)
  115.         {
  116.             int y = atoi(s_.Left(2)) - 80;
  117.             int m = atoi(s_.Mid(2, 2));
  118.             int d = atoi(s_.Right(2));
  119.             
  120.             if (y < -40)    // accepts 1940 .. 2039
  121.                 y += 100;
  122.                 
  123.             if (1 <= m && m <= 12 && 1 <= d && d <= 31)
  124.                 return (y << 9) | (m << 5) | d;
  125.         }
  126.         
  127.         return default_;
  128.     }
  129.     
  130. void CFindDialog::FixCriteria()
  131. {
  132.     m_upName = m_nameEdit;
  133.     m_upName.MakeUpper();
  134.         
  135.     m_loDate = ConvDate(m_minDate);
  136.     m_hiDate = ConvDate(m_maxDate, 0x7FFF);
  137.     
  138.     m_loSize = atol(m_minSize) * 1000;
  139.     m_hiSize = m_maxSize.IsEmpty() ? 0x7FFFFFFFL
  140.                                    : atol(m_maxSize) * 1000 + 999;
  141.  
  142.         // by avoiding all unnecessary access we also avoid on-demand loading
  143.     m_checkName = !m_nameEdit.IsEmpty();
  144.     m_checkDate = !m_minDate.IsEmpty() || !m_maxDate.IsEmpty();
  145.     m_checkSize = !m_minSize.IsEmpty() || !m_maxSize.IsEmpty();
  146. }
  147.  
  148. bool CFindDialog::NeedsCompare() const
  149. {
  150.     return m_checkName || m_checkDate || m_checkSize;
  151. }
  152.  
  153. bool CFindDialog::Match(const c4_RowRef& row_) const
  154. {
  155.     if (m_checkName)
  156.     {
  157.         CString s = pName (row_);
  158.         s.MakeUpper(); // compare in uppercase to avoid case sensitivity
  159.         
  160.         if (s.Find(m_upName) < 0)
  161.             return false;
  162.     }
  163.                         
  164.     if (m_checkDate)
  165.     {
  166.         int v = (int) pDate (row_);
  167.         if (v < m_loDate || v > m_hiDate)
  168.             return false;
  169.     }
  170.                         
  171.     if (m_checkSize)
  172.     {
  173.         long v = pSize (row_);
  174.         if (v < m_loSize || v > m_hiSize)
  175.             return false;
  176.     } 
  177.     
  178.     return true;
  179. }
  180.  
  181. /////////////////////////////////////////////////////////////////////////////
  182. // $Id: finddlg.cpp,v 1.2 1996/12/04 14:49:27 jcw Exp $
  183.