windows-nt/Source/XPSP1/NT/net/mmc/common/coldlg.cpp
2020-09-26 16:20:57 +08:00

387 lines
8.9 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/
/*
column.cpp
FILE HISTORY:
*/
#include "stdafx.h"
#include "tfschar.h"
#include "column.h"
#include "coldlg.h"
//----------------------------------------------------------------------------
// Class: ColumnDlg
//
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// Function: ColumnDlg::ColumnDlg
//----------------------------------------------------------------------------
ColumnDlg::ColumnDlg(
CWnd* pParent
) : CBaseDialog(IDD_COMMON_SELECT_COLUMNS, pParent)
{
}
//----------------------------------------------------------------------------
// Function: ColumnDlg::~ColumnDlg
//----------------------------------------------------------------------------
ColumnDlg::~ColumnDlg() { }
void ColumnDlg::Init(const ContainerColumnInfo *prgColInfo,
UINT cColumns,
ColumnData *prgColumnData)
{
Assert(prgColInfo);
Assert(prgColumnData);
m_pColumnInfo = prgColInfo;
m_cColumnInfo = cColumns;
m_pColumnData = prgColumnData;
}
//----------------------------------------------------------------------------
// Function: ColumnDlg::DoDataExchange
//----------------------------------------------------------------------------
void ColumnDlg::DoDataExchange(CDataExchange* pDX) {
CBaseDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(ColumnDlg)
DDX_Control(pDX, IDC_DISPLAYED_COLUMNS, m_lboxDisplayed);
DDX_Control(pDX, IDC_HIDDEN_COLUMNS, m_lboxHidden);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(ColumnDlg, CBaseDialog)
//{{AFX_MSG_MAP(ColumnDlg)
ON_WM_HSCROLL()
ON_BN_CLICKED(IDC_RESET_COLUMNS, OnUseDefaults)
ON_BN_CLICKED(IDC_MOVEUP_COLUMN, OnMoveUp)
ON_BN_CLICKED(IDC_MOVEDOWN_COLUMN, OnMoveDown)
ON_BN_CLICKED(IDC_ADD_COLUMNS, OnAddColumn)
ON_BN_CLICKED(IDC_REMOVE_COLUMNS, OnRemoveColumn)
ON_LBN_DBLCLK(IDC_HIDDEN_COLUMNS, OnAddColumn)
ON_LBN_DBLCLK(IDC_DISPLAYED_COLUMNS, OnRemoveColumn)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
DWORD ColumnDlg::m_dwHelpMap[] =
{
// IDC_LCX_COLUMNS, HIDC_LCX_COLUMNS,
// IDC_LCX_MOVEUP, HIDC_LCX_MOVEUP,
// IDC_LCX_MOVEDOWN, HIDC_LCX_MOVEDOWN,
// IDC_LCX_WIDTH, HIDC_LCX_WIDTH,
// IDC_LCX_LEFT, HIDC_LCX_LEFT,
// IDC_LCX_SCALE, HIDC_LCX_SCALE,
// IDC_LCX_RIGHT, HIDC_LCX_RIGHT,
0,0
};
//----------------------------------------------------------------------------
// Function: ColumnDlg::OnInitDialog
//
// Handles the 'WM_INITDIALOG' message.
//----------------------------------------------------------------------------
BOOL ColumnDlg::OnInitDialog() {
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ULONG i, j;
int iPos, iItem;
RECT rc;
POSITION pos;
CString sItem;
ULONG uCol;
CBaseDialog::OnInitDialog();
// Fill the list with the titles of the columns
//
if (!AddColumnsToList())
return FALSE;
//
// Select the first item
//
return TRUE;
}
void ColumnDlg::OnUseDefaults()
{
int count, i;
HDWP hdwp;
// Reset the column information
for (i=0; i<(int)m_cColumnInfo; i++)
{
if (m_pColumnInfo[i].m_fVisibleByDefault)
m_pColumnData[i].m_nPosition = i+1;
else
m_pColumnData[i].m_nPosition = -(i+1);
}
// Get rid of all of the current columns
hdwp = BeginDeferWindowPos(2);
m_lboxDisplayed.ResetContent();
m_lboxHidden.ResetContent();
// add the columns back to the list
AddColumnsToList();
if (hdwp)
EndDeferWindowPos(hdwp);
}
//----------------------------------------------------------------------------
// Function:: ColumnDlg::OnOK
//----------------------------------------------------------------------------
VOID
ColumnDlg::OnOK(
) {
BOOL bEmpty;
INT i;
INT count;
DWORD_PTR nPosition;
count = m_lboxDisplayed.GetCount();
//
// Check to see whether any columns are enabled
//
bEmpty = (count == 0);
//
// If no columns are enabled and the caller needs at least one column,
// complain to the user and don't close the dialog.
//
if (bEmpty)
{
AfxMessageBox(IDS_ERR_NOCOLUMNS);
return;
}
// Ok, we need to write the info back out
for (i = 0; i < count; i++)
{
nPosition = m_lboxDisplayed.GetItemData(i);
m_pColumnData[nPosition].m_nPosition = (i+1);
}
INT HiddenCount = m_lboxHidden.GetCount();
for (i = 0; i < HiddenCount; i++)
{
nPosition = m_lboxHidden.GetItemData(i);
m_pColumnData[nPosition].m_nPosition = -(1+i+count);
}
CBaseDialog::OnOK();
}
//----------------------------------------------------------------------------
// Function:: ColumnDlg::OnMoveUp
//----------------------------------------------------------------------------
VOID
ColumnDlg::OnMoveUp( ) { MoveItem(-1); }
//----------------------------------------------------------------------------
// Function:: ColumnDlg::OnMoveDown
//----------------------------------------------------------------------------
VOID
ColumnDlg::OnMoveDown( ) { MoveItem(1); }
//----------------------------------------------------------------------------
// Function:: ColumnDlg::OnRemoveColumn
//----------------------------------------------------------------------------
VOID
ColumnDlg::OnRemoveColumn( )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
INT i;
BOOL bEnabled;
CString sItem;
DWORD_PTR iItem;
//
// Get the selected item
//
i = m_lboxDisplayed.GetCurSel();
if (LB_ERR == i)
return;
iItem = m_lboxDisplayed.GetItemData(i);
//
// Remove the item from its current position
//
m_lboxDisplayed.DeleteString(i);
//
// Insert the item at its new position
//
sItem.LoadString(m_pColumnInfo[iItem].m_ulStringId);
i = m_lboxHidden.GetCount();
m_lboxHidden.InsertString(i, sItem);
m_lboxHidden.SetItemData(i, (DWORD)iItem);
m_lboxHidden.SetCurSel(i);
}
//----------------------------------------------------------------------------
// Function:: ColumnDlg::OnAddColumn
//----------------------------------------------------------------------------
VOID
ColumnDlg::OnAddColumn( )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
INT i;
BOOL bEnabled;
CString sItem;
DWORD_PTR iItem;
//
// Get the selected item
//
i = m_lboxHidden.GetCurSel();
if (LB_ERR == i)
return;
iItem = m_lboxHidden.GetItemData(i);
//
// Remove the item from its current position
//
m_lboxHidden.DeleteString(i);
//
// Insert the item at its new position
//
sItem.LoadString(m_pColumnInfo[iItem].m_ulStringId);
i = m_lboxDisplayed.GetCount();
m_lboxDisplayed.InsertString(i, sItem);
m_lboxDisplayed.SetItemData(i, (DWORD)iItem);
m_lboxDisplayed.SetCurSel(i);
}
//----------------------------------------------------------------------------
// Function:: ColumnDlg::MoveItem
//----------------------------------------------------------------------------
VOID
ColumnDlg::MoveItem(
INT dir
)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
INT i;
BOOL bEnabled;
CString sItem;
DWORD_PTR iItem;
//
// Get the selected item
//
i = m_lboxDisplayed.GetCurSel();
if (i == -1 || (i + dir) < 0 || (i + dir) >= m_lboxDisplayed.GetCount())
return;
iItem = m_lboxDisplayed.GetItemData(i);
//
// Remove the item from its current position
//
m_lboxDisplayed.DeleteString(i);
//
// Insert the item at its new position
//
i += dir;
sItem.LoadString(m_pColumnInfo[iItem].m_ulStringId);
m_lboxDisplayed.InsertString(i, sItem);
m_lboxDisplayed.SetItemData(i, (DWORD)iItem);
m_lboxDisplayed.SetCurSel(i);
}
BOOL ColumnDlg::AddColumnsToList()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ULONG i, j;
int iPos, iItem;
CString sItem;
Assert(m_pColumnData);
m_lboxDisplayed.ResetContent();
m_lboxHidden.ResetContent();
int cDisplayItems = 0;
int HiddenItems = 0;
for (i=0; i<m_cColumnInfo; i++)
{
// look for the column at position (i+1)
for (j=0; j<m_cColumnInfo; j++)
{
iPos = m_pColumnData[j].m_nPosition;
iPos = abs(iPos);
if ((ULONG)iPos == (i+1))
break;
}
Assert( j < m_cColumnInfo );
sItem.LoadString(m_pColumnInfo[j].m_ulStringId);
if (m_pColumnData[j].m_nPosition > 0)
{
iItem = m_lboxDisplayed.InsertString(cDisplayItems++, sItem);
if (iItem == -1) { OnCancel(); return FALSE; }
m_lboxDisplayed.SetItemData(iItem, j);
}
else
{
iItem = m_lboxHidden.InsertString(HiddenItems++, sItem);
if (iItem == -1) { OnCancel(); return FALSE; }
m_lboxHidden.SetItemData(iItem, j);
}
}
return TRUE;
}