www.pudn.com > RichEditGrid_src.zip > CellRange.h


/////////////////////////////////////////////////////////////////////// 
// CellRange.h: header file 
// 
// MFC Grid Control - interface for the CCellRange class. 
// 
// Written by Chris Maunder  
// Copyright (c) 1998-2002. All Rights Reserved. 
// 
// This code may be used in compiled form in any way you desire. This 
// file may be redistributed unmodified by any means PROVIDING it is  
// not sold for profit without the authors written consent, and  
// providing that this notice and the authors name and all copyright  
// notices remains intact.  
// 
// An email letting me know how you are using it would be nice as well.  
// 
// This file is provided "as is" with no expressed or implied warranty. 
// The author accepts no liability for any damage/loss of business that 
// this product may cause. 
// 
// For use with CGridCtrl v2.20+ 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_CELLRANGE_H__F86EF761_725A_11D1_ABBA_00A0243D1382__INCLUDED_) 
#define AFX_CELLRANGE_H__F86EF761_725A_11D1_ABBA_00A0243D1382__INCLUDED_ 
 
#if _MSC_VER >= 1000 
#pragma once 
#endif // _MSC_VER >= 1000 
 
// The code contained in this file is based on the original 
// WorldCom Grid control written by Joe Willcoxson, 
//      mailto:chinajoe@aol.com 
//      http://users.aol.com/chinajoe 
 
class CCellID 
{     
// Attributes 
public: 
    int row, col; 
 
// Operations 
public: 
    explicit CCellID(int nRow = -1, int nCol = -1) : row(nRow), col(nCol) {} 
 
    int IsValid() const { return (row >= 0 && col >= 0); } 
    int operator==(const CCellID& rhs) const { return (row == rhs.row && col == rhs.col); } 
    int operator!=(const CCellID& rhs) const { return !operator==(rhs); } 
}; 
 
class CCellRange 
{  
public: 
     
    CCellRange(int nMinRow = -1, int nMinCol = -1, int nMaxRow = -1, int nMaxCol = -1) 
    { 
        Set(nMinRow, nMinCol, nMaxRow, nMaxCol); 
    } 
 
    void Set(int nMinRow = -1, int nMinCol = -1, int nMaxRow = -1, int nMaxCol = -1); 
     
    int  IsValid() const; 
    int  InRange(int row, int col) const; 
    int  InRange(const CCellID& cellID) const; 
    int  Count() { return (m_nMaxRow - m_nMinRow + 1) * (m_nMaxCol - m_nMinCol + 1); } 
     
    CCellID  GetTopLeft() const; 
    CCellRange  Intersect(const CCellRange& rhs) const; 
     
    int GetMinRow() const {return m_nMinRow;} 
    void SetMinRow(int minRow) {m_nMinRow = minRow;} 
     
    int GetMinCol() const {return m_nMinCol;} 
    void SetMinCol(int minCol) {m_nMinCol = minCol;} 
     
    int GetMaxRow() const {return m_nMaxRow;} 
    void SetMaxRow(int maxRow) {m_nMaxRow = maxRow;} 
     
    int GetMaxCol() const {return m_nMaxCol;} 
    void SetMaxCol(int maxCol) {m_nMaxCol = maxCol;} 
 
    int GetRowSpan() const {return m_nMaxRow - m_nMinRow + 1;} 
    int GetColSpan() const {return m_nMaxCol - m_nMinCol + 1;} 
     
    void operator=(const CCellRange& rhs); 
    int  operator==(const CCellRange& rhs); 
    int  operator!=(const CCellRange& rhs); 
     
protected: 
    int m_nMinRow; 
    int m_nMinCol; 
    int m_nMaxRow; 
    int m_nMaxCol; 
}; 
 
inline void CCellRange::Set(int minRow, int minCol, int maxRow, int maxCol) 
{ 
     m_nMinRow = minRow; 
     m_nMinCol = minCol; 
     m_nMaxRow = maxRow; 
     m_nMaxCol = maxCol; 
} 
 
inline void CCellRange::operator=(const CCellRange& rhs) 
{ 
    if (this != &rhs) Set(rhs.m_nMinRow, rhs.m_nMinCol, rhs.m_nMaxRow, rhs.m_nMaxCol); 
} 
 
inline int CCellRange::operator==(const CCellRange& rhs) 
{ 
     return ((m_nMinRow == rhs.m_nMinRow) && (m_nMinCol == rhs.m_nMinCol) && 
             (m_nMaxRow == rhs.m_nMaxRow) && (m_nMaxCol == rhs.m_nMaxCol)); 
} 
 
inline int CCellRange::operator!=(const CCellRange& rhs) 
{ 
     return !operator==(rhs); 
} 
 
inline int CCellRange::IsValid() const 
{ 
     return (m_nMinRow >= 0 && m_nMinCol >= 0 && m_nMaxRow >= 0 && m_nMaxCol >= 0 && 
             m_nMinRow <= m_nMaxRow && m_nMinCol <= m_nMaxCol); 
} 
 
inline int CCellRange::InRange(int row, int col) const 
{ 
     return (row >= m_nMinRow && row <= m_nMaxRow && col >= m_nMinCol && col <= m_nMaxCol); 
} 
 
inline int CCellRange::InRange(const CCellID& cellID) const 
{ 
     return InRange(cellID.row, cellID.col); 
} 
 
inline CCellID CCellRange::GetTopLeft() const 
{ 
     return CCellID(m_nMinRow, m_nMinCol); 
} 
 
inline CCellRange CCellRange::Intersect(const CCellRange& rhs) const 
{ 
     return CCellRange(max(m_nMinRow,rhs.m_nMinRow), max(m_nMinCol,rhs.m_nMinCol), 
                       min(m_nMaxRow,rhs.m_nMaxRow), min(m_nMaxCol,rhs.m_nMaxCol)); 
} 
 
#endif // !defined(AFX_CELLRANGE_H__F86EF761_725A_11D1_ABBA_00A0243D1382__INCLUDED_)