Leaked source code of windows server 2003
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

//=============================================================================
// 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()
{
}