Serious-Engine/Sources/WorldEditor/CtrlEditFlags.cpp

310 lines
7.1 KiB
C++
Raw Normal View History

2016-03-11 14:57:17 +01:00
/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
// CtrlEditFlags.cpp : implementation file
//
#include "stdafx.h"
#include "WorldEditor.h"
#include "CtrlEditFlags.h"
#ifdef _DEBUG
#undef new
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCtrlEditFlags
CCtrlEditFlags::CCtrlEditFlags()
{
m_iCurrentBank=0;
m_ulValue=0;
m_ulDefined=-1;
m_ulEditable=0;
m_iLastArea=0;
m_iMouseDownArea=0;
for(INDEX iBit=0; iBit<32; iBit++)
{
CTString strDescription;
strDescription.PrintF("Bit %d", iBit);
SetBitDescription(iBit, strDescription);
}
}
CCtrlEditFlags::~CCtrlEditFlags()
{
}
void CCtrlEditFlags::SetBitDescription(INDEX iBit, CTString strBitName)
{
m_astrBitDescription[iBit]=strBitName;
}
void CCtrlEditFlags::SetDialogPtr( CWnd *pDialog)
{
m_pDialog = pDialog;
}
void CCtrlEditFlags::SetEditableMask(ULONG ulEditable)
{
m_ulEditable=ulEditable;
SetFirstEditableBank();
if( ::IsWindow(m_hWnd)) Invalidate( FALSE);
}
void CCtrlEditFlags::SetDefaultValue(ULONG ulDefault)
{
m_ulDefault=ulDefault;
}
void CCtrlEditFlags::SetFlags(ULONG ulFlags)
{
m_ulValue=ulFlags;
m_ulDefined=-1;
if( ::IsWindow(m_hWnd)) Invalidate( FALSE);
}
void CCtrlEditFlags::MergeFlags(ULONG ulFlags)
{
m_ulDefined&=~(ulFlags^m_ulValue);
if( ::IsWindow(m_hWnd)) Invalidate( FALSE);
}
void CCtrlEditFlags::ApplyChange(ULONG &ulOldFlags)
{
ULONG ulKeepMask=~m_ulEditable|~m_ulDefined;
ulOldFlags=(ulOldFlags&ulKeepMask)|(m_ulValue&~ulKeepMask);
}
void CCtrlEditFlags::SetPrevEditableBank( void)
{
if(m_iCurrentBank==0 && m_ulEditable&0xff000000) m_iCurrentBank=3;
if(m_iCurrentBank==1 && m_ulEditable&0x000000ff) m_iCurrentBank=0;
if(m_iCurrentBank==2 && m_ulEditable&0x0000ff00) m_iCurrentBank=1;
if(m_iCurrentBank==3 && m_ulEditable&0x00ff0000) m_iCurrentBank=2;
}
void CCtrlEditFlags::SetNextEditableBank( void)
{
INDEX iOldCurrentBank=m_iCurrentBank;
if(m_iCurrentBank==0 && m_ulEditable&0x0000ff00) m_iCurrentBank=1;
if(m_iCurrentBank==1 && m_ulEditable&0x00ff0000) m_iCurrentBank=2;
if(m_iCurrentBank==2 && m_ulEditable&0xff000000) m_iCurrentBank=3;
if(m_iCurrentBank==3 && m_ulEditable&0x000000ff) m_iCurrentBank=0;
if(iOldCurrentBank==m_iCurrentBank)
{
SetFirstEditableBank();
}
Invalidate(FALSE);
}
void CCtrlEditFlags::SetFirstEditableBank( void)
{
m_iCurrentBank=0;
if(m_ulEditable&0x000000ff) m_iCurrentBank=0;
else if(m_ulEditable&0x0000ff00) m_iCurrentBank=1;
else if(m_ulEditable&0x00ff0000) m_iCurrentBank=2;
else if(m_ulEditable&0xff000000) m_iCurrentBank=3;
}
BEGIN_MESSAGE_MAP(CCtrlEditFlags, CButton)
//{{AFX_MSG_MAP(CCtrlEditFlags)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_KILLFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCtrlEditFlags message handlers
RECT CCtrlEditFlags::GetRectForArea(INDEX iArea) const
{
RECT rect;
rect.left = m_rectButton.left+m_dx*iArea;
rect.right = m_rectButton.left+m_dx*(iArea+1);
rect.top = m_rectButton.top;
rect.bottom = m_rectButton.bottom;
return rect;
}
void CCtrlEditFlags::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
EnableToolTips( TRUE);
CDC *pDC = GetDC();
m_rectButton = lpDrawItemStruct->rcItem;
COLORREF clrrefBcg=GetSysColor(COLOR_MENU);
pDC->FillSolidRect(&m_rectButton, clrrefBcg);
m_rectButton.top+=2;
m_rectButton.bottom-=2;
m_dx = (m_rectButton.right-m_rectButton.left)/9;
INDEX ix=0;
for( INDEX iBit=(m_iCurrentBank+1)*8-1; iBit>=m_iCurrentBank*8; iBit--)
{
RECT rectToFill=GetRectForArea(ix);
ULONG ulBit=(1<<iBit);
COLORREF clrfColor=CLRF_CLR( C_GRAY);
// if is editable
if( m_ulEditable&ulBit)
{
// if is not defined
if(!(m_ulDefined&ulBit))
{
clrfColor=CLRF_CLR( C_GRAY);
}
else
{
// if is checked
if(m_ulValue&ulBit)
{
clrfColor=CLRF_CLR( C_BLACK);
}
// it is cleared
else
{
clrfColor=CLRF_CLR( C_WHITE);
}
}
if( !IsWindowEnabled())
{
clrfColor=clrrefBcg;
}
pDC->FillSolidRect( &rectToFill, clrfColor);
pDC->DrawEdge( &rectToFill, EDGE_SUNKEN, BF_RECT);
}
else
{
pDC->DrawEdge( &rectToFill, EDGE_ETCHED, BF_RECT);
}
ix++;
}
if( IsWindowEnabled())
{
RECT rectText=GetRectForArea(8);
CTString strCTBankNo;
strCTBankNo.PrintF("%d",m_iCurrentBank);
CString strBankNo=strCTBankNo;
pDC->SetBkMode( TRANSPARENT);
pDC->SetTextAlign(TA_CENTER);
pDC->ExtTextOut( (rectText.left+rectText.right)/2, rectText.top, ETO_CLIPPED, &rectText, strBankNo, 1, NULL);
}
}
INDEX CCtrlEditFlags::GetAreaUnderMouse( CPoint point) const
{
INDEX iResult=-1;
for( INDEX iArea=0; iArea<=8; iArea++)
{
RECT rectToTest=GetRectForArea(iArea);
if( PtInRect( &rectToTest, point))
{
iResult=iArea;
break;;
}
}
return iResult;
}
CTString CCtrlEditFlags::GetTipForArea(INDEX iArea) const
{
CTString strResult;
if( iArea==8)
{
strResult.PrintF("Bits (%d-%d)", m_iCurrentBank*8, (m_iCurrentBank+1)*8-1);
return strResult;
}
else if( iArea!=-1)
{
ULONG ulBit=1<<((7-iArea)+m_iCurrentBank*8);
if( m_ulEditable&ulBit)
{
INDEX iBit=(7-iArea)+m_iCurrentBank*8;
return m_astrBitDescription[iBit];
}
else
{
strResult.PrintF("Not editable");
}
return strResult;
}
return "Not available";
}
int CCtrlEditFlags::OnToolHitTest( CPoint point, TOOLINFO* pTI ) const
{
INDEX iArea=GetAreaUnderMouse( point);
if( iArea==-1) return 0;
CTString strToolTip=GetTipForArea(iArea);
pTI->lpszText = (wchar_t *)malloc( sizeof(wchar_t) * (strlen(strToolTip)+1));
wcscpy( pTI->lpszText, CString(strToolTip));
RECT rectToolTip;
rectToolTip.left = 50;
rectToolTip.right = 60;
rectToolTip.top = 50;
rectToolTip.bottom = 60;
pTI->hwnd = GetParent()->m_hWnd;
pTI->uId = (UINT) m_hWnd;
pTI->rect = rectToolTip;
pTI->uFlags = TTF_IDISHWND;
return 1;
}
void CCtrlEditFlags::OnLButtonDown(UINT nFlags, CPoint point)
{
INDEX iArea=GetAreaUnderMouse( point);
m_iMouseDownArea=iArea;
CButton::OnLButtonDown(nFlags, point);
}
void CCtrlEditFlags::OnLButtonUp(UINT nFlags, CPoint point)
{
INDEX iArea=GetAreaUnderMouse( point);
if(m_iMouseDownArea!=iArea) return;
if( iArea==8)
{
SetNextEditableBank();
}
else if( iArea>=0 && iArea<=7)
{
ULONG ulBit=1<<((7-iArea)+m_iCurrentBank*8);
// if bit was defined
if( m_ulDefined&ulBit)
{
// change bit state
m_ulValue^=ulBit;
}
// set bit
else
{
m_ulValue|=ulBit;
}
// note change
if( m_pDialog!=NULL)
{
m_pDialog->UpdateData(TRUE);
}
m_ulDefined|=ulBit;
}
Invalidate(FALSE);
CButton::OnLButtonUp(nFlags, point);
}
void CCtrlEditFlags::OnMouseMove(UINT nFlags, CPoint point)
{
m_iLastArea=GetAreaUnderMouse( point);
CButton::OnMouseMove(nFlags, point);
}
void CCtrlEditFlags::OnKillFocus(CWnd* pNewWnd)
{
CButton::OnKillFocus(pNewWnd);
}