288 lines
7.6 KiB
C++
288 lines
7.6 KiB
C++
|
//
|
||
|
// mvEdit.cpp : implementation file for multi-valued string edit dialog
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "mvedit.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CMultiValuedStringEdit dialog
|
||
|
|
||
|
/*CMultiValuedStringEdit::CMultiValuedStringEdit(CWnd* pParent)
|
||
|
: CDialog(CMultiValuedStringEdit::IDD, pParent)
|
||
|
{
|
||
|
m_nDlgTitle = 0;
|
||
|
m_nText = 0;
|
||
|
}
|
||
|
*/
|
||
|
CMultiValuedStringEdit::CMultiValuedStringEdit(CWnd* pParent, int nDlgTitle, int nText, UINT uiStringLengthLimit)
|
||
|
: CDialog(CMultiValuedStringEdit::IDD, pParent)
|
||
|
{
|
||
|
m_nDlgTitle = nDlgTitle;
|
||
|
m_nText = nText;
|
||
|
m_uiStringLengthLimit = ((0 == uiStringLengthLimit) ? MAX_PATH : uiStringLengthLimit);
|
||
|
}
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CMultiValuedStringEdit, CDialog)
|
||
|
//{{AFX_MSG_MAP(CMultiValuedStringEdit)
|
||
|
ON_BN_CLICKED(IDC_MVSTRINGEDIT_ADD, OnAdd)
|
||
|
ON_BN_CLICKED(IDC_MVSTRINGEDIT_REMOVE, OnRemove)
|
||
|
ON_EN_CHANGE(IDC_MVSTRINGEDIT_STRING, OnString)
|
||
|
ON_NOTIFY(LVN_ITEMCHANGED, IDC_MVSTRINGEDIT_LIST, OnList)
|
||
|
ON_MESSAGE(WM_HELP, OnHelp)
|
||
|
ON_MESSAGE(WM_CONTEXTMENU, OnContextHelp)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
BOOL CMultiValuedStringEdit::OnInitDialog()
|
||
|
{
|
||
|
CDialog::OnInitDialog();
|
||
|
|
||
|
if (m_nDlgTitle)
|
||
|
{
|
||
|
CString strDlgTitle;
|
||
|
strDlgTitle.LoadString(m_nDlgTitle);
|
||
|
SetWindowText(strDlgTitle);
|
||
|
}
|
||
|
|
||
|
if (m_nText)
|
||
|
{
|
||
|
CString strText;
|
||
|
strText.LoadString(m_nText);
|
||
|
SetDlgItemText(IDC_MVSTRINGEDIT_TEXT, strText);
|
||
|
}
|
||
|
|
||
|
SendDlgItemMessage(IDC_MVSTRINGEDIT_STRING, EM_LIMITTEXT, m_uiStringLengthLimit, 0);
|
||
|
|
||
|
HWND hwnd = GetDlgItem(IDC_MVSTRINGEDIT_LIST)->GetSafeHwnd();
|
||
|
RECT rect = {0};
|
||
|
::GetWindowRect(hwnd, &rect);
|
||
|
int nControlWidth = rect.right - rect.left;
|
||
|
int nVScrollbarWidth = GetSystemMetrics(SM_CXVSCROLL);
|
||
|
int nBorderWidth = GetSystemMetrics(SM_CXBORDER);
|
||
|
int nControlNetWidth = nControlWidth - 4 * nBorderWidth;
|
||
|
|
||
|
LVCOLUMN lvColumn = {0};
|
||
|
lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_WIDTH;
|
||
|
lvColumn.fmt = LVCFMT_LEFT;
|
||
|
lvColumn.iSubItem = 0;
|
||
|
lvColumn.cx = nControlNetWidth;
|
||
|
ListView_InsertColumn(hwnd, 0, &lvColumn);
|
||
|
|
||
|
GetDlgItem(IDC_MVSTRINGEDIT_ADD)->EnableWindow(FALSE);
|
||
|
GetDlgItem(IDC_MVSTRINGEDIT_REMOVE)->EnableWindow(FALSE);
|
||
|
|
||
|
if (m_strValues.IsEmpty())
|
||
|
return TRUE;
|
||
|
|
||
|
CString strToken;
|
||
|
int nIndex = 0;
|
||
|
mystrtok(m_strValues, &nIndex, m_strSeparators, strToken);
|
||
|
while (!strToken.IsEmpty())
|
||
|
{
|
||
|
strToken.TrimLeft();
|
||
|
strToken.TrimRight();
|
||
|
strToken.MakeLower();
|
||
|
|
||
|
LVITEM lvItem = {0};
|
||
|
lvItem.mask = LVIF_TEXT;
|
||
|
lvItem.pszText = (LPTSTR)(LPCTSTR)strToken;
|
||
|
ListView_InsertItem(hwnd, &lvItem);
|
||
|
|
||
|
mystrtok(m_strValues, &nIndex, m_strSeparators, strToken);
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CMultiValuedStringEdit::OnAdd()
|
||
|
{
|
||
|
CString str;
|
||
|
GetDlgItemText(IDC_MVSTRINGEDIT_STRING, str);
|
||
|
str.TrimLeft();
|
||
|
str.TrimRight();
|
||
|
|
||
|
if (!str.IsEmpty())
|
||
|
{
|
||
|
str.MakeLower();
|
||
|
|
||
|
if (!_tcschr(str, *m_strSeparators))
|
||
|
{
|
||
|
LVFINDINFO lvInfo = {0};
|
||
|
lvInfo.flags = LVFI_STRING;
|
||
|
lvInfo.psz = str;
|
||
|
|
||
|
HWND hwnd = GetDlgItem(IDC_MVSTRINGEDIT_LIST)->GetSafeHwnd();
|
||
|
if (-1 == ListView_FindItem(hwnd, -1, &lvInfo))
|
||
|
{
|
||
|
LVITEM lvItem = {0};
|
||
|
lvItem.mask = LVIF_TEXT;
|
||
|
lvItem.pszText = (LPTSTR)(LPCTSTR)str;
|
||
|
ListView_InsertItem(hwnd, &lvItem);
|
||
|
}
|
||
|
SetDlgItemText(IDC_MVSTRINGEDIT_STRING, _T(""));
|
||
|
} else
|
||
|
{
|
||
|
DoErrMsgBox(m_hWnd, MB_OK, 0, IDS_MVSTRINGEDIT_STRING_INVALID, m_strSeparators);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GetDlgItem(IDC_MVSTRINGEDIT_STRING)->SetFocus();
|
||
|
|
||
|
}
|
||
|
|
||
|
void CMultiValuedStringEdit::OnRemove()
|
||
|
{
|
||
|
HWND hwnd = GetDlgItem(IDC_MVSTRINGEDIT_LIST)->GetSafeHwnd();
|
||
|
int nIndex = -1;
|
||
|
while (-1 != (nIndex = ListView_GetNextItem(hwnd, -1, LVNI_SELECTED)))
|
||
|
ListView_DeleteItem(hwnd, nIndex);
|
||
|
}
|
||
|
|
||
|
void CMultiValuedStringEdit::OnString()
|
||
|
{
|
||
|
int nLen = GetDlgItem(IDC_MVSTRINGEDIT_STRING)->GetWindowTextLength();
|
||
|
GetDlgItem(IDC_MVSTRINGEDIT_ADD)->EnableWindow(0 < nLen);
|
||
|
}
|
||
|
|
||
|
void CMultiValuedStringEdit::OnList(NMHDR* /*pNMHDR*/, LRESULT* pResult)
|
||
|
{
|
||
|
HWND hwnd = GetDlgItem(IDC_MVSTRINGEDIT_LIST)->GetSafeHwnd();
|
||
|
int nCount = ListView_GetSelectedCount(hwnd);
|
||
|
GetDlgItem(IDC_MVSTRINGEDIT_REMOVE)->EnableWindow(nCount >= 1);
|
||
|
|
||
|
*pResult = 0;
|
||
|
}
|
||
|
|
||
|
BOOL CMultiValuedStringEdit::OnHelp(WPARAM /*wParam*/, LPARAM lParam)
|
||
|
{
|
||
|
return DoHelp(lParam, HELP_DIALOG_TOPIC(IDD_MVSTRINGEDIT));
|
||
|
}
|
||
|
|
||
|
BOOL CMultiValuedStringEdit::OnContextHelp(WPARAM wParam, LPARAM /*lParam*/)
|
||
|
{
|
||
|
return DoContextHelp(wParam, HELP_DIALOG_TOPIC(IDD_MVSTRINGEDIT));
|
||
|
}
|
||
|
|
||
|
void CMultiValuedStringEdit::OnOK()
|
||
|
{
|
||
|
m_strValues.Empty();
|
||
|
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
HWND hwnd = GetDlgItem(IDC_MVSTRINGEDIT_LIST)->GetSafeHwnd();
|
||
|
if (0 < ListView_GetItemCount(hwnd))
|
||
|
{
|
||
|
PTSTR pszText = (PTSTR)calloc(m_uiStringLengthLimit+1, sizeof(TCHAR));
|
||
|
if (pszText)
|
||
|
{
|
||
|
int nIndex = -1;
|
||
|
while (-1 != (nIndex = ListView_GetNextItem(hwnd, nIndex, LVNI_ALL)))
|
||
|
{
|
||
|
ListView_GetItemText(hwnd, nIndex, 0, pszText, m_uiStringLengthLimit+1);
|
||
|
|
||
|
if (m_strValues.IsEmpty())
|
||
|
{
|
||
|
m_strValues = pszText;
|
||
|
if (!m_strValues) { hr = E_OUTOFMEMORY; break; }
|
||
|
} else
|
||
|
{
|
||
|
m_strValues += m_strSeparators;
|
||
|
if (!m_strValues) { hr = E_OUTOFMEMORY; break; }
|
||
|
m_strValues += pszText;
|
||
|
if (!m_strValues) { hr = E_OUTOFMEMORY; break; }
|
||
|
}
|
||
|
}
|
||
|
free(pszText);
|
||
|
} else
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
DoErrMsgBox(m_hWnd, MB_OK, hr);
|
||
|
else
|
||
|
EndDialog(IDOK);
|
||
|
}
|
||
|
|
||
|
HRESULT CMultiValuedStringEdit::put_Strings(
|
||
|
IN LPCTSTR i_pszValues,
|
||
|
IN LPCTSTR i_pszSeparators
|
||
|
)
|
||
|
{
|
||
|
if (!i_pszSeparators || 1 != lstrlen(i_pszSeparators))
|
||
|
return E_INVALIDARG;
|
||
|
|
||
|
m_strValues = i_pszValues;
|
||
|
m_strSeparators = i_pszSeparators;
|
||
|
|
||
|
m_strValues.MakeLower();
|
||
|
m_strSeparators.MakeLower();
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CMultiValuedStringEdit::get_Strings
|
||
|
(
|
||
|
CString& o_strValues
|
||
|
)
|
||
|
{
|
||
|
o_strValues = m_strValues;
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Helper routine to invoke the dialog.
|
||
|
//
|
||
|
// S_OK: io_str contains the new string
|
||
|
// S_FALSE: dlg cancelled, or string unchanged
|
||
|
// others: error occurred and reported
|
||
|
//
|
||
|
HRESULT InvokeMultiValuedStringEditDlg(
|
||
|
IN CWnd* i_pParent,
|
||
|
IN CString& io_str,
|
||
|
IN LPCTSTR i_pszSeparators,
|
||
|
IN int i_nDlgTitle,
|
||
|
IN int i_nText,
|
||
|
IN UINT i_uiStringLengthLimit
|
||
|
)
|
||
|
{
|
||
|
|
||
|
CMultiValuedStringEdit editDlg(i_pParent, i_nDlgTitle, i_nText, i_uiStringLengthLimit);
|
||
|
|
||
|
HRESULT hr = editDlg.put_Strings(io_str, i_pszSeparators);
|
||
|
|
||
|
CThemeContextActivator activator;
|
||
|
if (SUCCEEDED(hr) && IDOK == editDlg.DoModal())
|
||
|
{
|
||
|
CString str;
|
||
|
hr = editDlg.get_Strings(str);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
if (0 != io_str.CompareNoCase(str))
|
||
|
{
|
||
|
io_str = str;
|
||
|
hr = S_OK;
|
||
|
} else
|
||
|
{
|
||
|
hr = S_FALSE; // string unchanged
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
DoErrMsgBox(i_pParent->GetSafeHwnd(), MB_OK | MB_ICONSTOP, hr, IDS_MVSTRINGEDIT_ERROR);
|
||
|
|
||
|
return hr;
|
||
|
}
|