povray/windows/pvdialog.cpp
2013-11-06 13:07:19 -05:00

979 lines
37 KiB
C++

/*******************************************************************************
* pvdialog.cpp
*
* This module implements dialog-box routines for the Windows build of POV.
*
* Author: Christopher J. Cason.
*
* ---------------------------------------------------------------------------
* Persistence of Vision Ray Tracer ('POV-Ray') version 3.7.
* Copyright 1991-2013 Persistence of Vision Raytracer Pty. Ltd.
*
* POV-Ray is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* POV-Ray 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* ---------------------------------------------------------------------------
* POV-Ray is based on the popular DKB raytracer version 2.12.
* DKBTrace was originally written by David K. Buck.
* DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
* ---------------------------------------------------------------------------
* $File: //depot/public/povray/3.x/windows/pvdialog.cpp $
* $Revision: #1 $
* $Change: 6069 $
* $DateTime: 2013/11/06 11:59:40 $
* $Author: chrisc $
*******************************************************************************/
#define POVWIN_FILE
#define _WIN32_IE COMMONCTRL_VERSION
#include <windows.h>
#include <commdlg.h>
#include <commctrl.h>
#include <htmlhelp.h>
#include <setjmp.h>
#include <string.h>
#include "pvengine.h"
#include "resource.h"
#include "pvedit.h"
#include "pvguiext.h"
#include "pvdisplay.h"
#include "pvdialog.h"
// this must be the last file included
#include "syspovdebug.h"
namespace povwin
{
bool otaChecked ;
const char *otaTitle ;
const char *otaText ;
const char *otaHelpString ;
extern int listbox_ychar ;
extern int tb_combo_sel ;
extern char engineHelpPath [_MAX_PATH] ;
extern char lastRenderName [_MAX_PATH] ;
extern char lastRenderPath [_MAX_PATH] ;
extern char lastBitmapPath [_MAX_PATH] ;
extern char lastQueuePath [_MAX_PATH] ;
extern char lastSecondaryIniFilePath [_MAX_PATH] ;
extern char DefaultRenderIniFileName [_MAX_PATH] ;
extern char SecondaryRenderIniFileName [_MAX_PATH] ;
extern char RegionStr [128] ;
extern char TempRegionStr [128] ;
extern char command_line [_MAX_PATH * 3] ;
extern char old_command_line [_MAX_PATH * 3] ;
extern char SecondaryRenderIniFileSection [64] ;
extern char source_file_name [_MAX_PATH] ;
extern char render_complete_sound [_MAX_PATH] ;
extern char parse_error_sound [_MAX_PATH] ;
extern char render_error_sound [_MAX_PATH] ;
extern char queued_files [MAX_QUEUE] [_MAX_PATH] ;
extern bool IsW95UserInterface ;
extern bool use_editors;
extern bool running_demo ;
extern bool render_complete_sound_enabled ;
extern bool parse_error_sound_enabled ;
extern bool render_error_sound_enabled ;
extern HWND render_window ;
extern HWND toolbar_window ;
extern HWND aux_toolbar_window ;
extern HWND window_list [MAX_WINDOWS] ;
extern HWND toolbar_combobox ;
extern HWND rebar_window ;
extern HWND StatusWindow ;
extern HWND toolbar_cmdline ;
extern HWND tab_window ;
extern HWND main_window ;
extern HMENU hMainMenu ;
extern unsigned screen_width ;
extern unsigned screen_height ;
extern unsigned renderwin_8bits ;
extern unsigned auto_render ;
extern unsigned queued_file_count ;
extern unsigned ThreadCount ;
extern HH_AKLINK hh_aklink ;
// include prototype here to avoid the need to include commdlg.h in all files
extern void init_ofn (OPENFILENAME *ofn, HWND hWnd, char *title, char *name, int maxlen, char *lastPath, char *defaultExt);
char *GetINIFile (HWND hWnd, char *path)
{
int result ;
OPENFILENAME ofnTemp ;
static char name [_MAX_PATH] ;
validatePath (path) ;
init_ofn (&ofnTemp, hWnd, "Choose INI File", name, sizeof (name), path, "ini") ;
ofnTemp.lpstrFilter = "INI files (*.ini)\0*.ini\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0" ;
if ((result = GetOpenFileName (&ofnTemp)) != 0)
{
strcpy (path, name) ;
path [ofnTemp.nFileOffset - 1] = '\0' ;
}
return (result ? name : NULL) ;
}
void AddQueue (HWND hWnd, HWND hlb)
{
int queue_count ;
char name [8192] ;
char *s ;
char str [_MAX_PATH] ;
OPENFILENAME ofnTemp ;
queue_count = SendMessage (hlb, LB_GETCOUNT, 0, 0) ;
if (queue_count >= MAX_QUEUE)
{
PovMessageBox ("File queue is full", "Cannot add any more files!") ;
return ;
}
strcpy (name, lastRenderName) ;
name [strlen (name) + 1] = '\0' ;
validatePath (lastQueuePath) ;
init_ofn (&ofnTemp, hWnd, "Add to Queue", name, sizeof (name), lastQueuePath, "pov") ;
ofnTemp.lpstrFilter = "POV source and INI (*.pov;*.ini)\0*.pov;*.ini\0POV files (*.pov)\0*.pov\0INI files (*.ini)\0*.ini\0All Files (*.*)\0*.*\0" ;
ofnTemp.Flags |= OFN_ALLOWMULTISELECT ;
if (GetOpenFileName (&ofnTemp) != false)
{
// convert spaces into NULL's if we're not using the new interface so it works with the below code
if (!IsW95UserInterface)
for (s = name ; *s ; s++)
if (*s == ' ')
*s = '\0' ;
if (ofnTemp.nFileOffset < strlen (name))
{
strcpy (lastQueuePath, name) ;
lastQueuePath [ofnTemp.nFileOffset - 1] = '\0' ;
SendMessage (hlb, LB_ADDSTRING, 0, (LPARAM) name) ;
}
else
{
s = name ;
strcpy (lastQueuePath, name) ;
for (s += strlen (s) + 1 ; *s ; s += strlen (s) + 1)
{
if (queue_count++ >= MAX_QUEUE)
{
PovMessageBox ("File queue is full", "Cannot add any more files!") ;
return ;
}
joinPath (str, lastQueuePath, s) ;
_strlwr (str) ;
SendMessage (hlb, LB_ADDSTRING, 0, (LPARAM) str) ;
}
}
}
}
char *SelectSound (HWND hWnd, char *currentSound)
{
int result ;
char path [_MAX_PATH] ;
static char name [_MAX_PATH] ;
OPENFILENAME ofnTemp ;
splitpath (currentSound, path, name) ;
validatePath (path) ;
init_ofn (&ofnTemp, hWnd, "Select Sound File", name, sizeof (name), path, "wav") ;
ofnTemp.Flags &= ~OFN_HIDEREADONLY ;
ofnTemp.lpstrFilter = "Sound Files (*.wav)\0*.wav\0All Files (*.*)\0*.*\0" ;
if ((result = GetOpenFileName (&ofnTemp)) != 0)
return (name) ;
return (NULL) ;
}
SIZE *GetTextExtent (HWND hWnd, LPCSTR text)
{
int result ;
HDC hDC ;
HFONT hFont = (HFONT) SendMessage (hWnd, WM_GETFONT, 0, 0) ;
static SIZE extent ;
if (hFont == NULL)
return (0) ;
hDC = GetDC (hWnd) ;
HFONT hOldFont = (HFONT) SelectObject (hDC, hFont);
result = GetTextExtentPoint32 (hDC, text, (int) strlen(text), &extent) ;
SelectObject (hDC, hOldFont) ;
ReleaseDC (hWnd, hDC) ;
if (!result)
return (0) ;
return (&extent) ;
}
int GetTextWidth (HWND hWnd, LPCSTR text)
{
int width = 0;
int result = 0;
SIZE extent;
HDC hDC ;
HFONT hFont = (HFONT) SendMessage (hWnd, WM_GETFONT, 0, 0) ;
const char *s;
if (hFont == NULL)
return (0) ;
hDC = GetDC (hWnd) ;
HFONT hOldFont = (HFONT) SelectObject (hDC, hFont);
while (strlen(text) > 0)
{
if ((s = strchr(text, '\n')) == NULL)
s = text + strlen(text) - 1;
if ((result = GetTextExtentPoint32 (hDC, text, (int) (s - text), &extent)) == 0)
return -1;
text = s + 1;
if (extent.cx > width)
width = extent.cx;
}
SelectObject (hDC, hOldFont) ;
ReleaseDC (hWnd, hDC) ;
return width;
}
void NudgeChildWindow (HWND hDlg, int idItem, int pixels)
{
RECT rect ;
HWND hWnd ;
hWnd = GetDlgItem (hDlg, idItem) ;
GetWindowRect (hWnd, &rect) ;
ScreenToClient (hDlg, (LPPOINT) &rect) ;
SetWindowPos (hWnd, NULL, rect.left + pixels, rect.top, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER) ;
}
INT_PTR CALLBACK PovCommandLineDialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
char *s ;
char str [_MAX_PATH * 2] ;
char str1 [_MAX_PATH] ;
char str2 [_MAX_PATH] ;
static char editINIname [_MAX_PATH] ;
static char editFilename [_MAX_PATH] ;
static char lastIniFilename [_MAX_PATH] ;
static bool had_region = false ;
static struct stat statbuf1 ;
static struct stat statbuf2 ;
switch (message)
{
case WM_INITDIALOG :
had_region = false ;
hh_aklink.pszKeywords = "command-line options" ;
if (use_editors)
{
if ((EditGetFlags () & EDIT_MSG_SELECTED) == 0)
{
if ((s = EditGetFilename(false)) != NULL)
{
EnableWindow (GetDlgItem (hDlg, IDC_PRESETSOURCEPATH), false) ;
EnableWindow (GetDlgItem (hDlg, IDC_PRESETSOURCENAME), false) ;
EnableWindow (GetDlgItem (hDlg, IDC_SOURCEDEFAULT), false) ;
EnableWindow (GetDlgItem (hDlg, IDC_BROWSESOURCEFILE), false) ;
EnableWindow (GetDlgItem (hDlg, IDC_EDITRENDER), false) ;
splitpath (s, lastRenderPath, lastRenderName) ;
EnableWindow (GetDlgItem (hDlg, IDC_EDITRENDER), false) ;
}
}
SetDlgItemText (hDlg, IDC_PRESETSOURCEPATH, lastRenderPath) ;
SetDlgItemText (hDlg, IDC_PRESETSOURCENAME, lastRenderName) ;
}
else
{
SetDlgItemText (hDlg, IDC_PRESETSOURCEPATH, lastRenderPath) ;
SetDlgItemText (hDlg, IDC_PRESETSOURCENAME, lastRenderName) ;
EnableWindow (GetDlgItem (hDlg, IDC_EDITRENDER), false) ;
EnableWindow (GetDlgItem (hDlg, IDC_EDITINI), false) ;
}
SendDlgItemMessage (hDlg, IDC_PRESETSOURCENAME, EM_LIMITTEXT, 64, 0L) ;
SendDlgItemMessage (hDlg, IDC_INIFILENAME, EM_LIMITTEXT, 64, 0L) ;
_strupr (SecondaryRenderIniFileName) ;
validatePath (lastRenderPath) ;
CenterWindowRelative ((HWND) lParam, hDlg, true, true) ;
FitWindowInWindow (NULL, hDlg) ;
if (strlen (TempRegionStr))
{
if (strlen (command_line))
{
strcpy (str, command_line) ;
strcat (str, TempRegionStr) ;
}
else
strcpy (str, TempRegionStr + 1) ;
strcpy (RegionStr, TempRegionStr) ;
TempRegionStr [0] = '\0' ;
SetDlgItemText (hDlg, IDC_COMMANDLINE, str) ;
}
else
{
SetDlgItemText (hDlg, IDC_COMMANDLINE, command_line) ;
if (RegionStr [0])
if (strstr (command_line, RegionStr + 1) != NULL)
had_region = true ;
}
if (SecondaryRenderIniFileName [0] != '\0')
{
if (!hasTrailingPathSeparator(SecondaryRenderIniFileName))
{
splitpath (SecondaryRenderIniFileName, str1, str2) ;
validatePath (str1) ;
strcpy (editINIname, str2) ;
SetDlgItemText (hDlg, IDC_INIFILEPATH, str1) ;
SetDlgItemText (hDlg, IDC_INIFILENAME, str2) ;
extract_ini_sections (SecondaryRenderIniFileName, GetDlgItem (hDlg, IDC_INIFILESECTION)) ;
SendMessage (toolbar_combobox, CB_GETLBTEXT, SendMessage (toolbar_combobox, CB_GETCURSEL, 0, 0), (LPARAM) SecondaryRenderIniFileSection) ;
SendDlgItemMessage (hDlg, IDC_INIFILESECTION, CB_SELECTSTRING, -1, (LPARAM) SecondaryRenderIniFileSection) ;
strcpy (lastIniFilename, SecondaryRenderIniFileName) ;
stat (SecondaryRenderIniFileName, &statbuf1) ;
}
else
SetDlgItemText (hDlg, IDC_INIFILEPATH, SecondaryRenderIniFileName) ;
}
SetFocus (GetDlgItem (hDlg, IDC_COMMANDLINE)) ;
return (false) ;
case WM_CTLCOLORBTN:
case WM_CTLCOLORDLG:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORLISTBOX:
case WM_CTLCOLORSCROLLBAR:
case WM_CTLCOLORSTATIC:
return (DefWindowProc (hDlg, message, wParam, lParam)) ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDC_INIFILESECTION :
if (HIWORD (wParam) == CBN_SETFOCUS)
{
stat (lastIniFilename, &statbuf2) ;
if (statbuf1.st_atime != statbuf2.st_atime)
{
statbuf1 = statbuf2 ;
GetDlgItemText (hDlg, IDC_INIFILESECTION, str, sizeof (str)) ;
extract_ini_sections (lastIniFilename, GetDlgItem (hDlg, IDC_INIFILESECTION)) ;
SendDlgItemMessage (hDlg, IDC_INIFILESECTION, CB_SELECTSTRING, -1, (LPARAM) str) ;
}
return (true) ;
}
return (false) ;
case IDC_EDITRENDER :
GetDlgItemText (hDlg, IDC_PRESETSOURCEPATH, str1, sizeof (str1)) ;
GetDlgItemText (hDlg, IDC_PRESETSOURCENAME, str2, sizeof (str2)) ;
validatePath (str1) ;
strcat (str1, "\\") ;
strcat (str1, str2) ;
if (EditOpenFile (str1))
{
EndDialog (hDlg, false) ;
return (true) ;
}
return (true) ;
case IDC_EDITINI :
GetDlgItemText (hDlg, IDC_INIFILEPATH, str1, sizeof (str1)) ;
GetDlgItemText (hDlg, IDC_INIFILENAME, str2, sizeof (str2)) ;
validatePath (str1) ;
strcat (str1, "\\") ;
strcat (str1, str2) ;
if (EditOpenFile (str1))
{
EndDialog (hDlg, false) ;
return (true) ;
}
return (true) ;
case IDC_BROWSEINIFILE :
if ((s = GetINIFile (hDlg, lastSecondaryIniFilePath)) != NULL)
{
_strupr (s) ;
splitpath (s, str1, str2) ;
validatePath (str1) ;
SetDlgItemText (hDlg, IDC_INIFILEPATH, str1) ;
SetDlgItemText (hDlg, IDC_INIFILENAME, str2) ;
if (strcmp (s, lastIniFilename))
{
extract_ini_sections (s, GetDlgItem (hDlg, IDC_INIFILESECTION)) ;
strcpy (lastIniFilename, s) ;
stat (lastIniFilename, &statbuf1) ;
}
}
return (true) ;
case IDC_INIFILENAME :
if (HIWORD (wParam) == EN_KILLFOCUS)
{
GetDlgItemText (hDlg, IDC_INIFILEPATH, str1, sizeof (str1)) ;
GetDlgItemText (hDlg, IDC_INIFILENAME, str2, sizeof (str2)) ;
validatePath (str1) ;
joinPath (str, str1, str2) ;
if (_stricmp (str, lastIniFilename))
{
extract_ini_sections (str, GetDlgItem (hDlg, IDC_INIFILESECTION)) ;
strcpy (lastIniFilename, str) ;
}
return (true) ;
}
if (HIWORD (wParam) == EN_UPDATE)
{
GetDlgItemText (hDlg, IDC_INIFILENAME, str, sizeof (str)) ;
if (strchr (str, '\\') != NULL) // TODO FIXME - shouldn't we also reject '/' and strings starting drive letter?
SetDlgItemText (hDlg, IDC_INIFILENAME, editINIname) ;
else
strcpy (editINIname, str) ;
}
return (true) ;
case IDC_RESETINI :
SetDlgItemText (hDlg, IDC_INIFILENAME, "") ;
GetDlgItemText (hDlg, IDC_INIFILEPATH, lastIniFilename, sizeof (lastIniFilename)) ;
SendMessage (GetDlgItem (hDlg, IDC_INIFILESECTION), CB_RESETCONTENT, 0, 0L) ;
return (true) ;
case IDC_INIDEFAULT :
sprintf (str, "%sini", DocumentsPath) ;
SetDlgItemText (hDlg, IDC_INIFILEPATH, str) ;
SetDlgItemText (hDlg, IDC_INIFILENAME, "quickres.ini") ;
SendMessage (hDlg, WM_COMMAND, (EN_KILLFOCUS << 16) | IDC_INIFILENAME, 0L) ;
return (true) ;
case IDC_PRESETSOURCENAME :
if (HIWORD (wParam) == EN_UPDATE)
{
GetDlgItemText (hDlg, IDC_PRESETSOURCENAME, str, sizeof (str)) ;
if (strchr (str, '\\') != NULL) // TODO FIXME - shouldn't we also reject '/' and strings starting drive letter?
SetDlgItemText (hDlg, IDC_PRESETSOURCENAME, editFilename) ;
else
strcpy (editFilename, str) ;
}
return (true) ;
case IDC_BROWSESOURCEFILE :
if ((s = file_open (hDlg)) != NULL)
{
splitpath (s, str1, str2) ;
validatePath (str1) ;
SetDlgItemText (hDlg, IDC_PRESETSOURCEPATH, str1) ;
SetDlgItemText (hDlg, IDC_PRESETSOURCENAME, str2) ;
}
return (true) ;
case IDC_SOURCEDEFAULT :
sprintf (str, "%sScenes\\advanced", DocumentsPath) ;
SetDlgItemText (hDlg, IDC_PRESETSOURCEPATH, str) ;
SetDlgItemText (hDlg, IDC_PRESETSOURCENAME, "Biscuit.pov") ;
return (true) ;
case IDC_SET :
case IDC_RENDER :
case IDC_RENDERa: // IDC_RENDERa is defined because the render dialog
// has 2 render buttons on it, and VC++ complains
if (!running_demo)
{
GetDlgItemText (hDlg, IDC_PRESETSOURCEPATH, lastRenderPath, sizeof (lastRenderPath)) ;
GetDlgItemText (hDlg, IDC_PRESETSOURCENAME, lastRenderName, sizeof (lastRenderName)) ;
validatePath (lastRenderPath) ;
// _strupr (lastRenderPath) ;
// _strupr (lastRenderName) ;
joinPath (source_file_name, lastRenderPath, lastRenderName) ;
}
GetDlgItemText (hDlg, IDC_INIFILEPATH, str1, sizeof (str1)) ;
GetDlgItemText (hDlg, IDC_INIFILENAME, str2, sizeof (str2)) ;
validatePath (str1) ;
strcpy (lastSecondaryIniFilePath, str1) ;
joinPath (SecondaryRenderIniFileName, str1, str2) ;
_strupr (SecondaryRenderIniFileName) ;
GetDlgItemText (hDlg, IDC_INIFILESECTION, SecondaryRenderIniFileSection, sizeof (SecondaryRenderIniFileSection)) ;
GetDlgItemText (hDlg, IDC_COMMANDLINE, command_line, sizeof (command_line)) ;
SendMessage (toolbar_cmdline, WM_SETTEXT, 0, (LPARAM) command_line) ;
extract_ini_sections_ex (SecondaryRenderIniFileName, toolbar_combobox) ;
SendMessage (toolbar_combobox, CB_ADDSTRING, 0, (LPARAM) "More Resolutions ...") ;
tb_combo_sel = select_combo_item_ex (toolbar_combobox, SecondaryRenderIniFileSection) ;
if (tb_combo_sel == -1)
tb_combo_sel = 0 ;
// was there a region string on the command line before it was edited ?
if (had_region)
{
// if so, is it still there now, in an unchanged form ?
// (we look at RegionStr + 1 since they always start with a space).
if (strstr (command_line, RegionStr + 1) == NULL)
{
// it's not, so we remove the region string.
RegionStr [0] = '\0' ;
}
}
if (LOWORD (wParam) == IDC_RENDER || LOWORD(wParam) == IDC_RENDERa)
{
if (EditSaveModified (NULL) == 0)
return (true) ;
EndDialog (hDlg, true) ;
}
else
EndDialog (hDlg, false) ;
return (true) ;
case IDC_COMMANDHELP :
hh_aklink.pszKeywords = "command-line dialog" ;
HtmlHelp (NULL, engineHelpPath, HH_KEYWORD_LOOKUP, (DWORD_PTR) &hh_aklink) ;
return (true) ;
case IDCANCEL :
EndDialog (hDlg, false) ;
return (true) ;
}
break ;
}
return (false) ;
}
INT_PTR CALLBACK PovShortCommandLineDialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static bool had_region = false ;
switch (message)
{
case WM_INITDIALOG :
had_region = false ;
hh_aklink.pszKeywords = "command-line options" ;
CenterWindowRelative ((HWND) lParam, hDlg, true, true) ;
FitWindowInWindow (NULL, hDlg) ;
SetDlgItemText (hDlg, IDC_COMMANDLINE, command_line) ;
if (RegionStr [0])
if (strstr (command_line, RegionStr + 1) != NULL)
had_region = true ;
return (true) ;
case WM_CTLCOLORBTN:
case WM_CTLCOLORDLG:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORLISTBOX:
case WM_CTLCOLORSCROLLBAR:
case WM_CTLCOLORSTATIC:
return (DefWindowProc (hDlg, message, wParam, lParam));
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDC_RENDER :
case IDC_RENDERa:
GetDlgItemText (hDlg, IDC_COMMANDLINE, command_line, sizeof (command_line) - 1) ;
SendMessage (toolbar_cmdline, WM_SETTEXT, 0, (LPARAM) command_line) ;
// was there a region string on the command line before it was edited ?
if (had_region)
{
// if so, is it still there now, in an unchanged form ?
// (we look at RegionStr + 1 since they always start with a space).
if (strstr (command_line, RegionStr + 1) == NULL)
{
// it's not, so we remove the region string.
RegionStr [0] = '\0' ;
}
}
if (LOWORD (wParam) == IDC_RENDER || LOWORD(wParam) == IDC_RENDERa)
{
if (EditSaveModified (NULL) == 0)
return (true) ;
EndDialog (hDlg, true) ;
}
else
EndDialog (hDlg, false) ;
return (true) ;
case IDCANCEL :
EndDialog (hDlg, false) ;
return (true) ;
}
break ;
}
return (false) ;
}
INT_PTR CALLBACK PovFileQueueDialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int i ;
char str [64] ;
HWND hlb ;
DRAWITEMSTRUCT *d ;
MEASUREITEMSTRUCT *m ;
static HBRUSH hbr ;
switch (message)
{
case WM_INITDIALOG :
hh_aklink.pszKeywords = "File Queue" ;
CenterWindowRelative ((HWND) lParam, hDlg, true, true) ;
FitWindowInWindow (NULL, hDlg) ;
hlb = GetDlgItem (hDlg, IDC_FILEQUEUE) ;
hbr = CreateSolidBrush (GetSysColor (COLOR_BTNFACE)) ;
for (i = 0 ; i < queued_file_count ; i++)
SendMessage (hlb, LB_ADDSTRING, 0, (LPARAM) queued_files [i]) ;
sprintf (str, "Queue has %d entr%s", queued_file_count, queued_file_count != 1 ? "ies" : "y") ;
SetDlgItemText (hDlg, IDC_QUEUEENTRIES, str) ;
CheckDlgButton (hDlg, IDC_RELOADQUEUE, GetHKCU("FileQueue", "ReloadOnStartup", 0)) ;
CheckDlgButton (hDlg, IDC_AUTORENDER, auto_render) ;
return (true) ;
case WM_CTLCOLORBTN:
case WM_CTLCOLORDLG:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORLISTBOX:
case WM_CTLCOLORSCROLLBAR:
case WM_CTLCOLORSTATIC:
return(DefWindowProc(hDlg, message, wParam, lParam));
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
hlb = GetDlgItem (hDlg, IDC_FILEQUEUE) ;
queued_file_count = SendMessage (hlb, LB_GETCOUNT, 0, 0) ;
if (queued_file_count > MAX_QUEUE)
queued_file_count = MAX_QUEUE ;
for (i = 0 ; i < queued_file_count ; i++)
SendMessage (hlb, LB_GETTEXT, i, (LPARAM) queued_files [i]) ;
auto_render = IsDlgButtonChecked (hDlg, IDC_AUTORENDER) ;
PVCheckMenuItem (CM_AUTORENDER, auto_render ? MF_CHECKED : MF_UNCHECKED) ;
PutHKCU ("FileQueue", "ReloadOnStartup", IsDlgButtonChecked (hDlg, IDC_RELOADQUEUE)) ;
update_queue_status (true) ;
DeleteObject (hbr) ;
EndDialog (hDlg, true) ;
return (true) ;
case IDCANCEL :
DeleteObject (hbr) ;
EndDialog (hDlg, false) ;
return (true) ;
case IDC_DELETEFILE :
hlb = GetDlgItem (hDlg, IDC_FILEQUEUE) ;
if ((i = SendMessage (hlb, LB_GETCURSEL, 0, 0)) != LB_ERR)
{
SendMessage (hlb, LB_DELETESTRING, i, 0) ;
if (i)
i-- ;
SendMessage (hlb, LB_SETCURSEL, i, 0) ;
}
i = SendMessage (hlb, LB_GETCOUNT, 0, 0) ;
sprintf (str, "Queue will have %d entr%s", i, i != 1 ? "ies" : "y") ;
SetDlgItemText (hDlg, IDC_QUEUEENTRIES, str) ;
return (true) ;
case IDC_ADDFILE :
hlb = GetDlgItem (hDlg, IDC_FILEQUEUE) ;
AddQueue (hDlg, hlb) ;
i = SendMessage (hlb, LB_GETCOUNT, 0, 0) ;
sprintf (str, "Queue will have %d entr%s", i, i != 1 ? "ies" : "y") ;
SetDlgItemText (hDlg, IDC_QUEUEENTRIES, str) ;
return (true) ;
case IDC_CONTEXTHELP :
hh_aklink.pszKeywords = "File Queue" ;
HtmlHelp (NULL, engineHelpPath, HH_KEYWORD_LOOKUP, (DWORD_PTR) &hh_aklink) ;
return (true) ;
}
break ;
case WM_MEASUREITEM :
if (wParam == IDC_FILEQUEUE)
{
m = (MEASUREITEMSTRUCT *) lParam ;
m->itemHeight = listbox_ychar ;
return (true) ;
}
else
return (false) ;
case WM_DRAWITEM :
if (wParam == IDC_FILEQUEUE)
{
d = (DRAWITEMSTRUCT *) lParam ;
draw_ordinary_listbox (d, true) ;
return (true) ;
}
else
return (false) ;
}
return (false) ;
}
INT_PTR CALLBACK PovFeatureAdviceDialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG :
hh_aklink.pszKeywords = otaHelpString ;
SetWindowText (hDlg, otaTitle) ;
SetDlgItemText (hDlg, IDC_ADVICETEXT, otaText) ;
CheckDlgButton (hDlg, IDC_DONTTELLMEAGAIN, otaChecked ? BST_CHECKED : BST_UNCHECKED) ;
if (lParam == 0)
lParam = (LPARAM) GetDesktopWindow () ;
CenterWindowRelative ((HWND) lParam, hDlg, true, true) ;
return (true) ;
case WM_CTLCOLORBTN:
case WM_CTLCOLORDLG:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORLISTBOX:
case WM_CTLCOLORSCROLLBAR:
case WM_CTLCOLORSTATIC:
return (DefWindowProc (hDlg, message, wParam, lParam));
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
otaChecked = IsDlgButtonChecked (hDlg, IDC_DONTTELLMEAGAIN) == BST_CHECKED ;
EndDialog (hDlg, true) ;
return (true) ;
case IDCANCEL :
otaChecked = false ;
EndDialog (hDlg, false) ;
return (true) ;
case IDC_CONTEXTHELP :
hh_aklink.pszKeywords = otaHelpString ;
HtmlHelp (NULL, engineHelpPath, HH_KEYWORD_LOOKUP, (DWORD_PTR) &hh_aklink) ;
return (true) ;
}
break ;
}
return (false) ;
}
INT_PTR CALLBACK PovSoundsDialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
char *s ;
switch (message)
{
case WM_INITDIALOG :
hh_aklink.pszKeywords = "sounds" ;
CenterWindowRelative ((HWND) lParam, hDlg, true, true) ;
FitWindowInWindow (NULL, hDlg) ;
SetDlgItemText (hDlg, IDC_SOUND_RENDERCOMPLETE, render_complete_sound) ;
SetDlgItemText (hDlg, IDC_SOUND_PARSEERROR, parse_error_sound) ;
SetDlgItemText (hDlg, IDC_SOUND_RENDERERROR, render_error_sound) ;
CheckDlgButton (hDlg, IDC_ENABLE_RENDERCOMPLETESOUND, render_complete_sound_enabled ? BST_CHECKED : BST_UNCHECKED) ;
CheckDlgButton (hDlg, IDC_ENABLE_PARSEERRORSOUND, parse_error_sound_enabled ? BST_CHECKED : BST_UNCHECKED) ;
CheckDlgButton (hDlg, IDC_ENABLE_RENDERERRORSOUND, render_error_sound_enabled ? BST_CHECKED : BST_UNCHECKED) ;
return (true) ;
case WM_CTLCOLORBTN:
case WM_CTLCOLORDLG:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORLISTBOX:
case WM_CTLCOLORSCROLLBAR:
case WM_CTLCOLORSTATIC:
return(DefWindowProc(hDlg, message, wParam, lParam));
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDC_BROWSE_RENDERCOMPLETESOUND:
if ((s = SelectSound (hDlg, render_complete_sound)) != NULL)
SetDlgItemText (hDlg, IDC_SOUND_RENDERCOMPLETE, s) ;
return (true) ;
case IDC_BROWSE_PARSEERRORSOUND:
if ((s = SelectSound (hDlg, parse_error_sound)) != NULL)
SetDlgItemText (hDlg, IDC_SOUND_PARSEERROR, s) ;
return (true) ;
case IDC_BROWSE_RENDERERRORSOUND:
if ((s = SelectSound (hDlg, render_error_sound)) != NULL)
SetDlgItemText (hDlg, IDC_SOUND_RENDERERROR, s) ;
return (true) ;
case IDOK :
render_complete_sound_enabled = IsDlgButtonChecked (hDlg, IDC_ENABLE_RENDERCOMPLETESOUND) == BST_CHECKED ;
parse_error_sound_enabled = IsDlgButtonChecked (hDlg, IDC_ENABLE_PARSEERRORSOUND) == BST_CHECKED ;
render_error_sound_enabled = IsDlgButtonChecked (hDlg, IDC_ENABLE_RENDERERRORSOUND) == BST_CHECKED ;
GetDlgItemText (hDlg, IDC_SOUND_RENDERCOMPLETE, render_complete_sound, _MAX_PATH) ;
GetDlgItemText (hDlg, IDC_SOUND_PARSEERROR, parse_error_sound, _MAX_PATH) ;
GetDlgItemText (hDlg, IDC_SOUND_RENDERERROR, render_error_sound, _MAX_PATH) ;
EndDialog (hDlg, true) ;
return (true) ;
case IDCANCEL :
EndDialog (hDlg, false) ;
return (true) ;
case IDC_CONTEXTHELP :
hh_aklink.pszKeywords = "sounds" ;
HtmlHelp (NULL, engineHelpPath, HH_KEYWORD_LOOKUP, (DWORD_PTR) &hh_aklink) ;
return (true) ;
}
break ;
}
return (false) ;
}
INT_PTR CALLBACK PovThreadCountDialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int val;
BOOL result;
switch (message)
{
case WM_INITDIALOG :
hh_aklink.pszKeywords = "thread count" ; // TODO
SetDlgItemInt (hDlg, IDC_THREADCOUNT, ThreadCount, FALSE) ;
SendDlgItemMessage (hDlg, IDC_THREADCOUNT, EM_LIMITTEXT, 3, 0L) ;
SendDlgItemMessage (hDlg, IDC_THREADSPIN, UDM_SETRANGE, 0, MAKELONG(255, 1)) ;
CenterWindowRelative ((HWND) lParam, hDlg, true, true) ;
FitWindowInWindow (NULL, hDlg) ;
return (true) ;
case WM_CTLCOLORBTN:
case WM_CTLCOLORDLG:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORLISTBOX:
case WM_CTLCOLORSCROLLBAR:
case WM_CTLCOLORSTATIC:
return (DefWindowProc (hDlg, message, wParam, lParam));
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDC_THREADCOUNT :
if (HIWORD (wParam) == EN_CHANGE)
{
if (SendDlgItemMessage (hDlg, IDC_THREADCOUNT, EM_LINELENGTH, 0, 0) > 0)
{
val = GetDlgItemInt (hDlg, IDC_THREADCOUNT, &result, FALSE) ;
if (result == FALSE || val < 1 || val > 255)
{
if (result == FALSE)
SetDlgItemInt (hDlg, IDC_THREADCOUNT, ThreadCount, FALSE) ;
else if (val < 1)
SetDlgItemInt (hDlg, IDC_THREADCOUNT, 1, FALSE) ;
else if (val > 255)
SetDlgItemInt (hDlg, IDC_THREADCOUNT, 255, FALSE) ;
SendDlgItemMessage (hDlg, IDC_THREADCOUNT, EM_SETSEL, 0, -1);
}
EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
}
else
EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
return (true);
}
return (false) ;
case IDOK :
val = GetDlgItemInt (hDlg, IDC_THREADCOUNT, &result, FALSE) ;
if (result == TRUE && val > 0 && val < 256)
ThreadCount = val ;
EndDialog (hDlg, true) ;
return (true) ;
case IDCANCEL :
EndDialog (hDlg, false) ;
return (true) ;
}
break ;
}
return (false) ;
}
INT_PTR CALLBACK RenderAlternativeFileDialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int width ;
int max = 0;
int diff ;
char str [8192] ;
char *s = str;
char *s2;
char srcname[_MAX_PATH];
char altname[_MAX_PATH];
RECT rect ;
HWND hText ;
const char *src = source_file_name;
const char *alt = (LPCSTR) lParam;
switch (message)
{
case WM_INITDIALOG :
splitpath(src, NULL, srcname);
splitpath(alt, NULL, altname);
hText = GetDlgItem (hDlg, IDC_ALTERNATEFILETEXT) ;
s += sprintf(s, "You have requested to render '%s'.\n\n", src);
max = GetTextExtent(hText, str)->cx;
s += sprintf(s, "This is an include file that has been used by another render during this session. ");
s += sprintf(s, "The most recent use of %s was when rendering the below file:\n\n", srcname);
s += sprintf(s2 = s, "\t%s\n\n", alt);
if ((width = GetTextExtent(hText, s2)->cx) > max)
max = width;
s += sprintf(s, "If you prefer, POV-Ray will render %s instead of %s.\n\n", altname, srcname);
s += sprintf(s, "If you select \"Yes, For This Session\", POV will render %s and remember your choice for this session. ", altname);
s += sprintf(s, "If you select \"Yes, This Time\", you will be asked next time you render %s. ", srcname);
s += sprintf(s, "If you select \"No, Don't Ask Again\", POV will render %s and won't bug you about it for the remainder of this session.\n", srcname);
SetDlgItemText (hDlg, IDC_ALTERNATEFILETEXT, str) ;
if (max <= 0)
return (false) ;
GetClientRect (hText, &rect) ;
if (rect.right >= max + 10)
return (false) ;
diff = max - rect.right + 10 ;
SetWindowPos (hText, NULL, 0, 0, rect.right + diff, rect.bottom, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER) ;
GetWindowRect (hDlg, &rect) ;
rect.right -= rect.left ;
rect.bottom -= rect.top ;
rect.right += diff ;
SetWindowPos (hDlg, NULL, 0, 0, rect.right + 10, rect.bottom, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER) ;
diff /= 2 ;
NudgeChildWindow (hDlg, IDYES, diff) ;
NudgeChildWindow (hDlg, IDOK, diff) ;
NudgeChildWindow (hDlg, IDNO, diff) ;
NudgeChildWindow (hDlg, IDHELP, diff) ;
return (false) ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDYES :
case IDOK :
case IDNO :
case IDCANCEL :
EndDialog (hDlg, LOWORD(wParam)) ;
return (true) ;
}
break ;
}
return (false) ;
}
void FeatureNotify (const char *labelStr, const char *titleStr, const char *textStr, const char *helpStr, bool checked)
{
bool result = false ;
if (GetDontShowAgain (labelStr))
return ;
otaTitle = titleStr ;
otaText = textStr ;
hh_aklink.pszKeywords = otaHelpString = helpStr ;
otaChecked = checked ;
if (DialogBoxParam (hInstance, MAKEINTRESOURCE (IDD_FEATUREADVICE), main_window, (DLGPROC) PovFeatureAdviceDialogProc, (LPARAM) main_window) > 0)
if (otaChecked)
PutDontShowAgain (labelStr, true) ;
}
}