You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
349 lines
9.8 KiB
349 lines
9.8 KiB
//=============================================================================
|
|
// This file contains code to implement the CMSInfoCategory and
|
|
// CMSInfoColumn classes.
|
|
//=============================================================================
|
|
|
|
#include "stdafx.h"
|
|
#include "category.h"
|
|
|
|
//=============================================================================
|
|
// CMSInfoCategory
|
|
//=============================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Get the name and/or caption for the category (loading the name from the
|
|
// string resources if necessary).
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CMSInfoCategory::GetNames(CString * pstrCaption, CString * pstrName)
|
|
{
|
|
if (pstrName)
|
|
*pstrName = m_strName;
|
|
|
|
if (pstrCaption)
|
|
{
|
|
if (m_uiCaption)
|
|
{
|
|
TCHAR szCaption[MAX_PATH];
|
|
::LoadString(_Module.GetResourceInstance(), m_uiCaption, szCaption, MAX_PATH);
|
|
m_strCaption = szCaption;
|
|
m_uiCaption = 0;
|
|
}
|
|
|
|
*pstrCaption = m_strCaption;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Get the number of rows and/or columns.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL CMSInfoCategory::GetCategoryDimensions(int * piColumnCount, int * piRowCount)
|
|
{
|
|
if (piColumnCount)
|
|
{
|
|
if (SUCCEEDED(m_hrError))
|
|
*piColumnCount = m_iColCount;
|
|
else
|
|
*piColumnCount = 1;
|
|
}
|
|
|
|
if (piRowCount)
|
|
{
|
|
if (SUCCEEDED(m_hrError))
|
|
*piRowCount = m_iRowCount;
|
|
else
|
|
*piRowCount = 1;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Is the specified row advanced?
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL CMSInfoCategory::IsRowAdvanced(int iRow)
|
|
{
|
|
if (FAILED(m_hrError) && iRow == 0)
|
|
return FALSE;
|
|
|
|
ASSERT(iRow < m_iRowCount);
|
|
if (iRow >= m_iRowCount)
|
|
return FALSE;
|
|
|
|
return m_afRowAdvanced[iRow];
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Is the specified column advanced?
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL CMSInfoCategory::IsColumnAdvanced(int iColumn)
|
|
{
|
|
if (FAILED(m_hrError) && iColumn == 0)
|
|
return FALSE;
|
|
|
|
ASSERT(iColumn < m_iColCount);
|
|
if (m_acolumns == NULL || iColumn >= m_iColCount)
|
|
return FALSE;
|
|
|
|
return m_acolumns[iColumn].m_fAdvanced;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Get information about the specified column.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL CMSInfoCategory::GetColumnInfo(int iColumn, CString * pstrCaption, UINT * puiWidth, BOOL * pfSorts, BOOL * pfLexical)
|
|
{
|
|
ASSERT(iColumn < m_iColCount);
|
|
if (iColumn >= m_iColCount)
|
|
return FALSE;
|
|
|
|
CMSInfoColumn * pCol = &m_acolumns[iColumn];
|
|
|
|
if (FAILED(m_hrError) && iColumn == 0)
|
|
{
|
|
if (pstrCaption)
|
|
pstrCaption->Empty();
|
|
|
|
if (puiWidth)
|
|
*puiWidth = 240;
|
|
|
|
if (pfSorts)
|
|
*pfSorts = FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
if (pstrCaption)
|
|
{
|
|
if (pCol->m_uiCaption)
|
|
{
|
|
TCHAR szCaption[MAX_PATH];
|
|
::LoadString(_Module.GetResourceInstance(), pCol->m_uiCaption, szCaption, MAX_PATH);
|
|
pCol->m_strCaption = szCaption;
|
|
pCol->m_uiCaption = 0;
|
|
}
|
|
|
|
*pstrCaption = pCol->m_strCaption;
|
|
}
|
|
|
|
if (puiWidth)
|
|
*puiWidth = pCol->m_uiWidth;
|
|
|
|
if (pfSorts)
|
|
*pfSorts = pCol->m_fSorts;
|
|
|
|
if (pfLexical)
|
|
*pfLexical = pCol->m_fLexical;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Save the width of the specified column.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CMSInfoCategory::SetColumnWidth(int iCol, int iWidth)
|
|
{
|
|
ASSERT(iCol < m_iColCount && iCol >= 0);
|
|
if (iCol >= m_iColCount || iCol < 0)
|
|
return;
|
|
|
|
m_acolumns[iCol].m_uiWidth = (UINT) iWidth;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Get data for the specified row and column.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
static CString strErrorMessage;
|
|
BOOL CMSInfoCategory::GetData(int iRow, int iCol, CString ** ppstrData, DWORD * pdwData)
|
|
{
|
|
if (FAILED(m_hrError) && iCol == 0 && iRow == 0)
|
|
{
|
|
if (ppstrData)
|
|
{
|
|
GetErrorText(&strErrorMessage, NULL);
|
|
*ppstrData = &strErrorMessage;
|
|
}
|
|
|
|
if (pdwData)
|
|
*pdwData = 0;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
ASSERT(iRow < m_iRowCount && iCol < m_iColCount);
|
|
if (iRow >= m_iRowCount || iCol >= m_iColCount)
|
|
return FALSE;
|
|
|
|
if (ppstrData)
|
|
*ppstrData = &m_astrData[iRow * m_iColCount + iCol];
|
|
|
|
if (pdwData)
|
|
*pdwData = m_adwData[iRow * m_iColCount + iCol];
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Get the error strings for this category (subclasses should override this).
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CMSInfoCategory::GetErrorText(CString * pstrTitle, CString * pstrMessage)
|
|
{
|
|
if (pstrTitle)
|
|
pstrTitle->Empty();
|
|
|
|
if (pstrMessage)
|
|
pstrMessage->Empty();
|
|
}
|
|
|
|
//=============================================================================
|
|
// Helper functions for managing the arrays of data.
|
|
//=============================================================================
|
|
|
|
#ifndef SAFE_DELETE_ARRAY
|
|
#define SAFE_DELETE_ARRAY(x) { if (x) { delete [] x; x = NULL; } }
|
|
#endif
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Deletes all the content (except the array of columns if m_fDynamicColumns
|
|
// is false). Generally, this will be used when the category is destructing.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CMSInfoCategory::DeleteAllContent()
|
|
{
|
|
DeleteContent();
|
|
if (m_fDynamicColumns)
|
|
{
|
|
SAFE_DELETE_ARRAY(m_acolumns);
|
|
m_iColCount = 0;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Deletes all of the refreshed data (strings and DWORDs) and sets the number
|
|
// of rows to zero. It leaves the column information alone. This will be called
|
|
// when the data for a category is being refreshed.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CMSInfoCategory::DeleteContent()
|
|
{
|
|
SAFE_DELETE_ARRAY(m_astrData);
|
|
SAFE_DELETE_ARRAY(m_adwData);
|
|
SAFE_DELETE_ARRAY(m_afRowAdvanced);
|
|
|
|
m_iRowCount = 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Allocates space for the specified number of rows and columns, including
|
|
// the column array. Automatically sets the m_fDynamicColumns to TRUE.
|
|
// This will be called when the CMSInfoCategory is being created for the
|
|
// first time, and the columns are going to be dynamically set.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CMSInfoCategory::AllocateAllContent(int iRowCount, int iColCount)
|
|
{
|
|
ASSERT(iColCount);
|
|
|
|
DeleteAllContent();
|
|
|
|
m_iColCount = iColCount;
|
|
m_fDynamicColumns = TRUE;
|
|
m_acolumns = new CMSInfoColumn[m_iColCount];
|
|
|
|
// TBD - memory errors?
|
|
|
|
AllocateContent(iRowCount);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Allocates the space for the specified number of rows. Leaves the column
|
|
// information alone. This would typically be called when new data is
|
|
// available from a refresh and the arrays need to be set for the new row
|
|
// size.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CMSInfoCategory::AllocateContent(int iRowCount)
|
|
{
|
|
ASSERT(iRowCount);
|
|
|
|
DeleteContent();
|
|
|
|
m_iRowCount = iRowCount;
|
|
|
|
m_astrData = new CString[m_iColCount * m_iRowCount];
|
|
m_adwData = new DWORD[m_iColCount * m_iRowCount];
|
|
m_afRowAdvanced = new BOOL[m_iRowCount];
|
|
|
|
if (m_astrData == NULL || m_adwData == NULL || m_afRowAdvanced == NULL)
|
|
return; // TBD what to do?
|
|
|
|
for (int iRow = 0; iRow < m_iRowCount; iRow++)
|
|
{
|
|
m_afRowAdvanced[iRow] = FALSE;
|
|
|
|
for (int iCol = 0; iCol < m_iColCount; iCol++)
|
|
m_adwData[iRow * m_iColCount + iCol] = 0;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Put the specified string and DWORD into the arrays of data.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CMSInfoCategory::SetData(int iRow, int iCol, const CString & strData, DWORD dwData)
|
|
{
|
|
ASSERT(iRow < m_iRowCount && iCol < m_iColCount);
|
|
|
|
if (m_astrData)
|
|
m_astrData[iRow * m_iColCount + iCol] = strData;
|
|
|
|
if (m_adwData)
|
|
m_adwData[iRow * m_iColCount + iCol] = dwData;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Set the specified row's advanced flag.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CMSInfoCategory::SetAdvancedFlag(int iRow, BOOL fAdvanced)
|
|
{
|
|
ASSERT(iRow < m_iRowCount);
|
|
|
|
if (m_afRowAdvanced)
|
|
m_afRowAdvanced[iRow] = fAdvanced;
|
|
}
|
|
|
|
//=============================================================================
|
|
// CMSInfoColumn
|
|
//=============================================================================
|
|
|
|
CMSInfoColumn::CMSInfoColumn(UINT uiCaption, UINT uiWidth, BOOL fSorts, BOOL fLexical, BOOL fAdvanced) :
|
|
m_uiCaption(uiCaption),
|
|
m_strCaption(_T("")),
|
|
m_uiWidth(uiWidth),
|
|
m_fSorts(fSorts),
|
|
m_fLexical(fLexical),
|
|
m_fAdvanced(fAdvanced)
|
|
{
|
|
}
|
|
|
|
CMSInfoColumn::CMSInfoColumn() :
|
|
m_uiCaption(0),
|
|
m_strCaption(_T("")),
|
|
m_uiWidth(0),
|
|
m_fSorts(FALSE),
|
|
m_fLexical(FALSE),
|
|
m_fAdvanced(FALSE)
|
|
{
|
|
}
|
|
|
|
CMSInfoColumn::~CMSInfoColumn()
|
|
{
|
|
}
|