233 lines
4.7 KiB
C++
233 lines
4.7 KiB
C++
// PropTreeItemCombo.cpp : implementation file
|
|
//
|
|
// Copyright (C) 1998-2001 Scott Ramsay
|
|
// sramsay@gonavi.com
|
|
// http://www.gonavi.com
|
|
//
|
|
// This material is provided "as is", with absolutely no warranty expressed
|
|
// or implied. Any use is at your own risk.
|
|
//
|
|
// Permission to use or copy this software for any purpose is hereby granted
|
|
// without fee, provided the above notices are retained on all copies.
|
|
// Permission to modify the code and to distribute modified code is granted,
|
|
// provided the above notices are retained, and a notice that the code was
|
|
// modified is included with the above copyright notice.
|
|
//
|
|
// If you use this code, drop me an email. I'd like to know if you find the code
|
|
// useful.
|
|
|
|
//#include "stdafx.h"
|
|
#include "../../../idlib/precompiled.h"
|
|
#pragma hdrstop
|
|
|
|
#include "PropTree.h"
|
|
#include "../../../sys/win32/rc/proptree_Resource.h"
|
|
|
|
#include "PropTreeItemCombo.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define DROPDOWN_HEIGHT 100
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPropTreeItemCombo
|
|
|
|
CPropTreeItemCombo::CPropTreeItemCombo() :
|
|
m_lComboData(0),
|
|
m_nDropHeight(DROPDOWN_HEIGHT)
|
|
{
|
|
}
|
|
|
|
CPropTreeItemCombo::~CPropTreeItemCombo()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CPropTreeItemCombo, CComboBox)
|
|
//{{AFX_MSG_MAP(CPropTreeItemCombo)
|
|
ON_CONTROL_REFLECT(CBN_SELCHANGE, OnSelchange)
|
|
ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnKillfocus)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPropTreeItemCombo message handlers
|
|
|
|
void CPropTreeItemCombo::DrawAttribute(CDC* pDC, const RECT& rc)
|
|
{
|
|
ASSERT(m_pProp!=NULL);
|
|
|
|
// verify the window has been created
|
|
if (!IsWindow(m_hWnd))
|
|
{
|
|
TRACE0("CPropTreeItemCombo::DrawAttribute() - The window has not been created\n");
|
|
return;
|
|
}
|
|
|
|
pDC->SelectObject(IsReadOnly() ? m_pProp->GetNormalFont() : m_pProp->GetBoldFont());
|
|
pDC->SetTextColor(RGB(0,0,0));
|
|
pDC->SetBkMode(TRANSPARENT);
|
|
|
|
CRect r = rc;
|
|
CString s;
|
|
LONG idx;
|
|
|
|
if ((idx = GetCurSel())!=CB_ERR)
|
|
GetLBText(idx, s);
|
|
else
|
|
s = _T("");
|
|
|
|
pDC->DrawText(s, r, DT_SINGLELINE|DT_VCENTER);
|
|
}
|
|
|
|
|
|
LPARAM CPropTreeItemCombo::GetItemValue()
|
|
{
|
|
return m_lComboData;
|
|
}
|
|
|
|
|
|
void CPropTreeItemCombo::SetItemValue(LPARAM lParam)
|
|
{
|
|
m_lComboData = lParam;
|
|
OnRefresh();
|
|
}
|
|
|
|
|
|
void CPropTreeItemCombo::OnMove()
|
|
{
|
|
if (IsWindow(m_hWnd) && IsWindowVisible())
|
|
SetWindowPos(NULL, m_rc.left, m_rc.top, m_rc.Width() + 1, m_rc.Height(), SWP_NOZORDER|SWP_SHOWWINDOW);
|
|
}
|
|
|
|
|
|
void CPropTreeItemCombo::OnRefresh()
|
|
{
|
|
LONG idx = FindCBData(m_lComboData);
|
|
|
|
if (idx!=CB_ERR)
|
|
SetCurSel(idx);
|
|
}
|
|
|
|
|
|
void CPropTreeItemCombo::OnCommit()
|
|
{
|
|
LONG idx;
|
|
|
|
// store combo box item data
|
|
if ((idx = GetCurSel())==CB_ERR)
|
|
m_lComboData = 0;
|
|
else
|
|
m_lComboData = (LPARAM)GetItemData(idx);
|
|
|
|
ShowWindow(SW_HIDE);
|
|
}
|
|
|
|
|
|
void CPropTreeItemCombo::OnActivate(int activateType, CPoint point)
|
|
{
|
|
// activate the combo box
|
|
SetWindowPos(NULL, m_rc.left, m_rc.top, m_rc.Width() + 1, m_rc.Height() + m_nDropHeight, SWP_NOZORDER|SWP_SHOWWINDOW);
|
|
SetFocus();
|
|
|
|
if (GetCount())
|
|
ShowDropDown(TRUE);
|
|
}
|
|
|
|
|
|
BOOL CPropTreeItemCombo::CreateComboBox(DWORD dwStyle)
|
|
{
|
|
ASSERT(m_pProp!=NULL);
|
|
|
|
if (IsWindow(m_hWnd))
|
|
DestroyWindow();
|
|
|
|
// force as not visible child window
|
|
dwStyle = (WS_CHILD|WS_VSCROLL|dwStyle) & ~WS_VISIBLE;
|
|
|
|
if (!Create(dwStyle, CRect(0,0,0,0), m_pProp->GetCtrlParent(), GetCtrlID()))
|
|
{
|
|
TRACE0("CPropTreeItemCombo::CreateComboBox() - failed to create combo box\n");
|
|
return FALSE;
|
|
}
|
|
|
|
SendMessage(WM_SETFONT, (WPARAM)m_pProp->GetNormalFont()->m_hObject);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL CPropTreeItemCombo::CreateComboBoxBool()
|
|
{
|
|
ASSERT(m_pProp!=NULL);
|
|
|
|
if (IsWindow(m_hWnd))
|
|
DestroyWindow();
|
|
|
|
// force as a non-visible child window
|
|
DWORD dwStyle = WS_CHILD|WS_VSCROLL|CBS_SORT|CBS_DROPDOWNLIST;
|
|
|
|
if (!Create(dwStyle, CRect(0,0,0,0), m_pProp->GetCtrlParent(), GetCtrlID()))
|
|
{
|
|
TRACE0("CPropTreeItemCombo::CreateComboBoxBool() - failed to create combo box\n");
|
|
return FALSE;
|
|
}
|
|
|
|
SendMessage(WM_SETFONT, (WPARAM)m_pProp->GetNormalFont()->m_hObject);
|
|
|
|
// file the combo box
|
|
LONG idx;
|
|
CString s;
|
|
|
|
s.LoadString(IDS_TRUE);
|
|
idx = AddString(s);
|
|
SetItemData(idx, TRUE);
|
|
|
|
s.LoadString(IDS_FALSE);
|
|
idx = AddString(s);
|
|
SetItemData(idx, FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
LONG CPropTreeItemCombo::FindCBData(LPARAM lParam)
|
|
{
|
|
LONG idx;
|
|
|
|
for (idx = 0; idx < GetCount(); idx++)
|
|
{
|
|
if (GetItemData(idx)==(DWORD)lParam)
|
|
return idx;
|
|
}
|
|
|
|
return CB_ERR;
|
|
}
|
|
|
|
|
|
void CPropTreeItemCombo::OnSelchange()
|
|
{
|
|
CommitChanges();
|
|
}
|
|
|
|
|
|
void CPropTreeItemCombo::OnKillfocus()
|
|
{
|
|
CommitChanges();
|
|
}
|
|
|
|
|
|
void CPropTreeItemCombo::SetDropDownHeight(LONG nDropHeight)
|
|
{
|
|
m_nDropHeight = nDropHeight;
|
|
}
|
|
|
|
|
|
LONG CPropTreeItemCombo::GetDropDownHeight()
|
|
{
|
|
return m_nDropHeight;
|
|
}
|