Windows2000/private/ntos/w32/ntgdi/icm/icmui/appui.cpp
2020-09-30 17:12:32 +02:00

920 lines
31 KiB
C++

/**
Source File: AppUI.CPP
This file implements the Application UI.
This consists of two (ANSI/UNICODE) functions that allow an application to specify profiles to be used, and so forth.
Copyright (c) 1996 by Microsoft Corporation
A Pretty Penny Enterprises Production
Change History:
12-11-96 a-robkj@microsoft.com Created it
**/
#include "ICMUI.H"
CONST DWORD ApplicationUIHelpIds[] = {
ApplyButton, IDH_ICMUI_APPLY,
EnableICM, IDH_APPUI_ICM,
EnableBasic, IDH_APPUI_BASIC,
EnableProofing, IDH_APPUI_PROOF,
MonitorProfile, IDH_APPUI_MONITOR,
MonitorProfileLabel, IDH_APPUI_MONITOR,
PrinterProfile, IDH_APPUI_PRINTER,
PrinterProfileLabel, IDH_APPUI_PRINTER,
RenderingIntent, IDH_APPUI_INTENT,
RenderingIntentLabel, IDH_APPUI_INTENT,
TargetProfile, IDH_APPUI_EMULATE,
TargetProfileLabel, IDH_APPUI_EMULATE,
TargetIntent, IDH_APPUI_INTENT,
TargetIntentLabel, IDH_APPUI_INTENT,
#if !defined(_WIN95_) // context-sentitive help
// SourceProfile, IDH_APPUI_SOURCE,
SourceProfileLabel, IDH_APPUI_SOURCE,
#endif
0, 0
};
class CColorMatchDialog : public CDialog
{
BOOL m_bSuccess, m_bEnableICM, m_bEnableProofing, m_bColorPrinter;
CString m_csSource, m_csMonitor, m_csPrinter, m_csMonitorProfile, m_csPrinterProfile, m_csTargetProfile;
CString m_csMonitorDisplayName; // since displayName != deviceName for monitor.
CStringArray m_csaMonitor, m_csaPrinter, m_csaTarget;
CStringArray m_csaMonitorDesc, m_csaPrinterDesc, m_csaTargetDesc;
// For handy reference (from Setup structure)
DWORD m_dwRenderIntent, m_dwProofIntent;
// To reduce stack usage and code size
HWND m_hwndRenderIntent, m_hwndTargetIntent, m_hwndMonitorList,
m_hwndPrinterList, m_hwndTargetList, m_hwndIntentText1,
m_hwndIntentLabel, m_hwndTargetProfileLabel, m_hwndTargetIntentLabel,
m_hwndMonitorProfileLabel, m_hwndPrinterProfileLabel;
// For Apply callback
PCMSCALLBACK m_dpApplyCallback;
LPARAM m_lpApplyCallback;
// To identify callee
BOOL m_bAnsiCall;
// Display profile description or filename
BOOL m_bUseProfileDescription;
// Intent control
BOOL m_bDisableIntent, m_bDisableRenderIntent;
// Pointer to COLORMATCHSETUP[A|W]
PVOID m_pvCMS;
void Fail(DWORD dwError);
BOOL GoodParms(PCOLORMATCHSETUP pcms);
void CompleteInitialization();
void UpdateControls(BOOL bChanged = FALSE);
void FillStructure(COLORMATCHSETUPA *pcms);
void FillStructure(COLORMATCHSETUPW *pcms);
void EnableApplyButton(BOOL bEnable = TRUE);
public:
CColorMatchDialog(COLORMATCHSETUPA *pcms);
CColorMatchDialog(COLORMATCHSETUPW *pcms);
~CColorMatchDialog() {
m_csaMonitor.Empty();
m_csaPrinter.Empty();
m_csaTarget.Empty();
m_csaMonitorDesc.Empty();
m_csaPrinterDesc.Empty();
m_csaTargetDesc.Empty();
m_csSource.Empty();
m_csMonitor.Empty();
m_csPrinter.Empty();
m_csMonitorProfile.Empty();
m_csPrinterProfile.Empty();
m_csTargetProfile.Empty();
m_csMonitorDisplayName.Empty();
}
BOOL Results() const { return m_bSuccess; }
virtual BOOL OnInit();
virtual BOOL OnCommand(WORD wNotifyCode, WORD wid, HWND hwndCtl);
virtual BOOL OnHelp(LPHELPINFO pHelp);
virtual BOOL OnContextMenu(HWND hwnd);
};
// Record a failure
void CColorMatchDialog::Fail(DWORD dwError) {
SetLastError(dwError);
m_bSuccess = FALSE;
}
// Report input parameter validity
BOOL CColorMatchDialog::GoodParms(PCOLORMATCHSETUP pcms) {
m_bSuccess = TRUE;
if (!pcms || pcms -> dwVersion != COLOR_MATCH_VERSION ||
pcms -> dwSize != sizeof *pcms || !pcms -> pMonitorProfile ||
!pcms -> pPrinterProfile || !pcms -> pTargetProfile ||
!pcms -> ccMonitorProfile || !pcms -> ccPrinterProfile ||
!pcms -> ccTargetProfile) {
Fail(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (pcms -> dwFlags & CMS_USEHOOK && !pcms -> lpfnHook)
Fail(ERROR_INVALID_PARAMETER);
if (pcms -> dwFlags & CMS_USEAPPLYCALLBACK && !pcms -> lpfnApplyCallback)
Fail(ERROR_INVALID_PARAMETER);
if (pcms -> dwFlags & CMS_SETRENDERINTENT && pcms -> dwRenderIntent > INTENT_ABSOLUTE_COLORIMETRIC)
Fail(ERROR_INVALID_PARAMETER);
if (pcms -> dwFlags & CMS_SETPROOFINTENT && pcms -> dwFlags & CMS_ENABLEPROOFING && pcms -> dwProofingIntent > INTENT_ABSOLUTE_COLORIMETRIC)
Fail(ERROR_INVALID_PARAMETER);
// Setup the hooking, if needed
if (pcms -> dwFlags & CMS_USEHOOK) {
m_dpHook = pcms -> lpfnHook;
m_lpHook = pcms -> lParam;
}
// Setup the callback for apply, if needed
if (pcms -> dwFlags & CMS_USEAPPLYCALLBACK) {
m_dpApplyCallback = pcms -> lpfnApplyCallback;
m_lpApplyCallback = pcms -> lParamApplyCallback;
} else {
m_dpApplyCallback = NULL;
m_lpApplyCallback = 0L;
}
// Cache the flags...
DWORD dwFlags = pcms -> dwFlags;
// Init the intents
m_dwRenderIntent = (dwFlags & CMS_SETRENDERINTENT) ? pcms -> dwRenderIntent : INTENT_PERCEPTUAL;
m_dwProofIntent = (dwFlags & CMS_SETPROOFINTENT) && (dwFlags & CMS_ENABLEPROOFING) ? pcms -> dwProofingIntent : m_dwRenderIntent;
// Init the flags
m_bEnableICM = !(dwFlags & CMS_DISABLEICM);
m_bEnableProofing = !!(dwFlags & CMS_ENABLEPROOFING);
m_bUseProfileDescription = !!(dwFlags & CMS_USEDESCRIPTION);
m_bDisableIntent = !!(dwFlags & CMS_DISABLEINTENT);
m_bDisableRenderIntent = !!(dwFlags & CMS_DISABLERENDERINTENT);
// Init the pointer to buffer
m_pvCMS = (PVOID) pcms;
return m_bSuccess;
}
// Encoding-independent construction actions
void CColorMatchDialog::CompleteInitialization() {
// Determine the appropriate source, monitor and printer names
if (m_csSource.IsEmpty())
m_csSource.Load(DefaultSourceString);
// Check the validation for monitor name.
CMonitorList cml;
cml.Enumerate();
if (!cml.IsValidDeviceName(m_csMonitor)) {
// Get primary device.
m_csMonitor = cml.PrimaryDeviceName();
}
// Map display name from device name
m_csMonitorDisplayName = cml.DeviceNameToDisplayName(m_csMonitor);
// Check the validation for printer name.
HANDLE hPrinter;
if (!m_csPrinter.IsEmpty() && OpenPrinter(m_csPrinter,&hPrinter,NULL)) {
// The specified printer has been found.
ClosePrinter(hPrinter);
} else {
// The specified printer has not been found,
// Get the default printer name- do it the old, slimy way...
TCHAR acBuffer[MAX_PATH];
GetProfileString(_TEXT("Windows"), _TEXT("Device"), _TEXT(""), acBuffer, MAX_PATH);
// The buffer will contains "PrinterName,DriverName,Port".
// What we need is only printer name.
TCHAR *pTmp = acBuffer;
while (*pTmp) {
if (*pTmp == __TEXT(',')) {
*pTmp = NULL;
break;
}
pTmp++;
}
m_csPrinter = acBuffer;
}
if (CGlobals::ThisIsAColorPrinter(m_csPrinter))
m_bColorPrinter = TRUE;
else
m_bColorPrinter = FALSE;
// Now, we collect the names
ENUMTYPE et = { sizeof et, ENUM_TYPE_VERSION, (ET_DEVICENAME|ET_DEVICECLASS) };
// Enumrate monitor.
et.pDeviceName = m_csMonitor;
et.dwDeviceClass = CLASS_MONITOR;
CProfile::Enumerate(et, m_csaMonitor, m_csaMonitorDesc);
// Enumrate only for Color Printer.
if (m_bColorPrinter) {
et.pDeviceName = m_csPrinter;
et.dwDeviceClass = CLASS_PRINTER;
CProfile::Enumerate(et, m_csaPrinter, m_csaPrinterDesc);
} else {
m_csaPrinter.Empty();
m_csaPrinterDesc.Empty();
}
et.dwFields = 0;
CProfile::Enumerate(et, m_csaTarget, m_csaTargetDesc);
// Fix up the default names for the profiles
if (m_csaPrinter.Map(m_csPrinterProfile) == m_csaPrinter.Count())
{
_RPTF2(_CRT_WARN, "Printer Profile %s isn't associated with "
"the monitor (%s)", (LPCTSTR) m_csPrinterProfile, (LPCTSTR) m_csPrinter);
if (m_csaPrinter.Count())
{
m_csPrinterProfile = m_csaPrinter[0];
}
else
{
m_csPrinterProfile = (LPCTSTR) NULL;
}
}
if (m_csaMonitor.Map(m_csMonitorProfile) == m_csaMonitor.Count())
{
_RPTF2(_CRT_WARN, "Monitor Profile %s isn't associated with "
"the monitor (%s)", (LPCTSTR) m_csMonitorProfile, (LPCTSTR) m_csMonitor);
if (m_csaMonitor.Count())
{
m_csMonitorProfile = m_csaMonitor[0];
}
else
{
m_csMonitorProfile = (LPCTSTR) NULL;
}
}
// If the target profile name is invalid, use the printer profile
if (m_csaTarget.Map(m_csTargetProfile) == m_csaTarget.Count())
{
_RPTF1(_CRT_WARN, "Target Profile %s isn't installed", (LPCTSTR) m_csTargetProfile);
if (m_csaPrinter.Count())
{
m_csTargetProfile = m_csaPrinter[0];
}
else
{
// And then, there is no printer profile, it will
// be Windows color space profile.
TCHAR TargetProfileName[MAX_PATH];
DWORD dwSize = MAX_PATH;
if (GetStandardColorSpaceProfile(NULL,LCS_WINDOWS_COLOR_SPACE,TargetProfileName,&dwSize)) {
m_csTargetProfile = (LPCTSTR) TargetProfileName;
m_csTargetProfile = (LPCTSTR) m_csTargetProfile.NameAndExtension();
} else {
m_csTargetProfile = (LPCTSTR) NULL;
}
}
}
}
// Update the controls
void CColorMatchDialog::UpdateControls(BOOL bChanged) {
// Switch Proofing Controls based on setting
ShowWindow(m_hwndIntentText1, m_bEnableProofing && m_bEnableICM ? SW_SHOWNORMAL : SW_HIDE);
EnableWindow(m_hwndTargetProfileLabel, m_bEnableProofing && m_bEnableICM);
EnableWindow(m_hwndTargetList, m_bEnableProofing && m_bEnableICM);
EnableWindow(m_hwndTargetIntentLabel, m_bEnableProofing && m_bEnableICM && !m_bDisableIntent);
EnableWindow(m_hwndTargetIntent, m_bEnableProofing && m_bEnableICM && !m_bDisableIntent);
// Switch the other Controls, as well...
EnableWindow(m_hwndMonitorProfileLabel, m_bEnableICM);
EnableWindow(m_hwndMonitorList, m_bEnableICM);
EnableWindow(m_hwndPrinterProfileLabel, m_bEnableICM && !m_csPrinter.IsEmpty());
EnableWindow(m_hwndPrinterList, m_bEnableICM && m_bColorPrinter && !m_csPrinter.IsEmpty());
if (m_bEnableProofing) {
EnableWindow(m_hwndIntentLabel, m_bEnableICM && !m_bDisableIntent && !m_bDisableRenderIntent);
EnableWindow(m_hwndRenderIntent, m_bEnableICM && !m_bDisableIntent && !m_bDisableRenderIntent);
} else {
EnableWindow(m_hwndIntentLabel, m_bEnableICM && !m_bDisableIntent);
EnableWindow(m_hwndRenderIntent, m_bEnableICM && !m_bDisableIntent);
}
EnableWindow(GetDlgItem(m_hwnd, EnableBasic), m_bEnableICM);
EnableWindow(GetDlgItem(m_hwnd, EnableProofing), m_bEnableICM);
EnableApplyButton(bChanged);
}
// Update the Apply buttom
void CColorMatchDialog::EnableApplyButton(BOOL bEnable) {
EnableWindow(GetDlgItem(m_hwnd, ApplyButton), bEnable);
}
// Flags for buffer overflow (combined)
#define BAD_BUFFER_FLAGS (CMS_MONITOROVERFLOW | CMS_PRINTEROVERFLOW | \
CMS_TARGETOVERFLOW)
// By moving the ANSI / Unicode issues into the CString class
// it becomes feasible to code these two versions so they look
// encoding-independent. In other words, the code for both
// of these versions is written identically, and the compiler
// does all the work, just like it ought to...
void CColorMatchDialog::FillStructure(COLORMATCHSETUPA *pcms) {
if (m_bEnableICM) {
pcms -> dwFlags = CMS_SETRENDERINTENT | CMS_SETPRINTERPROFILE | CMS_SETMONITORPROFILE;
pcms -> dwRenderIntent = m_dwRenderIntent;
// 03-20-1997 Bob_Kjelgaard@Prodigy.Net RAID 21091 (Memphis)
// Don't fail if there is no monitor or printer profile. Set them to an empty string and succeed, instead.
// We can always do this, because 0 counts and empty pointers have already been screened out.
if (m_csMonitorProfile.IsEmpty())
pcms -> pMonitorProfile[0] = '\0';
else {
lstrcpynA(pcms -> pMonitorProfile, m_csMonitorProfile, pcms -> ccMonitorProfile);
if (lstrcmpA(pcms -> pMonitorProfile, m_csMonitorProfile))
pcms -> dwFlags |= CMS_MONITOROVERFLOW;
}
if (m_csPrinterProfile.IsEmpty() || !m_bColorPrinter)
pcms -> pPrinterProfile[0] = '\0';
else {
lstrcpynA(pcms -> pPrinterProfile, m_csPrinterProfile,
pcms -> ccPrinterProfile);
if (lstrcmpA(pcms -> pPrinterProfile, m_csPrinterProfile))
pcms -> dwFlags |= CMS_PRINTEROVERFLOW;
}
if (m_bEnableProofing) {
pcms -> dwFlags |= CMS_ENABLEPROOFING | CMS_SETTARGETPROFILE;
pcms -> dwProofingIntent = m_dwProofIntent;
lstrcpynA(pcms -> pTargetProfile, m_csTargetProfile, pcms -> ccTargetProfile);
if (lstrcmpA(pcms -> pTargetProfile, m_csTargetProfile))
pcms -> dwFlags |= CMS_TARGETOVERFLOW;
} else {
pcms -> pTargetProfile[0] = '\0';
}
if (pcms -> dwFlags & BAD_BUFFER_FLAGS)
Fail(ERROR_INSUFFICIENT_BUFFER);
}
else
{
pcms -> dwFlags = CMS_DISABLEICM; // No other flags are valid!
pcms -> pMonitorProfile[0] = '\0'; // No color profiles are choosed
pcms -> pPrinterProfile[0] = '\0';
pcms -> pTargetProfile[0] = '\0';
}
}
void CColorMatchDialog::FillStructure(COLORMATCHSETUPW *pcms)
{
if (m_bEnableICM) {
pcms -> dwFlags = CMS_SETRENDERINTENT | CMS_SETPRINTERPROFILE | CMS_SETMONITORPROFILE;
pcms -> dwRenderIntent = m_dwRenderIntent;
// 03-20-1997 Bob_Kjelgaard@Prodigy.Net RAID 21091 (Memphis)
// Don't fail if there is no monitor or printer profile. Set
// them to an empty string and succeed, instead.
// We can always do this, because 0 counts and empty pointers
// have already been screened out.
if (m_csMonitorProfile.IsEmpty())
pcms -> pMonitorProfile[0] = '\0';
else {
lstrcpynW(pcms -> pMonitorProfile, m_csMonitorProfile, pcms -> ccMonitorProfile);
if (lstrcmpW(pcms -> pMonitorProfile, m_csMonitorProfile))
pcms -> dwFlags |= CMS_MONITOROVERFLOW;
}
if (m_csPrinterProfile.IsEmpty() || !m_bColorPrinter)
pcms -> pPrinterProfile[0] = '\0';
else {
lstrcpynW(pcms -> pPrinterProfile, m_csPrinterProfile, pcms -> ccPrinterProfile);
if (lstrcmpW(pcms -> pPrinterProfile, m_csPrinterProfile))
pcms -> dwFlags |= CMS_PRINTEROVERFLOW;
}
if (m_bEnableProofing) {
pcms -> dwFlags |= CMS_ENABLEPROOFING | CMS_SETTARGETPROFILE | CMS_SETPROOFINTENT;
pcms -> dwProofingIntent = m_dwProofIntent;
lstrcpynW(pcms -> pTargetProfile, m_csTargetProfile, pcms -> ccTargetProfile);
if (lstrcmpW(pcms -> pTargetProfile, m_csTargetProfile))
pcms -> dwFlags |= CMS_TARGETOVERFLOW;
} else {
pcms -> pTargetProfile[0] = '\0';
}
if (pcms -> dwFlags & BAD_BUFFER_FLAGS)
Fail(ERROR_INSUFFICIENT_BUFFER);
}
else
{
pcms -> dwFlags = CMS_DISABLEICM; // No other flags are valid!
pcms -> pMonitorProfile[0] = '\0'; // No color profiles are choosed
pcms -> pPrinterProfile[0] = '\0';
pcms -> pTargetProfile[0] = '\0';
}
}
CColorMatchDialog::CColorMatchDialog(COLORMATCHSETUPA *pcms) :
CDialog(CGlobals::Instance(), ApplicationUI, pcms -> hwndOwner)
{
if (!GoodParms((PCOLORMATCHSETUP) pcms))
return;
// Make sure we've initialized these, if we have to.
if (pcms -> dwFlags & CMS_SETMONITORPROFILE)
m_csMonitorProfile = pcms -> pMonitorProfile;
if (pcms -> dwFlags & CMS_SETPRINTERPROFILE)
m_csPrinterProfile = pcms -> pPrinterProfile;
if (pcms -> dwFlags & CMS_SETTARGETPROFILE)
m_csTargetProfile = pcms -> pTargetProfile;
m_csSource = pcms -> pSourceName;
m_csMonitor = pcms -> pDisplayName;
m_csPrinter = pcms -> pPrinterName;
// Ansi version call
m_bAnsiCall = TRUE;
CompleteInitialization();
// Display the UI, and watch what happens...
switch (DoModal()) {
case IDOK:
if (!m_bSuccess)
return;
// Fill up return buffer.
FillStructure(pcms);
return;
case IDCANCEL:
Fail(ERROR_SUCCESS);
return;
default:
Fail(GetLastError());
}
}
CColorMatchDialog::CColorMatchDialog(COLORMATCHSETUPW *pcms) :
CDialog(CGlobals::Instance(), ApplicationUI, pcms -> hwndOwner)
{
if (!GoodParms((PCOLORMATCHSETUP) pcms))
return;
// Make sure we've initialized these, if we have to.
if (pcms -> dwFlags & CMS_SETMONITORPROFILE) {
m_csMonitorProfile = pcms -> pMonitorProfile;
m_csMonitorProfile = m_csMonitorProfile.NameAndExtension();
}
if (pcms -> dwFlags & CMS_SETPRINTERPROFILE) {
m_csPrinterProfile = pcms -> pPrinterProfile;
m_csPrinterProfile = m_csPrinterProfile.NameAndExtension();
}
if (pcms -> dwFlags & CMS_SETTARGETPROFILE) {
m_csTargetProfile = pcms -> pTargetProfile;
m_csTargetProfile = m_csTargetProfile.NameAndExtension();
}
m_csSource = pcms -> pSourceName;
m_csMonitor = pcms -> pDisplayName;
m_csPrinter = pcms -> pPrinterName;
// Unicode version call
m_bAnsiCall = FALSE;
CompleteInitialization();
// Display the UI, and watch what happens...
switch (DoModal()) {
case IDOK:
if (!m_bSuccess)
return;
// Fill up return buffer.
FillStructure(pcms);
return;
case IDCANCEL:
Fail(ERROR_SUCCESS);
return;
default:
Fail(GetLastError());
}
}
// Dialog initialization function
BOOL CColorMatchDialog::OnInit()
{
// Collect the common handles
m_hwndRenderIntent = GetDlgItem(m_hwnd, RenderingIntent);
m_hwndTargetIntent = GetDlgItem(m_hwnd, TargetIntent);
m_hwndPrinterList = GetDlgItem(m_hwnd, PrinterProfile);
m_hwndMonitorList = GetDlgItem(m_hwnd, MonitorProfile);
m_hwndTargetList = GetDlgItem(m_hwnd, TargetProfile);
m_hwndMonitorProfileLabel = GetDlgItem(m_hwnd, MonitorProfileLabel);
m_hwndPrinterProfileLabel = GetDlgItem(m_hwnd, PrinterProfileLabel);
m_hwndIntentLabel = GetDlgItem(m_hwnd, RenderingIntentLabel);
m_hwndTargetProfileLabel = GetDlgItem(m_hwnd, TargetProfileLabel);
m_hwndTargetIntentLabel = GetDlgItem(m_hwnd, TargetIntentLabel);
m_hwndIntentText1 = GetDlgItem(m_hwnd, RenderingIntentText1);
// Fill in the source name
SetDlgItemText(m_hwnd, SourceProfile, m_csSource);
// Set the Check Boxes
CheckDlgButton(m_hwnd, EnableICM, m_bEnableICM ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwnd, EnableBasic, m_bEnableProofing ? BST_UNCHECKED : BST_CHECKED);
CheckDlgButton(m_hwnd, EnableProofing, m_bEnableProofing ? BST_CHECKED : BST_UNCHECKED);
// Fill in the list(s) of Rendering Intents
CString csWork; // There's plenty of it to do...
for (int i = INTENT_PERCEPTUAL; i <= INTENT_ABSOLUTE_COLORIMETRIC; i++) {
csWork.Load(i + PerceptualString);
SendMessage(m_hwndRenderIntent, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) csWork);
SendMessage(m_hwndTargetIntent, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) csWork);
}
// Init the rendering intents
SendMessage(m_hwndRenderIntent, CB_SETCURSEL, m_dwRenderIntent, 0);
SendMessage(m_hwndTargetIntent, CB_SETCURSEL, m_dwProofIntent, 0);
// Init the profile lists
// 03-20-1997 Bob_Kjelgaard@Prodigy.Net RAID Memphis:22213
// The algorithm used to determine which profile to select was incorrect.
// There's a much simpler and direct way, anyway.
LRESULT id;
// Target Profiles
for (unsigned u = 0; u < m_csaTarget.Count(); u++) {
if (m_bUseProfileDescription) {
id = SendMessage(m_hwndTargetList, CB_ADDSTRING, 0, (LPARAM)((LPTSTR) m_csaTargetDesc[u]));
} else {
id = SendMessage(m_hwndTargetList, CB_ADDSTRING, 0, m_csaTarget[u].NameOnly());
}
SendMessage(m_hwndTargetList, CB_SETITEMDATA, id, u);
if (m_csaTarget[u].IsEqualString(m_csTargetProfile)) {
SendMessage(m_hwndTargetList, CB_SETCURSEL, id, 0);
}
}
// Set Target profile if specified, otherwise the default
if (!m_csaTarget.Count()) {
CString csWork;
csWork.Load(NoProfileString);
SendMessage(m_hwndTargetList, CB_ADDSTRING, 0, csWork);
SendMessage(m_hwndTargetList, CB_SETITEMDATA, 0, -1);
SendMessage(m_hwndTargetList, CB_SETCURSEL, 0, 0);
}
// Monitor Profiles
// 03-20-1997 Bob_Kjelgaard@Prodigy.Net Memphis RAID #22289
csWork.Load(GetDlgItem(m_hwnd, MonitorProfileLabel));
csWork = csWork + m_csMonitorDisplayName + _TEXT(")");
SetDlgItemText(m_hwnd, MonitorProfileLabel, csWork);
for (u = 0; u < m_csaMonitor.Count(); u++) {
if (m_bUseProfileDescription) {
id = SendMessage(m_hwndMonitorList, CB_ADDSTRING, 0, (LPARAM)((LPTSTR) m_csaMonitorDesc[u]));
} else {
id = SendMessage(m_hwndMonitorList, CB_ADDSTRING, 0, m_csaMonitor[u].NameOnly());
}
SendMessage(m_hwndMonitorList, CB_SETITEMDATA, id, u);
if (m_csaMonitor[u].IsEqualString(m_csMonitorProfile)) {
SendMessage(m_hwndMonitorList, CB_SETCURSEL, id, 0);
}
}
// Set Monitor profile if specified
if (!m_csaMonitor.Count()) {
CString csWork;
csWork.Load(NoProfileString);
SendMessage(m_hwndMonitorList, CB_ADDSTRING, 0, csWork);
SendMessage(m_hwndMonitorList, CB_SETITEMDATA, 0, -1);
SendMessage(m_hwndMonitorList, CB_SETCURSEL, 0, 0);
}
// Printer Profiles
// 03-20-1997 Bob_Kjelgaard@Prodigy.Net RAID Memphis:22290
// If there's no printer, then we should disable all of the related
// controls.
if (m_csPrinter.IsEmpty()) {
csWork.Load(NoPrintersInstalled);
} else {
csWork.Load(GetDlgItem(m_hwnd, PrinterProfileLabel));
csWork = csWork + m_csPrinter + _TEXT(")");
}
SetDlgItemText(m_hwnd, PrinterProfileLabel, csWork);
for (u = 0; u < m_csaPrinter.Count(); u++) {
if (m_bUseProfileDescription) {
id = SendMessage(m_hwndPrinterList, CB_ADDSTRING, 0, (LPARAM)((LPTSTR) m_csaPrinterDesc[u]));
} else {
id = SendMessage(m_hwndPrinterList, CB_ADDSTRING, 0, m_csaPrinter[u].NameOnly());
}
SendMessage(m_hwndPrinterList, CB_SETITEMDATA, id, u);
if (m_csaPrinter[u].IsEqualString(m_csPrinterProfile)) {
SendMessage(m_hwndPrinterList, CB_SETCURSEL, id, 0);
}
}
// Set Printer profile if specified
if (!m_csaPrinter.Count()) {
CString csWork;
if (!m_csPrinter.IsEmpty() && !m_bColorPrinter) {
// Printer are specified, but it is not color printer.
csWork.Load(NotColorPrinter);
} else {
csWork.Load(NoProfileString);
}
SendMessage(m_hwndPrinterList, CB_ADDSTRING, 0, csWork);
SendMessage(m_hwndPrinterList, CB_SETITEMDATA, 0, -1);
SendMessage(m_hwndPrinterList, CB_SETCURSEL, 0, 0);
}
// End RAID Memphis:22213, 22289, 22290 03-20-1997
// If Apply callback does not provided, disable apply button.
if (m_dpApplyCallback == NULL) {
RECT rcApply, rcCancel;
POINT ptApply, ptCancel;
// Get current "Apply" and "Cancel" buttom position
GetWindowRect(GetDlgItem(m_hwnd, ApplyButton), &rcApply);
GetWindowRect(GetDlgItem(m_hwnd, IDCANCEL), &rcCancel);
// Convert the buttom coordinate to parent dialog coord from screen coord.
ptApply.x = rcApply.left; ptApply.y = rcApply.top;
ptCancel.x = rcCancel.left; ptCancel.y = rcCancel.top;
ScreenToClient(m_hwnd,&ptApply);
ScreenToClient(m_hwnd,&ptCancel);
// Move "Apply" button away... and shift "Cancel" and "OK"
MoveWindow(GetDlgItem(m_hwnd, ApplyButton),0,0,0,0,TRUE);
MoveWindow(GetDlgItem(m_hwnd, IDCANCEL), ptApply.x,ptApply.y, rcApply.right - rcApply.left, rcApply.bottom - rcApply.top,TRUE);
MoveWindow(GetDlgItem(m_hwnd, IDOK), ptCancel.x,ptCancel.y, rcCancel.right - rcCancel.left, rcCancel.bottom - rcCancel.top,TRUE);
}
// Enable/Disable controls based upon settings
UpdateControls(FALSE);
return FALSE; // Because we've probably moved it...
}
// Command Processing override
BOOL CColorMatchDialog::OnCommand(WORD wNotifyCode, WORD wid, HWND hwndCtl) {
switch (wNotifyCode) {
case BN_CLICKED:
switch (wid) {
case EnableICM:
m_bEnableICM = !m_bEnableICM;
UpdateControls(TRUE);
return TRUE;
case EnableBasic:
if (m_bEnableProofing)
{
m_bEnableProofing = FALSE;
// Copy proof intent to rendering intent
m_dwRenderIntent = m_dwProofIntent;
// Update UI
SendMessage(m_hwndTargetIntent, CB_SETCURSEL, m_dwProofIntent, 0);
SendMessage(m_hwndRenderIntent, CB_SETCURSEL, m_dwRenderIntent, 0);
UpdateControls(TRUE);
}
return TRUE;
case EnableProofing:
if (m_bEnableProofing == FALSE)
{
m_bEnableProofing = TRUE;
// Copy the original rendering intent to the proofing intent, and set original to Absolute Colorimetric
m_dwProofIntent = m_dwRenderIntent;
m_dwRenderIntent = INTENT_ABSOLUTE_COLORIMETRIC;
// Update UI
SendMessage(m_hwndTargetIntent, CB_SETCURSEL, m_dwProofIntent, 0);
SendMessage(m_hwndRenderIntent, CB_SETCURSEL, m_dwRenderIntent, 0);
UpdateControls(TRUE);
}
return TRUE;
case ApplyButton: {
EnableApplyButton(FALSE);// Disable apply button
// Callback supplied function
if (m_dpApplyCallback) {
if (m_bAnsiCall) {
PCOLORMATCHSETUPA pcms = (PCOLORMATCHSETUPA) m_pvCMS;
FillStructure(pcms);
(*(PCMSCALLBACKA)m_dpApplyCallback)(pcms,m_lpApplyCallback);
} else {
PCOLORMATCHSETUPW pcms = (PCOLORMATCHSETUPW) m_pvCMS;
FillStructure(pcms);
(*(PCMSCALLBACKW)m_dpApplyCallback)(pcms,m_lpApplyCallback);
}
}
return TRUE;
}
}
break;
case CBN_SELCHANGE: {
DWORD idItem = (DWORD)SendMessage(hwndCtl, CB_GETCURSEL, 0, 0);
unsigned uItem = (unsigned)SendMessage(hwndCtl, CB_GETITEMDATA, idItem, 0);
switch (wid) {
case RenderingIntent:
if (m_dwRenderIntent != idItem)
{
m_dwRenderIntent = idItem;
// If proofing is disabled, proof intent follows render intent
if (! m_bEnableProofing)
{
m_dwProofIntent = idItem;
SendMessage(m_hwndTargetIntent, CB_SETCURSEL, m_dwProofIntent, 0);
}
EnableApplyButton();
}
return TRUE;
case TargetIntent:
if (m_dwProofIntent != idItem)
{
m_dwProofIntent = idItem;
EnableApplyButton();
}
return TRUE;
case TargetProfile:
// If there are no installed profiles, don't bother
if (!m_csaTarget.Count())
return TRUE;
if (m_csTargetProfile.IsEqualString(m_csaTarget[uItem]) == FALSE)
{
m_csTargetProfile = m_csaTarget[uItem];
EnableApplyButton();
}
return TRUE;
case MonitorProfile:
// If there are no installed profiles, don't bother
if (!m_csaMonitor.Count())
return TRUE;
if (m_csMonitorProfile.IsEqualString(m_csaMonitor[uItem]) == FALSE)
{
m_csMonitorProfile = m_csaMonitor[uItem];
EnableApplyButton();
}
return TRUE;
case PrinterProfile:
// If there are no installed profiles, don't bother
if (!m_csaPrinter.Count())
return TRUE;
if (m_csPrinterProfile.IsEqualString(m_csaPrinter[uItem]) == FALSE)
{
m_csPrinterProfile = m_csaPrinter[uItem];
EnableApplyButton();
}
return TRUE;
}
}
}
// Pass anything we didn't handle above to the base class
return CDialog::OnCommand(wNotifyCode, wid, hwndCtl);
}
// Context-sensitive help handler
BOOL CColorMatchDialog::OnHelp(LPHELPINFO pHelp)
{
if (pHelp->iContextType == HELPINFO_WINDOW) {
WinHelp((HWND) pHelp->hItemHandle, WINDOWS_HELP_FILE, HELP_WM_HELP, (ULONG_PTR) (LPSTR) ApplicationUIHelpIds);
}
return (TRUE);
}
BOOL CColorMatchDialog::OnContextMenu(HWND hwnd)
{
WinHelp(hwnd, WINDOWS_HELP_FILE, HELP_CONTEXTMENU, (ULONG_PTR) (LPSTR) ApplicationUIHelpIds);
return (TRUE);
}
// This are the real honest-to-goodness API!
extern "C" BOOL WINAPI SetupColorMatchingA(PCOLORMATCHSETUPA pcms)
{
CColorMatchDialog ccmd(pcms);
return ccmd.Results();
}
extern "C" BOOL WINAPI SetupColorMatchingW(PCOLORMATCHSETUPW pcms)
{
CColorMatchDialog ccmd(pcms);
return ccmd.Results();
}