reman3/Rayman_X/cpa/tempgrp/OAC/Src/EdActors/EDACDgUL.cpp

342 lines
9.1 KiB
C++

// CPACDgUL.cpp : implementation file
/////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "EDACDgUL.hpp"
#include "EDACActr.hpp"
#include "EDACVwAc.hpp"
#include "_AInterf.hpp"
//External Modules
#include "ErO.h"
#include "IncTUT.h"
//End of External Modules
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// EdActors_UndoRedoListDialog dialog
BEGIN_MESSAGE_MAP(EdActors_UndoRedoListDialog, CDialog)
//{{AFX_MSG_MAP(EdActors_UndoRedoListDialog)
ON_LBN_SELCHANGE(IDC_LIST_UNDO, OnSelchangeListUndo)
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//***************************************************************************
EdActors_UndoRedoListDialog::EdActors_UndoRedoListDialog( CPoint clUpAndLeftPoint,
m_eUndoRedoListType eType,
CWnd* pParent /*=NULL*/)
: CDialog(EdActors_UndoRedoListDialog::IDD, &g_oBaseFrame)
{
//{{AFX_DATA_INIT(EdActors_UndoRedoListDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_hOldInstance = AfxGetResourceHandle();
AfxSetResourceHandle(g_stActorEditorIdentity.hModule);
m_clUpAndLeftPoint = clUpAndLeftPoint;
m_eType = eType;
//Gets current Actor
m_pclEditorActor = g_pclInterface->m_clDocument.m_pclSelectedActor;
}
//***************************************************************************
EdActors_UndoRedoListDialog::~EdActors_UndoRedoListDialog()
{
AfxSetResourceHandle(m_hOldInstance);
}
//***************************************************************************
void EdActors_UndoRedoListDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(EdActors_UndoRedoListDialog)
DDX_Control(pDX, IDC_LIST_UNDO, m_clListBox);
//}}AFX_DATA_MAP
}
/////////////////////////////////////////////////////////////////////////////
// EdActors_UndoRedoListDialog message handlers
//***************************************************************************
BOOL EdActors_UndoRedoListDialog::OnInitDialog()
{
CDialog::OnInitDialog();
//Moves the Window
CRect crWindowRect;
GetWindowRect(crWindowRect);
crWindowRect.OffsetRect(m_clUpAndLeftPoint.x - crWindowRect.left,
m_clUpAndLeftPoint.y - crWindowRect.top);
MoveWindow(crWindowRect);
ShowWindow(SW_SHOW);
SetCapture();
//Fills the List
CPA_List<CPA_Modif> *pclListOfModifs = &(m_pclEditorActor->m_clUndoManager.ListOfModifs);
CPA_Modif *pclModif;
if ( m_eType == EDCAR_UNDOREDO_LIST_TYPE_UNDO )
{
POSITION pos = pclListOfModifs->GetTailPosition();
while ( pos != NULL )
{
pclModif = pclListOfModifs->GetPrev(pos);
if ( pclModif->HasBeenDone() )
m_clListBox.AddString(pclModif->GetName());
}
}
else
{
POSITION pos = pclListOfModifs->GetHeadPosition();
while ( pos != NULL )
{
pclModif = pclListOfModifs->GetNext(pos);
if ( !pclModif->HasBeenDone() )
m_clListBox.AddString(pclModif->GetName());
}
}
//////////////
//////////////
//Registers for TUT Module
TUT_M_vGetTutDll();
TUT_M_vRegisterControlID(IDC_LIST_UNDO, "OAc_UndoRedoDialog_ListBox", TUT_e_ListBox);
TUT_M_vRegisterControlID(IDC_STATIC_STATUS, "OAc_UndoRedoDialog_CancelStatic", TUT_e_Window);
//End of Registers for TUT Module
//////////////
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//***************************************************************************
void EdActors_UndoRedoListDialog::OnDestroy()
{
//////////////
//////////////
//UnRegisters for TUT Module
TUT_M_vGetTutDll();
TUT_M_vUnregisterControlID(IDC_LIST_UNDO);
TUT_M_vUnregisterControlID(IDC_STATIC_STATUS);
//End of UnRegisters for TUT Module
//////////////
CDialog::OnDestroy();
}
//***************************************************************************
void EdActors_UndoRedoListDialog::OnSelchangeListUndo()
{
//Gets the Selected Undo action
unsigned short uwIndex = m_clListBox.GetCurSel();
if ( (m_clListBox.m_bMustUndo) && (uwIndex != LB_ERR) )
{
//Makes (uwIndex + 1) undo in the reversed list
CPA_List<CPA_Modif> *pclListOfModifs = &(m_pclEditorActor->m_clUndoManager.ListOfModifs);
unsigned short c_uwI;
CPA_Modif *pclModif;
if ( m_eType == EDCAR_UNDOREDO_LIST_TYPE_UNDO )
{
POSITION pos = pclListOfModifs->GetTailPosition();
for (c_uwI = 0; c_uwI < (uwIndex+1); )
{
ERROR_ASSERT( pos != NULL );
pclModif = pclListOfModifs->GetPrev(pos);
if ( pclModif->HasBeenDone() )
{
ERROR_VERIFY( m_pclEditorActor->m_clUndoManager.Undo() );
c_uwI ++;
}
}
}
else
{
POSITION pos = pclListOfModifs->GetHeadPosition();
for (c_uwI = 0; c_uwI < (uwIndex+1); )
{
ERROR_ASSERT( pos != NULL );
pclModif = pclListOfModifs->GetNext(pos);
if ( !pclModif->HasBeenDone() )
{
ERROR_VERIFY( m_pclEditorActor->m_clUndoManager.Redo() );
c_uwI ++;
}
}
}
}
//Updates buttons
g_pclInterface->m_clDocument.m_pclActorsView->m_fn_vUpdateUndoRedoButtons();
//Ends Dialog
ReleaseCapture();
EndDialog(IDOK);
}
//***************************************************************************
void EdActors_UndoRedoListDialog::OnLButtonUp(UINT nFlags, CPoint point)
{
CPoint cpPoint(point);
ClientToScreen(&cpPoint);
CRect crWindowRect;
GetWindowRect(crWindowRect);
//If user clicks elsewhere, closes Dialog
if ( !crWindowRect.PtInRect(cpPoint) )
{
ReleaseCapture();
EndDialog(IDCANCEL);
}
//else looks if user clicked in the ListBox
else
m_clListBox.OnLButtonUp(nFlags, point);
CDialog::OnLButtonUp(nFlags, point);
}
//***************************************************************************
void EdActors_UndoRedoListDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
m_clListBox.OnLButtonDown(nFlags, point);
CDialog::OnLButtonDown(nFlags, point);
}
//***************************************************************************
void EdActors_UndoRedoListDialog::OnMouseMove(UINT nFlags, CPoint point)
{
m_clListBox.OnMouseMove(nFlags, point);
CDialog::OnMouseMove(nFlags, point);
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// EdActors_UndoListBox
BEGIN_MESSAGE_MAP(EdActors_UndoListBox, CListBox)
//{{AFX_MSG_MAP(EdActors_UndoListBox)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//****************************************************************************
EdActors_UndoListBox::EdActors_UndoListBox()
: CListBox()
{
m_bMustUndo = FALSE;
}
//****************************************************************************
EdActors_UndoListBox::~EdActors_UndoListBox()
{
}
/////////////////////////////////////////////////////////////////////////////
// EdActors_UndoListBox message handlers
//****************************************************************************
void EdActors_UndoListBox::OnMouseMove(UINT nFlags, CPoint point)
{
if ( nFlags & MK_LBUTTON )
{
BOOL bInside;
short wIndex = ItemFromPoint(point, bInside);
CString csTextToDisplay;
//Re-computes bOutside
GetClientRect(m_crWindowRect);
bInside = m_crWindowRect.PtInRect(point);
if ( bInside )
{
//Selects first items
SelItemRange(TRUE, 0, wIndex+1);
//Unselects others
SelItemRange(FALSE, wIndex+1, GetCount()-1);
CString csTextPart = "undo";
if ( ((EdActors_UndoRedoListDialog *)GetParent())->m_eType == EdActors_UndoRedoListDialog::EDCAR_UNDOREDO_LIST_TYPE_REDO )
csTextPart = "redo";
csTextToDisplay.Format("Will %s %i %s", csTextPart,
wIndex+1,
(wIndex > 0) ? "actions" : "action");
m_bMustUndo = TRUE;
}
else
{
//Unselects all
SelItemRange(FALSE, 0, GetCount()-1);
csTextToDisplay = "Cancel";
m_bMustUndo = FALSE;
}
//Updates static text
GetParent()->GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(csTextToDisplay);
}
CListBox::OnMouseMove(nFlags, point);
}
//****************************************************************************
void EdActors_UndoListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
CListBox::OnLButtonDown(nFlags, point);
BOOL bInside;
short wIndex = ItemFromPoint(point, bInside);
CString csTextToDisplay;
//Selects first items
SelItemRange(TRUE, 0, wIndex+1);
//Unselects others
SelItemRange(FALSE, wIndex+1, GetCount()-1);
CString csTextPart = "undo";
if ( ((EdActors_UndoRedoListDialog *)GetParent())->m_eType == EdActors_UndoRedoListDialog::EDCAR_UNDOREDO_LIST_TYPE_REDO )
csTextPart = "redo";
csTextToDisplay.Format("Will %s %i %s", csTextPart,
wIndex+1,
(wIndex > 0) ? "actions" : "action");
m_bMustUndo = TRUE;
//Updates static text
GetParent()->GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(csTextToDisplay);
}