Descent3/legacy/editor/FloatingKeypadDialog.cpp
JeodC a4ab78192c Join license header with historical commentrs
Join the license header with historical comments using a separator so IDEs can correctly parse the initial header.

Also use .gitattributes to ensure all files are LF.
2024-05-08 14:41:19 -04:00

489 lines
14 KiB
C++

/*
* Descent 3
* Copyright (C) 2024 Parallax Software
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
--- HISTORICAL COMMENTS FOLLOW ---
* $Logfile: /DescentIII/Main/editor/FloatingKeypadDialog.cpp $
* $Revision: 1.1.1.1 $
* $Date: 2003-08-26 03:57:38 $
* $Author: kevinb $
*
* Floating keypad dialog
*
* $Log: not supported by cvs2svn $
*
* 3 9/17/97 12:58p Samir
* Got rid of Curve Keypad.
*
* 2 8/29/97 2:49p Samir
* Nuked SegmentKeypad.
*
* 14 6/27/97 12:18p Samir
* Added Room Keypad dialog.
*
* 13 6/05/97 3:37p Samir
* Added megacell keypad.
*
* 12 4/08/97 10:42a Jason
* implemented path following interface
*
* 11 4/04/97 3:15p Samir
* Added paths keypad, removed player keypad since it's joined with object
* keypad.
*
* 10 3/26/97 6:46p Samir
* Fixed order of tabs in dialog box.
*
* 9 3/20/97 11:55a Jason
* changes for terrain editing/drawing
*
* 8 3/18/97 12:16p Samir
* Keypad tab is set to correct selection now when initializing.
*
* 7 3/05/97 11:49a Samir
* Added doorway and terrain keypad tabs.
*
* 6 3/04/97 11:37a Samir
* Fixed goofup in tab ordering for trigger keypad.
*
* 5 2/20/97 6:05p Samir
* Allow for clean activation and deactivation of surfaces in editor when
* going into fullscreen mode.
*
* 4 2/19/97 2:14p Samir
* Added a RunKeypadFunction function.
*
* 3 2/17/97 11:31a Samir
* Tab now resizes if keypad dialog is resized.
*
* 2 1/23/97 4:16p Samir
* Saves width and height, position of floating keypad.
*
* $NoKeywords: $
*/
// FloatingKeypadDialog.cpp : implementation file
//
#include "stdafx.h"
#include "editor.h"
#include "TextureDialog.h"
#include "ObjectDialog.h"
#include "LightingDialog.h"
#include "TriggerDialog.h"
#include "DoorwayDialog.h"
#include "TerrainDialog.h"
#include "RoomKeypadDialog.h"
#include "PathPadDialog.h"
#include "MegacellKeypad.h"
#include "FloatingKeypadDialog.h"
#include "pserror.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFloatingKeypadDialog dialog
CFloatingKeypadDialog::CFloatingKeypadDialog(CWnd* pParent /*=NULL*/)
: CDialog(CFloatingKeypadDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CFloatingKeypadDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_Parent = pParent;
m_Initializing = FALSE;
m_KeypadTabDialog = NULL;
}
void CFloatingKeypadDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFloatingKeypadDialog)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BOOL CFloatingKeypadDialog::Create()
{
return CDialog::Create(CFloatingKeypadDialog::IDD, m_Parent);
}
void CFloatingKeypadDialog::RunKeypadFunction(int code)
{
if (m_KeypadTabDialog) m_KeypadTabDialog->RunKeypadFunction(code);
}
void CFloatingKeypadDialog::Activate()
{
if (m_KeypadTabDialog) m_KeypadTabDialog->Activate();
}
void CFloatingKeypadDialog::Deactivate()
{
if (m_KeypadTabDialog) m_KeypadTabDialog->Deactivate();
}
BEGIN_MESSAGE_MAP(CFloatingKeypadDialog, CDialog)
//{{AFX_MSG_MAP(CFloatingKeypadDialog)
ON_WM_SHOWWINDOW()
ON_WM_SIZE()
ON_WM_MOVE()
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFloatingKeypadDialog message handlers
void CFloatingKeypadDialog::OnCancel()
{
// We may force closing this dialog from the parent.
// DestroyWindow();
}
void CFloatingKeypadDialog::PostNcDestroy()
{
delete this;
}
BOOL CFloatingKeypadDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// Initialize keypad dialogs here.
CTabCtrl *tab_ctrl;
TC_ITEM tc_item;
tab_ctrl = (CTabCtrl *)GetDlgItem(IDC_FLOATING_KEYPAD_TAB);
// Add tabs to tabcontrol in the keypad dialog bar.
tc_item.mask = TCIF_TEXT;
tc_item.pszText = "Texture";
tc_item.cchTextMax = lstrlen(tc_item.pszText)+1;
tab_ctrl->InsertItem(TAB_TEXTURE_KEYPAD, &tc_item);
tc_item.mask = TCIF_TEXT;
tc_item.pszText = "Megacell";
tc_item.cchTextMax = lstrlen(tc_item.pszText)+1;
tab_ctrl->InsertItem(TAB_MEGACELL_KEYPAD, &tc_item);
tc_item.mask = TCIF_TEXT;
tc_item.pszText = "Terrain";
tc_item.cchTextMax = lstrlen(tc_item.pszText)+1;
tab_ctrl->InsertItem(TAB_TERRAIN_KEYPAD, &tc_item);
tc_item.mask = TCIF_TEXT;
tc_item.pszText = "Object";
tc_item.cchTextMax = lstrlen(tc_item.pszText)+1;
tab_ctrl->InsertItem(TAB_OBJECTS_KEYPAD, &tc_item);
tc_item.mask = TCIF_TEXT;
tc_item.pszText = "Room";
tc_item.cchTextMax = lstrlen(tc_item.pszText)+1;
tab_ctrl->InsertItem(TAB_ROOM_KEYPAD, &tc_item);
tc_item.mask = TCIF_TEXT;
tc_item.pszText = "Doorway";
tc_item.cchTextMax = lstrlen(tc_item.pszText)+1;
tab_ctrl->InsertItem(TAB_DOORWAY_KEYPAD, &tc_item);
tc_item.mask = TCIF_TEXT;
tc_item.pszText = "Trigger";
tc_item.cchTextMax = lstrlen(tc_item.pszText)+1;
tab_ctrl->InsertItem(TAB_TRIGGER_KEYPAD, &tc_item);
tc_item.mask = TCIF_TEXT;
tc_item.pszText = "Lighting";
tc_item.cchTextMax = lstrlen(tc_item.pszText)+1;
tab_ctrl->InsertItem(TAB_LIGHTING_KEYPAD, &tc_item);
tc_item.mask = TCIF_TEXT;
tc_item.pszText = "Paths";
tc_item.cchTextMax = lstrlen(tc_item.pszText)+1;
tab_ctrl->InsertItem(TAB_PATHS_KEYPAD, &tc_item);
// fit keypad dialogs in tab control
RECT tab_rect, tab_winrect;
int tx, ty, tw, th;
tab_ctrl->GetWindowRect(&tab_winrect);
::CopyRect(&tab_rect, &tab_winrect);
tab_ctrl->AdjustRect(FALSE, &tab_rect);
tx = tab_rect.left - tab_winrect.left;
ty = tab_rect.top - tab_winrect.top;
tw = tab_rect.right - tab_rect.left;
th = tab_rect.bottom - tab_rect.top;
// Create tab dialogs
// resize them to fit the tab control
// set scroll bars accordingly
m_TextureDialog = new CTextureDialog(tab_ctrl);
m_TextureDialog->Create();
m_TextureDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_MegacellKeypad = new CMegacellKeypad(tab_ctrl);
m_MegacellKeypad->Create();
m_MegacellKeypad->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_ObjectDialog = new CObjectDialog(tab_ctrl);
m_ObjectDialog->Create();
m_ObjectDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_LightingDialog = new CLightingDialog(tab_ctrl);
m_LightingDialog->Create();
m_LightingDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_RoomDialog = new CRoomKeypadDialog(tab_ctrl);
m_RoomDialog->Create();
m_RoomDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_TriggerDialog = new CTriggerDialog(tab_ctrl);
m_TriggerDialog->Create();
m_TriggerDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_DoorwayDialog = new CDoorwayDialog(tab_ctrl);
m_DoorwayDialog->Create();
m_DoorwayDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_TerrainDialog = new CTerrainDialog(tab_ctrl);
m_TerrainDialog->Create();
m_TerrainDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_PathPadDialog = new CPathPadDialog(tab_ctrl);
m_PathPadDialog->Create();
m_PathPadDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
// Display current tab dialog
switch (D3EditState.keypad_current)
{
case TAB_TEXTURE_KEYPAD: m_KeypadTabDialog = m_TextureDialog; break;
case TAB_OBJECTS_KEYPAD: m_KeypadTabDialog = m_ObjectDialog; break;
case TAB_LIGHTING_KEYPAD: m_KeypadTabDialog = m_LightingDialog; break;
case TAB_ROOM_KEYPAD: m_KeypadTabDialog = m_RoomDialog; break;
case TAB_PATHS_KEYPAD: m_KeypadTabDialog = m_PathPadDialog; break;
case TAB_TRIGGER_KEYPAD: m_KeypadTabDialog = m_TriggerDialog; break;
case TAB_DOORWAY_KEYPAD: m_KeypadTabDialog = m_DoorwayDialog; break;
case TAB_TERRAIN_KEYPAD: m_KeypadTabDialog = m_TerrainDialog; break;
case TAB_MEGACELL_KEYPAD: m_KeypadTabDialog = m_MegacellKeypad; break;
default: Int3();
}
tab_ctrl->SetCurSel(D3EditState.keypad_current);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CFloatingKeypadDialog::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
m_Initializing = FALSE;
if (bShow) m_KeypadTabDialog->ShowWindow(SW_SHOW);
}
BOOL CFloatingKeypadDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: Add your specialized code here and/or call the base class
// Perform notification requests on the keypad tab dialog bar and other
// custom control bars.
NMHDR *nmhdr;
assert(lParam != 0);
nmhdr = (NMHDR *)lParam;
switch (wParam)
{
case IDC_FLOATING_KEYPAD_TAB:
DoKeypadTabNotify(nmhdr);
break;
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
void CFloatingKeypadDialog::DoKeypadTabNotify(NMHDR *nmhdr)
{
CTabCtrl *tab_ctrl;
tab_ctrl = (CTabCtrl *)GetDlgItem(IDC_FLOATING_KEYPAD_TAB);
switch (nmhdr->code)
{
case TCN_SELCHANGE:
// Tab control changed. So update the controls currently displayed.
D3EditState.keypad_current = (int)tab_ctrl->GetCurSel();
assert(D3EditState.keypad_current > -1);
switch (D3EditState.keypad_current)
{
case TAB_TEXTURE_KEYPAD:
if (m_KeypadTabDialog) m_KeypadTabDialog->ShowWindow(SW_HIDE);
m_KeypadTabDialog = m_TextureDialog;
m_KeypadTabDialog->ShowWindow(SW_SHOW);
break;
case TAB_OBJECTS_KEYPAD:
if (m_KeypadTabDialog) m_KeypadTabDialog->ShowWindow(SW_HIDE);
m_KeypadTabDialog = m_ObjectDialog;
m_KeypadTabDialog->ShowWindow(SW_SHOW);
break;
case TAB_LIGHTING_KEYPAD:
if (m_KeypadTabDialog) m_KeypadTabDialog->ShowWindow(SW_HIDE);
m_KeypadTabDialog = m_LightingDialog;
m_KeypadTabDialog->ShowWindow(SW_SHOW);
break;
case TAB_ROOM_KEYPAD:
if (m_KeypadTabDialog) m_KeypadTabDialog->ShowWindow(SW_HIDE);
m_KeypadTabDialog = m_RoomDialog;
m_KeypadTabDialog->ShowWindow(SW_SHOW);
break;
case TAB_PATHS_KEYPAD:
if (m_KeypadTabDialog) m_KeypadTabDialog->ShowWindow(SW_HIDE);
m_KeypadTabDialog = m_PathPadDialog;
m_KeypadTabDialog->ShowWindow(SW_SHOW);
break;
case TAB_TRIGGER_KEYPAD:
if (m_KeypadTabDialog) m_KeypadTabDialog->ShowWindow(SW_HIDE);
m_KeypadTabDialog = m_TriggerDialog;
m_KeypadTabDialog->ShowWindow(SW_SHOW);
break;
case TAB_DOORWAY_KEYPAD:
if (m_KeypadTabDialog) m_KeypadTabDialog->ShowWindow(SW_HIDE);
m_KeypadTabDialog = m_DoorwayDialog;
m_KeypadTabDialog->ShowWindow(SW_SHOW);
break;
case TAB_TERRAIN_KEYPAD:
if (m_KeypadTabDialog) m_KeypadTabDialog->ShowWindow(SW_HIDE);
m_KeypadTabDialog = m_TerrainDialog;
m_KeypadTabDialog->ShowWindow(SW_SHOW);
break;
case TAB_MEGACELL_KEYPAD:
if (m_KeypadTabDialog) m_KeypadTabDialog->ShowWindow(SW_HIDE);
m_KeypadTabDialog = m_MegacellKeypad;
m_KeypadTabDialog->ShowWindow(SW_SHOW);
break;
}
break;
}
}
void CFloatingKeypadDialog::OnSize(UINT nType, int cx, int cy)
{
RECT rect;
CTabCtrl *tab_ctrl;
CDialog::OnSize(nType, cx, cy);
if (m_Initializing) return;
SetRect(&rect, 0,0,cx,cy);
::AdjustWindowRect(&rect, GetStyle(), FALSE);
D3EditState.float_keypad_w = rect.right-rect.left;
D3EditState.float_keypad_h = rect.bottom - rect.top;
SetWindowPos(&wndTopMost, 0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);
// Resize tab to fit current modeless dialog size
RECT tab_rect, tab_winrect;
int tx, ty, tw, th;
tab_ctrl = (CTabCtrl *)GetDlgItem(IDC_FLOATING_KEYPAD_TAB);
GetClientRect(&tab_rect);
tab_ctrl->MoveWindow(&tab_rect);
tab_ctrl->GetWindowRect(&tab_winrect);
::CopyRect(&tab_rect, &tab_winrect);
tab_ctrl->AdjustRect(FALSE, &tab_rect);
tx = tab_rect.left - tab_winrect.left;
ty = tab_rect.top - tab_winrect.top;
tw = tab_rect.right - tab_rect.left;
th = tab_rect.bottom - tab_rect.top;
m_TextureDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_ObjectDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_LightingDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_RoomDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_PathPadDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_TriggerDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_DoorwayDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_TerrainDialog->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
m_MegacellKeypad->SetWindowPos(tab_ctrl, tx, ty, tw, th, SWP_NOZORDER);
}
void CFloatingKeypadDialog::OnMove(int x, int y)
{
CDialog::OnMove(x, y);
// TODO: Add your message handler code here
// if we haven't placed this dialog anywhere, wait till parent does it for us.
if (m_Initializing) return;
RECT rect;
GetWindowRect(&rect);
GetParent()->ScreenToClient(&rect);
D3EditState.float_keypad_x = rect.left;
D3EditState.float_keypad_y = rect.top;
SetWindowPos(&wndTopMost, 0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);
}
int CFloatingKeypadDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_Initializing = TRUE;
return 0;
}