/* ** Command & Conquer Generals Zero Hour(tm) ** Copyright 2025 Electronic Arts Inc. ** ** 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 . */ /* $Header: /Commando/Code/Tools/max2w3d/logdlg.cpp 5 11/07/00 5:40p Greg_h $ */ /*********************************************************************************************** *** Confidential - Westwood Studios *** *********************************************************************************************** * * * Project Name : Commando Tools - W3D export * * * * $Archive:: /Commando/Code/Tools/max2w3d/logdlg.cpp $* * * * $Author:: Greg_h $* * * * $Modtime:: 11/07/00 4:24p $* * * * $Revision:: 5 $* * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "logdlg.h" #include "resource.h" #include "dllmain.h" #include "w3dexp.h" #include "util.h" #include "rawfile.h" #include "units.h" /* ** Static functions */ static BOOL CALLBACK _logdata_dialog_proc(HWND Hwnd,UINT message,WPARAM wParam,LPARAM lParam); static DWORD WINAPI _logdata_thread_function(LPVOID log_obj_ptr); /*********************************************************************************************** * LogDataDialogClass::LogDataDialogClass -- constructor for the options dialog object * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 02/09/2000 JGA : Created. * *=============================================================================================*/ LogDataDialogClass::LogDataDialogClass(HWND parent): Hwnd(NULL), ParentHwnd(parent), buffer_index(0), last_buffer_index(0), status(0) { ThreadHandle = CreateThread(NULL, 0, _logdata_thread_function, (LPVOID)this, 0, &ThreadID); if (ThreadHandle) { while (status == 0) { // sync, wait for init } } } LogDataDialogClass::~LogDataDialogClass(void) { status = 3; if (::IsWindow(Hwnd)) { SendMessage( Hwnd, WM_CLOSE, 0, 0 ); } } /*********************************************************************************************** * LogDataDialogClass::printf -- handles doing printfs into the current log window * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 02/11/2000 JGA : Created. * *=============================================================================================*/ void LogDataDialogClass::printf(char *text, ...) { va_list arguments; va_start(arguments, text); } // printf void LogDataDialogClass::printf(char * text, const va_list & args) { static char string_buffer[256]; vsprintf(string_buffer, text, args); HWND ctrlHwnd = GetDlgItem(Hwnd, IDC_ANIM_LOG_RICHEDIT); SendMessage(ctrlHwnd, EM_SETSEL, -1, -1 ); SendMessage(ctrlHwnd, EM_REPLACESEL, FALSE, (long)string_buffer); last_buffer_index = buffer_index; buffer_index+=strlen(string_buffer); //int min,max,pos; //GetScrollRange(ctrlHwnd, SB_VERT, &min, &max); //pos = GetScrollPos(ctrlHwnd, SB_VERT); //if (pos == max) { SendMessage(GetDlgItem(Hwnd,IDC_ANIM_LOG_RICHEDIT), EM_SCROLLCARET, 0, 0); //} } /*********************************************************************************************** * LogDataDialogClass::rprintf -- replace last printf, with this new printf * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 02/14/2000 JGA : Created. * *=============================================================================================*/ void LogDataDialogClass::rprintf(char *text, ...) { va_list arguments; va_start(arguments, text); rprintf(text,arguments); } void LogDataDialogClass::rprintf(char *text, const va_list & args) { static char string_buffer[256]; vsprintf(string_buffer, text, args); HWND ctrlHwnd = GetDlgItem(Hwnd, IDC_ANIM_LOG_RICHEDIT); SendMessage(ctrlHwnd, EM_SETSEL, last_buffer_index, buffer_index ); SendMessage(ctrlHwnd, EM_REPLACESEL, FALSE, (long)string_buffer); buffer_index = strlen(string_buffer) + last_buffer_index; //int min,max,pos; //GetScrollRange(ctrlHwnd, SB_VERT, &min, &max); //pos = GetScrollPos(ctrlHwnd, SB_VERT); //SendMessage(GetDlgItem(Hwnd,IDC_ANIM_LOG_RICHEDIT), EM_SCROLLCARET, 0, 0); } // rprintf /*********************************************************************************************** * LogDataDialogClass::updatebar - send message to progress meter * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 02/14/2000 JGA : Created. * *=============================================================================================*/ void LogDataDialogClass::updatebar(float position, float total) { int pos; pos = ((position / total) * 100.0f); HWND ctrlHwnd = GetDlgItem(Hwnd, IDC_ANIM_COMPRESS_PROGRESS); SendMessage(ctrlHwnd, PBM_SETPOS, pos, 0 ); } // updatebar /*********************************************************************************************** * LogDataDialogClass::Wait_OK - Give user a chance to review log, then hit ok * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 02/14/2000 JGA : Created. * *=============================================================================================*/ void LogDataDialogClass::Wait_OK() { ::EnableWindow(GetDlgItem(Hwnd,IDOK),TRUE); ::SetForegroundWindow(Hwnd); while (status < 2) { // wait for the OK } } // Wait_OK /*********************************************************************************************** * LogDataDialogClass::Dialog_Proc -- Handles the windows message for the options dialog * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 07/24/1997 GH : Created. * *=============================================================================================*/ bool LogDataDialogClass::Dialog_Proc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM ) { int code = HIWORD(wParam); switch (message ) { /******************************************************************* * WM_INITDIALOG * * Initialize all of the custom controls for the dialog box * *******************************************************************/ case WM_INITDIALOG: Dialog_Init(); return TRUE; /******************************************************************* * WM_COMMAND * * *******************************************************************/ case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: status = 2; EndDialog(Hwnd, 1); Hwnd = NULL; return TRUE; break; } break; //case WM_VSCROLL: // return TRUE; // break; case WM_CLOSE: if (status >= 2) { EndDialog(Hwnd, 1); Hwnd = NULL; } return TRUE; break; } return FALSE; } // Dialog_Proc void LogDataDialogClass::Dialog_Init() { SetCursor(LoadCursor (NULL, IDC_ARROW)); RECT desktop; RECT ourwin; GetWindowRect(GetDesktopWindow(), &desktop); GetWindowRect(Hwnd, &ourwin); int sx,sy,cx,cy; sx = ourwin.right - ourwin.left; sy = ourwin.bottom - ourwin.top; cx = (((desktop.right - desktop.left) - sx)/2) + desktop.left; cy = (((desktop.bottom - desktop.top) - sy)/2) + desktop.top; //SetWindowPos(Hwnd, HWND_TOPMOST, cx, cy, 0, 0, SWP_NOSIZE); SetWindowPos(Hwnd, HWND_TOP, cx, cy, 0, 0, SWP_NOSIZE); EnableWindow(GetDlgItem(Hwnd,IDOK),FALSE); status = 1; // signal init } // Dialog_Init /*********************************************************************************************** * _logdata_dialog_proc -- thunks into the logdata dialog class's windows message handler * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 02/09/2000 JGA : Created. * *=============================================================================================*/ BOOL CALLBACK _logdata_dialog_proc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { if (message == WM_INITDIALOG) { LogDataDialogClass * log = (LogDataDialogClass *)lParam; log->Hwnd = hwnd; ::SetProp(hwnd,"LogDataDialogClass",(HANDLE)log); } LogDataDialogClass * log = (LogDataDialogClass *)::GetProp(hwnd,"LogDataDialogClass"); if (message == WM_DESTROY) { ::RemoveProp(hwnd,"LogDataDialogClass"); } if (log) { return log->Dialog_Proc(hwnd,message,wParam,lParam); } else { return FALSE; } } // _logdata_dialog_proc DWORD WINAPI _logdata_thread_function(LPVOID log_obj_ptr) { // put logdata dialog box (lpParameter is the "this" pointer of the object) DialogBoxParam( AppInstance, MAKEINTRESOURCE(IDD_W3D_LOG), ((LogDataDialogClass*)log_obj_ptr)->ParentHwnd, (DLGPROC) _logdata_dialog_proc, (LPARAM) log_obj_ptr); // When this exits it should terminate the thread return(0); } // EOF - logdlg.cpp