//------------------------------------------------------------------------------
// $Workfile: ModelDataTypes.cpp $
// $Header: /SbjDev/SbjCore/ModelDataTypes.cpp 2 11/12/08 2:22p Steve $
//
// Copyright � 2008 SbjCat
// All rights reserved.
//
//
// *** Authors ***
// Steve Johnson
//
// $Revision: 2 $
//
//-----------------------------------------------------------------------------
#pragma once
#include "stdafx.h"
#include "ModelController.h"
#include "ModelTypeDefs.h"
#include "ModelEvents.h"
#include "DocEvents.h"
#include "UndoRedoMgr.h"
#include "UndoRedoHandler.h"
namespace localNS
{
LPCTSTR lpszLeft(_T("left"));
LPCTSTR lpszTop(_T("top"));
LPCTSTR lpszRight(_T("right"));
LPCTSTR lpszBottom(_T("bottom"));
}
namespace SbjCore
{
namespace Mvc
{
namespace Model
{
namespace Rect
{
void SetItemValue(Controller* pModelCtrlr, const HANDLE hItem, const CRect& r, bool bAddToUndoRedo /*= false*/, bool bFireEvents /*= false*/)
{
CRect rAfter = r;
CRect rBefore(0,0,0,0);
if (bAddToUndoRedo)
{
rBefore = GetItemValue(pModelCtrlr, hItem);
}
pModelCtrlr->SetItemAttrValue(hItem, localNS::lpszLeft, r.left);
pModelCtrlr->SetItemAttrValue(hItem, localNS::lpszTop, r.top);
pModelCtrlr->SetItemAttrValue(hItem, localNS::lpszRight, r.right);
pModelCtrlr->SetItemAttrValue(hItem, localNS::lpszBottom, r.bottom);
if (bAddToUndoRedo)
{
class UndoRedoHandler : public SbjCore::UndoRedo::Handler
{
CString sActionName;
Controller* pModelCtrlr;
HANDLE hItem;
CRect rBefore;
CRect rAfter;
public:
UndoRedoHandler(Controller* p, const HANDLE h, const CRect& rB, const CRect& rA) :
sActionName(_T("Move")),
pModelCtrlr(p),
hItem(h),
rBefore(rB),
rAfter(rA)
{
if (rBefore.TopLeft() == rAfter.TopLeft())
{
if (rBefore.BottomRight() != rAfter.BottomRight())
{
sActionName = _T("Resize");
}
}
else if (rBefore.BottomRight() == rAfter.BottomRight())
{
sActionName = _T("Resize");
}
}
virtual bool OnHandleUndo()
{
bool bRslt = true;
SetItemValue(pModelCtrlr, hItem, rBefore, false, true);
return bRslt;
}
virtual bool OnHandleRedo()
{
bool bRslt = true;
SetItemValue(pModelCtrlr, hItem, rAfter, false, true);
return bRslt;
}
virtual LPCTSTR OnGetHandlerName() const
{
return sActionName;
}
};
UndoRedoHandler* pUndoRedo = new UndoRedoHandler(pModelCtrlr, hItem, rBefore, rAfter);
pModelCtrlr->GetUndoRedoMgr()->Push(pUndoRedo);
}
if (bFireEvents)
{
SbjCore::Mvc::Model::Events::ItemChange eventItemChanged(SbjCore::Mvc::Model::Events::EVID_ITEM_CHANGED, pModelCtrlr, hItem, _T("Rectangle"));
SbjCore::Mvc::Doc::Events::DocModified eventDocModified(true);
}
}
CRect GetItemValue(Controller* pModelCtrlr, const HANDLE hItem)
{
CRect r(0,0,0,0);
if (pModelCtrlr != NULL)
{
r.left = pModelCtrlr->GetItemAttrValue(hItem, localNS::lpszLeft);
r.top = pModelCtrlr->GetItemAttrValue(hItem, localNS::lpszTop);
r.right = pModelCtrlr->GetItemAttrValue(hItem, localNS::lpszRight);
r.bottom = pModelCtrlr->GetItemAttrValue(hItem, localNS::lpszBottom);
}
return r;
}
}
}
}
}
//*** Modification History ***
// $Log: /SbjDev/SbjCore/ModelDataTypes.cpp $
//
// 2 11/12/08 2:22p Steve
// Finished Generalization of Model v2.0.1
//
// 1 11/02/08 12:48a Steve
//
// 1 10/28/08 4:53p Steve
//
// 3 10/28/08 11:13a Steve
//
// 2 10/26/08 9:19a Steve
//
// 1 10/24/08 9:03a Steve