2025-11-28 00:35:46 +09:00

745 lines
22 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved
#include "stdafx.h"
#include "propertyview.h"
#include <assert.h>
#include "commctrl.h"
#include "wmcontainer.h"
/*********************************\
* CPropertyController *
\ *********************************/
CPropertyController::CPropertyController(CPropertyEditWindow* pView)
: m_cRef(0)
, m_pView(pView)
{
}
CPropertyController::~CPropertyController()
{
delete m_pView;
for(size_t i = 0; i < m_arrPropertyInfo.GetCount(); ++i)
{
m_arrPropertyInfo.GetAt(i)->Release();
}
}
HRESULT CPropertyController::ClearProperties()
{
for(size_t i = 0; i < m_arrPropertyInfo.GetCount(); ++i)
{
m_arrPropertyInfo.GetAt(i)->Release();
}
m_arrPropertyInfo.RemoveAll();
m_pView->ClearProperties();
return S_OK;
}
HRESULT CPropertyController::AddPropertyInfo(ITedPropertyInfo* pPropertyInfo)
{
HRESULT hr = S_OK;
if(NULL == pPropertyInfo)
{
return E_POINTER;
}
m_pView->ShowProperties(pPropertyInfo);
return hr;
}
CPropertyEditWindow* CPropertyController::GetWindow() const
{
return m_pView;
}
HRESULT CPropertyController::QueryInterface(REFIID riid, void** ppInterface)
{
if(NULL == ppInterface)
{
return E_POINTER;
}
if(riid == IID_IUnknown || riid == IID_ITedPropertyController)
{
*ppInterface = this;
AddRef();
return S_OK;
}
*ppInterface = NULL;
return E_NOINTERFACE;
}
ULONG CPropertyController::AddRef()
{
LONG cRef = InterlockedIncrement(&m_cRef);
return cRef;
}
ULONG CPropertyController::Release()
{
LONG cRef = InterlockedDecrement(&m_cRef);
if(cRef == 0)
{
delete this;
}
return cRef;
}
/****************************\
* TEDUTIL functions *
\****************************/
DWORD TEDGetAttributeListLength();
LPCWSTR TEDGetAttributeName(DWORD dwIndex);
GUID TEDGetAttributeGUID(DWORD dwIndex);
VARTYPE TEDGetAttributeType(DWORD dwIndex);
TED_ATTRIBUTE_CATEGORY TEDGetAttributeCategory(DWORD dwIndex);
/***************************\
* CPropertyEditWindow *
\***************************/
const int CPropertyEditWindow::ms_LabelWidth = 250;
const int CPropertyEditWindow::ms_LabelHeight = 15;
const int CPropertyEditWindow::ms_EditWidth = 250;
const int CPropertyEditWindow::ms_ButtonWidth = 50;
const int CPropertyEditWindow::ms_ButtonHeight = 20;
const int CPropertyEditWindow::ms_MarginWidth = 5;
CPropertyEditWindow::CPropertyEditWindow()
: m_hLabelFont(NULL)
{
}
CPropertyEditWindow::~CPropertyEditWindow()
{
for(size_t i = 0; i < m_arrPropertyInfo.GetCount(); i++)
{
PropertyInfoDisplay* pDisplay = m_arrPropertyInfoDisplay.GetAt(i);
for(size_t j = 0; j < pDisplay->m_arrLabels.GetCount(); j++)
{
delete pDisplay->m_arrLabels.GetAt(j);
delete pDisplay->m_arrEdits.GetAt(j);
delete pDisplay->m_arrTooltips.GetAt(j);
}
delete pDisplay;
delete m_arrTitles.GetAt(i);
m_arrPropertyInfo.GetAt(i)->Release();
}
if(m_hLabelFont)
{
DeleteObject(m_hLabelFont);
}
}
void CPropertyEditWindow::ShowProperties(ITedPropertyInfo* pPropertyInfo)
{
// Don't redraw window every time we add a component
LockWindowUpdate();
m_arrPropertyInfo.Add(pPropertyInfo);
pPropertyInfo->AddRef();
PropertyInfoDisplay* pDisplay = new PropertyInfoDisplay();
m_arrPropertyInfoDisplay.Add(pDisplay);
RECT labelRect = m_lastRect;
// Add a margin in between sets of properties
if(m_arrPropertyInfo.GetCount() > 1)
{
labelRect.top += ms_LabelHeight;
labelRect.bottom += ms_LabelHeight;
}
CreateTitle(DWORD(m_arrPropertyInfo.GetCount() - 1), labelRect);
DWORD dwCount = 0;
pPropertyInfo->GetPropertyCount(&dwCount);
for(DWORD i = 0; i < dwCount; i++)
{
CreatePropertyInterfaceForIndex(DWORD(m_arrPropertyInfo.GetCount() - 1), i, labelRect);
}
m_AddButton.ShowWindow(SW_SHOW);
m_OKButton.ShowWindow(SW_SHOW);
LockWindowUpdate(FALSE);
}
void CPropertyEditWindow::ClearProperties()
{
if(m_arrPropertyInfo.GetCount() > 0)
{
// Don't redraw window every time we remove a component
LockWindowUpdate();
}
for(size_t i = 0; i < m_arrPropertyInfo.GetCount(); i++)
{
PropertyInfoDisplay* pDisplay = m_arrPropertyInfoDisplay.GetAt(i);
for(size_t j = 0; j < pDisplay->m_arrLabels.GetCount(); j++)
{
pDisplay->m_arrLabels.GetAt(j)->DestroyWindow();
delete pDisplay->m_arrLabels.GetAt(j);
pDisplay->m_arrEdits.GetAt(j)->DestroyWindow();
delete pDisplay->m_arrEdits.GetAt(j);
pDisplay->m_arrTooltips.GetAt(j)->DestroyWindow();
delete pDisplay->m_arrTooltips.GetAt(j);
}
delete pDisplay;
m_arrTitles.GetAt(i)->DestroyWindow();
delete m_arrTitles.GetAt(i);
m_arrPropertyInfo.GetAt(i)->Release();
}
m_arrPropertyInfo.RemoveAll();
m_arrPropertyInfoDisplay.RemoveAll();
m_arrTitles.RemoveAll();
RECT clientRect;
GetClientRect(&clientRect);
DWORD dwViewWidth = clientRect.right - clientRect.left - 5;
m_lastRect.top = 5;
m_lastRect.left = 5;
m_lastRect.right = m_lastRect.left + dwViewWidth / 2;
m_lastRect.bottom = m_lastRect.top + ms_LabelHeight;
m_AddButton.ShowWindow(SW_HIDE);
m_OKButton.ShowWindow(SW_HIDE);
if(m_arrPropertyInfo.GetCount() > 0)
{
LockWindowUpdate(FALSE);
}
}
void CPropertyEditWindow::OnFinalMessage(HWND hwnd)
{
}
LRESULT CPropertyEditWindow::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CAtlString strFontSize = LoadAtlString(IDS_FONT_SIZE_14);
CAtlString strFontFace = LoadAtlString(IDS_FONT_FACE_ARIAL);
LOGFONT lfLabelFont;
lfLabelFont.lfHeight = _wtol(strFontSize);
lfLabelFont.lfWidth = 0;
lfLabelFont.lfEscapement = 0;
lfLabelFont.lfOrientation = 0;
lfLabelFont.lfWeight = FW_DONTCARE;
lfLabelFont.lfItalic = FALSE;
lfLabelFont.lfUnderline = FALSE;
lfLabelFont.lfStrikeOut = FALSE;
lfLabelFont.lfCharSet = DEFAULT_CHARSET;
lfLabelFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
lfLabelFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lfLabelFont.lfQuality = DEFAULT_QUALITY;
lfLabelFont.lfPitchAndFamily = FF_DONTCARE | DEFAULT_PITCH;
wcscpy_s(lfLabelFont.lfFaceName, 32, strFontFace);
m_hLabelFont = CreateFontIndirect(&lfLabelFont);
RECT buttonRect;
GetClientRect(&buttonRect);
buttonRect.right -= ms_ButtonWidth + ms_MarginWidth + ms_MarginWidth;
buttonRect.bottom -= ms_MarginWidth;
buttonRect.top = buttonRect.bottom - ms_ButtonHeight;
buttonRect.left = buttonRect.right - ms_ButtonWidth;
m_AddButton.Create(m_hWnd, &buttonRect, LoadAtlString(IDS_ADD), WS_CHILD | BS_DEFPUSHBUTTON, 0, IDC_ADDBUTTON);
buttonRect.right += ms_ButtonWidth + ms_MarginWidth;
buttonRect.left += ms_ButtonWidth + ms_MarginWidth;
m_OKButton.Create(m_hWnd, &buttonRect, LoadAtlString(IDS_SAVE), WS_CHILD | BS_DEFPUSHBUTTON, 0, IDC_OKBUTTON);
return 0;
}
LRESULT CPropertyEditWindow::OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HDC hdc = (HDC) wParam;
RECT rect;
GetClientRect(&rect);
HBRUSH brush = CreateSolidBrush(GetSysColor(COLOR_3DFACE));
HBRUSH oldBrush = (HBRUSH) SelectObject(hdc, brush);
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
SelectObject(hdc, oldBrush);
DeleteObject(oldBrush);
return 1;
}
LRESULT CPropertyEditWindow::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
ResizeChildren();
return 0;
}
LRESULT CPropertyEditWindow::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
bool fAllSucceeded = true;
for(size_t i = 0; i < m_arrPropertyInfo.GetCount(); i++)
{
ITedPropertyInfo* pPropertyInfo = m_arrPropertyInfo.GetAt(i);
PropertyInfoDisplay* pDisplay = m_arrPropertyInfoDisplay.GetAt(i);
for(size_t j = 0; j < pDisplay->m_arrLabels.GetCount(); j++)
{
VARTYPE vt = pDisplay->m_arrVartypes.GetAt(j);
if(vt == VT_EMPTY || vt == VT_UNKNOWN || vt == (VT_VECTOR | VT_UI1)) continue;
LPWSTR strName, strValue;
// Get label text (property name)
int nameLen = pDisplay->m_arrLabels.GetAt(j)->GetWindowTextLength();
strName = new WCHAR[nameLen + 1];
if(NULL == strName) continue;
pDisplay->m_arrLabels.GetAt(j)->GetWindowText(strName, nameLen + 1);
// Get edit text (property value)
int valueLen = pDisplay->m_arrEdits.GetAt(j)->GetWindowTextLength();
strValue = new WCHAR[valueLen + 1];
if(NULL == strValue) { delete[] strName; continue; }
pDisplay->m_arrEdits.GetAt(j)->GetWindowText(strValue, valueLen + 1);
HRESULT hr = pPropertyInfo->SetProperty((DWORD) j, strName, vt, strValue);
if( FAILED(hr) && fAllSucceeded)
{
CAtlStringW strError;
strError.FormatMessage(IDS_E_SAVE_PROP, hr);
MessageBox(strError, LoadAtlString(IDS_ERROR), MB_OK);
fAllSucceeded = false;
}
delete[] strName;
delete[] strValue;
}
}
return 0;
}
LRESULT CPropertyEditWindow::OnAdd(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
CPropertyAddDialog dialog;
// Add the property categories
for(size_t i = 0; i < m_arrPropertyInfo.GetCount(); i++)
{
if(m_arrPropertyInfo.GetAt(i)->IsWriteable() == S_OK)
{
LPWSTR szPropertyCategory;
TED_ATTRIBUTE_CATEGORY Category;
m_arrPropertyInfo.GetAt(i)->GetPropertyInfoName(&szPropertyCategory, &Category);
dialog.AddPropertyCategory(szPropertyCategory, Category, (DWORD) i);
CoTaskMemFree(szPropertyCategory);
}
}
// Fill dialog properties
if(dialog.DoModal() == IDOK)
{
DWORD dwIndex = dialog.GetChosenCategory();
CAtlStringW strName = dialog.GetChosenProperty();
CAtlStringW strValue = dialog.GetValue();
ITedPropertyInfo* pPropertyInfo = m_arrPropertyInfo.GetAt(dwIndex);
for(DWORD i = 0; i < TEDGetAttributeListLength(); i++)
{
if(TEDGetAttributeName(i) == strName)
{
DWORD dwPropertyCount;
pPropertyInfo->GetPropertyCount(&dwPropertyCount);
pPropertyInfo->SetProperty(dwPropertyCount, strName.GetBuffer(), TEDGetAttributeType(i), strValue.GetBuffer());
RECT clientRect;
GetClientRect(&clientRect);
DWORD dwViewWidth = clientRect.right - clientRect.left - 5;
RECT rectNextLabel;
rectNextLabel.top = 5 + (ms_LabelHeight * dwPropertyCount);
rectNextLabel.left = 5;
rectNextLabel.right = rectNextLabel.left + dwViewWidth / 2;
rectNextLabel.bottom = rectNextLabel.top + ms_LabelHeight;
CreatePropertyInterfaceForIndex(dwIndex, dwPropertyCount, rectNextLabel);
ResizeChildren();
break;
}
}
}
return 0;
}
HRESULT CPropertyEditWindow::CreateTitle(DWORD dwPropertyInfoIndex, RECT& labelRect)
{
HRESULT hr = S_OK;
LPWSTR szName = NULL;
TED_ATTRIBUTE_CATEGORY Category;
IFC( m_arrPropertyInfo[dwPropertyInfoIndex]->GetPropertyInfoName(&szName, &Category) );
CStatic* pStatic = new CStatic();
CHECK_ALLOC( pStatic );
pStatic->Create(m_hWnd, &labelRect, szName, WS_CHILD | WS_VISIBLE);
pStatic->SetFont(m_hLabelFont);
m_arrTitles.Add(pStatic);
labelRect.top += ms_LabelHeight;
labelRect.bottom += ms_LabelHeight;
Cleanup:
CoTaskMemFree(szName);
return hr;
}
HRESULT CPropertyEditWindow::CreatePropertyInterfaceForIndex(DWORD dwPropertyInfoIndex, DWORD dwIndex, RECT& labelRect)
{
HRESULT hr = S_OK;
LPWSTR strName = NULL;
LPWSTR strValue = NULL;
VARTYPE vt;
ITedPropertyInfo* pPropertyInfo = m_arrPropertyInfo[dwPropertyInfoIndex];
PropertyInfoDisplay* pDisplay = m_arrPropertyInfoDisplay[dwPropertyInfoIndex];
RECT clientRect;
GetClientRect(&clientRect);
DWORD dwViewWidth = clientRect.right - clientRect.left - ms_MarginWidth;
IFC( pPropertyInfo->GetProperty(dwIndex, &strName, &strValue) );
IFC( pPropertyInfo->GetPropertyType(dwIndex, &vt) );
IFC( CreatePropertyLabel(dwPropertyInfoIndex, strName, labelRect) );
labelRect.left = labelRect.right + ms_MarginWidth;
labelRect.right = dwViewWidth - ms_MarginWidth;
bool fReadOnly = false;
if(vt == VT_EMPTY || vt == VT_UNKNOWN || vt == (VT_VECTOR | VT_UI1))
{
fReadOnly = true;
}
IFC( CreatePropertyEdit(dwPropertyInfoIndex, strValue, labelRect, fReadOnly) );
RECT rectEditClient;
CEdit* pEditWnd = pDisplay->m_arrEdits.GetAt(pDisplay->m_arrEdits.GetCount() - 1);
pEditWnd->GetClientRect(&rectEditClient);
IFC( CreatePropertyTooltip(dwPropertyInfoIndex, pEditWnd->m_hWnd, GetTextForVartype(vt), rectEditClient) );
pEditWnd->SetToolTipControl(pDisplay->m_arrTooltips.GetAt(pDisplay->m_arrTooltips.GetCount() -1));
m_arrPropertyInfoDisplay[dwPropertyInfoIndex]->m_arrVartypes.Add(vt);
labelRect.left = ms_MarginWidth;
labelRect.right = labelRect.left + dwViewWidth / 2;
labelRect.top += ms_LabelHeight;
labelRect.bottom += ms_LabelHeight;
m_lastRect = labelRect;
Cleanup:
if(strName) CoTaskMemFree(strName);
if(strValue) CoTaskMemFree(strValue);
// If there was a failure, roll back changes to the property displays
if(FAILED(hr))
{
PropertyInfoDisplay* pDisplay = m_arrPropertyInfoDisplay[dwPropertyInfoIndex];
if(pDisplay->m_arrVartypes.GetCount() < pDisplay->m_arrEdits.GetCount())
{
DWORD dwIndex = DWORD( pDisplay->m_arrEdits.GetCount() - 1 );
pDisplay->m_arrEdits[dwIndex]->DestroyWindow();
delete pDisplay->m_arrEdits[dwIndex];
pDisplay->m_arrEdits.RemoveAt(pDisplay->m_arrEdits.GetCount() - 1);
}
if(pDisplay->m_arrVartypes.GetCount() < pDisplay->m_arrTooltips.GetCount())
{
pDisplay->m_arrTooltips.RemoveAt(pDisplay->m_arrTooltips.GetCount() - 1);
}
if(pDisplay->m_arrVartypes.GetCount() < pDisplay->m_arrLabels.GetCount())
{
DWORD dwIndex = DWORD( pDisplay->m_arrLabels.GetCount() - 1 );
pDisplay->m_arrLabels[dwIndex]->DestroyWindow();
delete pDisplay->m_arrLabels[dwIndex];
pDisplay->m_arrLabels.RemoveAt(pDisplay->m_arrLabels.GetCount() - 1);
}
labelRect = m_lastRect;
}
return hr;
}
HRESULT CPropertyEditWindow::CreatePropertyLabel(DWORD dwPropertyInfoIndex, CAtlStringW strLabelText, RECT& rectLabel)
{
HRESULT hr = S_OK;
CStatic* pStatic = new CStatic();
CHECK_ALLOC( pStatic );
pStatic->Create(m_hWnd, &rectLabel, strLabelText, WS_CHILD | WS_VISIBLE);
pStatic->SetFont(m_hLabelFont);
m_arrPropertyInfoDisplay[dwPropertyInfoIndex]->m_arrLabels.Add(pStatic);
Cleanup:
return hr;
}
HRESULT CPropertyEditWindow::CreatePropertyEdit(DWORD dwPropertyInfoIndex, CAtlStringW strInitialText, RECT& rectLabel, bool fReadOnly)
{
HRESULT hr = S_OK;
CEdit* pEdit = new CEdit();
CHECK_ALLOC( pEdit );
DWORD dwStyle = WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL;
if(fReadOnly)
{
dwStyle |= ES_READONLY;
}
pEdit->Create(m_hWnd, &rectLabel, strInitialText, dwStyle);
pEdit->SetFont(m_hLabelFont);
m_arrPropertyInfoDisplay[dwPropertyInfoIndex]->m_arrEdits.Add(pEdit);
Cleanup:
return hr;
}
HRESULT CPropertyEditWindow::CreatePropertyTooltip(DWORD dwPropertyInfoIndex, HWND hWndParent, CAtlStringW strLabelText, RECT& rectTooltip)
{
HRESULT hr = S_OK;
CToolTipControl* pToolTip = new CToolTipControl();
CHECK_ALLOC( pToolTip );
if(NULL == pToolTip->Create(hWndParent, rectTooltip, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, WS_EX_TOPMOST))
{
assert(!L"Failed to create tooltip window");
IFC( E_FAIL );
}
pToolTip->SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
pToolTip->SendMessage(TTM_ACTIVATE, TRUE, 0);
pToolTip->AddTool(hWndParent, strLabelText, rectTooltip, 0);
m_arrPropertyInfoDisplay[dwPropertyInfoIndex]->m_arrTooltips.Add(pToolTip);
Cleanup:
return hr;
}
void CPropertyEditWindow::ResizeChildren()
{
DWORD cItems = 0;
RECT clientRect;
GetClientRect(&clientRect);
DWORD dwViewWidth = clientRect.right - clientRect.left - 5;
if(m_arrPropertyInfoDisplay.GetCount() > 0)
{
LockWindowUpdate();
}
for(size_t i = 0; i < m_arrPropertyInfoDisplay.GetCount(); i++)
{
// Add an item for the margin
if(i != 0) cItems++;
// Manage the title's position first
m_arrTitles[i]->SetWindowPos(HWND_TOP, ms_MarginWidth, ms_MarginWidth + (cItems * ms_LabelHeight), dwViewWidth, ms_LabelHeight, 0);
cItems++;
PropertyInfoDisplay* pDisplay = m_arrPropertyInfoDisplay.GetAt(i);
for(size_t j = 0; j < pDisplay->m_arrLabels.GetCount(); j++)
{
pDisplay->m_arrLabels.GetAt(j)->SetWindowPos(HWND_TOP, ms_MarginWidth,
ms_MarginWidth + (cItems * ms_LabelHeight), dwViewWidth / 2, ms_LabelHeight, 0);
pDisplay->m_arrEdits.GetAt(j)->SetWindowPos(HWND_TOP, dwViewWidth / 2 + ms_MarginWidth,
ms_MarginWidth + (cItems * ms_LabelHeight), dwViewWidth / 2 - ms_MarginWidth, ms_LabelHeight, 0);
cItems++;
}
}
RECT buttonRect;
GetClientRect(&buttonRect);
buttonRect.right -= ms_ButtonWidth + ms_MarginWidth + ms_MarginWidth;
buttonRect.bottom -= ms_MarginWidth;
buttonRect.top = buttonRect.bottom - ms_ButtonHeight;
buttonRect.left = buttonRect.right - ms_ButtonWidth;
m_AddButton.SetWindowPos(HWND_TOP, buttonRect.left, buttonRect.top, buttonRect.right - buttonRect.left, buttonRect.bottom - buttonRect.top, 0);
buttonRect.right += ms_ButtonWidth + ms_MarginWidth;
buttonRect.left += ms_ButtonWidth + ms_MarginWidth;
m_OKButton.SetWindowPos(HWND_TOP, buttonRect.left, buttonRect.top, buttonRect.right - buttonRect.left, buttonRect.bottom - buttonRect.top, 0);
if(m_arrPropertyInfoDisplay.GetCount() > 0)
{
LockWindowUpdate(FALSE);
}
}
CAtlString CPropertyEditWindow::GetTextForVartype(VARTYPE vt)
{
UINT nID = IDS_NO_TYPE;
switch(vt)
{
case VT_UI4: nID = IDS_UINT32; break;
case VT_UI8: nID = IDS_UINT64; break;
case VT_R8: nID = IDS_DOUBLE; break;
case VT_CLSID: nID = IDS_GUID; break;
case VT_LPWSTR: nID = IDS_STRING; break;
case (VT_VECTOR | VT_UI1): nID = IDS_BYTE_ARRAY; break;
case VT_UNKNOWN: nID = IDS_IUNKNOWN; break;
}
return LoadAtlString(nID);
}
/*********************************\
* CPropertyAddDialog *
\ *********************************/
void CPropertyAddDialog::AddPropertyCategory(CAtlString strCategory, TED_ATTRIBUTE_CATEGORY Category, DWORD dwIndex)
{
m_arrCategories.Add(strCategory);
m_arrCategoryIDs.Add(Category);
m_arrCategoryIndex.Add(dwIndex);
}
LRESULT CPropertyAddDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
m_hPropertyCategoryCombo = GetDlgItem(IDC_PROPERTYCATEGORY);
m_hPropertyNameCombo = GetDlgItem(IDC_PROPERTYNAME);
m_hPropertyValueEdit = GetDlgItem(IDC_PROPERTYVALUE);
for(size_t i = 0; i < m_arrCategories.GetCount(); i++)
{
::SendMessage(m_hPropertyCategoryCombo, CB_ADDSTRING, 0, (LPARAM) m_arrCategories.GetAt(i).GetString());
}
::SendMessage(m_hPropertyCategoryCombo, CB_SETCURSEL, 0, 0);
TED_ATTRIBUTE_CATEGORY DesiredCategory = TED_ATTRIBUTE_CATEGORY_NONE;
if(m_arrCategoryIDs.GetCount() >= 1)
{
DesiredCategory = m_arrCategoryIDs.GetAt(0);
}
for(DWORD i = 0; i < TEDGetAttributeListLength(); i++)
{
if(TEDGetAttributeCategory(i) == DesiredCategory)
{
::SendMessage(m_hPropertyNameCombo, CB_ADDSTRING, 0, (LPARAM) TEDGetAttributeName(i) );
}
}
return 0;
}
LRESULT CPropertyAddDialog::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
HRESULT hr;
LPWSTR strCombo = NULL;
LPWSTR strEdit = NULL;
DWORD dwSelectionIndex = (DWORD) ::SendMessage(m_hPropertyCategoryCombo, CB_GETCURSEL, 0, 0);
if(dwSelectionIndex > m_arrCategoryIndex.GetCount())
{
dwSelectionIndex = 0;
}
m_dwChosenCategory = m_arrCategoryIndex.GetAt(dwSelectionIndex);
int comboLength = ::GetWindowTextLength(m_hPropertyNameCombo);
strCombo = new WCHAR[comboLength + 1];
CHECK_ALLOC( strCombo );
::GetWindowText(m_hPropertyNameCombo, strCombo, comboLength + 1);
m_strChosenProperty = CAtlStringW(strCombo);
int editLength = ::GetWindowTextLength(m_hPropertyValueEdit);
strEdit = new WCHAR[editLength + 1];
CHECK_ALLOC( strEdit );
::GetWindowText(m_hPropertyValueEdit, strEdit, editLength + 1);
m_strValue = CAtlStringW(strEdit);
Cleanup:
delete[] strCombo;
delete[] strEdit;
EndDialog(IDOK);
return 0;
}
LRESULT CPropertyAddDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
EndDialog(IDCANCEL);
return 0;
}
LRESULT CPropertyAddDialog::OnCategoryChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
DWORD dwSelectionIndex = (DWORD) ::SendMessage(m_hPropertyCategoryCombo, CB_GETCURSEL, 0, 0);
TED_ATTRIBUTE_CATEGORY DesiredCategory = m_arrCategoryIDs.GetAt(dwSelectionIndex);
::SendMessage(m_hPropertyNameCombo, CB_RESETCONTENT, 0, 0);
for(DWORD i = 0; i < TEDGetAttributeListLength(); i++)
{
if(TEDGetAttributeCategory(i) == DesiredCategory)
{
::SendMessage(m_hPropertyNameCombo, CB_ADDSTRING, 0, (LPARAM) TEDGetAttributeName(i) );
}
}
return 0;
}