reman3/Rayman_X/cpa/tempgrp/ITF/devmulti.cpp

987 lines
28 KiB
C++

/*=========================================================================
* DEVMulti.cpp : Implementation of Multidevice.
* This is a part of the PCA project.
*
* Version 1.0
* Creation date 26/06/96
* Revision date
*
*
* (c) Ubi Studios 1996
*=======================================================================*/
#include "stdafx.h"
#include "acp_base.h"
#include "geo.h"
#include "gli.h"
#include "itf/CPARes.h"
#include "itf/DEVMulti.hpp"
#include "itf/CPACont.hpp"
#include "itf/FRMBsMn.hpp"
#include "itf/CPAProj.hpp"
#include "itf/stddllid.h"
#include "itf/camdllb.hpp"
#include "itf/cpainter.hpp"
#include "itf/DevMul3D.hpp"
#include "itf/CPAMWorl.hpp"
//------------------------------------------------------------------
// Array of all the button-id possible for the Device ToolBar.
#ifdef ACTIVE_EDITOR
UINT pButtonsDevice[] =
{
CPA_IDB_OPENDEVICE,
CPA_IDB_DEVICE_TILE_HORZ,
CPA_IDB_DEVICE_TILE_VERT,
CPA_IDB_DEVICE_CASCADE,
};
#define nbButtonsDevice 4
//------------------------------------------------------------------
#endif // ACTIVE_EDITOR
IMPLEMENT_DYNCREATE(DEV_MultiDevice, CView)
BEGIN_MESSAGE_MAP(DEV_MultiDevice, CView)
//{{AFX_MSG_MAP(DEV_MultiDevice)
ON_WM_WINDOWPOSCHANGED()
ON_WM_CREATE()
ON_WM_DESTROY()
#ifdef ACTIVE_EDITOR
ON_MESSAGE(CPA_MSG_DRAWOBJECT, OnDrawObject)
ON_MESSAGE(CPA_MSG_DRAWOBJECTEXCEPT0, OnDrawObjectExcept0)
#endif // ACTIVE_EDITOR
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//--------------------------------------------------------------------------------
DEV_MultiDevice::DEV_MultiDevice()
{
mFlags = 0;
#ifdef ACTIVE_EDITOR
m_p_oContact = NULL;
m_p_oInterface = NULL;
m_p_oParent = NULL;
m_bActive = FALSE;
#endif // ACTIVE_EDITOR
}
DEV_MultiDevice::DEV_MultiDevice(int flags)
{
mFlags = (short) flags;
#ifdef ACTIVE_EDITOR
m_p_oContact = NULL;
m_p_oInterface = NULL;
m_p_oEditManager = NULL;
m_bActive = FALSE;
#endif // ACTIVE_EDITOR
}
DEV_MultiDevice::~DEV_MultiDevice()
{
#ifdef ACTIVE_EDITOR
if(m_cIsAdditional == 0)
{
delete m_p_oContact;
delete m_p_oEditManager;
}
m_p_oContact = NULL;
#endif // ACTIVE_EDITOR
}
void DEV_MultiDevice::Init()
{
#ifdef ACTIVE_EDITOR
int i;
for (i = 0; i < MAX_DEVICE; i++)
SetActivDevice(i,FALSE); // Definition of default active device
m_lFocusDevice = -1; // To signal that there no active device
m_lFocusPane = 0;
m_p_oContact = NULL; // No contact
m_p_oMultiToDraw = NULL;
m_cIsAdditional = 0;
m_p_oEditManager = new CPA_EditManager;
// register new multidevice
M_GetListOfAllDLL()->RegisterNewMultiDevice(this);
#else
mActivDeviceAlone = FALSE;
#endif // ACTIVE_EDITOR
mbOnDestroy = FALSE;
}
DEV_Device* DEV_MultiDevice::OpenNewDevice(int _iLeft, int _iTop, int _iWidth, int _iHeight)
{
DEV_Device *p_oResult = NULL;
#ifdef ACTIVE_EDITOR
if(!TestFlags(MD_ONEDEVICE))
{
long lNum;
lNum = GetNextNumDevice();
if (SetDevice(&mDevice[lNum], lNum))
{
// update pos & size
if( _iLeft <0 ) _iLeft = 10+lNum*20;
if( _iTop <0 ) _iTop = 30+lNum*20;
if( _iWidth <0 ) _iWidth = 300;
if( _iHeight <0 ) _iHeight = 200;
// create device
if (TestFlags(MD_VIEW2D))
GetDevice(lNum)->CreateDevice(this, _iLeft, _iTop, _iWidth, _iHeight, C_DEVICE2D);
else
GetDevice(lNum)->CreateDevice(this, _iLeft, _iTop, _iWidth, _iHeight, C_DEVICE3D);
p_oResult = GetDevice(lNum);
}
}
#endif // ACTIVE_EDITOR
return p_oResult;
}
void DEV_MultiDevice::CloseAllDevices()
{
#ifdef ACTIVE_EDITOR
OnCloseAllDevice();
#endif // ACTIVE_EDITOR
}
#ifdef ACTIVE_EDITOR
void DEV_MultiDevice::SetContact(CPA_Contact *p_oContact)
{
// if it's the main multidevice, ok
if (m_cIsAdditional == 0)
{
if (m_p_oContact != NULL)
m_p_oContact->SetDevice(NULL);
m_p_oContact = p_oContact;
if (p_oContact != NULL)
p_oContact->SetDevice(this);
}
// else, set the main multidevice interface
else
GetPane_0_0()->SetContact(p_oContact);
}
void DEV_MultiDevice::SetInterface(CPA_Interface *p_oInterface)
{
// if it's the main multidevice, ok
if (m_cIsAdditional == 0)
m_p_oInterface = p_oInterface;
// else, set the main multidevice interface
else
GetPane_0_0()->SetInterface(p_oInterface);
}
void DEV_MultiDevice::SetEditManager(CPA_EditManager *p_oMng)
{
// if it's the main multidevice, ok
if (m_cIsAdditional == 0)
m_p_oEditManager = p_oMng;
// else, set the main multidevice interface
else
GetPane_0_0()->SetEditManager(p_oMng);
}
void DEV_MultiDevice::SetFocusPane(long lPane)
{
// if it's the main multidevice, ok
if (m_cIsAdditional == 0)
m_lFocusPane = lPane;
// else, set the main multidevice interface
else
GetPane_0_0()->SetFocusPane(lPane);
}
CPA_Interface *DEV_MultiDevice::GetInterface()
{
// if it's the main multidevice, ok
if (m_cIsAdditional == 0)
return m_p_oInterface;
// else, return the main multidevice interface
return GetPane_0_0()->GetInterface();
}
CPA_Contact *DEV_MultiDevice::GetContact()
{
// if it's the main multidevice, ok
if (m_cIsAdditional == 0)
return m_p_oContact;
// else, return the main multidevice interface
return GetPane_0_0()->GetContact();
}
CPA_EditManager *DEV_MultiDevice::GetEditManager()
{
// if it's the main multidevice, ok
if (m_cIsAdditional == 0)
return m_p_oEditManager;
// else, return the main multidevice interface
return GetPane_0_0()->GetEditManager();
}
DEV_MultiDevice3D *DEV_MultiDevice::GetPane_0_0()
{
DEV_MultiDevice3D *p_oResult;
ASSERT(m_cIsAdditional != 0);
p_oResult = (DEV_MultiDevice3D *) ( ((FRMSplitter*)GetParent())->GetPane(0, 0));
return p_oResult;
}
#endif // ACTIVE_EDITOR
//--------------------------------------------------------------------------------
BOOL DEV_MultiDevice::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= WS_CLIPCHILDREN;
return CView::PreCreateWindow(cs);
}
//--------------------------------------------------------------------------------
void DEV_MultiDevice::OnDraw(CDC*)
{
}
//--------------------------------------------------------------------------------
// GET-FUNCTIONS
//--------------------------------------------------------------------------------
//===========================================================================
// Description: Return the device number num.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
DEV_Device* DEV_MultiDevice::GetDevice(int num)
{
#ifdef ACTIVE_EDITOR
return mpDevice[num];
#else
return &mDeviceAlone;
#endif // ACTIVE_EDITOR
}
//===========================================================================
// Description: Return the device which the have the focus.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
DEV_Device* DEV_MultiDevice::GetFocusDevice2()
{
#ifdef ACTIVE_EDITOR
if(m_lFocusDevice == -1)
return NULL;
else
return mpDevice[m_lFocusDevice];
#else
return &mDeviceAlone;
#endif // ACTIVE_EDITOR
}
//===========================================================================
// Description: Return the multidevice (in the splitter) which have the focus.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
DEV_Device* DEV_MultiDevice::GetFocusDevice()
{
#ifdef ACTIVE_EDITOR
if (m_cIsAdditional == 0)
{
if (m_lFocusPane == 0)
return GetFocusDevice2();
else if (m_lFocusPane == 1)
return ((DEV_MultiDevice *) ( ((FRMSplitter*)GetParent())->GetPane(0, 1)))->GetFocusDevice2();
else if (m_lFocusPane == 2)
return ((DEV_MultiDevice *) ( ((FRMSplitter*)GetParent())->GetPane(1, 0)))->GetFocusDevice2();
else if (m_lFocusPane == 3)
return ((DEV_MultiDevice *) ( ((FRMSplitter*)GetParent())->GetPane(1, 1)))->GetFocusDevice2();
else return NULL;
}
else
return GetPane_0_0()->GetFocusDevice();
#else
return GetFocusDevice2();
#endif
}
#ifdef ACTIVE_EDITOR
//===========================================================================
// Description: Return the number of first disactivate device.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
UINT DEV_MultiDevice::GetNextNumDevice()
{
UINT i = 0;
// Find first Device not active.
while ((i < MAX_DEVICE) && IsActivDevice(i)) i++;
return i;
}
#endif // ACTIVE_EDITOR
//--------------------------------------------------------------------------------
// SET-FUNCTIONS
//--------------------------------------------------------------------------------
//===========================================================================
// Description: Set the background color of all devices of the MultiDevice
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void DEV_MultiDevice::SetBackgroundColor(COLORREF Color)
{
#ifdef ACTIVE_EDITOR
UINT i;
for (i = 0; i < MAX_DEVICE; i++)
if (IsActivDevice(i))
GetDevice(i)->SetBackgroundColor(Color);
#else
if (mActivDeviceAlone)
mDeviceAlone.SetBackgroundColor(Color);
#endif // ACTIVE_EDITOR
}
//===========================================================================
// Description: Set the background color of all devices of the MultiDevice
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void DEV_MultiDevice::SetBackgroundColor(char Red, char Green, char Blue)
{
#ifdef ACTIVE_EDITOR
UINT i;
for (i = 0; i < MAX_DEVICE; i++)
if (IsActivDevice(i))
GetDevice(i)->SetBackgroundColor(Red,Green,Blue);
#else
if (mActivDeviceAlone)
mDeviceAlone.SetBackgroundColor(Red,Green,Blue);
#endif // ACTIVE_EDITOR
}
//===========================================================================
// Description: Get the background color of the active Device
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void DEV_MultiDevice::GetBackgroundColor(char *Red, char *Green, char *Blue)
{
#ifdef ACTIVE_EDITOR
GetFocusDevice()->GetBackgroundColor(Red,Green,Blue);
#else
if (mActivDeviceAlone)
mDeviceAlone.GetBackgroundColor(Red,Green,Blue);
#endif // ACTIVE_EDITOR
}
#ifdef ACTIVE_EDITOR
//===========================================================================
// Description: Set the Device of number num by the value pDevice.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
BOOL DEV_MultiDevice::SetDevice(DEV_Device *pDevice, UINT num)
{
if (num == MAX_DEVICE)
{
MessageBox("No more Device");
return FALSE;
}
mpDevice[num] = pDevice;
mpDevice[num]->SetNumber(num);
return TRUE;
}
//===========================================================================
// Description: Set the focus to the device number num.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void DEV_MultiDevice::UpdateColorTitle(void)
{
UINT i;
for(i = 0; i < MAX_DEVICE; i++)
if(IsActivDevice(i))
GetDevice(i)->DrawDeviceTitle();
}
void DEV_MultiDevice::SetFocusDevice(int num)
{
long lLast = m_lFocusDevice;
DEV_MultiDevice3D *pSingle;
FRMSplitter *pSplit;
if((num != -1) && (!mbOnDestroy))
{
((FRMSplitter *) GetParent())->SetActivePane(0, 0, this);
m_lFocusDevice = num;
GetDevice(num)->SetWindowPos(&wndTop,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
//GetDevice(num)->GetParentFrame()->MoveWindow(10,10,500,690,TRUE);
//GetDevice(num)->MoveWindow(10,10,500,690,TRUE);
// GetDevice(num)->SetWindowPos(&wndTop,0,0,500,500,0); //chbani
GetDevice(num)->GetViewPort()->SetFocus();
}
// refresh if we are ine fullscreen editor
if ( (num != -1) && !M_bFullScreenEditor())
{
// No refresh if we are in full screen
if(((DEV_MultiDevice3D *)M_GetMainWnd()->m_oSplitter.GetPane(0, 0))->GetFocusDevice()->IsFullScreen())
return;
}
// Refresh the titles
UpdateColorTitle();
if ( (num != -1) && (GetParent()->IsKindOf(RUNTIME_CLASS(FRMSplitter))) )
{
// Update color title of all devices of all splitter panes.
pSplit = (FRMSplitter *) GetParent();
pSingle = (DEV_MultiDevice3D *) pSplit->GetPane(0, 0);
if(pSingle != this)
pSingle->UpdateColorTitle();
else
SetFocusPane(0);
if(pSplit->GetColumnCount() == 2)
{
pSingle = (DEV_MultiDevice3D *) pSplit->GetPane(0, 1);
if(pSingle != this)
pSingle->UpdateColorTitle();
else
SetFocusPane(1);
}
if(pSplit->GetRowCount() == 2)
{
pSingle = (DEV_MultiDevice3D *) pSplit->GetPane(1, 0);
if(pSingle != this)
pSingle->UpdateColorTitle();
else
SetFocusPane(2);
if(pSplit->GetColumnCount() == 2)
{
pSingle = (DEV_MultiDevice3D *) pSplit->GetPane(1, 1);
if(pSingle != this)
pSingle->UpdateColorTitle();
else
SetFocusPane(3);
}
}
}
if (!M_GetMainApp()->m_bLeavingApplication)
{
//VL
//GetParentFrame()->mfn_vUpdateDeviceToolBar();
if (GetParent()->IsKindOf( RUNTIME_CLASS( FRMSplitter ) ))
{
GetParentFrame()->mfn_vUpdateDeviceToolBar();
}
//EVL
}
}
#endif // ACTIVE_EDITOR
//--------------------------------------------------------------------------------
// TEST-FUNCTIONS
//--------------------------------------------------------------------------------
#ifdef ACTIVE_EDITOR
//===========================================================================
// Description: Is pDevice is a pointer on a Device of the MultiDevice ?
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
BOOL DEV_MultiDevice::IsDevice(DEV_Device *pDevice)
{
int i;
for (i = 0; i < MAX_DEVICE; i++)
if (IsActivDevice(i) && (pDevice == GetDevice(i)))
return TRUE;
return FALSE;
}
#endif // ACTIVE_EDITOR
//--------------------------------------------------------------------------------
// ACTION-FUNCTIONS
//--------------------------------------------------------------------------------
//===========================================================================
// Description: Open the Background Device. This is the first Device of
// MultiDevice, and he always has the number 0. This Device
// is created by default.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void DEV_MultiDevice::OnOpenDeviceBackground()
{
#ifdef ACTIVE_EDITOR
if (SetDevice(&mDevice[0], 0))
{
if (TestFlags(MD_VIEW2D))
GetDevice(0)->CreateDeviceBackground(this, C_DEVICE2D);
else
GetDevice(0)->CreateDeviceBackground(this, C_DEVICE3D);
// if this is not the game multidevice, create a default camera
/* if (M_GetMainWnd())
{
if (M_GetMainDevice() != this)
{
CPA_CameraDLLBase *p_oCamDLL = NULL;
CPA_Object *p_oCamera = NULL;
// we are not in the game device
// so, create a camera for this device
p_oCamDLL = (CPA_CameraDLLBase*) M_GetMainApp()->m_p_oMainWorld->GetObjectDLLWithName(C_szDLLCameraName);
ASSERT(p_oCamDLL != NULL);
p_oCamera = p_oCamDLL->CreateDefaultCamera();
ASSERT(p_oCamera != NULL);
((DEV_ViewPort3D*)GetDevice(0)->GetViewPort())->ChangeCamera(p_oCamera);
}
}
*/ }
#else
if (TestFlags(MD_VIEW2D))
mDeviceAlone.CreateDeviceBackground(this, C_DEVICE2D);
else
mDeviceAlone.CreateDeviceBackground(this, C_DEVICE3D);
#endif // ACTIVE_EDITOR
}
//===========================================================================
// Description: Freeze all the Devices but the device which has the
// number : Number.
// Device which is freeze is no more refresh.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void DEV_MultiDevice::FreezeAllButOne(UINT Number)
{
#ifdef ACTIVE_EDITOR
UINT i;
for (i = 0; i < MAX_DEVICE; i++)
if (IsActivDevice(i))
{
if (i == Number)
GetDevice(i)->Unfreeze();
else GetDevice(i)->Freeze();
}
#else
if (mActivDeviceAlone)
mDeviceAlone.Freeze();
#endif // ACTIVE_EDITOR
}
//===========================================================================
// Description: Unfreeze all the device.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void DEV_MultiDevice::UnfreezeAll()
{
#ifdef ACTIVE_EDITOR
UINT i;
for (i = 0; i < MAX_DEVICE; i++)
if (IsActivDevice(i))
GetDevice(i)->Unfreeze();
#else
if (mActivDeviceAlone)
mDeviceAlone.Unfreeze();
#endif // ACTIVE_EDITOR
}
//===========================================================================
// Description: Freeze all the device.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void DEV_MultiDevice::FreezeAll()
{
#ifdef ACTIVE_EDITOR
UINT i;
for (i = 0; i < MAX_DEVICE; i++)
if (IsActivDevice(i))
GetDevice(i)->Freeze();
#else
if (mActivDeviceAlone)
mDeviceAlone.Freeze();
#endif // ACTIVE_EDITOR
}
/////////////////////////////////////////////////////////////////////////////
// DEV_MultiDevice message handlers
#ifdef ACTIVE_EDITOR
//===========================================================================
// Description: Open/Close a Device in the MultiDevice.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void DEV_MultiDevice::OnOpenDevice()
{
CPA_SuperObject *p_oCameraSO;
CPA_CameraDLLBase *p_oCamDLL;
if(!TestFlags(MD_ONEDEVICE))
{
long lNum;
lNum = GetNextNumDevice();
if (SetDevice(&mDevice[lNum], lNum))
{
if (TestFlags(MD_VIEW2D))
GetDevice(lNum)->CreateDevice(this, 10+lNum*20, 30+lNum*20, 300, 200, C_DEVICE2D);
else
GetDevice(lNum)->CreateDevice(this, 10+lNum*20, 30+lNum*20, 300, 200, C_DEVICE3D);
}
// create the default camera for the device
p_oCamDLL = (CPA_CameraDLLBase*) M_GetMainApp()->m_p_oMainWorld->GetObjectDLLWithName(C_szDLLCameraName);
ASSERT(p_oCamDLL != NULL);
p_oCameraSO = p_oCamDLL->CreateDefaultCamera();
p_oCamDLL->InsertCameraInHierarchy(p_oCameraSO);
ASSERT(p_oCameraSO != NULL);
((DEV_ViewPort3D*)(GetDevice(lNum)->GetViewPort()))->ChangeCamera(p_oCameraSO);
GetParentFrame()->mfn_vUpdateDeviceToolBar();
}
else
MessageBox("No more Device");
}
void DEV_MultiDevice::OnCloseDevice()
{
GetFocusDevice()->SendMessage(WM_CLOSE, 0, 0);
GetParentFrame()->mfn_vUpdateDeviceToolBar();
}
void DEV_MultiDevice::OnCloseAllDevice()
{
for (int i = 1; i < MAX_DEVICE; i++)
if (IsActivDevice(i))
GetDevice(i)->SendMessage(WM_CLOSE, 0, 0);
GetParentFrame()->mfn_vUpdateDeviceToolBar();
}
#endif // ACTIVE_EDITOR
//===========================================================================
// Description: Create the ToolBar, the background Device, and the Light
// for displaying the world.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
int DEV_MultiDevice::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
#ifdef ACTIVE_EDITOR
CWnd::EnableToolTips(TRUE);
if (GetParent()->IsKindOf( RUNTIME_CLASS( FRMSplitter ) ))
{
GetParentFrame()->RecalcLayout();
}
else
{
ASSERT( GetParent()->IsKindOf( RUNTIME_CLASS( CFrameWnd ) ) );
((CFrameWnd *) GetParent())->RecalcLayout();
}
#else
GetParentFrame()->RecalcLayout();
#endif // ACTIVE_EDITOR
//
// Always create one Device on BackGround.
//
OnOpenDeviceBackground();
#ifndef ACTIVE_EDITOR
mActivDeviceAlone = TRUE;
#endif // ACTIVE_EDITOR
return 0;
}
#ifdef ACTIVE_EDITOR
//===========================================================================
// Description: Do an horizontal tile with all the device but the
// background one.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author: CB
//===========================================================================
void DEV_MultiDevice::OnDeviceTileHorz()
{
CRect stWinRect;
int nbDevice, i;
DEV_Device *a_p_oTabDevices[MAX_DEVICE];
int iHeight, iLastHeight;
GetClientRect(&stWinRect);
for(nbDevice = 0, i = 1; i <MAX_DEVICE; i++)
{
if(IsActivDevice(i))
a_p_oTabDevices[nbDevice++] = GetDevice(i);
}
if(nbDevice)
{
iHeight = stWinRect.bottom / nbDevice;
for(i = 0; i < nbDevice; i++)
{
iLastHeight = iHeight;
if(i == nbDevice - 1)
iHeight = stWinRect.bottom - (i * iLastHeight);
a_p_oTabDevices[i]->MoveWindow(0, i * iLastHeight, stWinRect.right, iHeight);
}
}
}
//===========================================================================
// Description: Do an vertical tile with all the device but the
// background one.
// Creation date: 26/07/96
// Author: LOL
//---------------------------------------------------------------------------
// Revision date:
// Author: CB
//===========================================================================
void DEV_MultiDevice::OnDeviceTileVert()
{
CRect stWinRect;
int nbDevice, i;
DEV_Device *a_p_oTabDevices[MAX_DEVICE];
int iWidth, iLastWidth;
GetClientRect(&stWinRect);
for(nbDevice = 0, i = 1; i <MAX_DEVICE; i++)
{
if(IsActivDevice(i))
a_p_oTabDevices[nbDevice++] = GetDevice(i);
}
if(nbDevice)
{
iWidth = stWinRect.right / nbDevice;
for(i = 0; i < nbDevice; i++)
{
iLastWidth = iWidth;
if(i == nbDevice - 1)
iWidth = stWinRect.right - (i * iLastWidth);
a_p_oTabDevices[i]->MoveWindow(i * iLastWidth, 0, iWidth, stWinRect.bottom);
}
}
}
//===========================================================================
// Description: Do an vertical tile with all the device but the
// background one.
// Creation date: 13/09/96
// Author: CB
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void DEV_MultiDevice::OnDeviceCascade()
{
CRect stWinRect;
int nbDevice, i, j, lj;
DEV_Device *a_p_oTabDevices[MAX_DEVICE];
int iWidth, iTotalWidth, iHeight, iTotalHeight;
GetClientRect(&stWinRect);
for(nbDevice = 0, i = 1; i <MAX_DEVICE; i++)
{
if(IsActivDevice(i))
a_p_oTabDevices[nbDevice++] = GetDevice(i);
}
if(nbDevice)
{
j = 0;
for(i = 0; i < nbDevice; i++)
{
iWidth = 3*(stWinRect.right / 4);
iHeight = 3*(stWinRect.bottom / 4);
iTotalWidth = (iWidth + (j * (DEV_YCaption*2)));
iTotalHeight = (iHeight + (j * (DEV_YCaption*2)));
lj = j;
if((iTotalWidth > stWinRect.right) || (iTotalHeight > stWinRect.bottom))
{
iWidth = stWinRect.right - (j * (DEV_YCaption*2));
iHeight = stWinRect.bottom - (j * (DEV_YCaption*2));
j = 0;
}
else
j++;
a_p_oTabDevices[i]->MoveWindow
(
lj * (DEV_YCaption*2),
lj * (DEV_YCaption*2),
iWidth,
iHeight
);
}
}
}
//===========================================================================
// Description: Maximize/Restore active device.
// background one.
// Creation date: 18/09/96
// Author: CB
//---------------------------------------------------------------------------
// Revision date:
// Author:
//===========================================================================
void DEV_MultiDevice::OnMaximizeDevice(void)
{
DEV_Device *p_oDevice = GetFocusDevice();
p_oDevice->SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0);
}
void DEV_MultiDevice::OnRestoreDevice(void)
{
DEV_Device *p_oDevice = GetFocusDevice();
p_oDevice->SendMessage(WM_SYSCOMMAND, SC_RESTORE, 0);
}
#endif // ACTIVE_EDITOR
//==========================================================================
//==========================================================================
void DEV_MultiDevice::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
RECT r;
CView::OnWindowPosChanged(lpwndpos);
GetClientRect(&r);
#ifdef ACTIVE_EDITOR
int i;
for(i = 0; i < MAX_DEVICE; i++)
{
if(IsActivDevice(i))
{
if(GetDevice(i)->IsMaximize())
GetDevice(i)->SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0);
}
}
#else
if (mActivDeviceAlone)
mDeviceAlone.SetWindowPos(&wndTop,r.left,r.top,r.right-r.left,r.bottom-r.top,0);
#endif // ACTIVE_EDITOR
}
//==========================================================================
void DEV_MultiDevice::OnDestroy()
{
#ifdef ACTIVE_EDITOR
if (m_cIsAdditional == 0)
#endif
{
M_GetMainApp()->m_bLeavingApplication = TRUE;
}
mbOnDestroy = TRUE;
CView::OnDestroy();
}
//==========================================================================
#ifdef ACTIVE_EDITOR
LONG DEV_MultiDevice::OnDrawObject(UINT, LONG)
{
DrawObject();
return 0;
}
LONG DEV_MultiDevice::OnDrawObjectExcept0(UINT, LONG)
{
DrawObjectExcept0();
return 0;
}
#endif // ACTIVE_EDITOR