373 lines
9.1 KiB
C++
373 lines
9.1 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows/NT **/
|
|
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
ipstrm.cpp
|
|
|
|
FILE HISTORY:
|
|
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include "column.h"
|
|
#include "xstream.h"
|
|
|
|
/*---------------------------------------------------------------------------
|
|
ViewInfo implementation
|
|
---------------------------------------------------------------------------*/
|
|
|
|
ViewInfo::ViewInfo()
|
|
{
|
|
m_cColumns = 0;
|
|
m_prgColumns = NULL;
|
|
m_dwSortColumn = 0;
|
|
m_dwSortDirection = TRUE;
|
|
m_pViewColumnInfo = NULL;
|
|
m_cVisibleColumns = 0;
|
|
m_prgSubitems = NULL;
|
|
m_fConfigurable = TRUE;
|
|
}
|
|
|
|
ViewInfo::~ViewInfo()
|
|
{
|
|
delete [] m_prgColumns;
|
|
delete [] m_prgSubitems;
|
|
m_pViewColumnInfo = NULL;
|
|
}
|
|
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ViewInfo::InitViewInfo
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
void ViewInfo::InitViewInfo(ULONG cColumns,
|
|
BOOL fConfigurable,
|
|
BOOL fDefaultSortDirectionDescending,
|
|
const ContainerColumnInfo *pViewColInfo)
|
|
{
|
|
m_cColumns = cColumns;
|
|
delete [] m_prgColumns;
|
|
m_prgColumns = new ColumnData[cColumns];
|
|
|
|
delete [] m_prgSubitems;
|
|
m_prgSubitems = new ULONG[cColumns];
|
|
|
|
m_pViewColumnInfo = pViewColInfo;
|
|
|
|
m_fDefaultSortDirection = fDefaultSortDirectionDescending;
|
|
|
|
m_fConfigurable = fConfigurable;
|
|
|
|
InitNew();
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ViewInfo::InitNew
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
void ViewInfo::InitNew()
|
|
{
|
|
// setup the defaults for this column
|
|
for (int i=0; i<(int) m_cColumns; i++)
|
|
{
|
|
if (m_pViewColumnInfo[i].m_fVisibleByDefault)
|
|
m_prgColumns[i].m_nPosition = i+1;
|
|
else
|
|
m_prgColumns[i].m_nPosition = -(i+1);
|
|
|
|
m_prgColumns[i].m_dwWidth = AUTO_WIDTH;
|
|
}
|
|
|
|
m_dwSortDirection = m_fDefaultSortDirection;
|
|
|
|
UpdateSubitemMap();
|
|
}
|
|
|
|
ULONG ViewInfo::MapSubitemToColumn(ULONG nSubitemId)
|
|
{
|
|
for (ULONG i=0; i<m_cVisibleColumns; i++)
|
|
{
|
|
if (m_prgSubitems[i] == nSubitemId)
|
|
return i;
|
|
}
|
|
return 0xFFFFFFFF;
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ViewInfo::UpdateSubitemMap
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
void ViewInfo::UpdateSubitemMap()
|
|
{
|
|
Assert(m_prgSubitems);
|
|
|
|
ULONG i, cVisible, j;
|
|
|
|
// Iterate over the entire set of columns
|
|
for (i=0, cVisible=0; i<m_cColumns; i++)
|
|
{
|
|
// look for this column in ColumnData
|
|
for (j=0; j<m_cColumns; j++)
|
|
{
|
|
if ((ULONG) m_prgColumns[j].m_nPosition == (i+1))
|
|
break;
|
|
}
|
|
|
|
// Did we find anything? If not go on
|
|
if (j >= m_cColumns)
|
|
continue;
|
|
|
|
m_prgSubitems[cVisible++] = j;
|
|
}
|
|
m_cVisibleColumns = cVisible;
|
|
}
|
|
|
|
|
|
HRESULT ViewInfo::Xfer(XferStream *pxstm, ULONG ulSortColumnId,
|
|
ULONG ulSortAscendingId, ULONG ulColumnsId)
|
|
{
|
|
Assert(pxstm);
|
|
|
|
HRESULT hr = hrOK;
|
|
ULONG cColumns;
|
|
|
|
// Xfer the column data
|
|
Assert(m_prgColumns);
|
|
|
|
cColumns = m_cColumns;
|
|
CORg( pxstm->XferColumnData(ulColumnsId, &m_cColumns,
|
|
m_prgColumns) );
|
|
|
|
// The number of columns shouldn't change!
|
|
Assert(m_cColumns == cColumns);
|
|
// Use the old number of columns (this is for as we change our code)
|
|
m_cColumns = cColumns;
|
|
|
|
// Xfer the sort column
|
|
CORg( pxstm->XferDWORD( ulSortColumnId, &m_dwSortColumn) );
|
|
|
|
// Xfer the ascending data
|
|
CORg( pxstm->XferDWORD( ulSortAscendingId, &m_dwSortDirection) );
|
|
|
|
UpdateSubitemMap();
|
|
|
|
Error:
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
ConfigStream implementation
|
|
---------------------------------------------------------------------------*/
|
|
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ConfigStream::ConfigStream
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
ConfigStream::ConfigStream()
|
|
: m_nVersion(0x00020000),
|
|
m_nVersionAdmin(0x0002000),
|
|
m_fDirty(FALSE),
|
|
m_rgViewInfo(NULL),
|
|
m_cColumnSetsMax(0),
|
|
m_prgrc(NULL)
|
|
{
|
|
}
|
|
|
|
ConfigStream::~ConfigStream()
|
|
{
|
|
delete [] m_rgViewInfo;
|
|
delete [] m_prgrc;
|
|
m_cColumnSetsMax = 0;
|
|
}
|
|
|
|
void ConfigStream::Init(ULONG cColumnSetsMax)
|
|
{
|
|
delete [] m_rgViewInfo;
|
|
m_rgViewInfo = NULL;
|
|
m_rgViewInfo = new ViewInfo[cColumnSetsMax];
|
|
|
|
delete [] m_prgrc;
|
|
m_prgrc = NULL;
|
|
m_prgrc = new RECT[cColumnSetsMax];
|
|
|
|
m_cColumnSetsMax = cColumnSetsMax;
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ConfigStream::InitViewInfo
|
|
Initializes the static data. This is not the same as InitNew.
|
|
This will initialize the data for a single view.
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
void ConfigStream::InitViewInfo(ULONG ulId,
|
|
BOOL fConfigurableColumns,
|
|
ULONG cColumns,
|
|
BOOL fSortDirection,
|
|
const ContainerColumnInfo *pViewColumnInfo)
|
|
{
|
|
Assert(ulId < m_cColumnSetsMax);
|
|
m_fConfigurableColumns = fConfigurableColumns;
|
|
m_rgViewInfo[ulId].InitViewInfo(cColumns, fConfigurableColumns,
|
|
fSortDirection,
|
|
pViewColumnInfo);
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ConfigStream::InitNew
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
HRESULT ConfigStream::InitNew()
|
|
{
|
|
int iVisible=0;
|
|
// Setup the appropriate defaults
|
|
for (UINT i=0; i<m_cColumnSetsMax; i++)
|
|
{
|
|
m_rgViewInfo[i].InitNew();
|
|
m_prgrc[i].top = m_prgrc[i].bottom = 0;
|
|
m_prgrc[i].left = m_prgrc[i].right = 0;
|
|
}
|
|
|
|
return hrOK;
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ConfigStream::SaveTo
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
HRESULT ConfigStream::SaveTo(IStream *pstm)
|
|
{
|
|
return XferVersion0(pstm, XferStream::MODE_WRITE, NULL);
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ConfigStream::SaveAs
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
HRESULT ConfigStream::SaveAs(UINT nVersion, IStream *pstm)
|
|
{
|
|
return XferVersion0(pstm, XferStream::MODE_WRITE, NULL);
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ConfigStream::LoadFrom
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
HRESULT ConfigStream::LoadFrom(IStream *pstm)
|
|
{
|
|
return XferVersion0(pstm, XferStream::MODE_READ, NULL);
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ConfigStream::GetSize
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
HRESULT ConfigStream::GetSize(ULONG *pcbSize)
|
|
{
|
|
return XferVersion0(NULL, XferStream::MODE_SIZE, NULL);
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ConfigStream::GetVersionInfo
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
HRESULT ConfigStream::GetVersionInfo(DWORD *pdwVersion, DWORD *pdwAdminVersion)
|
|
{
|
|
if (pdwVersion)
|
|
*pdwVersion = m_nVersion;
|
|
if (pdwAdminVersion)
|
|
*pdwAdminVersion = m_nVersionAdmin;
|
|
return hrOK;
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ConfigStream::XferVersion0
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
HRESULT ConfigStream::XferVersion0(IStream *pstm, XferStream::Mode mode, ULONG *pcbSize)
|
|
{
|
|
Panic0("Should be implemented by derived classes!");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
void ConfigStream::GetStatsWindowRect(ULONG ulId, RECT *prc)
|
|
{
|
|
*prc = m_prgrc[ulId];
|
|
}
|
|
|
|
void ConfigStream::SetStatsWindowRect(ULONG ulId, RECT rc)
|
|
{
|
|
m_prgrc[ulId] = rc;
|
|
}
|
|
|
|
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ViewInfo::GetColumnData
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
HRESULT ViewInfo::GetColumnData(ULONG cColData,
|
|
ColumnData *prgColData)
|
|
{
|
|
Assert(cColData <= m_cColumns);
|
|
Assert(prgColData);
|
|
Assert(!IsBadWritePtr(prgColData, sizeof(ColumnData)*cColData));
|
|
|
|
HRESULT hr = hrOK;
|
|
|
|
memcpy(prgColData, m_prgColumns, sizeof(ColumnData)*cColData);
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT ViewInfo::GetColumnData(ULONG nColumnId, ULONG cColData,
|
|
ColumnData *prgColData)
|
|
{
|
|
Assert(cColData <= m_cColumns);
|
|
Assert(prgColData);
|
|
Assert(!IsBadWritePtr(prgColData, sizeof(ColumnData)*cColData));
|
|
|
|
HRESULT hr = hrOK;
|
|
|
|
memcpy(prgColData, m_prgColumns + nColumnId, sizeof(ColumnData)*cColData);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT ViewInfo::SetColumnData(ULONG cColData, ColumnData*prgColData)
|
|
{
|
|
// For now we don't do resizing
|
|
Assert(cColData == m_cColumns);
|
|
Assert(prgColData);
|
|
Assert(!IsBadReadPtr(prgColData, sizeof(ColumnData)*cColData));
|
|
|
|
HRESULT hr = hrOK;
|
|
|
|
memcpy(m_prgColumns, prgColData, sizeof(ColumnData)*cColData);
|
|
UpdateSubitemMap();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|