2011-11-22 21:28:15 +00:00
|
|
|
// PropTreeItemEdit.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.
|
2011-12-06 18:20:15 +00:00
|
|
|
//
|
|
|
|
// Permission to use or copy this software for any purpose is hereby granted
|
2011-11-22 21:28:15 +00:00
|
|
|
// 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.
|
2011-12-06 18:20:15 +00:00
|
|
|
//
|
2011-11-22 21:28:15 +00:00
|
|
|
// If you use this code, drop me an email. I'd like to know if you find the code
|
|
|
|
// useful.
|
|
|
|
|
|
|
|
//#include "stdafx.h"
|
2019-01-07 04:19:20 +00:00
|
|
|
#include "tools/edit_gui_common.h"
|
|
|
|
|
2011-11-22 21:28:15 +00:00
|
|
|
|
|
|
|
#include "proptree.h"
|
|
|
|
#include "PropTreeItemEditButton.h"
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
#define new DEBUG_NEW
|
|
|
|
#undef THIS_FILE
|
|
|
|
static char THIS_FILE[] = __FILE__;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define BUTTON_SIZE 17
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CPropTreeItemEditButton
|
|
|
|
|
|
|
|
CPropTreeItemEditButton::CPropTreeItemEditButton() :
|
|
|
|
m_sEdit(_T("")),
|
|
|
|
m_nFormat(ValueFormatText),
|
|
|
|
m_bPassword(FALSE),
|
|
|
|
m_fValue(0.0f)
|
|
|
|
{
|
|
|
|
mouseDown = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
CPropTreeItemEditButton::~CPropTreeItemEditButton()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CPropTreeItemEditButton, CEdit)
|
|
|
|
//{{AFX_MSG_MAP(CPropTreeItemEditButton)
|
|
|
|
ON_WM_GETDLGCODE()
|
|
|
|
ON_WM_KEYDOWN()
|
|
|
|
ON_CONTROL_REFLECT(EN_KILLFOCUS, OnKillfocus)
|
|
|
|
//}}AFX_MSG_MAP
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// CPropTreeItemEditButton message handlers
|
|
|
|
|
|
|
|
LONG CPropTreeItemEditButton::DrawItem( CDC* pDC, const RECT& rc, LONG x, LONG y )
|
|
|
|
{
|
|
|
|
CSize textSize;
|
|
|
|
CRect textRect;
|
|
|
|
LONG nTotal = 0;
|
|
|
|
|
|
|
|
nTotal = CPropTreeItemEdit::DrawItem( pDC, rc, x, y );
|
|
|
|
|
|
|
|
textSize = pDC->GetOutputTextExtent( buttonText );
|
|
|
|
|
|
|
|
buttonRect.left = m_rc.right - ( textSize.cx + 12 + 4);
|
|
|
|
buttonRect.top = m_rc.top + ((m_rc.bottom - m_rc.top)/2)-BUTTON_SIZE/2;
|
|
|
|
buttonRect.right = buttonRect.left + textSize.cx + 12;
|
|
|
|
buttonRect.bottom = buttonRect.top + BUTTON_SIZE;
|
|
|
|
|
|
|
|
UINT buttonStyle;
|
|
|
|
|
|
|
|
if ( (m_dwState & TreeItemChecked) ) {
|
|
|
|
buttonStyle = DFCS_BUTTONPUSH | DFCS_PUSHED;
|
|
|
|
} else {
|
|
|
|
buttonStyle = DFCS_BUTTONPUSH;
|
|
|
|
}
|
|
|
|
pDC->DrawFrameControl(&buttonRect, DFC_BUTTON, buttonStyle );
|
|
|
|
|
|
|
|
textRect = buttonRect;
|
|
|
|
textRect.left += 4;
|
|
|
|
textRect.right -= 8;
|
|
|
|
pDC->DrawText( buttonText, textRect, DT_SINGLELINE|DT_VCENTER );
|
|
|
|
|
|
|
|
//Adjust hit test rect to acount for window scrolling
|
|
|
|
hitTestRect = buttonRect;
|
|
|
|
hitTestRect.OffsetRect(0, m_pProp->GetOrigin().y);
|
|
|
|
|
|
|
|
return nTotal;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CPropTreeItemEditButton::DrawAttribute(CDC* pDC, const RECT& rc)
|
|
|
|
{
|
|
|
|
ASSERT(m_pProp!=NULL);
|
|
|
|
|
|
|
|
pDC->SelectObject(IsReadOnly() ? m_pProp->GetNormalFont() : m_pProp->GetBoldFont());
|
|
|
|
pDC->SetTextColor(RGB(0,0,0));
|
|
|
|
pDC->SetBkMode(TRANSPARENT);
|
|
|
|
|
|
|
|
CRect r = rc;
|
|
|
|
r.right = buttonRect.left - 5;
|
|
|
|
|
|
|
|
TCHAR ch;
|
|
|
|
|
|
|
|
// can't use GetPasswordChar(), because window may not be created yet
|
|
|
|
ch = (m_bPassword) ? '*' : '\0';
|
|
|
|
|
|
|
|
if (ch)
|
|
|
|
{
|
|
|
|
CString s;
|
|
|
|
|
|
|
|
s = m_sEdit;
|
|
|
|
for (LONG i=0; i<s.GetLength();i++)
|
|
|
|
s.SetAt(i, ch);
|
|
|
|
|
|
|
|
pDC->DrawText(s, r, DT_SINGLELINE|DT_VCENTER);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pDC->DrawText(m_sEdit, r, DT_SINGLELINE|DT_VCENTER);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CPropTreeItemEditButton::SetAsPassword(BOOL bPassword)
|
|
|
|
{
|
|
|
|
m_bPassword = bPassword;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPropTreeItemEditButton::SetValueFormat(ValueFormat nFormat)
|
|
|
|
{
|
|
|
|
m_nFormat = nFormat;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LPARAM CPropTreeItemEditButton::GetItemValue()
|
|
|
|
{
|
|
|
|
switch (m_nFormat)
|
|
|
|
{
|
|
|
|
case ValueFormatNumber:
|
|
|
|
return _ttoi(m_sEdit);
|
|
|
|
|
|
|
|
case ValueFormatFloatPointer:
|
|
|
|
_stscanf(m_sEdit, _T("%f"), &m_fValue);
|
|
|
|
return (LPARAM)&m_fValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (LPARAM)(LPCTSTR)m_sEdit;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPropTreeItemEditButton::SetItemValue(LPARAM lParam)
|
|
|
|
{
|
|
|
|
switch (m_nFormat)
|
|
|
|
{
|
|
|
|
case ValueFormatNumber:
|
|
|
|
m_sEdit.Format(_T("%d"), lParam);
|
|
|
|
return;
|
|
|
|
|
|
|
|
case ValueFormatFloatPointer:
|
|
|
|
{
|
|
|
|
TCHAR tmp[MAX_PATH];
|
|
|
|
m_fValue = *(float*)lParam;
|
|
|
|
_stprintf(tmp, _T("%f"), m_fValue);
|
|
|
|
m_sEdit = tmp;
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lParam==0L)
|
|
|
|
{
|
|
|
|
TRACE0("CPropTreeItemEditButton::SetItemValue - Invalid lParam value\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_sEdit = (LPCTSTR)lParam;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPropTreeItemEditButton::OnMove()
|
|
|
|
{
|
|
|
|
if (IsWindow(m_hWnd))
|
|
|
|
SetWindowPos(NULL, m_rc.left, m_rc.top, m_rc.Width(), m_rc.Height(), SWP_NOZORDER|SWP_NOACTIVATE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPropTreeItemEditButton::OnRefresh()
|
|
|
|
{
|
|
|
|
if (IsWindow(m_hWnd))
|
|
|
|
SetWindowText(m_sEdit);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPropTreeItemEditButton::OnCommit()
|
|
|
|
{
|
|
|
|
// hide edit control
|
|
|
|
ShowWindow(SW_HIDE);
|
|
|
|
|
|
|
|
// store edit text for GetItemValue
|
|
|
|
GetWindowText(m_sEdit);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPropTreeItemEditButton::OnActivate(int activateType, CPoint point)
|
|
|
|
{
|
|
|
|
// Check if the edit control needs creation
|
|
|
|
if (!IsWindow(m_hWnd))
|
|
|
|
{
|
|
|
|
DWORD dwStyle;
|
|
|
|
|
|
|
|
dwStyle = WS_CHILD|ES_AUTOHSCROLL;
|
|
|
|
Create(dwStyle, m_rc, m_pProp->GetCtrlParent(), GetCtrlID());
|
|
|
|
SendMessage(WM_SETFONT, (WPARAM)m_pProp->GetNormalFont()->m_hObject);
|
|
|
|
}
|
|
|
|
|
|
|
|
SetPasswordChar((TCHAR)(m_bPassword ? '*' : 0));
|
|
|
|
SetWindowText(m_sEdit);
|
|
|
|
SetSel(0, -1);
|
|
|
|
|
|
|
|
SetWindowPos(NULL, m_rc.left, m_rc.top, m_rc.Width() - buttonRect.Width() - 5, m_rc.Height(), SWP_NOZORDER|SWP_SHOWWINDOW);
|
|
|
|
SetFocus();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-12-06 18:20:15 +00:00
|
|
|
UINT CPropTreeItemEditButton::OnGetDlgCode()
|
2011-11-22 21:28:15 +00:00
|
|
|
{
|
|
|
|
return CEdit::OnGetDlgCode()|DLGC_WANTALLKEYS;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-12-06 18:20:15 +00:00
|
|
|
void CPropTreeItemEditButton::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
2011-11-22 21:28:15 +00:00
|
|
|
{
|
|
|
|
if (nChar==VK_RETURN)
|
|
|
|
CommitChanges();
|
|
|
|
|
|
|
|
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-12-06 18:20:15 +00:00
|
|
|
void CPropTreeItemEditButton::OnKillfocus()
|
2011-11-22 21:28:15 +00:00
|
|
|
{
|
2011-12-06 18:20:15 +00:00
|
|
|
CommitChanges();
|
2011-11-22 21:28:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL CPropTreeItemEditButton::HitButton( const POINT& pt ) {
|
|
|
|
return hitTestRect.PtInRect( pt );
|
|
|
|
}
|
|
|
|
|
|
|
|
void CPropTreeItemEditButton::SetButtonText( LPCSTR text ) {
|
|
|
|
buttonText = text;
|
|
|
|
}
|